<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>℃冻番茄's Blog</title>
		<link>http://www.phpd.cn/</link>
		<description>人的头脑太复杂,时间过得久,有时候连自己也被自己骗了,记下来才是最真实的......</description>
		<copyright>Powered by SaBlog-X. Copyright (C) 2003-2010.</copyright>
		<generator>SaBlog-X Version 2.0 Build 20100611</generator>
		<lastBuildDate>Thu, 09 Sep 2010 07:06:56 +0000</lastBuildDate>
		<ttl>30</ttl>
		<item>
			<link>http://www.phpd.cn/archives/235/</link>
			<guid>http://www.phpd.cn/archives/235/</guid>
			<title>搞定了qq机器人linux编译后内存泄漏问题</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	目前linux版本已正常工作，上周windows版本也存在内存泄漏问题，找了半天才发现是因为数组过界引的</p>
<p>
	另今天移值到linux平台，都是用gcc windows下正常 linux下就内存泄漏，怪事。。不过还好找到了问题所在。</p>
<p>
	另新加了一个程序自动从文本文件里读取验证码的功能，方便linux在nohup下运行，无需担心验证码输入的问题。</p>
<p>
	目前程序挂服务器上进行测试，如不稳定继续修改！</p>
<p><strong>linux.jpg(缩略图)</strong><br /><a href="http://www.phpd.cn/attachment.php?id=317" target="_blank"><img src="http://www.phpd.cn/attachments/date_201009/thumb_bf4af667992467fc64f95852625824ea.jpg" border="0" alt="linux.jpg&#13;&#13;大小: 86.35 K&#13;尺寸: 500 x 314&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="500" height="314" /></a></p>]]></description>
			<link>http://www.phpd.cn/archives/235/</link>
			<category domain="http://www.phpd.cn/category/c/">C/C++/C#</category>
			<category domain="http://www.phpd.cn/category/show/">我的作品</category>
			<pubDate>Mon, 06 Sep 2010 14:44:07 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/234/</link>
			<guid>http://www.phpd.cn/archives/234/</guid>
			<title>花了些时间弄个QQ机器人</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	qq通信服务端是在myqq上二次开发，所以支持linux/windows双平台</p>
<p>
	主控程序采用php开发</p>
<p>
	主要的功能是：</p>
<p>
	查ip地址、查电话归属地、查天气预报、查pr值、在线翻译等都是些常用的功能</p>
<p>
	目前windows下正常，准备着手迁移至linux平台，还好机器人程序的主要库libcurl是跨平台的。</p>
<p>
	全部弄好后，加上远程服务器许可认证系统，然后准备卖程序咯，嘿嘿！</p>
<p><strong>qq.jpg(缩略图)</strong><br /><a href="http://www.phpd.cn/attachment.php?id=316" target="_blank"><img src="http://www.phpd.cn/attachments/date_201009/thumb_017ea4bf0f973b164401cd600951ff8b.jpg" border="0" alt="qq.jpg&#13;&#13;大小: 135.15 K&#13;尺寸: 500 x 337&#13;浏览: 13 次&#13;点击打开新窗口浏览全图" width="500" height="337" /></a></p>]]></description>
			<link>http://www.phpd.cn/archives/234/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<category domain="http://www.phpd.cn/category/c/">C/C++/C#</category>
			<category domain="http://www.phpd.cn/category/show/">我的作品</category>
			<pubDate>Fri, 03 Sep 2010 15:12:06 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/233/</link>
			<guid>http://www.phpd.cn/archives/233/</guid>
			<title>转一篇暴笑笑话</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天在公交车上，由于拥挤一男一女发生了碰撞。<br />
	　　　　时髦女郎回头飞眼道：&ldquo;你有病啊？&rdquo;<br />
	　　　　男子觉得莫名其妙回道：&ldquo;你有药吗？&rdquo;<br />
	　　　　车上人窃笑！<br />
	　　　　女子觉得生气回道：&ldquo;你有精神病啊？&rdquo;<br />
	　　　　男子冷面对道：&ldquo;你能治啊？&rdquo;<br />
	　　　　全车人爆笑！<br />
	　　　　公交司机停车，趴在方向盘上大笑！<br />
	　　<br />
	　　　这是珠江路上上班的朋友遇见的<br />
	　　　　 公交车上超挤，有一女人站在门口，<br />
	　　　　从车后面挤过来一个ＧＧ要下车，<br />
	　　　　跟那女的说了一句&ldquo;让一下，下车&rdquo;，那个女滴木有动。<br />
	　　　　ＧＧ挤过去时就踩到她了。<br />
	　　　　结果那女人好厉害的，不停的骂&ldquo;神经病啊你！神经病啊你！~~&rdquo;，还超大声，搞得全车都看呀。<br />
	　　　　ＧＧ一直木有说话，下车时忍不了了，回头对那女人说，&ldquo;复读机呀你！&rdquo;<br />
	　　　　全车人暴笑~！<br />
	　　　　后边有几个搞笑的小孩，不停的伴演刚才的一幕，<br />
	　　　　甲说&ldquo;你神经病呀你！。。。。。乙说&ldquo;你复读机呀你&rdquo;。。。。。。 新浪乐居论坛:<br />
	　　　　全车人暴笑~！<br />
	　　　　后来，有个小ＭＭ也要下车，挤过去怯怯滴说&ldquo;偶~偶~偶想下去，偶不是神经病~！&rdquo;<br />
	　　　　全车人再次暴笑~！<br />
	　　　　那个女人木有说话，可是从边上飘来一句话&ldquo;你是不是没电了&rdquo;<br />
	　　　　全车人暴笑不止~！</p>
]]></description>
			<link>http://www.phpd.cn/archives/233/</link>
			<category domain="http://www.phpd.cn/category/log/">随心日志</category>
			<comments>http://www.phpd.cn/archives/233/#comments</comments>
			<pubDate>Fri, 20 Aug 2010 13:56:21 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/232/</link>
			<guid>http://www.phpd.cn/archives/232/</guid>
			<title>windows下安装mongodb及php驱动</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	mongodb是nosql的典型了，采用是json类似的存储格式</p>
<p>
	mongodb官网下载windows平台下的服务端： http://www.mongodb.org/downloads</p>
<p>
	mongodb的php驱动：http://github.com/mongodb/mongo-php-driver/downloads</p>
<p>
	mongodb下载后，解压到D盘，最终地址是：D:\mongodb\bin</p>
<pre class="code-java">
php驱动 php_mongo.dll 解压至php的ext文件夹下，然后修改php.ini，添加 extension=php_mongo.dll

新建数据库存放文件夹  D:\mongodb\db</pre>
<p>
	mongodb的启动：</p>
<p>
	在命令行输入&nbsp; D:\mongodb\bin\mo\mongod --dbpath D:\mongodb\db</p>
<p>
	到这里，mongodb已启动，打开http://127.0.0.1:28017/ 可以看到mongodb运行情况</p>
<p>
	为了方便以后每次不必启动mongod，可以把mongod注册成windows服务</p>
<p>
	mongodb php使用方法：</p>
<p>
	3 用PHP操作Mongondb</p>
<p>
	<br />
	简单列子 //这里采用默认连接本机的27017端口，当然你也可以连接远程主机如192.168.0.4:27017,如果端口是27017，端口可以省略<br />
	$m = new Mongo();<br />
	<br />
	// 选择comedy数据库，如果以前没该数据库会自动创建，也可以用<br />
	$db = $m-&gt;comedy;<br />
	<br />
	//选择comedy里面的collection集合，相当于RDBMS里面的表，也-可以使用<br />
	$collection = $db-&gt;collection;<br />
	$db-&gt;selectCollection(&quot;collection&quot;);<br />
	<br />
	/* ----- 添加一个元素 -----*/<br />
	$obj = array( &quot;title&quot; =&gt; &quot;Calvin and Hobbes&quot;, &quot;author&quot; =&gt; &quot;Bill Watterson&quot; );<br />
	$collection-&gt;insert($obj);&nbsp;&nbsp;&nbsp;&nbsp; //将$obj 添加到$collection 集合中<br />
	<br />
	/* ----- 添加另一个元素 -----*/<br />
	$obj = array(<br />
	&quot;title&quot; =&gt; &quot;XKCD&quot;,<br />
	&quot;online&quot; =&gt; true<br />
	);<br />
	$collection-&gt;insert($obj);<br />
	<br />
	$cursor = $collection-&gt;find();<br />
	<br />
	//遍历所有集合中的文档<br />
	foreach ($cursor as $obj) {<br />
	echo $obj[&quot;title&quot;] . &quot;\n&quot;;<br />
	}&nbsp;&nbsp;&nbsp;<br />
	<br />
	//断开MongoDB连接<br />
	$m-&gt;close();</p>
<p>
	3.2 常用函数</p>
<div class="wp_syntax">
	<div class="code">
		<pre class="php">
		<span style="color: rgb(0, 0, 136);">$query</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(153, 0, 0);">array</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(0, 0, 255);">&quot;i&quot;</span> <span style="color: rgb(51, 153, 51);">=&gt;</span> <span style="color: rgb(204, 102, 204);">71</span> <span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>    
<span style="color: rgb(0, 0, 136);">$cursor</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 136);">$collection</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">find</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(0, 0, 136);">$query</span> <span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>      <span style="color: rgb(102, 102, 102); font-style: italic;">// 在$collectio集合中查找满足$query的文档    </span>
&nbsp;
<span style="color: rgb(177, 177, 0);">while</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(0, 0, 136);">$cursor</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">hasNext</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">{</span>    
<span style="color: rgb(153, 0, 0);">var_dump</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(0, 0, 136);">$cursor</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">getNext</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>    
<span style="color: rgb(0, 153, 0);">}</span>    
&nbsp;
<span style="color: rgb(0, 0, 136);">$collection</span> <span style="color: rgb(51, 153, 51);">-&gt;</span> <span style="color: rgb(0, 64, 0);">findOne</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>            <span style="color: rgb(102, 102, 102); font-style: italic;">//返回$collection集合中第一个文档    </span>
&nbsp;
<span style="color: rgb(0, 0, 136);">$collection</span> <span style="color: rgb(51, 153, 51);">-&gt;</span> <span style="color: rgb(153, 0, 0);">count</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>              <span style="color: rgb(102, 102, 102); font-style: italic;">//返回$collection集合中文档的数量    </span>
<span style="color: rgb(0, 0, 136);">$coll</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">ensureIndex</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(153, 0, 0);">array</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(0, 0, 255);">&quot;i&quot;</span> <span style="color: rgb(51, 153, 51);">=&gt;</span> <span style="color: rgb(204, 102, 204);">1</span> <span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>  <span style="color: rgb(102, 102, 102); font-style: italic;">// 为i &ldquo;这一列&rdquo;加索引 降序排列    </span>
<span style="color: rgb(0, 0, 136);">$coll</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">ensureIndex</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(153, 0, 0);">array</span><span style="color: rgb(0, 153, 0);">(</span> <span style="color: rgb(0, 0, 255);">&quot;i&quot;</span> <span style="color: rgb(51, 153, 51);">=&gt;</span> <span style="color: rgb(51, 153, 51);">-</span><span style="color: rgb(204, 102, 204);">1</span><span style="color: rgb(51, 153, 51);">,</span> <span style="color: rgb(0, 0, 255);">&quot;j&quot;</span> <span style="color: rgb(51, 153, 51);">=&gt;</span> <span style="color: rgb(204, 102, 204);">1</span> <span style="color: rgb(0, 153, 0);">)</span> <span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>  <span style="color: rgb(102, 102, 102); font-style: italic;">// 为i &ldquo;这一列&rdquo;加索引 降序排列 j升序</span></pre>
	</div>
