<?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>勇者无疆</title>
	<atom:link href="http://xingchexian.com/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://xingchexian.com/blog</link>
	<description>Just Go Along the way of Life</description>
	<lastBuildDate>Tue, 07 Sep 2010 08:13:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>最近想明白一点事儿</title>
		<link>http://xingchexian.com/blog/?p=254</link>
		<comments>http://xingchexian.com/blog/?p=254#comments</comments>
		<pubDate>Tue, 07 Sep 2010 07:26:28 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[人生]]></category>
		<category><![CDATA[意义]]></category>
		<category><![CDATA[生活]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=254</guid>
		<description><![CDATA[今天中午的时候，有点感慨这一年来发生的林林总总的事件。比如换工作、拒掉别人的邀请还有工作以外的一些烦心事儿，又想想现在自己的境况，不免有些焦虑。可是也始终明白，焦虑是没有什么作用的。
人生应该以什么为目标，要追求什么东西，一味的以物质为最终目标吗?
刚和小宝通了电话，说了30岁之前最好安安稳稳的。我想也许这样才是一个适合我的状态。壁立千仞，无欲则刚。不要被外界过多的东西所迷惑了，抓紧时间充实自己，眼界再放的广一点重点深入两个领域，而不是被一些技术性的细节羁绊，工作上的事情，需要更有前瞻性、全局性，这样才能有更好的发展。
加油！
]]></description>
			<content:encoded><![CDATA[<p>今天中午的时候，有点感慨这一年来发生的林林总总的事件。比如换工作、拒掉别人的邀请还有工作以外的一些烦心事儿，又想想现在自己的境况，不免有些焦虑。可是也始终明白，焦虑是没有什么作用的。</p>
<p>人生应该以什么为目标，要追求什么东西，一味的以物质为最终目标吗?</p>
<p>刚和小宝通了电话，说了30岁之前最好安安稳稳的。我想也许这样才是一个适合我的状态。壁立千仞，无欲则刚。不要被外界过多的东西所迷惑了，抓紧时间充实自己，眼界再放的广一点重点深入两个领域，而不是被一些技术性的细节羁绊，工作上的事情，需要更有前瞻性、全局性，这样才能有更好的发展。</p>
<p>加油！</p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=254</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP开源Apache日志分析工具收集与比较</title>
		<link>http://xingchexian.com/blog/?p=253</link>
		<comments>http://xingchexian.com/blog/?p=253#comments</comments>
		<pubDate>Tue, 07 Sep 2010 07:00:56 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Log]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=253</guid>
		<description><![CDATA[我们知道已经有很多像Awtstat这样的使用perl、c或者c++开发的强大的日志分析工具，但是同样也有很多使用PHP开发并且开源的日志分析软件，今天我就收集了一些与大家分享。
1、LogAnalyzer
LogAnalyzer是 Adiscon的监控软件产品线中的一部分。可以再Windows以及Unix环境下运行。LogAnalyzer本是是免费的，GPL许可的产品。
LogAnalyzer的原名为phpLogCon，他在2010年的3月29日发布了3.0的稳定版，并且正式改名为LogAnalyzer。
程序运行必须有他们制定的数据支持，在Windows环境下， 可以使用MonitorWare Agent、WinSysLog、EventReport。在Linux环境下可以使用rsyslog。现在Yum的源中包含了rsyslog这款软件，源中的版本是3.22.1，官方的最高版本是4.6.4的稳定版以及6.1.0的开发版。
由于不能使用原生的数据进行分析，我觉得算是他的一个缺点。
2、Jawstats
 
这是一款基于Awstat的PHP开源程序，提供了非常漂亮的分析统计结果的展示界面，支持中文。他的作者是 Jon Come。
JAWStats可以减轻AWStats的计算压力，同时安装非常简单，只要稍微修改一下配置文件就可以运行。配置项也可以非常简单。
JAWStats的使用界面也非常人性化，因为作者原来是一个UI工程师。在系统中，我们可以非常容易的在不同月份之间切换，还可以在不同站点的日志之间进行切换。也可以通过Web界面来进行分析数据的更新，正好切合我们的需求，只在需要看的时候出报表就好了。
JAWStats支持主题，可以进行主题的设计和切换。
总的来说，看完了JAWStats的介绍，觉得是比较推荐的一款产品。
3、Web Analytics. Open Source
一款GPL协议下的开源软件，界面和数据获取方式都是模仿GA的，对于小型站点的分析应该不错。有对于Wordpress和Mediawiki的统计支持。
4、Log Miner
LogMiner是一个分析Apache或者IIS日志，或者其他支持 combined 或者 W3C扩展日志格式的服务器。能够提取并展示包括访问量、点击、流量、请求数、访问路径、浏览器和操作系统在内的诸多指标。数据存储采用的是PostgreSQL，存储比较精简。
Log Miner开发的灵感源自于流行的 Webalizer ，但是有一些主要的不同：
使用关系型数据库作为后端数据存储，实时生成报表。而 Webalizer 则是生成 html 文件。基于DBMS数据库的方式能够随时提供不同形式的数据，但是日志文件的解析速度上不如 Webalizer。
Webalizer只保存最近12个月的数据，之前的数据则无法再查看。
Webalizer的报告结果是硬编码的，而Logminer则是每个报告对应一个PHP类，我们可以灵活的进行定义。
LogMiner提供了比Webalizer更多的报表，比如操作系统和访问路径。

5、Webalizer
Webalizer虽然不是PHP的，但是上面LogMiner总是拿这个作比较，就顺便说一下。用C写成，日志分析能力非常出众，采用HTML的报表展示形式，是一个非常流行的日志分析工具。
6、TraceWatch
一个PHP+Mysql的日志分析工具，界面不太喜欢，好像就是路径分析比较有特点，其他的感觉还有点慢，就没什么了。
&#160;
其他还有一些不太知名的工具，就没有一一细看：
AudiStat、SlimStat、Piwik
结合看到的这些工具，针对我们单位的实际需求，感觉 Awstat + JAWStats 组合更为好一点。因为日志会收集到单独的日志服务器上，所以性能上的消耗也就不会在意了。接下来看看实际的效果吧。
PS：刚才看AWS的文档，看到一个对比，可能对于特性的了解能够更加的一目了然。
 
Technorati 标签: 日志,Apache,Log,PHP,开源
参考资料：
1、CrunchTools     2、LogAnalyzer     3、Jawstats     4、Awstat     5、Web Analytics . Open Source   [...]]]></description>
			<content:encoded><![CDATA[<p>我们知道已经有很多像Awtstat这样的使用perl、c或者c++开发的强大的日志分析工具，但是同样也有很多使用PHP开发并且开源的日志分析软件，今天我就收集了一些与大家分享。</p>
<p>1、LogAnalyzer</p>
<p>LogAnalyzer是 <a href="http://www.monitorware.com/" target="_blank">Adiscon的监控软件产品线</a>中的一部分。可以再Windows以及Unix环境下运行。LogAnalyzer本是是免费的，GPL许可的产品。</p>
<p>LogAnalyzer的原名为phpLogCon，他在2010年的3月29日发布了3.0的稳定版，并且<a href="http://loganalyzer.adiscon.com/news" target="_blank">正式改名为LogAnalyzer</a>。</p>
<p>程序运行必须有他们制定的数据支持，在Windows环境下， 可以使用<a href="http://www.monitorware.com/" target="_blank">MonitorWare Agent</a>、<a href="http://www.winsyslog.com/" target="_blank">WinSysLog</a>、<a href="http://www.eventreporter.com/" target="_blank">EventReport</a>。在Linux环境下可以使用<a href="http://www.rsyslog.com/" target="_blank">rsyslog</a>。现在Yum的源中包含了rsyslog这款软件，源中的版本是3.22.1，官方的最高版本是4.6.4的稳定版以及6.1.0的开发版。</p>
<p>由于不能使用原生的数据进行分析，我觉得算是他的一个缺点。</p>
<p>2、Jawstats</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/09/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://xingchexian.com/blog/wp-content/uploads/2010/09/image_thumb.png" width="531" height="246" /></a> </p>
<p>这是一款基于Awstat的PHP开源程序，提供了非常漂亮的分析统计结果的展示界面，支持中文。他的作者是 <a href="http://joncom.be/" target="_blank">Jon Come</a>。</p>
<p>JAWStats可以减轻AWStats的计算压力，同时安装非常简单，只要稍微修改一下配置文件就可以运行。配置项也可以非常简单。</p>
<p>JAWStats的使用界面也非常人性化，因为作者原来是一个UI工程师。在系统中，我们可以非常容易的在不同月份之间切换，还可以在不同站点的日志之间进行切换。也可以通过Web界面来进行分析数据的更新，正好切合我们的需求，只在需要看的时候出报表就好了。</p>
<p>JAWStats支持主题，可以进行主题的设计和切换。</p>
<p>总的来说，看完了JAWStats的介绍，觉得是比较推荐的一款产品。</p>
<p>3、Web Analytics. Open Source</p>
<p>一款GPL协议下的开源软件，界面和数据获取方式都是模仿GA的，对于小型站点的分析应该不错。有对于Wordpress和Mediawiki的统计支持。</p>
<p>4、Log Miner</p>
<p>LogMiner是一个分析Apache或者IIS日志，或者其他支持 combined 或者 W3C扩展日志格式的服务器。能够提取并展示包括访问量、点击、流量、请求数、访问路径、浏览器和操作系统在内的诸多指标。数据存储采用的是PostgreSQL，存储比较精简。</p>
<p>Log Miner开发的灵感源自于流行的 Webalizer ，但是有一些主要的不同：</p>
<blockquote><p>使用关系型数据库作为后端数据存储，实时生成报表。而 Webalizer 则是生成 html 文件。基于DBMS数据库的方式能够随时提供不同形式的数据，但是日志文件的解析速度上不如 Webalizer。</p>
<p>Webalizer只保存最近12个月的数据，之前的数据则无法再查看。</p>
<p>Webalizer的报告结果是硬编码的，而Logminer则是每个报告对应一个PHP类，我们可以灵活的进行定义。</p>
<p>LogMiner提供了比Webalizer更多的报表，比如操作系统和访问路径。</p>
</blockquote>
<p>5、Webalizer</p>
<p>Webalizer虽然不是PHP的，但是上面LogMiner总是拿这个作比较，就顺便说一下。用C写成，日志分析能力非常出众，采用HTML的报表展示形式，是一个非常流行的日志分析工具。</p>
<p>6、TraceWatch</p>
<p>一个PHP+Mysql的日志分析工具，界面不太喜欢，好像就是路径分析比较有特点，其他的感觉还有点慢，就没什么了。</p>
<p>&#160;</p>
<p>其他还有一些不太知名的工具，就没有一一细看：</p>
<p><a href="http://adubus.free.fr/audistat/" target="_blank">AudiStat</a>、<a href="http://slimstat.net/" target="_blank">SlimStat</a>、<a href="http://www.oschina.net/p/piwik" target="_blank">Piwik</a></p>
<p>结合看到的这些工具，针对我们单位的实际需求，感觉 Awstat + JAWStats 组合更为好一点。因为日志会收集到单独的日志服务器上，所以性能上的消耗也就不会在意了。接下来看看实际的效果吧。</p>
<p>PS：刚才看AWS的文档，看到一个对比，可能对于特性的了解能够更加的一目了然。</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/09/image1.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://xingchexian.com/blog/wp-content/uploads/2010/09/image_thumb1.png" width="654" height="1781" /></a> </p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:462b425e-cdcc-4ba5-99d6-87bf1ab061cf" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/%e6%97%a5%e5%bf%97" rel="tag">日志</a>,<a href="http://technorati.com/tags/Apache" rel="tag">Apache</a>,<a href="http://technorati.com/tags/Log" rel="tag">Log</a>,<a href="http://technorati.com/tags/PHP" rel="tag">PHP</a>,<a href="http://technorati.com/tags/%e5%bc%80%e6%ba%90" rel="tag">开源</a></div>
<p>参考资料：</p>
<p>1、<a href="http://crunchtools.com/" target="_blank">CrunchTools</a>     <br />2、<a href="http://loganalyzer.adiscon.com/" target="_blank">LogAnalyzer</a>     <br />3、<a href="http://www.jawstats.com/" target="_blank">Jawstats</a>     <br />4、<a href="http://www.awstats.org/" target="_blank">Awstat</a>     <br />5、<a href="http://www.openwebanalytics.com/" target="_blank">Web Analytics . Open Source</a>     <br />6、<a href="http://logminer.sourceforge.net/" target="_blank">Log Miner</a>     <br />7、<a href="http://www.mrunix.net/webalizer/" target="_blank">Webalizer</a>     <br />8、<a href="http://www.tracewatch.com/" target="_blank">TraceWatch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=253</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ajax应用中CKEDITOR多实例问题的解决</title>
		<link>http://xingchexian.com/blog/?p=250</link>
		<comments>http://xingchexian.com/blog/?p=250#comments</comments>
		<pubDate>Sat, 04 Sep 2010 05:28:00 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ckeditor]]></category>
		<category><![CDATA[icontentWindow]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=250</guid>
		<description><![CDATA[著名的Fckeditor升级之后就改名叫了CKEDITOR，界面和功能有了很大的提升，所以我在最近的项目中应用CKEDITOR。随着项目的深入，在Ajax应用较多的一个部分使用CKEDITOR时发现了问题，描述如下：
通过单击一个链接，调入需要显示的内容，其中包括一个富文本编辑器，这里使用了CKEDITOR。第一次调入时，一切正常。噩梦从第二次开始，在Firefox3.5+中，第二次的时候提示 i.contentWindow is null ，而在IE系列中则是一些模糊的错误提示。
出现这个问题后，分析的方向一直集中在CKEDITOR多实例的问题。因为第一次点击链接，调用内容时，已经进行了一次CKEDITOR的实例化，第二次调入时必然会与第一次的冲突。查阅了CKEDITOR的样例资料，试了下面的方法：
if( editor ){
&#160; editor.destroy();
&#160; editor = null;
}
editor = CKEDITOR.replace(‘content’);

但是没有用，问题依然发生。后来google之，得到了目前可以正常解决这个问题的方法
if( CKEDITOR.instances['content'] ){      &#160;&#160;&#160; CKEDITOR.remove(CKEDITOR.instances['content']);       } 
&#160;
CKDEITOR.replace(‘content’);

应用了这个方法之后，不管是多少次调用，都不会再发生错误，应该就是正确的解决方法了，但是可惜的是在CKEDITOR的官方文档和论坛中均为看到相关的说明，遗憾…
Technorati 标签: Ajax,CKEDITOR,instance
参考资料：
1、CKEDITOR
2、CKEDITOR instance already exists
]]></description>
			<content:encoded><![CDATA[<p>著名的Fckeditor升级之后就改名叫了CKEDITOR，界面和功能有了很大的提升，所以我在最近的项目中应用CKEDITOR。随着项目的深入，在Ajax应用较多的一个部分使用CKEDITOR时发现了问题，描述如下：</p>
<p>通过单击一个链接，调入需要显示的内容，其中包括一个富文本编辑器，这里使用了CKEDITOR。第一次调入时，一切正常。噩梦从第二次开始，在Firefox3.5+中，第二次的时候提示 i.contentWindow is null ，而在IE系列中则是一些模糊的错误提示。</p>
<p>出现这个问题后，分析的方向一直集中在CKEDITOR多实例的问题。因为第一次点击链接，调用内容时，已经进行了一次CKEDITOR的实例化，第二次调入时必然会与第一次的冲突。查阅了CKEDITOR的样例资料，试了下面的方法：</p>
<blockquote><p>if( editor ){</p>
<p>&#160; editor.destroy();</p>
<p>&#160; editor = null;</p>
<p>}</p>
<p>editor = CKEDITOR.replace(‘content’);</p>
</blockquote>
<p>但是没有用，问题依然发生。后来google之，得到了目前可以正常解决这个问题的方法</p>
<blockquote><p>if( CKEDITOR.instances['content'] ){      <br />&#160;&#160;&#160; CKEDITOR.remove(CKEDITOR.instances['content']);       <br />} </p>
<p>&#160;</p>
<p>CKDEITOR.replace(‘content’);</p>
</blockquote>
<p>应用了这个方法之后，不管是多少次调用，都不会再发生错误，应该就是正确的解决方法了，但是可惜的是在CKEDITOR的官方文档和论坛中均为看到相关的说明，遗憾…</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2188020c-7155-4698-8b3f-763075d434f2" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/Ajax" rel="tag">Ajax</a>,<a href="http://technorati.com/tags/CKEDITOR" rel="tag">CKEDITOR</a>,<a href="http://technorati.com/tags/instance" rel="tag">instance</a></div>
<p>参考资料：</p>
<p>1、<a href="http://www.ckeditor.com" target="_blank">CKEDITOR</a></p>
<p>2、<a href="http://stackoverflow.com/questions/1794219/ckeditor-instance-already-exists" target="_blank">CKEDITOR instance already exists</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=250</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用MapabcAPI实现基于浏览器的地理定位</title>
		<link>http://xingchexian.com/blog/?p=249</link>
		<comments>http://xingchexian.com/blog/?p=249#comments</comments>
		<pubDate>Mon, 30 Aug 2010 16:36:43 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[mapabc]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=249</guid>
		<description><![CDATA[现在互联网中有了越来越多的地理位置服务，正在制定中的HTML5规范也试图在浏览器中内置嵌入地理位置共享服务，而且幸运的是，我们已经能够在Firefox 3.5+、Chrome 5.0+、Opera 10.60+、Safari 5.0+ 以及一些移动终端，注入IPhone、Android上使用这项服务，那么这个服务能否有Mapabc的API结合，来实现用户的地理定位呢？
传统上，地图应用上为用户定位的方式一般是：
用户访问时获得用户的IP。      用这个IP到IP库中匹配用户的城市信息。       根据获取的城市信息去已有的城市中心点字典中进行匹配。       匹配完成后将用户地图的中心点进行相应的切换。 

这个过程繁琐，而且准确性极大程度上依赖于我们IP库的准确程度。现在有了浏览器的位置共享服务，我们可以更容易的实现用户的地理定位。
Geolocation对象介绍
正如开头所讲的，到目前为止，W3C中deGeolocation API规范已经在非IE的浏览中得到了实现。规范中提到，浏览器提供位置信息的来源是不固定的，可能是GPS、也可能来自于IP地址、RFID、WiFi、蓝牙或者GSM\CDMA的定位信息，也不保证返回的结果一定准确。Geolocation的API同时对“只获得一次”定位和“持续监督”定位都做出了规定。
Geolocation的一些方法
Geolocation对象位于浏览器Navigator对象下，可以通过 navigator.geolcation 来访问，不支持 geolocation 的浏览器不会包含这一对象，不会造成错误，可以用来做浏览器的区分。
if ( navigator.geolcation ){
&#160;&#160;&#160; alert(‘ Your Browser dosent support geolcocation &#8216;);
} else{
&#160;&#160;&#160; alert(‘ Your Browser support geolocation’);
}

在访问 geolocation 对象时，浏览器会进行提示，询问用户使用许可对网站提供位置服务，得到用户的许可后，访问才会继续，否则会被停止。而且，我们可以捕捉到用户同意或者拒绝的事件。
在获得用户的学科之后，就可以利用Geolocation获取当前位置，核心方法如下：
navigator.geolocation.getCurrentPosition( getPositionSuccess , getPositionError );

上面的代码中，调用了 getCurrentPosition [...]]]></description>
			<content:encoded><![CDATA[<p>现在互联网中有了越来越多的地理位置服务，正在制定中的HTML5规范也试图在浏览器中内置嵌入地理位置共享服务，而且幸运的是，我们已经能够在Firefox 3.5+、Chrome 5.0+、Opera 10.60+、Safari 5.0+ 以及一些移动终端，注入IPhone、Android上使用这项服务，那么这个服务能否有Mapabc的API结合，来实现用户的地理定位呢？</p>
<p>传统上，地图应用上为用户定位的方式一般是：</p>
<blockquote><p>用户访问时获得用户的IP。      <br />用这个IP到IP库中匹配用户的城市信息。       <br />根据获取的城市信息去已有的城市中心点字典中进行匹配。       <br />匹配完成后将用户地图的中心点进行相应的切换。 </p>
</blockquote>
<p>这个过程繁琐，而且准确性极大程度上依赖于我们IP库的准确程度。现在有了浏览器的位置共享服务，我们可以更容易的实现用户的地理定位。</p>
<p><strong>Geolocation对象介绍</strong></p>
<p>正如开头所讲的，到目前为止，W3C中deGeolocation API规范已经在非IE的浏览中得到了实现。规范中提到，浏览器提供位置信息的来源是不固定的，可能是GPS、也可能来自于IP地址、RFID、WiFi、蓝牙或者GSM\CDMA的定位信息，也不保证返回的结果一定准确。Geolocation的API同时对“只获得一次”定位和“持续监督”定位都做出了规定。</p>
<p><strong>Geolocation的一些方法</strong></p>
<p>Geolocation对象位于浏览器Navigator对象下，可以通过 navigator.geolcation 来访问，不支持 geolocation 的浏览器不会包含这一对象，不会造成错误，可以用来做浏览器的区分。</p>
<blockquote><p>if ( navigator.geolcation ){</p>
<p>&#160;&#160;&#160; alert(‘ Your Browser dosent support geolcocation &#8216;);</p>
<p>} else{</p>
<p>&#160;&#160;&#160; alert(‘ Your Browser support geolocation’);</p>
<p>}</p>
</blockquote>
<p>在访问 geolocation 对象时，浏览器会进行提示，询问用户使用许可对网站提供位置服务，得到用户的许可后，访问才会继续，否则会被停止。而且，我们可以捕捉到用户同意或者拒绝的事件。</p>
<p>在获得用户的学科之后，就可以利用Geolocation获取当前位置，核心方法如下：</p>
<blockquote><p>navigator.geolocation.getCurrentPosition( getPositionSuccess , getPositionError );</p>
</blockquote>
<p>上面的代码中，调用了 getCurrentPosition 方法，并且传递了两个回调函数的参数，分别用来处理位置获取成功和失败时的情况。实事上，这个函数还可以接受第三个参数，用来传入一些配置信息，包括对于超时的设置等。下面来看两个获取成功和获取失败时，回调函数的处理。</p>
<blockquote><p>获取地理信息成功的错误处理信息</p>
<p>function getPositionSuccess ( position ) {</p>
<p>&#160; var lat = position.coords.latitude;</p>
<p>&#160; var lng = position.coords.longitude;</p>
<p>&#160; alert( ‘Now you are lat – lng ‘);</p>
<p>}</p>
<p>&#160;</p>
<p>获取地理位置失败的回调函数</p>
<p>function getPositionError( error ){</p>
<p>&#160;&#160;&#160; switch(error.code)</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case error.TIMEOUT;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Do something</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case error.PERMISSION_DENIED;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Do something</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case error.POSITION_UNAVAILIABLE;</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Do something</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;</p>
<p>}</p>
</blockquote>
<p>获取地理位置信息的配置变量。在填入获取地理位置信息变量时，能够对获取地理位置的一些细节进行影响。下面是目前包括的几个具体参数</p>
<blockquote><p>In ECMAScript, the <code><a href="http://dev.w3.org/#high-accuracy">enableHighAccuracy</a></code>, <code><a href="http://dev.w3.org/#timeout_error">timeout</a></code> and <code><a href="http://dev.w3.org/#max-age">maximumAge</a></code> properties are all optional: when creating a PositionOptions object, the developer may specify any of these properties.</p>
</blockquote>
<p>刚才也提到，我们还可以对地理位置进行持续的追踪，这是需要用到 watchPosition 方法。</p>
<p>因为对于移动设备的用户来说，位置并不是固定的，我们需要来处理这种移动客户端的情况，而不是每次要提醒用户去刷新浏览器来更新位置。</p>
<blockquote><p>navigator.geolocation.watchPosition( refreshPosition );</p>
</blockquote>
<p><strong>与Mapabc API的整合</strong></p>
<p>看完上面的关于 geolocation 的介绍之后，我们就可以将这个服务与Mapabc API一起，整合到我们的应用中了。下面是一个具体的实现样例，供参考：</p>
<blockquote><p>&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</a>&gt;       <br />&lt;html&gt;       <br />&lt;head&gt;       <br />&#160;&#160;&#160; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;       <br />&lt;/head&gt;       <br />&lt;body&gt;       <br />&lt;div&gt;       <br />&#160;&#160;&#160; &lt;div id=&quot;mapobj&quot; style=&quot;width:500px; height:500px; border:1px solid black;&quot;&gt;&lt;/div&gt;       <br />&#160;&#160;&#160; &lt;div id=&quot;info&quot;&gt;&lt;/div&gt;       <br />&#160;&#160;&#160; &lt;input type=&quot;button&quot; id=&quot;getPos&quot; value=&quot;Get My Position&quot; /&gt;       <br />&lt;/div&gt;       <br />&lt;script src=&quot;<a href="http://app.mapabc.com/apis?&amp;t=flashmap&amp;v=2.3.4&amp;key=0c3235346b1e00772eafe1c099f4b23fe5ec1202d393f952395e628567934baceedcaf1508ea044f&quot;">http://app.mapabc.com/apis?&amp;t=flashmap&amp;v=2.3.4&amp;key=0c3235346b1e00772eafe1c099f4b23fe5ec1202d393f952395e628567934baceedcaf1508ea044f&quot;</a> type=&quot;text/javascript&quot;&gt;&lt;/script&gt;       <br />&lt;script type=&quot;text/javascript&quot;&gt;       <br />&#160;&#160;&#160; function getPositionSuccess( position ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var lat = position.coords.latitude;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; var lng = position.coords.longitude;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //alert( &quot;您所在的位置： 经度&quot; + lat + &quot;，纬度&quot; + lng ); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; var mapOptions = new MMapOptions();//构建地图辅助类      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.zoom=13;//设置地图zoom级别       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.center=new MLngLat(lng,lat);&#160;&#160; //设置地图中心点       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.toolbar = MINI;//工具条       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.toolbarPos = new MPoint(15,15);&#160; //工具条偏移       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.overviewMap = SHOW;//是否显示鹰眼       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.scale = SHOW;//是否显示比例尺       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.returnCoordType = COORD_TYPE_OFFSET;//返回偏移明码坐标       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapOptions.zoomBox = true;//鼠标滚轮缩放和双击放大时是否有红框动画效果。       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; mapabc.map=new MMap(&quot;mapobj&quot;,mapOptions); //地图初始 </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(typeof position.address !== &quot;undefined&quot;){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var country = position.address.country;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var province = position.address.region;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var city = position.address.city;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; alert(&#8217; 您位于 &#8216; + country + province + &#8216;省&#8217; + city +&#8217;市&#8217;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; function getPositionError( error ){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; switch(error.code){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case error.TIMEOUT :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; alert( &quot; 连接超时，请重试 &quot; );       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case error.PERMISSION_DENIED :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; alert( &quot; 您拒绝了使用位置共享服务，查询已取消 &quot; );       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; case error.POSITION_UNAVAILABLE :       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; alert( &quot; 亲爱的火星网友，非常抱歉，我们暂时无法为您所在的星球提供位置服务 &quot; );       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; break;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; var dom = {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; btn&#160;&#160;&#160; : document.getElementById(&quot;getPos&quot;),       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; info: document.getElementById(&quot;info&quot;),       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; map&#160;&#160;&#160; : document.getElementById(&quot;mapObj&quot;)       <br />&#160;&#160;&#160; }; </p>
<p>&#160;&#160;&#160; var mapabc = {      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; map&#160;&#160;&#160;&#160;&#160;&#160;&#160; : null,       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; marker&#160;&#160;&#160; : null       <br />&#160;&#160;&#160; }; </p>
<p>&#160;&#160;&#160; dom.btn.onclick = function(){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if( navigator.geolocation ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dom.info.innerHTML = &quot;Waiting for the geolocation result&#8230;&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; navigator.geolocation.getCurrentPosition( getPositionSuccess, getPositionError );&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else {       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; dom.info.innerHTML = &quot;Your browser doesn&#8217;t support geolocation.&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; }       <br />&lt;/script&gt;       <br />&lt;/body&gt;       <br />&lt;/html&gt;</p>
</blockquote>
<p>上面的代码，会在地图显示后询问用户是否共享位置信息，如果共享则会切换地图中心点到相应的位置。当然，我们可以在自己的应用中更加灵活的使用位置共享服务，既然有了这么 Cool 的服务支持，我们还等什么呢。</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>参考资料：</p>
<p>1、<a href="http://bbs.blueidea.com/thread-2995481-1-1.html" target="_blank">Blueidea BBS</a>     <br />2、<a href="http://dev.w3.org/geo/api/spec-source.html" target="_blank">Geolocation API Specification</a>     <br />3、<a href="http://code.mapabc.com/" target="_blank">Mapabc API</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=249</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VIM在多窗口编辑时的几个快捷键</title>
		<link>http://xingchexian.com/blog/?p=247</link>
		<comments>http://xingchexian.com/blog/?p=247#comments</comments>
		<pubDate>Fri, 25 Jun 2010 10:26:05 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=247</guid>
		<description><![CDATA[ 
使用VI提供的多窗口编辑在项目文件比较多的情况下非常方便。今天总结了几个比较好用的快捷键。
最基本的是打开分割窗口 :sp a.pl
切换窗口 Ctrl + w 按一次加上下键可以自己选择切换方向，按两次则从上到下自动遍历窗口
扩大窗口 Ctrl-w + 扩大窗口
缩小窗口 Ctrl-w &#8211; 缩小当前编辑窗口
在vim中执行shell命令 :! ls 这样可以执行shell命令，或者也可以 :shell top
放大当前窗口，缩小其他窗口 :res ，后面可以设置行数，比如 :res 10 则将当前窗口设置为10行
有了这几个功能，在vim中编辑复杂的项目也变得非常简单了
]]></description>
			<content:encoded><![CDATA[<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/06/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://xingchexian.com/blog/wp-content/uploads/2010/06/image_thumb1.png" width="696" height="436" /></a> </p>
<p>使用VI提供的多窗口编辑在项目文件比较多的情况下非常方便。今天总结了几个比较好用的快捷键。</p>
<p>最基本的是打开分割窗口 :sp a.pl</p>
<p>切换窗口 Ctrl + w 按一次加上下键可以自己选择切换方向，按两次则从上到下自动遍历窗口</p>
<p>扩大窗口 Ctrl-w + 扩大窗口</p>
<p>缩小窗口 Ctrl-w &#8211; 缩小当前编辑窗口</p>
<p>在vim中执行shell命令 :! ls 这样可以执行shell命令，或者也可以 :shell top</p>
<p>放大当前窗口，缩小其他窗口 :res ，后面可以设置行数，比如 :res 10 则将当前窗口设置为10行</p>
<p>有了这几个功能，在vim中编辑复杂的项目也变得非常简单了</p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=247</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>设计网事读书笔记</title>
		<link>http://xingchexian.com/blog/?p=244</link>
		<comments>http://xingchexian.com/blog/?p=244#comments</comments>
		<pubDate>Mon, 14 Jun 2010 05:56:58 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebThoery]]></category>
		<category><![CDATA[互联网设计]]></category>
		<category><![CDATA[产品]]></category>
		<category><![CDATA[体会]]></category>
		<category><![CDATA[流程]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=244</guid>
		<description><![CDATA[从三月份的时候开始读，利用零零星星的时间，终于读完了千年的《设计网事》这本书。虽名为书，实则是他最近几年的博文汇集而来。纵观此书，却与阅读单篇感觉很不一样。下面是读书的时候，摘抄的一些句子。
SEO的迎合对象是搜索引擎，而我们主张的迎合对象是用户需求
搜索引擎的需求其实就是用户需求的不完全表述
提供服务的关键是有没有效，而不是叫SEO或UCD
1998年，W3C发布HTML 4.0 Specification
每天都有无数的网站消失、无数页面在改版
改版的目标是平稳过渡，让大家不觉得这么陌生
用户挑剔，说明还在乎
Web Design是跨学科的技艺结合体，将来一定是互联网的世界
通过事物的本质去总结出概念，而不是通过概念放大理解事物的本质
超过90%的原创者无法做到有效积累，同样超过90%的阅读者对内容好坏没有准确判断力
互联网设计不是行业，只是个技术领域，参考立足于传统行业设计
规则有规则的秩序感，不规则有不规则的位置感
做真实的自己，不要想复制别人的生活方式和轨迹

此书并没有长篇累牍的的设计理论，也没有太多枯燥无味的技术教程，加上合理的编排，让我感觉受益良多
1、互联网产品，甚至做任何事情都得有自己的想法。所有事情都需要经过自己的思考提炼，而不是人云亦云。就像有一篇讨论电梯按钮排布的文章，平凡的日常现象，其实背后也有通用的艺术设计原则。我们一则是需要认真的观察，同时还需要融入自己的思考。做事情，不能为完成而完成，加入自己的想法，才能使产品不断地进步。
2、流程化的管理和团队合作非常重要。现在互联网的项目，不再是单枪匹马就能够做出花样的年代。Ajax、CSS、DOM结构、后台，构建一个成熟的Web 2.0应用时，这些东西必不可少，在不可能一个人全完成的情况下，团队协作和流程管理就非常重要。我目前所在的单位，基本上就是按照瀑布式的开发方式来进行的，我想国内多数做互联网的团队应该也都是这个模式。敏捷目前还没试验过，感觉其实现门槛比较高，只有小组成员都具备了敏捷的能力之后，才能谈得上。所以，我相信，规范化的管理流程，是推进提高生产率的关键因素。
3、用户体验，需要用心、细致的去做。在一个趋同的审美背景下，要把自己的产品做到出彩，做到令人过目不忘常回头。在用户体验的界面设计上，必须要用心、细致的去做。互联网产品的产生过程，是一个技术和艺术结合的过程。我们不能只看艺术性而忽略了开发商的难度，也不能只考虑开发上的便捷性，而把一堆丑陋的页面丢给用户。从重要性上来看，应该吧界面设计与交互设计放在技术开发之前。首先，很多需求的产生是来自战略层而不是技术人员，所以需要有足以说服人的细化的原型作为基础。
以上是一些合上书之后的胡思乱想，看来自己的思维系统性和整理性还是有待强化。
Technorati 标签: web2.0,design,interactive,vi,ucd,seo
]]></description>
			<content:encoded><![CDATA[<p>从三月份的时候开始读，利用零零星星的时间，终于读完了千年的《设计网事》这本书。虽名为书，实则是他最近几年的博文汇集而来。纵观此书，却与阅读单篇感觉很不一样。下面是读书的时候，摘抄的一些句子。</p>
<blockquote><p>SEO的迎合对象是搜索引擎，而我们主张的迎合对象是用户需求</p>
<p>搜索引擎的需求其实就是用户需求的不完全表述</p>
<p>提供服务的关键是有没有效，而不是叫SEO或UCD</p>
<p>1998年，W3C发布HTML 4.0 Specification</p>
<p>每天都有无数的网站消失、无数页面在改版</p>
<p>改版的目标是平稳过渡，让大家不觉得这么陌生</p>
<p>用户挑剔，说明还在乎</p>
<p>Web Design是跨学科的技艺结合体，将来一定是互联网的世界</p>
<p>通过事物的本质去总结出概念，而不是通过概念放大理解事物的本质</p>
<p>超过90%的原创者无法做到有效积累，同样超过90%的阅读者对内容好坏没有准确判断力</p>
<p>互联网设计不是行业，只是个技术领域，参考立足于传统行业设计</p>
<p>规则有规则的秩序感，不规则有不规则的位置感</p>
<p>做真实的自己，不要想复制别人的生活方式和轨迹</p>
</blockquote>
<p>此书并没有长篇累牍的的设计理论，也没有太多枯燥无味的技术教程，加上合理的编排，让我感觉受益良多</p>
<p>1、互联网产品，甚至做任何事情都得有自己的想法。所有事情都需要经过自己的思考提炼，而不是人云亦云。就像有一篇讨论电梯按钮排布的文章，平凡的日常现象，其实背后也有通用的艺术设计原则。我们一则是需要认真的观察，同时还需要融入自己的思考。做事情，不能为完成而完成，加入自己的想法，才能使产品不断地进步。</p>
<p>2、流程化的管理和团队合作非常重要。现在互联网的项目，不再是单枪匹马就能够做出花样的年代。Ajax、CSS、DOM结构、后台，构建一个成熟的Web 2.0应用时，这些东西必不可少，在不可能一个人全完成的情况下，团队协作和流程管理就非常重要。我目前所在的单位，基本上就是按照瀑布式的开发方式来进行的，我想国内多数做互联网的团队应该也都是这个模式。敏捷目前还没试验过，感觉其实现门槛比较高，只有小组成员都具备了敏捷的能力之后，才能谈得上。所以，我相信，规范化的管理流程，是推进提高生产率的关键因素。</p>
<p>3、用户体验，需要用心、细致的去做。在一个趋同的审美背景下，要把自己的产品做到出彩，做到令人过目不忘常回头。在用户体验的界面设计上，必须要用心、细致的去做。互联网产品的产生过程，是一个技术和艺术结合的过程。我们不能只看艺术性而忽略了开发商的难度，也不能只考虑开发上的便捷性，而把一堆丑陋的页面丢给用户。从重要性上来看，应该吧界面设计与交互设计放在技术开发之前。首先，很多需求的产生是来自战略层而不是技术人员，所以需要有足以说服人的细化的原型作为基础。</p>
<p>以上是一些合上书之后的胡思乱想，看来自己的思维系统性和整理性还是有待强化。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f1d94dee-5924-4db6-bc7d-4fc5944ddb8a" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/web2.0" rel="tag">web2.0</a>,<a href="http://technorati.com/tags/design" rel="tag">design</a>,<a href="http://technorati.com/tags/interactive" rel="tag">interactive</a>,<a href="http://technorati.com/tags/vi" rel="tag">vi</a>,<a href="http://technorati.com/tags/ucd" rel="tag">ucd</a>,<a href="http://technorati.com/tags/seo" rel="tag">seo</a></div>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=244</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP性能监测的工具介绍 &#8211; XHProf</title>
		<link>http://xingchexian.com/blog/?p=243</link>
		<comments>http://xingchexian.com/blog/?p=243#comments</comments>
		<pubDate>Wed, 02 Jun 2010 09:55:38 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[profile]]></category>
		<category><![CDATA[xhprof]]></category>
		<category><![CDATA[性能]]></category>
		<category><![CDATA[监控]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=243</guid>
		<description><![CDATA[XHProf
这个软件本是Facebook内部的一个应用工具，2009年3月份开源，为PHP的性能监测提供了很好的工具。官方的介绍中提到：
XHProf is a hierarchical profiler for PHP. It reports function-level call counts and inclusive and exclusive metrics such as wall (elapsed) time, CPU time and memory usage.
XHProf&#8217;s light-weight nature and aggregation capabilities make it well suited for collecting &#34;function-level&#34; performance statistics from production environments.

&#160;
可以先来看看 XHProf 提供的图形界面的截图
&#160;
XHProf的一些特性：
1、Flat Profile. 提供函数级的汇总信息，比如调用次数、执行时间、内存使用、CPU占用等。

2、Hierarchical Profile。 对每个程序，进行了父级调用和子级调用的分解。

3、Diff Reports(差异报告)。有很多种情况，我们希望能够对比，比如新版本比旧版本提升了多少速度，两个版本的差距究竟在哪里。Diff Report 就是这样的工具，接收两个输入，并且分别给出各自的 Flat Profile [...]]]></description>
			<content:encoded><![CDATA[<p>XHProf</p>
<p>这个软件本是Facebook内部的一个应用工具，2009年3月份开源，为PHP的性能监测提供了很好的工具。官方的介绍中提到：</p>
<blockquote><p>XHProf is a hierarchical profiler for PHP. It reports function-level call counts and <a href="http://mirror.facebook.net/#inclusive">inclusive</a> and <a href="http://mirror.facebook.net/#exclusive">exclusive</a> metrics such as wall (elapsed) time, CPU time and memory usage.</p>
<p>XHProf&#8217;s light-weight nature and aggregation capabilities make it well suited for collecting &quot;function-level&quot; performance statistics from production environments.</p>
</blockquote>
<p>&#160;</p>
<p>可以先来看看 XHProf 提供的图形界面的截图</p>
<p>&#160;</p>
<p>XHProf的一些特性：</p>
<p>1、<strong>Flat Profile</strong>. 提供函数级的汇总信息，比如调用次数、执行时间、内存使用、CPU占用等。</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://mirror.facebook.net/facebook/xhprof/sample-flat-view.jpg" width="673" height="370" /></p>
<p>2、<strong>Hierarchical Profile</strong>。 对每个程序，进行了父级调用和子级调用的分解。</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://mirror.facebook.net/facebook/xhprof/sample-parent-child-view.jpg" width="669" height="315" /></p>
<p>3、<strong>Diff Reports(差异报告)。</strong>有很多种情况，我们希望能够对比，比如新版本比旧版本提升了多少速度，两个版本的差距究竟在哪里。Diff Report 就是这样的工具，接收两个输入，并且分别给出各自的 Flat Profile 和 Hierarchical Profile 报告。</p>
<p>4、<strong>Callgraph View(调用视图)。</strong>性能监测的数据可以绘制成调用视图，方便我们查看。</p>
<p><img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://mirror.facebook.net/facebook/xhprof/sample-callgraph-image.jpg" width="596" height="599" /></p>
<p>5、<strong>Memory Profile(内存监控)。</strong>这个特性帮助我们了解PHP如何分配和释放内存。值得注意的是，XHProf并不是严格的监测内存的分配和释放动作，而是计算每个函数进入和退出时的内存状况，这是一个相对简单的实现方式，但是基本上也能够满足我们日常的监控需求。</p>
<p>6、<strong>如何处理外部文件</strong>。XHProf将 include,require,include_once,require_once进来的文件视作是一个 function。</p>
<p>XHProf目前只支持一个级别的函数追踪，但是貌似也没有特别大的影响。</p>
<p><strong>XHProf的安装配置</strong></p>
<p>xhprof的安装配置很简单，我们首先在 PECL 的网站上下载 <a href="http://pecl.php.net/package/xhprof">源码包</a> 然后执行安装过程</p>
<blockquote><pre>% cd &lt;xhprof_source_directory&gt;/extension/
% phpize
% ./configure --with-php-config=&lt;path to php-config&gt;
% make
% make install
% make test</pre>
<p><a name="ini_file"></a><b>php.ini file</b>: You can update your php.ini file to automatically load your extension. Add the following to your php.ini file.</p>
<pre>[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=&lt;directory_for_storing_xhprof_runs&gt;</pre>
<p>&#160;</p>
</blockquote>
<p>xhprof的使用也很简单，只要将需要监控的脚本放在 xhprof_enable() 和 xhprof_disable() 中间，就可以得到相应的结果，同时也提供了一些参数可以让我们设置是否监控 Memory, CPU 的使用，是否监控PHP内置的函数，从 0.9.2 之后，还可以设置跳过一些特定的函数。</p>
<p>XHProf 生成的数据，可以用 XHProf UI 来进行简单的显示。</p>
<p>XHProf使用也很简单，下面是一个官方的例子：</p>
<blockquote>
<p>&lt;?php </p>
<p>function bar($x) {<br />
    <br />&#160; if ($x &gt; 0) { </p>
<p>&#160;&#160;&#160; bar($x &#8211; 1); </p>
<p>&#160; } </p>
<p>} </p>
<p>function foo() {<br />
    <br />&#160; for ($idx = 0; $idx &lt; 2; $idx++) { </p>
<p>&#160;&#160;&#160; bar($idx); </p>
<p>&#160;&#160;&#160; $x = strlen(&quot;abc&quot;); </p>
<p>&#160; } </p>
<p>} </p>
<p>xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); </p>
<p>foo(); </p>
<p>$xhprof_data = xhprof_disable(); </p>
<p>//<br />
    <br />// Saving the XHProf run </p>
<p>// using the default implementation of iXHProfRuns. </p>
<p>// </p>
<p>include_once &quot;xhprof_lib/utils/xhprof_lib.php&quot;; </p>
<p>include_once &quot;xhprof_lib/utils/xhprof_runs.php&quot;; </p>
<p>$xhprof_runs = new XHProfRuns_Default(); </p>
<p>// Save the run under a namespace &quot;xhprof_foo&quot;.<br />
    <br />// </p>
<p>// **NOTE**: </p>
<p>// By default save_run() will automatically generate a unique </p>
<p>// run id for you. [You can override that behavior by passing </p>
<p>// a run id (optional arg) to the save_run() method instead.] </p>
<p>// </p>
<p>$run_id = $xhprof_runs-&gt;save_run($xhprof_data, &quot;xhprof_foo&quot;); </p>
<p>echo &quot;&#8212;&#8212;&#8212;&#8212;&#8212;\n&quot;.<br />
    <br />&#160;&#160;&#160;&#160; &quot;Assuming you have set up the http based UI for \n&quot;. </p>
<p>&#160;&#160;&#160;&#160; &quot;XHProf at some address, you can view run at \n&quot;. </p>
<p>&#160;&#160;&#160;&#160; &quot;<a href="http://&lt;xhprof-ui-address">http://&lt;xhprof-ui-address</a>&gt;/index.php?run=$run_id&amp;source=xhprof_foo\n&quot;. </p>
<p>&#160;&#160;&#160;&#160; &quot;&#8212;&#8212;&#8212;&#8212;&#8212;\n&quot;; </p>
<p>?&gt;</p>
<p>&#160;</p>
</blockquote>
<p>我们可以持久化记录的数据，数据以文件的形式保存在指定的目录，如下图：</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/06/image.png"><img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://xingchexian.com/blog/wp-content/uploads/2010/06/image_thumb.png" width="550" height="68" /></a> 有了这个工具，我们可以根据其提供的数据，与相应的通知接口整合，在程序运行出现问题时，及时的发送通知信息。</p>
<p>&#160;</p>
<p>PHP性能监控，还有两个可用的工具，一个是 XDebug，另外一个是 ZendServer，我会在接下来继续进行介绍。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e4ccf7e6-51f7-4d4d-9752-de4b88add46f" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/profile" rel="tag">profile</a>,<a href="http://technorati.com/tags/%e7%9b%91%e6%8e%a7" rel="tag">监控</a>,<a href="http://technorati.com/tags/xhprof" rel="tag">xhprof</a></div>
<p>参考文档：<br />
  <br />1、Speed UP your php with xhprof </p>
<p>2、<a href="http://mirror.facebook.net/facebook/xhprof/doc.html#introduction">xhprof document</a></p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=243</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用PUT方式上传文件的方法研究</title>
		<link>http://xingchexian.com/blog/?p=240</link>
		<comments>http://xingchexian.com/blog/?p=240#comments</comments>
		<pubDate>Mon, 31 May 2010 06:10:18 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[文件上传]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=240</guid>
		<description><![CDATA[虽然没有POST方法使用广泛，但是PUT方法却是向服务器上传文件最有效率的方法。POST上传文件时，我们通常需要将所有的信息组合成 multipart 传送过去，然后服务器再解码这些信息，解码过程则必不可少的会消耗内存和CPU资源，这种现象在上传大文件时尤其明显。而PUT方法则允许你通过与服务器建立的socket链接传递文件的内容，而不附带其他的信息。
最近一个项目上需要利用这种方式来进行文件的上传，下面介绍一下在 Apache + PHP 的环境下如何进行PUT方式的文件上传。
Apache 有一个模块 mod_actions，先看看官方的说明：
This module has two directives. The&#160;Action&#160;directive lets you run CGI scripts whenever a file of a certain&#160;MIME content type&#160;is requested. The&#160;Script&#160;directive lets you run CGI scripts whenever a particular method is used in a request. This makes it much easier to execute scripts that process files.

也就是说，这个模块可以指定对于特定 MIME [...]]]></description>
			<content:encoded><![CDATA[<p>虽然没有POST方法使用广泛，但是PUT方法却是向服务器上传文件最有效率的方法。POST上传文件时，我们通常需要将所有的信息组合成 multipart 传送过去，然后服务器再解码这些信息，解码过程则必不可少的会消耗内存和CPU资源，这种现象在上传大文件时尤其明显。而PUT方法则允许你通过与服务器建立的socket链接传递文件的内容，而不附带其他的信息。</p>
<p>最近一个项目上需要利用这种方式来进行文件的上传，下面介绍一下在 Apache + PHP 的环境下如何进行PUT方式的文件上传。</p>
<p>Apache 有一个模块 mod_actions，先看看官方的说明：</p>
<blockquote><p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 14px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: arial, helvetica, sans-serif; color: rgb(0,51,102)" class="Apple-style-span">This module has two directives. The<span class="Apple-converted-space">&#160;</span><code style="font-family: &#39;Courier New&#39;, courier, monospace; color: rgb(40,127,0); font-size: 1em" class="directive"><a style="color: rgb(40,127,0)" href="http://cnblogs.com/cocowool#action"><u>Action</u></a></code><span class="Apple-converted-space">&#160;</span>directive lets you run CGI scripts whenever a file of a certain<span class="Apple-converted-space">&#160;</span><a style="border-bottom: rgb(0,115,199) 1px dashed; color: rgb(0,115,199); cursor: help; text-decoration: none" class="glossarylink" title="see glossary" href="http://cnblogs.com/glossary.html#mime-type">MIME content type</a><span class="Apple-converted-space">&#160;</span>is requested. The<span class="Apple-converted-space">&#160;</span><code style="font-family: &#39;Courier New&#39;, courier, monospace; color: rgb(40,127,0); font-size: 1em" class="directive"><a style="color: rgb(40,127,0)" href="http://cnblogs.com/cocowool#script"><u>Script</u></a></code><span class="Apple-converted-space">&#160;</span>directive lets you run CGI scripts whenever a particular method is used in a request. This makes it much easier to execute scripts that process files.</span></span></p>
</blockquote>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 14px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: arial, helvetica, sans-serif; color: rgb(0,51,102)" class="Apple-style-span">也就是说，这个模块可以指定对于特定 MIME 类型的文件处理，或者对于特定脚本的请求进行指定的处理。我用到的就是 Script 这个选项。</span></span></p>
<p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 14px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: arial, helvetica, sans-serif; color: rgb(0,51,102)" class="Apple-style-span">在Apache 配置文件的 Directory 中指定 </span></span></p>
<blockquote><p><span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: 14px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="line-height: 18px; font-family: arial, helvetica, sans-serif; color: rgb(0,51,102)" class="Apple-style-span">Script PUT /receive.php</span></span></p>
</blockquote>
<p>这个含义就是，对于所有对服务器的PUT请求，都交给根目录下的 receive.php 去处理，当然我们也可以选择 perl 或者其他的CGI脚本来进行处理。</p>
<p>接下来就是这个 receive.php 脚本的编写了，他的主要任务就是将请求的文件写到指定的位置</p>
<blockquote><p>&lt;?php      <br />/**       <br />* Process The PUT File, receive and move a file to corresponsed location       <br />* Created by shiqiang&lt;<a href="mailto:cocowool@gmail.com">cocowool@gmail.com</a>&gt; at 2010-05-24       <br />*       <br />**/ </p>
<p>class Receive {      <br />&#160;&#160;&#160; var $default_log_file = &quot;logs/error.log&quot;;       <br />&#160;&#160;&#160; var $default_server_info = &quot;logs/server.log&quot;;       <br />&#160;&#160;&#160; var $default_header_info = &quot;logs/header.log&quot;;       <br />&#160;&#160;&#160; var $default_prefix = &quot;/data1/vhosts&quot;;&#160;&#160;&#160; //Default project location prefix;       <br />&#160;&#160;&#160; var $default_module = &quot;test.cn&quot;;       <br />&#160;&#160;&#160; var $max_filesize = 2048000;       <br />&#160;&#160;&#160; var $request_uri; </p>
<p>&#160;&#160;&#160; function Receive(){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;request_uri = $_SERVER['REQUEST_URI'];       <br />&#160;&#160;&#160; }       <br />&#160;&#160;&#160; function saveFile(){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; //receive data and save       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $putdata = fopen(&quot;php://input&quot;, &quot;r&quot;); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $path = $this-&gt;getPath($this-&gt;request_uri);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $fp = fopen($path, &#8216;w&#8217;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; while($data = fread($putdata, 1024) ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; fwrite($fp, $data);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; fclose($fp);      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; fclose($putdata); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; //Log The filesize check and limit check      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if( filesize($path) != $_SERVER['CONTENT_LENGTH'] ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;errorLog( &quot;[warn] &quot; . date(&quot;Y-m-d H:i:s&quot;)&#160; . &quot; The file&#8217;s ($path) size dosen&#8217;t match Server Filesize = &quot; . filesize($path) . &quot;; Put Filesize = &quot; . $_SERVER['CONTENT_LENGTH']. &quot;\r\n&quot; );       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; header(&#8217;HTTP/1.1 526 Receive Data Error&#8217;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if( filesize($path) &gt; $this-&gt;max_filesize ){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $this-&gt;errorLog( &quot;[warn] &quot; . date(&quot;Y-m-d H:i:s&quot;)&#160; . &quot; The file&#8217;s ($path) size exceed the system limit&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; //Log Error Info      <br />&#160;&#160;&#160; function errorLog( $info ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $f = fopen($this-&gt;default_log_file, &#8216;a+&#8217;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; fwrite($f, $info);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; flcose($f);       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; function serverLog(){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $f = fopen($this-&gt;default_server_info, &#8216;w&#8217;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $info = $_SERVER;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $str = &quot;The Last Request Server Info:\r\n&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach ($info as $key =&gt; $value){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $str .= &quot;$key = $value\r\n&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $str .= $this-&gt;getPath($this-&gt;request_uri) . &quot;\r\n&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $str .= &quot;PHP_UPLOADED_FILE_NAME=&quot; . $PHP_UPLOADED_FILE_NAME . &quot;\r\n&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; fwrite($f , $str);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; fclose($f);       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; //Log the Request Header info      <br />&#160;&#160;&#160; function headerLog(){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $f = fopen($this-&gt;default_header_info, &#8216;w&#8217;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $info = get_headers();       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $str = &quot;The Last Request header Info:\r\n&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach ($info as $key =&gt; $value){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $str .= &quot;$key = $value\r\n&quot;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; fwrite($f , $str);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; fclose($f);       <br />&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160; //get the path where the file should be      <br />&#160;&#160;&#160; function getPath($uri){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $module = $this-&gt;defalt_module;&#160;&#160;&#160; //Default storage module </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $referer = $this-&gt;request_uri;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; preg_match(&#8217;/(?&lt;=\/)(.*?)(?=\/)/s&#8217;, $referer, $match); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; if( !empty($match) &amp;&amp; !empty($match[0]) ){      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $module = $match[0];       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $path = $this-&gt;default_prefix;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $path .= &#8216;/&#8217; . $module . &#8216;/htdocs&#8217;;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; $fullpath = substr($uri, strlen($match[0]) + 1, strlen($uri) ); </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; $arr = explode(&#8217;/', ltrim($fullpath, &#8216;/&#8217;));      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; foreach($arr as $v){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if( !strstr($v, &#8216;.&#8217;) ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $path .= &#8216;/&#8217; . $v;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //exec(&quot;echo $path &gt;&gt; dir.txt&quot;);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if( !is_dir($path) ){       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //For php &gt; 5.0       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //mkdir($path, &quot;0766&quot;, true);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mkdir($path, 0766);       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }else{       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $path .= &#8216;/&#8217; . $v;       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } </p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return $path;      <br />&#160;&#160;&#160; } </p>
<p>} </p>
<p>$instance = new Receive();      <br />$instance-&gt;serverLog();       <br />//$instance-&gt;headerLog();       <br />$instance-&gt;saveFile(); </p>
<p>?&gt;</p>
</blockquote>
<p>这个脚本，使用PHP手册中的接收PUT方式的方法，详细的使用，GOOGLE的时候，并没有找到很多，所以可能对于错误情况，考虑的也不是很全面，如果有使用过这个方法的欢迎和我讨论。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:cbc059a4-183b-45a2-9642-54155c281c83" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/PHP" rel="tag">PHP</a>,<a href="http://technorati.com/tags/PUT" rel="tag">PUT</a>,<a href="http://technorati.com/tags/Script" rel="tag">Script</a></div>
<p>参考资料：    <br />1、<a href="http://upload.thinfile.com/docs/put.php">PUT Upload</a>     <br />2、RFC 2616</p>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=240</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>通过设置双网卡实现VirtualBox虚机上网及主宿互访</title>
		<link>http://xingchexian.com/blog/?p=239</link>
		<comments>http://xingchexian.com/blog/?p=239#comments</comments>
		<pubDate>Thu, 27 May 2010 02:52:00 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>
		<category><![CDATA[virtual box]]></category>
		<category><![CDATA[虚拟机]]></category>
		<category><![CDATA[访问互联网]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=239</guid>
		<description><![CDATA[最近，经过一些研究，终于调通了VirtualBox虚拟机互连、主宿机互连、以及主宿机连接互联网。下面分享一下。
1、VirtualBox中的虚拟网卡。VirtualBox安装完成后，会在系统中装一块虚拟网卡，我们在管理-&#62;全局设定中可以看到。这块网卡是在 Host-Only 连接方式中，主宿机互访的桥梁。

2、主机访问虚拟机通过Host Only的方式实现。
主机访问虚拟机这个是最简单的。通过在网络连接1中选择 Host-only Adapter ，我们的虚拟机就可以获得一个内网的地址，主机可以直接访问这个地址。我们可以使用DHCP，也可以自己指定IP，多数情况下，都会指定一个固定的IP。

3、现在要想实现虚拟机上网，我们可以为虚拟机再添加一块网卡，通过Bridge方式，达到虚拟机上网的目的。


4、但是笔者在这样设置以后，测试 ping www.baidu.com 时，发现网络并没有通，仔细检查后发现，需要在我们的第二块网卡的配置上，指定他的网关。我在 /etc/sysconfig/network-scripts/ifcfg-eth1 中添加
GATEWAY=10.207.0.11
重启网络之后，就可以PING通了。
这样，我们既能访问虚拟机，又可以访问互联网，利用各种在线更新的工具，大大的方便了 Linux 的使用。
Technorati 标签: virtual box,虚拟机,互联网访问
]]></description>
			<content:encoded><![CDATA[<p>最近，经过一些研究，终于调通了VirtualBox虚拟机互连、主宿机互连、以及主宿机连接互联网。下面分享一下。</p>
<p>1、VirtualBox中的虚拟网卡。VirtualBox安装完成后，会在系统中装一块虚拟网卡，我们在管理-&gt;全局设定中可以看到。这块网卡是在 Host-Only 连接方式中，主宿机互访的桥梁。</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/05/0GNO4D5RS32KPW37B7.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="0GNO4}~D]5R]S32KPW37B}7" border="0" alt="0GNO4}~D]5R]S32KPW37B}7" src="http://xingchexian.com/blog/wp-content/uploads/2010/05/0GNO4D5RS32KPW37B7_thumb.jpg" width="368" height="482" /></a></p>
<p>2、主机访问虚拟机通过Host Only的方式实现。</p>
<p>主机访问虚拟机这个是最简单的。通过在网络连接1中选择 Host-only Adapter ，我们的虚拟机就可以获得一个内网的地址，主机可以直接访问这个地址。我们可以使用DHCP，也可以自己指定IP，多数情况下，都会指定一个固定的IP。</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/05/PUB7VB28B2SQS4EEXDY.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="PUB}7VB28B%2SQS4)E%EXDY" border="0" alt="PUB}7VB28B%2SQS4)E%EXDY" src="http://xingchexian.com/blog/wp-content/uploads/2010/05/PUB7VB28B2SQS4EEXDY_thumb.jpg" width="464" height="538" /></a></p>
<p>3、现在要想实现虚拟机上网，我们可以为虚拟机再添加一块网卡，通过Bridge方式，达到虚拟机上网的目的。</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/05/9NXA153UJIGADIW3N.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="9)N`XA15%{3UJIGA}D~IW3N" border="0" alt="9)N`XA15%{3UJIGA}D~IW3N" src="http://xingchexian.com/blog/wp-content/uploads/2010/05/9NXA153UJIGADIW3N_thumb.jpg" width="442" height="397" /></a></p>
</p>
<p>4、但是笔者在这样设置以后，测试 ping <a href="http://www.baidu.com">www.baidu.com</a> 时，发现网络并没有通，仔细检查后发现，需要在我们的第二块网卡的配置上，指定他的网关。我在 /etc/sysconfig/network-scripts/ifcfg-eth1 中添加</p>
<p>GATEWAY=10.207.0.11</p>
<p>重启网络之后，就可以PING通了。</p>
<p>这样，我们既能访问虚拟机，又可以访问互联网，利用各种在线更新的工具，大大的方便了 Linux 的使用。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d2524671-d033-4bfd-a5c0-90bb8d5971d7" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/virtual+box" rel="tag">virtual box</a>,<a href="http://technorati.com/tags/%e8%99%9a%e6%8b%9f%e6%9c%ba" rel="tag">虚拟机</a>,<a href="http://technorati.com/tags/%e4%ba%92%e8%81%94%e7%bd%91%e8%ae%bf%e9%97%ae" rel="tag">互联网访问</a></div>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=239</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>基于Mapabc API的周边查询应用</title>
		<link>http://xingchexian.com/blog/?p=231</link>
		<comments>http://xingchexian.com/blog/?p=231#comments</comments>
		<pubDate>Sun, 23 May 2010 14:56:50 +0000</pubDate>
		<dc:creator>CoCoWool</dc:creator>
				<category><![CDATA[WebTech]]></category>

		<guid isPermaLink="false">http://xingchexian.com/blog/?p=231</guid>
		<description><![CDATA[现在，越来越多的 Location Based 应用，或者Geolocation的应用出现在网络、手机等各种各样的终端上，为人们的日常生活、出行和工作都提供了不少的便利。最常见的就是出门前，利用地图工具，看看合适的公共交通路线，寻找一个自己最满意的方案，既方便有低碳环保。有时候，对周边环境不熟悉，想要找到周边的医院、银行、学校等一些单位的时候，地图同样可以帮上我们的大忙。
今天，我就做了一个基于Mapabc地图API的周边查询工具，利用Mapabc详尽的基础地物信息，为我查找周边的便民信息提供了有利的帮助。
开始之前，我大概需要知道最后的结果是什么样子的，可以借助传统的纸和笔，也可以用现代的原型工具，当然PS这样的重量级工具就不太需要了。下面是效果图：
 
有了效果图，接下来需要稍微规划一下代码。Mapabc的API在页面加载完成后，需要初始化地图，所以初始化的操作放在一个函数 pageInit() 中。周边查询的操作，希望通过用户输入一个关键词，然后通过点选地图设置中心点的方式实现。那么就需要一个函数来监听鼠标在地图上的单击事件，然后一个负责查询的函数和一个负责显示结果的函数。程序的结构大致如此，接下来就进入实质的编码过程。
编码的重点函数有以下几个：
mapObj.addEventListener(mapObj, MOUSE_CLICK, searchAround); 

对地图添加监听事件。
mls.poiSearchByCenterXY(new MLngLat(cordx, cordy),keyword,citycode,mlsp); 


利用中心点坐标查询查找周边信息
利用这两个函数，加上参考Mapabc官方的示例，我们就可以完成这个应用。
 
通过修改区号和关键字，可以在不同城市之间切换，怎么样，简单吧。
Technorati 标签: Map,mapabc,geolocation,地图
]]></description>
			<content:encoded><![CDATA[<p>现在，越来越多的 Location Based 应用，或者Geolocation的应用出现在网络、手机等各种各样的终端上，为人们的日常生活、出行和工作都提供了不少的便利。最常见的就是出门前，利用地图工具，看看合适的公共交通路线，寻找一个自己最满意的方案，既方便有低碳环保。有时候，对周边环境不熟悉，想要找到周边的医院、银行、学校等一些单位的时候，地图同样可以帮上我们的大忙。</p>
<p>今天，我就做了一个基于Mapabc地图API的周边查询工具，利用Mapabc详尽的基础地物信息，为我查找周边的便民信息提供了有利的帮助。</p>
<p>开始之前，我大概需要知道最后的结果是什么样子的，可以借助传统的纸和笔，也可以用现代的原型工具，当然PS这样的重量级工具就不太需要了。下面是效果图：</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/05/1131.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1131" border="0" alt="1131" src="http://xingchexian.com/blog/wp-content/uploads/2010/05/1131_thumb.jpg" width="405" height="281" /></a> </p>
<p>有了效果图，接下来需要稍微规划一下代码。Mapabc的API在页面加载完成后，需要初始化地图，所以初始化的操作放在一个函数 pageInit() 中。周边查询的操作，希望通过用户输入一个关键词，然后通过点选地图设置中心点的方式实现。那么就需要一个函数来监听鼠标在地图上的单击事件，然后一个负责查询的函数和一个负责显示结果的函数。程序的结构大致如此，接下来就进入实质的编码过程。</p>
<p>编码的重点函数有以下几个：</p>
<blockquote><p>mapObj.addEventListener(mapObj, MOUSE_CLICK, searchAround); </p>
</blockquote>
<p>对地图添加监听事件。</p>
<blockquote><p>mls.poiSearchByCenterXY(new MLngLat(cordx, cordy),keyword,citycode,mlsp); </p>
</blockquote>
</p>
<p>利用中心点坐标查询查找周边信息</p>
<p>利用这两个函数，加上参考Mapabc官方的示例，我们就可以完成这个应用。</p>
<p><a href="http://xingchexian.com/blog/wp-content/uploads/2010/05/1132.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="1132" border="0" alt="1132" src="http://xingchexian.com/blog/wp-content/uploads/2010/05/1132_thumb.jpg" width="450" height="285" /></a> </p>
<p>通过修改区号和关键字，可以在不同城市之间切换，怎么样，简单吧。</p>
<div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1759e95f-2c83-4aed-8d4b-0813b11ad59f" class="wlWriterEditableSmartContent">Technorati 标签: <a href="http://technorati.com/tags/Map" rel="tag">Map</a>,<a href="http://technorati.com/tags/mapabc" rel="tag">mapabc</a>,<a href="http://technorati.com/tags/geolocation" rel="tag">geolocation</a>,<a href="http://technorati.com/tags/%e5%9c%b0%e5%9b%be" rel="tag">地图</a></div>
]]></content:encoded>
			<wfw:commentRss>http://xingchexian.com/blog/?feed=rss2&amp;p=231</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
