<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>膘叔</title>
		<link>http://www.neatstudio.com/</link>
		<description>只关心我所关心的，不在意我所不在意的</description>
		<copyright>Copyright (C) 2004 Security Angel Team [S4T] All Rights Reserved.</copyright>
		<generator>SaBlog-X Version 1.6 Build 20080806</generator>
		<lastBuildDate>Tue, 07 Sep 2010 22:49:40 +0000</lastBuildDate>
		<ttl>10</ttl>
		<item>
			<guid>http://www.neatstudio.com/show-1449-1.shtml</guid>
			<title>Editplus 自动检查语法</title>
			<author>gouki</author>
			<description><![CDATA[<p>用惯了IDE写PHP，再次回到Editplus的时候总有点不太习惯，比如没有函数提示了（当然也可以自己打造）。不过。。语法检查总还是需要的，总不能自己程序传到服务器上后运行了才知道语法有问题吧？于是利用Editplus的小功能aftersave。改造了一下。</p>
<p>进入editplus的选项设置，点击左侧的User tools菜单，在右侧的Group and Tools下拉框中选择 AutoSave:after save。</p>
<p><a href="http://www.neatstudio.com/attachment.php?id=685" target="_blank"><img src="http://www.neatstudio.com/attachments/date_201009/thumb_a0e0fb463072d00b5ef538198623f077.jpg" border="0" alt="大小: 49.06 K&#13;尺寸: 469 x 376&#13;浏览: 6 次&#13;点击打开新窗口浏览全图" width="469" height="376" /></a></p>
<p>在右侧的 add tool里选择 program。然后输入：标题，程序所在位置，以及参数。。</p>
<p>php语法检测是php.exe -l filename，这个可以通过命令行下运行 php -? 了解。然后要catch output，以及针对current file。。</p>
<p>OK，这样就over了。</p>
<p>看看效果？</p>
<p><a href="http://www.neatstudio.com/attachment.php?id=686" target="_blank"><img src="http://www.neatstudio.com/attachments//date_201009/07a7a0347dfc199008e48ec904f47ca3.jpg" border="0" alt="大小: 39.2 K&#13;尺寸: 463 x 243&#13;浏览: 8 次&#13;点击打开新窗口浏览全图" width="463" height="243" /></a></p>]]></description>
			<link>http://www.neatstudio.com/show-1449-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-09-03 11:10</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1434-1.shtml</guid>
			<title>Discuz Uchome 小技巧</title>
			<author>gouki</author>
			<description><![CDATA[<p>discuz的ajaxpost功能有点强大，但缺点也很明显，如果ajaxpost提交一个FORM，那么返回的时候只能显示showmessage的内容，而不会主动跳转，因此这里就有一个小技巧 了。。<br />
<br />
比如默认submit按钮这样操作：onclick=&quot;ajaxpost('formid')&quot;;之类的，我们可以先这样。。<br />
onclick=&quot;$('__formid').innerText='';ajaxpost('formid');checkPostResult();&quot;;<br />
含义其实很简单，先把ajaxpost提示信息所在的div内容清空。然后提交。最后，根据返回值来判断。。</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;checkPostResult(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;cid&nbsp;=&nbsp;setInterval(</span><span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;$(</span><span class="string">'__formid'</span><span>).innerText&nbsp;==&nbsp;</span><span class="string">'success'</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">'提交成功'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location.href=<span class="string">'xxxxx.php'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clearInterval(cid);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;},1000);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这个处理也很简单，为什么是用setInterval和clearInterval，主要是由于ajax是异步操作，如果不用setInterval方法 ，那么在ajaxpost结束的时候，其实提示信息还没有append到提示信息所在的ID里，所以用setInterval方法先延迟然后循环处理最后再结束提示。。。<br />
<br />
clearInterval用的不太对，但短时间内想不到更好的。先这样临时解决喽。</p>]]></description>
			<link>http://www.neatstudio.com/show-1434-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-20 22:33</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1430-1.shtml</guid>
			<title>dedecms 笔记:标签</title>
			<author>gouki</author>
			<description><![CDATA[<p>资料均从网上收集，然后作了整理。。</p>
<p><em>注意，由于dedecms的模版TAG功能，其实是类似于XML，所以在使用的时候，一定要象XML一样正确闭合，否则，该区块将不变解析</em></p>
<p>一般来说，我们所使用的DEDECMS模板代码样式有如下几种：</p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>{dede:标记名称&nbsp;属性='值'/}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{dede:标记名称&nbsp;属性='值'}&nbsp;{/dede:标记名称}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{dede:标记名称&nbsp;属性='值'}&nbsp;自定义样式模板(InnerText)，即底层模板&nbsp;{/dede:标记名称}</span></li>
    <li class="alt">如果使用带底层模板的标记，必须严格用{dede:标记名称 属性='值'}{/dede:标记名称} 这种格式，否则会报错。</li>
</ol>
</div>
<p>1、标记通用特性<br />
(1) 短标记：<br />
{dede:tagname.name/} 等同于 {dede:tagname name='' /}</p>
<p>{dede:global.name/}&nbsp;&nbsp; 外部变量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等同于 &lt;?php echo $name; ?&gt; 【其实这里应该是全局变量】<br />
{dede:var.name/}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var数组&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等同于 &lt;?php echo $_vars['name']; ?&gt;<br />
{dede:field.name/}&nbsp;&nbsp;&nbsp; field数组&nbsp;&nbsp;&nbsp;&nbsp; 等同于 &lt;?php echo $fields['name']; ?&gt;<br />
{dede:cfg.name/}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统配置变量 等同于 &lt;?php echo $cfg_name; ?&gt;【cfg已经是全局了，所以这个标签其实也可以写成{dede:global.cfg_name/}】</p>
<p><br />
(2) 块标记：<br />
{dede:tagname}<br />
循环代码:<br />
{/dede:tagname}<br />
<br />
(3)include 语法：<br />
{dede:include file=''/}<br />
{dede:include filename=''/}<br />
{dede:include file='文件名称' ismake='是否为dede板块模板(yes/no)'/}<br />
<em>例如： {dede:include filename=&quot;head.htm&quot;/}<br />
对文件的搜索路径为顺序为：绝对路径、include文件夹，CMS安装目录，CMS主模板目录</em></p>
<p>2、函数和PHP语法</p>
<p>if 条件<br />
仅支持 if ，else ，else 直接用{else}表示,但不支持{else if}这样的语法 ，一般建议模板中不要使用太复杂的条件语法，如果确实有需要，可以直接使用 php 语法。<br />
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>{dede:if&nbsp;条件}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;a-block&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{else}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;b-block&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{/dede:if}&nbsp;&nbsp;</span></li>
</ol>
</div>
条件中允许使用 var.name 、 global.name 、 field.name、cfg.name 表示相应的变量。<br />
如：<br />
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>{dede:if&nbsp;field.id</span><span class="tag">&gt;</span><span>10&nbsp;}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{/dede:if}&nbsp;&nbsp;</span></li>
</ol>
</div>
php 代码块:<br />
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>{dede:php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>php&nbsp;代码&nbsp;&nbsp;</span></li>
    <li class="alt"><span>/}&nbsp;&nbsp;</span></li>
</ol>
</div>
或
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>{dede:php}&nbsp;&nbsp;</span></span></li>
    <li class=""><span>php代码&nbsp;&nbsp;</span></li>
    <li class="alt"><span>{/dede:php}&nbsp;&nbsp;</span></li>
</ol>
</div>
......其它还在整理中</p>]]></description>
			<link>http://www.neatstudio.com/show-1430-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-16 11:36</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1428-1.shtml</guid>
			<title>typecho 发布 0.8release版本</title>
			<author>gouki</author>
			<description><![CDATA[<p>算起来，这一个release版本的时间是挺长了。从5月25日到8月15日，跨度也挺大。<br />
下载页面在：http://typecho.org/download，这次更新的内容不多，主要还是一些补丁和BUG的修复吧。<br />
<br />
其实如果你对typecho有意见，你可以到 <a title="Google code下载" href="http://code.google.com/p/typecho/downloads/list">http://code.google.com/p/typecho</a>的issue里进行提问和申请。<br />
顺便说一声，如果你觉得官方的插件太少，你可以直接从SVN里下载全部版本，里面包含了几乎所有的插件。还有一些文档也可以查看<br />
<br />
svn的地址是：svn checkout http://typecho.googlecode.com/svn/trunk/ typecho-read-only<br />
<br />
http://code.google.com/p/typecho/source/list，看这里就可以了解每一个小版本改动了些什么东西。当然一些细小的改动，就没有description了。其实说起来typecho的东西对于很多人来说算是比较复杂的。几乎所有的组件都基于plugin或者widget了，对效率还是会有影响的吧。。。</p>]]></description>
			<link>http://www.neatstudio.com/show-1428-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-16 00:22</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1425-1.shtml</guid>
			<title>dedecms:如何在runphp=yes的标签中使用其他field值</title>
			<author>gouki</author>
			<description><![CDATA[<p>dedecms有强大的TAG自定义功能，但如果你是在runphp=yes的情况下，你无法使用[field]等标签，因为它不解释了（都当成PHP代码了，怎么可能解析呢？）<br />
怎么办？<br />
查了一下google，没有发现解决方法。所以我想了很久想出一个临时性的解决方法，即用全局变量来解决这个问题。。<br />
{dede:php}$GLOBALS['xxoo']=$arc-&gt;Fields['fieldname']{/dede:php}<br />
{dede:field.xxxx runphp=&quot;yes&quot;}@me=&quot;test&quot;.@me.&quot;-test&quot;.$GLOBALS['xxoo'];{/dede:field.xxxx}<br />
即，先开一个PHP的标签，把想赋的值替换给global变量。然后在另外的运行中将field值赋值给他。<br />
<br />
写的乱，不过还是解决了这个问题了。。</p>]]></description>
			<link>http://www.neatstudio.com/show-1425-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-13 22:46</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1424-1.shtml</guid>
			<title>PHP手册</title>
			<author>gouki</author>
			<description><![CDATA[<p>不得不说，PHP的手册已经有很久没有人更新过了。我也没有VC，也没有去尝试编译成CHM过。所幸，乔楚仍然在做这样的事情，细细算来，应该有N年了吧。毛大爷说过，做一件好事并不难，难的是一辈子做好事。虽然到现在为止并没有一辈子，但从第一次编译chm版PHP手册开始到现在，也几乎有3年了。</p>
<p>OK，不说废话，看手册地址。。</p>
<p><font color="red"><strong><font size="2">PHP 手册 （最新评论整合版V0.3，HonestQiao编译于2010-08-12）<br />
<br />
2010演示版，测试地址：<a href="http://www.wapm.cn/phpdocs/php_manual_zh-HonestQiao-20100812-Beta-V0.3.gz" target="_blank"><span href="http://bbs.chinaunix.net/tag.php?name=php" onclick="tagshow(event)" class="t_tag">php</span>_manual_zh-HonestQiao-20100812-Beta-V0.3.gz</a>（下载后如打开无法正常查看，请从鼠标右键查看属性解锁；请使用7Zip打开，<a href="http://sparanoid.com/lab/7z/" target="_blank">7-Zip下载</a>）</font></strong></font></p>
<p><font color="red"><strong><font size="2"><font color="Black">零、更新日志：ChangeLog</font><br />
1. <span href="http://bbs.chinaunix.net/tag.php?name=2008" onclick="tagshow(event)" class="t_tag">2008</span>年3月19日，因官方问题，暂停继续更新<br />
2. 2010年8月5日，2010演示版V0.1提供测试，基本整合最新手册和评论<br />
3. 2010年8月11日，2010演示版V0.2提供测试，样式修改基本完善<br />
4. 2010年8月12日，2010演示版V0.3提供测试，版式完善，加上了CHM导航目录和索引，可供正式使用<br />
<br />
<font color="Black">一、当前问题列表：TODO</font><br />
<font color="Silver">1. CHM左则目录没有目录细节：已处理</font><br />
<font color="Silver">2. CHM左则索引基本没有：已处理</font><br />
3. 评论部分PHP代码没有颜色<br />
<br />
<font color="Black">二、感谢测试（部分人员，其他未列出请见谅）：Thanks</font><br />
<a href="mailto:jayeeliu@gmail.com">jayeeliu@gmail.com</a>、QQ/50753256、QQ/496995561<br />
<br />
<font color="Black">三、说明：More</font><br />
1. 因为属于演示版，所以存在诸多问题，例如可能版式不正确不美观，可能存在乱码，可能有部分内容缺失等！<br />
2. 请协助改进，与<a href="http://docs.php.net/manual/en/index.php" target="_blank">http://docs.php.net/manual/en/index.php</a>对比测试<br />
3. 如有问题，敬请告知，多谢了！<br />
4. 反馈请致信 <a href="mailto:honestqiao@163.com">honestqiao@163.com</a>，标题【PHP手册反馈】；<br />
亦可通过QQ/5601680、MSN/honestqiao@hotmail.com反馈<br />
5. 一旦测试反馈和修改完善，就进入正式发布队列，每周更新<br />
6. 下载后如打开无法正常查看，请从鼠标右键查看属性，点击解除锁定即可<br />
<br />
<font color="Black">四、友情推荐：Friend</font><br />
1. Coreseek开源中文检索引擎，<a href="http://www.coreseek.cn/" target="_blank">http://www.coreseek.cn/</a>，基于Sphinx，专业针对中文<span href="http://bbs.chinaunix.net/tag.php?name=%D3%A6%D3%C3" onclick="tagshow(event)" class="t_tag">应用</span>，MySQL绝配！</font></strong></font></p>
<p>--------EOF------</p>
<p>当然我这边提供的就只是镜像（用于分流）了。但还是推荐经常关注http://bbs.chinaunix.net/thread-999247-1-1.html，因为，说不定哪天我们乔大姐又会更新手册了，不是吗？现在是RC版，过两天就可是正式版了。</p>
<p>本地镜像下载：<a href="http://neatstudio.com/attachment/php_manual_zh-HonestQiao-20100812-Beta-V0.3.gz">点击下载</a>，好处多多，缺点就是文件名太长了。。。</p>]]></description>
			<link>http://www.neatstudio.com/show-1424-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-12 17:00</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1418-1.shtml</guid>
			<title>ThinkInLamp聚会记录</title>
			<author>gouki</author>
			<description><![CDATA[<p>说起来，上次参加聚会到现在已经过去两个月时间了，ThinkInLamp聚会是每个月的第一周的周末举办，这是我第二次参加，在安居客公司的会议室里。<br />
与会者嘛，还是安居客的开发占了大部分，毕竟天时地利人和啊。确实，如果有这样的聚会放在公司里，一来可以让单位的开发人员进行学习二来也可以了解认识一下其他开发人员，对于公司来说几乎没有任何投入成本，但所获颇多（毕竟真要请人来培训花的钱更多。。）<br />
这次聚会其实就三个内容，一团队，二求职，三敏捷开发<br />
从上个月的聚会开发stingchen就开始有他的分享了，可惜7月份无缘参加，（那次还有逍遥冰心讲的领域驱动方面的内容，也没有听到。惋惜，所以这次我怎么样也得来了。）sting介绍了团队建设方面的一些要点，以及注意事情，引起了很多人的共鸣，看来很多人在工作中遇到过类似问题啊（看来领导们很多）<br />
板子介绍的是不要让工作外的事情来影响工作。总结起来就是有一颗平常心，不以物喜不以已悲，了解自己的真实想法做下去，不要频繁跳槽。<br />
最后的敏捷开发就是讲的如何让工作变得更有效率。在讲之前做了一个游戏，每组8个人，每组中又有不同的分工，一个客户，一个客户老板，三个经理，每个经理下面有一个工人。然后分组开始数硬币（当然是有一定的规则）。客户将硬币交给工人时，客户与客户老板同时开始计时，当第一个工人开始翻硬币时，对应的经理开始计时。当第一个工作完成任务后，把硬币交给第二个工人时，第二个工人对应的经理开始计时。当第一个工人全部把硬币给了第二个工人时，第一个工人对应的经理停止计时。客户在收到第三个工人第一枚硬币时结束计时。当最后一枚硬币到达客户手里时，客户经理停止计时。然后做了五次不同方式的游戏，比如从左手到右手再到两只手一起，等等。DannelTeng的意思就是想让我们把工作能够细分，而且并不是在细分全部结束后再下达任务，这样的工作效率会有提高。<br />
突然想起几件事，一小时学的语文课文里有个统筹方法，好象与此类似。还有就是在夜大学习的工商管理中的管理学，都有涉及类似方面。工厂运作本来就与程序开发有类似之处，毕竟理论是一样的，只是在实现的方法中有不同的方式而已，就如那句：戏法人人会变，手法各有不同。当然，如果没有经过培训过的人，可能在工作过程中也会摸索出类似的方式，但如果经过事先培训，岂不是会更加增加工作效率 ？<br />
<br />
最后再做一个广告，锅巴哥哥准备在10月份左右举办一次数据库的专题会，他说到时候会请一些数据库方面的专家来与大家分享和讨论数据库设计方面的事情。也坦言在PHP开发中，其实DBA处于一个很尴尬的地位，即DBA在开发中几乎是没有介入开发中的机会，往往数据库的设计都是由开发人员自行设计，这导致在遇到问题时无法进行调优。而这次分享会上，就是请不同行业的专家们来分享如何更好的设计数据库，以及一些调优方法 。<br />
顺便，锅巴哥哥说的原来从最初设计MYSQL时就是为了电信级的应用。我承认我真不了解这个背景，我想，恐怕80%的PHP开发者不了解MYSQL设计的背景吧。了解的最多的恐怕就是开源、免费。想着MYSQL被我们用成这样，不知道那些数据库设计人员是否会很郁闷。<br />
估计，下一周就会有今天分享的PPT和视频出现在thinkinlamp官方网站了。你也可以到官网查看往期的分享（官网：www.thinkinlamp.com）。</p>]]></description>
			<link>http://www.neatstudio.com/show-1418-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-07 22:14</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1417-1.shtml</guid>
			<title>知道分子：这个版本太新了</title>
			<author>gouki</author>
			<description><![CDATA[<p>知道分子的这个事例事实也经常遇到过。只是谁都没有提出来当成一回事<br />
在自己的机器上，各种不同版本的PHP一直存在着，或许，相对稳定的也就apache和mysql吧？每次要升级前都看着changelog，但即使这样，也会有或多或少的问题发生，然而，在公司的版本库里，测试机里等等中早就存在着不同版本的PHP，只是可能从来就没有注意过罢了。<br />
<br />
升还是不升这是个问题，但如果真的版本不对了，出现的问题也就稀奇古怪了，所以，保证版本号一致还是有着非常重要的作用（如果为了新特性需要升级，那就通知所有的人一起升，最终仅保留一台两台有明显记号的，旧版本的服务器专门用来调试，开发人员有虚拟机的也通通升级到统一的版本号里，一切为了稳定 ）<br />
<br />
下面是知识分子的内容：<a nodeindex="585" href="http://hutuworm.blogspot.com/2010/08/blog-post.html">这个版本太新了</a><br />
<br />
以前偶尔听到同事 A 问同事 B，某软件出新版本了，我们要不要升级？同事 B 果断地回答，这个版本太新了，我们还是别急着升级吧。同事 A  深以为然，刚出来的版本就升级，万一出个故障谁负责？何况现在这个软件跑得好好的，没事最好别折腾。后来 A、B 两人都忘了这件事，也就没有了下文。</p>
<div nodeindex="31">&nbsp;</div>
<div nodeindex="32">再后来，同事 C  在另一处需要用到该软件，去官方网站上下载了&ldquo;最新稳定版&rdquo;（也就是前面那个&ldquo;太新了&rdquo;的版本），用着没问题。又过了一段时间，这个软件又出新版本，同事  D 问同事 E，我们要不要升级？同事 E 说，这个版本太新了，你懂的。于是同事 D 拈花微笑，信受奉行。</div>
<div nodeindex="33">&nbsp;</div>
<div nodeindex="34">如此循环往复，同样一个软件，在开发/测试/生产环境里运行着无数个&ldquo;太新了&rdquo;的不同版本。<br nodeindex="588" />
<div nodeindex="35">&nbsp;</div>
<div nodeindex="36">先不谈管理成本，&ldquo;这个版本太新了&rdquo;是否构成不升级的理由，颇值得解析一番。为什么要出新版本？不外乎安全漏洞 修补、bug  修正、新功能三者（或混合）。安全漏洞显然是要尽早尽快修补的，明知有安全漏洞而不及时修补，无异于后门洞开等待爆菊，有受虐倾向。整体或所调用部分相关 的 bug 也是要修补的，紧急程度视 bug 可能造成的损失大小而定。新功能则要看未来是否会用到，才决定要不要升级。</div>
</div>
<div nodeindex="37">&nbsp;</div>
<div nodeindex="38">&ldquo;这个版本太新了&rdquo;之所以被接受，其中也有一定的合理成分。&ldquo;太新了&rdquo;指的是新版本没有经过完整的兼容性、稳定性和性能测试，也许会对现有应用造成影响。这个意思永远是对的，或者不客气地说，就是一句废话。任何一个新版本软件都一样，不去做测试你怎么知道有没有影响？</div>
<div nodeindex="39">&nbsp;</div>
<div nodeindex="40">同一个软件，不同的版本，随意分布在多个环境中，这无疑增加了管理的复杂度，当然也有人认为，这体现了&ldquo;个性 化&rdquo;。复杂度也好，&ldquo;个性化&rdquo;也罢，都是效率的大敌。标准化的高效运维，应该是同一个软件、同一个版本，并且有统一机制进行追踪、测试、升级，保证安全漏 洞、bug 得到及时修补，新功能尽在掌握。</div>]]></description>
			<link>http://www.neatstudio.com/show-1417-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-07 11:21</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1413-1.shtml</guid>
			<title>dedecms 笔记</title>
			<author>gouki</author>
			<description><![CDATA[<p>不管怎么样，还是用到了dedecms。由于以前一直用supesite，对它不熟悉，所以做点笔记。<br />
<br />
1、添加字段。如果你想增加自定义字段，但又不想修改数据库，可以尝试存成TAG。举例。在用户上传图片的时候，album_add，存到数据库里可能就是{dede:img xx}。代表了相册中的图片，每一张图片都是这样的一个标记。因此，我在这个最后增加了{dede:custom}类似的TAG，用来存放在这个页里涉及的増加的变量。偷懒的解决方法</p>
<p>2、读取数据显示到模版里。原来的我一直以为要写taglib，后来翻了手册才知道，原来还有{dede:loop }标签，可以指定表，排序字段和ifcause条件。比较方便。而且，如果你真的要写taglib，事实上也就可以参考这个函数来写了。</p>
<p>3、循环次数，发现循环次数是用全局变量来实现的。。。也就是说可以用[field:global.autoindex/]来显示。。很妖。。因此每个taglib都有将它置为0的用法。</p>
<p>4、针对2，其实还有一个更无耻的方法，那就是：{dede:sql sql=&quot;&quot;}底层模板{/dede:sql}，这样，你还可以更偷懒一点。</p>
<p>当然更多的还是需要看官方文档。在这里http://help.dedecms.com/v53/。虽然是5.3的不过还是可以做一些参考。。。</p>]]></description>
			<link>http://www.neatstudio.com/show-1413-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-05 17:28</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1409-1.shtml</guid>
			<title>一些笔记</title>
			<author>gouki</author>
			<description><![CDATA[<p>单独开个题目吧，觉得太小，所以以笔记的形式列出来，这样感觉会比较好一点<br />
1、dedecms相关<br />
dedecms用的人很多，但不限于，我用的还是很少的，所以看到一些东西就认为应该记录下来，比如这个{dede:loop}标签，就是查询后生成一个数组，然后循环。对于简单的数据读取还算是比较方便。当然也有缺点，没看到有缓存生成（我不知道是不是用了tag就自动缓存，不过我想应该不是，生成静态的话就忽略这点问题了吧。）只是现在还不知道如何将页码参数传进去。。。</p>
<p>2、创业</p>
<p>这里并不是说我的创业故事，当然我也有创业的想法，我这里是两个人对于创业的看法，一个是awflasher(http://www.awflasher.com/blog/archives/1829)，他说：【借此，我想顺便说一点我的看法：为了让员工的风险降到最低全力工作，创业公司的薪水应该略高于大公司，那些号称是创业阶段要压低薪水或者拖欠薪水的公司， 如果没有股份可以不考虑了（证明管理团队的盈利能力太弱，这种公司风险太大）；另外，我认为在中国，真的要慎用&ldquo;股权&rdquo;这个概念，这个概念不适用于大多数 人，在我这个行业内，我亲眼目睹了一个例子：有几家公司给出低薪+大量股份，而有一家公司给出高薪，结果后者很快就发展壮大了，而那几家把薪水压低出让股 份的公司几乎都死掉了。】还有一个就是DBA Notes(http://www.dbanotes.net/jobs/Jobs_info.html)上的【从大公司出来，投身创业团队。遇到的最大问题就是招聘问题。创业公司，薪水不可能像上市公司那样大方，公司福利也做不到国企那要啥有啥。好不容易瞄上个技 术差不多的，仔细沟通下来，人家还未必愿意一起来参与创业，更想着找个钱多人傻、事少家近的地方，不能破坏人家美好生活不是。其它包括地域问题的、家庭原 因的... 所以，招聘是个困难活儿，也是个持久战。创业团队，只能慢慢来，只找合适的，找对的。】</p>
<p>总之，创业是一个痛苦的事情。。以前在cnblog上看吉日嘎拉说自己的创业故事，说到创业时觉得要买这个买那个，等到买回来发现，大多数实际上可以不买，反而浪费了自己的精力和钱的时候。就觉得创业真的是需要考虑的事情。</p>
<p>3、php A-Z的循环问题</p>
<p>php的A-Z循环并不和其他程序一样。只是长度为26的循环，相反，PHP follows Perl&rsquo;s convention when dealing with arithmetic operations on  character variables and not C&rsquo;s. For example, in Perl &lsquo;Z&rsquo;+1 turns into  &lsquo;AA&rsquo;, while in C &lsquo;Z&rsquo;+1 turns into &lsquo;[&lsquo; ( ord(&lsquo;Z&rsquo;) == 90, ord(&lsquo;[&lsquo;) == 91  ). Note that character variables can be incremented but not decremented  and even so only plain ASCII characters (a-z and A-Z) are supported.这个信息来自<a title="Permanet Link to 注意PHP对字符串的递增运算" href="http://www.laruence.com/2010/07/30/1682.html" target="_blank">http://www.laruence.com/2010/07/30/1682.html</a>，以前真的一直不知道。或者说没有注意过。</p>]]></description>
			<link>http://www.neatstudio.com/show-1409-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-04 07:14</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1405-1.shtml</guid>
			<title>PHP图像识别</title>
			<author>gouki</author>
			<description><![CDATA[<p>对于一些几乎没有变型的图片来说，下面这个方法或者会减轻你的工作量。<br />
事实上，我也是从http://fr.cc0311.com/php-telephone-number-ocr.html看的代码，再想想，walkerlee在05年就写过了关于bmp图片的识别。不过BMP可能会相对简单一点吧？<br />
看了这个法月博客的代码。脑子一热，花了半小时，重写了一遍。。。没有优化。因为大部分方法还是参考的他的，只是对法月的这篇文章中的代码，我做了简单的改动。版权，还是算他的吧。。。去年的时候，也写过类似的。。只是因为图片变形，最终识别率超低，因此对于这种不变形的，还是写下代码做个笔记吧。</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$imgfile</span><span>&nbsp;=&nbsp;</span><span class="string">'http://bj.ganji.com/tel/5463013757650d6c5e31093e563c51315b6c5c6c5237.png'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">interface</span><span>&nbsp;imagedatas&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setimagedata();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;getimagedata();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;GanjiImage&nbsp;</span><span class="keyword">implements</span><span>&nbsp;imagedatas{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="vars">$imagedata</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;__construct(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;setimagedata();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;setimagedata(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imagedata&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0=&gt;<span class="string">'000011111000001111111110011000000011110000000001110000000001110000000001110000000001011000000011011100000111000111111100000001110000'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1=&gt;<span class="string">'011000000000011000000000111111111111111111111111'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2=&gt;<span class="string">'001000000011011000000111110000001101110000011001110000011001110000110001111001100001011111100001000110000001'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3=&gt;<span class="string">'001000000010011000000011110000000001110000000001110000110001110000110001011001110011011111011111000110001100'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4=&gt;<span class="string">'000000001100000000111100000001111100000011101100000111001100001100001100011000001100111111111111111111111111000000001100000000000100'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5=&gt;<span class="string">'111111000001111111000001110001000001110001000001110001100001110001100001110000110011110000111111000000001100'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6=&gt;<span class="string">'000011111000001111111110011000110011110001100001110001100001110001100001110001100001010001110011010000111111000000001100'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7=&gt;<span class="string">'110000000000110000000111110000111111110001110000110111000000111100000000111000000000111000000000'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8=&gt;<span class="string">'000100011110011111111111110011100001110001100001110001100001110001100001110011100001011111111111000100011110'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9=&gt;<span class="string">'001111000000011111100001110000110001110000110001110000110001110000110001011000100001011111100111000111111110000001110000'</span><span>,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">function</span><span>&nbsp;getimagedata(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;imagedata;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="keyword">class</span><span>&nbsp;imageValidation&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$imgfile</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$imgsize</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$imgdata</span><span>;&nbsp;</span><span class="comment">//数组</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$hordata</span><span>;&nbsp;</span><span class="comment">//横向</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$verdata</span><span>;&nbsp;</span><span class="comment">//纵向</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">protected</span><span>&nbsp;</span><span class="vars">$imgfunc</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;__construct(&nbsp;</span><span class="vars">$imgfile</span><span>&nbsp;,&nbsp;</span><span class="vars">$imgsource</span><span>&nbsp;=&nbsp;</span><span class="string">''</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfile&nbsp;=&nbsp;</span><span class="vars">$imgfile</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgsize&nbsp;=&nbsp;</span><span class="func">getimagesize</span><span>(</span><span class="vars">$imgfile</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfunc&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;getImageFunc();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;imgfunc&nbsp;==&nbsp;</span><span class="string">'imagecreatefromstring'</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfile&nbsp;=&nbsp;</span><span class="func">file_get_contents</span><span>(</span><span class="vars">$this</span><span>-&gt;imgfile);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgsource&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="vars">$imgsource</span><span>();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;getImageData(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$func</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;imgfunc;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$resource</span><span>&nbsp;=&nbsp;</span><span class="vars">$func</span><span>(&nbsp;</span><span class="vars">$this</span><span>-&gt;imgfile&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(&nbsp;</span><span class="vars">$i</span><span>=0&nbsp;;&nbsp;</span><span class="vars">$i</span><span>&nbsp;&lt;&nbsp;</span><span class="vars">$this</span><span>-&gt;imgsize[1]&nbsp;;&nbsp;</span><span class="vars">$i</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(&nbsp;</span><span class="vars">$j</span><span>=0&nbsp;;&nbsp;</span><span class="vars">$j</span><span>&lt;</span><span class="vars">$this</span><span>-&gt;imgsize[0]&nbsp;;&nbsp;</span><span class="vars">$j</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$rgbcolor</span><span>&nbsp;=&nbsp;imagecolorat(&nbsp;</span><span class="vars">$resource</span><span>&nbsp;,&nbsp;</span><span class="vars">$j</span><span>&nbsp;,&nbsp;</span><span class="vars">$i</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$rgbarray</span><span>&nbsp;=&nbsp;imagecolorsforindex(&nbsp;</span><span class="vars">$resource</span><span>&nbsp;,&nbsp;</span><span class="vars">$rgbcolor</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$rgbarray</span><span>[</span><span class="string">'red'</span><span>]&nbsp;&lt;&nbsp;125&nbsp;||&nbsp;</span><span class="vars">$rgbarray</span><span>[</span><span class="string">'green'</span><span>]&lt;125&nbsp;||&nbsp;</span><span class="vars">$rgbarray</span><span>[</span><span class="string">'blue'</span><span>]&nbsp;&lt;&nbsp;125){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$data</span><span>[</span><span class="vars">$i</span><span>][</span><span class="vars">$j</span><span>]=1;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$data</span><span>[</span><span class="vars">$i</span><span>][</span><span class="vars">$j</span><span>]=0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgdata&nbsp;=&nbsp;</span><span class="vars">$data</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;getHorData(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$z</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$i</span><span>=0;&nbsp;</span><span class="vars">$i</span><span>&lt;</span><span class="vars">$this</span><span>-&gt;imgsize[1];&nbsp;</span><span class="vars">$i</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(in_array(</span><span class="string">'1'</span><span>,</span><span class="vars">$this</span><span>-&gt;imgdata[</span><span class="vars">$i</span><span>])){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(</span><span class="vars">$j</span><span>=0;&nbsp;</span><span class="vars">$j</span><span>&lt;</span><span class="vars">$this</span><span>-&gt;imgsize[0];&nbsp;</span><span class="vars">$j</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$this</span><span>-&gt;imgdata[</span><span class="vars">$i</span><span>][</span><span class="vars">$j</span><span>]&nbsp;==&nbsp;</span><span class="string">'1'</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$newdata</span><span>[</span><span class="vars">$z</span><span>][</span><span class="vars">$j</span><span>]&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$newdata</span><span>[</span><span class="vars">$z</span><span>][</span><span class="vars">$j</span><span>]&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$z</span><span>++;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;hordata&nbsp;=&nbsp;</span><span class="vars">$newdata</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$newdata</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;getVerData(){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//$data&nbsp;=&nbsp;array_reverse($this-&gt;hordata);&nbsp;//这是180度翻转，不是90度</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(&nbsp;</span><span class="vars">$i</span><span>=0;&nbsp;</span><span class="vars">$i</span><span>&lt;&nbsp;</span><span class="func">count</span><span>(</span><span class="vars">$this</span><span>-&gt;hordata[0])&nbsp;;&nbsp;++</span><span class="vars">$i</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>(&nbsp;</span><span class="vars">$j</span><span>=0;</span><span class="vars">$j</span><span>&lt;</span><span class="func">count</span><span>(</span><span class="vars">$this</span><span>-&gt;hordata);</span><span class="vars">$j</span><span>++){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$newdata</span><span>[</span><span class="vars">$i</span><span>][</span><span class="vars">$j</span><span>]&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;hordata[</span><span class="vars">$j</span><span>][</span><span class="vars">$i</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$i</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>(</span><span class="vars">$newdata</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$k</span><span>=&gt;&nbsp;</span><span class="vars">$v</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;in_array(1&nbsp;,&nbsp;</span><span class="vars">$v</span><span>&nbsp;)&nbsp;||&nbsp;(isset(</span><span class="vars">$newdata</span><span>[</span><span class="vars">$k</span><span>+1])&nbsp;&amp;&amp;&nbsp;in_array(1,</span><span class="vars">$newdata</span><span>[</span><span class="vars">$k</span><span>+1])&nbsp;)){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$newdatas</span><span>[</span><span class="vars">$i</span><span>]&nbsp;=&nbsp;</span><span class="vars">$v</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$i</span><span>++;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;verdata&nbsp;=&nbsp;</span><span class="vars">$newdatas</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$newdatas</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;get(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$i</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>(&nbsp;</span><span class="vars">$this</span><span>-&gt;verdata&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$val</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(in_array(1,</span><span class="vars">$val</span><span>)){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$datas</span><span>[</span><span class="vars">$i</span><span>]&nbsp;.=&nbsp;join(</span><span class="string">&quot;&quot;</span><span>,</span><span class="vars">$val</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$i</span><span>++;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>(&nbsp;</span><span class="vars">$datas</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$k</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$val</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$number</span><span>[</span><span class="vars">$k</span><span>]&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;check(</span><span class="vars">$val</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$number</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;check(</span><span class="vars">$str</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$imgsourcesdata</span><span>&nbsp;=&nbsp;</span><span class="vars">$this</span><span>-&gt;imgsource-&gt;getimagedata();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>(&nbsp;</span><span class="vars">$imgsourcesdata</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$k</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$val</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;similar_text(<span class="vars">$str</span><span>,</span><span class="vars">$val</span><span>,</span><span class="vars">$percent</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$ret</span><span>[</span><span class="vars">$k</span><span>]=</span><span class="vars">$percent</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="func">array_search</span><span>(max(</span><span class="vars">$ret</span><span>),</span><span class="vars">$ret</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;draw(&nbsp;</span><span class="vars">$data</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;=&nbsp;</span><span class="string">''</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="func">is_array</span><span>(</span><span class="vars">$data</span><span>)){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$data</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$key</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$val</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(</span><span class="vars">$val</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$k</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$v</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(</span><span class="vars">$v</span><span>&nbsp;==&nbsp;0){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;.=&nbsp;</span><span class="string">&quot;&lt;font&nbsp;color='#FFFFFF'&gt;&quot;</span><span>.</span><span class="vars">$v</span><span>.</span><span class="string">&quot;&lt;/font&gt;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>&nbsp;.=&nbsp;</span><span class="vars">$v</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$str</span><span>.=&nbsp;</span><span class="string">&quot;&lt;br/&gt;&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span>&nbsp;</span><span class="vars">$str</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">function</span><span>&nbsp;getImageFunc(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">switch</span><span>(</span><span class="vars">$this</span><span>-&gt;imgsize[2]){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;IMAGETYPE_PNG&nbsp;:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfunc&nbsp;=&nbsp;</span><span class="string">'imagecreatefrompng'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;IMAGETYPE_JPEG&nbsp;:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;IMAGETYPE_JPG&nbsp;:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfunc&nbsp;=&nbsp;</span><span class="string">'imagecreatefromjpeg'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">case</span><span>&nbsp;IMAGETYPE_GIF&nbsp;:&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfunc&nbsp;=&nbsp;</span><span class="string">'imagecreatefromgif'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">default</span><span>:&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$this</span><span>-&gt;imgfunc&nbsp;=&nbsp;</span><span class="string">'imagecreatefromstring'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">break</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="vars">$this</span><span>-&gt;imgfunc;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="vars">$img</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;imageValidation(</span><span class="vars">$imgfile</span><span>,</span><span class="string">'GanjiImage'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$img</span><span>-&gt;getImageData();&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$img</span><span>-&gt;getHorData();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$img</span><span>-&gt;getVerData();&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$phone</span><span>&nbsp;=&nbsp;</span><span class="vars">$img</span><span>-&gt;get();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>dump(<span class="vars">$phone</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;dump(</span><span class="vars">$data</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;print(<span class="string">&quot;&lt;pre&gt;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;print_r(<span class="vars">$data</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;print(<span class="string">&quot;&lt;/pre&gt;&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>对于该图片，识别率很高。</p>]]></description>
			<link>http://www.neatstudio.com/show-1405-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-08-02 16:50</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1396-1.shtml</guid>
			<title>杂谈</title>
			<author>gouki</author>
			<description><![CDATA[<p>1、高春辉表示升级到了5.3.3，不知道是不是手机之家，但，我真的不敢升级，即使我的版本中basename对中文的处理一塌糊涂，我也不敢升，因为实在不知道升级后会出现什么样奇怪的错误。高春辉说：
<div class="codeText">
<div class="codeHead">http://www.paulgao.com.cn/index.php?itemid=150</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>1、parse_url&nbsp;执行出错的时候不再报&nbsp;warning&nbsp;错误了，不再需要使用&nbsp;@&nbsp;了，但是要仔细判断结果是否为&nbsp;FALSE&nbsp;了；&nbsp;&nbsp;</span></span></li>
    <li class=""><span>2、FPM&nbsp;终于内置了，配置文件从&nbsp;XML&nbsp;改成&nbsp;INI&nbsp;方式了，增加了例如&nbsp;xxx.com/status&nbsp;的报告，和例如&nbsp;xxx.com/ping&nbsp;的健康检查功能了，挺好；&nbsp;&nbsp;</span></li>
    <li class="alt"><span>3、另外这次编译的时候把&nbsp;ereg&nbsp;模块也干掉了。以前是为了兼容&nbsp;PMA，现在&nbsp;PMA&nbsp;也不用&nbsp;ereg&nbsp;了，就可以&nbsp;DROP&nbsp;它了。&nbsp;&nbsp;</span></li>
</ol>
</div>
</p>
<p>2、对于typecho，我对牧师的网站上的两个模版，我很喜欢。。。</p>
<blockquote>
<ol>
    <li>http://typecho.demo.m4go.com/m4tom/&nbsp;</li>
    <li>http://bl.typecho.me/&nbsp;</li>
</ol>
</blockquote>
<p>这可能是个人爱好问题，并非其他模版不好看。</p>
<p>3、上次我在博客里贴了老王的：&lt;?php if($a = 100 &amp;&amp; $b= 200){var_dump($a,$b);}?&gt;，结果风雪之隅解释的更详细：http://www.laruence.com/2010/07/26/1668.html，他说，手册上说了：
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span>Note:&nbsp;</span><span class="attribute">Although</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">has</span><span>&nbsp;a&nbsp;lower&nbsp;precedence&nbsp;than&nbsp;most&nbsp;other&nbsp;operators,&nbsp;PHP&nbsp;will&nbsp;still&nbsp;allow&nbsp;expressions&nbsp;similar&nbsp;to&nbsp;the&nbsp;following:&nbsp;if&nbsp;(!$</span><span class="attribute">a</span><span>&nbsp;=&nbsp;</span><span class="attribute-value">foo</span><span>()),&nbsp;in&nbsp;which&nbsp;case&nbsp;the&nbsp;return&nbsp;value&nbsp;of&nbsp;foo()&nbsp;is&nbsp;put&nbsp;into&nbsp;$a.&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
差不多就是说：其实也简单, 运算符优先级是在存在二义性文法的时候的一种规约规则选择的手段,  而PHP的语法分析文件定义中,  却让等号和T_BOOLEAN_AND(&amp;&amp;)之前不存在了规约冲突.</p>]]></description>
			<link>http://www.neatstudio.com/show-1396-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-26 21:49</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1391-1.shtml</guid>
			<title>pack 和 unpack 的使用</title>
			<author>gouki</author>
			<description><![CDATA[<p>来自kakapo的博客：http://www.kakapo.cn/blog/read.php?112，主要是实在不懂。事实上，我看完，我也不懂。</p>
<p>&nbsp; &nbsp; &nbsp; <span style="color: rgb(255, 69, 0);"><span style="font-size: 14px;">任何一款拥有socket操作能力的语言都有一个专门用于组包的函数，php也不例外!</span> </span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />
<br />
&nbsp; &nbsp; &nbsp; 用了很久php了却很少有机会用php进行一些二进制操作。  最近用php写一个socket客户端连接一个用C++语言开发的游戏服务端。 服务器端开发人员使用了二进制的形式来定义协议的格式。协议格式如下：<br />
<br />
&nbsp; &nbsp;包头(2bytes)+加密(1byte)+命令码(2bytes)+帧内容<br />
<br />
1.包头的内容是记录帧内容的长度;<br />
2.  加密:0表示不加密，1表示加密；<br />
3. 命令码为服务端命令识别符号；<br />
<br />
&nbsp; &nbsp;  一开始不了解php原来有pack可以来组装二进制包,  走了弯路，让服务端开发人员用C语言帮忙开发了的几个内存操作函数，按照协议规则返回二进制包，然后我将这几个方法编译成一组扩展函数供php使用。<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp;  话归正题，本文是介绍如何使用pack和unpack这两个方法的。php官方手册举例太少，不能很容易理解，特别是那些格式化参数的使用。<br />
<br />
转 摘的参数中文说明：<br />
<br />
pack/unpack 的摸板字符字符 含义<br />
a 一个填充空的字节串<br />
A 一个填充空格的字节串<br />
b  一个位串，在每个字节里位的顺序都是升序<br />
B 一个位串，在每个字节里位的顺序都是降序<br />
c 一个有符号 char（8位整数）值<br />
C  一个无符号 char（8位整数）值；关于 Unicode 参阅 U<br />
d 本机格式的双精度浮点数<br />
f 本机格式的单精度浮点数<br />
h  一个十六进制串，低四位在前<br />
H 一个十六进制串，高四位在前<br />
i 一个有符号整数值，本机格式<br />
I 一个无符号整数值，本机格式<br />
l  一个有符号长整形，总是 32 位<br />
L 一个无符号长整形，总是 32 位<br />
n 一个 16位短整形，&ldquo;网络&rdquo;字节序（大头在前）<br />
N  一个 32 位短整形，&ldquo;网络&rdquo;字节序（大头在前）<br />
p 一个指向空结尾的字串的指针<br />
P 一个指向定长字串的指针<br />
q  一个有符号四倍（64位整数）值<br />
Q 一个无符号四倍（64位整数）值<br />
s 一个有符号短整数值，总是 16 位<br />
S  一个无符号短整数值，总是 16 位，<span style="color: rgb(220, 20, 60);">字节序跟机器芯片有关</span><br />
u  一个无编码的字串<br />
U 一个 Unicode 字符数字<br />
v 一个&ldquo;VAX&rdquo;字节序（小头在前）的 16 位短整数<br />
V  一个&ldquo;VAX&rdquo;字节序（小头在前）的 32 位短整数<br />
w 一个 BER 压缩的整数<br />
x 一个空字节（向前忽略一个字节）<br />
X  备份一个字节<br />
Z 一个空结束的（和空填充的）字节串<br />
@ 用空字节填充绝对位置<br />
<br />
<a name="entrymore"></a><br />
string  pack ( string $format [, mixed $args [, mixed $...]] )<br />
<br />
一些规则：<br />
1. 每个字母后面都可以跟着一个数字，表示 count（计数），如果 count 是一个 * 表示剩下的所有东西。<br />
2.如果你提供的参数比  $format 要求的少，pack 假设缺的都是空值。如果你提供的参数比 $format 要求的多，那么多余的参数被忽略。<br />
<br />
下面还 是用例子来说明用法会容易理解一点：<br />
<br />
<span style="font-size: 10px;">关于Pack:</span><br />
<br />
下 面的第一部分把数字值包装成字节：<br />
$out = pack(&quot;CCCC&quot;, 65, 66, 67, 68); &nbsp; &nbsp; &nbsp;# $out  等于&quot;ABCD&quot;<br />
$out = pack(&quot;C4&quot;, 65, 66, 67, 68); &nbsp; &nbsp; &nbsp; &nbsp; # 一样的东西<br />
<br />
下面 的对 Unicode 的循环字母做同样的事情：<br />
&nbsp; $foo = pack(&quot;U4&quot;, 0x24b6, 0x24b7, 0x24b8,  0x24b9);<br />
<br />
下面的做类似的事情，增加了一些空：<br />
&nbsp; $out = pack(&quot;CCxxCC&quot;, 65, 66,  67, 68); &nbsp; &nbsp; &nbsp;# $out 等于 &quot;AB\0\0CD&quot;<br />
<br />
打包你的短整数并不意味着你就可移植了：<br />
&nbsp; $out  = pack(&quot;s2&quot;, 1, 2); &nbsp; &nbsp; &nbsp; &nbsp; <br />
# 在小头在前的机器上是 &quot;\1\0\2\0&quot;<br />
# 在大头在前的机器上是  &quot;\0\1\0\2&quot;<br />
<br />
在二进制和十六进制包装上，count 指的是位或者半字节的数量，而不是生成的字节数量：<br />
&nbsp;  $out = pack(&quot;B32&quot;, &quot;...&quot;);<br />
&nbsp; &nbsp; $out = pack(&quot;H8&quot;, &quot;5065726c&quot;); &nbsp; &nbsp; &nbsp; &nbsp;  # 都生成&ldquo;Perl&rdquo;<br />
<br />
a 域里的长度只应用于一个字串：<br />
&nbsp; $out = pack(&quot;a4&quot;, &quot;abcd&quot;,  &quot;x&quot;, &quot;y&quot;, &quot;z&quot;); &nbsp; &nbsp; &nbsp;# &quot;abcd&quot;<br />
<br />
要绕开这个限制，使用多倍声明：<br />
&nbsp; $out =  pack(&quot;aaaa&quot;, &nbsp; &nbsp;&quot;abcd&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;); &nbsp; # &quot;axyz&quot;<br />
&nbsp; &nbsp;$out =  pack(&quot;a&quot; x 4, &nbsp; &quot;abcd&quot;, &quot;x&quot;, &quot;y&quot;, &quot;z&quot;); &nbsp; # &quot;axyz&quot;<br />
<br />
a 格式做空填充：<br />
&nbsp;  $out = pack(&quot;a14&quot;, &quot;abcdefg&quot;); &nbsp; &nbsp; &nbsp; &nbsp; # &quot; abcdefg\0\0\0\0\0\0&quot;<br />
<br />
<br />
<span style="font-size: 10px;">关于unpack:</span><br />
<br />
array unpack ( string  $format, string $data )<br />
<br />
$data = &quot;010000020007&quot;;<br />
unpack(&quot;Sint1/Cchar1/Sint2/Cchar2&quot;,$data);<br />
<br />
##  array('int1'=&gt;1, 'char1'=&gt;'0','int2'=&gt;2,'char2'=&gt;7);<br />
<br />
&nbsp; &nbsp; &nbsp; 最后本文开头讲到的协议使用pack/unpack 举例程序代码为 ：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$lastact</span><span>&nbsp;&nbsp;&nbsp;=&nbsp;pack(</span><span class="string">'SCSa32a32'</span><span>,0x0040,&nbsp;0x00,&nbsp;0x0006,&nbsp;</span><span class="vars">$username</span><span>,&nbsp;</span><span class="vars">$passwd</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>unpack(<span class="string">'Sint1/Cchar1/Sint2/Cchar2/'</span><span>,</span><span class="vars">$lastmessage</span><span>);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</p>]]></description>
			<link>http://www.neatstudio.com/show-1391-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-22 22:25</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1390-1.shtml</guid>
			<title>IE中iframe跨域丢失Session问题(续 p3p)</title>
			<author>gouki</author>
			<description><![CDATA[<p>P3P，不算是新名词，但还是有些人不清楚。事实上我也不清楚。。。在百度上看到有这玩意就备份下来。说真的，我只是知道用，但不知道为什么用。额。。很明显，因为在ucenter同步的时候，在discuz的ui/api里有写过。</p>
<p>看内容吧。。。。</p>
<div id="blog_text" class="cnt">
<p>IE6/IE7支持的P3P(Platform for Privacy  Preferences Project (P3P)  specification)协议默认阻止第三方无隐私安全声明的cookie，Firefox目前还不支持P3P安全特性，firefox中自然也不存 在此问题了。</p>
<p>在frameset里面，也就是里面的frame是来自第三方站点(不同IP或不同域名)，那么默认情况下IE会自动禁用这些站点的cookie， 也就是在请求某url时在HTTP  header里不发送它们的cookie，包括session的cookie。注意，这些站点在response里面设置的cookie还是会被发送到浏 览器的。</p>
<p>在用户浏览a.php时 A.com写入的为第一方Cookie,其嵌入的<u><strong>iframe</strong></u>指向 b.php.这时B.com写入的就为第三方Cookie了，所以它是被IE当在了大门外。  所以,每次当用户提交的cookie提交时,就挂掉了.因为传不到真实的服务器.</p>
<p>解决方案.</p>
<p><strong><u><strong>PHP</strong></u>的<u><strong>程序</strong></u></strong><u><strong>,</strong></u>可以直接在B网站中写入<span style="display: none; font-size: 0px;">www.kobsky.cn  小眼世界&yacute;&ntilde; &euml;&Otilde;R&Iuml;z-Z</span></p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span>header(<span class="string">'P3P:&nbsp;CP=&quot;CURa&nbsp;ADMa&nbsp;DEVa&nbsp;PSAo&nbsp;PSDo&nbsp;OUR&nbsp;BUS&nbsp;UNI&nbsp;PUR&nbsp;INT&nbsp;DEM&nbsp;STA&nbsp;PRE&nbsp;COM&nbsp;NAV&nbsp;OTC&nbsp;NOI&nbsp;DSP&nbsp;COR&quot;'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
这样就能接受第三方的Cookie啦。
<p>&nbsp;</p>
<p><strong>lighttpd的服务器</strong></p>
<p><strong>
<div class="codeText">
<div class="codeHead"><strong>XML/HTML代码</strong></div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span class="attribute"><strong>server.modules</strong></span><span><strong>&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(&quot;mod_setenv&quot;)&nbsp;&nbsp;</strong></span></span></li>
    <li class=""><span><span class="attribute"><strong>setenv.add-response-header</strong></span><span><strong>&nbsp;=&nbsp;(&nbsp;&quot;P3P&quot;&nbsp;=</strong></span><span class="tag"><strong>&gt;</strong></span><span><strong>&nbsp;&quot;</strong></span><span class="attribute"><strong>CP</strong></span><span><strong>=</strong></span><span class="attribute-value"><strong>'CURa&nbsp;ADMa&nbsp;DEVa&nbsp;PSAo&nbsp;PSDo&nbsp;OUR&nbsp;BUS&nbsp;UNI&nbsp;PUR&nbsp;INT&nbsp;DEM&nbsp;STA&nbsp;PRE&nbsp;COM&nbsp;NAV&nbsp;OTC&nbsp;NOI&nbsp;DSP&nbsp;COR'</strong></span><span><strong>&quot;)&nbsp;&nbsp;</strong></span></span></li>
</ol>
</div>
apache的服务器</strong></p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">VirtualHost</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Header&nbsp;set&nbsp;P3P&nbsp;'<span class="attribute">CP</span><span>=</span><span class="attribute-value">&quot;CURa&nbsp;ADMa&nbsp;DEVa&nbsp;PSAo&nbsp;PSDo&nbsp;OUR&nbsp;BUS&nbsp;UNI&nbsp;PUR&nbsp;INT&nbsp;DEM&nbsp;STA&nbsp;PRE&nbsp;COM&nbsp;NAV&nbsp;OTC&nbsp;NOI&nbsp;DSP&nbsp;COR&quot;</span><span>'&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="tag">&lt;/</span><span class="tag-name">VirtualHost</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<strong>IIS的服务器</strong><span style="display: none; font-size: 0px;">www.kobsky.cn  小眼世界&yacute;&ntilde; &euml;&Otilde;R&Iuml;z-Z</span><br />
<p>增加一个网站http头来解决问题；<span style="display: none; font-size: 0px;">www.kobsky.cn  小眼世界&yacute;&ntilde; &euml;&Otilde;R&Iuml;z-Z</span><br />
<u><strong>管理</strong></u>工具&mdash;&mdash;〉选择一个<u><strong>网站</strong></u>&mdash;&mdash;〉属性&mdash;&mdash;〉 http头，增加一个http头<span style="display: none; font-size: 0px;">www.kobsky.cn  小眼世界&yacute;&ntilde; &euml;&Otilde;R&Iuml;z-Z</span><br />
然后输入头名：P3P<span style="display: none; font-size: 0px;">www.kobsky.cn  小眼世界&yacute;&ntilde; &euml;&Otilde;R&Iuml;z-Z</span><br />
输入头内容：CP=CAO PSA OUR</p>
<p><strong>jsp页面：</strong></p>
<div class="codeText">
<div class="codeHead">XML/HTML代码</div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span>%&nbsp;&nbsp;</span></span></li>
    <li class=""><span>response.setHeader(&quot;P3P&quot;,&quot;<span class="attribute">CP</span><span>=</span><span class="attribute-value">CAO</span><span>&nbsp;PSA&nbsp;OUR&quot;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>%<span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<strong>java代码最简单的办法，增加一个filte:</strong>
<div class="codeText">
<div class="codeHead">Java代码</div>
<ol start="1" class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TransNameFilter&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HttpServlet&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Filter&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;org.apache.commons.logging.Log&nbsp;logWriter&nbsp;=&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;LogFactory.getLog(TransNameFilter.<span class="keyword">class</span><span>.getName());&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">/**</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">*</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;TransNameFilter()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">super</span><span>();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">/*&nbsp;（非&nbsp;Javadoc）</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;javax.servlet.Filter#init(javax.servlet.FilterConfig)</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init(FilterConfig&nbsp;arg0)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">/*&nbsp;（非&nbsp;Javadoc）</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">*&nbsp;@see&nbsp;javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,&nbsp;javax.servlet.ServletResponse,&nbsp;javax.servlet.FilterChain)</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,&nbsp;FilterChain&nbsp;chain)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;hreq&nbsp;=&nbsp;(HttpServletRequest)&nbsp;request;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;String&nbsp;transName&nbsp;=&nbsp;hreq.getParameter(<span class="string">&quot;transName&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(Util.isNullOrEmpty(transName))&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;logWriter.fatal(<span class="string">&quot;&nbsp;there&nbsp;is&nbsp;no&nbsp;transName&nbsp;for&nbsp;this&nbsp;request&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">else</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;logWriter.info(<span class="string">&quot;&nbsp;transName&nbsp;is&nbsp;&quot;</span><span>&nbsp;+&nbsp;transName);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;res&nbsp;=&nbsp;(HttpServletResponse)&nbsp;response;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//iframe引起的内部cookie丢失</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;res.setHeader(<span class="string">&quot;P3P&quot;</span><span>,</span><span class="string">&quot;CP=CAO&nbsp;PSA&nbsp;OUR&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(chain&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">/*&nbsp;（非&nbsp;Javadoc）</span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;javax.servlet.Filter#destroy()</span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;destroy()&nbsp;{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>]]></description>
			<link>http://www.neatstudio.com/show-1390-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-21 21:43</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1389-1.shtml</guid>
			<title>PHP笔记</title>
			<author>gouki</author>
			<description><![CDATA[<p>1、老王的乱炖中写了一个例子。</p>
<p><strong>写代码要细心</strong>【http://hi.baidu.com/thinkinginlamp/blog/item/5e8062d9b33ccc2110df9b2a.html】<br />
<br />
看一段PHP代码，设想一下它的输出结果，可以用来做面试题：<br />
<br />
<font face="宋体">&lt;?php if ($a = 100 &amp;&amp; $b = 200) {  var_dump($a, $b); } ?&gt;</font></p>
<p><font face="宋体">我眼睛一闭就随便想了一下$a=100,$b=200。然后看标题是写代码要细心。再仔细看看。才发现。。。额，我错了。</font></p>
<p><font face="宋体">2、yaml</font></p>
<p><font face="宋体">yaml这东西有据可证以来，好象在国内，应该算是QeePHP最早拿来做应用（我是指开源项目中），确实这东西挺方便【现在新浪sae的配置文件就是用yaml的】</font></p>
<p><font face="宋体">初学者可以看看http://www.lanyg.com/blog/?p=63,Tim在这里写了一些简单的入门。不过我相信，足够你使用了。</font></p>
<p><font face="宋体">yaml主要还是写起来方便。而且不用过多的担心语法（xml还需要闭合。array的话也需要注意PHP语法），yaml反正解析出来，要么不对，要么就正确。至少不会报一些奇怪的错误。<br />
</font></p>
<p><font face="宋体">3、HTTP协议。</font></p>
<p><font face="宋体">这篇也是来自于tim的博客：http://www.lanyg.com/blog/?p=33，他也是转载的csdn的文章</font>http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx，原作者是jeffrey，内容挺长。不过如果你想要模拟http POST和GET数据，你真的可以看一下这一篇东西</p>
<p>它介绍了【HTTP协议详解之消息报头】，也教你如何用telnet查看http协议的通讯过程（当然现在我们都是用firebug或者fildder之类的工具），文章最后介绍了一些补充协议，如代理（proxy），通道（tunnel）等。值得一看。</p>]]></description>
			<link>http://www.neatstudio.com/show-1389-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-20 17:33</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1388-1.shtml</guid>
			<title>typecho 插件开发（三）</title>
			<author>gouki</author>
			<description><![CDATA[<p>在typecho开发插件的时候，很有可能会用到关联插件（即，部分信息需要从其他插件里来读取）因此，在插件激活的时候就得先判断是否关联插件已经启用。</p>
<p>最初我的代码是：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span class="vars">$mailOptions</span><span>&nbsp;=&nbsp;Typecho_Widget::widget(</span><span class="string">'Widget_Options'</span><span>)-&gt;plugin(</span><span class="string">'CommentToMail'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">if</span><span>(</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$mailOptions</span><span>)){</span><span class="comment">//这里会出现两个empty,这是编辑器的关系，代码中只有一个</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Typecho_Plugin_Exception(_t(</span><span class="string">'对不起，数据库备份插件需启用CommentToMail插件。'</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
但是在这样处理的时候，会提示&ldquo;找不到CommentToMail插件的配置信息&rdquo;，直接就抛出异常</p>
<p>于是代码改成：
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>try{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$mailOptions</span><span>&nbsp;=&nbsp;Typecho_Widget::widget(</span><span class="string">'Widget_Options'</span><span>)-&gt;plugin(</span><span class="string">'CommentToMail'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}catch(Exception&nbsp;<span class="vars">$e</span><span>){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">throw</span><span>&nbsp;</span><span class="keyword">new</span><span>&nbsp;Typecho_Plugin_Exception(_t(</span><span class="string">'对不起，数据库备份插件需启用CommentToMail插件。'</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</p>
<p>于是这样的出错提示信息就较为友好了。</p>
<p>由于关联了其他插件，因此在处理的时候，还要再判断这个$mailOption是否存在，因此我把它设为了protected static $mailOptions，然后在要处理的页面会判断这个变量是否为empty。如果是后台处理就抛出异常，前台处理则直接return;不作继续</p>]]></description>
			<link>http://www.neatstudio.com/show-1388-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-20 11:10</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1387-1.shtml</guid>
			<title>cookie，又见cookie</title>
			<author>gouki</author>
			<description><![CDATA[<p>提起这个问题，很沉重。在cookie上我遇到很多很多奇怪的问题了（其实只是看起来奇怪而已）<br />
<br />
一一列一下吧<br />
1、页面是200状态，就是打不开。一直显示正在打开。但其他页面正常（首页并无其他特别的长耗时的代码）<br />
2、页面显示XXX错误（不记得代码是多少了。。以前在做测试的时候遇到过）<br />
3、cookie明明注册了。但却总是无效。<br />
<br />
一一列解吧。<br />
1、cookie数过多了，事实上，我没有设很多的cookie，只是，我在访问的时候，很多其他链接也帮我带上了cookie，导致在我这个域名根下，cookie数量过多。<br />
在<a href="../../../show-408-1.shtml">Cookie常识</a> 一文中我转载过DBA notes里的几句话：Cookie 是个很有趣的话题。根据 <a href="http://www.ietf.org/rfc/rfc2109.txt">RFC  2109</a> 的描述，每个客户端最多保持 300 个 Cookie，针对每个域名最多 20 个 Cookie  (实际上多数浏览器现在都比这个多，比如 Firefox 是 50 个) ，每个 Cookie 最多 4K，注意这里的 4K  根据不同的浏览器可能不是严格的 4096 。别扯远了，对于 Cookie 最重要的就是，尽量控制 Cookie 的大小，不要塞入一些无用的信息。<br />
解决方法：清空cookie或者删除非本站cookie<br />
2、cookie长度超出限制了。当时是在apache的服务器下，我用的是firefox，出错情况是提示cookie超长（错误代码记不清，最后是清空cookie解决 ）<br />
这里也有一位朋友有类似情况：<a id="ctl10_TitleUrl" href="http://www.cnblogs.com/qijun/archive/2010/07/19/1780577.html">Cookie 太大导致页面无应答的问题</a>，这是他的总结：</p>
<ol>
    <li>好像在IIS6下特定环境下就会出现这个问题，因为当时整个项目有10多台Web服务器做了F5，但只有2台出现这个问题。针对这个问题，我在 IIS7下也进行了一下测试，发现当Cookie的大小达到30000多字节时，就会出现有应答为200的包，但应答的内容为空，在IE上显示为&ldquo;&nbsp;  Internet Explorer cannot display the webpage  &rdquo;，所以具体能使用cookie有多大，IIS6和IIS7下标准不一。</li>
    <li>建议不要将用户配置等过大的信息写入cookie，搞不清楚什么时候IIS就出错了</li>
</ol>
<p>3、检查一下服务器时间与本地时间是否一致。对于PHP5，有的人总是忽略了时差。检查一下吧。<br />
<br />
最后：<br />
1、对多窗口浏览器，其实很郁闷的，你设置的cookie如果是没有过期时间，即关闭窗口即自动删除时，如果不关闭整个浏览器，而关闭当前tab，那么，是无法删除的<br />
2、对于swfupload，IE和FF下面会有不同的情况，传说中flash读的cookie是IE生成的，因此很多时间如果swfupload涉及到了用户登录情况时，总会不正常（后台在上传），记得把param中加个session_id的参数，POST过去。</p>
<p>BTW:这个，我真的很郁闷。有时候我的网站首页会无法打开，为什么呢？因为sablog(或者是我做的hacker)中生成了两个PHPSESSION的cookie，一个所属neatstudio.com，而另一个是.neatstudio.com，结果就导致了页面无法打开（看来，以后还是需要打开neatstudio.com后自动跳转到www.neatstudio.com才比较好，这样就不会出现类似的问题了。懒得改代码了。等 Session消失后就OK了。是不是太不注意用户体验了？）</p>]]></description>
			<link>http://www.neatstudio.com/show-1387-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-19 14:06</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1386-1.shtml</guid>
			<title>笔记：json_encode和jquery等</title>
			<author>gouki</author>
			<description><![CDATA[<p>一些笔记<br />
1、json_encode与json_decode的。开花石头在村里说，如果json_encode是字符串，那么在解码的时候还是字符串而不是数组，这点与手册上写的不太一样（是指json_decode的第二个参数是true的情况）<br />
&nbsp;&nbsp;&nbsp; 具体我没有测试，我想石头既然能够发出来那么一定是有这种情况发生，因此算是做个笔记<br />
<br />
2、jquery。在使用$('.xxx').hover时，如何知道当前hover对象在整个$('.xxx')对象中的索引值。事实上，我早就知道有$('li').index()之类的用法，但真的一次都没有成功过。简单的例子：</p>
<div class="codeText">
<div class="codeHead">JavaScript代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>$(</span><span class="string">'#test&nbsp;li'</span><span>).hover(</span><span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>alert(&nbsp;$(<span class="string">'#test&nbsp;li'</span><span>).index(</span><span class="keyword">this</span><span>)&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>},<span class="keyword">function</span><span>(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;<span class="comment">//...</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>});&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>差不多就是这样。了解到索引值是多少后，就可以针对它们做很多事。$(&quot;xxx:eq(&quot;+index+&quot;)&quot;).text()等操作都可以操作了。<br />
<br />
3、在InfoQ上看到有为PHP用户写的AS简单教程（InfoQ上的PDF下载时为显示404，请使用此链接：<a href="http://www.riameeting.com/magazine/pdf/RIAMeetingWeeklyReportNum24.pdf">http://www.riameeting.com/magazine/pdf/RIAMeetingWeeklyReportNum24.pdf</a>），这个版本是在线的，http://blog.csdn.net/lihe111/archive/2010/01/14/5189572.aspx<br />
<br />
4、还是InfoQ，领域驱动设计这本书的简化版，原书我有，只是看infoQ上介绍说，这几章是精选出来的。因此想简单了解的话，确实不错：<a href="http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/zh/pdf/dddquickly-chinese-version.pdf">http://www.infoq.com/resource/minibooks/domain-driven-design-quickly/zh/pdf/dddquickly-chinese-version.pdf</a><br />
<br />
5、对于WEB开发人员来说，dreamweaver和fireworks等是必备工具，如果不是专业的前端人员，d8和f8就足够了。而且很小，只有100M都不到。因为这些不是正版所以我不提供下载地址。</p>]]></description>
			<link>http://www.neatstudio.com/show-1386-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-18 21:10</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1385-1.shtml</guid>
			<title>新闻：开源公司 IronTec将推动PHP进驻Android平台</title>
			<author>gouki</author>
			<description><![CDATA[<p>看到这个新闻不转载一下恐怕对不起自己。<br />
本来都以为自己会学习scala然后进行android的开发了，现在看来，还有其他的途径啊。当然，效率可能不能保证吧？（小应用估计没大问题。）不过在看到新闻的同时也要想到，PHP做界面的话，可不一定就OK呀。</p>
<p>上新闻：</p>
<p style="text-indent: 2em;">对Java心生厌恶的朋友们 不妨来看看Android上的新玩意--PHP。</p>
<p style="text-indent: 2em;">PHP可不仅仅只能在互联网站上发 展，一个PHP for Android  (PFA)网站表示他们将可以发布编程模型、工具盒文档让PHP在Android上实现应用。</p>
<p style="text-indent: 2em;">该项目的主要赞助商是开源公司IronTec，PFA使用Scripting Layer for  Android  (SL4A)，也就是Androd Scripting Environment  (ASE)来实现这一点，您可以参看他们的网站来了解更多技术内幕。</p>
<p style="text-indent: 2em;">【事实上，我并未找到这个网站，而对于ASE，其实在09年infoQ上已经有介绍】</p>
<p><a href="http://code.google.com/p/android-scripting/" title="Android Scripting Environment（ASE）" id="t835">Android Scripting  Environment（ASE）</a>项目为Android增加了脚本支持。通过安装ASE，我们可以在设备上编写脚本并执行。</p>
<p>虽然现在已经涌现出了不少工具用于开发Android应用，但如果能在设备上编写脚本将是一件很爽的事情，这样我们就可以直接在设备上进行试验并快 速编写原型而无需启动IDE、编译、部署等。</p>
<p>ASE通过两种手段来访问Android  API。目前我们可以通过ASE使用Python及Lua运行时来运行脚本，这些运行时都是本地应用，他们通过JSON-RPC来访问Android  API。</p>
<p>由于Android本身基于Java，因此我们还可以运行基于JVM的语言。目前可以使用的是<a href="http://beanshell.org/">BeanShell</a>&mdash;&mdash;Java语言的动态版本。基于JVM的解释器<a href="http://code.google.com/p/android-scripting/source/browse/trunk/android/AndroidScriptingEnvironment/src/com/google/ase/interpreter/bsh/BshInterpreterProcess.java" title="就在ASE内部加载" id="inqk">就 在ASE内部加载</a>，无需间接的RPC调用。</p>
<p>ASE还计划让更多的JVM语言运行在Android上。<a href="http://www.infoq.com/news/2009/02/jruby12rc1-android-support;jsessionid=27C28741D27A97DA8BD1E2B5D0CC2814" title="虽然JRuby早就能运行在Android上了" id="w7j8">虽 然JRuby早就能运行在Android上了</a>，但却存在一些问题，首当其冲的就是Android使用了Dalvik  VM（Android应用被编译成Dalvik VM字节码）。</p>
<p>有兴趣的话就去看看<a href="http://code.google.com/p/android-scripting/source/browse/#svn/trunk" title="ASE的SVN仓库" id="gp18">ASE 的SVN仓库</a>吧，那上面<a href="http://code.google.com/p/android-scripting/source/browse/trunk/ruby/ase/android.rb" title="清楚地表明了未来的Ruby支持也将基于JSON-RPC" id="s1y1">清 楚地表明了未来的Ruby支持也将基于JSON-RPC</a>。</p>
<p>我们还可以通过<a href="http://www.infoq.com/news/2009/03/rhodes10-rhohub;jsessionid=27C28741D27A97DA8BD1E2B5D0CC2814">Rhodes</a>在 Android设备上使用Ruby。</p>
<p>大家都对ASE未来的发展拭目以待。iPhone不允许上面的应用自带解释器，而ASE却通过脚本扩展了Android，并且用户可以创建、编辑这 些脚本。</p>
<p style="text-indent: 2em;">InfoQ原文：http://www.infoq.com/cn/news/2009/07/android-scripting</p>]]></description>
			<link>http://www.neatstudio.com/show-1385-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-17 20:53</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1384-1.shtml</guid>
			<title>Neatpic 修正BUG</title>
			<author>gouki</author>
			<description><![CDATA[<p>这次neatpic重新修正了一些BUG，但代码还没有整理，因此暂时不放出下载，等代码整理好后再放出来。<br />
目前测试地址为：<a href="http://neatstudio.com/neatpic/">http://neatstudio.com/neatpic/</a><br />
修正：<br />
&nbsp;&nbsp;&nbsp; 1、支持中文文件名、目录名（怀疑所有的文件系统都是ansi方式读取而不是UTF8，不能确认）<br />
&nbsp;&nbsp;&nbsp; 2、文件名、路径隐藏（采用?file=imagexxxxxxxx）之类的方式，因为只显示缩略图，所以读上几十个缩略图的代价应该还是可以忍受的。<br />
<br />
其他没有什么特别的更新，可能也会BUG被改出来，敬请测试<br />
&nbsp;&nbsp;&nbsp;</p>]]></description>
			<link>http://www.neatstudio.com/show-1384-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-16 21:12</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1383-1.shtml</guid>
			<title>basename的郁闷</title>
			<author>gouki</author>
			<description><![CDATA[<p>又是basename，其实真的不想谈它，只是这两天在修正neatpic的BUG时，又被它折腾了。<br />
前两天有朋友在回复里说，还是对中文处理一下吧。所以，我想了想，对中文又重新更新了下，结果问题就来了。我明明文件名是：&ldquo;图片2副本.jpg&rdquo;，但在cache之后就成了&ldquo;2副本.jpg&rdquo;，2前面的图片两个字就没有了。。这个，也太妖异了。得，你说不支持中文吧，干脆连后面的副本也没有就算了。却偏偏把前面的中文去掉了。</p>
<p>后来用pathinfo也测试了一下，同样的问题。。。</p>
<p>但是我在win服务器下却一切正常。后来我检查了一下我的WEB服务器，我的版本是5.2.6，</p>
<p>测试代码：echo basename('E:/test/图片2副本');<a href="http://neatstudio.com/test.php"><u>点击查看测试页</u></a>。</p>
<p>这个真叫一个妖啊。。。</p>
<p>所以我现在是:str_replace(dirname($filename).DIRECTORY_SEPARATOR,'',$filename);</p>
<p>希望遇到同样问题的能够再次避免吧。。</p>
<p>&nbsp;</p>]]></description>
			<link>http://www.neatstudio.com/show-1383-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-16 14:22</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1382-1.shtml</guid>
			<title>集体智慧编程笔记（一）：相似度算法</title>
			<author>gouki</author>
			<description><![CDATA[<p>本文内容全部来自《集体智慧编程》一书，原书采用的是python，因为没有python编程环境，所以用PHP实现</p>
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//filename:test_collecting_preferences</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//数据和代码来自《集体智慧编程》</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//原文采用python实现，尝试用PHP进行转换</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//@description&nbsp;搜集用户偏好寻找相近用户</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$datalist</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Lisa&nbsp;Rose'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Lady&nbsp;in&nbsp;the&nbsp;Water'</span><span>&nbsp;=&gt;&nbsp;2.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Just&nbsp;My&nbsp;Luck'</span><span>&nbsp;=&gt;&nbsp;3.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'You,&nbsp;Me&nbsp;and&nbsp;Dupree'</span><span>&nbsp;=&gt;&nbsp;2.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'The&nbsp;Night&nbsp;Listener'</span><span>=&gt;&nbsp;3.0&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Gene&nbsp;Seymour'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Lady&nbsp;in&nbsp;the&nbsp;Water'</span><span>&nbsp;=&gt;&nbsp;3.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Just&nbsp;My&nbsp;Luck'</span><span>&nbsp;=&gt;&nbsp;1.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;5.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'You,&nbsp;Me&nbsp;and&nbsp;Dupree'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'The&nbsp;Night&nbsp;Listener'</span><span>=&gt;&nbsp;3.0&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Michael&nbsp;Phillips'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Lady&nbsp;in&nbsp;the&nbsp;Water'</span><span>&nbsp;=&gt;&nbsp;2.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;3.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'The&nbsp;Night&nbsp;Listener'</span><span>=&gt;&nbsp;4.0&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Claudia&nbsp;Puig'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Just&nbsp;My&nbsp;Luck'</span><span>&nbsp;=&gt;3.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;4.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'You,&nbsp;Me&nbsp;and&nbsp;Dupree'</span><span>&nbsp;=&gt;&nbsp;2.5,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'The&nbsp;Night&nbsp;Listener'</span><span>=&gt;4.5&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Mick&nbsp;LaSalle'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Lady&nbsp;in&nbsp;the&nbsp;Water'</span><span>&nbsp;=&gt;&nbsp;3.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;4.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Just&nbsp;My&nbsp;Luck'</span><span>&nbsp;=&gt;&nbsp;2.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;3.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'You,&nbsp;Me&nbsp;and&nbsp;Dupree'</span><span>&nbsp;=&gt;&nbsp;2.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'The&nbsp;Night&nbsp;Listener'</span><span>=&gt;&nbsp;3.0&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Jack&nbsp;Matthews'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Lady&nbsp;in&nbsp;the&nbsp;Water'</span><span>&nbsp;=&gt;&nbsp;3.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;4.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;5.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'You,&nbsp;Me&nbsp;and&nbsp;Dupree'</span><span>&nbsp;=&gt;&nbsp;3.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'The&nbsp;Night&nbsp;Listener'</span><span>=&gt;&nbsp;3.0&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Toby'</span><span>&nbsp;=&gt;&nbsp;</span><span class="keyword">array</span><span>(&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Snake&nbsp;on&nbsp;a&nbsp;Plane'</span><span>&nbsp;=&gt;&nbsp;4.5,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'Superman&nbsp;Returns'</span><span>&nbsp;=&gt;&nbsp;4.0,&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="string">'You,&nbsp;Me&nbsp;and&nbsp;Dupree'</span><span>&nbsp;=&gt;&nbsp;1.0,&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;&nbsp;</span></li>
    <li class=""><span>);&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//欧几里德距离</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//它以经过人们的一致评价的物品为坐标轴，然后将参与评价的人绘制到图上，并考查他们彼此间的距离远近。</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//偏好越相似的人，距离越近。不过我们还需要一个函数来对偏好越相近的情况给出越大的值，</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//为此我们可以将函数值加1（这样可以避免遇到被零整除的错误），并取其倒数</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//公式是&nbsp;1&nbsp;/&nbsp;(1&nbsp;+&nbsp;sqrt&nbsp;(&nbsp;&nbsp;pow(&nbsp;data[a][1]&nbsp;-&nbsp;data[b][1]&nbsp;....&nbsp;)&nbsp;&nbsp;))</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="keyword">function</span><span>&nbsp;sim_distance&nbsp;(&nbsp;</span><span class="vars">$datalist</span><span>&nbsp;,&nbsp;</span><span class="vars">$person1</span><span>&nbsp;,&nbsp;</span><span class="vars">$person2</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>{&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$si</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person1</span><span>]&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$moviename</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$grade</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;</span><span class="func">array_key_exists</span><span>(&nbsp;</span><span class="vars">$moviename</span><span>,&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person2</span><span>]&nbsp;)){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$si</span><span>[</span><span class="vars">$moviename</span><span>]&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;</span><span class="func">empty</span><span class="keyword">empty</span><span>(&nbsp;</span><span class="vars">$si</span><span>&nbsp;)){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$powers</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$si</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$moviename</span><span>=&gt;</span><span class="vars">$val</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$powers</span><span>&nbsp;+=&nbsp;pow(&nbsp;(</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person1</span><span>][</span><span class="vars">$moviename</span><span>]&nbsp;-&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person2</span><span>][</span><span class="vars">$moviename</span><span>]&nbsp;),&nbsp;2&nbsp;);</span><span class="comment">//两者影评分数相减的平方值</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;1&nbsp;/&nbsp;(1+&nbsp;sqrt(</span><span class="vars">$powers</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//测试&nbsp;'Lisa&nbsp;Rose'&nbsp;和&nbsp;'Gene&nbsp;Seymour'&nbsp;的相似度评价</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//原书上求出来是&nbsp;0.29429805508554946&nbsp;,&nbsp;PHP&nbsp;的结果是&nbsp;0.29429805508555，默认精度没有python高</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="func">echo</span><span>(&nbsp;sim_distance(&nbsp;</span><span class="vars">$datalist</span><span>&nbsp;,&nbsp;</span><span class="string">'Lisa&nbsp;Rose'</span><span>&nbsp;,&nbsp;</span><span class="string">'Gene&nbsp;Seymour'</span><span>)&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="func">echo</span><span>(&nbsp;</span><span class="string">'&lt;br/&gt;'</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span><span class="comment">//皮尔逊相关系数</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//该相关系统是判断两组数据与某一直线拟合程序的一种度量。对应的公司比欧几里德距离评价的计算公式要复杂</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//但是它在数据不是很规范时（如影评者对影片的评价总是相对于平均水平偏离很大），会倾向于给出更好的结果</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//皮尔逊相关度评价法首先会找出两位评论者都曾评过的物品</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//计算两者的评分总和与平方和，并求得评分的乘积之和，最后，利用这个结果计算出相关系数</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;sim_person&nbsp;(&nbsp;</span><span class="vars">$datalist</span><span>&nbsp;,</span><span class="vars">$person1</span><span>&nbsp;,&nbsp;</span><span class="vars">$person2</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class=""><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$si</span><span>&nbsp;=&nbsp;</span><span class="keyword">array</span><span>();&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person1</span><span>]&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$moviename</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$grade</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;</span><span class="func">array_key_exists</span><span>(&nbsp;</span><span class="vars">$moviename</span><span>,&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person2</span><span>]&nbsp;)){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$si</span><span>[</span><span class="vars">$moviename</span><span>]&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>(&nbsp;</span><span class="func">empty</span><span class="keyword">empty</span><span>(&nbsp;</span><span class="vars">$si</span><span>&nbsp;)){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;1;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$n</span><span>&nbsp;=&nbsp;</span><span class="func">count</span><span>(&nbsp;</span><span class="vars">$si</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sum1</span><span>&nbsp;=&nbsp;</span><span class="vars">$sum1Sq</span><span>&nbsp;=&nbsp;</span><span class="vars">$sum2</span><span>&nbsp;=&nbsp;</span><span class="vars">$sum2Sq</span><span>&nbsp;=&nbsp;</span><span class="vars">$pSum</span><span>&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">foreach</span><span>&nbsp;(&nbsp;</span><span class="vars">$si</span><span>&nbsp;</span><span class="keyword">as</span><span>&nbsp;</span><span class="vars">$moviename</span><span>&nbsp;=&gt;&nbsp;</span><span class="vars">$val</span><span>&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sum1</span><span>&nbsp;+=&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person1</span><span>][</span><span class="vars">$moviename</span><span>];&nbsp;&nbsp;&nbsp;</span><span class="comment">//个人影评分数累加</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sum1Sq</span><span>&nbsp;+=&nbsp;pow(&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person1</span><span>][</span><span class="vars">$moviename</span><span>],&nbsp;2&nbsp;);</span><span class="comment">//个人影评分数平方的累加</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sum2</span><span>&nbsp;+=&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person2</span><span>][</span><span class="vars">$moviename</span><span>];&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$sum2Sq</span><span>&nbsp;+=&nbsp;pow(&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person2</span><span>][</span><span class="vars">$moviename</span><span>],&nbsp;2&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$pSum</span><span>&nbsp;+=&nbsp;(&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person1</span><span>][</span><span class="vars">$moviename</span><span>]&nbsp;*&nbsp;</span><span class="vars">$datalist</span><span>[</span><span class="vars">$person2</span><span>][</span><span class="vars">$moviename</span><span>]);</span><span class="comment">//两人影评之乘积</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$num</span><span>&nbsp;=&nbsp;</span><span class="vars">$pSum</span><span>&nbsp;-&nbsp;(&nbsp;</span><span class="vars">$sum1</span><span>&nbsp;*&nbsp;</span><span class="vars">$sum2</span><span>&nbsp;/&nbsp;</span><span class="vars">$n</span><span>);&nbsp;</span><span class="comment">//&nbsp;正常情况下，我怎么都觉得这是1吧？</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="vars">$den</span><span>&nbsp;=&nbsp;sqrt(&nbsp;(&nbsp;</span><span class="vars">$sum1Sq</span><span>&nbsp;-&nbsp;pow(&nbsp;</span><span class="vars">$sum1</span><span>,&nbsp;2&nbsp;)&nbsp;/&nbsp;</span><span class="vars">$n</span><span>)&nbsp;*&nbsp;(&nbsp;</span><span class="vars">$sum2Sq</span><span>&nbsp;-&nbsp;pow(&nbsp;</span><span class="vars">$sum2</span><span>,&nbsp;2&nbsp;)&nbsp;/&nbsp;</span><span class="vars">$n</span><span>)&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(&nbsp;</span><span class="vars">$den</span><span>&nbsp;==&nbsp;0&nbsp;){&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;0;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;(</span><span class="vars">$num</span><span>&nbsp;/&nbsp;</span><span class="vars">$den</span><span>&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="comment">//继续测试&nbsp;'Lisa&nbsp;Rose'&nbsp;和&nbsp;'Gene&nbsp;Seymour'&nbsp;的相似度评价</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//原书上求出来是&nbsp;0.396059017191&nbsp;,&nbsp;PHP&nbsp;的结果是&nbsp;0.39605901719067，这回。。。位数超过了python</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="func">echo</span><span>(&nbsp;sim_person(&nbsp;</span><span class="vars">$datalist</span><span>&nbsp;,&nbsp;</span><span class="string">'Lisa&nbsp;Rose'</span><span>&nbsp;,&nbsp;</span><span class="string">'Gene&nbsp;Seymour'</span><span>)&nbsp;);&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>有点长，随便看看吧</p>]]></description>
			<link>http://www.neatstudio.com/show-1382-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-15 08:52</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1379-1.shtml</guid>
			<title>高级PHP应用程序漏洞审核技术</title>
			<author>gouki</author>
			<description><![CDATA[<p>不管是初学者还是老鸟，了解一下会有很多好处，比如里面介绍的，从URL传递global变量，比如5.26前的mt_rand的BUG等等。比如urldecode处理%2527会变成单引号，比如。。。实在太多了，或许程序真的没问题，但有问题的可能是PHP自己。<br />
了解一下，可以让代码中更少漏洞吧？<br />
<br />
原文很长，我这里也只是把目录贴一下，如果你真的有兴趣，不妨去看看全文</p>
<ul>
    <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E9%AB%98%E7%BA%A7PHP%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%BC%8F%E6%B4%9E%E5%AE%A1%E6%A0%B8%E6%8A%80%E6%9C%AF">高级PHP应用程序漏洞审核技术</a>
    <ul>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%89%8D%E8%A8%80">前言</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E4%BC%A0%E7%BB%9F%E7%9A%84%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E6%8A%80%E6%9C%AF">传统的代码审计技术</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#PHP%E7%89%88%E6%9C%AC%E4%B8%8E%E5%BA%94%E7%94%A8%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1">PHP版本与应用代码审计</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%85%B6%E4%BB%96%E7%9A%84%E5%9B%A0%E7%B4%A0%E4%B8%8E%E5%BA%94%E7%94%A8%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1">其他的因素与应用代码审计</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E6%89%A9%E5%B1%95%E6%88%91%E4%BB%AC%E7%9A%84%E5%AD%97%E5%85%B8">扩展我们的字典</a>
        <ul>
            <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%8F%98%E9%87%8F%E6%9C%AC%E8%BA%AB%E7%9A%84key">变量本身的key</a></li>
            <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96">变量覆盖</a>
            <ul>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E9%81%8D%E5%8E%86%E5%88%9D%E5%A7%8B%E5%8C%96%E5%8F%98%E9%87%8F">遍历初始化变量</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#parse_str%28%29%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96%E6%BC%8F%E6%B4%9E">parse_str()变量覆盖漏洞</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#import_request_variables%28%29%E5%8F%98%E9%87%8F%E8%A6%86%E7%9B%96%E6%BC%8F%E6%B4%9E">import_request_variables()变量覆盖漏洞</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#PHP5_Globals">PHP5 Globals</a></li>
            </ul>
            </li>
            <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#magic_quotes_gpc%E4%B8%8E%E4%BB%A3%E7%A0%81%E5%AE%89%E5%85%A8">magic_quotes_gpc与代码安全</a>
            <ul>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E4%BB%80%E4%B9%88%E6%98%AFmagic_quotes_gpc">什么是magic_quotes_gpc</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%93%AA%E4%BA%9B%E5%9C%B0%E6%96%B9%E6%B2%A1%E6%9C%89%E9%AD%94%E6%9C%AF%E5%BC%95%E5%8F%B7%E7%9A%84%E4%BF%9D%E6%8A%A4">哪些地方没有魔术引号的保护</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%8F%98%E9%87%8F%E7%9A%84%E7%BC%96%E7%A0%81%E4%B8%8E%E8%A7%A3%E7%A0%81">变量的编码与解码</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E4%BA%8C%E6%AC%A1%E6%94%BB%E5%87%BB">二次攻击</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E9%AD%94%E6%9C%AF%E5%BC%95%E5%8F%B7%E5%B8%A6%E6%9D%A5%E7%9A%84%E6%96%B0%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">魔术引号带来的新的安全问题</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%8F%98%E9%87%8Fkey%E4%B8%8E%E9%AD%94%E6%9C%AF%E5%BC%95%E5%8F%B7">变量key与魔术引号</a></li>
            </ul>
            </li>
            <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%B0%84">代码注射</a>
            <ul>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#PHP%E4%B8%AD%E5%8F%AF%E8%83%BD%E5%AF%BC%E8%87%B4%E4%BB%A3%E7%A0%81%E6%B3%A8%E5%B0%84%E7%9A%84%E5%87%BD%E6%95%B0">PHP中可能导致代码注射的函数</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%8F%98%E9%87%8F%E5%87%BD%E6%95%B0%E4%B8%8E%E5%8F%8C%E5%BC%95%E5%8F%B7">变量函数与双引号</a></li>
            </ul>
            </li>
            <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#PHP%E8%87%AA%E8%BA%AB%E5%87%BD%E6%95%B0%E6%BC%8F%E6%B4%9E%E5%8F%8A%E7%BC%BA%E9%99%B7">PHP自身函数漏洞及缺陷</a>
            <ul>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#PHP%E5%87%BD%E6%95%B0%E7%9A%84%E6%BA%A2%E5%87%BA%E6%BC%8F%E6%B4%9E">PHP函数的溢出漏洞</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#PHP%E5%87%BD%E6%95%B0%E7%9A%84%E5%85%B6%E4%BB%96%E6%BC%8F%E6%B4%9E">PHP函数的其他漏洞</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#session_destroy%28%29%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E6%BC%8F%E6%B4%9E">session_destroy()删除文件漏洞</a></li>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E9%9A%8F%E6%9C%BA%E5%87%BD%E6%95%B0">随机函数</a></li>
            </ul>
            </li>
            <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6">特殊字符</a>
            <ul>
                <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E6%88%AA%E6%96%AD">截断</a>
                <ul>
                    <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#include%E6%88%AA%E6%96%AD">include截断</a></li>
                    <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E6%95%B0%E6%8D%AE%E6%88%AA%E6%96%AD">数据截断</a></li>
                    <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C%E9%87%8C%E7%9A%84%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6">文件操作里的特殊字符</a></li>
                </ul>
                </li>
            </ul>
            </li>
        </ul>
        </li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E6%80%8E%E4%B9%88%E8%BF%9B%E4%B8%80%E6%AD%A5%E5%AF%BB%E6%89%BE%E6%96%B0%E7%9A%84%E5%AD%97%E5%85%B8">怎么进一步寻找新的字典</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#DEMO">DEMO</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E5%90%8E%E8%AF%9D">后话</a></li>
        <li><a href="http://code.google.com/p/pasc2at/wiki/SimplifiedChinese#%E9%99%84%E5%BD%95">附录</a></li>
    </ul>
    </li>
</ul>
<p>如果你有自己的想法，也可以尝试提交你的建议到该项目中去</p>]]></description>
			<link>http://www.neatstudio.com/show-1379-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-13 08:25</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1378-1.shtml</guid>
			<title>neatpic 重写完成</title>
			<author>gouki</author>
			<description><![CDATA[<p>其实 很多朋友已经在说我的neatpic了。我只是没时间重写。<br />
原来的程序是walkerlee写的，我只是旁边加了一下工。<br />
所以这次我重写的时候压力好大。。。<br />
基本上，大部分功能完成，暂时还没有实现把图片详细地址隐藏起来</p>
<p>已完成功能：</p>
<p>1、单文件（保持不变）</p>
<p>2、生成数据的cache，在目录下图片很多的时候，方便读取（图片信息我没有在初始化的时候生成到Cache里，留着给未来进行处理吧）</p>
<p>3、模版（也是一个模型而已，因为最初的那版是写死的，很多朋友说不方便改进，不过那时候是04年，将就点吧）</p>
<p>4、语言包（语言包只是一个虚幻的概念，测试模型而已）</p>
<p>5、文件名自然排序（原来的程序没有这个功能）</p>
<p>未完成功能：（短时间内不作更新了）</p>
<p>1、中文文件名。。。和操作系统有关啊。如果再改进就用base64处理一下了，这样显示就不太会有问题</p>
<p>2、管理（目前没有管理功能，也就是说不能上传，和人工重建缓存）</p>
<p>3、缩图和原图模式（好象没有什么必要吧？现在模版可以自己做的情况下，用jquery的thickbox或者lightbox，都可以避免这种问题了）</p>
<p>4、其他未知问题（图片详细地址没有隐藏，没有考虑外链，没有打包下载等等）</p>
<p>5、未计算子目录（不过我都在下拉列表里显示全路径了，顺便说一下，目录也没有排序）</p>
<p>目前测试地址为：<a href="http://neatstudio.com/neatpic/" target="_blank">http://neatstudio.com/neatpic/</a>。</p>
<p>下载地址为：<a href="http://www.neatstudio.com/attachment.php?id=675" title="8.46 K, 下载次数:92" target="_blank">neatpic.rar</a></p>
<p>注意：1、目前的程序几乎没有任何注释</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、对于目录判断等并没有完善，因此我打包的时候将目录结构都一并打包上来<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、语言包功能几乎无效。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、更多小问题，目前暂时不作解释和更新（这才是最重要的提醒。。。）</p>
<p>欢迎留下意见，我会在收集完信息后，一并修改</p>]]></description>
			<link>http://www.neatstudio.com/show-1378-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-12 14:56</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1375-1.shtml</guid>
			<title>开心一刻：程序员特有的9个坏习惯</title>
			<author>gouki</author>
			<description><![CDATA[<p>本文来自：http://www.phpv.net/html/1712.html，有点意思。纯属一笑吧，不过有时候看着也是一种悲哀。<br />
如果你是一个<font>程序员</font>, 或者你就读计算机相关专业, 那么你应该能理解下面这些诡异的小习惯是怎么养成的, 或者你本身就有着其中的某些习惯: <br />
<br />
<strong>0. <font>程序员</font>数数会从0开始数起. </strong><br />
<br />
例: <font>程序员</font>吵 架的时候会说: &ldquo;我数三下, 你再不闭嘴我就不客气了! 零! 一! 二!&rdquo; 或者列清单的时候编号会从0.开始写. <br />
<br />
因: array[0]是数组的第一个元素. <br />
<br />
评: 这个习惯的养成是一个艰难的过程. 多少次的越界, 多少次的循环次数错误让我们深深的记住了从0开始. <br />
<br />
<strong>1. <font>程序员</font>用肯定和否定 回答选择性的问题. </strong><br />
<br />
例: 问 &ldquo;您想喝咖啡还是喝茶?&rdquo; <font>程序员</font>答: &ldquo;嗯.&rdquo; <br />
<br />
因: 当条件或||有一个子句值为真, 则整个语句值为真. <br />
<br />
评: 这个习惯夸张了一点, 但这的确是<font>程序员</font>思 维方式的通病, 用计算机的处理逻辑处理人类问题. 当然这样的回答显然是存在编程错误的, 因为对于这个问题他错误的返回了布尔型的值. 虽然高度怀疑有没有人关心这种回答的结果是怎样, 还是给出一个答案. 如果真的在程序的世界里, 服务员会优先考虑给你咖啡, 如果没有咖啡了, 才会端茶给你. <br />
<br />
<strong>2. <font>程序员</font>普遍患有或曾经患有分号结尾综合症; </strong><br />
<br />
例: 比如这几行; <br />
<br />
因: 大部分程序, 特别是多数<font>程序员</font>的启蒙编程语言C语言是用分号结尾语句的; <br />
<br />
评: 换行之前习惯用分号结尾, 这是<font>程序员</font>专 属的坏习惯. 还记得编译报的各种诡异的错最后原因总是少了那一个小小的&rdquo;;&rdquo;吗? 这就是这个坏习惯的成因. 据说分号结尾是有典故的, 因为键盘上的分号正好在右手小拇指的位置, 比起句号之类有着得天独厚的地理优势. 当然也有不需要分号结尾的编程语言(比如Ruby还有Python), 刚用起来会因为没有分号结尾而格外纠结. <br />
<br />
<strong>3. <font>程序员</font>对&rdquo;语言&rdquo;的概念和普通人有差. </strong><br />
<br />
例: 问: &ldquo;你都会哪些语言?&rdquo; 普通人: &ldquo;我会汉语和英语, 还会一点点法语.&rdquo; <font>程序员</font>: &ldquo;我会C语言, C++ 和 Java, 还会一点点Ruby.&rdquo; <br />
<br />
因: <font>程序员</font>的世界里没有母语和外语, 只有编程语言. <br />
<br />
评: 说真的, 程序语言的语法学起来比外语更容易, 拿到一个用没学过的语言写的程序, 你多少可以看懂部分程序. 程序语言没有国界, 是各国<font>程序员</font>交流最好的桥梁. <br />
<br />
<strong>4. <font>程序员</font>格外</strong><strong>格</strong><strong>外的厌恶括号/引号不配对的情形. </strong><br />
<br />
例: 看到这样的内容 (举个简单的例子(我知道你懂的), 你能表示&rdquo;我很淡定我不抓狂吗? <br />
<br />
因: 各种不配对问题会导致编译错误. <br />
<br />
评: 扫视代码, 对不配对的情况异常敏感, 瞥一眼就能发现哪里少了个右括号. 这种症状在使用那些带自动补全功能的开发环境时变得更为纠结. <br />
<br />
<strong>5. <font>程序员</font>认为 千(k) == 1024. </strong><br />
<br />
例: <font>程序员</font>换算表: 1km == 1024m, 1kg == 1024g. <br />
<br />
因: 成因很曲折 计算机是二进制的世界 -&gt; 1024是2的10次方 -&gt; 英语里用kilo一词来表示 -&gt; kilo翻译成中文是&rdquo;千&rdquo;, 比如千米, 千克. <br />
<br />
评: 也许一般人会认为500, 1000是很整的数, 但<font>程序员</font>会觉得512, 1024是很整的数. 不要奇怪, 如果128, 256, 512这种形式看着不够整, 帮你转换成二进制: 10000000, 100000000, 1000000000&hellip; <br />
<br />
<strong>6. <font>程序员</font>惯用 == 来表示相等的意思. </strong><br />
<br />
例: 见5. <br />
<br />
因: 在程序语言中, &ldquo;=&rdquo; 是赋值, &ldquo;==&rdquo; 才用来判断二者是否相等. <br />
<br />
评: 单等和双等的区别是程序入门必修课, 也是老师爱考的考点. 如果在C语言if语句的判定条件里写了个单等, 编译能通过, 结果却往往不对, 够一个新手查上一阵子的. 当然目前的语言大都考虑到这一点, 防止了这类的误写, 但是单等和双等的差异已经深入每个<font>程序员</font>的 内心. <br />
<br />
<strong>7. <font>程序员</font>使用&rdquo;//&rdquo;表示&rdquo;请无视这一行文字&rdquo;. </strong><br />
<br />
例: 餐厅中. <font>程序员</font>A: &ldquo;我吃鱼香肉丝盖饭, 你吃什么?&rdquo; <br />
<br />
<font>程序员</font>B: &ldquo;宫保鸡丁盖饭.&rdquo; <br />
<br />
<font>程序员</font>A 在点菜单写上: <br />
<br />
鱼香肉丝盖饭 1 <br />
<br />
宫保鸡丁盖饭 1 <br />
<br />
<font>程序员</font>B: &ldquo;我还是要牛肉面吧!&rdquo; <br />
<br />
<font>程序员</font>A 更正点菜单: <br />
<br />
鱼香肉丝盖饭 1 <br />
<br />
// 宫保鸡丁盖饭 1 <br />
<br />
牛肉面 1 <br />
<br />
因: 程序中用&rdquo;//&rdquo;为代码加上注释, 程序运行时会无视掉&rdquo;//&rdquo;开头的代码行. <br />
<br />
评: 如果和一伙<font>程序员</font>在一起时被冷落了, 可以抱怨一句&rdquo;喂喂喂我是被注释掉了吗?&rdquo; 相信一向以幽默感丰富又有爱心著称的<font>程序员</font>们会关注你的. <br />
<br />
<strong>8. <font>程序员</font>有 中文标点恐惧症. </strong><br />
<br />
例: 如果你注意到了, 这篇文章自始至终都在使用英文标点, 这就是最好的例子. <br />
<br />
因: 程序中的全部符号都严格需要是英文半角标点. <br />
<br />
评: 这个坏习惯是有中国特色的, 中国<font>程序员</font>特 有的. 任何一名优秀的我国<font>程序员</font>都应该可以作到区别中文标点和英文标点. 比如, 和，还有 &rsquo;和 &lsquo;. 真的, 当年初学编程的时候, 诸如 &ldquo;error C2018: unknown character &rsquo;0xa3&prime;&rdquo; 的错误看得还不够多吗! <br />
<br />
就是这样一群人, 如果你慢吞吞的用电脑他们会急躁的抢过键盘熟练的使用各种快捷键, 他们会对着小孩子讲计算机的三原色是红绿蓝而不是红黄蓝, 他们描述大小距离更偏向于以像素作单位, 陪女朋友看电影看到电影院座位上稀稀落落的人就想做磁盘碎片整理&hellip;抱怨归抱怨, 这不也正是他们的可爱之处吗!</p>]]></description>
			<link>http://www.neatstudio.com/show-1375-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-10 20:45</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1374-1.shtml</guid>
			<title>将Yiiframework与JQuery easyUI整合使用</title>
			<author>gouki</author>
			<description><![CDATA[<p>jquery easyUI框架是国内某JS牛人写的仿extJS的框架。比较简单的实现一些功能，虽然目前还是有一些BUG，但将就着用用，也还能够接受。<br />
YiiFramework是国内某PHP牛人写的php框架，哦，好象人不在国内。最近用的人较多。本人比较喜欢他们提供的虚拟机（只有16M，当然，安装后达到100多M）</p>
<p>随便的整合了一下，目前是这个情况。</p>
<p><a href="http://www.neatstudio.com/attachment.php?id=674" target="_blank"><img src="http://www.neatstudio.com/attachments/date_201007/thumb_bb63e990e24b9dc80dc528521a551453.jpg" border="0" alt="大小: 47.73 K&#13;尺寸: 500 x 302&#13;浏览: 79 次&#13;点击打开新窗口浏览全图" width="500" height="302" /></a></p>
<p>几个问题需要注意一下的</p>
<p>1、layout的时候要注意。因为easyUI框架里面的页面也需要用到jquery，因此在布局的时候得考虑header部分</p>
<p>2、登录框，与1的条件相关</p>
<p>3、$this-&gt;render与$this-&gt;renderPartial ,renderPartial是不渲染任何模版的。如果你不想用layout的时候，可以用这个renderPartial方法</p>
<p>其它的就属于一些小事了，比如菜单可以用json_encode输出之类的。前两天还写了一个jquery easyUI这个outlook式的menu改进。</p>
<p>整体用下来还算比较方便</p>]]></description>
			<link>http://www.neatstudio.com/show-1374-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-09 14:33</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1372-1.shtml</guid>
			<title>张宴：当MySQL 和 Memcached 遇到尾部空格时</title>
			<author>gouki</author>
			<description><![CDATA[<p>张宴遇到的问题，我没有遇到过，只是以前知道，mysql在varchar类型插入的时候，会把字符串末尾的空格取消的（难道我记错了？），char的没记。不过按照char的类型，他是会用空格补全长度。所以，即使没空格也会多出空格。但，用PHP取出来后，我就没有注意过了。。。</p>
<p>下面是张宴遇到的问题，不过我觉得还是有必要用PHP实现一下看看究竟怎么回事。。。</p>
<p>同事下午遇到一问题，MySQL 和 Memcached  对于同一个key，不能对应起来。最终原因是：PHP将key写入MySQL数据库之前，没有经过trim()过滤首尾空格（关键是尾部空格），结果：<br />
<br />
1、MySQL的varchar、char类型字段，SELECT .... WHERE  查询时忽略字段的尾部空格。例如varchar类型字段uidcode中，存储的含有尾部空格的内容&ldquo;rewinx &rdquo;，通过以下三种方式均可查询到：</p>
<p><a href="http://www.neatstudio.com/attachment.php?id=672" target="_blank"><img src="http://www.neatstudio.com/attachments//date_201007/566f427f455d86c2965dfde40e3a6d52.png" border="0" alt="大小: 4.38 K&#13;尺寸: 420 x 351&#13;浏览: 35 次&#13;点击打开新窗口浏览全图" width="420" height="351" /></a></p>
<p>在MySQL手册第&ldquo;11.4.1. CHAR和VARCHAR类型&rdquo;节中写道（<a target="_blank" href="http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char">http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#char</a>）： 请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有 MySQL版本均如此，并且它不受SQL服务器模式的影响。</p>
<p>　 　2、PHP 的 Memcache 扩展，则在set、get时，自动将key中的空格，转换成了半角下划线&ldquo;_&rdquo;。当然，直接通过 Memcached  协议来读取，key值&ldquo;rewinx &rdquo;就要写成&ldquo;rewinx_&rdquo;了。<br />
<a name="entrymore"></a><br />
示 例：testmc.php
<div class="codeText">
<div class="codeHead">PHP代码</div>
<ol start="1" class="dp-c">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$memcache_obj</span><span>&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Memcache;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache_obj</span><span>-&gt;connect(</span><span class="string">'192.168.8.34'</span><span>,&nbsp;11211);&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="vars">$memcache_obj</span><span>-&gt;set(</span><span class="string">'rewinx&nbsp;'</span><span>,&nbsp;</span><span class="string">'hello&nbsp;world'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="func">echo</span><span>&nbsp;</span><span class="vars">$memcache_obj</span><span>-&gt;get(</span><span class="string">'rewinx&nbsp;'</span><span>).</span><span class="string">&quot;\r\n&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
</p>
<p><a href="http://www.neatstudio.com/attachment.php?id=673" target="_blank"><img src="http://www.neatstudio.com/attachments//date_201007/5b4f0aa88794991e8ad8804b4039b6d3.png" border="0" alt="大小: 3.28 K&#13;尺寸: 434 x 151&#13;浏览: 37 次&#13;点击打开新窗口浏览全图" width="434" height="151" /></a></p>]]></description>
			<link>http://www.neatstudio.com/show-1372-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-07 09:49</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1368-1.shtml</guid>
			<title>TIPS:利用rewrite来规避注入漏洞</title>
			<author>gouki</author>
			<description><![CDATA[<p>PHP的新手在开发的时候不可避免的会遇到SQL注入的问题，很多老手在介绍的时候是叮嘱叮嘱再叮嘱啊。其实有个简单的方法就可以减少这种问题的过失。<br />
1、rewrite 规则<br />
2、很多框架的路由<br />
这两种方式都是将GET方法做了一个简单正则处理，也只有符合规则的情况下，GET值才会被赋值到变量中。如果将ID等做一个\d的判断，那么非数字的已经经过一次过滤了。<br />
而且，你在采用rewrite规则的时候，很多sql语句就无法通过URL被传递进来，因为他们不能被正则正常解析。<br />
当然，你也可以想象，如果你的URL是1-0-0-1-0-1-0-1-1-1.html你能知道这些位数是干嘛的不？这种情况用于搜索比较常见，因为搜索的条件会比较复杂，也会比较容易被用来做注入。<br />
如果根据ID取文章之类的，你show-1-1.html别人是知道你的ID为多少，但已经不太容易注入了吧？<br />
新手只是要学习一下rewrite规则了。了解一下正则也好HOHO</p>]]></description>
			<link>http://www.neatstudio.com/show-1368-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-05 07:20</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1367-1.shtml</guid>
			<title>两篇PHP的文章不错</title>
			<author>gouki</author>
			<description><![CDATA[<p>可以值得一看的文章 ：<br />
<a href="http://www.cnblogs.com/afritxia2008/archive/2010/06/27/1766026.html" class="postTitle2" id="homepage1_HomePageDays_DaysList_ctl01_DayItem_DayList_ctl00_TitleUrl">PHP三层结构(上)&mdash;&mdash;简单三层结构</a><br />
<a href="http://www.cnblogs.com/afritxia2008/archive/2010/07/03/1770427.html" class="postTitle2" id="homepage1_HomePageDays_DaysList_ctl00_DayItem_DayList_ctl00_TitleUrl">PHP三层结构(下)&mdash;&mdash;PHP实现AOP
<div class="codeText">
<div class="codeHead"><a>XML/HTML代码</a></div>
<ol start="1" class="dp-xml">
    <li class="alt"><span><span><a>摘要:&nbsp;本文重点讨论&nbsp;PHP&nbsp;三层结构代码中的中间层，由于需求不断增加造成中间层代码越来越庞大，最终导致代码难以维护。在论述过程中提出对中间层建立扩展机制，并引出&nbsp;AOP&mdash;&mdash;面向切面的编程概念。本文提供&nbsp;PHP&nbsp;源码！&nbsp;&nbsp;</a></span></span></li>
</ol>
</div>
</a></p>
<p>在PHP方面已经挺不错了。</p>
<p>其实 在QEEPHP中，已经有实现了。不过没有想象中的那么好。</p>
<p>在第二篇 的文章中，我想过如何用插件来实现这些高级效果？那后来添加的插件又怎么实时加入系统？</p>
<p>QEEPHP和thinkPHP在后来已经有beforeAction,afterACtion。</p>
<p>thinkPHP在最早的model里也有beforeInsert,afterInsert之类的功能，用来处理数据验证。这其实已经有上面介绍的原型功能了。</p>
<p>过多的面向对象，虽然损失的效率，但对于业务逻辑处理来说，却比较方便了。</p>]]></description>
			<link>http://www.neatstudio.com/show-1367-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-04 10:27</pubDate>
		</item>
		<item>
			<guid>http://www.neatstudio.com/show-1365-1.shtml</guid>
			<title>PHP的面试题</title>
			<author>gouki</author>
			<description><![CDATA[<p>求职的朋友可以看看，不过也不要想着这些就一定有用，有时候工作中的经验也是非常重要的。不过，基本知识点还是非常重要的。至于高阶中的算法问题，如果你不是做特别重要的任务，这些算法你是碰不到的（做网游的除外）；高阶中的像册处理，如果你真能处理好了，你单独做一个产品出售也不成问题啊。</p>
<h1>1. 基本知识点</h1>
<ol>
    <li>HTTP协议中几个状态码的含义:503 500 401 200 301 302。。。</li>
    <li>Include require include_once require_once 的区别.</li>
    <li>PHP/Mysql中几个版本的进化史，比如mysql4.0到4.1，PHP 4.x到5.1的重大改进等等。</li>
    <li>HEREDOC介绍</li>
    <li>写出一些php魔幻方法;</li>
    <li>一些编译php时的configure 参数</li>
    <li>向php传入参数的两种方法。</li>
    <li>(mysql)请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别;</li>
    <li>error_reporting 等调试函数使用</li>
    <li>您是否用过版本控制软件? 如果有您用的版本控制软件的名字是?</li>
    <li>posix和perl标准的正则表达式区别;</li>
    <li>Safe_mode 打开后哪些地方受限.</li>
    <li>写代码来解决多进程/线程同时读写一个文件的问题。</li>
    <li>写一段上传文件的代码。</li>
    <li>Mysql 的存储引擎,myisam和innodb的区别。</li>
</ol>
<p><a name="toc2"></a></p>
<h1>2. web 架构，安全,项目经验</h1>
<ol>
    <li>介绍xdebug,apc,eAccelerator,Xcache,Zend opt的使用经验。</li>
    <li>使用mod_rewrite,在服务器上没有/archivers/567.html这个物理文件时，重定向到index.php?id=567 ,请先打开mod_rewrite.</li>
    <li>MySQL数据库作发布系统的存储，一天五万条以上的增量，预计运维三年,怎么优化？</li>
    <li>写出一种排序算法（原理），并说出优化它的方法。</li>
    <li>请简单阐述您最得意的开发之作</li>
    <li>对于大流量的网站,您采用什么样的方法来解决各页面访问量统计问题</li>
    <li>您是否用过模板引擎? 如果有您用的模板引擎的名字是?</li>
    <li>请介绍Session的原理,大型网站中Session方面应注意什么?</li>
    <li>测试php性能和mysql数据库性能的工具,和找出瓶颈的方法。</li>
    <li>正则提出一个网页中的所有链接.</li>
    <li>介绍一下常见的SSO(单点登陆)方案(比如dedecms整合discuz的passport)的原理。</li>
    <li>您写过的PHP框架的特点，主要解决什么问题，与其他框架的不同点。</li>
    <li>大型的论坛/新闻文章系统/SNS网站在性能优化上有什么区别?</li>
    <li>相册类应用:要求在浏览器中能同时选中并上传多个文件，图片要求能剪裁，压缩包在服务器端解压。能上传单个达50M的文件。上传过程中有进度条显示。每个图片能生成四种大小缩略图，视频文件要转成flv供flash播放。叙述要涉及的各类开源软件和简单用途。</li>
    <li>一群猴子排成一圈，按1，2，&hellip;，n依次编号。然后从第1只开始数，数到第m只,把它踢出圈，从它后面再开始数，再数到第m只，在把它踢出去&hellip;， 如此不停的进行下去，直到最后只剩下一只猴子为止，那只猴子就叫做大王。要求编程模拟此过程，输入m、n, 输出最后那个大王的编号。用程序模拟该过程。</li>
</ol>
<p><a name="toc3"></a></p>
<h1>3. unix/linux 基本使用</h1>
<ol>
    <li>linux下查看当前系统负载信息的一些方法。</li>
    <li>vim的基本快捷键。</li>
    <li>ssh 安全增强方法;密码方式和rsa key 方式的配置。</li>
    <li>rpm/apt/yum/ports 装包，查询，删除的基本命令。</li>
    <li>Makefile的基本格式，gcc 编译，连接的命令,-O0 和-O3区别。</li>
    <li>gdb,strace,valgrind的基本使用.</li>
</ol>
<p><a name="toc4"></a></p>
<h1>4. 前端,HTML,JS</h1>
<ol>
    <li>css盒模型。</li>
    <li>javascript中的prototype。</li>
    <li>javascript中this对象的作用域。</li>
    <li>IE和firefox事件冒泡的不同。</li>
    <li>什么是怪异模式,标准模式，近标准模式。</li>
    <li>DTD的定义</li>
    <li>IE/firefox常用hack.</li>
    <li>firefox,IE下的前端js/css调试工具。</li>
</ol>
<p>原文来自http://www.162cm.com/archives/972.html<br />
前两天在面试的时候面试官就提出，数据库什么时候关闭比较好？是让他自已关闭还是主动在代码中关闭？</p>]]></description>
			<link>http://www.neatstudio.com/show-1365-1.shtml</link>
			<category domain="http://www.neatstudio.com/category-1-1.shtml">PHP</category>
			<pubDate>2010-07-03 09:14</pubDate>
		</item>
	</channel>
</rss>