</div>
<p>
	3.3 查询时，每个Object插入时都会自动生成一个独特的_id,它相当于RDBMS中的主键，用于查询时非常方便<br />
	如：</p>
<div class="wp_syntax">
	<div class="code">
		<pre class="php">
		<span style="color: rgb(0, 0, 0); font-weight: bold;">&lt;?php</span>    
&nbsp;
<span style="color: rgb(0, 0, 136);">$person</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(153, 0, 0);">array</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 255);">&quot;name&quot;</span> <span style="color: rgb(51, 153, 51);">=&gt;</span> <span style="color: rgb(0, 0, 255);">&quot;joe&quot;</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>    
&nbsp;
<span style="color: rgb(0, 0, 136);">$people</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">insert</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 136);">$person</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>    
&nbsp;
<span style="color: rgb(0, 0, 136);">$joe</span> <span style="color: rgb(51, 153, 51);">=</span> <span style="color: rgb(0, 0, 136);">$people</span><span style="color: rgb(51, 153, 51);">-&gt;</span><span style="color: rgb(0, 64, 0);">findOne</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(153, 0, 0);">array</span><span style="color: rgb(0, 153, 0);">(</span><span style="color: rgb(0, 0, 255);">&quot;_id&quot;</span> <span style="color: rgb(51, 153, 51);">=&gt;</span> <span style="color: rgb(0, 0, 136);">$person</span><span style="color: rgb(0, 153, 0);">[</span><span style="color: rgb(0, 0, 255);">&#39;_id&#39;</span><span style="color: rgb(0, 153, 0);">]</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(0, 153, 0);">)</span><span style="color: rgb(51, 153, 51);">;</span>    
&nbsp;
<span style="color: rgb(0, 0, 0); font-weight: bold;">?&gt;</span></pre>
	</div>
</div>
]]></description>
			<link>http://www.phpd.cn/archives/232/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<pubDate>Wed, 18 Aug 2010 13:52:38 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/231/</link>
			<guid>http://www.phpd.cn/archives/231/</guid>
			<title>在淘宝上开了家小店，卖些小家电</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	<a href="http://oyouka.taobao.com/" target="_blank">http://oyouka.taobao.com/</a></p>
<p>
	欧友卡家电卖场</p>
<p>
	有需要的朋友们可以看看哈~~~</p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=315" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/thumb_282bce2f4ee4fa49cd93907c5fb6b08b.png" border="0" alt="s.png&#13;&#13;大小: 75.32 K&#13;尺寸:  x &#13;浏览: 3 次&#13;点击打开新窗口浏览全图" width="500" height="172" /></a></div></p>
]]></description>
			<link>http://www.phpd.cn/archives/231/</link>
			<category domain="http://www.phpd.cn/category/my/">图片/文字</category>
			<category domain="http://www.phpd.cn/category/log/">随心日志</category>
			<pubDate>Sat, 14 Aug 2010 13:09:25 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/230/</link>
			<guid>http://www.phpd.cn/archives/230/</guid>
			<title>昨天mysql生成了100w条文章数据（2G数据）做测试用</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	昨天写了个php程序，给mysql插入随机的文章数据，仿照真实文章，中文数据，主要是测试在100w级数量时查询上的优化及测试mysql内置的全文检索与其它类似全文检索引擎的差距等。总数据量：article 101w左右&nbsp; user表10w左右，总计占用硬盘2G左右</p>
<p>
	今天开始测试在海量数据查询时的优化手段</p>
<ol>
	<li>
		<strong>测试添加索引对数据查询的影响：</strong><br />
		sql语句：select * from article as article order by time limit 10;<br />
		没有对time字段建立索引时查询所花时间：31.237657s<br />
		新建time字段的索引，花掉近二分钟，建立了111298条索引，没有建立完phpmyadmin就timeout了。<br />
		建立time索引后，同样的sql语句执行只花了：0.380957s，不过time索引没有建完，但是时间相差不大;<br />
		<strong>总结：在关键字段的索引上，建与不建速度相差近100倍！</strong><br />
		&nbsp;</li>
	<li>
		<strong>测试limit在不同的基数上的影响：</strong><br />
		sql语句：select * from article as article order by id limit&nbsp; 0,10<br />
		当limit的基数为0时【limit&nbsp; 0,10】，执行时间：0.001557s<br />
		当limit的基数为20000时【limit&nbsp; 20000,10】，，执行时间：0.572288s<br />
		当limit的基数为100000时，执行时间：2.793380s<br />
		当limit的基数为50W 时，执行时间：14.444422s<br />
		当limit的基数为100W时，执行时间：28.270054s<br />
		<strong>总结：在海量数据中要想查找比较靠后的数据时，要注意limit的基数，因为随着数据量的加大，查找时间继续增长！在取比较后面的数据时，可以通过desc方式把数据反向查找，以减少对前段数据的扫描，让limit的基数越小越好！</strong><br />
		&nbsp;</li>
	<li>
		<strong>测试field为*或是id对查询速度的影响：</strong><br />
		sql语句：select id from article as article order by id limit 100000,10<br />
		为了数据更真实，所以通过limit让sql执行时间长些，以便更容易看出区别<br />
		当field为id时，执行时间：2.617519s<br />
		当field为*时，执行时间：2.867721s<br />
		<strong>总结：由数量可见，二者在sql执行时间上相差并不大，但是限定field可以大幅度的减少内存开支</strong><br />
		&nbsp;</li>
	<li>
		<strong>测试limit限定结果与between限定结果上的区别：</strong><br />
		当用limit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select * from article as article order by id limit 1000000,10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [31.163212s]<br />
		当用between&nbsp; select * from article as article where id between 1000000 and 1000010 order by id &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [0.001433s]<br />
		<strong>总结：between&nbsp;限定上比limit快太多了，所以当在海量数据访问时，建议用between或是where把limit替换掉，但是between也有缺陷，如果id中间有断行或是中间部分id不读取的话，总读取的数量会少于预计数量！</strong><br />
		&nbsp;</li>
	<li>
		<strong>测试left join对读取数据的影响</strong><br />
		user表，数据为100000条<br />
		select id from article as article order by id limit 500000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [14.980397s]<br />
		select article.id from article as article left join user as user on user.uid=article.uid order by article.id,user.username limit 500000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [60.488099s]<br />
		总结：当数据量比较大时，用left join做连接是非常慢的，速度是查单表的4倍多，所以如果在大数据量的情况下，如果要实现刚实现用户表与文章表的连表功能，还是把全部的会员数据预先存入memcache等内存缓存中，10万条用户数据也不过5m不到，用户更新资料或登陆时，把用户的数据更新入memcache的指定用户中就ok了。这样速度就快了！</li>
</ol>
<p>
	<br />
	&nbsp;</p>
<p>
	最后附上一截图</p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=314" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/thumb_cb8a28fec427caed62a314b8711778c2.jpg" border="0" alt="ssss.jpg&#13;&#13;大小: 19.25 K&#13;尺寸:  x &#13;浏览: 30 次&#13;点击打开新窗口浏览全图" width="500" height="87" /></a></div><br />
	&nbsp;</p>]]></description>
			<link>http://www.phpd.cn/archives/230/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<category domain="http://www.phpd.cn/tag/%E7%B4%A2%E5%BC%95/">索引</category>
			<category domain="http://www.phpd.cn/tag/%E6%9F%A5%E8%AF%A2/">查询</category>
			<category domain="http://www.phpd.cn/tag/%E6%B5%8B%E8%AF%95/">测试</category>
			<category domain="http://www.phpd.cn/tag/mysql/">mysql</category>
			<category domain="http://www.phpd.cn/tag/php/">php</category>
			<pubDate>Thu, 12 Aug 2010 10:47:11 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/229/</link>
			<guid>http://www.phpd.cn/archives/229/</guid>
			<title>写了三个简单的算法，都是比较常用的</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	第一个是二分法查找，只能对有顺序的数组进行查找，速度应该是所有查找算法里最快的，</p>
<p>
	原理就是不停的做对折，以查找到目标！</p>
<p>
	第二个是冒泡排序，比较有名了，大学里c语言课必有的一个算法</p>
<p>
	第三个是从字符串中查找子串，也比较常用，以前用它做词频排序。</p>
<pre class="brush:php;">
&lt;?php
//二分法  $arr 数组，$k 要查找的值，$m 最小,$b最大
function dichotomy($arr,$k,$m=0,$b=0)
{
	$total=count($arr);
	if($total!=0 &amp;&amp; $b==0) $b=$total;
	if($m&lt;=$b){
		$avg=intval(($m+$b)/2);
		if($arr[$avg]==$k) return $avg;
		elseif($k&lt;$arr[$avg]) return dichotomy($arr,$k,$m,$avg-1);
		else return dichotomy($arr,$k,$avg+1,$b);
	}
	return false;
}
echo &quot;&lt;hr&gt;二分法查找&lt;br&gt;&quot;;
$arr=array(0,1,2,3,4,5,6,7,8,9,10);
var_dump(dichotomy($arr,1));


//冒泡排序
function bubblesort($arr)
{
	$total=count($arr);
	for($i=0;$i&lt;$total-1;$i++){
		for($l=$i+1;$l&lt;$total;$l++){
			if($arr[$i]&gt;$arr[$l]){
				list($arr[$l],$arr[$i])=array($arr[$i],$arr[$l]);
			}
		}
	}
	return $arr;
}
echo &quot;&lt;hr&gt;冒泡排序&lt;br&gt;&quot;;
$arr=array(1,100,23,434,22,12,3,5);
var_dump(bubblesort($arr));

