<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>寂静的深海 &#187; 实验室</title>
	<atom:link href="http://www.deepseath.com/?cat=280&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.deepseath.com</link>
	<description></description>
	<lastBuildDate>Mon, 29 Jan 2024 09:55:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>PHP发送header头404信息</title>
		<link>http://www.deepseath.com/?p=1018</link>
		<comments>http://www.deepseath.com/?p=1018#comments</comments>
		<pubDate>Sat, 12 Nov 2011 12:53:02 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=1018</guid>
		<description><![CDATA[其实很简单，直接上代码再解释。 if ( stripos(php_sapi_name(),'cgi') === 0 ) { @header('Status: 404 Not Found',true); } else { @header( (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1').' 404 Not Found'); } echo &#60;&#60;&#60;EOD &#60;!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"&#62; &#60;html&#62;&#60;head&#62; &#60;title&#62;404 Not Found&#60;/title&#62; &#60;/head&#62;&#60;body&#62; &#60;h1&#62;Not Found&#60;/h1&#62; &#60;p&#62;The requested URL was not found on this server.&#60;/p&#62; &#60;/body&#62;&#60;/html&#62; EOD; exit; 其实正常情况下只需要header(&#8216;HTTP/1.1 404 Not [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=1018</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP的json数据编译和解译，字符编码无关。</title>
		<link>http://www.deepseath.com/?p=1016</link>
		<comments>http://www.deepseath.com/?p=1016#comments</comments>
		<pubDate>Fri, 11 Nov 2011 03:23:48 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[技术]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=1016</guid>
		<description><![CDATA[这里只就PHP5.2.0+以上版本而言，因为JSON扩展是自PHP5.2.0才开始引入的。早期版本没有默认引入。 json现在应用比较广泛，主要是由于ajax技术的原因。json可以很方便的传输具有属性的数据格式，方便前端进行解析处理，更好的将数据流量传输降低并且也能使前后端尽可能的分离。 貌似自06年开始我在做的项目如果客户不强烈要求的情况下，我都会使用UTF-8进行编码开发，UTF-8开发会有很多好处，比如前、后端数据传输很方便无须额外的编码开销，另外储存的字符也比较直观，虽然有数据容量的浪费，但在目前储存如白菜价的环境下，容量问题应该不大。 在使用UTF-8编码的时候，json_encode/json_decode可以很方便的处理（虽然编译后的数据中的中文看起来很怪异，但因为也不需要直接使用数据所以也无所谓），因为PHP自带的json扩展库只支持UTF-8编码。 但有的时候客户强烈选择使用GBK/GB2312进行编码的情况下，自带的json就应付不了了。所有涉及到中文的经过编译后会变成null。 在不考虑使用第三方的扩展或者其他类库处理的情况，可以自己写一个变形函数来处理。 原理其实就是将数据的字符进行编码，比如使用rawurlencode()、urlencode()或者base64_encode()等函数进行编码，然后输出的时候再进行解码。 当然了，也可以用另一种途径，就是直接将数据字符进行编码转换，统一转换为UTF-8，然后使用json扩展函数进行处理，不过，这样处理可能会有一些意外发生（比如字符编码错误），另外，程序内的几个字符编码间来回转换看起来也不太好。 我处理的时候，利用urlencode进行编码（其实也可以使用rawurlencode()或base64_encode()，不过base64编码容量会比较大一些）。一般就是重写几个函数：json_encode()、json_decode()、ulrencode()、urldecode()。 首先要重写一下urlencode()和urldecode()，因为php自带的这两个函数只能对字符串进行处理，对于数组无法处理。而我们大多情况下其实就是处理数组。 其次要重写json_encode()和json_decode()，主要是将字符串编码进行还原，其实如果是js需要的话，可以不用重写。 主要代码： function djson_encode($data){ //重写json_encode，将数据使用urlencode进行编码 return json_encode(durlencode($data)); } function djson_decode($data){ $data = json_decode($data,true); $out = array(); foreach ( $data AS $key=&#62;$value ) { $out[durldecode($key)] = durldecode($value); } return $out; } function durldecode($string){ if ( is_array($string) ) { $array = array(); foreach ( $string AS $key=&#62;$value [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=1016</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ISBN的校验</title>
		<link>http://www.deepseath.com/?p=791</link>
		<comments>http://www.deepseath.com/?p=791#comments</comments>
		<pubDate>Mon, 27 Sep 2010 16:29:58 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[Function]]></category>
		<category><![CDATA[ISBN]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=791</guid>
		<description><![CDATA[维基百科提供的ISBN码校验算法： 校验码的计算方法（10码） 假设某国际标准书号号码前9位是：7-309-04547 计算加权和S：S = 7×10＋3×9＋0×8＋9×7＋0×6＋4×5＋5×4＋4×3＋7×2 = 226 计算S÷11的余数M：M = 226 mod 11 = 6 计算11 – M 的差N：N = 11 ? 6 = 5 如果N = 10，校验码是字母”X” 如果N = 11，校验码是数字”0&#8243; 如果N为其他数字，校验码是数字N 所以，本书的校验码是5；如果用户提供的ISBN码是7-309-04547-6，那么校验失败 校验码的计算方法（13码） 假设某国际标准书号号码前12位是：978-986-181-728 计算加权和S：S = (9×1)+(7×3)+(8×1)+(9×3)+(8×1)+(6×3)+(1×1)+(8×3)+(1×1)+(7×3)+(2×1)+(8×3) = 164 计算S÷10的余数M：M = 164 mod 10 = 4 计算10 – M 的差N：N = 10 ? 4 [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=791</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery处理同级事物的一个方式</title>
		<link>http://www.deepseath.com/?p=772</link>
		<comments>http://www.deepseath.com/?p=772#comments</comments>
		<pubDate>Fri, 10 Sep 2010 07:00:28 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[代码]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=772</guid>
		<description><![CDATA[呵呵，标题有点绕，不知道这样表达是否达意。其实就是同类型（级别）的事件触发的判断处理而已，还搞不明白？-_-!我的表达有问题，那就看下面的代码吧： &#60;table&#62; &#60;tr id="data_3"&#62; &#60;td&#62;row1&#60;/td&#62; &#60;td&#62;Row2&#60;/td&#62; &#60;td&#62;&#60;button type="button" class="_operation"&#62;编辑&#60;span class="is_hidden"&#62;(e)&#60;/span&#62;&#60;/button&#62; &#60;button type="button" class="_operation"&#62;删除&#60;span class="is_hidden"&#62;(d)&#60;/span&#62;&#60;/button&#62;&#60;/td&#62; &#60;/tr&#62; &#60;tr id="data_10"&#62; &#60;td&#62;row2&#60;/td&#62; &#60;td&#62;Row2&#60;/td&#62; &#60;td&#62;&#60;button type="button" class="_operation"&#62;编辑&#60;span class="is_hidden"&#62;(e)&#60;/span&#62;&#60;/button&#62; &#60;button type="button" class="_operation"&#62;删除&#60;span class="is_hidden"&#62;(d)&#60;/span&#62;&#60;/button&#62;&#60;/td&#62; &#60;/tr&#62; &#60;/table&#62; 要处理上面的每行数据的“编辑”和“删除”按钮。我通过下面的jQuery处理： /*&#60;![CDATA[*/ $(function(){ $('._operation').live('click',function(){ var    str_op    =    (($(this).text()).match(/\((e&#124;d)\)/i)); var    op        =    str_op[1]; var    pObj    =   [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=772</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于用户邮箱验证的一个思路</title>
		<link>http://www.deepseath.com/?p=770</link>
		<comments>http://www.deepseath.com/?p=770#comments</comments>
		<pubDate>Mon, 06 Sep 2010 16:59:47 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[分享]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[思路]]></category>
		<category><![CDATA[流程]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=770</guid>
		<description><![CDATA[当下很多运营或者应用都会引导用户激活验证注册的Email地址，为了确保获得更可靠的用户（虽然可靠性不是很高），同时也为了避免地址不被滥用，尽力获取更优化的用户资源等等，好处是很多的。 一般在验证流程上都很简单，无非是：根据用户登记的Email发送一个验证邮件，用户收到邮件后，访问一个特定的处理链接，系统接收后，便会确认此人Email通过验证激活。 这个方式简单容易，设计也很方便。 但有一个“问题”，某个用户起初登记了一个A地址，然后通过了验证，过了一阵他又将Email改成了B地址，也通过了验证，可过了一阵又因为某种原因他又将Email改回了A地址，可系统仍旧提示未通过验证，这个挺囧的——当然其实也不是什么大不了的问题，不过个人始终觉得这是一个人性化的考虑。已经通过验证了的邮箱为什么还要再次验证呢？ 近期在一个项目上也有类似的处理，因为基于该异想天开的想法，我特意费时巴拉的用了一个新的机制，虽然没人能够看到，但我相信多多少少会让用户觉得有点人味的^_^ 具体流程其实很简单，无非是增加一个数据表，用来储存经过验证的Email地址，且每个Email对应一个用户id。 当用户通过验证的时候记录下他的id和Email，以及其他信息（比如验证时间等等） 当用户修改Email的时候，先去到这个数据表内查询该记录是否存在（uid和email同时满足），存在了就表面该用户已经通过验证了，不需要再次发送验证邮件。 uid与Email是作为一个唯一性索引键（UNIQUE）存在的。这样可以确保别人冒用这个Email地址的情况也被认为是通过验证的。 也就是说，只有其本人曾经用过的Email地址才会采用跳过验证的机制。 简单说： 用户A曾经验证通过了a、b、c三个Email地址。 那么日后他无论将Email地址修改变换为这三个任意一个的时候，系统都不会提醒他再次去验证。 如果另一个用户B登记了a地址，那么系统还是要提醒他进行验证的，因为数据表记录下验证通过a地址的用户是A而不是B。 以上就是我在项目中关于用户Email地址验证的一个机制（当然实际操作过程中，还要加入一个验证的条件限制等条件，避免用户频繁的请求，关于这部分处理，相信所有的验证机制都会考虑的。），不一定有什么特别重大的作用，不过觉得还是挺有意思的，记录下来分享一下吧。]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=770</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CKEditor或者FCKEditor编辑器的分页处理</title>
		<link>http://www.deepseath.com/?p=733</link>
		<comments>http://www.deepseath.com/?p=733#comments</comments>
		<pubDate>Tue, 27 Jul 2010 07:40:34 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[CKEditor]]></category>
		<category><![CDATA[FCKEditor]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[正则]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=733</guid>
		<description><![CDATA[CKEditor就是FCKEditor的改名版本，呵呵。基于javascript的前端HTML编辑器，一般做内容管理系统的基本都用过这个编辑器，很强大很方便。 做内容管理某个内容可能文字会很多，分开发表的话不方便维护管理，一般就是直接使用CKEditor的分页功能，说白了这个无非就是类似下面的一段HTML代码：   如果要想在前台输出的时候分页是做不到的。我一般会有两种方式进行处理： 1.利用服务端在输出到页面前进行分页。 2.利用前端javascript直接进行分页。 习惯上我比较喜欢第一种，呵呵。第二种在目前的项目中准备要用到。 先说第一种方式，其实就是利用PHP将CKEditor的分页代码替换为某个标识符，然后进行下一步处理。 比如，利用正则将分页代码替换为“&#60;!&#8211;/*page-breaker*/&#8211;&#62;” &#60;?php $content = preg_replace('/&#60;div\s*style\s*=\s*"page-break-after\s*:\s*always\s*;\s*"[^&#60;\/div&#62;]*&#62;\s*&#60;span\s*style\s*=\s*"\s*display\s*:\s*none\s*;\s*"\s*[^&#60;\/span&#62;]*&#62;(.+)&#60;\/span&#62;\s*&#60;\/div&#62;/iUs',"&#60;!--/*page-breaker*/--&#62;",$content); ?&#62; 这样就将HTML的分页代码替换为一个常规的字符串。然后利用explode函数重组为数组进行分页处理。当然，如果喜欢可以每次都使用正则直接输出一个数组^_^ 第二种方式，是参考别人利用jQuery写的：http://www.blogjava.net/haha1903/archive/2010/06/23/324223.html，暂时没使用过，记下来备用吧，呵呵。 $(function() { var top = "#content"; var content = $(top); var all = content.find("*"); var pages = []; function hideContent() { all.hide(); } function showArray(arr) { $.each(arr, function(i) { this.show().parentsUntil(top).show(); }); } function initPages(pageBreaks) { pageBreaks.each(function(index) { $(this).attr("id", "pageBreak" [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=733</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个有意思的函数传参方法</title>
		<link>http://www.deepseath.com/?p=678</link>
		<comments>http://www.deepseath.com/?p=678#comments</comments>
		<pubDate>Fri, 21 May 2010 14:52:20 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[函数]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=678</guid>
		<description><![CDATA[最近在做的项目，虽然有很多前端的东西，现在不喜欢搞前端，觉得特麻烦，累。不如后台程序部分好玩，直接写代码还是很有意思的。 说实话，这么多年始终对于javascript属于入门汉的状态，主要是觉得javascript相对与服务端的PHP来说，不如PHP直接跟数据库打交道有意思。 不过，最近接触了好多jQuery，突然发现javascript原来不需要了解太多了，哈哈。jQuery真的是个好东西。 在使用和制作jQuery扩展的时候，发现jQuery有一个很有趣的函数传参办法，那就是直接利用数组或者已经格式化了的json字符串，这样做的好处显而易见——不必要记住函数参数的具体顺序，哪个在先哪个在后都无所谓。 现在懒得学习了，PHP手册也仅仅找需要的，加之英语实在不太好，所以在我的印象里，似乎php没有类似的方法（当然PHP类的那个不算在内） 晚上无聊的时候，尝试写了一个乱弹代码，觉得还是挺好玩的。 &#60;?php function call_function_param_arr($func_param_arr){ $var1='val1'; $var2='val2'; $var3='val3'; $var4='val4'; $var5='val5'; $var6='val6'; $var7='val7'; $var8='val8'; $var9='val9'; extract($func_param_arr,EXTR_IF_EXISTS); for ( $i=1;$i&#60;=9;$i++ ) { $tmp = 'var'.$i; echo "var{$i} = {$$tmp}&#60;br /&#62;"; } } function call_function_param_json($func_param_json){ $var1='val1'; $var2='val2'; $var3='val3'; $var4='val4'; $var5='val5'; $var6='val6'; $var7='val7'; $var8='val8'; $var9='val9'; extract(json_decode($func_param_json,true),EXTR_IF_EXISTS); for ( $i=1;$i&#60;=9;$i++ ) { $tmp = 'var'.$i; echo [...]]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=678</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>【原创】jQuery插件之Email地址格式判断</title>
		<link>http://www.deepseath.com/?p=650</link>
		<comments>http://www.deepseath.com/?p=650#comments</comments>
		<pubDate>Mon, 19 Apr 2010 07:39:02 +0000</pubDate>
		<dc:creator>Deepseath</dc:creator>
				<category><![CDATA[实验室]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.deepseath.com/?p=650</guid>
		<description><![CDATA[呵呵，不算是什么特别的东西，这个应该是第一次写的jQuery的插件。 jQuery.ISEmail = function(email){ var strlen = email.length; var email_rule = /^[\w\-\.]+@[\w\-\.]+(\.\w+)+$/; return ( strlen &#62;= 6 &#38;&#38; strlen &#60; = 40 &#38;&#38; email_rule.test(email) ); } 使用很简单： if ($.ISEmail('test@test.com')) { alert('Email 地址格式正确'); } else { alert('Email 地址格式错误'); } 一直都在使用，未发现特别的问题，如果你使用过程发现什么错误，请告诉我:)谢谢。]]></description>
		<wfw:commentRss>http://www.deepseath.com/?feed=rss2&#038;p=650</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
