<?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>shooting's sky</title>
	<atom:link href="http://anfirst.cn/feed" rel="self" type="application/rss+xml" />
	<link>http://anfirst.cn</link>
	<description>专心每一天</description>
	<lastBuildDate>Wed, 30 Jun 2010 13:20:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>一整套应用程序图标f3 Silk Icons 下载</title>
		<link>http://anfirst.cn/archives/967</link>
		<comments>http://anfirst.cn/archives/967#comments</comments>
		<pubDate>Wed, 30 Jun 2010 13:20:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[经典网摘]]></category>
		<category><![CDATA[前台开发]]></category>
		<category><![CDATA[资源下载]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=967</guid>
		<description><![CDATA[这是由famfamfam提供 的一套完整的应用程序操作图标库。
该作品基于 Creative Commons  Attribution 2.5 License 协议发布.
图标库的下载地址为:图 标库下载
不会ps的朋友有福了
]]></description>
			<content:encoded><![CDATA[<p>这是由<a href="http://www.famfamfam.com/lab/icons/silk/">famfamfam</a>提供 的一套完整的应用程序操作图标库。</p>
<p>该作品基于 <a href="http://creativecommons.org/licenses/by/2.5/">Creative Commons  Attribution 2.5 License</a> 协议发布.</p>
<p>图标库的下载地址为:<a href="http://www.famfamfam.com/lab/icons/silk/famfamfam_silk_icons_v013.zip">图 标库下载</a></p>
<p>不会ps的朋友有福了</p>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/967/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自动开设虚拟主机的bash脚本</title>
		<link>http://anfirst.cn/archives/964</link>
		<comments>http://anfirst.cn/archives/964#comments</comments>
		<pubDate>Wed, 02 Jun 2010 09:01:13 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[编程工具]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=964</guid>
		<description><![CDATA[脚本很简单,功能是，自动增加一个以输入域名命名的www根目录,自动生成一个ftp用户，自动创建一个mysql数据库，自动创建一个mysql用户
#!/bin/bash
#输入要增加的域名
echo &#8220;Input The Domain&#8221;
read
domain=$REPLY
#这里输入ftp密码
echo &#8220;Input The Password&#8221;
read
ftp_password=$REPLY
#mysql的超级用户名和密码
mysql_root=&#8221;root&#8221;
mysql_root_pass=&#8221;abcdefg&#8221;
database_name=${domain//./_}
database_user=${domain//./_}
vhost_file=&#8221;${domain}.conf&#8221;
echo &#8220;Input Mysql Password for Database ${database_name}&#8221;
read
database_password=$REPLY
cd /www/wwwroot/
mkdir $domain
chown daemon:daemon $domain
chmod 700 $domain
#生成虚拟机的配置文件
cd /usr/local/apache2/conf/vhost
cp 51rego.com.conf $vhost_file
sed &#8220;s/51rego.com/$domain/ig&#8221; $vhost_file &#62;temp
cat temp&#62;$vhost_file
#增加ftp虚拟用户和密码
cd /www/users/conf
echo $domain&#62;&#62;vusers.txt
echo $ftp_password&#62;&#62;vusers.txt
db_load -T -t hash -f vusers.txt /etc/vsftpd_login.db
#增加一个ftp账户
cd /etc/vsftpd_user_conf
cp 51rego.com $domain
sed &#8220;s/51rego.com/$domain/ig&#8221; $domain &#62;temp
cat temp&#62;$domain
#创建mysql数据库
mysql -u${mysql_root} -p${mysql_root_pass} -e &#8220;create database ${database_name}&#8221;
#创建mysql用户和密码
mysql -u${mysql_root} -p${mysql_root_pass} -e &#8220;grant all privileges on [...]]]></description>
			<content:encoded><![CDATA[<p>脚本很简单,功能是，自动增加一个以输入域名命名的www根目录,自动生成一个ftp用户，自动创建一个mysql数据库，自动创建一个mysql用户</p>
<p>#!/bin/bash</p>
<p>#输入要增加的域名<br />
echo &#8220;Input The Domain&#8221;<br />
read<br />
domain=$REPLY</p>
<p>#这里输入ftp密码<br />
echo &#8220;Input The Password&#8221;<br />
read<br />
ftp_password=$REPLY</p>
<p>#mysql的超级用户名和密码<br />
mysql_root=&#8221;root&#8221;<br />
mysql_root_pass=&#8221;abcdefg&#8221;<br />
database_name=${domain//./_}<br />
database_user=${domain//./_}</p>
<p>vhost_file=&#8221;${domain}.conf&#8221;<br />
echo &#8220;Input Mysql Password for Database ${database_name}&#8221;<br />
read<br />
database_password=$REPLY<br />
cd /www/wwwroot/<br />
mkdir $domain<br />
chown daemon:daemon $domain<br />
chmod 700 $domain</p>
<p>#生成虚拟机的配置文件<br />
cd /usr/local/apache2/conf/vhost<br />
cp 51rego.com.conf $vhost_file<br />
sed &#8220;s/51rego.com/$domain/ig&#8221; $vhost_file &gt;temp<br />
cat temp&gt;$vhost_file<br />
#增加ftp虚拟用户和密码<br />
cd /www/users/conf<br />
echo $domain&gt;&gt;vusers.txt<br />
echo $ftp_password&gt;&gt;vusers.txt<br />
db_load -T -t hash -f vusers.txt /etc/vsftpd_login.db<br />
#增加一个ftp账户<br />
cd /etc/vsftpd_user_conf<br />
cp 51rego.com $domain<br />
sed &#8220;s/51rego.com/$domain/ig&#8221; $domain &gt;temp<br />
cat temp&gt;$domain</p>
<p>#创建mysql数据库<br />
mysql -u${mysql_root} -p${mysql_root_pass} -e &#8220;create database ${database_name}&#8221;</p>
<p>#创建mysql用户和密码<br />
mysql -u${mysql_root} -p${mysql_root_pass} -e &#8220;grant all privileges on ${database_name}.* to ${database_user}@localhost identified by &#8216;${database_password}&#8217;&#8221;<br />
echo &#8220;Ftp User Name: ${domain}&#8221;<br />
echo &#8220;Ftp Password: ${ftp_password}&#8221;<br />
echo &#8220;Mysql database: ${database_name}&#8221;<br />
echo &#8220;Mysql user: ${database_user}&#8221;<br />
echo &#8220;Mysql password: ${database_password}&#8221;<br />
echo &#8220;success! restart httpd&#8230;&#8221;</p>
<p>#重启httpd<br />
/usr/local/apache2/bin/httpd -S<br />
service httpd graceful<br />
exit</p>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/964/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>不得不说的360金山门</title>
		<link>http://anfirst.cn/archives/962</link>
		<comments>http://anfirst.cn/archives/962#comments</comments>
		<pubDate>Sun, 30 May 2010 00:38:32 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[生活点滴]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[评论]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=962</guid>
		<description><![CDATA[周鸿祎与金山之间的口水战还是战的不可开交，透过他们的周的口水炮弹，再次感受到了他的伟大人格魅力，赤裸裸的报复性的语言让我看清了他疯狂的报复心态，我感觉以前&#8221;迫害过&#8221;3721 的人是不是都头皮麻了一下，自认为一个人格端正的人是不会这样的，即便不相信金山网盾，但我宁愿相信可牛，和遨游，正式他们让我毫无犹豫的立刻卸载了360，这确实很恐怖，但一个软件控制了绝大部分电脑的时候，就像一个重磅炸弹，你不知道它什么时候就在你的电脑里爆炸。想当年3721在很多善良的国人心目中确实算是一个非常不错的软件，想上某一个网站的时候直接输入中文就行了，这是多么好的一款软件啊，为中国互联网也做出了不小的贡献，可是当它的狰狞面目露出来的时候，人们才恍然大悟，原来这款软件的背后竟是如此的肮脏龌龊不可告人。。。
顺便说句，最近电脑中了木马，经常刷新桌面时弹出网页广告窗口，用360杀了N遍，无效，在一个网友的推荐下用了下window的清理助手，成功解决，出现这种情况的网友不妨试试。
]]></description>
			<content:encoded><![CDATA[<p>周鸿祎与金山之间的口水战还是战的不可开交，透过他们的周的口水炮弹，再次感受到了他的伟大人格魅力，赤裸裸的报复性的语言让我看清了他疯狂的报复心态，我感觉以前&#8221;迫害过&#8221;3721 的人是不是都头皮麻了一下，自认为一个人格端正的人是不会这样的，即便不相信金山网盾，但我宁愿相信可牛，和遨游，正式他们让我毫无犹豫的立刻卸载了360，这确实很恐怖，但一个软件控制了绝大部分电脑的时候，就像一个重磅炸弹，你不知道它什么时候就在你的电脑里爆炸。想当年3721在很多善良的国人心目中确实算是一个非常不错的软件，想上某一个网站的时候直接输入中文就行了，这是多么好的一款软件啊，为中国互联网也做出了不小的贡献，可是当它的狰狞面目露出来的时候，人们才恍然大悟，原来这款软件的背后竟是如此的肮脏龌龊不可告人。。。</p>
<p>顺便说句，最近电脑中了木马，经常刷新桌面时弹出网页广告窗口，用360杀了N遍，无效，在一个网友的推荐下用了下window的清理助手，成功解决，出现这种情况的网友不妨试试。</p>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/962/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript 获取滚动条高度+常用js页面宽度与高度[转]</title>
		<link>http://anfirst.cn/archives/957</link>
		<comments>http://anfirst.cn/archives/957#comments</comments>
		<pubDate>Thu, 20 May 2010 08:27:47 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=957</guid>
		<description><![CDATA[/********************
* 取窗口滚动条高度
******************/
function getScrollTop()
{
var scrollTop=0;
if(document.documentElement&#38;&#38;document.documentElement.scrollTop)
{
scrollTop=document.documentElement.scrollTop;
}
else if(document.body)
{
scrollTop=document.body.scrollTop;
}
return scrollTop;
}
/********************
* 取窗口可视范围的高度
*******************/
function getClientHeight()
{
var clientHeight=0;
if(document.body.clientHeight&#38;&#38;document.documentElement.clientHeight)
{
var clientHeight = (document.body.clientHeight&#60;document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;
}
else
{
var clientHeight = (document.body.clientHeight&#62;document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;
}
return clientHeight;
}
/********************
* 取文档内容实际高度
*******************/
function getScrollHeight()
{
return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);
}
////////////////////////////////////////////////////
在IE中：
document.body.clientWidth ==&#62; BODY对象宽度
document.body.clientHeight ==&#62; BODY对象高度
document.documentElement.clientWidth ==&#62; 可见区域宽度
document.documentElement.clientHeight ==&#62; 可见区域高度
在FireFox中：
document.body.clientWidth ==&#62; BODY对象宽度
document.body.clientHeight ==&#62; BODY对象高度
document.documentElement.clientWidth ==&#62; 可见区域宽度
document.documentElement.clientHeight ==&#62; 可见区域高度
?
在 Opera中：
document.body.clientWidth ==&#62; 可见区域宽度
document.body.clientHeight ==&#62; 可见区域高度
document.documentElement.clientWidth ==&#62; 页面对象宽度（即BODY对象宽度加上Margin宽）
document.documentElement.clientHeight ==&#62; 页面对象高度（即BODY对象高度加上Margin高）
而如果没有定义W3C的标准，则
IE为：
document.documentElement.clientWidth ==&#62; 0
document.documentElement.clientHeight ==&#62; 0
FireFox为：
document.documentElement.clientWidth ==&#62; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&#62; 页面对象高度（即BODY对象高度加上Margin高）
Opera为：
document.documentElement.clientWidth ==&#62; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>/********************<br />
* 取窗口滚动条高度<br />
******************/<br />
function getScrollTop()<br />
{<br />
var scrollTop=0;<br />
if(document.documentElement&amp;&amp;document.documentElement.scrollTop)<br />
{<br />
scrollTop=document.documentElement.scrollTop;<br />
}<br />
else if(document.body)<br />
{<br />
scrollTop=document.body.scrollTop;<br />
}<br />
return scrollTop;<br />
}</p>
<p>/********************<br />
* 取窗口可视范围的高度<br />
*******************/<br />
function getClientHeight()<br />
{<br />
var clientHeight=0;<br />
if(document.body.clientHeight&amp;&amp;document.documentElement.clientHeight)<br />
{<br />
var clientHeight = (document.body.clientHeight&lt;document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;<br />
}<br />
else<br />
{<br />
var clientHeight = (document.body.clientHeight&gt;document.documentElement.clientHeight)?document.body.clientHeight:document.documentElement.clientHeight;<br />
}<br />
return clientHeight;<br />
}</p>
<p>/********************<br />
* 取文档内容实际高度<br />
*******************/<br />
function getScrollHeight()<br />
{<br />
return Math.max(document.body.scrollHeight,document.documentElement.scrollHeight);<br />
}</p>
<p>////////////////////////////////////////////////////</p>
<p>在IE中：<br />
document.body.clientWidth ==&gt; BODY对象宽度<br />
document.body.clientHeight ==&gt; BODY对象高度<br />
document.documentElement.clientWidth ==&gt; 可见区域宽度<br />
document.documentElement.clientHeight ==&gt; 可见区域高度<br />
在FireFox中：<br />
document.body.clientWidth ==&gt; BODY对象宽度<br />
document.body.clientHeight ==&gt; BODY对象高度<br />
document.documentElement.clientWidth ==&gt; 可见区域宽度<br />
document.documentElement.clientHeight ==&gt; 可见区域高度<br />
?<br />
在 Opera中：<br />
document.body.clientWidth ==&gt; 可见区域宽度<br />
document.body.clientHeight ==&gt; 可见区域高度<br />
document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）<br />
document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高）<br />
而如果没有定义W3C的标准，则<br />
IE为：<br />
document.documentElement.clientWidth ==&gt; 0<br />
document.documentElement.clientHeight ==&gt; 0<br />
FireFox为：<br />
document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高）<br />
Opera为：<br />
document.documentElement.clientWidth ==&gt; 页面对象宽度（即BODY对象宽度加上Margin宽）document.documentElement.clientHeight ==&gt; 页面对象高度（即BODY对象高度加上Margin高）<br />
真是一件麻烦事情，其实就开发来看，宁可少一些对象和方法，不使用最新的标 准要方便许多啊。</p>
<p>//////////////////////////////////////////////////////////////////////////////////////</p>
<p>网页可见区域宽:<br />
document.body.clientWidth</p>
<p>网页可见区域高:<br />
document.body.clientHeight</p>
<p>网页可见区域宽:<br />
document.body.offsetWidth(包 括边线的宽)</p>
<p>网页可见区域高:<br />
document.body.offsetHeight(包括边线的宽)</p>
<p>网页 正文全文宽:<br />
document.body.scrollWidth</p>
<p>网页正文全文高:<br />
document.body.scrollHeight</p>
<p>网 页被卷去的高:<br />
document.body.scrollTop</p>
<p>网页被卷去的左:<br />
document.body.scrollLeft</p>
<p>网 页正文部分上:<br />
window.screenTop</p>
<p>网页正文部分左:<br />
window.screenLeft</p>
<p>屏 幕分辨率的高:<br />
window.screen.height</p>
<p>屏幕分辨率的宽:<br />
window.screen.width</p>
<p>屏 幕可用工作区高度:<br />
window.screen.availHeight</p>
<p>屏幕可用工作区宽度:<br />
window.screen.availWidth</p>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/957/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>再写关于无限分类</title>
		<link>http://anfirst.cn/archives/950</link>
		<comments>http://anfirst.cn/archives/950#comments</comments>
		<pubDate>Tue, 06 Apr 2010 13:07:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[无限分类]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=950</guid>
		<description><![CDATA[数据表里的结构还是非常简单
三个字段id , parentid ,name
算法也很简单递归，以前用递归的时候很傻，应该说极傻，因为在递归中通过查询数据表来获得子类的所有，最近开窍了，想到了一个地球人都能想得到的方法，下面是代码，一个class
&#60;?php
class Tree {
 /**
  * 从数据库查询出的所有分类信息
  * @var array
  */
 var $arr;
/**
 * 如下格式
 *  var $arr = array(
 1 =&#62; array(&#8216;id&#8217;=&#62;&#8217;1&#8242;,&#8217;parentid&#8217;=&#62;0,&#8217;name&#8217;=&#62;&#8217;一级栏目一&#8217;),
 2 =&#62; array(&#8216;id&#8217;=&#62;&#8217;2&#8242;,&#8217;parentid&#8217;=&#62;0,&#8217;name&#8217;=&#62;&#8217;一级栏目二&#8217;),
 3 =&#62; array(&#8216;id&#8217;=&#62;&#8217;3&#8242;,&#8217;parentid&#8217;=&#62;1,&#8217;name&#8217;=&#62;&#8217;二级栏目一&#8217;),
 );*/
 /**
  * 输出结构
  * @var array
  */
 var $tree = array();
 /**
  * 树形递归的深度
  * @var int
  */
 var $deep = 1;
 /**
  * 生成树形的修饰符号
  * @var array
  */
 var $icon = array(&#8216;│&#8217;,'├&#8217;,'└&#8217;);
 /**
  * 生成指定id的下级树形结构
  * @param [...]]]></description>
			<content:encoded><![CDATA[<p>数据表里的结构还是非常简单<br />
三个字段id , parentid ,name<br />
算法也很简单递归，以前用递归的时候很傻，应该说极傻，因为在递归中通过查询数据表来获得子类的所有，最近开窍了，想到了一个地球人都能想得到的方法，下面是代码，一个class</p>
<blockquote><p>&lt;?php<br />
class Tree {</p>
<p> /**<br />
  * 从数据库查询出的所有分类信息<br />
  * @var array<br />
  */<br />
 var $arr;<br />
/**<br />
 * 如下格式<br />
 *  var $arr = array(<br />
 1 =&gt; array(&#8216;id&#8217;=&gt;&#8217;1&#8242;,&#8217;parentid&#8217;=&gt;0,&#8217;name&#8217;=&gt;&#8217;一级栏目一&#8217;),<br />
 2 =&gt; array(&#8216;id&#8217;=&gt;&#8217;2&#8242;,&#8217;parentid&#8217;=&gt;0,&#8217;name&#8217;=&gt;&#8217;一级栏目二&#8217;),<br />
 3 =&gt; array(&#8216;id&#8217;=&gt;&#8217;3&#8242;,&#8217;parentid&#8217;=&gt;1,&#8217;name&#8217;=&gt;&#8217;二级栏目一&#8217;),<br />
 );*/</p>
<p> /**<br />
  * 输出结构<br />
  * @var array<br />
  */<br />
 var $tree = array();<br />
 /**<br />
  * 树形递归的深度<br />
  * @var int<br />
  */<br />
 var $deep = 1;</p>
<p> /**<br />
  * 生成树形的修饰符号<br />
  * @var array<br />
  */<br />
 var $icon = array(&#8216;│&#8217;,'├&#8217;,'└&#8217;);<br />
 /**<br />
  * 生成指定id的下级树形结构<br />
  * @param int $rootid 要获取树形结构的id<br />
  * @param string $add 递归中使用的前缀<br />
  * @param bool $parent_end 标识上级分类是否是最后一个<br />
  */<br />
 function getTree($rootid = 0,$add = &#8221;,$parent_end =true){<br />
  $is_top = 1;<br />
  $child_arr = $this-&gt;getChild($rootid);<br />
  if(is_array($child_arr)){<br />
   $cnt = count($child_arr);<br />
   foreach($child_arr as $key =&gt; $child){<br />
    $cid = $child['id'];<br />
    $child_child = $this-&gt;getChild($cid);<br />
    if($this-&gt;deep &gt;1){<br />
     if($is_top == 1 &amp;&amp; $this-&gt;deep &gt; 1){<br />
      $space = $this-&gt;icon[1];<br />
      if(!$parent_end)<br />
      $add .=  $this-&gt;icon[0];<br />
      else $add .= &#8216;&amp;nbsp;&amp;nbsp;&#8217;;<br />
     }</p>
<p>     if($is_top == $cnt){<br />
      $space = $this-&gt;icon[2];<br />
      $parent_end = true;<br />
     }else {<br />
      $space = $this-&gt;icon[1];<br />
      $parent_end = false;<br />
     }<br />
    }<br />
    $this-&gt;tree[] = array(&#8217;spacer&#8217;=&gt;$add.$k.$space,<br />
           &#8216;name&#8217;=&gt;$child['name'],<br />
           &#8216;id&#8217;=&gt;$cid<br />
    );<br />
    $is_top++;</p>
<p>    $this-&gt;deep++;<br />
    if($this-&gt;getChild($cid))<br />
    $this-&gt;getTree($cid,$add,$parent_end);<br />
    $this-&gt;deep&#8211;;</p>
<p>   }</p>
<p>  }<br />
  return $this-&gt;tree;<br />
 }</p>
<p> /**<br />
  * 获取下级分类数组<br />
  * @param int $root<br />
  */<br />
 function getChild($root = 0){</p>
<p>  $a = $child = array();<br />
  foreach($this-&gt;arr as $id=&gt;$a){<br />
   if($a['parentid'] == $root){<br />
    $child[$a['id']] = $a;<br />
   }<br />
  }<br />
  return $child?$child:false;<br />
   <br />
 }<br />
 /**<br />
  * 设置源数组<br />
  * @param $arr<br />
  */<br />
 function setArr($arr = array()){<br />
  $this-&gt;arr = $arr;<br />
 }<br />
}</p></blockquote>
<p>通过一次查询把结构保存进一个数组，再数组进行递归运算，无疑极大的提高了程序运行效率<br />
使用代码很简单，得到查询结构后setArr，直接调用getTree, 皆可以得到按照程序排序号并带有前缀修饰等信息的数组，到这里通过foreach这个数组就可以得到如下的树状列表了</p>
<blockquote><p>水果   <br />
  ├香蕉<br />
  ├苹果<br />
  │├红富士<br />
  │└海南苹果<br />
  └桃子</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/950/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>smarty中使用fckeditor</title>
		<link>http://anfirst.cn/archives/946</link>
		<comments>http://anfirst.cn/archives/946#comments</comments>
		<pubDate>Tue, 06 Apr 2010 12:39:02 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[fckeditor插件]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[smarty]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=946</guid>
		<description><![CDATA[网上最常用的做法是先在php中调用fckeditor类的createHtml方法生成一段html，直接assign给一个samrty变量即可
这里我通过smarty的插件机制，可以更方便的在smarty中集成fckeditor，在smarty的plugin目录中新建文件function.fck.php
内容如下
&#60;?php
function smarty_function_fck($params, &#38;$smarty)
{
 if(!isset($params['InstanceName']) &#124;&#124; empty($params['InstanceName']))
 {
  $smarty-&#62;trigger_error(&#8216;fckeditor: required parameter &#8220;InstanceName&#8221; missing&#8217;);
 }
 static $base_arguments = array();
 static $config_arguments = array();
 if(!count($base_arguments))
  $init = TRUE;
 else
  $init = FALSE;
 if(isset($params['BasePath']))
 {
  $base_arguments['BasePath'] = $params['BasePath'];
 }
 else if(empty($base_arguments['BasePath']))
 {
//这里设置默认的fck所在的目录,相对于要使用fck的程序的目录
  $base_arguments['BasePath'] = &#8216;../plugins/fckeditor/&#8217;;
 }
 $base_arguments['InstanceName'] = $params['InstanceName'];
 if(isset($params['Value'])) $base_arguments['Value'] = $params['Value'];
 if(isset($params['Width'])) $base_arguments['Width'] = $params['Width'];
 if(isset($params['Height'])) $base_arguments['Height'] = $params['Height'];
 if(isset($params['ToolbarSet'])) $base_arguments['ToolbarSet'] = $params['ToolbarSet'];
 if(isset($params['CheckBrowser'])) $base_arguments['CheckBrowser'] = $params['CheckBrowser'];
 if(isset($params['DisplayErrors'])) $base_arguments['DisplayErrors'] = $params['DisplayErrors'];
 // Use all other parameters for the config array (replace if needed)
 $other_arguments [...]]]></description>
			<content:encoded><![CDATA[<p>网上最常用的做法是先在php中调用fckeditor类的createHtml方法生成一段html，直接assign给一个samrty变量即可</p>
<p>这里我通过smarty的插件机制，可以更方便的在smarty中集成fckeditor，在smarty的plugin目录中新建文件function.fck.php</p>
<p>内容如下</p>
<blockquote><p>&lt;?php<br />
function smarty_function_fck($params, &amp;$smarty)<br />
{<br />
 if(!isset($params['InstanceName']) || empty($params['InstanceName']))<br />
 {<br />
  $smarty-&gt;trigger_error(&#8216;fckeditor: required parameter &#8220;InstanceName&#8221; missing&#8217;);<br />
 }</p>
<p> static $base_arguments = array();<br />
 static $config_arguments = array();</p>
<p> if(!count($base_arguments))<br />
  $init = TRUE;<br />
 else<br />
  $init = FALSE;</p>
<p> if(isset($params['BasePath']))<br />
 {<br />
  $base_arguments['BasePath'] = $params['BasePath'];<br />
 }<br />
 else if(empty($base_arguments['BasePath']))<br />
 {</p>
<p>//这里设置默认的fck所在的目录,相对于要使用fck的程序的目录<br />
  $base_arguments['BasePath'] = &#8216;../plugins/fckeditor/&#8217;;<br />
 }</p>
<p> $base_arguments['InstanceName'] = $params['InstanceName'];</p>
<p> if(isset($params['Value'])) $base_arguments['Value'] = $params['Value'];<br />
 if(isset($params['Width'])) $base_arguments['Width'] = $params['Width'];<br />
 if(isset($params['Height'])) $base_arguments['Height'] = $params['Height'];<br />
 if(isset($params['ToolbarSet'])) $base_arguments['ToolbarSet'] = $params['ToolbarSet'];<br />
 if(isset($params['CheckBrowser'])) $base_arguments['CheckBrowser'] = $params['CheckBrowser'];<br />
 if(isset($params['DisplayErrors'])) $base_arguments['DisplayErrors'] = $params['DisplayErrors'];</p>
<p> // Use all other parameters for the config array (replace if needed)<br />
 $other_arguments = array_diff_assoc($params, $base_arguments);<br />
 $config_arguments = array_merge($config_arguments, $other_arguments);</p>
<p> $out = &#8221;;</p>
<p> if($init)<br />
 {<br />
  $out .= &#8216;&lt;script type=&#8221;text/javascript&#8221; src=&#8221;&#8216; . $base_arguments['BasePath'] . &#8216;fckeditor.js&#8221;&gt;&lt;/script&gt;&#8217;;<br />
 }</p>
<p> $out .= &#8220;\n&lt;script type=\&#8221;text/javascript\&#8221;&gt;\n&#8221;;<br />
 $out .= &#8220;var oFCKeditor = new FCKeditor(&#8216;&#8221; . $base_arguments['InstanceName'] . &#8220;&#8216;);\n&#8221;;</p>
<p> foreach($base_arguments as $key =&gt; $value)<br />
 {<br />
  if(!is_bool($value))<br />
  {<br />
   // Fix newlines, javascript cannot handle multiple line strings very well.<br />
   $value = &#8216;&#8221;&#8216; . preg_replace(&#8220;/[\r\n]+/&#8221;, &#8216;&#8221; + $0&#8243;&#8216;, addslashes($value)) . &#8216;&#8221;&#8216;;<br />
  }<br />
  $out .= &#8220;oFCKeditor.$key = $value; &#8220;;<br />
 }</p>
<p> foreach($config_arguments as $key =&gt; $value)<br />
 {<br />
  if(!is_bool($value))<br />
  {<br />
   $value = &#8216;&#8221;&#8216; . preg_replace(&#8220;/[\r\n]+/&#8221;, &#8216;&#8221; + $0&#8243;&#8216;, addslashes($value)) . &#8216;&#8221;&#8216;;<br />
  }<br />
  $out .= &#8220;oFCKeditor.Config[\"$key\"] = $value; &#8220;;<br />
 }</p>
<p> $out .= &#8220;\noFCKeditor.Create();\n&#8221;;<br />
 $out .= &#8220;&lt;/script&gt;\n&#8221;;</p>
<p> return $out;<br />
}<br />
?&gt;</p></blockquote>
<p>使用代码</p>
<blockquote><p>{fck InstanceName=&#8221;body&#8221;  BasePath=“../plugins/fckeditor/” Value=$news_info.body Width=&#8221;100%&#8221; Height=&#8221;400&#8243;}<br />
可以自定义参数 ToolbarSet-使用的工具栏, BasePath-fck相对于当前脚本的目录,InstanceName-要赋予的$_POST变量名, Value-默认值等</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/946/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu 服务器中修改mysql数据目录的方法</title>
		<link>http://anfirst.cn/archives/941</link>
		<comments>http://anfirst.cn/archives/941#comments</comments>
		<pubDate>Mon, 08 Mar 2010 05:19:02 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=941</guid>
		<description><![CDATA[ubuntu 服务器中修改mysql数据库数据存放目录的方法]]></description>
			<content:encoded><![CDATA[<p>停止mysql服务<br />
sudo /etc/init.d/mysql stop</p>
<p>建新数据库目录<br />
mkdir  /media/hda11/db</p>
<p>复制linux下原数据到新目录下<br />
cp  -r  /var/lib/mysql/*  /media/hda11/db</p>
<p>给新目录重命属性(很 重要，不然出现无法访问目录情况)<br />
chown mysql:mysql  /media/hda11/db</p>
<p>修改 配置文件<br />
sudo nano /etc/mysql/my.cnf<br />
把<br />
datadir =  /var/mysql换成datadir = /media/hda11/db</p>
<p>＃在my.cnf中有提到如果修改了 datadir这几部分，最好也调整/etc/apparmor.d/usr.sbin.mysqld</p>
<p>修改文件 /etc/apparmor.d/usr.sbin.mysqld（似乎跟安全配置有关）</p>
<p>sudo nano /etc/apparmor.d/usr.sbin.mysqld<br />
把<br />
/var/lib/mysql r,<br />
/var/lib/mysql/** rwk,</p>
<p>改成<br />
/media/hda11/db r,<br />
/media/hda11/db/** rwk,</p>
<p>再开服务器(这一步很重要)<br />
sudo /etc/init.d/apparmor restart</p>
<p>重启mysql服务<br />
sudo /etc/init.d/mysql restart</p>
<p>附：apparmor也是个权限控制的东东。。</p>
<p>参考文章：http://forum.ubuntu.org.cn/viewtopic.php?f=44&amp;p=1074517</p>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/941/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>判断一个数是否是2的次方</title>
		<link>http://anfirst.cn/archives/938</link>
		<comments>http://anfirst.cn/archives/938#comments</comments>
		<pubDate>Wed, 20 Jan 2010 02:33:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[经典网摘]]></category>
		<category><![CDATA[程序分析]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=938</guid>
		<description><![CDATA[经典的：
int IsPower(unsigned n)
{
if(n==0)
return 1;
while(n)
{
if(n%2==0)
{
n = n/2;
if(n==1)
return 1;
}
else return 0;
}
}
不必解释
超强的：
int IsPower(unsigned n)
{
return (n&#38;&#38;!(n&#38;(n-1)));
}
解释：
如果一个数是2的次方，则转成2进制是首位为1，其余都为0，比如：
2(10) 4(100) 8(1000) 16(10000)&#8230;&#8230;
如果一个数和全1的相与还是等于自己，则这个数就是2的次方
n&#38;(n-1)计算的是全零的情况，故!(n&#38;(n-1))是全1的情况﻿
转自 http://hi.baidu.com/mzyse/blog/item/6b5f5517d5d9d30cc83d6da3.html
]]></description>
			<content:encoded><![CDATA[<p>经典的：<br />
int IsPower(unsigned n)<br />
{<br />
if(n==0)<br />
return 1;<br />
while(n)<br />
{<br />
if(n%2==0)<br />
{<br />
n = n/2;<br />
if(n==1)<br />
return 1;<br />
}<br />
else return 0;<br />
}<br />
}<br />
不必解释</p>
<p>超强的：<br />
int IsPower(unsigned n)<br />
{<br />
return (n&amp;&amp;!(n&amp;(n-1)));<br />
}</p>
<p>解释：<br />
如果一个数是2的次方，则转成2进制是首位为1，其余都为0，比如：<br />
2(10) 4(100) 8(1000) 16(10000)&#8230;&#8230;</p>
<p>如果一个数和全1的相与还是等于自己，则这个数就是2的次方</p>
<p>n&amp;(n-1)计算的是全零的情况，故!(n&amp;(n-1))是全1的情况﻿</p>
<p>转自 http://hi.baidu.com/mzyse/blog/item/6b5f5517d5d9d30cc83d6da3.html</p>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/938/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>有关IIS下zencart的伪静态设置</title>
		<link>http://anfirst.cn/archives/936</link>
		<comments>http://anfirst.cn/archives/936#comments</comments>
		<pubDate>Sat, 16 Jan 2010 07:27:43 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[zencart项目]]></category>
		<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php编程]]></category>
		<category><![CDATA[zen cart]]></category>
		<category><![CDATA[正则]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=936</guid>
		<description><![CDATA[公司的zencart 项目放在了window2003的服务器上，为了seo的考虑，开启了搜索引擎优化模块，可是碰到了一个问题，url的伪静态是通过网站根目录下的.htaccess文件来实现的，这需要apache的rewrite模块，可是iis中怎么实现？其实可以通过iis的ISAPI_Rewrite扩展来实现，下载一个ISAPI Rewrite的安装包，Lite免费版本ISAPI_Rewrite Lite (freeware)即可。安装运行后，打开IIS，在网站单击右键选属性，就可以看到ISAPI_Rewrite已经被加入到了ISAPI筛选器中。在ISAPI_Rewrite的安装目录下，找到 httpd.ini 在此文件中输入Rewrite的规则即可，这里的规则基本跟apache的rewrite差不多，不过在我的测试过程中，发现了一些问题，例如http.ini中不能使用%{QUERY_STRING}这样的服务器变量，也不知道是不是我服务器配置的原因，这里我对 zencart 里的.htaccess文件需要经过一些修改解决了这个问题
RewriteRule ^(.*)-p-(.*).html$ index\.php?main_page=product_info&#38;products_id=$2&#38;%{QUERY_STRING} [L]
修改为，无非是一个简单的正则替换
RewriteRule ^(.*)-p-(.*).html(\?(.*))?$ index\.php?main_page=product_info&#38;products_id=$2&#38;$4 [L]
]]></description>
			<content:encoded><![CDATA[<p>公司的zencart 项目放在了window2003的服务器上，为了seo的考虑，开启了搜索引擎优化模块，可是碰到了一个问题，url的伪静态是通过网站根目录下的.htaccess文件来实现的，这需要apache的rewrite模块，可是iis中怎么实现？其实可以通过iis的ISAPI_Rewrite扩展来实现，下载一个ISAPI Rewrite的安装包，Lite免费版本ISAPI_Rewrite Lite (freeware)即可。安装运行后，打开IIS，在网站单击右键选属性，就可以看到ISAPI_Rewrite已经被加入到了ISAPI筛选器中。在ISAPI_Rewrite的安装目录下，找到 httpd.ini 在此文件中输入Rewrite的规则即可，这里的规则基本跟apache的rewrite差不多，不过在我的测试过程中，发现了一些问题，例如http.ini中不能使用%{QUERY_STRING}这样的服务器变量，也不知道是不是我服务器配置的原因，这里我对 zencart 里的.htaccess文件需要经过一些修改解决了这个问题</p>
<blockquote><p>RewriteRule ^(.*)-p-(.*).html$ index\.php?main_page=product_info&amp;products_id=$2&amp;%{QUERY_STRING} [L]</p></blockquote>
<p>修改为，无非是一个简单的正则替换</p>
<blockquote><p>RewriteRule ^(.*)-p-(.*).html<strong>(\?(.*))?</strong>$ index\.php?main_page=product_info&amp;products_id=$2&amp;<strong>$4</strong> [L]</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/936/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有关zen cart集成支付宝借口时提示ILLEGAL_SIGN 错误解决</title>
		<link>http://anfirst.cn/archives/933</link>
		<comments>http://anfirst.cn/archives/933#comments</comments>
		<pubDate>Fri, 08 Jan 2010 08:50:26 +0000</pubDate>
		<dc:creator>shooting</dc:creator>
				<category><![CDATA[zencart项目]]></category>
		<category><![CDATA[全部文章]]></category>
		<category><![CDATA[学习笔记]]></category>

		<guid isPermaLink="false">http://anfirst.cn/?p=933</guid>
		<description><![CDATA[这次开发zencart的过程中要用过国内大名鼎鼎的支付宝接口，从zencart.cn上下了jack的 zen cart 支付宝模块从后台安装一切ok，可是测试购物的时候遇到了 ILLEGAL_SIGN错误，找了很多答案，仔仔细细看了阿里提供的api文档，还是找不出问题所在。看来得靠自己了，对着firebug，一个个核对网站传输给支付宝的post数据，发现多了 btn_submit.x,btn_submit.x 这两个参数，我把form 的method改成get,从地址栏中去掉这两个参数再打开，成功转向支付宝收银台页面，看来果然是两个参数搞得鬼！
google了下submit.x,得到如下答案
根据图形提交按钮行为W3C的描述 ：
When a pointing device is used to click on the image, the form is submitted and the click coordinates passed to the server.
当指针设备用于在图像上点击，表单提交和点击坐标传递给服务器。
The x value is measured in pixels from the left of the image, and the y value in pixels from the top of the image.
在x值的单位是像素从左边的形象，以像素为单位从图像的顶部y值。
The [...]]]></description>
			<content:encoded><![CDATA[<p>这次开发zencart的过程中要用过国内大名鼎鼎的支付宝接口，从zencart.cn上下了jack的 zen cart 支付宝模块从后台安装一切ok，可是测试购物的时候遇到了 ILLEGAL_SIGN错误，找了很多答案，仔仔细细看了阿里提供的api文档，还是找不出问题所在。看来得靠自己了，对着firebug，一个个核对网站传输给支付宝的post数据，发现多了 btn_submit.x,btn_submit.x 这两个参数，我把form 的method改成get,从地址栏中去掉这两个参数再打开，成功转向支付宝收银台页面，看来果然是两个参数搞得鬼！<br />
google了下submit.x,得到如下答案<br />
根据图形提交按钮行为W3C的描述 ：</p>
<blockquote><p>When a pointing device is used to click on the image, the form is submitted and the click coordinates passed to the server.<br />
当指针设备用于在图像上点击，表单提交和点击坐标传递给服务器。</p>
<p>The x value is measured in pixels from the left of the image, and the y value in pixels from the top of the image.<br />
在x值的单位是像素从左边的形象，以像素为单位从图像的顶部y值。</p>
<p>The submitted data includes name.x=x-value and name.y=y-value where &#8220;name&#8221; is the value of the name attribute, and x-value and y-value are the x and y coordinate values, respectively.<br />
提交的数据包括name.x = x值和name.y = y值在“名称”的名称属性值和x值和y值是x和y坐标值。</p></blockquote>
<p>于是这还是W3C的标准，现在的问题就是如何避免浏览器“多此一举”了，很简单，在表单添加onsubmit=&#8221;this.submit();return false;&#8221;,即修改zencart的订单确认页面模板tpl_checkout_confirmation_default.php文件中的</p>
<blockquote><p>echo zen_draw_form(&#8216;checkout_confirmation&#8217;, $form_action_url, &#8216;post&#8217;, &#8216;id=&#8221;checkout_confirmation&#8221; onsubmit=&#8221;submitonce();&#8221;&#8216;);</p></blockquote>
<p>修改为</p>
<blockquote><p>echo zen_draw_form(&#8216;checkout_confirmation&#8217;, $form_action_url, &#8216;post&#8217;, &#8216;id=&#8221;checkout_confirmation&#8221; onsubmit=&#8221;this.submit();return false;&#8221;&#8216;);</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://anfirst.cn/archives/933/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