//从字符串中搜索子串 $text 字符串，$str 要搜索的子串
function search($text,$str){
	$strLen=strlen($str);
	$textLen=strlen($text);
	for($i=0;$i&lt;$textLen-$strLen;$i++){
		if(substr($text,$i,$strLen)==$str) return $i;
	}
	return false;
}
echo &quot;&lt;hr&gt;字符串中搜索子串&lt;br&gt;&quot;;
$text=&quot;pdsofuapdoi3409729fhydish&quot;;
var_dump(search($text,&quot;7&quot;));
?&gt;
</pre>]]></description>
			<link>http://www.phpd.cn/archives/229/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<category domain="http://www.phpd.cn/tag/%E6%9F%A5%E6%89%BE/">查找</category>
			<category domain="http://www.phpd.cn/tag/%E5%86%92%E6%B3%A1/">冒泡</category>
			<category domain="http://www.phpd.cn/tag/%E4%BA%8C%E5%88%86%E6%B3%95/">二分法</category>
			<category domain="http://www.phpd.cn/tag/%E7%AE%97%E6%B3%95/">算法</category>
			<category domain="http://www.phpd.cn/tag/php/">php</category>
			<pubDate>Wed, 11 Aug 2010 17:20:03 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/228/</link>
			<guid>http://www.phpd.cn/archives/228/</guid>
			<title>比较实用的Java基本语法</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	　Java的基本符号（token）<br />
	　　Java的单词符号有五种：关键字、标识符、常量、分隔符和操作符。<br />
	　　Java的字符集<br />
	　　Java 采用一种称为unicode的字符集，该字符集合是一种新的编码标准，与常见的ASCII码的区别在于：<br />
	　　unicode使用16位二进制而不是8位来表示一个字符。<br />
	　　unicode字符集中增加了许多非拉丁语字符。<br />
	　　标识符<br />
	　　Java标识符必须以字母，数字，美元符号&quot;$&quot;，下划线&quot;_&quot;组成，标识符第一个字符不可用数字。<br />
	　　Java语言对字母的大小写是敏感的，在语法中严格区分大小写。<br />
	　　关键字<br />
	　　关键字是为特定目的而保留的保留字，程序员不要将关键字作为自己的标识符。 Java的关键字有：<br />
	　　abstract boolean break byte case catch char class continue do double else extends false<br />
	　　find finally float for implements import instanceof int interface long native new null<br />
	　　package private public return short static super switch synchronized this throw true try void while<br />
	　　常量<br />
	　　常量可分为整型常量，浮点数常量，字符常量，字符串常量和布尔常量。<br />
	　　整型常量：可分为int型和long型两种，缺省为int型，long型数值后加L。 整型常量可用10、8和16进制表示。<br />
	　　如：123（十进制） 052（八进制） 0x3c（十六进制）<br />
	　　浮点数常量：有单精度和双精度之分，缺省为双精度，单精度在数值后加f。另外，浮点数常量也可用普通计数法和科学计数法来表示。<br />
	　　如：1.23f 1.1E-2<br />
	　　字符常量：用&#39; &#39;括起来的一个字符。如&#39;a&#39;，&#39;H&#39;。<br />
	　　使用16位的unicode字符集。<br />
	　　Java 语言可使用转义字符&#39;\&#39;来标记特殊字符。如&#39;\n&#39;表示换行符。<br />
	　　字符串常量用&quot; &quot;包括，如&quot;Hello World&quot;。<br />
	　　布尔常量只有两个值，true和false。<br />
	　　分隔符<br />
	　　分隔符起分隔单词符号的作用。包括分号&quot;;&quot;、花括号&quot;{}&quot;和空白符号。<br />
	　　Java的注释<br />
	　　Java的注释有三种形式：<br />
	　　单行注释<br />
	　　如：//Comment on one line<br />
	　　多行注释<br />
	　　如：/* Comment on one<br />
	　　or more lines */<br />
	　　文档注释<br />
	　　如：/** Document<br />
	　　Comment */<br />
	　　Java的数据类型和变量<br />
	　　Java的基本数据类型<br />
	　　Java的基本数据类型有8种，见下表：<br />
	　　数据类型 类别 宽度（位） 取值范围<br />
	　　boolean 逻辑型 1 true/false<br />
	　　char 文字型 16<br />
	　　byte 整数类型 8 -27 ~ 27-1<br />
	　　short 整数类型 16 -215 ~ 215-1<br />
	　　int 整数类型 32 -231 ~ 231-1<br />
	　　long 整数类型 64 -263 ~ 263-1<br />
	　　float 浮点型 32<br />
	　　double 浮点型 64<br />
	　　Java的变量<br />
	　　Java的变量在使用前必须声明。如 int radios, color;<br />
	　　Java为所有基本数据类型的变量作了预定义(预设置的值)。如<br />
	　　类型名 boolean char byte short int long float double<br />
	　　预置值 false &#39;\u0000&#39; (byte)0 (short)0 0 0L 0.0f 0.0<br />
	　　数据类型的转换<br />
	　　Java是一种强类型的语言，在赋值和参数传递时，都要求类型的匹配。类型转换有三种情况：自动转换、强制转换和使用类的方法转换。<br />
	　　自动转换：往往低精度类型到高精度类型能自动转换。<br />
	　　如： byte b1=10, b2=20；<br />
	　　int b3=b1+b2；<br />
	　　强制转换：高精度类型到低精度类型必须强制转换。这时数据可能会丢失部分信息。<br />
	　　如：char key=(char)(12+55) //变量key被赋值为unicode值为67的字符&#39;c&#39;<br />
	　　方法转换：如<br />
	　　String str = &quot;123&quot;;<br />
	　　int a = Integer.parseInt(str);<br />
	　　使用Integer类的方法parseInt将String转换为对应的整数。<br />
	　　Java编程的习惯约定<br />
	　　为了提高程序的可读性，Sun公司推荐在Java编程时使用以下的习惯约定：<br />
	　　类名（classes）：有一个或若干个名词组成，开头大写，名词间的区分也用大写，其他小写。<br />
	　　如：class AccountBook<br />
	　　class ComplexVariable<br />
	　　接口（Interfaces）：规则同类名。<br />
	　　如：Interface Account<br />
	　　方法（methods）： 由一个或多个动词组成，开头小写，动词间区分用大写，其他小写。<br />
	　　如：balanceAccount()<br />
	　　变量：小写字母开头，单词间用大写字母分隔<br />
	　　如：currentCustomer<br />
	　　常量：所有字母大写，单词间用下划线区分<br />
	　　如：MAXIMUM_SIZE<br />
	　　Java的操作符<br />
	　　根据操作对象的个数操作符可分为一元、二元或三元操作符。根据操作符的功能，又可分为算术、逻辑、关系等操作符。<br />
	　　算术操作符<br />
	　　一元： + - ++ --<br />
	　　二元： + - * / %<br />
	　　值得注意的是 ++ 和-- 操作符，<br />
	　　如：int a，x=1，y=5；<br />
	　　a = ++x；b=y++；<br />
	　　此时a的值为2（先加1，后赋值），b的值为5（先赋值，后加1）。<br />
	　　二元操作符两侧的操作对象数据类型不同时，先自动进行类型转换，再进行操作。</p>
<p>
	赋值操作符与复合赋值操作符<br />
	　　可将 变量 = 变量 op 表达式<br />
	　　写成 变量 op = 表达式<br />
	　　如：x+=20 与 x=x+20 结果一致，但更简洁。<br />
	　　注意：= 与 = = 的不同。<br />
	　　位操作符和移位操作符<br />
	　　位操作符<br />
	　　&amp;（按位与） |（按位或） ^（按位异或）<br />
	　　移位操作符<br />
	　　E&lt;<n 2=""><br />
	　　E&gt;&gt;n 右移n位，空位用原最高位的位值补足，相当于E/2<br />
	　　E&gt;&gt;&gt;n 右移n位，空位补0<br />
	　　关系操作符<br />
	　　关系操作符共六个：<br />
	　　&gt;（大于） &gt;=（大于等于） &lt;（小于）&lt;=（小于等于） !=（不等于） = =（相等）<br />
	　　关系操作符的结果为boolean型数据（true或false）。<br />
	　　注：= = 操作符只有在比较双方均完全一致时，其值为true，如比较的是两个对象，即使两个对象的内容相同，结果也为false，<br />
	　　只有这两个对象为同一对象时才为true。<br />
	　　逻辑操作符<br />
	　　逻辑操作符的操作对象和结果均为boolean型，共六个：<br />
	　　！（逻辑非） &amp;&amp; （逻辑与） ||（逻辑或）<br />
	　　^（逻辑并或） &amp; （逻辑与） | （逻辑或）<br />
	　　按位与&#39;&amp;&#39;也可作为逻辑与使用，但未作优化，而&#39;&amp;&amp;&#39;操作符是经过优化的。对&#39;|&#39;操作符也类似。<br />
	　　其他操作符<br />
	　　条件操作符 E1?E2:E3<br />
	　　表达式E1若成立，执行表达式E2，否则执行E3。<br />
	　　逗号操作符<br />
	　　&quot;,&quot;可用于分隔语句。<br />
	　　如 int x,y;<br />
	　　for (x=0,y=0;x&lt;10;x++) {...};<br />
	　　操作符的优先级和结合规则<br />
	　　优先级：<br />
	　　一元 〉算术 〉移位 〉关系 〉按位 〉逻辑 〉三元 〉（复合）赋值 〉逗号<br />
	　　结合规则：<br />
	　　除一元、三元和赋值操作符是自右至左结合外，其他均自左至右结合。<br />
	　　语句的分类<br />
	　　Java语句按是否改变运行的状态可分为执行语句(如表达式语句)和非执行语句(如声明语句)。任何语句的末尾都以&ldquo;；&rdquo;结束。<br />
	　　执行语句按其组成可分三类：<br />
	　　空语句<br />
	　　只有一个语句结束符&ldquo;；&rdquo; ，无任何内容。<br />
	　　基本语句（单语句）<br />
	　　独立的、完整的不能再分割为更小的可执行单元。<br />
	　　复合语句（块语句）<br />
	　　包含在{ }内的一条或若干条语句。<br />
	　　Java的基本语句的结构可分为4类：<br />
	　　（1）顺序结构语句 （2）分支语句 （3）循环语句 （4）例外处理语句<br />
	　　后三种语句又称为流控制语句，我们将主要介绍分支语句和循环语句，而例外处理语句包括try、catch、finally以及throw语句。<br />
	　　这些语句是Java所特有的。我们将在后面作专门的介绍。<br />
	　　分支语句<br />
	　　分支语句包括if-else, break, switch, return等语句。分支语句提供了一种控制机制，使得程序可以跳过一些语句，转去执行特定的语句。<br />
	　　条件语句 if-else.<br />
	　　if-else语句根据判定条件的真假来执行两种操作中的一种,其格式为:<br />
	　　if (boolean-expression)<br />
	　　statement1;<br />
	　　else<br />
	　　statement2;<br />
	　　其中，要注意的有：<br />
	　　布尔表达式boolean-expression是任意一个返回布尔型数据的表达式(这比C、C++的限制要严格)。<br />
	　　每个单一的语句后都必须有分号。<br />
	　　语句statement1, statement2可以是复合语句，这时要用花括号{}。{}外面不加分号。<br />
	　　else子句是任选的。<br />
	　　若布尔表达式的值为true，则程序执行statement1，否则执行statement2。<br />
	　　if-else语句的一种特殊形式为:<br />
	　　if (expression1){<br />
	　　statement1<br />
	　　} else if (expression2){<br />
	　　statement2<br />
	　　}&hellip;&hellip;<br />
	　　}else if (expressionN){<br />
	　　statementN<br />
	　　}<br />
	　　else子句不能单独作为语句使用，它必须和if配对使用。else总是与离它最近的if配对。可以通过使用花括号{}来改变配对关系。<br />
	　　例3.1: 比较两个数的大小,并按从小到大的次序输出。</n></p>
