<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>PHP Stone</title>
	<atom:link href="http://phpstone.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://phpstone.com</link>
	<description>——从石头向宝石进化</description>
	<lastBuildDate>Thu, 05 Aug 2010 14:04:07 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>在 WordPress 3.0 中使用菜单</title>
		<link>http://phpstone.com/using-menus-in-wordpress-3-0/</link>
		<comments>http://phpstone.com/using-menus-in-wordpress-3-0/#comments</comments>
		<pubDate>Thu, 05 Aug 2010 13:57:59 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=495</guid>
		<description><![CDATA[新发布的 WordPress 3.0 中新增了一个实用的功能，将外观层所表现的边栏（sidebar）和页脚（footer）等通过内置函数实现，删减模块不需要再改动代码，可直接在控制板直观自由地添加和改动。
值得注意的是，3.0 版本的 WordPress 在发表此文章时还没有中文版本，我使用英文版升级后改动的部分没有翻译。

在 functions.php 文件中注册 menus


if ( function_exists(&#039;register_nav_menus&#039;) ) {
register_nav_menus(
array(
&#039;footer_menu&#039; =&#62; &#039;My Custom Footer Menu&#039;,
&#039;sidebar_menu&#039; =&#62; &#039;Super Sidebar Menu&#039;
)
);
}

用管理帐号创建 menu
进入 外观-&#62;Menus 进行创建，例如创建页脚菜单 Footer Menu：

创建好后保存你想要生效的 menu，然后将想要展示的模块“添加到 Menu”并保存。
在模板中插入 menu
例如刚才的 Footer Menu，可以插入到 footer.php 你想要显示的位置，代码如下


&#60;?php wp_nav_menu( array(&#039;menu&#039; =&#62; &#039;Footer Menu&#039;)); ?&#62;

根据自己定义的 menu 名称更改以上代码，即可实现相应的 menu 功能。此 Footer Menu 的相应HTML 输出像如下代码


&#60;div class=&#34;menu-footer-menu-container&#34;&#62;&#60;ul id=&#34;menu-footer-menu&#34; class=&#34;menu&#34;&#62;
&#60;li id=&#34;menu-item-423&#34; class=&#34;menu-item menu-item-type-custom [...]]]></description>
			<content:encoded><![CDATA[<p>新发布的 WordPress 3.0 中新增了一个实用的功能，将外观层所表现的边栏（sidebar）和页脚（footer）等通过内置函数实现，删减模块不需要再改动代码，可直接在控制板直观自由地添加和改动。</p>
<p>值得注意的是，3.0 版本的 WordPress 在发表此文章时还没有中文版本，我使用英文版升级后改动的部分没有翻译。<span id="more-495"></span></p>
<p><a href="http://phpstone.com/wp-content/uploads/2010/08/menus.jpg"><img class="size-full wp-image-496 alignnone" title="menus" src="http://phpstone.com/wp-content/uploads/2010/08/menus.jpg" alt="wordpress menus" width="147" height="121" /></a></p>
<h3>在 functions.php 文件中注册 menus</h3>
<pre class="brush: php; ">

if ( function_exists(&#039;register_nav_menus&#039;) ) {
register_nav_menus(
array(
&#039;footer_menu&#039; =&gt; &#039;My Custom Footer Menu&#039;,
&#039;sidebar_menu&#039; =&gt; &#039;Super Sidebar Menu&#039;
)
);
}
</pre>
<h3>用管理帐号创建 menu</h3>
<p>进入 外观-&gt;Menus 进行创建，例如创建页脚菜单 Footer Menu：</p>
<p><a href="http://phpstone.com/wp-content/uploads/2010/08/create-menus.jpg"><img class="alignnone size-full wp-image-509" title="create menus" src="http://phpstone.com/wp-content/uploads/2010/08/create-menus.jpg" alt="" width="588" height="413" /></a></p>
<p>创建好后保存你想要生效的 menu，然后将想要展示的模块“添加到 Menu”并保存。</p>
<h3>在模板中插入 menu</h3>
<p>例如刚才的 Footer Menu，可以插入到 footer.php 你想要显示的位置，代码如下</p>
<pre class="brush: php; ">

&lt;?php wp_nav_menu( array(&#039;menu&#039; =&gt; &#039;Footer Menu&#039;)); ?&gt;
</pre>
<p>根据自己定义的 menu 名称更改以上代码，即可实现相应的 menu 功能。此 Footer Menu 的相应HTML 输出像如下代码</p>
<pre class="brush: php; ">

&lt;div class=&quot;menu-footer-menu-container&quot;&gt;&lt;ul id=&quot;menu-footer-menu&quot; class=&quot;menu&quot;&gt;
&lt;li id=&quot;menu-item-423&quot; class=&quot;menu-item menu-item-type-custom menu-item-423&quot;&gt;&lt;a href=&quot;http://phpstone.com&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;menu-item-424&quot; class=&quot;menu-item menu-item-type-post_type menu-item-424&quot;&gt;&lt;a href=&quot;http://phpstone.com/archives/&quot;&gt;Archives&lt;/a&gt;&lt;/li&gt;
&lt;li id=&quot;menu-item-425&quot; class=&quot;menu-item menu-item-type-post_type menu-item-425&quot;&gt;&lt;a href=&quot;http://phpstone.com/about/&quot;&gt;关于&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
</pre>
<p>根据这些 div 标记用 css 重新定义外观，即可得到想要的效果。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/using-menus-in-wordpress-3-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 导航提示（面包屑型轨迹）</title>
		<link>http://phpstone.com/php-navigation-tips/</link>
		<comments>http://phpstone.com/php-navigation-tips/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 07:43:55 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=474</guid>
		<description><![CDATA[导航提示（面包屑型轨迹）为Web用户提供了方便、直观的导航帮助，将用户的当前位置分解为一个超链接路径提供当前文档中网站中相对位置的总揽。总体来说，更加优于浏览器本身提供的导航工具，而且能够补充甚至替代一般网站的本地化菜单系统。
这里演示两种不同的方法，第一种使用数组将难于处理的URL树转换为更加友好的用户命名约定。这种实现对于创建对应基本静态页面的导航树比较实用。第二种使用MySQL数据库，为数据库驱动的网站创建用户友好的导航映射。最后将面包屑轨迹简单地应用到 WordPress 模板的编写中。
一、基于静态数据创建面包屑型轨迹
实现思路：

 使用$_SERVER['PHP_SELF'] 读取文件的目录树。
将目录树各级转换为数组。
创建一个关联数组，用来为导航提供用户友好的名字。
创建URL解析和映射函数create_crumbs()。将其存储在全局网站头文件中。
在需要导航提示的页面执行create_crumbs() 函数。



function create_crumbs($crumb_site, $home_label, $crumb_labels) {

$crumb_trail = &#34;&#60;a href = \&#34;$crumb_site\&#34;&#62;$home_label&#60;/a&#62;&#34;;
$crumb_tree = explode(&#039;/&#039;, $_SERVER[&#039;PHP_SELF&#039;]);
//explode()函数分割字符串到数组，这里以斜杠“/&#34;作为分割
$crumb_path = $crumb_site.&#039;/&#039;;

for ($x = 1; $x &#60; count($crumb_tree) - 1; $x++) {
$crumb_path .= $crumb_tree[$x].&#039;/&#039;;
$crumb_trail .= &#039; &#38;gt; &#60;a href=&#34;&#039;.$crumb_path.&#039;&#34;&#62;&#039; .$crumb_labels[$crumb_tree[$x]].&#039;&#60;/a&#62;&#039;;
}

return $crumb_trail;
}

保存为 “breadcrumbs.php”到相应目录，这里方便示例保存到和测试页面同一目录下，即 /php/form/pmnp/mysql/ 下。接着创建3个输入参数并执行函数：


include &#34;breadcrumbs.php&#34;;
$crumb_site = &#34;http://localhost&#34;;  //这里在本机测试，如果在另外服务器替换相应域名
$crumb_labels = array(
&#34;php&#34; =&#62; &#34;PHP&#34;,
&#34;form&#34; =&#62; &#34;Recent Articles&#34;,
&#34;pmnp&#34; =&#62; &#34;Beginning PHP [...]]]></description>
			<content:encoded><![CDATA[<p>导航提示（面包屑型轨迹）为Web用户提供了方便、直观的导航帮助，将用户的当前位置分解为一个超链接路径提供当前文档中网站中相对位置的总揽。总体来说，更加优于浏览器本身提供的导航工具，而且能够补充甚至替代一般网站的本地化菜单系统。</p>
<p>这里演示两种不同的方法，第一种使用数组将难于处理的URL树转换为更加友好的用户命名约定。这种实现对于创建对应基本静态页面的导航树比较实用。第二种使用MySQL数据库，为数据库驱动的网站创建用户友好的导航映射。最后将面包屑轨迹简单地应用到 WordPress 模板的编写中。<span id="more-474"></span></p>
<h3>一、基于静态数据创建面包屑型轨迹</h3>
<p>实现思路：</p>
<ol>
<li> 使用$_SERVER['PHP_SELF'] 读取文件的目录树。</li>
<li>将目录树各级转换为数组。</li>
<li>创建一个关联数组，用来为导航提供用户友好的名字。</li>
<li>创建URL解析和映射函数create_crumbs()。将其存储在全局网站头文件中。</li>
<li>在需要导航提示的页面执行create_crumbs() 函数。</li>
</ol>
<pre class="brush: php; ">

function create_crumbs($crumb_site, $home_label, $crumb_labels) {

$crumb_trail = &quot;&lt;a href = \&quot;$crumb_site\&quot;&gt;$home_label&lt;/a&gt;&quot;;
$crumb_tree = explode(&#039;/&#039;, $_SERVER[&#039;PHP_SELF&#039;]);
//explode()函数分割字符串到数组，这里以斜杠“/&quot;作为分割
$crumb_path = $crumb_site.&#039;/&#039;;

for ($x = 1; $x &lt; count($crumb_tree) - 1; $x++) {
$crumb_path .= $crumb_tree[$x].&#039;/&#039;;
$crumb_trail .= &#039; &amp;gt; &lt;a href=&quot;&#039;.$crumb_path.&#039;&quot;&gt;&#039; .$crumb_labels[$crumb_tree[$x]].&#039;&lt;/a&gt;&#039;;
}

return $crumb_trail;
}
</pre>
<p>保存为 “breadcrumbs.php”到相应目录，这里方便示例保存到和测试页面同一目录下，即 /php/form/pmnp/mysql/ 下。接着创建3个输入参数并执行函数：</p>
<pre class="brush: php; ">

include &quot;breadcrumbs.php&quot;;
$crumb_site = &quot;http://localhost&quot;;  //这里在本机测试，如果在另外服务器替换相应域名
$crumb_labels = array(
&quot;php&quot; =&gt; &quot;PHP&quot;,
&quot;form&quot; =&gt; &quot;Recent Articles&quot;,
&quot;pmnp&quot; =&gt; &quot;Beginning PHP and MySQL 5&quot;,
&quot;mysql&quot; =&gt; &quot;MYSQL&quot;
);

echo create_crumbs($crumb_site, &quot;Home&quot;, $crumb_labels);
</pre>
<p>将此代码保存执行即可得到如下面包屑型轨迹：</p>
<pre>Home &gt; PHP  &gt; Recent Articles &gt; Beginning PHP and MySQL 5 &gt; MYSQL</pre>
<h3>二、基于数据库表数据创建面包屑型轨迹</h3>
<p>考虑将 URL http://www.example.com/books/1590595521/ 转换为如下面包屑型轨迹：</p>
<pre>Home &gt; IT &gt; Beginning PHP and MySQL5</pre>
<p>对于数据库驱动的网站而言，用数组来处理存贮的动态信息虽然可行，但并不是最方便的方式。下面只是一个简单的实现，将指定的ISBN号码查询出匹配的书名和所属分类，输出到导航位置。</p>
<p>以下 categories 表提供了书类别到 books 表中存储的 书之间的一对多的映射。</p>
<pre class="brush: sql; ">

create table categories2 (
categoryID  TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(15) NOT NULL );
</pre>
<p>表 books 用于存贮出版商的图书信息：</p>
<pre class="brush: sql; ">

create table books (
bookID TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
categoryID TINYINT NOT NULL,
isbn VARCHAR(9) NOT NULL,
author VARCHAR(50) NOT NULL,
title VARCHAR(45) NOT NULL,
description VARCHAR(300) NOT NULL );
</pre>
<p>在books表中插入数据:</p>
<pre class="brush: sql; ">

insert into books (categoryID,isbn,author,title,description)
values (&#039;2&#039;,&#039;159059552&#039;,&#039;Kevin&#039;,&#039;Beginning PHP and MySQL5&#039;,&#039;How to learn PHP and MySQ&#039;);
</pre>
<p>创建好数据库后，现在编写PHP代码部分，以上省略了创建数据库表时提供的数据库名和用户，需自行创建并调整PHP代码连接数据库部分。</p>
<pre class="brush: php; ">

function create_crumbs($siteURL, $categoryID, $categoryName, $title) {
$crumb = &quot;&lt;a href = \&quot;$siteURL\&quot;&gt;Home&lt;/a&gt; &amp;gt; &lt;a href = \&quot;$siteURL/category/$categoryID/\&quot;&gt;$categoryName&lt;/a&gt; &amp;gt; $title&quot;;
print $crumb;
}

$siteURL = &quot;Http://localhost&quot;;

mysql_pconnect(&quot;localhost&quot;,&quot;website&quot;,&quot;secret&quot;);
mysql_select_db(&quot;corporate&quot;);

$isbn =&quot;159059552&quot;;

$result = mysql_query(&quot;select b.categoryID,c.name,b.isbn,b.author,b.title,b.description from books b,categories c where b.isbn = $isbn and b.categoryID = c.categoryID&quot;);

$row = mysql_fetch_assoc($result);

$categoryID = $row[&quot;categoryID&quot;];
$categoryName = $row[&quot;name&quot;];
$isbn = $row[&quot;isbn&quot;];
$authorID = $row[&quot;author&quot;];
$title = $row[&quot;title&quot;];

create_crumbs($siteURL, $categoryID, $categoryName, $title);
</pre>
<p>直接在浏览器执行这个PHP文件即可得到效果。</p>
<h3>向 WordPress 模板添加面包屑型轨迹</h3>
<p>由于WordPress 有大量可用的函数，在其模板里实现面包屑型轨迹是一个很简单的事情。只需要在 “single.php” 需要展示导航提示的位置添加下面代码即可实现：</p>
<pre class="brush: php; ">

&lt;a title=&quot;Back to Homepage&quot; href=&quot;&lt;?php echo get_settings(&#039;home&#039;); ?&gt;/&quot;&gt;Home&lt;/a&gt;
&amp;gt; &lt;?php the_category(&#039;, &#039;); ?&gt;
&amp;gt; &lt;?php the_title(); ?&gt;
</pre>
<p>而达到如下的效果：</p>
<pre>Home &gt; 文章目录 &gt; 文章名称</pre>
<p>至于达到更好的样式，通过一些 CSS 代码的调整应该可以达到满意的效果。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-navigation-tips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>递归函数 &#8211; 还贷计算器</title>
		<link>http://phpstone.com/recursive-function/</link>
		<comments>http://phpstone.com/recursive-function/#comments</comments>
		<pubDate>Wed, 02 Jun 2010 09:08:00 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=453</guid>
		<description><![CDATA[递归函数（recursive function)，即调用自身的函数，通常有很好的实用价值，用来将复杂的问题分解为简单的情况，反复调用自身处理直到问题解决。
这里以还贷计算器中的等额本息（每月以相等金额还贷款的本金加利息）还款为例子，输出一个表格，例举出每一期还款所需要的偿还的金额，所还的利息以及每月的贷款本金减少额。
先做一个HTML表接受用户输入，代码如下：


&#60;h2&#62;等额本息还款&#60;/h2&#62;
&#60;form action=&#34;&#60;?php $PHP_SELF; ?&#62;&#34; method=&#34;post&#34;&#62;
&#60;p&#62;
贷款本金:&#60;br /&#62;
&#60;input type=&#34;text&#34; id=&#34;balance&#34; name=&#34;balance&#34; size=&#34;20&#34; maxlength=&#34;40&#34; /&#62;
&#60;/p&#62;
&#60;p&#62;
贷款年限:&#60;br /&#62;
&#60;input type=&#34;text&#34; id=&#34;term&#34; name=&#34;term&#34; size=&#34;20&#34; maxlength=&#34;40&#34; /&#62;
&#60;/p&#62;
&#60;p&#62;
年利率(%):&#60;br /&#62;
&#60;input type=&#34;text&#34; id=&#34;rate&#34; name=&#34;rate&#34; size=&#34;20&#34; maxlength=&#34;40&#34; /&#62;
&#60;/p&#62;
&#60;input type=&#34;submit&#34; id=&#34;submit&#34; name=&#34;submit&#34; value=&#34;计算&#34; /&#62;
&#60;/form&#62;

现在编写实现主要功能的递归函数。需要了解到的是，每月本金减少额=每月还款额-每月的利息。当贷款本金不等于0时，重复执行函数到贷款本金为0时结束。
注：《PHP与MySQL 5程序设计》（第2版）上有这个例子，但书上 if 判断当本金为 0 时执行 exit，将导致不能输出 &#60;/table&#62; 结束标志和后面的 HTML代码，此处做了修改，本金为 0 时直接输出&#60;/table&#62;。


//Recursive Function(递归函数)

/*
$paymentNum--还款期数
$balance--贷款本金
$periodicPayment--每月还款额
$paymentInterest--每月的利息
$paymentPrincipal--每月本金减少额
$monthlyInterest--月利率
*/

function amortizationTable($paymentNum,$periodicPayment,$balance,$monthlyInterest) {
$paymentInterest = round($balance * $monthlyInterest,2);
$paymentPrincipal = round($periodicPayment - $paymentInterest,2);
$newBalance = [...]]]></description>
			<content:encoded><![CDATA[<p>递归函数（recursive function)，即调用自身的函数，通常有很好的实用价值，用来将复杂的问题分解为简单的情况，反复调用自身处理直到问题解决。</p>
<p>这里以还贷计算器中的等额本息（每月以相等金额还贷款的本金加利息）还款为例子，输出一个表格，例举出每一期还款所需要的偿还的金额，所还的利息以及每月的贷款本金减少额。</p>
<p>先做一个HTML表接受用户输入，代码如下：<span id="more-453"></span></p>
<pre class="brush: xml; ">

&lt;h2&gt;等额本息还款&lt;/h2&gt;
&lt;form action=&quot;&lt;?php $PHP_SELF; ?&gt;&quot; method=&quot;post&quot;&gt;
&lt;p&gt;
贷款本金:&lt;br /&gt;
&lt;input type=&quot;text&quot; id=&quot;balance&quot; name=&quot;balance&quot; size=&quot;20&quot; maxlength=&quot;40&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
贷款年限:&lt;br /&gt;
&lt;input type=&quot;text&quot; id=&quot;term&quot; name=&quot;term&quot; size=&quot;20&quot; maxlength=&quot;40&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
年利率(%):&lt;br /&gt;
&lt;input type=&quot;text&quot; id=&quot;rate&quot; name=&quot;rate&quot; size=&quot;20&quot; maxlength=&quot;40&quot; /&gt;
&lt;/p&gt;
&lt;input type=&quot;submit&quot; id=&quot;submit&quot; name=&quot;submit&quot; value=&quot;计算&quot; /&gt;
&lt;/form&gt;
</pre>
<p>现在编写实现主要功能的递归函数。需要了解到的是，每月本金减少额=每月还款额-每月的利息。当贷款本金不等于0时，重复执行函数到贷款本金为0时结束。</p>
<p>注：《PHP与MySQL 5程序设计》（第2版）上有这个例子，但书上 if 判断当本金为 0 时执行 exit，将导致不能输出 &lt;/table&gt; 结束标志和后面的 HTML代码，此处做了修改，本金为 0 时直接输出&lt;/table&gt;。</p>
<pre class="brush: php; ">

//Recursive Function(递归函数)

/*
$paymentNum--还款期数
$balance--贷款本金
$periodicPayment--每月还款额
$paymentInterest--每月的利息
$paymentPrincipal--每月本金减少额
$monthlyInterest--月利率
*/

function amortizationTable($paymentNum,$periodicPayment,$balance,$monthlyInterest) {
$paymentInterest = round($balance * $monthlyInterest,2);
$paymentPrincipal = round($periodicPayment - $paymentInterest,2);
$newBalance = round($balance - $paymentPrincipal,2);
echo &quot;&lt;tr&gt;
&lt;td&gt;$paymentNum&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($balance,2).&quot;&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($periodicPayment,2).&quot;&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($paymentInterest,2).&quot;&lt;/td&gt;
&lt;td&gt;\$&quot;.number_format($paymentPrincipal,2).&quot;&lt;/td&gt;
&lt;/tr&gt;&quot;;
//If balance not yet zero,recursively call amortizationTable()
if ($newBalance &gt; 0) {
$paymentNum++;
amortizationTable($paymentNum,$periodicPayment,$newBalance,$monthlyInterest);
}
else {
echo &quot;&lt;/table&gt;&quot;;
}
} //end amortizationTable()
</pre>
<p>接下来计算每月还款额以及执行递归函数。</p>
<p>Tips：每月还款额=贷款本金×月利率×(1＋月利率)^还款总期数／（(1＋月利率)^还款总期数-1 ）</p>
<p>x^y 表示x的y次方</p>
<p>因为将表单和函数执行写在一个文件上，因此再添加一个 if 判断，有表单数据递交时才执行后面的代码</p>
<pre class="brush: php; ">

if (isset($_POST[&#039;submit&#039;]))
{

# Loan balance (贷款余额)
$balance = $_POST[&#039;balance&#039;];

# Loan interest(利、息) rate
$interestRate = $_POST[&#039;rate&#039;] / 100;

# Mothly interest rate
$monthlyInterest = $interestRate / 12;

# Term length of the loan(固定贷款期限),in year.
$termLength = $_POST[&#039;term&#039;];

# Number of payments per year.
$paymentsPerYear = 12;

# Payment iteration(迭代)
$paymentNumber = 1;

# Perform preliminary calculations
$totalPayments = $termLength * $paymentsPerYear;
$intCalc = 1 + $interestRate / $paymentsPerYear;    # 1+月利率
$periodicPayment = $balance * pow($intCalc,$totalPayments) * ($intCalc -1 ) / (pow($intCalc,$totalPayments) - 1);
$periodicPayment = round($periodicPayment,2);
echo &quot;&lt;p&gt;您计算的每月还款额为: ￥&quot;.$periodicPayment.&quot;&lt;/p&gt;&quot;;
?&gt;
&lt;table width=&#039;50%&#039; align=&#039;center&#039; border=&#039;1&#039;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Payment Number&lt;/th&gt;&lt;th&gt;Balance&lt;/th&gt;
&lt;th&gt;Payment&lt;/th&gt;&lt;th&gt;Interest&lt;/th&gt;&lt;th&gt;Principal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tfoot&gt;
&lt;tr&gt;
&lt;th colspan=&quot;5&quot;&gt;Now We are Finished!&lt;/th&gt;
&lt;/tr&gt;
&lt;/tfoot&gt;
&lt;?php
# Call recursive function
amortizationTable($paymentNumber,$periodicPayment,$balance,$monthlyInterest);
} //End if
?&gt;
</pre>
<p>使用递归策略通常能大幅减少代码量，提高重用性。虽然递归并不总是最好的解决办法，但是可以作为一个有益的补充。</p>
<p>PS：关于 HTML 表格的一些问题</p>
<p>&lt;thead&gt;, &lt;tbody&gt; 和 &lt;tfoot&gt;很少被用到，这是由于浏览器对它们的支持不太好。但是用这些标签定义表格可以在使用被支持的浏览器（如 Firefox)打印时产生一个效果，就是当表格过长超过一个打印页时将每页添加表格页眉和页脚，以方便查看数据。感兴趣的可以运行代码试试。</p>
<p>经过我的测试Windows 7下firefox和ie8，在只使用 &lt;thead&gt; 和 &lt;tbody&gt; 而不使用 &lt;tfoot&gt; 时打印页眉页脚正常。在 Mac 下仅 firefox 正常。至于为什么添加了 &lt;tfoot&gt; 反而出现问题我也不甚理解，请知晓的朋友在此留言。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/recursive-function/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress Template &#8211; Title 优化</title>
		<link>http://phpstone.com/wordpress-template-title-optimization/</link>
		<comments>http://phpstone.com/wordpress-template-title-optimization/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 09:21:39 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=436</guid>
		<description><![CDATA[WordPess 2.5 以后，wp_title() 函数新增了功能，可以直接将文章标题和分隔符显示在博客名称之前，用法在默认模板的&#60;title&#62;&#60;/title&#62;字段给出了范例：


&#60;title&#62;
&#60;?php wp_title(&#039;&#124;&#039;,true,&#039;right&#039;); ?&#62;
&#60;?php bloginfo(&#039;name&#039;); ?&#62;
&#60;/title&#62;

这段代码能在主页的浏览器标题上只显示博客标题，而文章页面则是“文章标题 &#124; 博客标题”样式
而对于WordPress2.5之前的版本，可以参见wordpress.org
有些朋友喜欢在主页的标题显示描叙性文字，而对于WordPress的模板来说，则是直接将博客副标题应用于&#60;title&#62;，写法大致如下


&#60;title&#62;
&#60;?php { wp_title(&#039;&#124;&#039;, true, &#039;right&#039;); } ?&#62; &#60;?php bloginfo(&#039;name&#039;);  ?&#62;
&#60;?php if ( is_home() ) { ?&#62; &#124; &#60;?php bloginfo(&#039;description&#039;);   } ?&#62;
&#60;/title&#62;

这样的做法对于SEO来讲是不可取的，因为HTML的&#60;title&#62;和博客副标题采用同样的描叙会导致搜索引擎看来重复的描叙，其结果可以用Google 的Webmaster Tools -&#62;Diagnostics-&#62;HTML suggestions检测到。
在我看来，WordPress默认模板采用的方法就很好，对于用户而言，看博客的副标题即可；另外就我而言，并不喜欢在收藏站点时后面大段的描叙性文字，还得自己删除。
如果坚持在&#60;tilte&#62;使用描叙性文字，我目前知道的方法仅是手工写入模板&#60;tilte&#62;字段，且稍微有别于博客副标题。不过这样的做法只适合自己的私用模板，不适用于公用模板的编写。
PS：写文章时文章本身标题的选取也很有讲究，这个话题可参见英语文章：
SEO Tutorial – Title Optimization
]]></description>
			<content:encoded><![CDATA[<p>WordPess 2.5 以后，wp_title() 函数新增了功能，可以直接将文章标题和分隔符显示在博客名称之前，用法在默认模板的&lt;title&gt;&lt;/title&gt;字段给出了范例：</p>
<pre class="brush: php; ">

&lt;title&gt;
&lt;?php wp_title(&#039;|&#039;,true,&#039;right&#039;); ?&gt;
&lt;?php bloginfo(&#039;name&#039;); ?&gt;
&lt;/title&gt;
</pre>
<p>这段代码能在主页的浏览器标题上只显示博客标题，而文章页面则是“文章标题 | 博客标题”样式<span id="more-436"></span></p>
<p>而对于WordPress2.5之前的版本，可以参见<a href="http://codex.wordpress.org/Template_Tags/wp_title" target="_blank">wordpress.org</a></p>
<p>有些朋友喜欢在主页的标题显示描叙性文字，而对于WordPress的模板来说，则是直接将博客副标题应用于&lt;title&gt;，写法大致如下</p>
<pre class="brush: php; ">

&lt;title&gt;
&lt;?php { wp_title(&#039;|&#039;, true, &#039;right&#039;); } ?&gt; &lt;?php bloginfo(&#039;name&#039;);  ?&gt;
&lt;?php if ( is_home() ) { ?&gt; | &lt;?php bloginfo(&#039;description&#039;);   } ?&gt;
&lt;/title&gt;
</pre>
<p>这样的做法对于SEO来讲是不可取的，因为HTML的&lt;title&gt;和博客副标题采用同样的描叙会导致搜索引擎看来重复的描叙，其结果可以用Google 的Webmaster Tools -&gt;Diagnostics-&gt;HTML suggestions检测到。<a href="http://www.google.com/webmasters/tools"></a></p>
<p>在我看来，WordPress默认模板采用的方法就很好，对于用户而言，看博客的副标题即可；另外就我而言，并不喜欢在收藏站点时后面大段的描叙性文字，还得自己删除。</p>
<p>如果坚持在&lt;tilte&gt;使用描叙性文字，我目前知道的方法仅是手工写入模板&lt;tilte&gt;字段，且稍微有别于博客副标题。不过这样的做法只适合自己的私用模板，不适用于公用模板的编写。</p>
<p>PS：写文章时文章本身标题的选取也很有讲究，这个话题可参见英语文章：</p>
<p><a href="http://www.seo-gold.com/seo-tutorial/title-optimization" target="_blank">SEO Tutorial – Title Optimization</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/wordpress-template-title-optimization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows 系统维护笔记</title>
		<link>http://phpstone.com/windows-system-maintenance-note/</link>
		<comments>http://phpstone.com/windows-system-maintenance-note/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 08:02:25 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=426</guid>
		<description><![CDATA[Windows Server 2008自动安装安全更新时失败
安全更新包：KB967723，错误代码：code 80070490
有时解决这种问题的方法很简单，到微软的官方下载中心下载独立的安装包执行安装就解决了。
http://www.microsoft.com/downloads/en/default.aspx
在下载中心搜索KB967723，找到相应系统的更新程序，下载并执行安装。
Windows 无法正常启动时的文件备份转移方案
当系统无法正常启动，且必须用重装方案来解决问题时，如果C盘有文件需要备份，如桌面，我的文档（通常人们很喜欢将重要文件放桌面）使用此方案：
连接好用于备份的移动硬盘，
使用装载于移动存储（U盘）或者光盘的Windows PE启动计算机，然后将位于C分区的文件复制到备份磁盘。桌面位置是进入C:\Documents and Settings，以用户名命名的文件夹，“桌面”文件夹，“我的文档”是在和“桌面”共同父目录下的My Documents（如果你的系统没有将我的文档转移到其他非系统磁盘的话）。
或者，如果你觉得Windows PE 不好找，恰巧你又是 Ubuntu用户的话，直接运行Ubuntu live安装光盘，与Windows PE在操作上的不同之处是，需要将原系统的磁盘先挂载，再复制到备份磁盘。
Windows系列移动设备防毒方案
即使你是电脑高手，干净的移动硬盘、U盘插到感染了硬盘病毒、木马的电脑上，也会立刻感染吧？
移动硬盘还好点，多数是NTFS格式分区，能杜绝一部分病毒；而U盘呢，多数默认FAT32，虽然多数U盘带写保护开关，但是你要写入数据到U盘，不是还得打开写保护么？加之FAT32毫无安全性可言，只能为“鱼肉“。
因此第一步，先NTFS吧。移动硬盘可以直接格式化为NTFS，但是U盘你会发现没有这个选项，两种办法：
其一，右键任意磁盘或者U盘，点属性，点到硬件标签，选择要格式化的U盘，再点属性，策略标签里选择为提高性能而优化。确定之后此U盘的格式化菜单中就会出现NTFS格式选项。
其二，运行cmd ，执行命令 convert H: /fs:ntfs ，其中H代表你的U盘盘符，可以直接将FAT32的U盘转换为NTFS（似乎少数品牌的U盘不支持转换成NTFS）。
第二步，就是将移动磁盘或者U盘的根目录改为只读，而根目录下的子目录按你的需求改为读写：
要控制目录的安全属性，有个选项是预装系统默认没有去掉的，打开我的电脑，选项工具菜单，文件夹选项，”查看“标签，去掉”使用简单文件夹共享（推荐）“前的勾。
首先在你的移动设备根目录建立好你所有需要的根目录文件夹（去掉根目录写权限后就无法建立了，但是过程可逆，放心操作），右键你要控制的磁盘，选项属性点到安全，根据Windows的用户策略，将Everyone的写入权限勾选上拒绝，此磁盘就变为了只读，不可写入文件；此后再将根目录下各个你需要写入的文件夹Everyone的写入权限再加上，就达到了我们控制病毒写入的目的：
根目录不可写入，但指定文件夹可写入
开启 Windows 7 的 telnet 命令
Windows 7 默认没有开启telnet命令功能。CMD内运行时将提示
“&#8217;Telnet&#8217;不是内部或外部命令，也不是可运行的程序或批处理文件。”
这是出于安全考虑默认关闭了Telnet 客户端，开启办法：
运行“control”打开控制面板，点击“程序”，点击“打开或关闭 Windows 功能”，勾选“Telnet 客户端”，确定即可
&#8211; To be continued
]]></description>
			<content:encoded><![CDATA[<h3>Windows Server 2008自动安装安全更新时失败</h3>
<p>安全更新包：KB967723，错误代码：code 80070490</p>
<p>有时解决这种问题的方法很简单，到微软的官方下载中心下载独立的安装包执行安装就解决了。<br />
<a href="http://www.microsoft.com/downloads/en/default.aspx">http://www.microsoft.com/downloads/en/default.aspx</a><br />
在下载中心搜索KB967723，找到相应系统的更新程序，下载并执行安装。</p>
<h3>Windows 无法正常启动时的文件备份转移方案</h3>
<p>当系统无法正常启动，且必须用重装方案来解决问题时，如果C盘有文件需要备份，如桌面，我的文档（通常人们很喜欢将重要文件放桌面）使用此方案：</p>
<p>连接好用于备份的移动硬盘，<span id="more-426"></span></p>
<p>使用装载于移动存储（U盘）或者光盘的Windows PE启动计算机，然后将位于C分区的文件复制到备份磁盘。桌面位置是进入C:\Documents and Settings，以用户名命名的文件夹，“桌面”文件夹，“我的文档”是在和“桌面”共同父目录下的My Documents（如果你的系统没有将我的文档转移到其他非系统磁盘的话）。</p>
<p>或者，如果你觉得Windows PE 不好找，恰巧你又是 Ubuntu用户的话，直接运行Ubuntu live安装光盘，与Windows PE在操作上的不同之处是，需要将原系统的磁盘先挂载，再复制到备份磁盘。</p>
<h3>Windows系列移动设备防毒方案</h3>
<p>即使你是电脑高手，干净的移动硬盘、U盘插到感染了硬盘病毒、木马的电脑上，也会立刻感染吧？</p>
<p>移动硬盘还好点，多数是NTFS格式分区，能杜绝一部分病毒；而U盘呢，多数默认FAT32，虽然多数U盘带写保护开关，但是你要写入数据到U盘，不是还得打开写保护么？加之FAT32毫无安全性可言，只能为“鱼肉“。</p>
<p>因此第一步，先NTFS吧。移动硬盘可以直接格式化为NTFS，但是U盘你会发现没有这个选项，两种办法：</p>
<p>其一，右键任意磁盘或者U盘，点属性，点到硬件标签，选择要格式化的U盘，再点属性，策略标签里选择为提高性能而优化。确定之后此U盘的格式化菜单中就会出现NTFS格式选项。</p>
<p>其二，运行cmd ，执行命令 convert H: /fs:ntfs ，其中H代表你的U盘盘符，可以直接将FAT32的U盘转换为NTFS（似乎少数品牌的U盘不支持转换成NTFS）。</p>
<p>第二步，就是将移动磁盘或者U盘的根目录改为只读，而根目录下的子目录按你的需求改为读写：</p>
<p>要控制目录的安全属性，有个选项是预装系统默认没有去掉的，打开我的电脑，选项工具菜单，文件夹选项，”查看“标签，去掉”使用简单文件夹共享（推荐）“前的勾。</p>
<p>首先在你的移动设备根目录建立好你所有需要的根目录文件夹（去掉根目录写权限后就无法建立了，但是过程可逆，放心操作），右键你要控制的磁盘，选项属性点到安全，根据Windows的用户策略，将Everyone的写入权限勾选上拒绝，此磁盘就变为了只读，不可写入文件；此后再将根目录下各个你需要写入的文件夹Everyone的写入权限再加上，就达到了我们控制病毒写入的目的：</p>
<p>根目录不可写入，但指定文件夹可写入</p>
<h3>开启 Windows 7 的 telnet 命令</h3>
<p>Windows 7 默认没有开启telnet命令功能。CMD内运行时将提示<br />
“&#8217;Telnet&#8217;不是内部或外部命令，也不是可运行的程序或批处理文件。”</p>
<p>这是出于安全考虑默认关闭了Telnet 客户端，开启办法：</p>
<p>运行“control”打开控制面板，点击“程序”，点击“打开或关闭 Windows 功能”，勾选“Telnet 客户端”，确定即可</p>
<p>&#8211; To be continued</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/windows-system-maintenance-note/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>为PHP5安装PEAR</title>
		<link>http://phpstone.com/install-pear-for-php5/</link>
		<comments>http://phpstone.com/install-pear-for-php5/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 08:02:59 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[pear]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=401</guid>
		<description><![CDATA[最近在学习PHP的PEAR（PHP Extension and Application Repository PHP扩展与应用库），测试软件我都首先在FreeBSD上安装，因为早已习惯与其软件维护的简便。
#cd /usr/ports/devel/pear
#make install clean
执行安装后提示当前PHP没有运行在命令行模式下，无法安装
#cd /usr/ports/lang/php5
#make config
将PHP配置选项的CLI选择上，CLI是PHP的命令行模式，将此选项编译允许PHP使用此模式，才能安装PEAR。
此时可以执行重新安装命令 #make reinstall clean，不巧此时在服务器上的PHP版本需要升级，因此我直接执行了 #portupgrade php5，完成升级后重新进入pear的ports目录安装。
安装完成后，执行 #pear list 可查询默认安装的PEAR包，执行 #pear install pkgname 可以安装所需PEAR包。
Mac OS X 下我使用的是MAMP，里面默认安装了PEAR，但是需要使用 pear 命令的话需要定位到MAMP的安装目录，或者配置用户的bash环境。
Windows下则是默认没有安装PEAR，可在PHP目录下执行go-pear.bat进行安装配置，或者使用官方提供的go-pear.php 文件使用web管理方式（Webbased PEAR Package Manager）进行安装，安装完成后可以访问管理目录进行PEAR的包管理、安装等，较为直观。
]]></description>
			<content:encoded><![CDATA[<p>最近在学习PHP的PEAR（PHP Extension and Application Repository PHP扩展与应用库），测试软件我都首先在FreeBSD上安装，因为早已习惯与其软件维护的简便。</p>
<p>#cd /usr/ports/devel/pear<br />
#make install clean</p>
<p>执行安装后提示当前PHP没有运行在命令行模式下，无法安装</p>
<p>#cd /usr/ports/lang/php5<br />
#make config<span id="more-401"></span></p>
<p>将PHP配置选项的CLI选择上，CLI是PHP的命令行模式，将此选项编译允许PHP使用此模式，才能安装PEAR。<br />
此时可以执行重新安装命令 #make reinstall clean，不巧此时在服务器上的PHP版本需要升级，因此我直接执行了 #portupgrade php5，完成升级后重新进入pear的ports目录安装。</p>
<p>安装完成后，执行 #pear list 可查询默认安装的PEAR包，执行 #pear install pkgname 可以安装所需PEAR包。</p>
<p>Mac OS X 下我使用的是MAMP，里面默认安装了PEAR，但是需要使用 pear 命令的话需要定位到MAMP的安装目录，或者配置用户的bash环境。</p>
<p>Windows下则是默认没有安装PEAR，可在PHP目录下执行go-pear.bat进行安装配置，或者使用官方提供的go-pear.php 文件使用web管理方式（Webbased PEAR Package Manager）进行安装，安装完成后可以访问管理目录进行PEAR的包管理、安装等，较为直观。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/install-pear-for-php5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>网络设备故障拾遗</title>
		<link>http://phpstone.com/network-equipment-failure-to-add/</link>
		<comments>http://phpstone.com/network-equipment-failure-to-add/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 07:57:53 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>
		<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=371</guid>
		<description><![CDATA[最近碰上一个交换机坏掉和一个路由器坏掉，可是折腾了我一把，把处理过程记录一下。
先是部分电脑连接到打印服务器打印时整个office文档程序死掉，检查发现这些客户端无法通过网络正常连接到打印服务器，原本以为是网线之类的问题，但是发现这些电脑的IM工具、Web应用也正常，然后ping测试到打印服务器也没有丢包现象。由于打印服务器接在一台交换机上，于是将其直连到路由器的端口，部分客户端的打印问题解决了，但是还有一部分故障依旧。将故障客户网络端口换到其他交换机，于是故障得到解决，从而断定交换机故障，替换交换机后恢复正常。
还没有过多久，路由器又出了状况。首先是公司网络异常，主要是连接外网的网络应用均异常，ping 本市的电信数据中心（61.150.4.238）丢包，开始还以为是外部光纤问题，将笔记本直连到光猫测试，检查无异后，检查内部网络ping路由地址也丢包，从而猜测路由器故障。尝试重启路由器几次未果。联系路由器厂商并说明现象后建议尝试更改网卡属性为10M半双工，进行ping路由器测试，出现正常后将路由所以局域网端口和广域网端口全部改为10M半双工，网络连接开始正常。
而后联系厂家发送备用路由，原路由返回修理。
后记：网络故障的排除需要耐心细致的检查和有条理的分析，另外需要一点点扎实的网络基础。到面对实际问题，会发现自己要学的其实还很多。
]]></description>
			<content:encoded><![CDATA[<p>最近碰上一个交换机坏掉和一个路由器坏掉，可是折腾了我一把，把处理过程记录一下。</p>
<p>先是部分电脑连接到打印服务器打印时整个office文档程序死掉，检查发现这些客户端无法通过网络正常连接到打印服务器，原本以为是网线之类的问题，但是发现这些电脑的IM工具、Web应用也正常，然后ping测试到打印服务器也没有丢包现象。由于打印服务器接在一台交换机上，于是将其直连到路由器的端口，部分客户端的打印问题解决了，但是还有一部分故障依旧。将故障客户网络端口换到其他交换机，于是故障得到解决，从而断定交换机故障，替换交换机后恢复正常。</p>
<p>还没有过多久，路由器又出了状况。首先是公司网络异常，主要是连接外网的网络应用均异常，ping 本市的电信数据中心（61.150.4.238）丢包，开始还以为是外部光纤问题，将笔记本直连到光猫测试，检查无异后，检查内部网络ping路由地址也丢包，从而猜测路由器故障。尝试重启路由器几次未果。联系路由器厂商并说明现象后建议尝试更改网卡属性为10M半双工，进行ping路由器测试，出现正常后将路由所以局域网端口和广域网端口全部改为10M半双工，网络连接开始正常。</p>
<p>而后联系厂家发送备用路由，原路由返回修理。</p>
<p>后记：网络故障的排除需要耐心细致的检查和有条理的分析，另外需要一点点扎实的网络基础。到面对实际问题，会发现自己要学的其实还很多。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/network-equipment-failure-to-add/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD 次版本升级笔记</title>
		<link>http://phpstone.com/freebsd-minor-version-upgrades-note/</link>
		<comments>http://phpstone.com/freebsd-minor-version-upgrades-note/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 08:44:45 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Note]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=369</guid>
		<description><![CDATA[由于学习的需求，我在一台FreeBSD服务器上做着各种的尝试。之前FreeBSD的版本升级都需要重新编译内核源代码，那是一个我认为并不繁琐而且很有乐趣的过程，但是最大的缺陷在于最终的更新文件需要跑到机房在服务器连接的显示器跟前进行，无法通过SSH远程来完成。自从有了freebsd-update这个实用的工具之后，我就可以在自己的电脑跟前完成这些操作了。
FreeBSD最新的手册（适用于6.4-RELEASE 和 FreeBSD 7.2-RELEASE）第24章 更新与升级 FreeBSD，已经给出了关于使用freebsd-update进行升级的指导。
记得 7.0-RELEASE 刚发布时，官方的文档说明了freebsd-update不适用于修改过内核的系统升级，这台服务器的系统是从6.1-RELEASE一路编译升级到7.0-RELEASE，修改过内核，为了使用freebsd-update工具，我又使用GENERIC（默认）内核重新编译了一次系统，从7.0-RELEASE开始的安全更新全部是使用的freebsd-update工具进行。7.1-RELEASE发布时，我也尝试过”#freebsd-update -r 7.1-RELEASE upgrade“,一直是到fetch第二部分文件时失败，一直没有找到原因。到09年8月份，我试着再次更新。
我更喜欢用portsnap来更新ports，并且设定好了root用户cron：
0       2       *       *       *       portsnap -I cron update &#038;&#038; pkg_version &#8211; vIL=
每两小时更新一次，但操作升级系统前我还是执行了一次：
#portsnap fetch update
接着执行系统的更新：
#freebsd-update- [...]]]></description>
			<content:encoded><![CDATA[<p>由于学习的需求，我在一台FreeBSD服务器上做着各种的尝试。之前FreeBSD的版本升级都需要重新编译内核源代码，那是一个我认为并不繁琐而且很有乐趣的过程，但是最大的缺陷在于最终的更新文件需要跑到机房在服务器连接的显示器跟前进行，无法通过SSH远程来完成。自从有了freebsd-update这个实用的工具之后，我就可以在自己的电脑跟前完成这些操作了。</p>
<p>FreeBSD最新的手册（适用于6.4-RELEASE 和 FreeBSD 7.2-RELEASE）第24章 更新与升级 FreeBSD，已经给出了关于使用freebsd-update进行升级的指导。<span id="more-369"></span></p>
<p>记得 7.0-RELEASE 刚发布时，官方的文档说明了freebsd-update不适用于修改过内核的系统升级，这台服务器的系统是从6.1-RELEASE一路编译升级到7.0-RELEASE，修改过内核，为了使用freebsd-update工具，我又使用GENERIC（默认）内核重新编译了一次系统，从7.0-RELEASE开始的安全更新全部是使用的freebsd-update工具进行。7.1-RELEASE发布时，我也尝试过”#freebsd-update -r 7.1-RELEASE upgrade“,一直是到fetch第二部分文件时失败，一直没有找到原因。到09年8月份，我试着再次更新。</p>
<p>我更喜欢用portsnap来更新ports，并且设定好了root用户cron：</p>
<p>0       2       *       *       *       portsnap -I cron update &#038;&#038; pkg_version &#8211; vIL=</p>
<p>每两小时更新一次，但操作升级系统前我还是执行了一次：<br />
#portsnap fetch update</p>
<p>接着执行系统的更新：<br />
#freebsd-update- r 7.2-RELEASE upgrade</p>
<p>对于定制过内核的系统，会收到类似下面的警告：</p>
<blockquote><p>WARNING: This system is running a &#8220;MYKERNEL&#8221; kernel, which is not a<br />
kernel configuration distributed as part of FreeBSD 7.0-RELEASE.<br />
This kernel will not be updated: you MUST update the kernel manually<br />
before running &#8220;/usr/sbin/freebsd-update install&#8221;</p></blockquote>
<p>看来我当初做的使用默认内核重新编译系统内核并没有成功地让系统”认为“我使用的是默认内核。<br />
暂时安全地无视这个警告。 更新的 GENERIC 内核将在升级过程的中间步骤中使用。</p>
<p>在下载完针对本地系统的补丁之后， 这些补丁会被应用到系统上。这个过程需要消耗的时间取决于机器的速度和其负载。这个过程中将会对配置文件所做的变动进行合并 ── 这一部分需要用户的参与，文件可能会自动合并， 屏幕上也可能会给出一个编辑器， 用于手工完成合并操作。在处理过程中，合并成功的结果会显示给用户。 失败或被忽略的合并， 则会导致这一过程的终止。 </p>
<p>The following file could not be merged automatically: /etc/mail/freebsd.cf<br />
Press Enter to edit this file in vi and resolve the conflicts<br />
manually&#8230;</p>
<p>看到这个消息后直接进入了vi编辑器，我并不知道要如何修改这些文件，于是直接保存退出了。</p>
<p>一旦这个步骤完成后，使用如下的命令将升级后的文件安装到磁盘上。<br />
# freebsd-update install</p>
<p>内核和内核模块会首先被打上补丁。 此时必须重新启动计算机。如果您使用的是定制的内核， 请使用 nextboot 命令来将下一次用于引导系统的内核 /boot/GENERIC (它会被更新)：<br />
# nextboot -k GENERIC</p>
<p>警告: 在使用 GENERIC 内核启动之前，请确信它包含了用于引导系统所需的全部驱动程序 (如果您是在远程进行升级操作，还应确信网卡驱动也是存在的)。 特别要注意的情形是，如果之前的内核中静态联编了通常以内核模块形式存在的驱动程序， 一定要通过 /boot/loader.conf 机制来将这些模块加载到 GENERIC 内核的基础上。 此外， 您可能也希望临时取消不重要的服务、磁盘和网络挂载等等， 直到升级过程完成为止。</p>
<p>现在可以用更新后的内核引导系统了：<br />
# shutdown -r now</p>
<p>　　在系统重新上线后，需要再次运行 freebsd-update。升级的状态被保存着，这样 freebsd-update 就无需重头开始，但是会删除所有旧的共享库和目标文件。 执行如下命令继续这个阶段的升级：<br />
# freebsd-update install</p>
<p>对于次版本升级，如7.0-RELEASE升级到7.2-RELEASE，是不需要重新编译和安装第三方软件。但我出于试验的目的，还是进行了更新：</p>
<p># portupgrade -f ruby<br />
# rm /var/db/pkg/pkgdb.db<br />
# portupgrade -f ruby18-bdb<br />
# rm /var/db/pkg/pkgdb.db /usr/ports/INDEX-*.db<br />
# portupgrade -af</p>
<p>此过程不可以中断，但是我之前也没有安装screen程序，执行”nohup portupgrade -af &#038;“下班，回家后查看并无法用jobs调出，已经终止了程序，不知道是什么原因。只好再次执行”portupgrade -af“。</p>
<p>　一旦这个完成了以后，再最后一次运行 freebsd-update 来结束升级过程。<br />
# freebsd-update install</p>
<p>　”如果您临时用过 GENERIC 内核来引导系统，现在是按照通常的方法重新联编并安装新的定制内核的时候了。“</p>
<p>由于手册上没有详细说明定制内核该如何安装，因此我按手册的操作步骤来执行。</p>
<p>”重新启动机器进入新版本的 FreeBSD 升级过程至此就完成了。“</p>
<p>重启后发发现版本号还是 FreeBSD 7.0-RELEASE p7。无奈之余我从”freebsd-update -r 7.2-RELEASE upgrade“开始重新执行了一次，到”# nextboot -k GENERIC“的步骤直接使用”shutdown -r now“重启服务器，接着执行下面的步骤，这才得到了下面的结果：</p>
<p>> uname -a<br />
FreeBSD stone.com 7.2-RELEASE-p2 FreeBSD 7.2-RELEASE-p2 #0: Wed Jun 24 00:57:44 UTC 2009     root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/freebsd-minor-version-upgrades-note/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安装用于测试MySQL的Perl模块</title>
		<link>http://phpstone.com/install-perl-module-for-test-mysql/</link>
		<comments>http://phpstone.com/install-perl-module-for-test-mysql/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 02:55:08 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[webmin]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=359</guid>
		<description><![CDATA[在我使用Webmin(version 1.480)管理FreeBSD主机上的MySQL数据库服务器时出现：
“警告：您的系统未安装Perl 模块 DBI 和 DBD::mysql，Webmin将无法可靠地访问您的MySQL数据库。点击此处 立刻安装该它们。”
而“点击此处”安装时浏览器无法打开此链接，访问到MySQL手册上的相关资料在其它类Unix系统中安装MySQL，提示“如果安装了DBI和DBD::mysql  Perl模块，可以使用bin/mysql_setpermission脚本增加新账户。”
再查找“Perl安装注意事项”获取到相关的信息是：
“MySQL分发版不包含Perl支持。可以从http://search.cpan.org获得Unix需要的模块，或在Windows中使用ActiveState ppm程序。
如果你想要运行MySQL基准脚本，必须安装Perl支持。
如果你想要安装Perl支持，需要的文件能从http://search.cpan.org的CPAN (Comprehensive Perl Archive Network)获得。”
CPAN是个巨大的Perl软件收藏库，其收集大量有用的Perl模块及其相关文档。
在Unix中安装Perl模块最简单的方法是使用CPAN模块。
shell&#62; perl -MCPAN -e shell
cpan&#62; install DBI
cpan&#62; install DBD::mysql
DBD：：mysql安装运行许多测试。测试中使用默认用户名和密码尝试连接本地MySQL服务器。(默认用户名是Unix中的登录名和Windows中的ODBC。默认密码“没有密码。”) 如果你不能通过这些值连接服务器 (例如，如果你的账户有密码)，测试失败。可以使用force install DBD::mysql忽略失败的测试。
按要求操作，安装DBI时提示：
“Warning (usually harmless): &#8216;YAML&#8217; not installed, will not store persistent state”
YAML是以数据为中央的标记语言，其使用ASCII码（如连字符、问号、冒号、逗号等）构造数据块（标量值或哈希码）。和XML相同，YAML也是一种机器可识别语言，并能和多种脚本语言相结合，其中一种便是Perl。
考虑到YAML也可以当做是一个Perl模块，因此我尝试运行：
cpan&#62; install YAML
成功安装后，刷新Webmin页面，只提示 DBD::mysql 没有安装了，此时 Webmin 已经可以执行DBD::mysql模块的安装了：
正在下载 http://www.cpan.org/modules/02packages.details.txt.gz (794409 字节) ..
收到 1024 字节 (0 %)
收到 79872 字节 (10 %)
收到 159744 [...]]]></description>
			<content:encoded><![CDATA[<p>在我使用Webmin(version 1.480)管理FreeBSD主机上的MySQL数据库服务器时出现：</p>
<p>“警告：您的系统未安装Perl 模块 DBI 和 DBD::mysql，Webmin将无法可靠地访问您的MySQL数据库。点击此处 立刻安装该它们。”</p>
<p>而“点击此处”安装时浏览器无法打开此链接，访问到MySQL手册上的相关资料<a href="http://dev.mysql.com/doc/refman/5.1/zh/installing.html#installing-binary">在其它类Unix系统中安装MySQL</a>，提示“如果安装了DBI和DBD::mysql  Perl模块，可以使用bin/mysql_setpermission脚本增加新账户。”<span id="more-359"></span></p>
<p>再查找<a href="http://dev.mysql.com/doc/refman/5.1/zh/installing.html#perl-support">“Perl安装注意事项”</a>获取到相关的信息是：<br />
“MySQL分发版不包含Perl支持。可以从http://search.cpan.org获得Unix需要的模块，或在Windows中使用ActiveState ppm程序。<br />
如果你想要运行MySQL基准脚本，必须安装Perl支持。<br />
如果你想要安装Perl支持，需要的文件能从<a href="http://search.cpan.org">http://search.cpan.org</a>的CPAN (Comprehensive Perl Archive Network)获得。”</p>
<p>CPAN是个巨大的Perl软件收藏库，其收集大量有用的Perl模块及其相关文档。<br />
在Unix中安装Perl模块最简单的方法是使用CPAN模块。</p>
<p>shell&gt; perl -MCPAN -e shell<br />
cpan&gt; install DBI<br />
cpan&gt; install DBD::mysql</p>
<p>DBD：：mysql安装运行许多测试。测试中使用默认用户名和密码尝试连接本地MySQL服务器。(默认用户名是Unix中的登录名和Windows中的ODBC。默认密码“没有密码。”) 如果你不能通过这些值连接服务器 (例如，如果你的账户有密码)，测试失败。可以使用force install DBD::mysql忽略失败的测试。</p>
<p>按要求操作，安装DBI时提示：<br />
“Warning (usually harmless): &#8216;YAML&#8217; not installed, will not store persistent state”</p>
<p>YAML是以数据为中央的标记语言，其使用ASCII码（如连字符、问号、冒号、逗号等）构造数据块（标量值或哈希码）。和XML相同，YAML也是一种机器可识别语言，并能和多种脚本语言相结合，其中一种便是Perl。</p>
<p>考虑到YAML也可以当做是一个Perl模块，因此我尝试运行：<br />
cpan&gt; install YAML<br />
成功安装后，刷新Webmin页面，只提示 DBD::mysql 没有安装了，此时 Webmin 已经可以执行DBD::mysql模块的安装了：</p>
<blockquote><p>正在下载 http://www.cpan.org/modules/02packages.details.txt.gz (794409 字节) ..<br />
收到 1024 字节 (0 %)<br />
收到 79872 字节 (10 %)<br />
收到 159744 字节 (20 %)<br />
收到 238592 字节 (30 %)<br />
&#8230;</p></blockquote>
<p>但我还是采用手册上提供的方式安装 DBD::mysql</p>
<p>接着安装DBD::mysql时出现错误提示：</p>
<blockquote><p>Running make install</p>
<p>make test had returned bad status, won&#8217;t install without force<br />
Failed during this command:<br />
CAPTTOFU/DBD-mysql-4.012.tar.gz              : make_test NO<br />
&#8230;</p></blockquote>
<p>于是按要求执行：<br />
cpan&gt; force install DBD::mysql<br />
成功完成安装</p>
<p>补记：<a href="http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#mysql-benchmarks">MySQL基准套件</a></p>
<p>通过基准用户可以了解一个给定的SQL实现在哪方面执行得很好或很糟糕。这个基准是单线程的，它可以测量操作执行的最小时间。</p>
<p>要使用基准套件，必须满足下面的要求：</p>
<p>基准套件随MySQL源码分发提供。可以从http://dev.mysql.com/downloads/下载分发，或者使用当前的开发源码树</p>
<p>基准脚本用Perl编写而成，使用Perl DBI模块访问数据库服务器，因此必须安装DBI。还需要为每个待测试的服务器提供服务器专用DBD驱动程序。例如，要测试MySQL、PostgreSQL和DB2，必须安装DBD::mysql、DBD::Pg和DBD::DB2模块。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/install-perl-module-for-test-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 遍历数组的方法</title>
		<link>http://phpstone.com/the-method-of-traverse-an-array-in-php/</link>
		<comments>http://phpstone.com/the-method-of-traverse-an-array-in-php/#comments</comments>
		<pubDate>Tue, 07 Jul 2009 15:25:08 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=323</guid>
		<description><![CDATA[1. foreach()
foreach()是一个用来遍历数组中数据的最简单有效的方法。
#example1:


&#60;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);
foreach ($colors as $color) {
	echo &#34;Do you like $color? &#60;br /&#62;&#34;;
}
?&#62;

显示结果：
Do you like red?
Do you like blue?
Do you like green?
Do you like yellow? 
2. while() 
while() 通常和 list()，each()配合使用。
#example2:


&#60;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);

while(list($key,$val) = each($colors)) {
	echo &#34;Other list of $val.&#60;br /&#62;&#34;;
}
?&#62;

显示结果：
Other list of red.
Other list of blue.
Other list of green.
Other list of yellow.
3. for() 
#example3:


&#60;?php
$arr [...]]]></description>
			<content:encoded><![CDATA[<h3>1. foreach()</h3>
<p>foreach()是一个用来遍历数组中数据的最简单有效的方法。</p>
<p>#example1:</p>
<pre class="brush: php; ">

&lt;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);
foreach ($colors as $color) {
	echo &quot;Do you like $color? &lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Do you like red?<br />
Do you like blue?<br />
Do you like green?<br />
Do you like yellow? <span id="more-323"></span></p>
<h3>2. while() </h3>
<p>while() 通常和 list()，each()配合使用。</p>
<p>#example2:</p>
<pre class="brush: php; ">

&lt;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);

while(list($key,$val) = each($colors)) {
	echo &quot;Other list of $val.&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Other list of red.<br />
Other list of blue.<br />
Other list of green.<br />
Other list of yellow.</p>
<h3>3. for() </h3>
<p>#example3:</p>
<pre class="brush: php; ">

&lt;?php
$arr = array (&quot;0&quot; =&gt; &quot;zero&quot;,&quot;1&quot; =&gt; &quot;one&quot;,&quot;2&quot; =&gt; &quot;two&quot;);

for ($i = 0;$i &lt; count($arr); $i++) {
	$str = $arr[$i];
	echo &quot;the number is $str.&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>the number is zero.<br />
the number is one.<br />
the number is two.</p>
<p>========= 以下是函数介绍 ==========</p>
<h3>key()</h3>
<p>mixed key(array input_array)</p>
<p>key()函数返回input_array中位于当前指针位置的键元素。</p>
<p>#example4</p>
<pre class="brush: php; ">

&lt;?php
$capitals = array(&quot;Ohio&quot; =&gt; &quot;Columbus&quot;,&quot;Towa&quot; =&gt; &quot;Des Moines&quot;,&quot;Arizona&quot; =&gt; &quot;Phoenix&quot;);
echo &quot;&lt;p&gt;Can you name the capitals of these states?&lt;/p&gt;&quot;;
while($key = key($capitals)) {
	echo $key.&quot;&lt;br /&gt;&quot;;
	next($capitals);
//每个key()调用不会推进指针。为此要使用next()函数
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Can you name the capitals of these states?<br />
Ohio<br />
Towa<br />
Arizona</p>
<h3>reset()</h3>
<p>mixed reset(array input_array)</p>
<p>reset()函数用来将input_array的指针设置回数组的开始位置。如果需要在一个脚本中多次查看或处理同一个数组，就经常使用这个函数，另外这个函数还常用于排序结束时。</p>
<p>#example5  －  在#example1上追加代码</p>
<pre class="brush: php; ">

&lt;?php
$colors = array(&#039;red&#039;,&#039;blue&#039;,&#039;green&#039;,&#039;yellow&#039;);
foreach ($colors as $color) {
	echo &quot;Do you like $color? &lt;br /&gt;&quot;;
}

reset($colors);

while(list($key,$val) = each($colors)) {
	echo &quot;$key =&gt; $val&lt;br /&gt;&quot;;
}
?&gt;
</pre>
<p>显示结果：</p>
<p>Do you like red?<br />
Do you like blue?<br />
Do you like green?<br />
Do you like yellow?<br />
0 => red<br />
1 => blue<br />
2 => green<br />
3 => yellow</p>
<p>注意：将一个数组赋值给另一个数组时会重置原来的数组指针，因此在上例中如果我们在循环内部将 $colors 赋给了另一个变量的话将会导致无限循环。<br />
例如将 $s1 = $colors; 添加到while循环内，再次执行代码，浏览器就会无休止地显示结果。</p>
<h3>each()</h3>
<p>array each(array input_array)</p>
<p>each()函数返回输入数组当前键/值对，并将指针推进一个位置。返回的数组包含四个键，键0和key包含键名，而键1和value包含相应的数据。如果执行each()前指针位于数组末尾，则返回FALSE。</p>
<p>#example6</p>
<pre class="brush: php; ">

&lt;?php
$capitals = array(&quot;Ohio&quot; =&gt; &quot;Columbus&quot;,&quot;Towa&quot; =&gt; &quot;Des Moines&quot;,&quot;Arizona&quot; =&gt; &quot;Phoenix&quot;);

$s1 = each($capitals);
print_r($s1);
?&gt;
</pre>
<p>显示结果：</p>
<p>Array ( [1] => Columbus [value] => Columbus [0] => Ohio [key] => Ohio ) </p>
<h3>current()，next()，prev()，end()</h3>
<p>mixed current(array target_array)</p>
<p>current()函数返回位于target_array数组当前指针位置的数组值。与next()、prev()、和end()函数不同，current()不移动指针。<br />
next()函数返回紧接着放在当前数组指针的下一个位置的数组值。<br />
prev()函数返回位于当前指针的前一个位置的数组值，如果指针本来就位于数组的第一个位置，则返回FALSE。<br />
end()函数将指针移向target_array的最后一个位置，并返回最后一个元素。</p>
<p>#example7</p>
<pre class="brush: php; ">

&lt;?php
$fruits = array(&quot;apple&quot;,&quot;orange&quot;,&quot;banana&quot;);

$fruit = current($fruits);	//return &quot;apple&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;

$fruit = next($fruits);		//return &quot;orange&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;

$fruit = prev($fruits);		//return &quot;apple&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;

$fruit = end($fruits);		//return &quot;banana&quot;
echo $fruit.&quot;&lt;br /&gt;&quot;;
?&gt;
</pre>
<p>显示结果：</p>
<p>apple<br />
orange<br />
apple<br />
banana</p>
<p>=========== 下面来测试三种遍历数组的速度 ===========</p>
<p>一般情况下，遍历一个数组有三种方法，for、while、foreach。其中最简单方便的是foreach。下面先让我们来测试一下共同遍历一个有50000个下标的一维数组所耗的时间。</p>
<p>测试环境：<br />
Intel Core Due2 2GHz<br />
2GB 1067MHz DDR3<br />
Mac OS X 10.5.7<br />
Apache 2.0.59<br />
MySQL 5.0.41<br />
PHP 5.2.6</p>
<p>#example8</p>
<pre class="brush: php; ">

&lt;?php
$arr = array();
for($i = 0; $i &lt; 50000; $i++){
$arr[] = $i*rand(1000,9999);
}

function GetRunTime()
{
list($usec,$sec)=explode(&quot; &quot;,microtime());
return ((float)$usec+(float)$sec);
}
######################################
$time_start = GetRunTime(); 

for($i = 0; $i &lt; count($arr); $i++){
$str = $arr[$i];
} 

$time_end = GetRunTime();
$time_used = $time_end - $time_start;

echo &#039;Used time of for:&#039;.round($time_used, 7).&#039;(s)&lt;br /&gt;&lt;br /&gt;&#039;;
unset($str, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();

while(list($key, $val) = each($arr)){
$str = $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#039;Used time of while:&#039;.round($time_used, 7).&#039;(s)&lt;br /&gt;&lt;br /&gt;&#039;;
unset($str, $key, $val, $time_start, $time_end, $time_used);
######################################
$time_start = GetRunTime();
foreach($arr as $key =&gt; $val){
$str = $val;
}

$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo &#039;Used time of foreach:&#039;.round($time_used, 7).&#039;(s)&lt;br /&gt;&lt;br /&gt;&#039;;

?&gt;
</pre>
<p>测试结果：</p>
<p>Used time of for:0.0228429(s)</p>
<p>Used time of while:0.0544658(s)</p>
<p>Used time of foreach:0.0085628(s)</p>
<p>经过反复多次测试，结果表明，对于遍历同样一个数组，foreach速度最快，最慢的则是while。从原理上来看，foreach是对数组副本进行操作（通过拷贝数组），而while则通过移动数组内部指标进行操作，一般逻辑下认为，while应该比foreach快（因为foreach在开始执行的时候首先把数组复制进去，而while直接移动内部指标。），但结果刚刚相反。原因应该是，foreach是PHP内部实现，而while是通用的循环结构。所以，在通常应用中foreach简单，而且效率高。在PHP5下，foreach还可以遍历类的属性。</p>
<p>&#8211;&#8211; EOF &#8211;&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/the-method-of-traverse-an-array-in-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mac OS X 上的PHP开发环境</title>
		<link>http://phpstone.com/php-development-on-mac-os-x/</link>
		<comments>http://phpstone.com/php-development-on-mac-os-x/#comments</comments>
		<pubDate>Sun, 28 Jun 2009 02:43:51 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=304</guid>
		<description><![CDATA[终究还是抵挡不住Apple的诱惑，入手Macbook。在这个从未接触过的Mac OS X上，开始捣鼓我的个人开发环境设置。
一、配置终端
我一直都喜欢用终端的，FreeBSD下用Tcsh，Ubuntu和Mac OS X下也尝试下bash。先查看终端的配置信息：
$echo $SHELL
/bin/bash
$echo $PS1
\h:\W \u\$    &#8211;这个4个参数分别是hostname，工作目录，用户名和美元符$,管理员级的配置文件是/etc/bashrc。
现在先选择终端的偏好设置，我将主题改到Pro并将字体改为Monaco 14pt，这个主题基本上是黑色背景＋20％左右的透明度，视觉效果很不错。然后在shell设定标签中，选择当shell退出时关闭窗口。我选择编辑~/.bash_profile
#设定别名通常在~/.bashrc里设定，我这里只是懒得去两个文件设置了。
#让ls命令显示文件类型颜色
alias ls=&#8217;ls -G&#8217;
#让la命令显示所有文件，这个在FreeBSD的tcsh下是默认选项
alias la=&#8217;ls -a&#8217;
#默认的4个参数是很通用的，我的习惯仅是换了一下位置并且给运行目录加上方括号
PS1=&#8217;\h:\u[\w]\$&#8217;
为什么开发PHP要配置终端（console）呢？一个原因是我认为作为初学者来说，有必须多用命令行熟悉MySQL的操作，而配置好的终端能让你心情愉悦；另外一个原因是Mac OS X是在BSD的分支上发展而来，其原始的Unix血统注定了许多方面使用终端的便捷和强大。
二、 安装与配置MAPM（Apache、PHP、MySQL）
Mac OS X 上默认安装了Apache，既然大家都推荐MAMP，我也先试用一下这个集成的安装包。不考虑用MAMP Pro，3个主程序都是免费的却花钱去买一个集成包，不是很尴尬么？
默认的Mac系统偏好设置下，Web共享是没有开启的，如果已手工开启，得需要先取消。
Preferences&#8230;下为Apache设置Document Root，我这里改到~/Sites/。更改完毕后，MAMP会自动重启Apache使其生效，因此访问：http://localhost/ 就能访问到Mac设定给Web共享下默认的首页“您的网站”。因为MAMP默认的站点根目录是“/Applications/MAMP/htdocs/&#8221;更改后，任然可以用&#8221;http://localhost/MAMP/&#8221;访问其起始配置页面。

这个页面可以轻松地查看phpinfo，访问phpmyadmin和SQLitemanager。
现在要来修改MySQL的密码。MAMP默认设定的MySQL用户使用root，密码使用root。原本以为我可以直接在终端登陆，提示“command not found”。找到MySQL命令文件夹“/Applications/MAMP/Library/bin/”，修改~/.bash_profile添加环境变量：
PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin
:/Applications/MAMP/Library/bin
执行：source .bash_profile使其及时生效
#更改root口令
$mysqladmin -u root -p root password newpassword
#更改phpMyAdmin配置文件的数据库用户口令
$cd /Applications/MAMP/bin/phpMyAdmin
$vi config.inc.php
#修改如下语句段
$cfg['Servers'][$i]['password']      = 
#MAMP的起始页能直接进入phpMyAdmin，说明php文件里也配置了数据库的账号密码，
#至于这个起始页文件的位置好像不太好找，我想到肯定在httpd.conf中定义了alias,于是
$cat /Applications/MAMP/conf/apache/httpd.conf &#124; grep MAMP
Alias /MAMP &#8220;/Applications/MAMP/bin/mamp&#8221;
$cd /Applications/MAMP/bin/mamp/
$ls
$vi index.php
#定位搜索“root”字符串，同样更改密码
$link = @mysql_connect(&#8216;:/Applications/MAMP/tmp/mysql/mysql.sock&#8217;, &#8216;root&#8217;, [...]]]></description>
			<content:encoded><![CDATA[<p>终究还是抵挡不住Apple的诱惑，入手Macbook。在这个从未接触过的Mac OS X上，开始捣鼓我的个人开发环境设置。</p>
<h3>一、配置终端</h3>
<p>我一直都喜欢用终端的，FreeBSD下用Tcsh，Ubuntu和Mac OS X下也尝试下bash。先查看终端的配置信息：</p>
<blockquote><p>$echo $SHELL<br />
/bin/bash</p>
<p>$echo $PS1<br />
\h:\W \u\$    &#8211;这个4个参数分别是hostname，工作目录，用户名和美元符$,管理员级的配置文件是/etc/bashrc。</p></blockquote>
<p>现在先选择终端的偏好设置，我将主题改到Pro并将字体改为Monaco 14pt，这个主题基本上是黑色背景＋20％左右的透明度，视觉效果很不错。然后在shell设定标签中，选择当shell退出时关闭窗口。我选择编辑~/.bash_profile<span id="more-304"></span></p>
<blockquote><p>#设定别名通常在~/.bashrc里设定，我这里只是懒得去两个文件设置了。</p>
<p>#让ls命令显示文件类型颜色<br />
alias ls=&#8217;ls -G&#8217;<br />
#让la命令显示所有文件，这个在FreeBSD的tcsh下是默认选项<br />
alias la=&#8217;ls -a&#8217;</p>
<p>#默认的4个参数是很通用的，我的习惯仅是换了一下位置并且给运行目录加上方括号<br />
PS1=&#8217;\h:\u[\w]\$&#8217;</p></blockquote>
<p>为什么开发PHP要配置终端（console）呢？一个原因是我认为作为初学者来说，有必须多用命令行熟悉MySQL的操作，而配置好的终端能让你心情愉悦；另外一个原因是Mac OS X是在BSD的分支上发展而来，其原始的Unix血统注定了许多方面使用终端的便捷和强大。</p>
<h3>二、 安装与配置MAPM（Apache、PHP、MySQL）</h3>
<p>Mac OS X 上默认安装了Apache，既然大家都推荐<a href="http://www.mamp.info/en/index.html">MAMP</a>，我也先试用一下这个集成的安装包。不考虑用MAMP Pro，3个主程序都是免费的却花钱去买一个集成包，不是很尴尬么？</p>
<p>默认的Mac系统偏好设置下，Web共享是没有开启的，如果已手工开启，得需要先取消。<br />
Preferences&#8230;下为Apache设置Document Root，我这里改到~/Sites/。更改完毕后，MAMP会自动重启Apache使其生效，因此访问：http://localhost/ 就能访问到Mac设定给Web共享下默认的首页“您的网站”。因为MAMP默认的站点根目录是“/Applications/MAMP/htdocs/&#8221;更改后，任然可以用&#8221;http://localhost/MAMP/&#8221;访问其起始配置页面。</p>
<p><img src="http://phpstone.com/wp-content/uploads/2009/06/mamp.png" alt="mamp" title="mamp" width="600" height="398" class="alignnone size-full wp-image-314" /></p>
<p>这个页面可以轻松地查看phpinfo，访问phpmyadmin和SQLitemanager。</p>
<p>现在要来修改MySQL的密码。MAMP默认设定的MySQL用户使用root，密码使用root。原本以为我可以直接在终端登陆，提示“command not found”。找到MySQL命令文件夹“/Applications/MAMP/Library/bin/”，修改~/.bash_profile添加环境变量：</p>
<p>PATH=$PATH:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin<br />
:/Applications/MAMP/Library/bin</p>
<p>执行：source .bash_profile使其及时生效</p>
<blockquote><p>#更改root口令<br />
$mysqladmin -u root -p root password newpassword</p>
<p>#更改phpMyAdmin配置文件的数据库用户口令<br />
$cd /Applications/MAMP/bin/phpMyAdmin<br />
$vi config.inc.php<br />
#修改如下语句段<br />
$cfg['Servers'][$i]['password']      = </p>
<p>#MAMP的起始页能直接进入phpMyAdmin，说明php文件里也配置了数据库的账号密码，<br />
#至于这个起始页文件的位置好像不太好找，我想到肯定在httpd.conf中定义了alias,于是</p>
<p>$cat /Applications/MAMP/conf/apache/httpd.conf | grep MAMP<br />
Alias /MAMP &#8220;/Applications/MAMP/bin/mamp&#8221;</p>
<p>$cd /Applications/MAMP/bin/mamp/<br />
$ls<br />
$vi index.php<br />
#定位搜索“root”字符串，同样更改密码<br />
$link = @mysql_connect(&#8216;:/Applications/MAMP/tmp/mysql/mysql.sock&#8217;, &#8216;root&#8217;, &#8216;    root&#8217;);</p></blockquote>
<p>这样，就能以修改后的密码进入起始页和phpMyAdmin，不然做为对外开放的MAMP，弱口令就不安全了。至于SQLite的配置，我还一点都不熟悉，这里先不做描叙了。</p>
<h3>三、安装与配置Vim</h3>
<p>对于Linux用户来说，Vim再也熟悉不过了，因为这个开源软件本身的魅力，更有很多人在Windows下使用Gvim，在Mac下使用<a href="http://code.google.com/p/macvim/">Macvim</a>。这里有两位国内的Vim爱好者做了不少的研究，非常感谢他们的blog提供的技术分享：<br />
Dexter.Yy：<br />
<a href="http://www.limboy.com/2009/05/30/vim-setting/">面向前端开发者和TextMate粉丝的vim配置</a><br />
<a href="http://www.limboy.com/2009/06/07/vim-setting-more/">继续补充vim配置技巧——上次的vimrc还不够强力</a></p>
<p>gracecode.com：<br />
<a href="http://www.gracecode.com/category/496/">学习Vim编辑器</a></p>
<p>当然，还有在网上看了很多资料去了解，之前一直有在FreeBSD和Ubuntu的Console下使用Vi和Vim，到现在才清晰的知道Vim也可以是如此强大且华丽。由于针对PHP方面对Macvim的配置还不是那么熟悉，最近也在学习XHTML＋CSS方面的内容，因此配置直接采用Dexter.Yy提供的，只稍做了修改。就是在~/.vimrc中将原本的&#8221;set columns=171&#8243;,&#8221;set lines=58<br />
&#8220;,&#8221;winpos 52 42&#8243;（设置窗口宽、高和初始位置）加上仅使Macvim生效而不使Console下的Vi和Vim生效的条件语句：</p>
<blockquote><p>
if has(&#8220;gui_running&#8221;) || has (&#8220;gui_macvim&#8221;)<br />
&#8220;初始窗口宽度与高度<br />
	set columns=171<br />
	set lines=58<br />
&#8220;初值窗口位置：<br />
	winpos 52 42<br />
endif
</p></blockquote>
<p>不然在Console中使用vi和vim命令就会放大console窗口了。</p>
<p>Tips:在家目录建立.vim文件夹，在.vim下建立plugin文件夹存放插件如NERD_tree.vim，建立after下的syntax存放语法插件如css.vim，建立colors文件夹存放配色方案如yytextmate.vim</p>
<p>下面是我使用的效果：</p>
<p><a href="http://phpstone.com/wp-content/uploads/2009/06/Macvim.png"><img src="http://phpstone.com/wp-content/uploads/2009/06/Macvim-300x184.png" alt="Macvim" title="Macvim" width="300" height="184" class="alignnone size-medium wp-image-320" /></a></p>
<p>&#8211; To be continued</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-development-on-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>在Windows上使用Putty通过OpenSSH安全地登陆FreeBSD</title>
		<link>http://phpstone.com/using-putty-on-windows-to-login-freebsd-securely-via-openssh/</link>
		<comments>http://phpstone.com/using-putty-on-windows-to-login-freebsd-securely-via-openssh/#comments</comments>
		<pubDate>Sat, 16 May 2009 17:05:11 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[OpenSSH]]></category>
		<category><![CDATA[putty]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=259</guid>
		<description><![CDATA[看过delphij的实现安全的三种途径这篇文章后决定将FreeBSD服务器的SSH登录改为使用密钥认证的方式；另外也是因为看到 /var/log/messages 里满是这样的记录：
May  1 13:00:12 stone sshd[12296]: error: PAM: authentication error for illegal user admin from 220.173.60.209
May  1 13:01:24 stone sshd[12301]: error: PAM: authentication error for illegal user admin from 204.8.216.165
May  1 13:01:57 stone sshd[12307]: error: PAM: authentication error for illegal user admin from 77.243.236.32
测试环境：FreeBSD 7.0-RELEASE Putty 0.60
OpenSSH 是一组用于安全地访问远程计算机的连接工具。它可以作为 rlogin、 rsh rcp [...]]]></description>
			<content:encoded><![CDATA[<p>看过delphij的<a href="http://blog.delphij.net/archives/2009/05/post-561.html">实现安全的三种途径</a>这篇文章后决定将FreeBSD服务器的SSH登录改为使用密钥认证的方式；另外也是因为看到 /var/log/messages 里满是这样的记录：</p>
<blockquote><p>May  1 13:00:12 stone sshd[12296]: error: PAM: authentication error for illegal user admin from 220.173.60.209<br />
May  1 13:01:24 stone sshd[12301]: error: PAM: authentication error for illegal user admin from 204.8.216.165<br />
May  1 13:01:57 stone sshd[12307]: error: PAM: authentication error for illegal user admin from 77.243.236.32</p></blockquote>
<p>测试环境：FreeBSD 7.0-RELEASE Putty 0.60<span id="more-259"></span></p>
<p>OpenSSH 是一组用于安全地访问远程计算机的连接工具。它可以作为 rlogin、 rsh rcp 以及 telnet 的直接替代品使用。更进一步， 其他任何 TCP/IP 连接都可以通过 SSH 安全地进行隧道/转发。 OpenSSH 对所有的传输进行加密， 从而有效地阻止了窃听、 连接劫持，以及其他网络级的攻击。</p>
<h3>1. 确保sshd正常启用</h3>
<p>查看 /etc/rc.conf  是否存在 sshd_enable=&#8221;YES&#8221; ；如果没有添加进去并人工方式启动#/etc/rc.d/sshd start ；然后查询 22端口是否启动：#sockstat -4l</p>
<blockquote><p>root     sshd       8085  4  tcp4   *:22                  *:*</p></blockquote>
<h3>2. 配置 OpenSSH</h3>
<p>针对 OpenSSH 服务程序和客户端的系统级配置文件在 /etc/ssh 目录中。ssh_config 用于配置客户端的设定， 而 sshd_config 则用于配置服务器端。</p>
<p>现在来说通过配置 OpenSSH 使服务器接受公钥（public-key）认证。sshd_config 这个文件指定的一些默认值都是生效的，虽然这些选项被注释掉了，如果你想改变默认值的话，那就取消注释更改值或者直接添加相同的选项和值覆盖默认值的作用。</p>
<p>#vi /etc/ssh/sshd_config</p>
<blockquote><p>#默认 SSH 端口为 22 ，如果需要可以更改<br />
Port 22</p>
<p>#仅接受版本2的密钥，默认值<br />
Protocol 2</p>
<p>#绝对不要允许 root 用户直接通过网络登录，默认值<br />
PermitRootLogin no<br />
StrictModes yes<br />
MaxAuthTries 6</p>
<p>#启用公钥认证<br />
RSAAuthentication no         #默认值为 yes<br />
PubkeyAuthentication yes   #默认值</p>
<p>#不使用基于主机的认证，加强 OpenSSH 的安全性<br />
RhostsRSAAuthentication no   #默认值<br />
HostbasedAuthentication no   #默认值<br />
IgnoreUserKnownHosts yes     #默认值为 no<br />
PermitEmptyPassword no       #默认值</p>
<p>#禁用 PAM 认证即口令形式认证 默认值为yes<br />
ChallengeResponseAuthentication no</p></blockquote>
<p>编辑完成后重启 sshd 进程：`#/etc/rc.d/sshd restart` ；Linux 系统上一般是 `/etc/init.d/ssh restart`</p>
<p><strong>注意：</strong>因为是通过 SSH 口令认证的方式连接到服务器来操作，操作ChallengeResponseAuthentication 这个选项改为 no 后不能退出登陆，继续下面操作，或者也可以在成功验证了密钥后再改这个选项。以免出错导致无法远程SSH登录服务器。</p>
<h3>3. 生成公钥（public key）和私钥（private key）</h3>
<p>用需要生成密钥的用户通过 SSH 密码认证的方式登录<br />
FreeBSD 使用 ssh-keygen 来生成 DSA 或 RSA 密钥对用于验证用户的身份：</p>
<blockquote><p>% ssh-keygen -t rsa<br />
Generating public/private dsa key pair.</p>
<p>#不输入即使用默认<br />
Enter file in which to save the key (/home/user/.ssh/id_rsa):<br />
Created directory &#8216;/home/user/.ssh&#8217;.</p>
<p>#密钥的密码，需要输入并记住<br />
Enter passphrase (empty for no passphrase):<br />
Enter same passphrase again:<br />
Your identification has been saved in /home/user/.ssh/id_rsa.<br />
Your public key has been saved in /home/user/.ssh/id_rsa.pub.<br />
The key fingerprint is:<br />
bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com</p></blockquote>
<p>ssh-keygen 会生成一个包含公私钥对用于验证身份。 私钥将保存到 ~/.ssh/id_dsa 或 ~/.ssh/id_rsa， 而公钥则被存放到 ~/.ssh/id_dsa.pub 或 ~/.ssh/id_rsa.pub，文件名取决于您选择的 DSA 和 RSA 密钥类型。RSA 或者 DSA 公钥必须被存放到远程机器上的 ~/.ssh/authorized_keys 才能够使系统正确运转，因此 `#cp id_rsa.pub authorized_keys`<br />
将公钥复制一份为 authorized_keys 此文件既可。将私钥 id_rsa 复制到 Windows 客户端。</p>
<h3>4. 转换 OpenSSH 生成的私钥 id_rsa 到 putty 能使用的文件</h3>
<p>这里需要借助一个工具 puttygen.exe ，从 <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">Putty 的网站</a>上可以下载。</p>
<p>执行 puttygen.exe 后，点击 Load 按钮，打开从远程服务器下载的 id_rsa ，这时要求输入生成密钥时输入的密钥密码。</p>
<p><a href="http://phpstone.com/wp-content/uploads/2009/05/puttygen1.png"><img class="alignnone size-full wp-image-404" title="puttygen1" src="http://phpstone.com/wp-content/uploads/2009/05/puttygen1.png" alt="puttygen" width="492" height="475" /></a></p>
<p>验证成功后显示密钥文件，然后点击 Save private key，就可以将文件另存为 &#8220;id_rsa.ppk&#8221; 这样的 putty 能够使用的私钥文件了。</p>
<h3>5. 配置和使用 Putty</h3>
<p>打开 Putty 程序，点击边栏的 SSH ，在 “Preferred SSH protocol version”下选择“2 only”，表示只使用 SSH 版本2；</p>
<p>点击 SSH 下的 Auth，然后点击 Browse（浏览），打开刚才的转换好的“id_rsa.ppk”私钥；</p>
<p><a href="http://phpstone.com/wp-content/uploads/2009/05/putty1.png"><img class="alignnone size-full wp-image-405" title="putty1" src="http://phpstone.com/wp-content/uploads/2009/05/putty1.png" alt="putty_image" width="465" height="448" /></a></p>
<p>最后回到 Session ，在 Host Name 下填入服务器的IP地址或者域名，Saved Sessions 下填入这个会话的会话名称（任意你喜欢的命名），然后点Save保存就设置好了。</p>
<p>接着双击会话名称就打开了登陆界面，与采用口令认证的提示不同，然后输入生成密码时设置的密钥密码既可登陆：</p>
<blockquote><p>Login as: test<br />
Authenticating with public key &#8220;imported-openssh-key&#8221;<br />
Passphrase for key &#8220;imported-openssh-key&#8221;:<br />
Last login: Wed May 31 12:35:00 2006 from 192.168.1.10<br />
test@server:~$</p></blockquote>
<p>Tips：你应该定期地同时更改公钥和私钥。</p>
<p>Ps：如果本身是FreeBSD，Linux或者Mac OS客户端，使用密钥更加简单，只需要将id_rsa放入~/.ssh文件夹并且确保.ssh文件夹的权限为700，id_rsa的权限为600即可正常登陆。</p>
<p>参考资料：<br />
<a href="http://linux-sxs.org/networking/openssh.putty.html">Using Putty on Windows to login Linux securely via OpenSSH</a><br />
<a href="http://cnsnap.cn.freebsd.org/doc/zh_CN.GB2312/books/handbook/openssh.html">FreeBSD Handbook:OpenSSH</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/using-putty-on-windows-to-login-freebsd-securely-via-openssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让我们开始使用firefox</title>
		<link>http://phpstone.com/let-us-start-using-firefox/</link>
		<comments>http://phpstone.com/let-us-start-using-firefox/#comments</comments>
		<pubDate>Wed, 13 May 2009 07:29:20 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=219</guid>
		<description><![CDATA[目前我使用的网页浏览器有Firefox 3,Internet Explorer 8,Sarari 4 Beta,Chrome。但归结到底，最喜爱的任然是Firefox，习惯于其功能的强大（虽然安装多个插件后firefox启动缓慢，但还是忍了）。下面从Firefox强大的附加组件（Add-On）出发，谈谈本人的一些日常应用。
1. 书签工具栏
个人印象中最开始有书签工具栏的应该就是firefox:
个人非常不喜欢使用IE收藏夹，Firefox的书签工具栏的方式给人方便又不影响视觉效果，现在我们来增强书签的功能，使用Firefox的附加组件（Add-On) Xmarks 来在不同电脑间及时同步书签。
在其网站上申请好账号后，在图示的用户名密码处填入账号，并记住密码。而后每次在书签工具栏修改的收藏网址就会自动上传到xmarks.com的服务器。如果你在公司和家里都使用着Firefox再加上Xmarks这个附加组件，多台电脑使用的书签都将自动同步。当然也可以将Xmarks应用于IE 7,8和Sarari 3,4，不同于firefox的是其作为独立程序运行，而不是插件。
2. 访问被封站点
gladder是一个Firefox插件，名字被解释为Great Ladder (Ladder for Great Firewall 防火长城之梯)，目标是帮助人们跨过防火长城访问境外被查封的网站。
借助此工具，被封的blogspot.com，wordpress.com等旗下的个人网站都可以通过自动代理访问。
PS：自从GFW升级后，这个强有力的工具也陷入了困境。
3. 订阅阅读工具 Brief
Brief 是一个本地的RSS feed 订阅工具，作为firefox的扩展，用来阅读订阅在firefox书签里的RSS、Atom源。使用方法是先将站点订阅到书签工具栏的一个文件夹内，然后设置Brief的订阅标签将订阅定位到这个书签订阅的文件夹就可以了。
我认为他的优势是简单，打开这个工具本身的速度快，支持多种语言，支持搜索，书签等，还可以使用CSS自定义外观。话不多说，用用就知道了。
4. Flagfox 显示描述当前服务器位置的国旗
Flagfox 是个非常简单的插件，但是又非常有趣，能显示当前网站服务器的地理国旗和地理位置信息。
双击国旗图标就能显示服务器的地址信息并附上Google Maps位置：
============= 以下是给Web前端开发的 ============
5. Web Developer
Web Developer目前的版本到了1.18，已经支持简体中文，对于前端开发者来说是个很好的辅助工具。可以禁用JavaScript、CSS、图片等，显示网页上的表单，图片等的一些综合信息，工具栏里更是可以使用W3C的校验工具校验CSS、HTML、Feed等。
安装后默认出现在firefox的书签栏下方，不使用时可用设置不显示Web Developer这个工具栏。
6. Firebug 
对于前端开发，Firebug 绝对可以称得上是一个强有力的工具可轻松地分析整个网站的架构HTML和CSS布局，脚本调试，DOM等用过的，没有不说好的，不信的话你就用用看。
这里有Firebug的视频介绍：http://css-tricks.com/video-screencasts/15-introduction-to-firebug/
这里还有有趣的：“有时候我们糟糕的代码不想让同行轻松的使用 F12 就能一览无遗”：http://www.gracecode.com/archives/2959/
7. Html Validator
个人比较推崇Web标准，Html Validator 这个校验工具可以使你不用去W3C的网站，本地既可校验HTML代码，这个工具可以安装在Mac OS X、Linux、FreeBSD等多个平台的firefox上。
安装完此插件后，将提示设置选择算法，一般是选SGML解析器，用来校验XHTML，在firefox的右下角会有一个HTML校验器的图标，如果当前网站的HTML有问题，就会显示为X，双击图标即可以看到本页的源代码和相应的HTML错误和警告，双击错误条目能到达错误位置迅速找到错误代码。
&#8211;EOF&#8211;
]]></description>
			<content:encoded><![CDATA[<p>目前我使用的网页浏览器有Firefox 3,Internet Explorer 8,Sarari 4 Beta,Chrome。但归结到底，最喜爱的任然是Firefox，习惯于其功能的强大（虽然安装多个插件后firefox启动缓慢，但还是忍了）。下面从Firefox强大的附加组件（Add-On）出发，谈谈本人的一些日常应用。</p>
<h3>1. 书签工具栏</h3>
<p>个人印象中最开始有书签工具栏的应该就是firefox:</p>
<p>个人非常不喜欢使用IE收藏夹，Firefox的书签工具栏的方式给人方便又不影响视觉效果，现在我们来增强书签的功能，使用Firefox的附加组件（Add-On) <a href="http://www.xmarks.com/">Xmarks</a> 来在不同电脑间及时同步书签。<span id="more-219"></span></p>
<p>在其网站上申请好账号后，在图示的用户名密码处填入账号，并记住密码。而后每次在书签工具栏修改的收藏网址就会自动上传到xmarks.com的服务器。如果你在公司和家里都使用着Firefox再加上Xmarks这个附加组件，多台电脑使用的书签都将自动同步。当然也可以将Xmarks应用于IE 7,8和Sarari 3,4，不同于firefox的是其作为独立程序运行，而不是插件。</p>
<h3>2. 访问被封站点</h3>
<p><a href="http://gneheix.googlepages.com/gladder">gladder</a>是一个Firefox插件，名字被解释为Great Ladder (Ladder for Great Firewall 防火长城之梯)，目标是帮助人们跨过防火长城访问境外被查封的网站。</p>
<p>借助此工具，被封的blogspot.com，wordpress.com等旗下的个人网站都可以通过自动代理访问。</p>
<p>PS：自从GFW升级后，这个强有力的工具也陷入了困境。</p>
<h3>3. 订阅阅读工具 Brief</h3>
<p><a href="http://brief.mozdev.org/">Brief</a> 是一个本地的RSS feed 订阅工具，作为firefox的扩展，用来阅读订阅在firefox书签里的RSS、Atom源。使用方法是先将站点订阅到书签工具栏的一个文件夹内，然后设置Brief的订阅标签将订阅定位到这个书签订阅的文件夹就可以了。</p>
<p>我认为他的优势是简单，打开这个工具本身的速度快，支持多种语言，支持搜索，书签等，还可以使用CSS自定义外观。话不多说，用用就知道了。</p>
<h3>4. Flagfox 显示描述当前服务器位置的国旗</h3>
<p><a href="http://flagfox.servehttp.com/">Flagfox</a> 是个非常简单的插件，但是又非常有趣，能显示当前网站服务器的地理国旗和地理位置信息。</p>
<p>双击国旗图标就能显示服务器的地址信息并附上Google Maps位置：</p>
<p>============= 以下是给Web前端开发的 ============</p>
<h3>5. Web Developer</h3>
<p><a href="https://addons.mozilla.org/zh-CN/firefox/addon/60">Web Developer</a>目前的版本到了1.18，已经支持简体中文，对于前端开发者来说是个很好的辅助工具。可以禁用JavaScript、CSS、图片等，显示网页上的表单，图片等的一些综合信息，工具栏里更是可以使用W3C的校验工具校验CSS、HTML、Feed等。</p>
<p>安装后默认出现在firefox的书签栏下方，不使用时可用设置不显示Web Developer这个工具栏。</p>
<h3>6. Firebug </h3>
<p>对于前端开发，<a href="https://addons.mozilla.org/zh-CN/firefox/addon/1843">Firebug</a> 绝对可以称得上是一个强有力的工具可轻松地分析整个网站的架构HTML和CSS布局，脚本调试，DOM等用过的，没有不说好的，不信的话你就用用看。</p>
<p>这里有Firebug的视频介绍：<a href="http://css-tricks.com/video-screencasts/15-introduction-to-firebug/">http://css-tricks.com/video-screencasts/15-introduction-to-firebug/</a><br />
这里还有有趣的：“有时候我们糟糕的代码不想让同行轻松的使用 F12 就能一览无遗”：<a href="http://www.gracecode.com/archives/2959/">http://www.gracecode.com/archives/2959/</a></p>
<h3>7. Html Validator</h3>
<p>个人比较推崇Web标准，<a href="http://users.skynet.be/mgueury/mozilla/download.html">Html Validator</a> 这个校验工具可以使你不用去W3C的网站，本地既可校验HTML代码，这个工具可以安装在Mac OS X、Linux、FreeBSD等多个平台的firefox上。</p>
<p>安装完此插件后，将提示设置选择算法，一般是选SGML解析器，用来校验XHTML，在firefox的右下角会有一个HTML校验器的图标，如果当前网站的HTML有问题，就会显示为X，双击图标即可以看到本页的源代码和相应的HTML错误和警告，双击错误条目能到达错误位置迅速找到错误代码。</p>
<p>&#8211;EOF&#8211;</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/let-us-start-using-firefox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SEO:WordPress中使用永久连结</title>
		<link>http://phpstone.com/using-permalink-in-wordpress/</link>
		<comments>http://phpstone.com/using-permalink-in-wordpress/#comments</comments>
		<pubDate>Sat, 09 May 2009 16:09:24 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[seo]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=197</guid>
		<description><![CDATA[Permalink是Permanent Link（永久的连接）的缩写，Permalink 指向的均为一个网络日志条目 (Entry) 的独立网页。
WordPress2.7中的设置位置是Settings-&#62;Permalinks。除开默认的“http://phpstone.com/?p=123”设置格式，还有按天数和名称、按月和名称、按数字的设置格式，这些都只要点选并保存就可以了。对于Custom Structure（自定义格式），这里的内容就变得丰富了，可以按照规定的变量自己定义。
%year%
文章发表年份，四位数字，比如2009
%monthnum%
文章发表月份，比如05
%day%
文章发表日期，比如28
%hour%
文章发表小时数，比如15
%minute%
文章发表分钟数，比如43
%second%
文章发表秒数，比如33
%postname%
文章标题，中文标题不推荐使用
%post_id%
文章的id，比如423
%category%
文章的分类
%author%
文章作者
注：这些类型的变量可以在大多数的系统上正常运作，但是某些情况下仍会出现问题。
1.如果用%postname%作为唯一的因素，并且你的样式表或者wp-admin文件夹也有类似的格式的话，重写规则可能使人们无法进入的网页，最好包括一些数字数据（如文章编号或日期）来防止这种情况发生。“/%year%/%monthnum%/%day%/%postname%/”是个不错的开始。
2.如果使用Apache 2之前的版本，%category%无法在一些mod_rewrite的实施中正常工作，如果你使用Apache1.x并且没有处理这些问题的经验，最好不要在permalink结构中使用%category%
3.对于拥有多个目录的文章，只有一个目录能正常显示在permalink中，将会显示编号数字较小的那个目录显示，不过文章本身依旧可以通过所有的目录访问到。
4.如果使用自定义的URI，需要注意的是要保证每个永久连接的异样性，因此在每个虚拟网址结束时使用%post_id%或者%postname%。
多数网站使用的格式为：

/%year%/%monthnum%/%day%/%postname%/

如：
http://www.smashingmagazine.com/
http://www.techcrunch.com/
对于这种文章较多的大型英文网站来说是个不错的选择。	
象我这种比较喜欢走极端的也挺多，只使用文章名：

/%postname%/

如：
http://phpstone.com
http://css-tricks.com/
http://davidwalsh.name/
短链接自然有它的好处，象本站这种发布文章不是很多的站点来说，也是可以采用的，不过对于非英语站点来说，每篇文章的链接都是需要手工编辑的，否则默认显示为本地化语言的链接，而且非英语的WordPress后台编辑界面在添加新文章时，得先保存草稿才会显示Permalink的编辑功能。
&#8230; to be continued
]]></description>
			<content:encoded><![CDATA[<p>Permalink是Permanent Link（永久的连接）的缩写，Permalink 指向的均为一个网络日志条目 (Entry) 的独立网页。</p>
<p>WordPress2.7中的设置位置是Settings-&gt;Permalinks。除开默认的“http://phpstone.com/?p=123”设置格式，还有按天数和名称、按月和名称、按数字的设置格式，这些都只要点选并保存就可以了。对于Custom Structure（自定义格式），这里的内容就变得丰富了，可以按照规定的变量自己定义。<span id="more-197"></span></p>
<blockquote><p>%year%<br />
文章发表年份，四位数字，比如2009<br />
%monthnum%<br />
文章发表月份，比如05<br />
%day%<br />
文章发表日期，比如28<br />
%hour%<br />
文章发表小时数，比如15<br />
%minute%<br />
文章发表分钟数，比如43<br />
%second%<br />
文章发表秒数，比如33<br />
%postname%<br />
文章标题，中文标题不推荐使用<br />
%post_id%<br />
文章的id，比如423<br />
%category%<br />
文章的分类<br />
%author%<br />
文章作者</p></blockquote>
<p>注：这些类型的变量可以在大多数的系统上正常运作，但是某些情况下仍会出现问题。</p>
<p>1.如果用%postname%作为唯一的因素，并且你的样式表或者wp-admin文件夹也有类似的格式的话，重写规则可能使人们无法进入的网页，最好包括一些数字数据（如文章编号或日期）来防止这种情况发生。“/%year%/%monthnum%/%day%/%postname%/”是个不错的开始。</p>
<p>2.如果使用Apache 2之前的版本，%category%无法在一些mod_rewrite的实施中正常工作，如果你使用Apache1.x并且没有处理这些问题的经验，最好不要在permalink结构中使用%category%</p>
<p>3.对于拥有多个目录的文章，只有一个目录能正常显示在permalink中，将会显示编号数字较小的那个目录显示，不过文章本身依旧可以通过所有的目录访问到。</p>
<p>4.如果使用自定义的URI，需要注意的是要保证每个永久连接的异样性，因此在每个虚拟网址结束时使用%post_id%或者%postname%。</p>
<p>多数网站使用的格式为：</p>
<blockquote><p>
/%year%/%monthnum%/%day%/%postname%/
</p></blockquote>
<p>如：<br />
<a href="http://www.smashingmagazine.com/">http://www.smashingmagazine.com/</a><br />
<a href="http://www.techcrunch.com/">http://www.techcrunch.com/</a><br />
对于这种文章较多的大型英文网站来说是个不错的选择。	</p>
<p>象我这种比较喜欢走极端的也挺多，只使用文章名：</p>
<blockquote><p>
/%postname%/
</p></blockquote>
<p>如：<br />
<a href="http://phpstone.com">http://phpstone.com</a><br />
<a href="http://css-tricks.com/">http://css-tricks.com/</a><br />
<a href="http://davidwalsh.name/">http://davidwalsh.name/</a><br />
短链接自然有它的好处，象本站这种发布文章不是很多的站点来说，也是可以采用的，不过对于非英语站点来说，每篇文章的链接都是需要手工编辑的，否则默认显示为本地化语言的链接，而且非英语的WordPress后台编辑界面在添加新文章时，得先保存草稿才会显示Permalink的编辑功能。</p>
<p>&#8230; to be continued</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/using-permalink-in-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>更新并使用Firestats1.60</title>
		<link>http://phpstone.com/update-and-use-firestats1-60/</link>
		<comments>http://phpstone.com/update-and-use-firestats1-60/#comments</comments>
		<pubDate>Sat, 09 May 2009 16:04:16 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=194</guid>
		<description><![CDATA[Firestats是一个网站流量统计系统，基于PHP+MySQL。它是一个独立的系统，可以直接安装使用，也可以作为WordPress的一个插件（Plugin）程序来安装。
近期最新的Stable version: 1.6.0-stable
我从旧版本进行升级安装，先禁用Firestats插件，上传安装程序，用新文件覆盖旧文件，然后激活插件时出现错误提示如下：
Error installing FireStats tables: Failed to lock mutex, see This for more information :
Error message: Error locking /home/phpst0/public_html/blog/wp-content/plugins/firestats/php/db-setup.php
Firestats.cc Wiki上已经通告了问题的原因和解决办法：
大致是PHP的旧版本无法实现flock这个PHP函数的功能，因此解决办法是升级服务器的PHP程序版本；对于实在无法升级PHP服务端的情况，也提供了一种并不推荐的解决办法：
将firestats程序根目录下的“sample-conf.php”复制为“conf.php”,并编辑之将下列行的注释去掉：

define(&#039;DISABLE_MUTEX&#039;,true);

处理之后成功启用插件。
接着进入Firefox插件的设置页面进行数据库的更新即可。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://firestats.cc/" target="_blank">Firestats</a>是一个网站流量统计系统，基于PHP+MySQL。它是一个独立的系统，可以直接安装使用，也可以作为WordPress的一个插件（Plugin）程序来安装。</p>
<p>近期最新的Stable version: 1.6.0-stable</p>
<p>我从旧版本进行升级安装，先禁用Firestats插件，上传安装程序，用新文件覆盖旧文件，然后激活插件时出现错误提示如下：<span id="more-194"></span></p>
<blockquote><p>Error installing FireStats tables: Failed to lock mutex, see This for more information :<br />
Error message: Error locking /home/phpst0/public_html/blog/wp-content/plugins/firestats/php/db-setup.php</p></blockquote>
<p><a href="http://firestats.cc/wiki/Mutex" target="_blank">Firestats.cc Wiki</a>上已经通告了问题的原因和解决办法：</p>
<p>大致是PHP的旧版本无法实现flock这个PHP函数的功能，因此解决办法是升级服务器的PHP程序版本；对于实在无法升级PHP服务端的情况，也提供了一种并不推荐的解决办法：</p>
<p>将firestats程序根目录下的“sample-conf.php”复制为“conf.php”,并编辑之将下列行的注释去掉：</p>
<pre class="brush: php; ">
define(&#039;DISABLE_MUTEX&#039;,true);
</pre>
<p>处理之后成功启用插件。<br />
接着进入Firefox插件的设置页面进行数据库的更新即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/update-and-use-firestats1-60/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>遵循W3C修改引用的HTML代码实例</title>
		<link>http://phpstone.com/change-html-code-to-follow-w3c/</link>
		<comments>http://phpstone.com/change-html-code-to-follow-w3c/#comments</comments>
		<pubDate>Sat, 09 May 2009 15:57:22 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[code]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=192</guid>
		<description><![CDATA[多数的网站或者博客中，都会引用一些其他网站提供的代码，以实现一些功能或者动态的广告条目，但直接复制用来的话，会发现部分代码就会导致很多的HTML校验错误，因此有必要注意一下代码的规范性。
1.Twitter网站生成的侧边栏代码里包含如下不符合标准：


&#60;ul id=&#34;twitter_update_list&#34;&#62;&#60;/ul&#62;

话说如“ &#60;head&#62;”之类的元素必须包含一个“&#60;title&#62;”子元素，名单的 (ul, ol, dl)等必须包含一个子项(li,or dt, dd)等等，于是这样处理通过校验：


&#60;ul id=&#34;twitter_update_list&#34;&#62;&#60;li&#62;&#60;/li&#62;&#60;/ul&#62;

不过添加的标签可能会使放置位置的某些样式发生变化，需要按实际情况处理。

2.Yupoo网站自动生成的侧边栏代码包含如下不符合标准：


&#60;script type=&#34;text/javascript&#34; language=&#34;javascript&#34; src=&#34;http://www.yupoo.com/photos/gen_badge?userid=ff80808119321c500119335a860224f4&#38;amp;type=1&#38;amp;source=user&#38;amp;mysource=mytags&#38;amp;tags=sidebar&#38;amp;count=6&#38;amp;line=2&#38;amp;size=s&#38;amp;icon=hide&#38;amp;direction=horizontal&#38;amp;boxSize=400&#34;&#62;
&#60;/script&#62;

校验时提示：
&#8230;cannot generate system identifier for general entity &#8220;source&#8221;
An entity reference was found in the document, but there is no reference by that name defined. Often this is caused by misspelling the reference name, unencoded ampersands, or by leaving off the trailing semicolon (;). The [...]]]></description>
			<content:encoded><![CDATA[<p>多数的网站或者博客中，都会引用一些其他网站提供的代码，以实现一些功能或者动态的广告条目，但直接复制用来的话，会发现部分代码就会导致很多的HTML校验错误，因此有必要注意一下代码的规范性。</p>
<p>1.Twitter网站生成的侧边栏代码里包含如下不符合标准：</p>
<pre class="brush: xhtml; ">

&lt;ul id=&quot;twitter_update_list&quot;&gt;&lt;/ul&gt;
</pre>
<p>话说如“ &lt;head&gt;”之类的元素必须包含一个“&lt;title&gt;”子元素，名单的 (ul, ol, dl)等必须包含一个子项(li,or dt, dd)等等，于是这样处理通过校验：</p>
<pre class="brush: xhtml; ">

&lt;ul id=&quot;twitter_update_list&quot;&gt;&lt;li&gt;&lt;/li&gt;&lt;/ul&gt;
</pre>
<p>不过添加的标签可能会使放置位置的某些样式发生变化，需要按实际情况处理。<br />
<span id="more-192"></span><br />
2.Yupoo网站自动生成的侧边栏代码包含如下不符合标准：</p>
<pre class="brush: js; ">

&lt;script type=&quot;text/javascript&quot; language=&quot;javascript&quot; src=&quot;http://www.yupoo.com/photos/gen_badge?userid=ff80808119321c500119335a860224f4&amp;amp;type=1&amp;amp;source=user&amp;amp;mysource=mytags&amp;amp;tags=sidebar&amp;amp;count=6&amp;amp;line=2&amp;amp;size=s&amp;amp;icon=hide&amp;amp;direction=horizontal&amp;amp;boxSize=400&quot;&gt;
&lt;/script&gt;
</pre>
<p>校验时提示：</p>
<blockquote><p>&#8230;cannot generate system identifier for general entity &#8220;source&#8221;</p>
<p>An entity reference was found in the document, but there is no reference by that name defined. Often this is caused by misspelling the reference name, unencoded ampersands, or by leaving off the trailing semicolon (;). The most common cause of this error is unencoded ampersands in URLs as described by the WDG in &#8220;Ampersands in URLs&#8221;.</p>
<p>Entity references start with an ampersand (&amp;) and end with a semicolon (;). If you want to use a literal ampersand in your document you must encode it as &#8220;&amp;amp;&#8221; (even inside URLs!).</p></blockquote>
<p>一些链接脚本内的&amp;符号不符合标准，必须全部替换为&amp;amp;，这是很多外链脚本与广告脚本里常常出现的问题，必须想办法将原文件替换。</p>
<p>&#8230; to be continued.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/change-html-code-to-follow-w3c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>规划你自己的学习方法</title>
		<link>http://phpstone.com/your-own-study-method-planning/</link>
		<comments>http://phpstone.com/your-own-study-method-planning/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 06:13:58 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=187</guid>
		<description><![CDATA[在古代，从有了人才选拔制度开始，都是勤奋刻苦地预学大量的知识，然后到使用时方从大脑这个数据库中提取，因此有了才高八斗，学富五车之说。然而，以前的学习方法，现在已经不适用了，不是吗？
现在厚积薄发的概念，应该是有针对性的领域或者专业了，因为人毕竟不是计算机，任谁都无法那么快那么多地存储信息。唯有用一种集中式的学习方法，才能让自己在有限的时间里做到最快速的成长。如果说，商人，就是在最短的时间内获得最大的利益；那么，技术员就应该在最短的时间内取得最大的效率。不管是在学习的进行时，还是在工做的项目之中。而且，“效率”的概念，是说是在保证质量的同时最大限度地提高速度。
以前我一直把系统管理作为发展方向，从Linux到FreeBSD，现在却开始转向PHP开发，等于我是在毕业并且工作了两年以后开始转型，现在的我，是个PHP开发方面的新手，我所面临的学习任务，比其他人又要多的多，如果我按部就班地来学习的话，前进速度可想而知的缓慢。我不能什么都从头开始，而要了解自己，并懂得利用现有的资源。
我的现有资源是，大学里学过C语言，由于PHP与C语言有很多的共通性，我可以很快地切入，比如有些简单的代码我可以直接阅读与调试，并不需要把PHP基础知识从头到尾通读一遍，遇到不懂的细节，再去仔细研读与参考。不能一味地去阅读大量的书籍，更好的方式是针对性的去阅读好的文章，把一个方面读懂、吃透，接下来就不会那么容易忘掉了。
笔记方面，千万不能像在学习里一样什么都记了，最好的东西应该直接存入大脑，而一些基础性的东西，不太好记忆的，如php.ini相关实用的详细配置内容，可以记载在笔记本上随时翻阅强化记忆。
用懂得舍得，作为90%以上不是天才的我们，不可能学所有的东西，做一个全才，大多数的人们能做到一个专才已经不错了，我得舍弃不相关的哪怕是我很喜爱的东西，不能把时间分散了来花。
不能好面子，不能喜欢在别人面前表现自己懂得很多，因为这样会让我迷失方向，一味求多。
]]></description>
			<content:encoded><![CDATA[<p>在古代，从有了人才选拔制度开始，都是勤奋刻苦地预学大量的知识，然后到使用时方从大脑这个数据库中提取，因此有了才高八斗，学富五车之说。然而，以前的学习方法，现在已经不适用了，不是吗？</p>
<p>现在厚积薄发的概念，应该是有针对性的领域或者专业了，因为人毕竟不是计算机，任谁都无法那么快那么多地存储信息。唯有用一种集中式的学习方法，才能让自己在有限的时间里做到最快速的成长。如果说，商人，就是在最短的时间内获得最大的利益；那么，技术员就应该在最短的时间内取得最大的效率。不管是在学习的进行时，还是在工做的项目之中。而且，“效率”的概念，是说是在保证质量的同时最大限度地提高速度。<span id="more-187"></span></p>
<p>以前我一直把系统管理作为发展方向，从Linux到FreeBSD，现在却开始转向PHP开发，等于我是在毕业并且工作了两年以后开始转型，现在的我，是个PHP开发方面的新手，我所面临的学习任务，比其他人又要多的多，如果我按部就班地来学习的话，前进速度可想而知的缓慢。我不能什么都从头开始，而要了解自己，并懂得利用现有的资源。</p>
<p>我的现有资源是，大学里学过C语言，由于PHP与C语言有很多的共通性，我可以很快地切入，比如有些简单的代码我可以直接阅读与调试，并不需要把PHP基础知识从头到尾通读一遍，遇到不懂的细节，再去仔细研读与参考。不能一味地去阅读大量的书籍，更好的方式是针对性的去阅读好的文章，把一个方面读懂、吃透，接下来就不会那么容易忘掉了。</p>
<p>笔记方面，千万不能像在学习里一样什么都记了，最好的东西应该直接存入大脑，而一些基础性的东西，不太好记忆的，如php.ini相关实用的详细配置内容，可以记载在笔记本上随时翻阅强化记忆。</p>
<p>用懂得舍得，作为90%以上不是天才的我们，不可能学所有的东西，做一个全才，大多数的人们能做到一个专才已经不错了，我得舍弃不相关的哪怕是我很喜爱的东西，不能把时间分散了来花。</p>
<p>不能好面子，不能喜欢在别人面前表现自己懂得很多，因为这样会让我迷失方向，一味求多。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/your-own-study-method-planning/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FreeBSD平台上安装Webmin</title>
		<link>http://phpstone.com/install-webmin-on-freebsd/</link>
		<comments>http://phpstone.com/install-webmin-on-freebsd/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 07:24:40 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[webmin]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=126</guid>
		<description><![CDATA[声明：因本人水平有限，所写的操作方式仅作为参考，因为Webmin涉及到整个系统的操作，故无完全经验不可轻易用于生产环境中。
接触了一些国外的主机空间，多数是Linux+cPanel，cPanel/WHM的实用性，的确无法比拟，但其高昂的价格，对于我们这种小用户来说是不现实的，加之FreeBSD社区对于开源软件有着更高的热情，因此最近有兴趣尝试下Webmin。
#cd /usr/ports/sysutils/webmin/
#make install clean
After installing Webmin for the first time you should perform the following
steps as root:
* Configure Webmin by running ${LOCALBASE}/lib/webmin/setup.sh
* Add webmin_enable=&#8221;YES&#8221; to your /etc/rc.conf
* Start Webmin for the first time by running ${LOCALBASE}/etc/rc.d/webmin
The parameters requested by setup.sh may then be changed from within Webmin
itself.
===&#62; Installing rc.d startup script(s)
===&#62;   Registering installation [...]]]></description>
			<content:encoded><![CDATA[<p>声明：因本人水平有限，所写的操作方式仅作为参考，因为Webmin涉及到整个系统的操作，故无完全经验不可轻易用于生产环境中。</p>
<p>接触了一些国外的主机空间，多数是Linux+cPanel，cPanel/WHM的实用性，的确无法比拟，但其高昂的价格，对于我们这种小用户来说是不现实的，加之FreeBSD社区对于开源软件有着更高的热情，因此最近有兴趣尝试下Webmin。<span id="more-126"></span></p>
<p>#cd /usr/ports/sysutils/webmin/<br />
#make install clean</p>
<blockquote><p>After installing Webmin for the first time you should perform the following<br />
steps as root:</p>
<p>* Configure Webmin by running ${LOCALBASE}/lib/webmin/setup.sh<br />
* Add webmin_enable=&#8221;YES&#8221; to your /etc/rc.conf<br />
* Start Webmin for the first time by running ${LOCALBASE}/etc/rc.d/webmin</p>
<p>The parameters requested by setup.sh may then be changed from within Webmin<br />
itself.</p>
<p>===&gt; Installing rc.d startup script(s)<br />
===&gt;   Registering installation for webmin-1.450_2<br />
===&gt;  Cleaning for p5-Net-SSLeay-1.35<br />
===&gt;  Cleaning for p5-Authen-PAM-0.16_1<br />
===&gt;  Cleaning for webmin-1.450_2</p></blockquote>
<p>因为之前也没有搜索任何安装资料，安装完毕按着这个提示进行初始配置：<br />
#/usr/local/lib/webmin/setup.sh</p>
<p>此过程的交互式配置大致就是些用户，端口等的常规设置。</p>
<blockquote><p>Web server port (default 10000):<br />
Login name (default admin):<br />
Login password:<br />
Password again:<br />
Segmentation fault (core dumped)<br />
The Perl SSLeay library is not installed. SSL not available.</p></blockquote>
<p>Notice:最后一行是说我们没有安装Perl SSLeay库，SSL不可用，这个接下来再解决。</p>
<p>完成后添加启动脚本和启动Webmin:</p>
<blockquote><p>
#echo &#8216;webmin_enable=&#8221;YES&#8221;&#8216; >> /etc/rc.conf<br />
（注意这里有两个“>”，如果只打一个就不是追加而是替换了。）<br />
#/usr/local/etc/rc.d/webmin start
</p></blockquote>
<p>成功启动后浏览器输入http://serverip:10000即可打开登陆界面了</p>
<p>现在来解决HTTPS登陆的问题。<br />
由于p5-Net-SSLeay-1.35已经关联安装过，说明是安装此port时出现了问题，进入目录/usr/ports/security/p5-Net-SSLeay/<br />
#make deinstall<br />
#make install clean<br />
安装时提示说一些模块必须与perl，openssl保持一致，否则会出现问题。于是将perl与openssl版本更新到ports最新版本，然后安装p5-Net-SSLeay。</p>
<p>期间仍然出现许多警告，如：</p>
<blockquote><p>SSLeay.c: In function &#8216;XS_Net__SSLeay_set_app_data&#8217;:<br />
SSLeay.c:7637: warning: cast to pointer from integer of different size<br />
SSLeay.c: In function &#8216;XS_Net__SSLeay_set_mode&#8217;:<br />
SSLeay.c:7662: warning: cast to pointer from integer of different size<br />
SSLeay.c: In function &#8216;XS_Net__SSLeay_set_pref_cipher&#8217;:<br />
SSLeay.c:7687: warning: cast to pointer from integer of different size<br />
SSLeay.c: In function &#8216;XS_Net__SSLeay_set_tmp_dh&#8217;:<br />
SSLeay.c:7712: warning: cast to pointer from integer of different size<br />
SSLeay.c:7713: warning: cast to pointer from integer of different size</p></blockquote>
<p>这些问题的原因还有待知者指点。</p>
<p>完毕后登陆仍以http方式登陆webmin，然后打开到Webmin-Webmin配置-SSL加密-Enable SSL if available?点选为“是”，保存后即可使用https登陆。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/install-webmin-on-freebsd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>显卡与LCD的接口类型</title>
		<link>http://phpstone.com/video-card-and-lcd-interface/</link>
		<comments>http://phpstone.com/video-card-and-lcd-interface/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 07:21:40 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>
		<category><![CDATA[PC]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=111</guid>
		<description><![CDATA[目前的显卡和LCD（液晶显示器）接口主要有D-SUB接口和DVI接口两种；D-SUB俗称VGA（Video Graphics Adapter），而DVI（Digital Visual Interface）是数字视频接口。
在此之前很长一段时间的的显卡与显示器都基本使用15针的D-SUB接口，而现在使用24针DVI接口的显卡与液晶显示器也十分普遍，目前主流显卡与LCD上使用的DVI接口主要分为两种:
一种是DVI-D接口，只能接收数字信号，接口上只有3排8列共24个针脚，其中右上角的一个针脚为空,不兼容模拟信号。

另外一种则是DVI-I接口，可同时兼容模拟和数字信号。兼容模拟信号并不意味着模拟信号的接口D-SUB可以连接在DVI-I接口上，而是必须通过一个转换接头才能使用，一般采用这种接口的显卡都会带有相关的转换接头。

考虑到兼容性问题，目前显卡一般会采用DVD-I接口，这样可以通过转换接头连接到普通的VGA接口。而带有DVI接口的显示器一般使用DVI-D接口，因为这样的显示器一般也带有VGA接口，因此不需要带有模拟信号的DVI-I接口。
相比D-SUB,DVI的优势在于，DVI传输的是数字信号，数字图像信息不需经过任何转换，就会直接被传送到显示设备上，因此减少了数字→模拟→数字繁琐的转换过程，大大节省了时间，因此它的速度更快，有效消除拖影现象，而且使用DVI进行数据传输，信号没有衰减，色彩更纯净，更逼真。
计算机内部传输的是二进制的数字信号，使用VGA接口连接液晶显示器的话就需要先把信号通过显卡中的D/A（数字/模拟）转换器转变为R、G、B三原色信 号和行、场同步信号，这些信号通过模拟信号线传输到液晶内部还需要相应的A/D（模拟/数字）转换器将模拟信号再一次转变成数字信号才能在液晶上显示出图 像来。在上述的D/A、A/D转换和信号传输过程中不可避免会出现信号的损失和受到干扰，导致图像出现失真甚至显示错误，而DVI接口无需进行这些转换， 避免了信号的损失，使图像的清晰度和细节表现力都得到了大大提高。
PS：目前主流显卡一般带有两个24针DVI-I接口，可以轻松使用带DVI-D接口的LCD装配双显示器。
]]></description>
			<content:encoded><![CDATA[<p>目前的显卡和LCD（液晶显示器）接口主要有D-SUB接口和DVI接口两种；D-SUB俗称VGA（Video Graphics Adapter），而DVI（Digital Visual Interface）是数字视频接口。</p>
<p>在此之前很长一段时间的的显卡与显示器都基本使用15针的D-SUB接口，而现在使用24针DVI接口的显卡与液晶显示器也十分普遍，目前主流显卡与LCD上使用的DVI接口主要分为两种:<span id="more-111"></span><br />
一种是DVI-D接口，只能接收数字信号，接口上只有3排8列共24个针脚，其中右上角的一个针脚为空,不兼容模拟信号。</p>
<p style="text-align: center;"><a href="http://phpstone.com/wp-content/uploads/2009/02/dvi-d.jpg"><img class="size-full wp-image-408 aligncenter" title="dvi-d" src="http://phpstone.com/wp-content/uploads/2009/02/dvi-d.jpg" alt="dvi-d image" width="250" height="148" /></a></p>
<p>另外一种则是DVI-I接口，可同时兼容模拟和数字信号。兼容模拟信号并不意味着模拟信号的接口D-SUB可以连接在DVI-I接口上，而是必须通过一个转换接头才能使用，一般采用这种接口的显卡都会带有相关的转换接头。</p>
<p style="text-align: center;"><a href="http://phpstone.com/wp-content/uploads/2009/02/dvi-i.jpg"><img class="size-full wp-image-409 aligncenter" title="dvi-i" src="http://phpstone.com/wp-content/uploads/2009/02/dvi-i.jpg" alt="dvi-i image" width="250" height="148" /></a></p>
<p>考虑到兼容性问题，目前显卡一般会采用DVD-I接口，这样可以通过转换接头连接到普通的VGA接口。而带有DVI接口的显示器一般使用DVI-D接口，因为这样的显示器一般也带有VGA接口，因此不需要带有模拟信号的DVI-I接口。</p>
<p>相比D-SUB,DVI的优势在于，DVI传输的是数字信号，数字图像信息不需经过任何转换，就会直接被传送到显示设备上，因此减少了数字→模拟→数字繁琐的转换过程，大大节省了时间，因此它的速度更快，有效消除拖影现象，而且使用DVI进行数据传输，信号没有衰减，色彩更纯净，更逼真。</p>
<p>计算机内部传输的是二进制的数字信号，使用VGA接口连接液晶显示器的话就需要先把信号通过显卡中的D/A（数字/模拟）转换器转变为R、G、B三原色信 号和行、场同步信号，这些信号通过模拟信号线传输到液晶内部还需要相应的A/D（模拟/数字）转换器将模拟信号再一次转变成数字信号才能在液晶上显示出图 像来。在上述的D/A、A/D转换和信号传输过程中不可避免会出现信号的损失和受到干扰，导致图像出现失真甚至显示错误，而DVI接口无需进行这些转换， 避免了信号的损失，使图像的清晰度和细节表现力都得到了大大提高。</p>
<p>PS：目前主流显卡一般带有两个24针DVI-I接口，可以轻松使用带DVI-D接口的LCD装配双显示器。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/video-card-and-lcd-interface/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>适合程序员的字体</title>
		<link>http://phpstone.com/fonts-for-program/</link>
		<comments>http://phpstone.com/fonts-for-program/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 17:23:52 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>
		<category><![CDATA[fonts]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=85</guid>
		<description><![CDATA[大量写代码的人都知道，好的字体不仅能减轻眼睛的负担，还能减轻大脑的整个负担，保持心情愉悦。
在Mac OS下，因为基本都用Macvim,我觉得系统下的Monaco字体已经很合适了。下图是Monaco在Windows的Gvim下的效果：

其实已经有很多人推荐Monaco这种英文字体了，都感觉编程时这种字体比较美观舒适。但在Windows下，这种字体的中文表现较差，看起来较扁。微软专为程序员开发了一种Consolas字体，适合在写代码的时候使用，但由于Gvim不支持这种字体，于是找到了YaHei Consolas Hybrid 这种字体，中文效果也很不错。
但是在LCD显示器上为了字体表现需要开启clearType的效果。对于Windows 7，已经自带了clearType工具；而在Windows XP上，也可以下载安装clearType。
不过在Windows下的Gvim，我的英文字体还是使用Courier New字体，这个字体在Windows 和 Mac OS X下都有，但我不确定是不是同一种，中文等宽字体仍然使用YaHei Consolas Hybrid。

需要注意的是，Gvim中使用YaHei Consolas Hybrid作为guifontwide，必须是使用特定编译过的Gvim版本。
]]></description>
			<content:encoded><![CDATA[<p>大量写代码的人都知道，好的字体不仅能减轻眼睛的负担，还能减轻大脑的整个负担，保持心情愉悦。</p>
<p>在Mac OS下，因为基本都用Macvim,我觉得系统下的Monaco字体已经很合适了。下图是Monaco在Windows的Gvim下的效果：</p>
<p><a href="http://phpstone.com/wp-content/uploads/2009/02/monaco.png"><img src="http://phpstone.com/wp-content/uploads/2009/02/monaco.png" alt="monaco" title="monaco" width="472" height="269" class="alignnone size-full wp-image-412" /></a><span id="more-85"></span></p>
<p>其实已经有很多人推荐Monaco这种英文字体了，都感觉编程时这种字体比较美观舒适。但在Windows下，这种字体的中文表现较差，看起来较扁。微软专为程序员开发了一种Consolas字体，适合在写代码的时候使用，但由于Gvim不支持这种字体，于是找到了YaHei Consolas Hybrid 这种字体，中文效果也很不错。</p>
<p>但是在LCD显示器上为了字体表现需要开启clearType的效果。对于Windows 7，已经自带了clearType工具；而在Windows XP上，也可以<a href="http://www.microsoft.com/typography/ClearTypePowerToy.mspx">下载</a>安装clearType。</p>
<p>不过在Windows下的Gvim，我的英文字体还是使用Courier New字体，这个字体在Windows 和 Mac OS X下都有，但我不确定是不是同一种，中文等宽字体仍然使用YaHei Consolas Hybrid。</p>
<p><a href="http://phpstone.com/wp-content/uploads/2009/02/courier_new.png"><img src="http://phpstone.com/wp-content/uploads/2009/02/courier_new.png" alt="courier_new" title="courier_new" width="470" height="264" class="alignnone size-full wp-image-413" /></a></p>
<p>需要注意的是，Gvim中使用YaHei Consolas Hybrid作为guifontwide，必须是使用特定编译过的Gvim版本。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/fonts-for-program/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Joomla安装注意事项</title>
		<link>http://phpstone.com/joomla-install/</link>
		<comments>http://phpstone.com/joomla-install/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 03:15:21 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Joomla]]></category>

		<guid isPermaLink="false">http://blog.phpstone.com/?p=58</guid>
		<description><![CDATA[Joomla版本: Joomla_1.5.8-Stable-Full_Package
Joomla的安装与Wordpress相比还是有一些不同的，虽然目前已经非常简单，但是还是有要注意的地方。
1. 我发现configuration.php-dist不能预先复制为configuration.php,安装前一有configuration.php 这个文件存在，主页的访问链接就无法打开了。还是在安装完毕后进行操作比较合适。安装完成时会提供一段配置文件给你写入configuration.php并上传到joomla根目录
2.目前Joomla1.5已经支持安装界面的繁体中文了，注意这个只是安装时显示繁体中文，安装后的后台管理系统还是英语系的。
3. 安装第5步多一个FTP设定，这是针对Unix/Linux主机文件和文件夹权限的限制而做的，因为joomla的一些设定等要写一些目录或文件，但是多 数上次的文件和文件夹是没有写权限的，于是joomla就利用ftp的功能来实现。Joomla的建议是，最好有个单独的ftp账号供此项功能使用。相信 良好的主机空间有多个ftp账号可以提供的。
4.安装第6步的设定填入网站名称后先点安装范例资料再进行下一步。
5.安装完成后要移除整个installation目录才能继续访问。
]]></description>
			<content:encoded><![CDATA[<p>Joomla版本: Joomla_1.5.8-Stable-Full_Package</p>
<p>Joomla的安装与Wordpress相比还是有一些不同的，虽然目前已经非常简单，但是还是有要注意的地方。</p>
<p>1. 我发现configuration.php-dist不能预先复制为configuration.php,安装前一有configuration.php 这个文件存在，主页的访问链接就无法打开了。还是在安装完毕后进行操作比较合适。安装完成时会提供一段配置文件给你写入configuration.php并上传到joomla根目录<span id="more-58"></span></p>
<p>2.目前Joomla1.5已经支持安装界面的繁体中文了，注意这个只是安装时显示繁体中文，安装后的后台管理系统还是英语系的。</p>
<p>3. 安装第5步多一个FTP设定，这是针对Unix/Linux主机文件和文件夹权限的限制而做的，因为joomla的一些设定等要写一些目录或文件，但是多 数上次的文件和文件夹是没有写权限的，于是joomla就利用ftp的功能来实现。Joomla的建议是，最好有个单独的ftp账号供此项功能使用。相信 良好的主机空间有多个ftp账号可以提供的。</p>
<p>4.安装第6步的设定填入网站名称后先点安装范例资料再进行下一步。</p>
<p>5.安装完成后要移除整个installation目录才能继续访问。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/joomla-install/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD 7上安装Firefox 3</title>
		<link>http://phpstone.com/freebsd-7-firefox-3/</link>
		<comments>http://phpstone.com/freebsd-7-firefox-3/#comments</comments>
		<pubDate>Mon, 06 Oct 2008 09:15:56 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=41</guid>
		<description><![CDATA[由于使用FreeBSD7.0-p4版本,编译安装Gnome2.22时默认安装的firefox2，而firefox3已经成熟，而且在ports中已经存在，因此在查阅不到相关文档的情况下自行分析安装firefox3。
想到即使Windows下firefox3也只能全新安装，没有升级安装，因此估计freebsd下安装firefox3的方法是先删除firefox2，然后在ports中安装firefox3.
1. 更新ports tree，我这里更新后firefox版本是3.0.3
2. #cd /usr/ports/www/firefox
#make deinstall
//如果是packages方式安装的Gnome等桌面管理器，得用 #pkg_delete -f firefox
#cd /usr/ports/www/firefox3
#make install clean
我的笔记本配置很一般的，下载速度不快，加上编译安装完成也就耗时3小时左右。
www/firefox-i18n暂时只对firefox2的汉化有效，因此汉化只能依靠firefox本身的语言包来进行汉化，地址是：http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.3/linux-i686/xpi/ 假如你的版本是3.0.1，那么可以将链接的3.0.3更换为3.0.1，自然会找到响应版本的xpi文件来安装。简体中文是 zh-CN.xpi。
这样我就开始在freebsd7上体验firefox3了
]]></description>
			<content:encoded><![CDATA[<p>由于使用FreeBSD7.0-p4版本,编译安装Gnome2.22时默认安装的firefox2，而firefox3已经成熟，而且在ports中已经存在，因此在查阅不到相关文档的情况下自行分析安装firefox3。</p>
<p>想到即使Windows下firefox3也只能全新安装，没有升级安装，因此估计freebsd下安装firefox3的方法是先删除firefox2，然后在ports中安装firefox3.<span id="more-41"></span></p>
<p>1. 更新ports tree，我这里更新后firefox版本是3.0.3</p>
<p>2. #cd /usr/ports/www/firefox<br />
#make deinstall<br />
//如果是packages方式安装的Gnome等桌面管理器，得用 #pkg_delete -f firefox</p>
<p>#cd /usr/ports/www/firefox3<br />
#make install clean<br />
我的笔记本配置很一般的，下载速度不快，加上编译安装完成也就耗时3小时左右。<br />
www/firefox-i18n暂时只对firefox2的汉化有效，因此汉化只能依靠firefox本身的语言包来进行汉化，地址是：<a href="http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.3/linux-i686/xpi/" target="_blank">http://releases.mozilla.org/pub/mozilla.org/firefox/releases/3.0.3/linux-i686/xpi/</a> 假如你的版本是3.0.1，那么可以将链接的3.0.3更换为3.0.1，自然会找到响应版本的xpi文件来安装。简体中文是 zh-CN.xpi。</p>
<p>这样我就开始在freebsd7上体验firefox3了</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/freebsd-7-firefox-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD下从ports安装Gnome2.22</title>
		<link>http://phpstone.com/ports-gnome222/</link>
		<comments>http://phpstone.com/ports-gnome222/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 09:52:27 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Gnome]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=40</guid>
		<description><![CDATA[准备工作：
1.更新ports
2.重新编译内核
（一） 安装 Xorg
注：要完整地编译Xorg至少要4GB的剩余磁盘空间
ports: [x11/xorg]
#cd /usr/ports/x11/xorg
#make install clean
对于 Xorg 7.3 这个版本，可以不需要任何的配置文件就能运行：
%startx

若不能启动 X11， 也许是默认的配置文件不适合你机器的配置，这时候就需要手工配置 X11。
# Xorg -configure         //生成配置文件 xorg.conf.new
# Xorg -config xorg.conf.new    //测试配置文件是否能正常启动X11
发现并解决问题可以参考的日志文件为 /var/log/Xorg.0.log,一切准备妥当后，就可以把配置文件放到公共的目录中了：
#cp xorg.conf.new /etc/X11/xorg.conf     //这个位置也可以是/usr/local/etc/X11/xorg.conf
//Xorg 7.3_2 以后能自动配置 Intel915 系列显卡的宽屏显示问题，对于之前的版本,如果无法通过配置文件解决问题，需要用到 sysutils/915resolution
#cd /usr/ports/sysutils/915resolution
#make install clean
添加以下内容到 /etc/rc.conf
i915resolution_enable=&#8221;YES&#8221;
i915resolution_modes=&#8221;49&#8243;
i915resolution_width=&#8221;1280&#8243;
i915resolution_height=&#8221;768&#8243;
//modes可以通过运行&#8221;915resolution -l&#8221;得到的显示模式参考填写。
#/usr/local/etc/rc.d/915resolution start
（二）安装gnome2-lite
#cd /usr/ports/x11/gnome2-lite
#make install clean
//部分编译错误的处理
&#8220;Checing for DBUS&#8230; configure:error:
&#8220;Package requirements(dbus-1 &#62;=1.1.2) were not met:
&#8220;Requested &#8216;dbus-1 &#62;=1.1.2&#8242; but version of dbus is 1.0.2
&#8220;Stop [...]]]></description>
			<content:encoded><![CDATA[<p>准备工作：</p>
<p>1.更新ports</p>
<p>2.重新编译内核</p>
<p>（一） 安装 Xorg<br />
注：要完整地编译Xorg至少要4GB的剩余磁盘空间<br />
ports: [x11/xorg]<br />
#cd /usr/ports/x11/xorg<br />
#make install clean<br />
对于 Xorg 7.3 这个版本，可以不需要任何的配置文件就能运行：<br />
%startx<br />
<span id="more-40"></span><br />
若不能启动 X11， 也许是默认的配置文件不适合你机器的配置，这时候就需要手工配置 X11。<br />
# Xorg -configure         //生成配置文件 xorg.conf.new<br />
# Xorg -config xorg.conf.new    //测试配置文件是否能正常启动X11</p>
<p>发现并解决问题可以参考的日志文件为 /var/log/Xorg.0.log,一切准备妥当后，就可以把配置文件放到公共的目录中了：<br />
#cp xorg.conf.new /etc/X11/xorg.conf     //这个位置也可以是/usr/local/etc/X11/xorg.conf</p>
<p>//Xorg 7.3_2 以后能自动配置 Intel915 系列显卡的宽屏显示问题，对于之前的版本,如果无法通过配置文件解决问题，需要用到 sysutils/915resolution</p>
<p>#cd /usr/ports/sysutils/915resolution<br />
#make install clean</p>
<p>添加以下内容到 /etc/rc.conf</p>
<p>i915resolution_enable=&#8221;YES&#8221;<br />
i915resolution_modes=&#8221;49&#8243;<br />
i915resolution_width=&#8221;1280&#8243;<br />
i915resolution_height=&#8221;768&#8243;<br />
//modes可以通过运行&#8221;915resolution -l&#8221;得到的显示模式参考填写。</p>
<p>#/usr/local/etc/rc.d/915resolution start</p>
<p>（二）安装gnome2-lite</p>
<p>#cd /usr/ports/x11/gnome2-lite<br />
#make install clean</p>
<p>//部分编译错误的处理</p>
<p>&#8220;Checing for DBUS&#8230; configure:error:<br />
&#8220;Package requirements(dbus-1 &gt;=1.1.2) were not met:<br />
&#8220;Requested &#8216;dbus-1 &gt;=1.1.2&#8242; but version of dbus is 1.0.2</p>
<p>&#8220;Stop in /usr/ports/sysutils/system-tools-backends<br />
&#8220;Error code 1</p>
<p>#portupgrade dbus</p>
<p>&#8220;Package requirements(pixman &gt;=0.10.0) were not met:<br />
&#8220;Requested &#8216;pixman &gt;=0.10.0&#8242; but version of dbus is 0.9.6</p>
<p>#portupgrade pixman</p>
<p>&#8220;Package requirements(hal-storage &gt;=0.5.8_1) were not met:<br />
&#8220;Requested &#8216;hal-storage &gt;=0.5.8_1&#8242; but version of hal-storage is 0.5.8</p>
<p>#portupgrade hal         //update hal-0.5.8.20070909 to hal-0.5.11</p>
<p>同样的错误提示，更新：libvolume_id-0.75 to libvolume_id-0.77</p>
<p>&#8220;machine.h:60:error:redefinition of typed of &#8216;cpumask_t&#8217;<br />
&#8220;/usr/src/sys/sys/types.h:146:error:previous declaration of &#8216;cpumask_t&#8217; was here</p>
<p>&#8220;Stop in /usr/ports/sysutils/lsof/work/lsof-4.81A.freebsd/lib<br />
&#8220;&#8230;Error Code 1</p>
<p>重新编译系统 FreeBSD 7.0-Release，并且更新到 FreeBSD 7.0-Release-p4</p>
<p>#cd /usr/ports/sysutils/lsof<br />
#make clean<br />
#make install clean</p>
<p>然后回到 /usr/ports/x11/gnome2-lite 接着编译安装</p>
<p>&#8220;gtar-1.20_1 cannot install: unknow AUTOCONF version: 261<br />
&#8220;Stop in /usr/ports/archivers/gtar<br />
我当前的atuoconf版本为2.62</p>
<p>#cd /usr/ports/archivers/gtar<br />
#vi Makefile<br />
将配置文件制定的 AUTOCONF 版本改为262<br />
USE_AUTOTOOLS=autoconf:262:env</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/ports-gnome222/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD下Apache问题收集</title>
		<link>http://phpstone.com/apache-error/</link>
		<comments>http://phpstone.com/apache-error/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 13:26:03 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=37</guid>
		<description><![CDATA[1. No such file or directory: Failed to enable the &#8216;httpready&#8217; Accept Filter
环境：FreeBSD 6.3-Release,Apache-2.2.8
相关模块：accf_http module （the function is to buffer incoming connections until a certain complete HTTP requests arrive.)用于检测请求的数据是否完整，否则抛弃，防止客户端恶意请求。
原因：系统没有加载accf_http.ko
解决办法1：
确保src与你的当前系统对应
#cd /usr/src/sys/modules/accf_http
#make clean;make install clean
#kldload accf_http
#echo &#8216;accf_http_load=&#8221;YES&#8221;&#8216; &#62;&#62; /boot/loader.conf
]]></description>
			<content:encoded><![CDATA[<p>1. No such file or directory: Failed to enable the &#8216;httpready&#8217; Accept Filter</p>
<p>环境：FreeBSD 6.3-Release,Apache-2.2.8</p>
<p>相关模块：accf_http module （the function is to buffer incoming connections until a certain complete HTTP requests arrive.)用于检测请求的数据是否完整，否则抛弃，防止客户端恶意请求。<span id="more-37"></span></p>
<p>原因：系统没有加载accf_http.ko</p>
<p>解决办法1：</p>
<p>确保src与你的当前系统对应</p>
<p>#cd /usr/src/sys/modules/accf_http<br />
#make clean;make install clean<br />
#kldload accf_http</p>
<p>#echo &#8216;accf_http_load=&#8221;YES&#8221;&#8216; &gt;&gt; /boot/loader.conf</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/apache-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ports make 问题收集</title>
		<link>http://phpstone.com/ports-make-error-collection/</link>
		<comments>http://phpstone.com/ports-make-error-collection/#comments</comments>
		<pubDate>Sat, 05 Jul 2008 00:22:12 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[ports]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=36</guid>
		<description><![CDATA[系统版本：FreeBSD 7.0-RELEASE
1.从port安装软件出现:cannot find -lgio-2.0错误
环境：glib2.14.2
解决办法：升级glib2.14.2到glib-2.16.4
port: devel/glib20   
2.编译安装 x11/gnome2-lite 时出现：
gmake:***[libgiofam.la] Error1
我检查glib版本，发现同时存在glib-1.2.10_12和 glib-2.14.2,还有一个 dbus-glib-0.74 ,于是执行
#portupgrade glib
完成后，glib-2.14.2更新到glib-2.16.5，能成功安装完成。至于怎么有两个不同版本的glib共存，我还没有查明白。
小结：安装完FreeBSD后，在按照软件之前先检查glib版本，如果需要安装的软件需要用到新版本的glib的话先实行更新。我遇到的FreeBSD编译安装软件的问题多数是版本依赖的问题，一般按错误提示更新所依赖软件的版本能得到解决。
3.FreeBSD次版本升级（7.0-RELEASE to 7.2-RELEASE）后，更新整个软件库遇到部分库文件无法更新，具体为
”libX11-1.1.3_1,1                    <   needs updating (port has 1.2.1_1,1)
libXaw-1.0.4_1,1              [...]]]></description>
			<content:encoded><![CDATA[<h3>系统版本：FreeBSD 7.0-RELEASE</h3>
<p>1.从port安装软件出现:cannot find -lgio-2.0错误</p>
<p>环境：glib2.14.2</p>
<p>解决办法：升级glib2.14.2到glib-2.16.4</p>
<p>port: devel/glib20   <span id="more-36"></span></p>
<p>2.编译安装 x11/gnome2-lite 时出现：</p>
<p>gmake:***[libgiofam.la] Error1</p>
<p>我检查glib版本，发现同时存在glib-1.2.10_12和 glib-2.14.2,还有一个 dbus-glib-0.74 ,于是执行</p>
<p>#portupgrade glib</p>
<p>完成后，glib-2.14.2更新到glib-2.16.5，能成功安装完成。至于怎么有两个不同版本的glib共存，我还没有查明白。</p>
<p><strong>小结：</strong>安装完FreeBSD后，在按照软件之前先检查glib版本，如果需要安装的软件需要用到新版本的glib的话先实行更新。我遇到的FreeBSD编译安装软件的问题多数是版本依赖的问题，一般按错误提示更新所依赖软件的版本能得到解决。</p>
<p>3.FreeBSD次版本升级（7.0-RELEASE to 7.2-RELEASE）后，更新整个软件库遇到部分库文件无法更新，具体为</p>
<p>”libX11-1.1.3_1,1                    <   needs updating (port has 1.2.1_1,1)<br />
libXaw-1.0.4_1,1                    <   needs updating (port has 1.0.5_1,1)<br />
libXext-1.0.3,1                     <   needs updating (port has 1.0.5,1)<br />
libXi-1.1.3,1                       <   needs updating (port has 1.2.1,1)<br />
libXmu-1.0.3,1                      <   needs updating (port has 1.0.4,1)“</p>
<p>使用”portupgrade -r libX11“时关联安装”libxslt“出现故障：</p>
<p>===>  Vulnerability check disabled, database not found<br />
===>  Found saved configuration for libxslt-1.1.24_2<br />
=> libxslt-1.1.24.tar.gz doesn&#8217;t seem to exist in /usr/ports/distfiles/gnome2.<br />
=> Attempting to fetch from ftp://fr.rpmfind.net/pub/libxml/.<br />
fetch: libxslt-1.1.24.tar.gz: <strong>local modification time does not match remote</strong></p>
<p>检查匹配软件应为lixslt-1.1.24，进入/usr/ports/textproc/libxslt目录执行</p>
<p>#make distclean fetch<br />
#make install clean</p>
<p>了解到”make distclean fetch“的作用是删掉本地的distfile，执行后成功安装”libxslt-1.1.24_2“。</p>
<p>再次执行：<br />
#portupgrade -r libX11</p>
<p><strong>注意：</strong>安装这些库文件时，或者笼统地说执行”portupgrade -r“指令时，通常都会遇到自定义make.conf的问题导致编译无法正常进行，原因是自定义的make.conf某些格式错误，更正之或执行这些之前应先将自定义的make.conf内容注释掉。</p>
<h3>系统版本：FreeBSD 8.0-RELEASE</h3>
<p>更新软件：<br />
php5-extensions时，关联更新php5-filter-5.2.12，出现错误提示：</p>
<blockquote><p>/usr/ports/security/php5-filter/work/php-5.3.2/ext/filter/logical_filters.c:500: error: &#8216;pcre&#8217; undeclared (first use in this function)<br />
/usr/ports/security/php5-filter/work/php-5.3.2/ext/filter/logical_filters.c:500: error: &#8216;re&#8217; undeclared (first use in this function)<br />
/usr/ports/security/php5-filter/work/php-5.3.2/ext/filter/logical_filters.c:501: error: &#8216;pcre_extra&#8217; undeclared (first use in this function)
</p></blockquote>
<p>查看 /usr/port/UPDATING</p>
<blockquote><p>20100409:<br />
  AFFECTS: users of lang/php5<br />
  AUTHOR: ale@FreeBSD.org</p>
<p>  As of php 5.3, a few extensions were removed from or included into the core<br />
  php5 package.  Follow the steps below to update your installation.</p>
<p>  1) Delete the following packages (if installed):<br />
     &#8211; php5-dbase<br />
     &#8211; php5-ncurses<br />
     &#8211; php5-pcre<br />
     &#8211; php5-spl<br />
     &#8211; php5-ming<br />
     &#8211; php5-mhash</p>
<p>  2) Rebuild php5 and all ports depending on it.</p></blockquote>
<p>说明某些php5扩展已经默认集成到php5核心组件中，不需要另外安装。<br />
按要求执行后问题依旧存在，意识到删除php5系统提示时某些关联文件没有被删除，于是手工执行删除：</p>
<p>cd /usr/local; pkg_delete -f &#8220;php5*&#8221;; rm -r etc/php lib/php include/php</p>
<p>再次进入lang/php5<br />
先执行 make clean，再执行make WITH_BUNDLED_PCRE=&#8221;YES&#8221; install clean</p>
<p>再安装lang/php5-extension<br />
make clean &#038;&#038; make install clean<br />
问题得到解决</p>
<p>freebsd_tips: FreeBSD 更新ports后，若安装软件或执行portupgrade更新软件前，请先阅读/usr/ports/UPDATING</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/ports-make-error-collection/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>FreeBSD,Gnome安装scim-fcitx</title>
		<link>http://phpstone.com/scim-fcitx/</link>
		<comments>http://phpstone.com/scim-fcitx/#comments</comments>
		<pubDate>Mon, 05 May 2008 06:16:29 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Gnome]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=23</guid>
		<description><![CDATA[在使用FreeBSD6.3-release的时候，使用scim或者fcitx一直很头大，scim用ports安装非常顺利，可是一用起来，我几乎所有的Gnome下应用程序都轮番崩溃；而fcitx则经常出现屏幕乱码的问题，而且我又偏爱scim.倒是7.0-release出来以前，我就知道有了scim-fcitx，可是一直没有使用。到最近系统直接升级倒7.0以后开始安装。
/usr/bin/ld: cannot find -lgio-2.0
gmake: *** [libgiofam.la] Error 1
*** Error code 2
Stop in /usr/ports/devel/gio-fam-backend.
*** Error code
得到这个错误后，查询原因是要安装的gio-fam-backend-2.16.3依赖于glib-2.16.3,而我的为glib-2.14.2，于是用#portupdate -r glib 升级glib。未曾想到关联的程序包很多，我从昨晚开始整到今天凌晨4点还没有完成，然后一觉起来到公司又升级了一上午，总算完成了。
重新开始安装scim-fcitx成功，因我使用gdm作启动管理器，注销了一下当前用户直接Ctrl+Space就投入这篇文章的编辑了。
ps:第一次试用firefox的博客插件ScribeFire，看看效果如何，:)
]]></description>
			<content:encoded><![CDATA[<p>在使用FreeBSD6.3-release的时候，使用scim或者fcitx一直很头大，scim用ports安装非常顺利，可是一用起来，我几乎所有的Gnome下应用程序都轮番崩溃；而fcitx则经常出现屏幕乱码的问题，而且我又偏爱scim.倒是7.0-release出来以前，我就知道有了scim-fcitx，可是一直没有使用。到最近系统直接升级倒7.0以后开始安装。</p>
<p>/usr/bin/ld: cannot find -lgio-2.0<br />
gmake: *** [libgiofam.la] Error 1<br />
*** Error code 2</p>
<p>Stop in /usr/ports/devel/gio-fam-backend.<br />
*** Error code<span id="more-23"></span></p>
<p>得到这个错误后，查询原因是要安装的gio-fam-backend-2.16.3依赖于glib-2.16.3,而我的为glib-2.14.2，于是用#portupdate -r glib 升级glib。未曾想到关联的程序包很多，我从昨晚开始整到今天凌晨4点还没有完成，然后一觉起来到公司又升级了一上午，总算完成了。</p>
<p>重新开始安装scim-fcitx成功，因我使用gdm作启动管理器，注销了一下当前用户直接Ctrl+Space就投入这篇文章的编辑了。</p>
<p>ps:第一次试用firefox的博客插件ScribeFire，看看效果如何，:)</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/scim-fcitx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>海尔笔记本W66印象</title>
		<link>http://phpstone.com/something-about-haier-notebook-w66/</link>
		<comments>http://phpstone.com/something-about-haier-notebook-w66/#comments</comments>
		<pubDate>Sun, 20 Apr 2008 03:57:50 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=21</guid>
		<description><![CDATA[比较后悔当初没有多掏点米米买个好点的本本，前年国庆节买的这个海尔W66的本本现在用起来真难受。前阵子运行windows xp开一个网页都到了风扇呼呼地响的程度，于是重装了系统，发现安装原版windows xp的速度比刚买时至少慢上20分钟。
今天把FreeBSD6.2升级到7.0，在make buildworld阶段两次自动关机，经观察是cpu过热关机。只好暂停工作，等本本凉透了，再接着make buildworld，到凌晨1点半左右make buildworld 总算完全完成了。
然后第2天早上就开始make buildkernel的工作，这个更呛，等我配置完内核运行make buildkernel 不到30分钟，cpu处的手托已经很烫了，本本底部更烫，我赶紧暂停关机，然后做早餐吃去了。吃完早餐，开机继续，过了2个小时，总算呼呼响的风扇停止响了，出现了可爱的提示：
“Kernel build for MYKERNEL completed&#8230;”
6月8日，分析了下散热的问题，风扇明明吹的很强劲，但散热口一丝风也没有，估计是灰尘堵住了散热口。于是下决心自动动手，把笔记本拆开来。果不出所料，散热口堵的比什么都严实，清理干净后，笔记本又和新买的一样安静下来了，cpu脱手处在不运行大程序的前提下是微热的，总算不用每天用如火炉一样的本本了。
]]></description>
			<content:encoded><![CDATA[<p>比较后悔当初没有多掏点米米买个好点的本本，前年国庆节买的这个海尔W66的本本现在用起来真难受。前阵子运行windows xp开一个网页都到了风扇呼呼地响的程度，于是重装了系统，发现安装原版windows xp的速度比刚买时至少慢上20分钟。</p>
<p>今天把FreeBSD6.2升级到7.0，在make buildworld阶段两次自动关机，经观察是cpu过热关机。只好暂停工作，等本本凉透了，再接着make buildworld，到凌晨1点半左右make buildworld 总算完全完成了。<span id="more-21"></span></p>
<p>然后第2天早上就开始make buildkernel的工作，这个更呛，等我配置完内核运行make buildkernel 不到30分钟，cpu处的手托已经很烫了，本本底部更烫，我赶紧暂停关机，然后做早餐吃去了。吃完早餐，开机继续，过了2个小时，总算呼呼响的风扇停止响了，出现了可爱的提示：</p>
<p>“Kernel build for MYKERNEL completed&#8230;”</p>
<p>6月8日，分析了下散热的问题，风扇明明吹的很强劲，但散热口一丝风也没有，估计是灰尘堵住了散热口。于是下决心自动动手，把笔记本拆开来。果不出所料，散热口堵的比什么都严实，清理干净后，笔记本又和新买的一样安静下来了，cpu脱手处在不运行大程序的前提下是微热的，总算不用每天用如火炉一样的本本了。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/something-about-haier-notebook-w66/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编译内核方式升级FreeBSD</title>
		<link>http://phpstone.com/rebuiding-world-in-freebsd-62-release/</link>
		<comments>http://phpstone.com/rebuiding-world-in-freebsd-62-release/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 09:35:17 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[FreeBSD]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=19</guid>
		<description><![CDATA[1. 备份系统(FreeBSD6.3-release)
2. 使用FreeBSD6.2后系统自带的csup更新ports与src
#cp /usr/share/examples/cvsup/ports-supfile /root/ &#8212; update ports
#cp /usr/share/examples/cvsup/stable-supfile /root/ &#8212; update src
#vi /root/stable-supfile*default host=CHANGE_THIS.FreeBSD.org
(change to &#8220;cvsup.freebsd.org&#8221; or &#8220;cvsup.cn.freebsd.org&#8221;(in china))
*tag=RELENG_6
(change to RELENG_7_0; if use -current,set &#8220;tag=.&#8221;; -stable use &#8220;RELENG_7_0&#8243;;
&#8220;RELENG_7&#8243; means use the newest of 7.x)
#csup -g -L 2 ports-supfile
#csup -g -L 2 stable-supfile
3.Read /usr/src/UPDATIG(after cvsup stable-supfile),it tells if there is need to update.
4.Delete old files,in [...]]]></description>
			<content:encoded><![CDATA[<p>1. 备份系统(FreeBSD6.3-release)</p>
<p>2. 使用FreeBSD6.2后系统自带的csup更新ports与src<br />
#cp /usr/share/examples/cvsup/ports-supfile /root/ &#8212; update ports<br />
#cp /usr/share/examples/cvsup/stable-supfile /root/ &#8212; update src</p>
<p>#vi /root/stable-supfile<span id="more-19"></span>*default host=CHANGE_THIS.FreeBSD.org<br />
(change to &#8220;cvsup.freebsd.org&#8221; or &#8220;cvsup.cn.freebsd.org&#8221;(in china))<br />
*tag=RELENG_6<br />
(change to RELENG_7_0; if use -current,set &#8220;tag=.&#8221;; -stable use &#8220;RELENG_7_0&#8243;;<br />
&#8220;RELENG_7&#8243; means use the newest of 7.x)</p>
<p>#csup -g -L 2 ports-supfile<br />
#csup -g -L 2 stable-supfile</p>
<p>3.Read /usr/src/UPDATIG(after cvsup stable-supfile),it tells if there is need to update.</p>
<p>4.Delete old files,in /usr/obj<br />
(If it is the first time to complie the base system, U need&#8217;t to do this.)</p>
<p>#cd /usr/obj<br />
#chflags -R noschg *<br />
#rm -rf *<br />
If U have updated system before,or some errors hapenned, make clean some old files:<br />
#cd /usr/src<br />
#make cleardir<br />
#make cleardir<br />
You really have to do twice!!</p>
<p>5.Check /etc/make.conf<br />
eg.If U have add some update site in it,clean or comment it.</p>
<p>6.Amend the kernel configuration file.<br />
#cd /usr/src/sys/i386/conf<br />
#cp GENERIC MYKERNEL<br />
#vi MYKERNEL</p>
<p>7.Saving the Output.<br />
#script /root/buildworld.out<br />
(When finished all of the command, use:<br />
#exit)</p>
<p>8.Building new stable tree: (in /usr/src)<br />
#make buildworld<br />
(In /usr/obj thereis a new stable tree)</p>
<p>9.Build a new kernel<br />
#make buildkernel (use default kernel file)<br />
or    #make buildkernel KERNCONF=MYKERNEL</p>
<p>10.Install new kernel<br />
#make installkernel KERNCONF=MYKERNEL<br />
#reboot</p>
<p>11.Entering &#8220;singer user mode&#8221;<br />
#boot -s         (When boot)<br />
#fsck -p         (check the filesystem)<br />
#mount -u /<br />
#mount -a -t ufs<br />
#swapon -a         (open swap)</p>
<p>NOTE:If your CMOS clock is set to local time and not to GMT,you may alse need to run the following command:<br />
#adjkerntz -i</p>
<p>12.Install stable tree:<br />
#mergemaster -p<br />
#make installworld</p>
<p>13.Amending or updating the configuration file in /etc<br />
#mergemaster<br />
#shudown -r now</p>
<p>Now,accomplish.</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/rebuiding-world-in-freebsd-62-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>时间函数问题-设置PHP5的时区</title>
		<link>http://phpstone.com/php-time-function-php5-timezone/</link>
		<comments>http://phpstone.com/php-time-function-php5-timezone/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 06:49:56 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=16</guid>
		<description><![CDATA[

&#60;?php
$currtime=time();
$currtimestr=strftime (&#34;%H:%M:%S &#34;,$currtime);
echo &#34;The time is : &#34;.$currtimestr;
print (strftime(&#34;%A&#34;));
?&#62;

在PHP5中，不能和PHP4一样使用date() , time() 等时间函数正确地取得本地时间, 不同的代码在不同的OS里会产生不同的结果。解决办法,为PHP5设置统一的时区：
编辑 &#8220;php.ini&#8221;，找到以下行修改:
date.timezone = PRC         //PRC代表中华人民共和国
]]></description>
			<content:encoded><![CDATA[<pre class="brush: php; ">

&lt;?php
$currtime=time();
$currtimestr=strftime (&quot;%H:%M:%S &quot;,$currtime);
echo &quot;The time is : &quot;.$currtimestr;
print (strftime(&quot;%A&quot;));
?&gt;
</pre>
<p>在PHP5中，不能和PHP4一样使用date() , time() 等时间函数正确地取得本地时间, 不同的代码在不同的OS里会产生不同的结果。解决办法,为PHP5设置统一的时区：</p>
<p>编辑 &#8220;php.ini&#8221;，找到以下行修改:</p>
<blockquote><p>date.timezone = PRC         //PRC代表中华人民共和国</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/php-time-function-php5-timezone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UTF-8 With BOM</title>
		<link>http://phpstone.com/utf-8-with-bom/</link>
		<comments>http://phpstone.com/utf-8-with-bom/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 05:32:39 +0000</pubDate>
		<dc:creator>frePerl</dc:creator>
				<category><![CDATA[网络管理]]></category>

		<guid isPermaLink="false">http://phpstone.com/?p=15</guid>
		<description><![CDATA[当我使用文本编辑器“Notepad++”时, 我发现一个“以UTF-8无BOM格式编码”的方式，如果Web页面的源文件以 UTF-8 格式编码的话，在校验 xhtml文件时会出来一条如下警告：
Byte-Order Mark found in UTF-8 File.
The Unicode Byte-Order Mark (BOM) in UTF-8 encoded files is known to cause problems for some text editors and older browsers. You may want to consider avoiding its use until it is better supported.
意思是说使用utf-8的格式编码会在一些编辑器和老的浏览器上产生问题，最好是考虑避免这些问题，除非它们得到更好的支持。在这里我得到了更多的信息 http://unicode.org ：

UTF-8 is most common on the web. UTF-16 is used by [...]]]></description>
			<content:encoded><![CDATA[<p>当我使用文本编辑器“Notepad++”时, 我发现一个“以UTF-8无BOM格式编码”的方式，如果Web页面的源文件以 UTF-8 格式编码的话，在校验 xhtml文件时会出来一条如下警告：</p>
<p>Byte-Order Mark found in UTF-8 File.</p>
<blockquote><p>The Unicode Byte-Order Mark (BOM) in UTF-8 encoded files is known to cause problems for some text editors and older browsers. You may want to consider avoiding its use until it is better supported.</p></blockquote>
<p>意思是说使用utf-8的格式编码会在一些编辑器和老的浏览器上产生问题，最好是考虑避免这些问题，除非它们得到更好的支持。在这里我得到了更多的信息 <a title="http://unicode.org" href="http://unicode.org/faq/utf_bom.html#5" target="_blank">http://unicode.org</a> ：</p>
<p><span id="more-15"></span></p>
<blockquote><p>UTF-8 is most common on the web. UTF-16 is used by Java and Windows. UTF-32  		is  		used by various Unix systems. The conversions between all of them are  		algorithmically based, fast and lossless. This makes it easy to support  		data input or output in multiple formats, while using a particular UTF  		for internal storage or processing.</p>
<p><strong>What is a BOM?</strong></p>
<p>A <em>byte order mark </em>(BOM) consists of the character          code U+FEFF at the beginning of a data stream, where it can be used           as a signature defining the byte order and encoding form, primarily of unmarked plaintext          files. Under some higher level protocols, use of a BOM may be mandatory  		(or prohibited) in the Unicode data stream defined in that          protocol.</p>
<p><strong>Where is a BOM useful?</strong></p>
<p>A BOM is useful at the beginning of files that are typed as            text, but for which it is not known whether they are in big or little endian format—it  		can also serve as a hint indicating that the file is in Unicode, as  		opposed to in a legacy encoding and furthermore, it act as a signature  		for the specific encoding form used .</p>
<p>A BOM can be used as a signature no matter how the          Unicode text is transformed: UTF-16, UTF-8, UTF-7, etc. The exact bytes          comprising the BOM will be whatever the Unicode character FEFF is          converted into by that transformation format. In that form, the BOM          serves to indicate both that it is a Unicode file, and which of the          formats it is in.</p></blockquote>
<p>解除这个警告的方法仅仅是将Web源文件以UTF-8无BOM格式编码即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://phpstone.com/utf-8-with-bom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
