<?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://www.52ebuy.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.52ebuy.com</link>
	<description>生活的理想，就是为了理想的生活</description>
	<lastBuildDate>Sun, 30 May 2010 16:09:04 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>网络广告收费方式详解</title>
		<link>http://www.52ebuy.com/archives/591</link>
		<comments>http://www.52ebuy.com/archives/591#comments</comments>
		<pubDate>Sun, 30 May 2010 16:09:04 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[周边技术]]></category>
		<category><![CDATA[CPA]]></category>
		<category><![CDATA[CPC]]></category>
		<category><![CDATA[CPM]]></category>
		<category><![CDATA[CPP]]></category>
		<category><![CDATA[CPR]]></category>
		<category><![CDATA[PFP]]></category>
		<category><![CDATA[网络广告]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=591</guid>
		<description><![CDATA[一个网络媒体(网站)会包含有数十个甚至成千上万个页面，网络广告所投放的位置和价格 就牵涉到特定的页面以及浏览人数的多寡。这好比平面媒体(如报纸)的“版位”、“发行量”，或者电波... ]]></description>
			<content:encoded><![CDATA[<p>一个网络媒体(网站)会包含有数十个甚至成千上万个页面，网络广告所投放的位置和价格 就牵涉到特定的页面以及浏览人数的多寡。这好比平面媒体(如报纸)的“版位”、“发行量”，或者电波媒体(如电视)的“时段”、“收视率”的概念。</p>
<p>1. CPC(Cost Per Click；Cost Per Thousand Click-Through) 每点击成本</p>
<p>以每点击一次计费。这样的方法加上点击率限制可以〖WX)〗加强作弊的难度，而且是宣传网站站点的最优方式。但是，此类方法就有不少经营广告的网站 觉得不公平，比如，虽然浏览者没有点击，但是他已经看到了广告，对于这些看到广告却没有点击的流量来说，网站成 了白忙活。有很多网站不愿意做这样的广告，据说，是因为传统媒体从来都没有这样干过。</p>
<p><span id="more-591"></span>2.CPM(Cost Per Mille，或者Cost Per Thousand；Cost Per Impressions) 每千人成本</p>
<p>网上广告收费最科学的办法是按照有多少人看到你的广告来收费。按访问人次收费已经成为网络广告的惯例。CPM(千人成本)指的是广告投放过程中，听 到或者看到某广告的每一人平 均分担到多少广告成本。传统媒介多采用这种计价方式。在网上广告，CPM取决于“印象”尺度，通常理解为一个人的眼睛在一段固定的时间内注视一个广告的次 数。比如说一个广告 横幅的单价是1元/CPM的话，意味着每一千个人次看到这个Ban-ner的话就收1元，如此类推 ，10，000人次访问的主页就是10元。</p>
<p>至于每CPM的收费究竟是多少，要根据以主页的热门程度(即浏览人数)划分价格等级，采 取固定费率。国际惯例是每CPM收费从5美元至200美元不等。</p>
<p>3.CPA(Cost Per Action) 每行动成本</p>
<p>CPA计价方式是指按广告投放实际效果，即按回应的有效问卷或定单来计费，而不限广告投 放量。CPA的计价方式对于网站而言有一定的风险，但若广告投放成功，其收益也比CPM的计 价方式要大得多。 广告主为规避广告费用风险，只有当网络用户点击旗帜广告，链接广告主网页后，才按点击 次数付给广告站点费用。</p>
<p>4.CPR(Cost Per Response) 每回应成本</p>
<p>以浏览者的每一个回应计费。这种广告计费充分体现了网络广告“及时反应、直接互动、准 确记录”的特点，但是，这个显然是属于辅助销售的广告模式，对于那些实际只要亮出名字 就已经有一半满足的品牌广告要求，大概所有的网站都会给予拒绝，因为得到广告费的机会 比CPC还要渺茫。</p>
<p>5.CPP(Cost Per Purchase) 每购买成本</p>
<p>广告主为规避广告费用风险，只有在网络用户点击旗帜广告并进行在线交易后，才按销售笔 数付给广告站点费用。</p>
<p>无论是CPA还是CPP，广告主都要求发生目标消费者的“点击”，甚至进一步形成购买，才予 付费：CPM则只要求发生“目击”(或称“展露”、“印象”)，就产生广告付费。</p>
<p>6.包月方式</p>
<p>很多国内的网站是按照“一个月多少钱”这种固定收费模式来收费的，这对客户和网站都不 公平，无法保障广告客户的利益。虽然国际上一般通用的网络广告收费模式是CPM(千人印象 成本)和CPC(千人点击成本)，但在我国，一个时期以来的网络广告收费模式始终含糊不清， 网络广告商们各自为政，有的使用CPM和CPC计费，有的干脆采用包月的形式，不管效果好坏 ，不管访问量有多少，一律一个价。尽管现在很多大的站点多已采用CPM和CPC计费，但很多 中小站点依然使用包月制。</p>
<p>7.PFP(Pay-For-Performance) 按业绩付费</p>
<p>著名市场研究机构福莱斯特(Forrerster)研究公司最近公布的一项研究报告称，在今后4年 之内，万维网将从目前的广告收费模式——即根据每千次闪现(impression)收费——CPM(这 亦是大多数非在线媒体均所采用的模式)变为按业绩收费(pay-for-performance)的模式。</p>
<p>虽然根据该公司研究人员的预测，未来5年网上广告将呈爆炸性增长，从1999年的28亿美元 猛增至2004年的220亿美元，但是经营模式的转变意味着盈利将成为网络广告发布商关心的 首要问题。</p>
<p>福莱斯特公司高级分析师尼尔说：“互联网广告的一大特点是，它是以业绩为基础的。对发 布商来说，如果浏览者不采取任何实质性的购买行动，就不可能获利。”丘比特公司分析师 格拉克说，基于业绩的定价计费基准有点击次数、销售业绩、导航情况等等，不管是哪种， 可以肯定的是这种计价模式将得到广泛的采用。</p>
<p>虽然基于业绩的广告模式受到广泛欢迎，但并不意味着CPM模式已经过时。相反，如果厂家 坚持这样做，那么受到损失的只会是它自已。一位资深分析家就指出，假如商家在谈判中不 能灵活处理，而坚持采取业绩模式，它将失去很多合作的机会，因为目前许多网站并不接受 这种模式。</p>
<p>8.其他计价方式</p>
<p>某些广告主在进行特殊营销专案时，会提出以下方法个别议价：</p>
<p>(1)CPL(Cost Per Leads)：以搜集潜在客户名单多少来收费；</p>
<p>(2)CPS(Cost Per Sales)：以实际销售产品数量来换算广告刊登金额。</p>
<p>总之，网络广告本身固然有自己的特点，但是玩弄一些花哨名词解决不了实际问题，一个网站要具备有广告价值，都是有着一定的发展历史，那么，在目标市 场决策以后挑选不同的内容网站，进而考察其历史流量进行估算，这样，就可以概算广告在一定期限内的价格，在这个基础上，或者根据不同性质广告，可以把 CPC、CPR、CPA这些东西当作为加权，如此而已 。</p>
<p>相比而言，CPM和包月方式对网站有利，而CPC、CPA、CPR、CPP或PFP则对广告主有利。目前 比较流行的计价方式是CPM和CPC，最为流行的则为CPM。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/591/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>MySQL中UNION和UNION ALL的区别</title>
		<link>http://www.52ebuy.com/archives/589</link>
		<comments>http://www.52ebuy.com/archives/589#comments</comments>
		<pubDate>Sat, 22 May 2010 15:47:41 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[数据库]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[UNION]]></category>
		<category><![CDATA[UNION ALL]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=589</guid>
		<description><![CDATA[在数据库中，UNION和UNION ALL关键字都是将两个结果集合并为一个，但这两者从使用和效率上来说都有所不同。
MySQL中的UNION
UNION在进行表链接后会筛选掉重复的记录，所以在表链接后会对所产生... ]]></description>
			<content:encoded><![CDATA[<p>在数据库中，UNION和UNION ALL关键字都是将两个结果集合并为一个，但这两者从使用和效率上来说都有所不同。</p>
<p><strong>MySQL中的UNION</strong><br />
UNION在进行表链接后会筛选掉重复的记录，所以在表链接后会对所产生的结果集进行排序运算，删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录，最常见的是过程表与历史表UNION。如：<br />
select * from gc_dfys union select * from ls_jg_dfys<br />
这个SQL在运行时先取出两个表的结果，再用排序空间进行排序删除重复的记录，最后返回结果集，如果表数据量大的话可能会导致用磁盘进行排序。 <span id="more-589"></span></p>
<p><strong>MySQL中的UNION ALL</strong><br />
而UNION ALL只是简单的将两个结果合并后就返回。这样，如果返回的两个结果集中有重复的数据，那么返回的结果集就会包含重复的数据了。<br />
从效率上说，UNION ALL 要比UNION快很多，所以，如果可以确认合并的两个结果集中不包含重复的数据的话，那么就使用UNION ALL，如下：<br />
select * from gc_dfys union all select * from ls_jg_dfys﻿</p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/589/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php通过Swift发送邮件</title>
		<link>http://www.52ebuy.com/archives/580</link>
		<comments>http://www.52ebuy.com/archives/580#comments</comments>
		<pubDate>Mon, 17 May 2010 01:54:24 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[PHP编程]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[SMTP]]></category>
		<category><![CDATA[Swift]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=580</guid>
		<description><![CDATA[用QQ的smtp服务器做试验
打开qq邮箱

点击设置，进入邮箱设置页面

点击帐户，进入帐户设置页面
滚动页面到最低端，


开启pop3/smtp，然后保存更改
现在就可以用
host          ：      smtp.q... ]]></description>
			<content:encoded><![CDATA[<p>用QQ的smtp服务器做试验<br />
打开qq邮箱</p>
<p><a href="http://www.52ebuy.com/wp-content/uploads/2010/05/1.jpg" rel="lightbox"><img class="alignnone size-full wp-image-584" title="1" src="http://www.52ebuy.com/wp-content/uploads/2010/05/1.jpg" alt="" width="350" height="72" /></a></p>
<p>点击设置，进入邮箱设置页面</p>
<p><a href="http://www.52ebuy.com/wp-content/uploads/2010/05/2.jpg" rel="lightbox"><img class="alignnone size-full wp-image-585" title="2" src="http://www.52ebuy.com/wp-content/uploads/2010/05/2.jpg" alt="" width="611" height="79" /></a></p>
<p>点击帐户，进入帐户设置页面</p>
<p><span id="more-580"></span>滚动页面到最低端，</p>
<p><a href="http://www.52ebuy.com/wp-content/uploads/2010/05/3.jpg" rel="lightbox"><img class="alignnone size-full wp-image-586" title="3" src="http://www.52ebuy.com/wp-content/uploads/2010/05/3.jpg" alt="" width="525" height="223" /></a></p>
<div>
<p>开启pop3/smtp，然后保存更改</p>
<p>现在就可以用<br />
<span style="font-family: 宋体;">host          ：      smtp.qq.com<br />
port          ：      25<br />
user          ：      ******@qq.com<br />
pass          ：      *************</span></p>
<p>发送邮件了</p>
<p>去网站<a href="http://www.swiftmailer.org/" target="_blank">Swift Mailer</a>下载 swift php5版(这是大趋势)</p>
</div>
<p>现在写代<code><span style="font-family: 新宋体;">码<br />
</span></code></p>
<blockquote><p><code><span style="font-family: 新宋体;">&lt;?php<br />
include_once ('./Swift/Swift.php'</span><span style="font-family: 新宋体;">);<br />
include_once ('./Swift/Swift/Connection/SMTP.php'</span><span style="font-family: 新宋体;">);<br />
</span><span style="font-family: 新宋体;">// 创建smtp连接<br />
$smtp = new Swift_Connection_SMTP('smtp.qq.com', 25</span><span style="font-family: 新宋体;">);<br />
</span><span style="font-family: 新宋体;">// 设置邮箱账号<br />
$smtp-&gt;setUsername('usermail@qq.com'</span><span style="font-family: 新宋体;">);<br />
</span><span style="font-family: 新宋体;">// 设置邮箱登陆密码<br />
$smtp-&gt;setPassword('***password***'</span><span style="font-family: 新宋体;">);</span></code></p>
<p>$swift = new Swift($smtp</p>
<p><span style="font-family: 新宋体;">);<br />
</span><span style="font-family: 新宋体;">// 创建发送内容<br />
$message = new Swift_Message(</span><span style="font-family: 新宋体;"><code>'Test Swift'</code><code>, </code><code>'&lt;h1&gt;Hi!&lt;h1&gt;'</code></span><code><span style="font-family: 新宋体;">, 'text/html', 'base64'</span><span style="font-family: 新宋体;">);</span></code></p>
<p>try{<br />
$swift-&gt;send( $message,</p>
<p><span style="font-family: 新宋体;"><code>'target@qq.com'</code><code>, new Swift_Address('usermail@qq.com', </code><code>'nickname'</code></span><code><span style="font-family: 新宋体;">));<br />
echo 'send ok!'</span><span style="font-family: 新宋体;">;<br />
}catch(Swift_ConnectionException $e</span><span style="font-family: 新宋体;">){<br />
echo 'There was a problem communicating with SMTP: ' . $e-&gt;getMessage</span><span style="font-family: 新宋体;">();<br />
}<br />
?&gt;</span></code></p></blockquote>
<p><code><br />
<span style="font-family: 新宋体;">赶快试试看吧！</span></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/580/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一些实用便利的PHP代码</title>
		<link>http://www.52ebuy.com/archives/577</link>
		<comments>http://www.52ebuy.com/archives/577#comments</comments>
		<pubDate>Thu, 29 Apr 2010 07:07:32 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[PHP编程]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=577</guid>
		<description><![CDATA[1. PHP可阅读随机字符串
此代码将创建一个可阅读的字符串，使其更接近词典中的单词，实用且具有密码验证功能。



/**************
*@length &#8211; length of random string (must be a multiple of 2)
**************/
... ]]></description>
			<content:encoded><![CDATA[<p><strong>1. PHP可阅读随机字符串</strong></p>
<p>此代码将创建一个可阅读的字符串，使其更接近词典中的单词，实用且具有密码验证功能。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/**************<br />
*@length &#8211; length of random string (must be a multiple of 2)<br />
**************/<br />
function readable_random_string($length = 6){<br />
$conso=array(&#8220;b&#8221;,&#8221;c&#8221;,&#8221;d&#8221;,&#8221;f&#8221;,&#8221;g&#8221;,&#8221;h&#8221;,&#8221;j&#8221;,&#8221;k&#8221;,&#8221;l&#8221;,<br />
&#8220;m&#8221;,&#8221;n&#8221;,&#8221;p&#8221;,&#8221;r&#8221;,&#8221;s&#8221;,&#8221;t&#8221;,&#8221;v&#8221;,&#8221;w&#8221;,&#8221;x&#8221;,&#8221;y&#8221;,&#8221;z&#8221;);<br />
$vocal=array(&#8220;a&#8221;,&#8221;e&#8221;,&#8221;i&#8221;,&#8221;o&#8221;,&#8221;u&#8221;);<br />
$password=&#8221;";<br />
srand ((double)microtime()*1000000);<br />
$max = $length/2;<br />
for($i=1; $i&lt;=$max; $i++)<br />
{<br />
$password.=$conso[rand(0,19)];<br />
$password.=$vocal[rand(0,4)];<br />
}<br />
return $password;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong><span id="more-577"></span>2. PHP生成一个随机字符串</strong></p>
<p>如果不需要可阅读的字符串，使用此函数替代，即可创建一个随机字符串，作为用户的随机密码等。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/*************<br />
*@l &#8211; length of random string<br />
*/<br />
function generate_rand($l){<br />
$c= &#8220;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&#8243;;<br />
srand((double)microtime()*1000000);<br />
for($i=0; $i&lt;$l; $i++) {<br />
$rand.= $c[rand()%strlen($c)];<br />
}<br />
return $rand;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>3. PHP编码电子邮件地址</strong></p>
<p>使用此代码，可以将任何电子邮件地址编码为 html 字符实体，以防止被垃圾邮件程序收集。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function encode_email($email=&#8217;info@domain.com&#8217;, $linkText=&#8217;Contact Us&#8217;, $attrs =&#8217;class=&#8221;emailencoder&#8221;&#8216; )<br />
{<br />
// remplazar aroba y puntos<br />
$email = str_replace(&#8216;@&#8217;, &#8216;&amp;#64;&#8217;, $email);<br />
$email = str_replace(&#8216;.&#8217;, &#8216;&amp;#46;&#8217;, $email);<br />
$email = str_split($email, 5);</p>
<p>$linkText = str_replace(&#8216;@&#8217;, &#8216;&amp;#64;&#8217;, $linkText);<br />
$linkText = str_replace(&#8216;.&#8217;, &#8216;&amp;#46;&#8217;, $linkText);<br />
$linkText = str_split($linkText, 5);</p>
<p>$part1 = &#8216;&lt;a href=&#8221;ma&#8217;;<br />
$part2 = &#8216;ilto&amp;#58;&#8217;;<br />
$part3 = &#8216;&#8221; &#8216;. $attrs .&#8217; &gt;&#8217;;<br />
$part4 = &#8216;&lt;/a&gt;&#8217;;</p>
<p>$encoded = &#8216;&lt;script type=&#8221;text/javascript&#8221;&gt;&#8217;;<br />
$encoded .= &#8220;document.write(&#8216;$part1&#8242;);&#8221;;<br />
$encoded .= &#8220;document.write(&#8216;$part2&#8242;);&#8221;;<br />
foreach($email as $e)<br />
{<br />
$encoded .= &#8220;document.write(&#8216;$e&#8217;);&#8221;;<br />
}<br />
$encoded .= &#8220;document.write(&#8216;$part3&#8242;);&#8221;;<br />
foreach($linkText as $l)<br />
{<br />
$encoded .= &#8220;document.write(&#8216;$l&#8217;);&#8221;;<br />
}<br />
$encoded .= &#8220;document.write(&#8216;$part4&#8242;);&#8221;;<br />
$encoded .= &#8216;&lt;/script&gt;&#8217;;</p>
<p>return $encoded;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>4. PHP验证邮件地址</strong></p>
<p>电子邮件验证也许是中最常用的网页表单验证，此代码除了验证电子邮件地址，也可以选择检查邮件域所属 DNS 中的 MX 记录，使邮件验证功能更加强大。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function is_valid_email($email, $test_mx = false)<br />
{<br />
if(eregi(&#8220;^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$&#8221;, $email))<br />
if($test_mx)<br />
{<br />
list($username, $domain) = split(&#8220;@&#8221;, $email);<br />
return getmxrr($domain, $mxrecords);<br />
}<br />
else<br />
return true;<br />
else<br />
return false;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>5. PHP列出目录内容</strong></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function list_files($dir)<br />
{<br />
if(is_dir($dir))<br />
{<br />
if($handle = opendir($dir))<br />
{<br />
while(($file = readdir($handle)) !== false)<br />
{<br />
if($file != &#8220;.&#8221; &amp;&amp; $file != &#8220;..&#8221; &amp;&amp; $file != &#8220;Thumbs.db&#8221;)<br />
{<br />
echo &#8216;&lt;a target=&#8221;_blank&#8221; href=&#8221;&#8216;.$dir.$file.&#8217;&#8221;&gt;&#8217;.$file.&#8217;&lt;/a&gt;&lt;br&gt;&#8217;.&#8221;\n&#8221;;<br />
}<br />
}<br />
closedir($handle);<br />
}<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>6. PHP销毁目录</strong></p>
<p>删除一个目录，包括它的内容。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/*****<br />
*@dir &#8211; Directory to destroy<br />
*@virtual[optional]- whether a virtual directory<br />
*/<br />
function destroyDir($dir, $virtual = false)<br />
{<br />
$ds = DIRECTORY_SEPARATOR;<br />
$dir = $virtual ? realpath($dir) : $dir;<br />
$dir = substr($dir, -1) == $ds ? substr($dir, 0, -1) : $dir;<br />
if (is_dir($dir) &amp;&amp; $handle = opendir($dir))<br />
{<br />
while ($file = readdir($handle))<br />
{<br />
if ($file == &#8216;.&#8217; || $file == &#8216;..&#8217;)<br />
{<br />
continue;<br />
}<br />
elseif (is_dir($dir.$ds.$file))<br />
{<br />
destroyDir($dir.$ds.$file);<br />
}<br />
else<br />
{<br />
unlink($dir.$ds.$file);<br />
}<br />
}<br />
closedir($handle);<br />
rmdir($dir);<br />
return true;<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>7. PHP解析 JSON 数据</strong></p>
<p>与大多数流行的 Web 服务如 twitter 通过开放 API 来提供数据一样，它总是能够知道如何解析 API 数据的各种传送格式，包括 JSON，XML 等等。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">$json_string=&#8217;{&#8220;id&#8221;:1,&#8221;name&#8221;:&#8221;foo&#8221;,&#8221;email&#8221;:&#8221;foo@foobar.com&#8221;,&#8221;interest&#8221;:["wordpress","php"]} &#8216;;<br />
$obj=json_decode($json_string);<br />
echo $obj-&gt;name; //prints foo<br />
echo $obj-&gt;interest[1]; //prints php</td>
</tr>
</tbody>
</table>
<p><strong>8. PHP解析 XML 数据</strong></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">//xml string<br />
$xml_string=&#8221;&lt;?xml version=&#8217;1.0&#8242;?&gt;<br />
&lt;users&gt;<br />
&lt;user id=&#8217;398&#8242;&gt;<br />
&lt;name&gt;Foo&lt;/name&gt;<br />
&lt;email&gt;foo@bar.com&lt;/name&gt;<br />
&lt;/user&gt;<br />
&lt;user id=&#8217;867&#8242;&gt;<br />
&lt;name&gt;Foobar&lt;/name&gt;<br />
&lt;email&gt;foobar@foo.com&lt;/name&gt;<br />
&lt;/user&gt;<br />
&lt;/users&gt;&#8221;;</p>
<p>//load the xml string using simplexml<br />
$xml = simplexml_load_string($xml_string);</p>
<p>//loop through the each node of user<br />
foreach ($xml-&gt;user as $user)<br />
{<br />
//access attribute<br />
echo $user['id'], &#8216; &#8216;;<br />
//subnodes are accessed by -&gt; operator<br />
echo $user-&gt;name, &#8216; &#8216;;<br />
echo $user-&gt;email, &#8216;&lt;br /&gt;&#8217;;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>9. PHP创建日志缩略名</strong></p>
<p>创建用户友好的日志缩略名。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function create_slug($string){<br />
$slug=preg_replace(&#8216;/[^A-Za-z0-9-]+/&#8217;, &#8216;-&#8217;, $string);<br />
return $slug;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>10. PHP获取客户端真实 IP 地址</strong></p>
<p>该函数将获取用户的真实 IP 地址，即便他使用代理服务器。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function getRealIpAddr()<br />
{<br />
if (!emptyempty($_SERVER['HTTP_CLIENT_IP']))<br />
{<br />
$ip=$_SERVER['HTTP_CLIENT_IP'];<br />
}<br />
elseif (!emptyempty($_SERVER['HTTP_X_FORWARDED_FOR']))<br />
//to check ip is pass from proxy<br />
{<br />
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];<br />
}<br />
else<br />
{<br />
$ip=$_SERVER['REMOTE_ADDR'];<br />
}<br />
return $ip;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>11. PHP强制性文件下载</strong></p>
<p>为用户提供强制性的文件下载功能。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/********************<br />
*@file &#8211; path to file<br />
*/<br />
function force_download($file)<br />
{<br />
if ((isset($file))&amp;&amp;(file_exists($file))) {<br />
header(&#8220;Content-length: &#8220;.filesize($file));<br />
header(&#8216;Content-Type: application/octet-stream&#8217;);<br />
header(&#8216;Content-Disposition: attachment; filename=&#8221;&#8216; . $file . &#8216;&#8221;&#8216;);<br />
readfile(&#8220;$file&#8221;);<br />
} else {<br />
echo &#8220;No file selected&#8221;;<br />
}<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>12. PHP创建标签云</strong></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function getCloud( $data = array(), $minFontSize = 12, $maxFontSize = 30 )<br />
{<br />
$minimumCount = min( array_values( $data ) );<br />
$maximumCount = max( array_values( $data ) );<br />
$spread = $maximumCount &#8211; $minimumCount;<br />
$cloudHTML = &#8221;;<br />
$cloudTags = array();</p>
<p>$spread == 0 &amp;&amp; $spread = 1;</p>
<p>foreach( $data as $tag =&gt; $count )<br />
{<br />
$size = $minFontSize + ( $count &#8211; $minimumCount )<br />
* ( $maxFontSize &#8211; $minFontSize ) / $spread;<br />
$cloudTags[] = &#8216;&lt;a style=&#8221;font-size: &#8216; . floor( $size ) . &#8216;px&#8217;<br />
. &#8216;&#8221; href=&#8221;#&#8221; title=&#8221;\&#8221; . $tag .<br />
&#8216;\&#8217; returned a count of &#8216; . $count . &#8216;&#8221;&gt;&#8217;<br />
. htmlspecialchars( stripslashes( $tag ) ) . &#8216;&lt;/a&gt;&#8217;;<br />
}</p>
<p>return join( &#8220;\n&#8221;, $cloudTags ) . &#8220;\n&#8221;;<br />
}<br />
/**************************<br />
**** Sample usage ***/<br />
$arr = Array(&#8216;Actionscript&#8217; =&gt; 35, &#8216;Adobe&#8217; =&gt; 22, &#8216;Array&#8217; =&gt; 44, &#8216;Background&#8217; =&gt; 43,<br />
&#8216;Blur&#8217; =&gt; 18, &#8216;Canvas&#8217; =&gt; 33, &#8216;Class&#8217; =&gt; 15, &#8216;Color Palette&#8217; =&gt; 11, &#8216;Crop&#8217; =&gt; 42,<br />
&#8216;Delimiter&#8217; =&gt; 13, &#8216;Depth&#8217; =&gt; 34, &#8216;Design&#8217; =&gt; 8, &#8216;Encode&#8217; =&gt; 12, &#8216;Encryption&#8217; =&gt; 30,<br />
&#8216;Extract&#8217; =&gt; 28, &#8216;Filters&#8217; =&gt; 42);<br />
echo getCloud($arr, 12, 36);</td>
</tr>
</tbody>
</table>
<p><strong>13. PHP寻找两个字符串的相似性</strong></p>
<p>PHP 提供了一个极少使用的 similar_text 函数，但此函数非常有用，用于比较两个字符串并返回相似程度的百分比。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">similar_text($string1, $string2, $percent);<br />
//$percent will have the percentage of similarity</td>
</tr>
</tbody>
</table>
<p><strong>14. PHP在应用程序中使用 Gravatar 通用头像</strong></p>
<p>随着 WordPress 越来越普及，Gravatar 也随之流行。由于 Gravatar 提供了易于使用的 API，将其纳入应用程序也变得十分方便。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/******************<br />
*@email &#8211; Email address to show gravatar for<br />
*@size &#8211; size of gravatar<br />
*@default &#8211; URL of default gravatar to use<br />
*@rating &#8211; rating of Gravatar(G, PG, R, X)<br />
*/<br />
function show_gravatar($email, $size, $default, $rating)<br />
{<br />
echo &#8216;&lt;img src=&#8221;http://www.gravatar.com/avatar.php?gravatar_id=&#8217;.md5($email).<br />
&#8216;&amp;default=&#8217;.$default.&#8217;&amp;size=&#8217;.$size.&#8217;&amp;rating=&#8217;.$rating.&#8217;&#8221; width=&#8221;&#8216;.$size.&#8217;px&#8221;<br />
height=&#8221;&#8216;.$size.&#8217;px&#8221; /&gt;&#8217;;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>15. PHP在字符断点处截断文字</strong></p>
<p>所谓断字 (word break)，即一个单词可在转行时断开的地方。这一函数将在断字处截断字符串。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">// Original PHP code by Chirp Internet: www.chirp.com.au<br />
// Please acknowledge use of this code by including this header.<br />
function myTruncate($string, $limit, $break=&#8221;.&#8221;, $pad=&#8221;&#8230;&#8221;) {<br />
// return with no change if string is shorter than $limit<br />
if(strlen($string) &lt;= $limit)<br />
return $string;</p>
<p>// is $break present between $limit and the end of the string?<br />
if(false !== ($breakpoint = strpos($string, $break, $limit))) {<br />
if($breakpoint &lt; strlen($string) &#8211; 1) {<br />
$string = substr($string, 0, $breakpoint) . $pad;<br />
}<br />
}<br />
return $string;<br />
}<br />
/***** Example ****/<br />
$short_string=myTruncate($long_string, 100, &#8216; &#8216;);</td>
</tr>
</tbody>
</table>
<p><strong>16. PHP文件 Zip 压缩</strong></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/* creates a compressed zip file */<br />
function create_zip($files = array(),$destination = &#8221;,$overwrite = false) {<br />
//if the zip file already exists and overwrite is false, return false<br />
if(file_exists($destination) &amp;&amp; !$overwrite) { return false; }<br />
//vars<br />
$valid_files = array();<br />
//if files were passed in&#8230;<br />
if(is_array($files)) {<br />
//cycle through each file<br />
foreach($files as $file) {<br />
//make sure the file exists<br />
if(file_exists($file)) {<br />
$valid_files[] = $file;<br />
}<br />
}<br />
}<br />
//if we have good files&#8230;<br />
if(count($valid_files)) {<br />
//create the archive<br />
$zip = new ZipArchive();<br />
if($zip-&gt;open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {<br />
return false;<br />
}<br />
//add the files<br />
foreach($valid_files as $file) {<br />
$zip-&gt;addFile($file,$file);<br />
}<br />
//debug<br />
//echo &#8216;The zip archive contains &#8216;,$zip-&gt;numFiles,&#8217; files with a status of &#8216;,$zip-&gt;status;</p>
<p>//close the zip &#8212; done!<br />
$zip-&gt;close();</p>
<p>//check to make sure the file exists<br />
return file_exists($destination);<br />
}<br />
else<br />
{<br />
return false;<br />
}<br />
}<br />
/***** Example Usage ***/<br />
$files=array(&#8216;file1.jpg&#8217;, &#8216;file2.jpg&#8217;, &#8216;file3.gif&#8217;);<br />
create_zip($files, &#8216;myzipfile.zip&#8217;, true);</td>
</tr>
</tbody>
</table>
<p><strong>17. PHP解压缩 Zip 文件</strong></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/**********************<br />
*@file &#8211; path to zip file<br />
*@destination &#8211; destination directory for unzipped files<br />
*/<br />
function unzip_file($file, $destination){<br />
// create object<br />
$zip = new ZipArchive() ;<br />
// open archive<br />
if ($zip-&gt;open($file) !== TRUE) {<br />
die (’Could not open archive’);<br />
}<br />
// extract contents to destination directory<br />
$zip-&gt;extractTo($destination);<br />
// close archive<br />
$zip-&gt;close();<br />
echo &#8216;Archive extracted to directory&#8217;;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>18. PHP为 URL 地址预设 http 字符串</strong></p>
<p>有时需要接受一些表单中的网址输入，但用户很少添加 http:// 字段，此代码将为网址添加该字段。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">if (!preg_match(&#8220;/^(http|ftp):/&#8221;, $_POST['url'])) {<br />
$_POST['url'] = &#8216;http://&#8217;.$_POST['url'];<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>19. PHP将网址字符串转换成超级链接</strong></p>
<p>该函数将 URL 和 E-mail 地址字符串转换为可点击的超级链接。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">
<pre><code>function makeClickableLinks($text) {
 $text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_+.~#?&amp;//=]+)',
 '&lt;a href="\1"&gt;\1&lt;/a&gt;', $text);
 $text = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_+.~#?&amp;//=]+)',
 '\1&lt;a href="http://\2"&gt;\2&lt;/a&gt;', $text);
 $text = eregi_replace('([_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3})',
 '&lt;a href="mailto:\1"&gt;\1&lt;/a&gt;', $text);  

return $text;
}</code></pre>
</td>
</tr>
</tbody>
</table>
<p><strong>20. PHP调整图像尺寸</strong></p>
<p>创建图像缩略图需要许多时间，此代码将有助于了解缩略图的逻辑。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">/**********************<br />
*@filename &#8211; path to the image<br />
*@tmpname &#8211; temporary path to thumbnail<br />
*@xmax &#8211; max width<br />
*@ymax &#8211; max height<br />
*/<br />
function resize_image($filename, $tmpname, $xmax, $ymax)<br />
{<br />
$ext = explode(&#8220;.&#8221;, $filename);<br />
$ext = $ext[count($ext)-1];</p>
<p>if($ext == &#8220;jpg&#8221; || $ext == &#8220;jpeg&#8221;)<br />
$im = imagecreatefromjpeg($tmpname);<br />
elseif($ext == &#8220;png&#8221;)<br />
$im = imagecreatefrompng($tmpname);<br />
elseif($ext == &#8220;gif&#8221;)<br />
$im = imagecreatefromgif($tmpname);</p>
<p>$x = imagesx($im);<br />
$y = imagesy($im);</p>
<p>if($x &lt;= $xmax &amp;&amp; $y &lt;= $ymax)<br />
return $im;</p>
<p>if($x &gt;= $y) {<br />
$newx = $xmax;<br />
$newy = $newx * $y / $x;<br />
}<br />
else {<br />
$newy = $ymax;<br />
$newx = $x / $y * $newy;<br />
}</p>
<p>$im2 = imagecreatetruecolor($newx, $newy);<br />
imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);<br />
return $im2;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>21. PHP检测 ajax 请求</strong></p>
<p>大多数的 JavaScript 框架如 jquery，Mootools 等，在发出 Ajax 请求时，都会发送额外的 HTTP_X_REQUESTED_WITH 头部信息，头当他们一个ajax请求，因此你可以在服务器端侦测到 Ajax 请求。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">if(!emptyempty($_SERVER['HTTP_X_REQUESTED_WITH']) &amp;&amp; strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == &#8216;xmlhttprequest&#8217;){<br />
//If AJAX Request Then<br />
}else{<br />
//something else<br />
}</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/577/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jquery validate自定义验证方法</title>
		<link>http://www.52ebuy.com/archives/575</link>
		<comments>http://www.52ebuy.com/archives/575#comments</comments>
		<pubDate>Wed, 21 Apr 2010 15:11:17 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[前端脚本]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[validate]]></category>
		<category><![CDATA[自定义验证]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=575</guid>
		<description><![CDATA[/* 追加自定义验证方法 */
// 身份证号码验证
jQuery.validator.addMethod(&#8220;idcardno&#8221;, function(value, element) {
return this.optional(element) &#124;&#124; isIdCardNo(value);
}, &#8221;请正确输入身份证号码&#822... ]]></description>
			<content:encoded><![CDATA[<p>/* 追加自定义验证方法 */<br />
// 身份证号码验证<br />
jQuery.validator.addMethod(&#8220;idcardno&#8221;, function(value, element) {<br />
return this.optional(element) || isIdCardNo(value);<br />
}, &#8221;请正确输入身份证号码&#8221;);</p>
<p>//字母数字<br />
jQuery.validator.addMethod(&#8220;alnum&#8221;, function(value, element) {<br />
return this.optional(element) || /^[a-zA-Z0-9]+$/.test(value);<br />
}, &#8221;只能包括英文字母和数字&#8221;);<br />
<span id="more-575"></span><br />
// 手机号码验证<br />
jQuery.validator.addMethod(&#8220;cellphone&#8221;, function(value, element) {<br />
var length = value.length;<br />
return this.optional(element) || (length == 11 &amp;&amp; /^(1\d{10})$/.test(value));<br />
}, &#8221;请正确填写手机号码&#8221;);</p>
<p>// 电话号码验证<br />
jQuery.validator.addMethod(&#8220;telephone&#8221;, function(value, element) {<br />
var tel = /^(\d{3,4}-?)?\d{7,9}$/g;<br />
return this.optional(element) || (tel.test(value));<br />
}, &#8221;请正确填写电话号码&#8221;);</p>
<p>// 邮政编码验证<br />
jQuery.validator.addMethod(&#8220;zipcode&#8221;, function(value, element) {<br />
var tel = /^[0-9]{6}$/;<br />
return this.optional(element) || (tel.test(value));<br />
}, &#8221;请正确填写邮政编码&#8221;);</p>
<p>// 汉字<br />
jQuery.validator.addMethod(&#8220;chcharacter&#8221;, function(value, element) {<br />
var tel = /^[\u4e00-\u9fa5]+$/;<br />
return this.optional(element) || (tel.test(value));<br />
}, &#8221;请输入汉字&#8221;);</p>
<p>/**<br />
* 身份证号码验证<br />
*<br />
*/<br />
function isIdCardNo(num) {</p>
<p>var factorArr = new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);<br />
var parityBit=new Array(&#8220;1&#8243;,&#8221;0&#8243;,&#8221;X&#8221;,&#8221;9&#8243;,&#8221;8&#8243;,&#8221;7&#8243;,&#8221;6&#8243;,&#8221;5&#8243;,&#8221;4&#8243;,&#8221;3&#8243;,&#8221;2&#8243;);<br />
var varArray = new Array();<br />
var intValue;<br />
var lngProduct = 0;<br />
var intCheckDigit;<br />
var intStrLen = num.length;<br />
var idNumber = num;<br />
// initialize<br />
if ((intStrLen != 15) &amp;&amp; (intStrLen != 18)) {<br />
return false;<br />
}<br />
// check and set value<br />
for(i=0;i&lt;intStrLen;i++) {<br />
varArray[i] = idNumber.charAt(i);<br />
if ((varArray[i] &lt; &#8217;0&#8242; || varArray[i] &gt; &#8217;9&#8242;) &amp;&amp; (i != 17)) {<br />
return false;<br />
} else if (i &lt; 17) {<br />
varArray[i] = varArray[i] * factorArr[i];<br />
}<br />
}</p>
<p>if (intStrLen == 18) {<br />
//check date<br />
var date8 = idNumber.substring(6,14);<br />
if (isDate8(date8) == false) {<br />
return false;<br />
}<br />
// calculate the sum of the products<br />
for(i=0;i&lt;17;i++) {<br />
lngProduct = lngProduct + varArray[i];<br />
}<br />
// calculate the check digit<br />
intCheckDigit = parityBit[lngProduct % 11];<br />
// check last digit<br />
if (varArray[17] != intCheckDigit) {<br />
return false;<br />
}<br />
}<br />
else{        //length is 15<br />
//check date<br />
var date6 = idNumber.substring(6,12);<br />
if (isDate6(date6) == false) {</p>
<p>return false;<br />
}<br />
}<br />
return true;</p>
<p>}<br />
/**<br />
* 判断是否为“YYYYMM”式的时期<br />
*<br />
*/<br />
function isDate6(sDate) {<br />
if(!/^[0-9]{6}$/.test(sDate)) {<br />
return false;<br />
}<br />
var year, month, day;<br />
year = sDate.substring(0, 4);<br />
month = sDate.substring(4, 6);<br />
if (year &lt; 1700 || year &gt; 2500) return false<br />
if (month &lt; 1 || month &gt; 12) return false<br />
return true<br />
}<br />
/**<br />
* 判断是否为“YYYYMMDD”式的时期<br />
*<br />
*/<br />
function isDate8(sDate) {<br />
if(!/^[0-9]{8}$/.test(sDate)) {<br />
return false;<br />
}<br />
var year, month, day;<br />
year = sDate.substring(0, 4);<br />
month = sDate.substring(4, 6);<br />
day = sDate.substring(6, 8);<br />
var iaMonthDays = [31,28,31,30,31,30,31,31,30,31,30,31]<br />
if (year &lt; 1700 || year &gt; 2500) return false<br />
if (((year % 4 == 0) &amp;&amp; (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1]=29;<br />
if (month &lt; 1 || month &gt; 12) return false<br />
if (day &lt; 1 || day &gt; iaMonthDays[month - 1]) return false<br />
return true<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/575/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>提高网站可用性的10个小技巧</title>
		<link>http://www.52ebuy.com/archives/572</link>
		<comments>http://www.52ebuy.com/archives/572#comments</comments>
		<pubDate>Mon, 19 Apr 2010 10:19:52 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[用户体验]]></category>
		<category><![CDATA[可用性]]></category>
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=572</guid>
		<description><![CDATA[不论是企业网站、个人博客，或者购物网站、游戏网站，我们都希望能吸引访问者并且给他们留下愉快的访问体验。
可用性是用户体验的一种度量，它可以用访问者完成网站功能的方便程度来... ]]></description>
			<content:encoded><![CDATA[<p>不论是企业网站、个人博客，或者购物网站、游戏网站，我们都希望能吸引访问者并且给他们留下愉快的访问体验。</p>
<p>可用性是用户体验的一种度量，它可以用访问者完成网站功能的方便程度来描述——无论是通过自身知识还是通过学习新方式来完成这种功能。我认为Jakob Nielson的解释非常到位，他说：</p>
<p>可用性是评估网站易用程度的一种属性。同时“可用性”这个词也指在设计过程中提高易用性的方法。</p>
<p>在本文中我希望能够提供一个可用性清单，内容覆盖了从视觉设计，到可以用在任何项目中的简单导航提示等多个方面。</p>
<h3><span id="more-572"></span>1. 当前位置导航</h3>
<p>要让用户在任何时候都知道自己身处哪个模块，或者在浏览那个分类。对任何网站来说，这都可以极大提升可用性。在这一点上，创建当前位置导航可以算是最有效的提升可用性方式。</p>
<p>当前位置导航的理想方式是在服务端创建，这样可以大量节省HTML和CSS代码。如果不方便在服务端创建导航，那么<a href="http://css-tricks.com/id-your-body-for-greater-css-control-and-specificity/" target="_blank">使用CSS操纵你的body元素</a> 从而直接定义每个导航标签也是一个不错的方法。</p>
<p>另外，你可以方便的 <a href="http://www.cssnewbie.com/using-javascript-to-style-active-navigation-elements/" target="_blank">使用JavaScript创建当前位置导航菜单</a>。</p>
<p>要注意，你的当前位置导航最好和鼠标滑过样式保持不同，这是很多网站缩不注意的。</p>
<div>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181315GVF.jpg" alt="active and hover navigation example" width="398" height="125" /></p>
<div>
<h3>2. 可用的表单标签和按钮</h3>
<p>使用HTML的label属性，可以让用户通过点击注释标签来激活表单元素，这是HTML的一个伟大的内置功能，但不幸的是，很少有用户知道这回事。</p>
<p>怎样让用户了解这个功能呢？你可以通过改变鼠标指针形状的方式来提醒用户，这只需要一两行代码就可以实现。</p>
</div>
</div>
<div>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181315OfK.jpg" alt="form label with hover effect" width="398" height="130" /></p>
<p>做成这样之后，用户就很容易的知道这标签是可以点的，我经常觉得HTML标准里没有把这些可以点的元素统一设置为小手指针是非常不应该的，所以我通常我会这样统一定义：</p>
<pre>label, button, input[type="submit"]{cursor:pointer;}
</pre>
<div></div>
<div>
<h3>3. 将你的LOGO链接到首页</h3>
<p>我认为logo不链接到你的网站首页是一件令人沮丧的事情，恰恰有很多网站没有这样做。用户研究表明，这样做是很有必要的，用户需要它！</p>
</div>
</div>
<p>如今越来越多的网站意识到，给LOGO加链接的重要性。用户已不满足于一个标记为“主页”的文字链接，用户希望点一下logo就可以回到首页。</p>
<p>拿Facebook为例，它为每一个导航元素增加了“ref”属性来跟踪用户点击。如下图：</p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181315y9S.jpg" alt="facebook" width="318" height="99" /></p>
<h3>4. 加大链接的点击面积</h3>
<p>大约一年前，37Signals 的 Ryan Singer 写了一篇文章来介绍它们在 Basecamp 项目中如何<a href="http://go31.com/index.php?q=aHR0cDovL3d3dy4zN3NpZ25hbHMuY29tL3N2bi9wb3N0cy8xMDQ4LXBhZGRlZC1saW5rLXRhcmdldHMtZm9yLWJldHRlci1tb3VzaW5n">增大链接的可点击面积</a> 。这又是一个提升网站可用性的小细节，它只需要你增加链接周围的 padding 值就可以有效增大点击面积。</p>
<p>对任何网站来说这都是一个值得尝试的方法，它可以方式用户误点或点不到链接。并且对于手机网页的设计更为重要，因为很多用户使用手指来点击触摸屏上的链接，增大面积可以帮他们更方便的浏览网页。</p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181315xHm.jpg" alt="iphone" width="358" height="238" /></p>
<h3>5. 表单元素焦点显示</h3>
<p>为处于激活状态的表单元素添加焦点显示，越来越成为UI设计的一种趋势。它让用户了解自己做了什么，在做什么。这是一种简单但有效的向用户传递有用细节信息的方式。</p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/1813162vX.jpg" alt="a focused form element" width="398" height="118" /></p>
<h3>6. 提供有用的404错误页面</h3>
<p>让网站呈现给用户一个大大的 Apache 错误信息会让人很不爽，创建一个友好的、有用的404错误页面是一个不错的解决方法。因为对非开发者来说，“404”这些数字没有任何意义和价值，用户只希望在网站上找到自己需要的信息。</p>
<p>要建立一种可以帮助用户正确的找到他们需要的信息的错误提示页面，比如显示一些抱歉的同时，加上搜索框、推荐文章或首页链接等，努力把用户留在网站上，而不要把责任都推给用户输入了错误链接。</p>
<p>这里有一些优秀的404页面欣赏：  <a href="http://oncoding.net/visual/color/article200906/207.html" target="_blank">极富创意的404错误页面欣赏</a></p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181316htS.jpg" alt="404 error" width="286" height="233" /></p>
<h3>7. 创造一个舒适的文字环境</h3>
<p>如今，网站文案撰写已成为了一个很大的话题，做网站有越来越多的细节需要考虑。</p>
<p>从古到今，关于网站文字内容的讨论从未间断并且其标准在一直变化。当年<a href="http://go31.com/index.php?q=aHR0cDovL3d3dy5zZW5zaWJsZS5jb20v">Steve Krug</a> 曾主张缩减掉一半的文字内容，转而用列表的形式呈现它们。</p>
<p>但现在不同了，我们需要用和朋友对话的方式来撰写文案，让用户感觉到一种舒适温馨的氛围。这样用户就会少一些局促感，即使他们遇到了使用上的问题，他也会心情愉悦的在网站帮助中寻找解决的办法。</p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181316UHp.jpg" alt="couch" width="350" height="170" /></p>
<h3>8. 调整行距增强可读性</h3>
<p>行距是可以从书报杂志等传统媒体直接过度到网页上的元素之一，这些内容的研究和改进已经进行了数百年，已经积累了大量优秀的经验。所以你下次设计之前，大可以先翻翻杂志找找灵感。</p>
<p>行距是网页设计中经常被忽视或滥用的地方，我通常从1.4倍行距出发开始设计，然后根据设计和内容进行调整。</p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181316QaM.jpg" alt="example of line height" width="308" height="187" /></p>
<h3>9. 使用空白来区分和归类元素</h3>
<p>将内容元素归类组合是显示内容的一种方式。你可以使用图片、边框或者仅仅是使用空白来归类区分。使用空白归类内容元素可以创造自然和谐的用户体验，即使是匆匆的一瞥，内容也会一目了然。</p>
<p>用户一眼扫过网页（比如阅读TOP10列表时），首先会注意标题。我们首先希望的是，我们的网站内容很有趣，能吸引用户进一步阅读。但是对用户进行正确的引导，会对内容的展示起到促进和相得益彰的作用。</p>
<p><img src="http://www.oncoding.cn/wp-content/uploads/09img/2009/11/181317Fj6.jpg" alt="whitespace" width="443" height="203" /></p>
<h3>10. 无障碍浏览</h3>
<p>这里并不是指“508法案” ( 即section 508，美国法律，大体上描述为：某些特殊用户群体，如残疾人，浏览某网站时，如果无法正常获得所期望的信息，那可以依据相关法规，对该网站依法起诉。 )  这里所说的“无障碍”，指的是为你的用户考虑到方方面面，让他们轻松的找到需要的东西。</p>
<p>如果说保证浏览无障碍可以让你的用户不会发怒，不会甩袖子走人，那么“快速响应”则是你留住用户的最后一道防线。</p>
<p>如果有决心的话，你可以做所有你能想到的测试，然后多方参考用户的试用意见。目的就是最大限度的留住用户，因为用户个体的意识和习惯之间存在差异，很难找到让所有用户满意的方式。</p>
<p>谈到“无障碍浏览”和“快速响应”，你可能会首先想到视觉障碍人士，但其含义远远超过这些。例如，你必须让你的网站适应用户的带宽限制（拨号上网，手机上网，网速慢等）和旧版本的浏览器（一些公司不会让员工升级浏览器） 。</p>
<p>如果我们尽最大努力的消除网站使用的障碍，并且快速的相应网站的问题，我们就能建立一个完善的用户体验，给用户留下良好的印象并且还会再次回来。</p>
<p>文章转自：<a href="http://www.oncoding.cn/2009/tips-more-usable-web/" target="_blank">http://www.oncoding.cn/2009/tips-more-usable-web/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/572/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook性能大提升的秘密：HipHop</title>
		<link>http://www.52ebuy.com/archives/557</link>
		<comments>http://www.52ebuy.com/archives/557#comments</comments>
		<pubDate>Fri, 16 Apr 2010 14:10:08 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[解决方案]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[HipHop]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=557</guid>
		<description><![CDATA[
Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个PHP到C++的转换程序，一个重新实现的PHP运行库，和许多常用PHP扩展的重写版本构成，目的是旨在加速和优化PHP。
用Facebook官方博客... ]]></description>
			<content:encoded><![CDATA[<p><img src="http://news.csdn.net/a//uploads/2010/02/03/20100203-044306-pic1.png" alt="HipHop" width="200" height="200" align="middle" /></p>
<p>Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个PHP到C++的转换程序，一个重新实现的PHP运行库，和许多常用PHP扩展的重写版本构成，目的是旨在加速和优化PHP。</p>
<p>用<a href="http://developers.facebook.com/news.php?story=358blog=1">Facebook官方博客</a>（无 法直接访问）上项目负责人赵海平（北大1987届遗传与分子生物专业，普林斯顿计算机科学博士）的话说，HipHop项目对Facebook影响巨大。它 目前已经支撑了Facebook 90%的Web流量。由于HipHop，Facebook Web服务器上的CPU使用平均减少了50%，从而大大减少了服务器的需求。为了让这一改进也惠及社区，他们决定将之开源，希望能够进一步帮助提高更多大 型复杂PHP网站的可伸缩性。</p>
<p><strong><span id="more-557"></span>PHP和Facebook的问题</strong></p>
<p>众所周知，Facebook的前端主要是用PHP写的。赵海平说，过去六年Facebook从PHP语言的进展上获益良多。PHP非常简单，易学易用，好读好调试，因此新工程师成长很快，有利地促进了Facebook的更快的创新。</p>
<p>PHP是一种脚本语言，其好处是编程效率高，能够支持产品的快速迭代。但是与传统的编译语言相比，脚本语言的CPU和内存使用效率不好。随着 Ajax技术的广泛采用，加上SNS对动态要求较高，这些缺点更显得突出。对于每月超过4000亿次PV的Facebook来说，如何实现扩展，尤其具有 挑战性。</p>
<p>常见的办法是直接用C++重写PHP应用中比较复杂的部分，作为PHP扩展。实际上，PHP就转变为一种胶水语言，连接前端HTML和C++应用逻 辑。从技术角度讲这也没有问题，但是增加了技能需求，能够在整个应用上工作的工程师数量就大大减少了。学习C++只是编写PHP扩展的第一步，接下来还要 理解Zend API。由于Facebook的工程团队较小，每个工程师要支持100万以上的用户。有些代码不是团队里每个人都能看懂，这对于Facebook是无法接 受的。</p>
<p>Facebook网站本身的可伸缩性更具挑战性，因为几乎每次页面浏览都是有个性化体验的登录用户发起。浏览主页 时，系统需要查询所有朋友、朋友最重要的状态更新、 根据隐私设置筛选结果，然后还要显示评论、照片等等动态，这一切都需要在一秒内完 成。</p>
<p>自2007年以来，Facebook曾写过几种不同办法解决这些问题。其中包括用另 一种语言重写Facebook，但是由于开发的复杂性和速度等原因，未能实现。他们还重写了PHP的核心部分Zend引擎，并提交给了PHP项目，但最终 还是没有获得所需的性能。最后，他们选择了HipHop，终于得偿所愿。</p>
<p>有了HipHop，工程师可以编写代码，用PHP编写组合最后页面的逻辑，并能够继续快速迭代，同时后端服务使用C++, Erlang, Java, Py thon编写，提供新闻提要、搜索、聊天和其他核心功能。</p>
<p><strong>HipHop开发故事</strong></p>
<p>赵海平透露，项目最初是来自几年前Facebook公司一次Hackathon活动（员工在一个晚上自由发挥，实验新的想法），他手工将PHP转换 为C++代码，虽然语法上很类似，但是无论是CPU还是内存使用，转换后的C++代码都大大优于PHP。于是他想，如果构建一个系统，编程实现转换，会怎 么样呢？</p>
<p>在此之前，已经有了不少改善PHP性能的方法。Zend引擎在运行时转换PHP源代码为运行在Zend虚拟机上的opcode。开源项目APC和 eAccelerator将输出缓存，为大多数PHP网站所使用。此外，还有Zend Server这样的商业产品，通过opcode优化和缓存，提高PHP速度。赵海平选择了另一条道路，将PHP直接转为C++，然后再变成本地机器码。当 然，有许多开源项目也是同样的思路，Roadsend和phc编译为C，Quercus编译为Java，而Phalanger编译为.NET。</p>
<p>Hackathon之后8个月，赵海平拿出了原型，足以说明这条路可以走通，编译后的代码的确更快。不久，Iain Proctor和Minghui Yang加入进来。接下来又开发了10个月，在生产服务器上测试了6个月。然后正式上线部署，6个月之后，Facebook 90%以上的Web流量都使用了HipHop。</p>
<p>按赵海平的说法，凭借HipHop，Facebook Web服务器上的CPU使用平均减少了50%，从而大大减少了服务器的需求。项目对Facebook影响巨大。为了让这一改进也惠及社区，他们决定将之开源，希望能够进一步帮助提高更多大型复杂PHP网站的可伸缩性。</p>
<p><img src="http://news.csdn.net/a//uploads/2010/02/03/20100203-050719-pic1.JPG" alt="" width="600" height="400" /></p>
<p><strong>HipHop的原理</strong></p>
<p>HipHop将PHP代码转换为高度优化的C++代码，然后再用g++编译器编译。它可以保持语义等效地执行源代码，但为了提高性能，牺牲了一些很少用到的特性，比如eval()。</p>
<p>HipHop开发中的主要困难在于，在PHP和C++这两种很不一样的语言之间怎么实现转换。虽然PHP也可以写一些很巧妙的动态特性，但是大多数 PHP代码还是非常简单的。if (&#8230;) {&#8230;} else {..} 比foo($x) { include $x; } 肯定更常见。这为性能提高提供了机会。HipHop生成的代码尽可能地使用函数和变量的静态绑定。同时，还使用类型推演来选出变量最可能对应的某个类型， 从而节省内存。</p>
<p>转换过程分三步：</p>
<p>1. 静态分析。收集声明关系和依赖关系等信息。</p>
<p>2. 类型推演。选择最合适的类型，是C++的标量？还是String, Array, classes, Object或者Variant。</p>
<p>3. 代码生成。大部分直接将PHP语句和表达式对应为C++的语句和表达式。</p>
<p>在开发过程中，还有一个副产品：HPHPi，是一个实验性的解释器。通过它，不编译PHP源代码也可以运行。它已经用于HipHop自身的调试中。</p>
<p>HipHop在保持了PHP优点的同时，也兼得了C++的性能优势。项目总共有30万行代码，5000多个单元测试。所有这些都将以PHP开源许可证形式发布到GitHub。</p>
<p>更多信息，可以申请加入HipHop的邮件列表：</p>
<p><a href="http://groups.google.com/group/hiphop-php-dev">http://groups.google.com/group/hiphop-php-dev</a></p>
<p>转自cdsn <a href="http://news.csdn.net/a/20100203/216872.html">http://news.csdn.net/a/20100203/216872.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/557/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>类似web开发的开源手机框架Rhomobile</title>
		<link>http://www.52ebuy.com/archives/559</link>
		<comments>http://www.52ebuy.com/archives/559#comments</comments>
		<pubDate>Fri, 16 Apr 2010 14:09:40 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[手机开发]]></category>
		<category><![CDATA[Rhomobile]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[手机框架]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=559</guid>
		<description><![CDATA[支持iPhone, Windows Mobile, RIM and Symbian，将来会支持Android ，以类似html标签的方式来编写应用。
SugarCRM sample application... ]]></description>
			<content:encoded><![CDATA[<p>支持iPhone, Windows Mobile, RIM and Symbian，将来会支持Android ，以类似html标签的方式来编写应用。</p>
<p><a href="http://rhomobile.com/downloadpage/79-sugarcrm">SugarCRM sample application</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/559/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>沁园春《房》</title>
		<link>http://www.52ebuy.com/archives/562</link>
		<comments>http://www.52ebuy.com/archives/562#comments</comments>
		<pubDate>Fri, 16 Apr 2010 14:09:09 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[生活随想]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=562</guid>
		<description><![CDATA[神州大地，
万人蜗居，亿人盼房。
望北京上海，高楼大厦。
售楼中心，房奴滔滔。
祖孙三代，倾尽所有，欲与房价试比高。
须钞票，
清储蓄贷款，分外心焦。
楼价如此虚高，
逼无数英雄竞... ]]></description>
			<content:encoded><![CDATA[<p>神州大地，<br />
万人蜗居，亿人盼房。<br />
望北京上海，高楼大厦。<br />
售楼中心，房奴滔滔。<br />
祖孙三代，倾尽所有，欲与房价试比高。<br />
须钞票，<br />
清储蓄贷款，分外心焦。<br />
楼价如此虚高，<br />
逼无数英雄竞折腰。<br />
昔秦皇汉武，闻所未闻；<br />
唐宗宋祖，紧捏钱包。<br />
一代天骄，成吉思汗，只好蜗居蒙古包。<br />
俱往矣，<br />
数天价楼盘，还看今朝</p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/562/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>windows下安装memcached</title>
		<link>http://www.52ebuy.com/archives/555</link>
		<comments>http://www.52ebuy.com/archives/555#comments</comments>
		<pubDate>Fri, 16 Apr 2010 05:54:18 +0000</pubDate>
		<dc:creator>Joe</dc:creator>
				<category><![CDATA[服务器]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[安装]]></category>

		<guid isPermaLink="false">http://www.52ebuy.com/?p=555</guid>
		<description><![CDATA[memcached官网
http://www.danga.com/memcached/
memcached windows官网
http://jehiah.cz/projects/memcached-win32/
memcached 1.2.0 for Win32为最新版，需libevent 1.2
Unzip the binaries in your desired directory (eg. c:\memcached)
Install the service... ]]></description>
			<content:encoded><![CDATA[<p>memcached官网<br />
<a href="http://www.danga.com/memcached/">http://www.danga.com/memcached/</a><br />
memcached windows官网<br />
<a href="http://jehiah.cz/projects/memcached-win32/">http://jehiah.cz/projects/memcached-win32/</a></p>
<p>memcached 1.2.0 for Win32为最新版，需libevent 1.2</p>
<p>Unzip the binaries in your desired directory (eg. c:\memcached)<br />
Install the service using the command: &#8216;c:\memcached\memcached.exe -d install&#8217; from either the command line<br />
Start the server from the Microsoft Management Console or by running the following command: &#8216;c:\memcached\memcached.exe -d start&#8217;<br />
Use the server, by default listening to port 11211<br />
Use &#8216;memcached.exe -h&#8217; for extra help and command line server</p>
<p><span id="more-555"></span>以后memcached将作为windows的一个服务每次开机时自动启动。<br />
在php.ini 去掉 &#8216;extension=php_memcache.dll&#8217;前的注释<br />
下载pecl的<a href="http://pecl.php.net/package/memcache">memcache</a>模块包到ext目录<br />
NOTE: php和pecl的版本要一致。</p>
<blockquote><p>&lt;?php<br />
$memcache_obj = new Memcache;</p>
<p>/* connect to memcached server */<br />
$memcache_obj-&gt;connect(&#8216;localhost&#8217;, 11211);</p>
<p>/*<br />
set value of item with key &#8216;var_key&#8217;, using on-the-fly compression<br />
expire time is 50 seconds<br />
*/<br />
$memcache_obj-&gt;set(&#8216;var_key&#8217;, &#8217;some really big variable&#8217;, MEMCACHE_COMPRESSED, 50);</p>
<p>echo $memcache_obj-&gt;get(&#8216;var_key&#8217;);<br />
?&gt;</p></blockquote>
<p>显示&#8221;some really big variable&#8221;就是成功了</p>
]]></content:encoded>
			<wfw:commentRss>http://www.52ebuy.com/archives/555/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