<p>
	public class CompareTwo{<br />
	　　public static void main (String args[]){<br />
	　　double d1=23.4;<br />
	　　double d2=35.1;<br />
	　　if (d2＞=d1)<br />
	　　System.out.println(d2+&quot;＞=&quot;+d1);<br />
	　　else<br />
	　　System.out.println(d1+&quot;＞=&quot;+d2);<br />
	　　}<br />
	　　}<br />
	　　例3.2：判断某一年是否为闰年。<br />
	　　闰年的条件是符合下面二者之一: ①能被4整除,但不能被100整除; ②能被400整除。<br />
	　　public class LeapYear{<br />
	　　public static void main (String args[]){<br />
	　　int year=1989; //method1<br />
	　　if ((year%4==0 &amp;&amp; year0!=0) || (year@0==0))<br />
	　　System.out.println(year+&quot;is a leap year.&quot;);<br />
	　　else<br />
	　　System.out.println(year+&quot;is not a leap year.&quot;);<br />
	　　year=2000; //method2<br />
	　　boolean leap;<br />
	　　if (year%4 != 0)<br />
	　　leap=false;<br />
	　　else if (year0 != 0)<br />
	　　leap=true;<br />
	　　else if (year@0 != 0)<br />
	　　leap=false;<br />
	　　else<br />
	　　leap=true;<br />
	　　if(leap==true)<br />
	　　System.out.println(year+&quot; is a leap year.&quot;);<br />
	　　else<br />
	　　System.out.println(year+&quot;is not a leap year.&quot;);<br />
	　　}<br />
	　　}<br />
	　　该例中，方法1用一个逻辑表达式包含了所有的闰年条件，方法2使用了if-else语句的特殊形式。<br />
	　　多分支语句switch<br />
	　　switch语句是一种多分支选择语句，它可根据switch中表达式的值，来执行多个操作中的一个，它的一般格式如下：<br />
	　　switch (expression){<br />
	　　case value1: statement1;<br />
	　　break;<br />
	　　case value2: statement2;<br />
	　　break;<br />
	　　&hellip;&hellip;&hellip;&hellip;<br />
	　　case valueN: statemendN;<br />
	　　break;<br />
	　　[default: defaultStatement;]<br />
	　　}<br />
	　　表达式expression可以返回任一简单类型的值(如整型、字符型)，多分支语句把表达式返回的值与每个case子句中的值（一个常量）相比。<br />
	　　如果匹配成功，则执行该case子句后的语句序列。<br />
	　　default子句是任选的。当表达式的值与任一case子句中的值都不匹配时，程序执行default后面的语句。如果表达式的值与任一case子句<br />
	　　中的值都不匹配且没有default子句，则程序不做任何操作，直接跳出switch语句。<br />
	　　break语句用来在执行完一个case分支后，使程序跳出switch语句，即终止switch语句的执行。<br />
	　　switch语句的功能可以用if-else来实现，但在某些情况下，使用switch语句更简炼，且程序的执行效率提高。<br />
	　　例3.3 根据考试成绩的等级打印出百分制分数段。<br />
	　　public class GradeLevel {<br />
	　　public static void main(String args[]){<br />
	　　System.out.println(&quot;\nOutPut is:&quot;);<br />
	　　char grade=&#39;C&#39;; //normal use<br />
	　　switch (grade){<br />
	　　case &#39;A&#39;: System.out.println(grade+&quot;is 85～100&quot;);<br />
	　　break;<br />
	　　case &#39;B&#39;: System.out.println(grade+&quot;is 70～84&quot;);<br />
	　　break;<br />
	　　case &#39;C&#39;: System.out.println(grade+&quot;is 60～69&quot;);<br />
	　　break;<br />
	　　case &#39;D&#39;: System.out.println(grade+&quot;is ＜60&quot;);<br />
	　　break;<br />
	　　default: System.out.println(&quot;inputerror&quot;);<br />
	　　}<br />
	　　}<br />
	　　}<br />
	　　break语句<br />
	　　在switch语中，break语句用来终止switch语句的执行。使程序在switch语句后的第一个语句开始执行。<br />
	　　在Java中，可以为每个代码块加一个括号。一个代码块通常是用花括号{}括起来的一段代码。加标号的格式如下:<br />
	　　BlockLabel: {codeBlock}<br />
	　　break语句的第二种使用情况就是跳出它所指定的块，并从紧跟该块的第一条语句处执行。其格式为: break BlockLabel;<br />
	　　例如:<br />
	　　a: {&hellip;&hellip; //标记代码块a<br />
	　　b: {&hellip;&hellip; //标记代码块b<br />
	　　c: {&hellip;&hellip; //标记代码块c<br />
	　　break a;<br />
	　　&hellip;&hellip;//will not be executed<br />
	　　}<br />
	　　&hellip;&hellip;//will not be executed<br />
	　　}<br />
	　　&hellip;&hellip;//will not be executed<br />
	　　}<br />
	　　&hellip;&hellip; //execute from here<br />
	　　与C、C++不同, Java中没有goto语句来实现任意的跳转, 因为goto语句破坏程序的可读性, 而且影响编译的优化。Java用break来实现goto语句所特有的一些功能。<br />
	　　返回语句return<br />
	　　return语句用于从当前执行的方法中退出, 并返回到调用该方法的语句处继续程序的执行。返回语句有两种格式:<br />
	　　return expression<br />
	　　返回一个值给调用该方法的语句, 返回值的数据类型必须与方法声明中的返回值类型一致。可以使用强制类型转换来使类型一致。<br />
	　　return<br />
	　　当方法说明中用void声明返回类型为空时, 可以使用这种格式, 它不返回任何值。不带参数的return语句有时可省略。<br />
	　　return语句通常用在一个方法体的最后。<br />
	　　循环语句<br />
	　　循环语句包括 while, do-while, for, continue 等语句。循环语句的作用是反复执行一段代码，直到满足循环终止条件为止，<br />
	　　一个循环一般应包括四部分内容：<br />
	　　初始化部分(initialization): 用来设置循环的一些初始条件，计数器清零等。<br />
	　　循环体部分(body): 这是反复循环的一段代码，可以是单一的一条语句，也可以是复合语句。<br />
	　　迭代部分(iteration): 这是在当前循环结束，下一次循环开始前执行的语句，常常用来使计数器加1或减1。<br />
	　　终止部分(termination): 通常是一个布尔表达式，每一次循环要对该表达式求值，以验证是否满足循环终止条件。<br />
	　　下面分别介绍Java中的while语句，do-while语句和for语句。<br />
	　　while语句<br />
	　　while语句的一般格式为：<br />
	　　[初始化]<br />
	　　while (条件表达式E){<br />
	　　语句S; //循环体<br />
	　　}<br />
	　　当条件表达式E的值为true时，循环执行花括号中的语句S。S中包括迭代部分。<br />
	　　while语句首先计算条件表达式E是否成立，当条件成立(true)时，才去执行循环中的语句。所以有可能循环体一次也不执行。<br />
	　　do-while语句<br />
	　　do-while语句的一般格式为:<br />
	　　[初始化]<br />
	　　do {<br />
	　　语句S; //循环体<br />
	　　} while (条件表达式E);<br />
	　　do-while语句首先执行循环体, 然后再计算终止条件, 若结果为true, 则循环执行语句S, 直到条件表达式E的结果为false。<br />
	　　与while语句不同的是, do-while语句的循环体至少执行一次。</p>
<p>
	&nbsp;</p>
<p>
	　for语句<br />
	　　for语句的一般格式为:<br />
	　　for (初始表达式; 条件表达式; 迭代表达式) {<br />
	　　语句S; //循环体<br />
	　　}<br />
	　　for语句执行时，首先执行初始化操作，然后判断终止条件是否满足，如果满足，则执行循环体中的语句，最后执行迭代部分。<br />
	　　完成一次循环后，重新判断终止条件。<br />
	　　可以在for语句的初始化部分声明变量，它的作用域为整个for语句。<br />
	　　for语句通常用来执行循环次数确定的情况(如对数组元素进行操作)。<br />
	　　在初始化部分和迭代部分可以使用逗号语句来分隔多个操作。例如:<br />
	　　for (i=0,j=10; i＜j; i++,j--) {<br />
	　　&hellip;&hellip;<br />
	　　}<br />
	　　continue语句<br />
	　　continue语句用来结束本次循环, 跳过循环体中下面尚未执行的语句, 接着进行终止条件的判断, 以决定是否继续循环。<br />
	　　也可以用continue跳转到括号指明的外层循环中,这时的格式为<br />
	　　continue outerLable;<br />
	　　例3.4：下例分别用while、do-while和for语句实现累计求和。<br />
	　　public class Sum{<br />
	　　public static void main(String args[]){<br />
	　　System.out.println(&quot;\n**while statement**&quot;);<br />
	　　int n=10,sum=0; ∥initialization<br />
	　　while (n＞0){ ∥termination<br />
	　　sum+=n; ∥body<br />
	　　n--; ∥iteration<br />
	　　}<br />
	　　System.out.println(&quot;sum is&quot;+sum);<br />
	　　System.out.println(&quot;\n**do_while statement**&quot;);<br />
	　　n=0; ∥initialization<br />
	　　sum=0;<br />
	　　do{<br />
	　　sum+=n; ∥body<br />
	　　n++; ∥iteration<br />
	　　} while(n＜=10); ∥termination<br />
	　　System.out.println(&quot;sum is&quot;+sum);<br />
	　　System.out.println(&quot;\n**for statement**&quot;);<br />
	　　sum=0;<br />
	　　for (int i=1;i＜=10;i++){<br />
	　　sum+=i;<br />
	　　}<br />
	　　System.out.println(&quot;sum is&quot;+sum);<br />
	　　}<br />
	　　}<br />
	　　可以从中来比较这三种循环语句,从而在不同的场合选择合适的语句。<br />
	　　数组<br />
	　　数组是有序数据的集合, 数组中的每个元素具有相同的类型。数组名和下标可唯一地确定数组中的元素。数组可分为一维数组和多维数组。<br />
	　　一维数组<br />
	　　声明方式：<br />
	　　type arrayName[];<br />
	　　或 type[] arrayName;<br />
	　　type可以是Java中任意的数据类型, arrayName为数组名。<br />
	　　如: int intArray[];<br />
	　　声明了一个名为intArray的整型数组, 数组中的每个元素为int型数据。<br />
	　　Java在数组的声明中并不为数组元素分配内存, 因此 [ ] 中不用指出数组中元素个数, 即数组长度。<br />
	　　在访问数组的任何元素之前，我们必须为它分配内存空间, 这可用new操作符, 其格式如下：<br />
	　　arrayName = new type[arraySize];<br />
	　　其中，arraySize指明数组的长度。<br />
	　　如: intArray = new int[3]; 为该数组分配了3个int型整数所需的内存空间。<br />
	　　通常, 这两部分可以合在一起, 格式如下:<br />
	　　type arrayName[] = new type[arraySize];<br />
	　　如: int intArray[] = new int[3];<br />
	　　用new操作符为数组分配内存空间后，就可以引用数组中的每一个元素。数组元素的引用方式为: arrayName[index]<br />
	　　其中: index为数组下标，它可以为整型常数或表达式。如a[3], b(i为整型), c[6*I]等。下标从0开始, 一直到数组的长度减1。<br />
	　　对于上面例子中的intArray数组来说，它有3个元素，分别为:<br />
	　　intArray[0], intArray[1], intArray[2]。（注意: 没有intArray[3]。）<br />
	　　另外，与C、C++中不同，Java对数组元素要进行越界检查以保证安全性。同时，对于每个数组都有一个属性length指明它的长度。<br />
	　　例如: intArray.length指明数组intArray的长度。<br />
	　　数组的初始化<br />
	　　对数组元素可以按照上述的例子进行赋值。也可以在定义数组的同时进行初始化。<br />
	　　如: int a[]={1,2,3,4,5};<br />
	　　用逗号(,)分隔数组的各个元素，系统自动为数组分配一定的内存空间。<br />
	　　例3.5：数组的使用：<br />
	　　public class ArrayTest{<br />
	　　public static void main(String args[]){<br />
	　　int i;<br />
	　　int a[]=new int[5];<br />
	　　for (i=0;i＜5;i++)<br />
	　　a=i;<br />
	　　for (i=a.length-1;i＞=0;i--)<br />
	　　System.out.println(&quot;a[&quot;+i+&quot;]=&quot;+a);<br />
	　　}<br />
	　　}<br />
	　　多维数组<br />
	　　与C、C++一样, Java中多维数组可被看作数组的数组。例如二维数组就可看成是一个特殊的一维数组, 该数组的每个元素又是一个一维数组。下面我们主要以二维数组为例来说明多维数组。<br />
	　　二维数组的声明方式如下:<br />
	　　type arrayName[][];<br />
	　　如: int intArray[][];<br />
	　　与一维数组一样,这时对数组元素也没有分配内存空间，同要使用运算符new来分配内存,然后才可以访问每个元素。<br />
	　　对二维数组中每个元素，引用方式为:<br />
	　　arrayName[index1][index2]<br />
	　　其中index1、index2为下标, 可为整型常数或表达式, 如a[2][3]等。数组每一维的下标也都从0开始。<br />
	　　在声明二维数组的同时也可对它进行初始化。<br />
	　　如:int a[][]={{2,3},{1,5},{3,4}};<br />
	　　定义了一个3&times;2的数组,并对每个元素赋值。<br />
	　　数组的越界<br />
	　　如果使用数组分量时，其下标超过规定的值，则会发生数组的越界。这时，虽然程序能通过编译，但在运行时会产生一个名为ArrayIndexOutOfBoundsException 的例外，所以编程时要注意检查数组下标。</p>
]]></description>
			<link>http://www.phpd.cn/archives/228/</link>
			<category domain="http://www.phpd.cn/category/android/">android/java/iphone</category>
			<category domain="http://www.phpd.cn/tag/%E8%AF%AD%E6%B3%95/">语法</category>
			<category domain="http://www.phpd.cn/tag/java/">java</category>
			<pubDate>Wed, 11 Aug 2010 09:41:46 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/227/</link>
			<guid>http://www.phpd.cn/archives/227/</guid>
			<title>通过php web方式更新服务器svn[新]</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	主要的功能为二点：1、签出svn，2、更新svn;</p>
<p>
	需事前注意：apache或是nginx+php 用户要有svn程序执行的权限，如果没有的话，就需要通过visudo进行sudo授权，让apache用户（例www-data）可以执行svn程序</p>
<p>
	visudo文件最后加上：（意思：sudo无需输入密码可执行/usr/bin/svn命令）<br />
	www-data ALL = NOPASSWD:/usr/bin/svn</p>
<p>
	界面：</p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=309" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/a74cfba332402b9f84db5d4e3d1b0649.png" border="0" alt="1.png&#13;&#13;大小: 1.53 K&#13;尺寸: 404 x 159&#13;浏览: 10 次&#13;点击打开新窗口浏览全图" width="404" height="159" /></a></div></p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=310" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/thumb_d91f77071009ea1921f3ade8161628e1.png" border="0" alt="2.png&#13;&#13;大小: 3.79 K&#13;尺寸:  x &#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="500" height="155" /></a></div></p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=311" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/thumb_c607e68ec57dd4871c772e3e5d017d5b.png" border="0" alt="3.png&#13;&#13;大小: 2.92 K&#13;尺寸:  x &#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="500" height="145" /></a></div></p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=312" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/thumb_2fb35de93264552ed6e4374c141af207.png" border="0" alt="4.png&#13;&#13;大小: 2.85 K&#13;尺寸:  x &#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="500" height="203" /></a></div></p>
<p>
	&nbsp;</p>
<p>
	<span style="color: rgb(0,0,128)"><strong>注意:如果通过visudo的方式让apache等执行svn命令，则下面的php代码中的svn 需改成sudo svn .....<br />
	</strong></span></p>
<pre class="brush:php;">
&lt;?php
//author 冻番茄 www.phpd.cn
session_start();
//echo $_SERVER[&#39;REQUEST_URI&#39;];
//print_r($_SERVER);
//location.reload();

function update(){
	echo &#39;&lt;h2&gt;svn update ...&lt;/h2&gt;&#39;;
	//echo &quot;svn up --username {$_SESSION[&#39;username&#39;]} --password {$_SESSION[&#39;password&#39;]} &quot;;
	$hl=popen(&quot;svn up --username {$_SESSION[&#39;username&#39;]} --password {$_SESSION[&#39;password&#39;]} &quot;,&quot;r&quot;);
	$read=stream_get_contents($hl);
	echo &quot;&lt;pre&gt;&quot;;
	printf($read);
	echo &quot;&lt;/pre&gt;&quot;;
	pclose($hl);
}

function co($url,$username,$password){
	echo &#39;&lt;h2&gt;svn checkout ...&lt;/h2&gt;&#39;;
	$command=&quot;svn co $url --username {$_SESSION[&#39;username&#39;]} --password {$_SESSION[&#39;password&#39;]} &quot;.$_SERVER[&#39;DOCUMENT_ROOT&#39;];
	exec($command);
	echo &#39;checkout Success!&#39;;
}
if(isset($_POST[&#39;sub&#39;]) &amp;&amp; $_POST[&#39;sub&#39;]==&quot;登录&quot;){
	if($_POST[&#39;password&#39;]==&quot;7279915&quot;){
		$_SESSION[&#39;login&#39;]=true;
		echo &#39;&lt;script&gt;location.href=&quot;&#39;.$_SERVER[&#39;PHP_SELF&#39;].&#39;&quot;;&lt;/script&gt;&#39;;
	}else{
		echo &#39;&lt;script&gt;alert(&quot;PASSWORD ERROR&quot;);location.href=&quot;&#39;.$_SERVER[&#39;PHP_SELF&#39;].&#39;&quot;;&lt;/script&gt;&#39;;
	}
	exit;
}elseif(isset($_POST[&#39;sub&#39;]) &amp;&amp; $_POST[&#39;sub&#39;]==&#39;执行&#39;){
	if(empty($_POST[&#39;username&#39;]) || empty($_POST[&#39;password&#39;])){
		echo &#39;&lt;script&gt;alert(&quot;SVN服务器的用户名或是密码不能为空&quot;);location.href=&quot;?a=update&quot;;&lt;/script&gt;&#39;;
	}else{
		$_SESSION[&#39;username&#39;]=$_POST[&#39;username&#39;];
		$_SESSION[&#39;password&#39;]=$_POST[&#39;password&#39;];
		echo &#39;&lt;script&gt;location.href=&quot;?a=update&quot;;&lt;/script&gt;&#39;;
	}
	exit;
}

if(isset($_GET[&#39;a&#39;]) &amp;&amp; $_GET[&#39;a&#39;]==&#39;logout&#39;){
	unset($_SESSION[&#39;login&#39;]);
	unset($_SESSION[&#39;username&#39;]);
	unset($_SESSION[&#39;password&#39;]);
	echo &#39;&lt;script&gt;location.href=&quot;?a=co&quot;;&lt;/script&gt;&#39;;
	exit;
}

?&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;title&gt;svn更新 | Author:常州亚萌 冻番茄&lt;/title&gt;
&lt;style&gt;
*{ margin:0px; padding:0px; font-size:12px;font-family:Arial,Helvetica,sans-serif}
a:link,a:visited,a:active{ color:#5A5A5A; text-decoration:none;font-size:14px;}
a:hover{ color:#33A9D0; text-decoration:none;}
.login{margin:0px auto;margin-top:200px;border:1px solid #666600;width:300px;height:90px;background:#FFFFD0}
input{border:1px solid #666600;background:#fff;width:160px;padding:3px;}
.in1{border:1px solid #666600;background:#fff;width:120px;padding:2px;font-size:9px;}
.run{margin:20px auto;;width:700px;height:90px}
h2{padding-bottom:8px;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
if(!isset($_SESSION[&#39;login&#39;])){
?&gt;
&lt;div class=&quot;login&quot;&gt;
	&lt;FORM METHOD=POST ACTION=&quot;&quot;&gt;
	&lt;div style=&quot;font-size:14px;margin:10px;border-bottom:1px solid #666600;padding-bottom:10px;text-align:center&quot;&gt;svn更新操作 [管理员登录]&lt;/div&gt;
	&lt;div style=&quot;margin:10px;clear:both;text-align:center&quot;&gt;&lt;INPUT TYPE=&quot;password&quot; NAME=&quot;password&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;INPUT TYPE=&quot;submit&quot; name=&quot;sub&quot; value=&quot;登录&quot; style=&quot;width:70px;height:25px;&quot;&gt;&lt;/div&gt;
	&lt;/FORM&gt;
&lt;/div&gt;
&lt;?php
}else{	
?&gt;
&lt;div class=&quot;run&quot;&gt;
	&lt;div style=&quot;font-size:14px;margin:10px;border-bottom:1px solid #666600;padding-bottom:10px;&quot;&gt; [&lt;a href=&quot;?a=update&quot;&gt;svn刷新/upload&lt;/a&gt;] [&lt;a href=&quot;?a=co&quot;&gt;svn签出/checkout&lt;/a&gt;]  [&lt;a href=&quot;/svn.php?a=logout&quot;&gt;退出&lt;/a&gt;]&lt;/div&gt;
	&lt;div style=&quot;margin:10px;clear:both;&quot;&gt;
		&lt;?php
			if(isset($_GET[&#39;a&#39;]) &amp;&amp; $_GET[&#39;a&#39;]==&#39;update&#39;){
				if(!isset($_SESSION[&#39;username&#39;]) || !isset($_SESSION[&#39;password&#39;])){
					echo &#39;&lt;FORM METHOD=POST ACTION=&quot;&quot;&gt;
							&lt;h2&gt;SVN更新操作&lt;/h2&gt;
							&lt;div&gt;svn用户名：&lt;INPUT TYPE=&quot;text&quot; NAME=&quot;username&quot; class=&quot;in1&quot;&gt;
								svn密码：&lt;INPUT TYPE=&quot;password&quot; NAME=&quot;password&quot; class=&quot;in1&quot;&gt;
								&lt;INPUT TYPE=&quot;submit&quot; name=&quot;sub&quot; value=&quot;执行&quot; style=&quot;width:70px;background:#eee&quot; class=&quot;in1&quot;&gt;
							&lt;/div&gt;
						&lt;/FORM&gt;&#39;;
				}else{
					update();
				}
			}elseif(isset($_GET[&#39;a&#39;]) &amp;&amp; $_GET[&#39;a&#39;]==&#39;co&#39;){
				if(isset($_POST[&#39;sub&#39;]) &amp;&amp; $_POST[&#39;sub&#39;]==&#39;签出&#39;){
					if(empty($_POST[&#39;username&#39;]) || empty($_POST[&#39;password&#39;]) || empty($_POST[&#39;svn&#39;]) ){
						echo &#39;&lt;script&gt;alert(&quot;签出的svn地址、用户名、密码不能为空&quot;);location.href=&quot;?a=co&quot;;&lt;/script&gt;&#39;;
					}else{
						$_SESSION[&#39;username&#39;]=$_POST[&#39;username&#39;];
						$_SESSION[&#39;password&#39;]=$_POST[&#39;password&#39;];
						co($_POST[&#39;svn&#39;]);
					}
					exit;
				}
				echo &#39;&lt;FORM METHOD=POST ACTION=&quot;&quot;&gt;
							&lt;h2&gt;SVN签出操作 &lt;注：已签出的项目，第二次签出无效！&gt;&lt;/h2&gt;
							&lt;div&gt;svn地址：&lt;INPUT TYPE=&quot;text&quot; NAME=&quot;svn&quot; class=&quot;in1&quot; value=&quot;svn://&quot;&gt;
								svn用户名：&lt;INPUT TYPE=&quot;text&quot; NAME=&quot;username&quot; class=&quot;in1&quot;&gt;
								svn密码：&lt;INPUT TYPE=&quot;password&quot; NAME=&quot;password&quot; class=&quot;in1&quot;&gt;
								&lt;INPUT TYPE=&quot;submit&quot; name=&quot;sub&quot; value=&quot;签出&quot; style=&quot;width:70px;background:#eee&quot; class=&quot;in1&quot;&gt;
							&lt;/div&gt;
						&lt;/FORM&gt;&#39;;
			}else{
				echo &#39;欢迎进入svn更新程序！Author:冻番茄&lt;br /&gt;&#39;;
			}
		?&gt;
		&lt;div style=&quot;clear:both;height:10px&quot;&gt;&lt;/div&gt;
	&lt;/div&gt;
	
&lt;/div&gt;
&lt;?php
}
?&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>
	源代码下载：<a href="http://www.phpd.cn/attachment.php?id=313" title="svn.php&#13;&#13;大小:4.73 K, 下载次数:9" target="_blank">svn.php</a></p>
]]></description>
			<link>http://www.phpd.cn/archives/227/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<category domain="http://www.phpd.cn/tag/svn/">svn</category>
			<category domain="http://www.phpd.cn/tag/php/">php</category>
			<pubDate>Tue, 10 Aug 2010 11:08:10 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/226/</link>
			<guid>http://www.phpd.cn/archives/226/</guid>
			<title>快速开发一个PHP扩展 [转heiyeluren]</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	本文通过非常快速的方式讲解了如何制作一个PHP 5.2 环境的扩展（PHP Extension），希望能够在图文的方式下让想快速学习的朋友了解一下制作过程。</p>
<p>
	<br />
	<strong>需求：</strong>比如开发一个叫做 heiyeluren&nbsp; 的扩展，扩展里就一个函数 heiyeluren_test()，输入一个字符串，函数返回：Your input string: xxxxx。<br />
	<strong>要求：</strong>了解C/C++编程，熟悉PHP编程<br />
	<strong>环境：</strong>下载一份php对应版本的源码，我这里是 php-5.2.6，先正常安装php，假设我们的php安装在 /usr/local/php 目录，源码在 /root/soft/php/php-5.2.6/，现在开始！</p>
<p>
	<br />
	<strong style="font-size: 12pt;"><font color="#993300">步骤一：生成扩展框架</font></strong></p>
<p>
	<br />
	<font color="#993300">cd /root/soft/php/php-5.2.6/ext<br />
	./ext_skel --extname=heiyeluren<br />
	cd /root/soft/php/php-5.2.6/ext/heiyeluren<br />
	vi config.m4<br />
	</font>打开文件后去掉 dnl ，获得下面的信息：<br />
	<font color="#008000">PHP_ARG_ENABLE(heiyeluren, whether to enable heiyeluren support,<br />
	[&nbsp; --enable-heiyeluren&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable heiyeluren support])</font><br />
	保存退出.<br />
	(图01)<br />
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165857032.p.gif" /></p>
<p>
	&nbsp;</p>
<p>
	&nbsp;</p>
<p style="font-size: 12pt;">
	<strong><font color="#993300">第二步：编写代码<br />
	</font></strong><br />
	<font color="#993300">vi php_heiyeluren.h</font><br />
	找到：PHP_FUNCTION(confirm_heiyeluren_compiled); ，新增一行：<br />
	<font color="#008000">PHP_FUNCTION(heiyeluren_test);</font><br />
	保存退出。<br />
	(图02)<br />
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165900735.p.gif" /></p>
<p>
	<br />
	<font color="#993300">vi heiyeluren.c</font><br />
	数组里增加我们的函数，找到 zend_function_entry heiyeluren_functions[]，增加：<br />
	<font color="#008000">PHP_FE(heiyeluren, NULL)</font><br />
	(图03)</p>
<p>
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165922423.p.gif" /></p>
<p>
	&nbsp;</p>
<p>
	再到 heiyeluren.c 文件最后面增加如下代码：<br />
	<font color="#008000">PHP_FUNCTION(heiyeluren_test)<br />
	{<br />
	&nbsp;&nbsp;&nbsp; char *arg = NULL;<br />
	&nbsp;&nbsp;&nbsp; int arg_len, len;<br />
	&nbsp;&nbsp;&nbsp; char *strg;</font></p>
<p>
	<font color="#008000">&nbsp;&nbsp;&nbsp; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &quot;s&quot;, &amp;arg, &amp;arg_len) == FAILURE) {<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
	&nbsp;&nbsp;&nbsp; }</font></p>
<p>
	<font color="#008000">&nbsp;&nbsp;&nbsp; len = spprintf(&amp;strg, 0, &quot;Your input string: %s\n&quot;, arg);<br />
	&nbsp;&nbsp;&nbsp; RETURN_STRINGL(strg, len, 0);<br />
	}<br />
	</font>保存退出。<br />
	(图04)</p>
<p>
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165923111.p.gif" /></p>
<p>
	&nbsp;</p>
<p>
	&nbsp;</p>
<p>
	&nbsp;</p>
<p>
	<strong style="font-size: 12pt;"><font color="#993300">第三步：编译安装<br />
	</font></strong><br />
	<font color="#993300">cd /root/soft/php/php-5.2.6/ext/heiyeluren<br />
	/usr/local/php/bin/phpize<br />
	./configure --with-php-config=/usr/local/php/bin/php-config<br />
	make<br />
	make test<br />
	make install</font></p>
<p>
	现在看看是不是有个 /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/heiyeluren.so<br />
	编辑php.ini，把扩展加入进去：<br />
	<font color="#993300">vi /usr/local/php/lib/php.ini</font><br />
	在[PHP]模块下增加：<br />
	<font color="#008000">extension = heiyeluren.so</font><br />
	保存退出。<br />
	(图05)</p>
<p>
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165923783.p.gif" /></p>
<p>
	&nbsp;</p>
<p>
	注意：如果你不存在扩展文件目录，或者安装报错，那么可以自行建立这个目录，然后把扩展拷贝到目录下，然后记得把 php.ini 文件中的 extension_dir 修改为该目录：<br />
	<font color="#008000">extension_dir = &quot;/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/&quot;</font><br />
	(图06)</p>
<p>
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165926408.p.gif" /></p>
<p>
	&nbsp;</p>
<p>
	&nbsp;</p>
<p>
	<strong style="font-size: 12pt;"><font color="#993300">第四步：检查安装结果<br />
	</font></strong>现在看看模块加载了没有：<br />
	/usr/local/php/bin/php -m，应该会打印出：<br />
	<font color="#008000">[PHP Modules]<br />
	...<br />
	heiyeluren<br />
	...<br />
	[Zend Modules]</font></p>
<p>
	<br />
	然后重启apache，输出 phpinfo() ，应该能够看到：<br />
	<font color="#008000">heiyeluren<br />
	heiyeluren support enabled</font><br />
	(图07)</p>
<p>
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165930064.p.gif" /></p>
<p>
	&nbsp;</p>
<p>
	看看函数是否存在并且调用，在web目录下建立：heiyeluren.php<br />
	<font color="#008000">&lt;?php<br />
	echo &quot;&lt;pre&gt;&quot;;<br />
	print_r(get_loaded_extensions());<br />
	print_r(get_extension_funcs(&#39;heiyeluren&#39;));<br />
	echo heiyeluren_test(&#39;My first php extension&#39;);<br />
	echo &quot;&lt;/pre&gt;&quot;;<br />
	?&gt;</font><br />
	访问apache，应该能够看到：<br />
	<font color="#008000">Array<br />
	(<br />
	&nbsp;&nbsp;&nbsp; ...<br />
	&nbsp;&nbsp;&nbsp; [33] =&gt; heiyeluren<br />
	)<br />
	Array<br />
	(<br />
	&nbsp;&nbsp;&nbsp; [0] =&gt; confirm_heiyeluren_compiled<br />
	&nbsp;&nbsp;&nbsp; [1] =&gt; heiyeluren_test<br />
	)<br />
	Your input string: heiyeluren<br />
	</font>(图08)</p>
<p>
	<img src="http://album.hi.csdn.net/app_uploads/heiyeshuwu/20081205/165847016.p.gif" /></p>
<p>
	<br />
	扩展制作成功！</p>
]]></description>
			<link>http://www.phpd.cn/archives/226/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<category domain="http://www.phpd.cn/tag/php%E6%89%A9%E5%B1%95/">php扩展</category>
			<pubDate>Mon, 09 Aug 2010 16:39:19 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/225/</link>
			<guid>http://www.phpd.cn/archives/225/</guid>
			<title>新写的一个.net小程序，用于批量搜索源码内容</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	主要是解决在工作中，有些需要在大批量的源文件或是html中搜索文本中包括一些关键词的操作。比如搜索全部的html，查找出哪个文章被挂了马，又比如说查看一个开源软件源码时，要找到一个函数定义所在文件。有了这个小软件，就方便多了</p>
<p>
	目前是第一版只支持utf-8编码，过段时间，加上编码转换功能，就可以支持其它编码了！编码只在搜索中文时有影响，英文不受影响</p>
<p>
	<strong>程序截图</strong></p>
<p>
	<div class="attach"><a href="http://www.phpd.cn/attachment.php?id=307" target="_blank"><img src="http://www.phpd.cn/attachments/date_201008/thumb_598e5943024e06e8c2da055c78457804.png" border="0" alt="txtsearch.png&#13;&#13;大小: 21.68 K&#13;尺寸:  x &#13;浏览: 4 次&#13;点击打开新窗口浏览全图" width="500" height="426" /></a></div></p>
<p>
	<strong>程序下载</strong></p>
<p>
	<a href="http://www.phpd.cn/attachment.php?id=308" title="txtsearch.zip&#13;&#13;大小:10.07 K, 下载次数:12" target="_blank">txtsearch.zip</a></p>
]]></description>
			<link>http://www.phpd.cn/archives/225/</link>
			<category domain="http://www.phpd.cn/category/c/">C/C++/C#</category>
			<category domain="http://www.phpd.cn/category/show/">我的作品</category>
			<category domain="http://www.phpd.cn/category/log/">随心日志</category>
			<category domain="http://www.phpd.cn/tag/txtsearch/">txtsearch</category>
			<category domain="http://www.phpd.cn/tag/.net/">.net</category>
			<category domain="http://www.phpd.cn/tag/c%23/">c#</category>
			<pubDate>Wed, 04 Aug 2010 14:28:19 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/224/</link>
			<guid>http://www.phpd.cn/archives/224/</guid>
			<title>刚写的的php生成树的类 [读一次数据库，支持无限分类]</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	从数据库中一次性读取全部的分类信息，然后将由php生成树，支持无限分类，采用的方式是父值，容易理解，效率比起其它类似左右值的无限分类，当类别过多时可能效率要差些！</p>
<pre class="brush:sql;">
CREATE TABLE IF NOT EXISTS `membercat` (
  `mcid` int(10) NOT NULL auto_increment COMMENT &#39;会员分类ID号&#39;,
  `mcname` varchar(255) NOT NULL COMMENT &#39;分类名称&#39;,
  `fid` int(10) default NULL COMMENT &#39;父ID号&#39;,
  `rank` int(10) default NULL COMMENT &#39;级别&#39;,
  `mcorder` int(10) NOT NULL COMMENT &#39;排序&#39;,
  PRIMARY KEY  (`mcid`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=&#39;个人会员分类表&#39; AUTO_INCREMENT=13 ;

--
-- 导出表中的数据 `membercat`
--

INSERT INTO `membercat` (`mcid`, `mcname`, `fid`, `rank`, `mcorder`) VALUES
(1, &#39;平面设计&#39;, 0, 1, 1),
(2, &#39;UI设计&#39;, 0, 1, 2),
(3, &#39;CG/动画&#39;, 0, 1, 3),
(4, &#39;工业设计&#39;, 0, 1, 4),
(5, &#39;建筑/环境&#39;, 0, 1, 5),
(7, &#39;2222&#39;, 2, 2, 6),
(8, &#39;1111&#39;, 2, 2, 9),
(9, &#39;3333&#39;, 7, 3, 8),
(10, &#39;4444&#39;, 4, 2, 10),
(11, &#39;5555&#39;, 3, 2, 11),
(12, &#39;asdasd&#39;, 8, 3, 12);
</pre>
<p>
	php类</p>
<pre class="brush:php;">
&lt;?php
class getMemberCat
{
	public $c=array();
	public $arr=&#39;&#39;;

	public function __construct()
	{
		$membercat_=db(&#39;membercat&#39;);
		if($cat=$membercat_-&gt;order(&quot;mcorder&quot;)-&gt;findAll()){
			foreach($cat as $v){
				$this-&gt;c[$v[&#39;rank&#39;]][]=$v;
			}
			for($s=0;$s&lt;count($this-&gt;c[1]);$s++){
				$this-&gt;arr[]=array(&#39;name&#39;=&gt;$this-&gt;c[1][$s][&#39;mcname&#39;],&#39;mcid&#39;=&gt;$this-&gt;c[1][$s][&#39;mcid&#39;]);
				$this-&gt;get($this-&gt;c[1][$s][&#39;mcid&#39;],2);
			}
		}
		return $this-&gt;arr;
	}

	public function get($fid,$j)
	{
		$px=&quot;&quot;;
		for($x=1;$x&lt;$j;$x++){
			$px.=&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot;;
		}
		$px=empty($px)?&quot;&quot;:$px.&quot;└--&quot;;
		
		for($i=0;$i&lt;count($this-&gt;c[$j]);$i++){
			if($this-&gt;c[$j][$i][&#39;fid&#39;]==$fid){
				$this-&gt;arr[]=array(&#39;name&#39;=&gt;$px.$this-&gt;c[$j][$i][&#39;mcname&#39;],&#39;mcid&#39;=&gt;$this-&gt;c[$j][$i][&#39;mcid&#39;]);
				$this-&gt;get($this-&gt;c[$j][$i][&#39;mcid&#39;],$j+1);
			}
		}
		
	}
}
$mCat=new getMemberCat();
foreach($mCat-&gt;arr as $v){
	echo $v[&#39;name&#39;].&#39;&lt;br /&gt;&#39;;
}
?&gt;</pre>
<p>
	最终显示结果：</p>
<p>
	平面设计<br />
	UI设计<br />
	&nbsp;&nbsp;&nbsp;&nbsp;└--2222<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└--3333<br />
	&nbsp;&nbsp;&nbsp;&nbsp;└--1111<br />
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└--asdasd<br />
	CG/动画<br />
	&nbsp;&nbsp;&nbsp;&nbsp;└--5555<br />
	工业设计<br />
	&nbsp;&nbsp;&nbsp;&nbsp;└--4444<br />
	建筑/环境</p>
]]></description>
			<link>http://www.phpd.cn/archives/224/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<category domain="http://www.phpd.cn/tag/%E6%A0%91/">树</category>
			<comments>http://www.phpd.cn/archives/224/#comments</comments>
			<pubDate>Wed, 28 Jul 2010 14:34:19 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/223/</link>
			<guid>http://www.phpd.cn/archives/223/</guid>
			<title>RESTful，在不用session的情况下做用户认证</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	最近在研究restful,在restful协议中，强调不使用session，但可以少量使用cookie。以保持restful的无状态性。</p>
<p>
	但是在实际使用中，有一个最大的问题，就是当应用需要用户登陆认证时，应该怎么处理。</p>
<p>
	在这里我的处理方法主要是把用户登陆后，把用户名+密码+ip地址+最后更新时间通过一个可逆加密后做为token，写入cookie,然后在需要认证的应用时，由php等程序读取cookie中的token，并把用户名、密码、ip地址及最后更新时间解密出来。</p>
<p>
	先判断时间是否过期，过期的话，清除cookie，要求重新登陆！</p>
<p>
	再判断cookie中的ip是否与当前客户端ip一致，如果不等，要求重新登陆。</p>
<p>
	时间和ip都通过的话，则把用户名、密码做判断，判断是否正确，正确的话，把用户基本信息存在一全局变量中！</p>
<p>
	做后续应用，同时把生成新的token(主要是时间)写入cookie。</p>
<p>
	这样的话就解决了三个问题</p>
<p>
	第一、时效，cookie有一个生存时间、同时在token中也存储时间，方便让令牌失效;</p>
<p>
	第二、解决了cookie欺骗问题，因为token记录了客户端的ip地址;</p>
<p>
	第三、解决了安全问题，采用可逆加密，就算得到token在没有解密key的情况下也无法破解得用户名及密码。</p>
<p>
	&nbsp;</p>
<p>
	还有一个情况，同时把token保存到服务器，这样更容易控制！但是把东西记录到服务器的话，其实它不就是session了么，伪session而以，所以还是不建议这么用！</p>
]]></description>
			<link>http://www.phpd.cn/archives/223/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<pubDate>Wed, 21 Jul 2010 09:20:40 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/222/</link>
			<guid>http://www.phpd.cn/archives/222/</guid>
			<title>昨天把博客升级成了sablog 2.0</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>
	08年使用小a的sablog 1.6博客程序就一直没有改变过，现在都2010年了，应该有些变化了，所以就把博客升级到了2.0，以后，第一个感觉就是后台更清爽了。</p>
<p>
	升级到2.0后，因为url有所变化，0为了不影响百度里的文章收录，用.htaccess做了301转向。</p>
<p>
	<br />
	新博客新气象，嘿嘿，以后要我写些东西发上去了，同时也诚招同类博客的友情链接！</p>
]]></description>
			<link>http://www.phpd.cn/archives/222/</link>
			<category domain="http://www.phpd.cn/category/my/">图片/文字</category>
			<comments>http://www.phpd.cn/archives/222/#comments</comments>
			<pubDate>Wed, 21 Jul 2010 09:06:53 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/221/</link>
			<guid>http://www.phpd.cn/archives/221/</guid>
			<title>今天开始，撤掉gg的广告</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>gg的广告放了挺长时间的，但一直没有去看有多少收入，今天看了下，基本为零，所以还是决定撤掉好了。</p>]]></description>
			<link>http://www.phpd.cn/archives/221/</link>
			<category domain="http://www.phpd.cn/category/my/">图片/文字</category>
			<category domain="http://www.phpd.cn/tag/%E5%B9%BF%E5%91%8A/">广告</category>
			<pubDate>Tue, 20 Jul 2010 16:01:33 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/220/</link>
			<guid>http://www.phpd.cn/archives/220/</guid>
			<title>诚征博客友情链接咯</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>本博PR3</p>
<p>开博二年多了，现诚征友情链接。</p>
<p>要求如下：</p>
<p>博客类网站</p>
<p>pr不限，但必须是常更新的,有独立顶级域名的并且不是商业性质的</p>
<p>当然最好的就是像php\web\开发\设计类的博客链接！</p>
<p>℃冻番茄's Blog&nbsp; <a href="http://www.phpd.cn">http://www.phpd.cn</a></p>]]></description>
			<link>http://www.phpd.cn/archives/220/</link>
			<category domain="http://www.phpd.cn/category/my/">图片/文字</category>
			<category domain="http://www.phpd.cn/tag/%E5%8F%8B%E6%83%85%E9%93%BE%E6%8E%A5/">友情链接</category>
			<pubDate>Fri, 16 Jul 2010 09:37:38 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/219/</link>
			<guid>http://www.phpd.cn/archives/219/</guid>
			<title>今天给xpad加上了QQ机器人功能</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>感谢 <a href="http://im.jecat.cn/demo/">http://im.jecat.cn/demo/</a>&nbsp;提供的开源qq机器人程序</p>
<p>今天把qq机器人整到我的xpad应用中去了，但因为qq机器人程序运行在美国的vps上，xpad运行在新浪的sae上。所以速度有些迟缓。</p>
<p>新给xpad加的qq机器人，用户注册xpad后，直接在后台进行绑定qq号操作，然后添加机器人的qq号为好友，就可以使用xpad便捷的qq机器人服务了。</p>
<p><a href="http://xpad.sinaapp.com">http://xpad.sinaapp.com</a></p>
<p>&nbsp;</p><p><strong>6.png</strong><br /><a href="http://www.phpd.cn/attachment.php?id=305" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/d26321a098a5735987125e018b1c5508.png" border="0" alt="6.png&#13;&#13;大小: 13.18 K&#13;尺寸: 370 x 270&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="370" height="270" /></a></p><p><strong>5.png</strong><br /><a href="http://www.phpd.cn/attachment.php?id=304" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/f17728dbf04fcf8c5ce0fe5fc052a60a.png" border="0" alt="5.png&#13;&#13;大小: 10.18 K&#13;尺寸: 353 x 205&#13;浏览: 0 次&#13;点击打开新窗口浏览全图" width="353" height="205" /></a></p><p><strong>4.png</strong><br /><a href="http://www.phpd.cn/attachment.php?id=303" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/d9c2eaf3ecd853001404e2fe8d9d17e1.png" border="0" alt="4.png&#13;&#13;大小: 10.79 K&#13;尺寸: 333 x 196&#13;浏览: 1 次&#13;点击打开新窗口浏览全图" width="333" height="196" /></a></p><p><strong>3.png(缩略图)</strong><br /><a href="http://www.phpd.cn/attachment.php?id=302" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/thumb_b1762a706546d1193ad1ad41751b9ff4.png" border="0" alt="3.png&#13;&#13;大小: 74.68 K&#13;尺寸: 421 x 500&#13;浏览: 7 次&#13;点击打开新窗口浏览全图" width="421" height="500" /></a></p><p><strong>2.png(缩略图)</strong><br /><a href="http://www.phpd.cn/attachment.php?id=301" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/thumb_af51005196f1f639a4f0bb245d94f8b3.png" border="0" alt="2.png&#13;&#13;大小: 150.92 K&#13;尺寸: 500 x 374&#13;浏览: 14 次&#13;点击打开新窗口浏览全图" width="500" height="374" /></a></p><p><strong>1.png(缩略图)</strong><br /><a href="http://www.phpd.cn/attachment.php?id=300" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/thumb_0dd6bd532cad2f4dce13520171ce9ed2.png" border="0" alt="1.png&#13;&#13;大小: 37.98 K&#13;尺寸: 500 x 269&#13;浏览: 20 次&#13;点击打开新窗口浏览全图" width="500" height="269" /></a></p>]]></description>
			<link>http://www.phpd.cn/archives/219/</link>
			<category domain="http://www.phpd.cn/category/show/">我的作品</category>
			<category domain="http://www.phpd.cn/tag/qq%E6%9C%BA%E5%99%A8%E4%BA%BA/">qq机器人</category>
			<category domain="http://www.phpd.cn/tag/xpad/">xpad</category>
			<comments>http://www.phpd.cn/archives/219/#comments</comments>
			<pubDate>Wed, 14 Jul 2010 17:35:50 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/218/</link>
			<guid>http://www.phpd.cn/archives/218/</guid>
			<title>firefox poster不能上传文件，测试文件方面还得用curl</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p><font size="2"><div class="attach"><a href="http://www.phpd.cn/attachment.php?id=299" target="_blank"><img src="http://www.phpd.cn/attachments/date_201007/thumb_d34806dfb53ce5a13446ac6ee30b3c8a.png" border="0" alt="白.png&#13;&#13;大小: 29.15 K&#13;尺寸:  x &#13;浏览: 11 次&#13;点击打开新窗口浏览全图" width="500" height="341" /></a></div></font></p>
<p><font size="2">没法上传，把Content Type设为multipart/form-data也一样无效，不知道是不是bug,google上也没找到解释。</font></p>
<p><font size="2">所以测试上传只能靠curl了，但是curl的cookie挺麻烦的，现在把我测试文件上传的命令发到博客里，希望有用得上的朋友借鉴。</font></p>
<p><font size="2">第一条是登陆，获取session，把PHPSESSID的cookie存入cookie33.txt</font></p>
<p><font size="2">curl -X POST -d &quot;username=admin&amp;password=admin&quot; &quot;http://localhost:88/?m=index&amp;a=ajaxlogin&quot; -D cookie33.txt </font></p>
<p><font size="2">第二条是进入一个受session保护的页面，-b获取发送cookie到服务器，-c重新写入新cookie操作，得到session授权，从而准许打开页面</font></p>
<p><font size="2">curl </font><font size="2">&quot;http://localhost:88/?m=main&quot; -b cookie33.txt -c cookie33.txt</font></p>
<p><font size="2">第三条是把文件上传到一个受session保护的页面-F是上传文件</font></p>
<p><font size="2">curl -F &quot;file=@a.jpg&quot; &quot;localhost:88/?m=main&amp;a=upload&quot; -b cookie33.txt -c cookie33.txt</font></p>]]></description>
			<link>http://www.phpd.cn/archives/218/</link>
			<category domain="http://www.phpd.cn/category/php/">PHP</category>
			<pubDate>Fri, 09 Jul 2010 10:12:34 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/217/</link>
			<guid>http://www.phpd.cn/archives/217/</guid>
			<title>vps中把nginx换回apache了</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>因为经常需要做网站演示，基本上都有.htaccess的，没办法，只好换回apache了！</p>]]></description>
			<link>http://www.phpd.cn/archives/217/</link>
			<category domain="http://www.phpd.cn/category/my/">图片/文字</category>
			<category domain="http://www.phpd.cn/tag/vps/">vps</category>
			<pubDate>Mon, 05 Jul 2010 17:16:55 +0000</pubDate>
		</item>
		<item>
			<link>http://www.phpd.cn/archives/216/</link>
			<guid>http://www.phpd.cn/archives/216/</guid>
			<title>用firefox Poster来调试RESTful开发</title>
			<author>(xzy)</author>
			<description><![CDATA[℃冻番茄's Blog ( http://www.phpd.cn/ ) : <p>最近在弄RESTful，调试起来比较麻烦，因为普通浏览器不好发送指定的http请求。所以需要使用其它工具</p>
<p>之前用curl，感觉比较麻烦，字符界面，要记命令！</p>
<p>今天在firefox里找到一个好用的插件，可以很方便的发送HTTP各种请求：post get put delete等。</p>
<p>下载页面</p>
<p>https://addons.mozilla.org/zh-CN/firefox/addon/2691</p>]]></description>
			<link>http://www.phpd.cn/archives/216/</link>
			<category domain="http://www.phpd.cn/category/my/">图片/文字</category>
			<pubDate>Fri, 02 Jul 2010 13:54:22 +0000</pubDate>
		</item>
	</channel>
</rss>
