<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[记点东西]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[可能主要是技术的]]></description>
<link>http://hi.baidu.com/cultnoble</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[js跨域post参数并控制当前页面显示]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/c0ca61a1ed45b1824610644c.html]]></link>
        <description><![CDATA[
		
		ajax可以post参数，但是不可以跨域<br>
<br>
用script标签的src属性；Image对象的src属性 可以跨域，但是又只能get参数<br>
<br>
所以要用js跨域只有两种方法：<br>
1. <strong>本域代理</strong>：ajax向本域下某个文件post参数，这个文件再和别的域下的文件进行交互<br>
2. <strong>iframe</strong>：js动态生成一个隐藏的iframe，在这个iframe中动态插入一个form，用js向另一个域下的文件提交这个form，接收提交的文件，输出js，js中使用parent来操作当前页面的dom对象<br>
<br>
最近做一个投票系统，有一个题库，可以在别的系统调用这个题库，并把这些题展示给用户，题型包括单选，多选和问答。在别的系统向投票系统提交投票结果的时候，因为两个系统可能不在同一个域下，所以要支持跨域提交，又因为问答题的答案可能很长，超过url长度限制，所以要用post方式。为了让这种跨域的post提交在用户不知觉的情况下进行，需要使用js来实现。js跨域post提交，有本域代理和iframe两种方法。本域代理的方法实现起来比较复杂，而且如果展示投票接口的系统变化的时候，需要在新的系统中编写代理。iframe的方法有很好的复用性。但是post参数的构造过程完全可见，怕黑客循环提交进行攻击。 <a href="http://hi.baidu.com/cultnoble/blog/item/c0ca61a1ed45b1824610644c.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/%C8%D5%BC%C7">日记</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/c0ca61a1ed45b1824610644c.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-19  21:05</pubDate>
        <category><![CDATA[日记]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/c0ca61a1ed45b1824610644c.html</guid>
</item>

<item>
        <title><![CDATA[memcache 方法小结（转）]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/24e01d5c76064a4afaf2c076.html]]></link>
        <description><![CDATA[
		
		Memcache函数库是在PECL(PHP Extension Community Library)中，主要作用是搭建大容量的内存数据的临时存放区域，在分布式的时候作用体现的非常明显，否则不建议使用。<br>
<br>
在《phper》电子杂志的第一期中，有黑夜路人写的关于Memcache的详细安装教程，本人在ubuntu上安装完运行的时候报错：<br>
/usr/local/memcached/bin/memcached: error while loading shared libraries: libevent-1.4.so.2: cannot open shared object file: No such file or directory<br>
<br>
按照：《libeven、memcached、libmemcache安装》中的方法，使用：<br>
<br>
sudo ln -s /usr/local/lib/libevent-1.4.so.2 /usr/lib/libevent-1.4.so.2<br>
可以修正这个BUG<br>
<br>
通过新得立安装php的memcached模块，注销/etc/php5/conf.d/memcached.ini里面的&ldquo;;&rdquo;，重启apache，调用phpinfo()出现memcached的信息<br>
<br>
执行：<br>
<br>
/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid<br>
memcached的服务正式启动<br>
<br>
Memcache::add &mdash; 添加一个值，如果已经存在，则返回false<br>
Memcache::addServer &mdash; 添加一个可供使用的服务器地址<br>
Memcache::close &mdash; 关闭一个Memcache对象<br>
Memcache::connect &mdash; 创建一个Memcache对象<br>
memcache_debug &mdash; 控制调试功能<br>
Memcache::decrement &mdash; 对保存的某个key中的值进行减法操作<br>
Memcache::delete &mdash; 删除一个key值<br>
Memcache::flush &mdash; 清除所有缓存的数据<br>
Memcache::get &mdash; 获取一个key值<br>
Memcache::getExtendedStats &mdash; 获取进程池中所有进程的运行系统统计<br>
Memcache::getServerStatus &mdash; 获取运行服务器的参数<br>
Memcache::getStats &mdash; 返回服务器的一些运行统计信息<br>
Memcache::getVersion &mdash; 返回运行的Memcache的版本信息<br>
Memcache::increment &mdash; 对保存的某个key中的值进行加法操作<br>
Memcache::pconnect &mdash; 创建一个Memcache的持久连接对象<br>
Memcache::replace &mdash; R对一个已有的key进行覆写操作<br>
Memcache::set &mdash; 添加一个值，如果已经存在，则覆写<br>
Memcache::setCompressThreshold &mdash; 对大于某一大小的数据进行压缩<br>
Memcache::setServerParams &mdash; 在运行时修改服务器的参数<br>
<br>
建议用面向对象的方式来测试这个库：<br>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.daxi8.cn/#">view plain</a><a href="http://blog.daxi8.cn/#">print</a><a href="http://blog.daxi8.cn/#">?</a></div>
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span> = </span><span class="keyword">new</span><span> Memcache;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;connect(</span><span class="string">'localhost'</span><span>, 11211) </span><span class="keyword">or</span><span> </span><span class="keyword">die</span><span> (</span><span class="string">&quot;Could not connect&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$version</span><span> = </span><span class="vars">$memcache</span><span>-&gt;getVersion();&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="func">echo</span><span> </span><span class="string">&quot;Server's version: &quot;</span><span>.</span><span class="vars">$version</span><span>.</span><span class="string">&quot;</span> </span></li>
    <li><span><span class="string">\n&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
&lt;?php $memcache = new Memcache; $memcache-&gt;connect('localhost', 11211) or die (&quot;Could not connect&quot;); $version = $memcache-&gt;getVersion(); echo &quot;Server's version: &quot;.$version.&quot; \n&quot;; ?&gt; <br>
Memcache::getVersion方法的作用是返回运行的Memcache的版本信息。<br>
<br>
Memcache::getStats 方法的作用是返回服务器的一些运行统计信息。Memcache::getStats方法有三个参数，第一个参数表示要求返回的类型：reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置为&ldquo;cachedump&rdquo;时使用的。Memcache::getExtendedStats方法的 作用是获取进程池中所有进程的运行系统统计。<br>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.daxi8.cn/#">view plain</a><a href="http://blog.daxi8.cn/#">print</a><a href="http://blog.daxi8.cn/#">?</a></div>
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span> = </span><span class="keyword">new</span><span> Memcache;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;connect(</span><span class="string">'localhost'</span><span>, 11211) </span><span class="keyword">or</span><span> </span><span class="keyword">die</span><span> (</span><span class="string">&quot;Could not connect&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span>print_r(<span class="vars">$memcache</span><span>-&gt;getStats());&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">/**</span> </span></li>
    <li><span><span class="comment"> * Array</span> </span></li>
    <li class="alt"><span><span class="comment"> * (</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [pid] =&gt; 8052</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [uptime] =&gt; 9205</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [time] =&gt; 1205898428</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [version] =&gt; 1.2.5</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [pointer_size] =&gt; 32</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [rusage_user] =&gt; 0.008000</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [rusage_system] =&gt; 0.000000</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [curr_items] =&gt; 1</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [total_items] =&gt; 17</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [bytes] =&gt; 57</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [curr_connections] =&gt; 2</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [total_connections] =&gt; 15</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [connection_structures] =&gt; 3</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [cmd_get] =&gt; 9</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [cmd_set] =&gt; 23</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [get_hits] =&gt; 5</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [get_misses] =&gt; 4</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [evictions] =&gt; 0</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [bytes_read] =&gt; 671</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [bytes_written] =&gt; 850</span> </span></li>
    <li><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [limit_maxbytes] =&gt; 10485760</span> </span></li>
    <li class="alt"><span><span class="comment"> *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  [threads] =&gt; 1</span> </span></li>
    <li><span><span class="comment"> * )</span> </span></li>
    <li class="alt"><span><span class="comment"> */</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
&lt;?php $memcache = new Memcache; $memcache-&gt;connect('localhost', 11211) or die (&quot;Could not connect&quot;); print_r($memcache-&gt;getStats()); /** * Array * ( *&nbsp;&nbsp;&nbsp;&nbsp;  [pid] =&gt; 8052 *&nbsp;&nbsp;&nbsp;&nbsp;  [uptime] =&gt; 9205 *&nbsp;&nbsp;&nbsp;&nbsp;  [time] =&gt; 1205898428 *&nbsp;&nbsp;&nbsp;&nbsp;  [version] =&gt; 1.2.5 *&nbsp;&nbsp;&nbsp;&nbsp;  [pointer_size] =&gt; 32 *&nbsp;&nbsp;&nbsp;&nbsp;  [rusage_user] =&gt; 0.008000 *&nbsp;&nbsp;&nbsp;&nbsp;  [rusage_system] =&gt; 0.000000 *&nbsp;&nbsp;&nbsp;&nbsp;  [curr_items] =&gt; 1 *&nbsp;&nbsp;&nbsp;&nbsp;  [total_items] =&gt; 17 *&nbsp;&nbsp;&nbsp;&nbsp;  [bytes] =&gt; 57 *&nbsp;&nbsp;&nbsp;&nbsp;  [curr_connections] =&gt; 2 *&nbsp;&nbsp;&nbsp;&nbsp;  [total_connections] =&gt; 15 *&nbsp;&nbsp;&nbsp;&nbsp;  [connection_structures] =&gt; 3 *&nbsp;&nbsp;&nbsp;&nbsp;  [cmd_get] =&gt; 9 *&nbsp;&nbsp;&nbsp;&nbsp;  [cmd_set] =&gt; 23 *&nbsp;&nbsp;&nbsp;&nbsp;  [get_hits] =&gt; 5 *&nbsp;&nbsp;&nbsp;&nbsp;  [get_misses] =&gt; 4 *&nbsp;&nbsp;&nbsp;&nbsp;  [evictions] =&gt; 0 *&nbsp;&nbsp;&nbsp;&nbsp;  [bytes_read] =&gt; 671 *&nbsp;&nbsp;&nbsp;&nbsp;  [bytes_written] =&gt; 850 *&nbsp;&nbsp;&nbsp;&nbsp;  [limit_maxbytes] =&gt; 10485760 *&nbsp;&nbsp;&nbsp;&nbsp;  [threads] =&gt; 1 * ) */ ?&gt; <br>
Memcache::connect方法的作用是创建一个Memcache对象。Memcache::pconnect方法的作用是创建一个Memcache的持久连接对象。Memcache::close方法的作用是关闭一个Memcache对象。<br>
<br>
Memcache::set 方法的作用是添加一个值，Memcache::set方法有四个参数，第一个参数是key，第二个参数是value，第三个参数可选，表示是否压缩保存， 第四个参数可选，用来设置一个过期自动销毁的时间。Memcache::add方法的作用和Memcache::set方法类似，区别是如果 Memcache::add方法的返回值为false，表示这个key已经存在，而Memcache::set方法则会直接覆写。 Memcache::get方法的作用是获取一个key值，Memcache::get方法有一个参数，表示key。Memcache::replace 方法的作用是对一个已有的key进行覆写操作，Memcache::replace方法有四个参数，作用和Memcache::set方法的相同。 Memcache::delete方法的作用是删除一个key值，Memcache::delete方法有两个参数，第一个参数表示key，第二个参数可 选，表示删除延迟的时间。<br>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.daxi8.cn/#">view plain</a><a href="http://blog.daxi8.cn/#">print</a><a href="http://blog.daxi8.cn/#">?</a></div>
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span> = </span><span class="keyword">new</span><span> Memcache;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;connect(</span><span class="string">'localhost'</span><span>, 11211) </span><span class="keyword">or</span><span> </span><span class="keyword">die</span><span> (</span><span class="string">&quot;Could not connect&quot;</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span>-&gt;set( </span><span class="string">'name'</span><span>, </span><span class="string">'leo'</span><span>, 0, 30);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="keyword">if</span><span>(!</span><span class="vars">$memcache</span><span>-&gt;add( </span><span class="string">'name'</span><span>, </span><span class="string">'susan'</span><span>, 0, 30))&nbsp;&nbsp;</span></span></li>
    <li><span>{&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="func">echo</span><span> </span><span class="string">'susan is exist'</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>};&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;replace( </span><span class="string">'name'</span><span>, </span><span class="string">'lion'</span><span>, 0, 300);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="func">echo</span><span> </span><span class="vars">$memcache</span><span>-&gt;get( </span><span class="string">'name'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;</span><span class="func">delete</span><span>( </span><span class="string">'name'</span><span>, 5);&nbsp;&nbsp;</span></span></li>
    <li><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
&lt;?php $memcache = new Memcache; $memcache-&gt;connect('localhost', 11211) or die (&quot;Could not connect&quot;); $memcache-&gt;set( 'name', 'leo', 0, 30); if(!$memcache-&gt;add( 'name', 'susan', 0, 30)) { &nbsp;&nbsp;&nbsp;&nbsp;  echo 'susan is exist'; }; $memcache-&gt;replace( 'name', 'lion', 0, 300); echo $memcache-&gt;get( 'name'); $memcache-&gt;delete( 'name', 5); ?&gt; <br>
memcache_debug()函数的作用是控制调试功能，前提是php在编译的时候使用了&ndash;enable-debug选项，否则这个函数不会有作用。<br>
<br>
Memcache::addServer 方法的作用是添加一个可供使用的服务器地址，Memcache::addServer方法有8个参数，除了第一个参数意外，其他都是可选的，第一个参数表 示服务器的地址，第二个参数表示端口，第三个参数表示是否是一个持久连接，第四个参数表示这台服务器在所有服务器中所占的权重，第五个参数表示连接的持续 时间，第六个参数表示连接重试的间隔时间，默认为15,设置为-1表示不进行重试，第七个参数用来控制服务器的在线状态，第8个参数允许设置一个回掉函数 来处理错误信息。<br>
Memcache::setServerParams方法的作用是在运行时修改服务器的参 数，Memcache::setServerParams方法有六个参数，Memcache::addServer方法少了第三和第四个参数。 Memcache::getServerStatus方法的作用是获取运行服务器的参数，两个参数分别表示的地址和端口。<br>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.daxi8.cn/#">view plain</a><a href="http://blog.daxi8.cn/#">print</a><a href="http://blog.daxi8.cn/#">?</a></div>
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">function</span><span> _callback_memcache_failure(</span><span class="vars">$host</span><span>, </span><span class="vars">$port</span><span>) {&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;  print <span class="string">&quot;memcache '$host:$port' failed&quot;</span><span>;&nbsp;&nbsp;</span></span></li>
    <li><span>}&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span> = </span><span class="keyword">new</span><span> Memcache;&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span>-&gt;addServer(</span><span class="string">'192.168.1.116'</span><span>, 11211);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;setServerParams(</span><span class="string">'192.168.1.116'</span><span>, 11211, 1, 15, true, </span><span class="string">'_callback_memcache_failure'</span><span>);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="func">echo</span><span> </span><span class="vars">$memcache</span><span>-&gt;getServerStatus(</span><span class="string">'192.168.1.116'</span><span>, 11211);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
&lt;?php function _callback_memcache_failure($host, $port) { &nbsp;&nbsp;&nbsp;&nbsp;  print &quot;memcache '$host:$port' failed&quot;; } $memcache = new Memcache; $memcache-&gt;addServer('192.168.1.116', 11211); $memcache-&gt;setServerParams('192.168.1.116', 11211, 1, 15, true, '_callback_memcache_failure'); echo $memcache-&gt;getServerStatus('192.168.1.116', 11211); ?&gt; <br>
Memcache::flush方法的作用是清除所有缓存的数据，但是不会削去使用的内存空间。<br>
<br>
Memcache::increment方法的作用是对保存的某个key中的值进行加法操作，Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作。<br>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.daxi8.cn/#">view plain</a><a href="http://blog.daxi8.cn/#">print</a><a href="http://blog.daxi8.cn/#">?</a></div>
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span> = </span><span class="keyword">new</span><span> Memcache;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;connect(</span><span class="string">'localhost'</span><span>, 11211);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span>-&gt;set(</span><span class="string">'test_item'</span><span>, 8);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;increment(</span><span class="string">'test_item'</span><span>, 4);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="func">echo</span><span> </span><span class="vars">$memcache</span><span>-&gt;decrement(</span><span class="string">'test_item'</span><span>, 7);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">// 显示 5</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
&lt;?php $memcache = new Memcache; $memcache-&gt;connect('localhost', 11211); $memcache-&gt;set('test_item', 8); $memcache-&gt;increment('test_item', 4); echo $memcache-&gt;decrement('test_item', 7); // 显示 5 ?&gt; <br>
setCompressThreshold方法的作用是对大于某一大小的数据进行压缩。setCompressThreshold方法有两个参数，第一个参数表示处理数据大小的临界点，第二个参数表示压缩的比例，默认为0.2。<br>
<div class="dp-highlighter">
<div class="bar">
<div class="tools"><a href="http://blog.daxi8.cn/#">view plain</a><a href="http://blog.daxi8.cn/#">print</a><a href="http://blog.daxi8.cn/#">?</a></div>
</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>&lt;?php&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span> = </span><span class="keyword">new</span><span> Memcache;&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="vars">$memcache</span><span>-&gt;addServer(</span><span class="string">'memcache_host'</span><span>, 11211);&nbsp;&nbsp;</span></span></li>
    <li><span><span class="vars">$memcache</span><span>-&gt;setCompressThreshold(20000, 0.2);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>?&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
&lt;?php $memcache = new Memcache; $memcache-&gt;addServer('memcache_host', 11211); $memcache-&gt;setCompressThreshold(20000, 0.2); ?&gt; <a href="http://hi.baidu.com/cultnoble/blog/item/24e01d5c76064a4afaf2c076.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/Php">Php</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/24e01d5c76064a4afaf2c076.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-22  15:58</pubDate>
        <category><![CDATA[Php]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/24e01d5c76064a4afaf2c076.html</guid>
</item>

<item>
        <title><![CDATA[svn 使用方法]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/d20418fd60c5dc4dd7887dfd.html]]></link>
        <description><![CDATA[
		
		http://windows.chinaitlab.com/accessing/713621.html<br>
<br>
http://blog.csdn.net/shaily/archive/2008/06/20/2568398.aspx 
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/%B4%CE%BC%B6%B2%D6%BF%E2">次级仓库</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/d20418fd60c5dc4dd7887dfd.html#comment">查看评论</a>]]></description>
        <pubDate>2009-04-02  00:42</pubDate>
        <category><![CDATA[次级仓库]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/d20418fd60c5dc4dd7887dfd.html</guid>
</item>

<item>
        <title><![CDATA[ajax异步调用的同步]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/1d1d4a2305745643ac34de18.html]]></link>
        <description><![CDATA[
		
		当<strong>进行ajax异步调用</strong>的时候，当前程序流和每一个ajax调用都是异步执行了，对于共享变量（同一个变量）的操作，要注意同步和互斥的问题。<br>
比如<br>
var  a = 1；<br>
ajax调用把 a 赋值成2；<br>
alert(a)；<br>
这时候打印出的 a 很可能还是1。因为执行alert(a) 的时候ajax调用不一定已经给 a 赋值。<br>
我们可以使用ajax的回调函数解决这个问题，ajax的<strong>回调函数</strong>是在ajax的调用完成的时候执行的，假设回调函数是callback：<br>
var a = 1；<br>
ajax调用把 a 赋值成2；<br>
function callback() { alert(a); }<br>
<br>
当需要<strong>循环调用同一个ajax方法</strong>的时候，最好用递归的方法，在一个ajax调用完成的回调函数中再去调用下一个ajax方法。<br>
<br>
需要<strong>调用多个不同的ajax方法</strong>的时候，要分清楚各个方法的调用和完成时间，要注意共享变量，利用回调函数，满足自己的顺序要求。<br> <a href="http://hi.baidu.com/cultnoble/blog/item/1d1d4a2305745643ac34de18.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/Javascript">Javascript</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/1d1d4a2305745643ac34de18.html#comment">查看评论</a>]]></description>
        <pubDate>2009-02-23  21:53</pubDate>
        <category><![CDATA[Javascript]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/1d1d4a2305745643ac34de18.html</guid>
</item>

<item>
        <title><![CDATA[lvs和nginx比较（转）]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/e9d35d184a4a75b34bedbc67.html]]></link>
        <description><![CDATA[
		
		<a href=":;" target="_self"><u><strong>lvs</strong></u></a>和<a href=":;" target="_self"><u><strong>nginx</strong></u></a>都可以用作多机负载的方案，它们各有优缺，在生产环境中需要好好分析实际情况并加以利用。<span style="display: none;">BSD爱好者乐园 F r#l G f o O</span><br>
<span style="display: none;">BSD爱好者乐园)k%d,O d8i Q!s</span><br>
首先提醒，做技术切不可人云亦云，我云即你云；同时也不可太趋向保守，过于相信旧有方式而等别人来帮你做垫被测试。把所有即时听说到的好东西加以钻研，从而提高自己对技术的认知和水平，乃是一个好习惯。<span style="display: none;">BSD爱好者乐园 ` B5U ` \ C k</span><br>
<span style="display: none;">BSD爱好者乐园,\ Z B:k2{#r1F q</span><br>
下面来分析一下两者：<br>
<span style="display: none;">2U;Q R,w K | C</span><span style="display: none;">BSD爱好者乐园 e7A f \ H u-j6? _/H</span><br>
一、lvs的优势：<span style="display: none;">BSD爱好者乐园 Q U K'k o T }</span><br>
<br>
<span style="display: none;"> b l Q V m%W m#^</span>1、 抗负载能力强，因为lvs工作方式的逻辑是非常之简单，而且工作在网络4层仅做请求分发之用，没有流量，所以在效率上基本不需要太过考虑。在我手里的 lvs，仅仅出过一次问题：在并发最高的一小段时间内均衡器出现丢包现象，据分析为网络问题，即网卡或linux2.4内核的承载能力已到上限，<a href=":;" target="_self"><u><strong>内存</strong></u></a>和cpu方面基本无消耗。<span style="display: none;">BSD爱好者乐园 v'r j$u }</span><br>
<span style="display: none;">BSD爱好者乐园 K x S T e h,m ~</span><br>
2、配置性低，这通常是一大劣势，但同时也是一大优势，因为没有太多可配置的选项，所以除了增减服务器，并不需要经常去触碰它，大大减少了人为出错的几率。<br>
<span style="display: none;">2| A9b'|5~,Z9w7[%o ]+w</span><span style="display: none;">BSD爱好者乐园1{2G#z R d/h</span><br>
3、工作稳定，因为其本身抗负载能力很强，所以稳定性高也是顺理成章，另外各种lvs都有完整的双机热备方案，所以一点不用担心均衡器本身会出什么问题，节点出现故障的话，lvs会自动判别，所以系统整体是非常稳定的。<br>
<span style="display: none;"> n5M d&quot;f ] t G a</span><br>
<span style="display: none;">9z/M z%r p9Q k</span>4、无流量，上面已经有所提及了。lvs仅仅分发请求，而流量并不从它本身出去，所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。<span style="display: none;">BSD爱好者乐园 k _ q @ [ V</span><br>
<br>
<span style="display: none;">5T1A,L n#p-r u l,@ e B</span>5、基本上能支持所有应用，因为lvs工作在4层，所以它可以对几乎所有应用做<a href=":;" target="_self"><u><strong>负载均衡</strong></u></a>，包括http、数据库、聊天室等等。<span style="display: none;">BSD爱好者乐园 [-h H#A ^</span><br>
<span style="display: none;">BSD爱好者乐园 | \ G V Q | q&quot;_</span><br>
另：lvs也不是完全能判别节点故障的，譬如在wlc分配方式下，集群里有一个节点没有配置VIP，会使整个集群不能使用，这时使用wrr分配方式则会丢掉一台机。目前这个问题还在进一步测试中。所以，用lvs也得多多当心为妙。<br>
<span style="display: none;">8j M2Z c0e Y1].N</span><span style="display: none;">BSD爱好者乐园 ~3t,W)D n&quot;m&amp;k</span><br>
二、nginx和lvs作对比的结果<span style="display: none;">BSD爱好者乐园 O L E,^(z u</span><br>
<br>
<span style="display: none;">0Z5w k ^#Z0K!N</span>1、 nginx工作在网络的7层，所以它可以针对http应用本身来做分流策略，比如针对域名、目录结构等，相比之下lvs并不具备这样的功能，所以 nginx单凭这点可利用的场合就远多于lvs了；但nginx有用的这些功能使其可调整度要高于lvs，所以经常要去触碰触碰，由lvs的第2条优点 看，触碰多了，人为出问题的几率也就会大。<br>
<span style="display: none;">$S,Y+o W H _</span><br>
<span style="display: none;"> | n W _ D P6B</span>2、nginx对网络的依赖较小，理论上只要ping得通，网页访问正常，nginx就能连得通，nginx同时还能区分内外网，如果是同时拥有内外网的节点，就相当于单机拥有了<a href=":;" target="_self"><u><strong>备份</strong></u></a>线 路；lvs就比较依赖于网络环境，目前来看服务器在同一网段内并且lvs使用direct方式分流，效果较能得到保证。另外注意，lvs需要向托管商至少 申请多一个ip来做Visual IP，貌似是不能用本身的IP来做VIP的。要做好LVS管理员，确实得跟进学习很多有关网络通信方面的知识，就不再是一个HTTP那么简单了。<span style="display: none;">BSD爱好者乐园 X8a4P c'L8v8?</span><br>
<br>
<span style="display: none;"> T$p(| { i y m \</span>3、nginx安装和配置比较简单，测试起来也很方便，因为它基本能把错误用<a href=":;" target="_self"><u><strong>日志</strong></u></a>打印出来。lvs的<a href=":;" target="_self"><u><strong>安装</strong></u></a>和配置、测试就要花比较长的时间了，因为同上所述，lvs对网络依赖比较大，很多时候不能配置成功都是因为网络问题而不是配置问题，出了问题要解决也相应的会麻烦得多。<br>
<span style="display: none;">5Y b j,f T J G2{ E8S9} {</span><br>
<span style="display: none;">!Y C&quot;F C:? l @ z ^(E</span>4、nginx也同样能承受很高负载且稳定，但负载度和稳定度差lvs还有几个等级：nginx处理所有流量所以受限于机器IO和配置；本身的bug也还是难以避免的；nginx没有现成的双机热备方案，所以跑在单机上还是风险较大，单机上的事情全都很难说。<span style="display: none;">BSD爱好者乐园 X B g&amp;h J { A V7~</span><br>
<br>
<span style="display: none;"> G l;C y4w</span>5、nginx可以检测到服务器内部的故障，比如根据服务器处理网页返回的状态码、超时等等，并且会把返回错误的请求重新提交到另一个节点。目前lvs中ldirectd也能支持针对服务器内部的情况来<a href=":;" target="_self"><u><strong>监控</strong></u></a>，但lvs的原理使其不能重发请求。重发请求这点，譬如用户正在上传一个<a href=":;" target="_self"><u><strong>文件</strong></u></a>，而处理该上传的节点刚好在上传过程中出现故障，nginx会把上传切到另一台服务器重新处理，而lvs就直接断掉了，如果是上传一个很大的文件或者很重要的文件的话，用户可能会因此而恼火。<br>
<span style="display: none;">5A P }%c/x)A</span><br>
<span style="display: none;">'x A4U V H4\</span>6、nginx对请求的异步处理可以帮助节点服务器减轻负载，假如使用<a href=":;" target="_self"><u><strong>apache</strong></u></a>直接对外服务，那么出现很多的窄带链接时apache服务器将会占用大量内存而不能释放，使用多一个nginx做apache代理的话，这些窄带链接会被nginx挡住，apache上就不会堆积过多的请求，这样就减少了相当多的内存占用。这点使用<a href=":;" target="_self"><u><strong>squid</strong></u></a>也有相同的作用，即使squid本身配置为不缓存，对apache还是有很大帮助的。lvs没有这些功能，也就无法能比较。<br>
<span style="display: none;">.v y&quot;p y n U h-W</span><br>
<span style="display: none;">9b q#y u k ~#Z;| @ j#[ b</span>7、nginx能支持http和email（email的功能估计比较少人用），lvs所支持的应用在这点上会比nginx更多。<br>
<span style="display: none;"> ~ \$P f-L</span><br>
<span style="display: none;"> s G ?.H3t0V,\ H/A</span>在使用上，一般最前端所采取的策略应是lvs，也就是DNS的指向应为lvs均衡器，lvs的优点令它非常适合做这个任务。<span style="display: none;">BSD爱好者乐园 v | v l P Z</span><br>
<br>
<span style="display: none;">!Z6m \6y&quot;g p Q5t/R L</span>重要的ip地址，最好交由lvs托管，比如数据库的ip、webservice服务器的ip等等，这些ip地址随着时间推移，使用面会越来越大，如果更换ip则故障会接踵而至。所以将这些重要ip交给lvs托管是最为稳妥的，这样做的唯一缺点是需要的VIP数量会比较多。<br>
<span style="display: none;"> o @ v&amp;C c</span><span style="display: none;">BSD爱好者乐园%c7_ Z-B Z:o;U M</span><br>
nginx可作为lvs节点机器使用，一是可以利用nginx的功能，二是可以利用nginx的性能。当然这一层面也可以直接使用squid，squid的功能方面就比nginx弱不少了，性能上也有所逊色于nginx。<br>
<span style="display: none;">:Y+T&amp;v y M T ?*l</span><span style="display: none;">BSD爱好者乐园7s3G8k Z R Y K H&quot;|</span><br>
nginx 也可作为中层代理使用，这一层面nginx基本上无对手，唯一可以撼动nginx的就只有lighttpd了，不过lighttpd目前还没有能做到 nginx完全的功能，配置也不那么清晰易读。另外，中层代理的IP也是重要的，所以中层代理也拥有一个VIP和lvs是最完美的方案了。<span style="display: none;">BSD爱好者乐园 Y&quot;^1b C9E0m:~</span><br>
<span style="display: none;">BSD爱好者乐园._+@9t2N y D!w</span><br>
nginx也可作为网页静态服务器，不过超出了本文讨论的范畴，简单提一下。<span style="display: none;">BSD爱好者乐园 f8c w O J1{ Z#~0B v</span><br>
<span style="display: none;">BSD爱好者乐园 ~ x'\ n W e%h</span><br>
具体的应用还得具体分析，如果是比较小的网站（日PV&lt;1000万），用nginx就完全可以了，如果机器也不少，可以用DNS轮询，lvs所耗费的机器还是比较多的；大型网站或者重要的服务，机器不发愁的时候，要多多考虑利用lvs。 <a href="http://hi.baidu.com/cultnoble/blog/item/e9d35d184a4a75b34bedbc67.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/Linux">Linux</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/e9d35d184a4a75b34bedbc67.html#comment">查看评论</a>]]></description>
        <pubDate>2009-01-20  18:04</pubDate>
        <category><![CDATA[Linux]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/e9d35d184a4a75b34bedbc67.html</guid>
</item>

<item>
        <title><![CDATA[urf8等字符编码中，汉字由几个字符表示]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/a8cb91905c0d0a8aa977a485.html]]></link>
        <description><![CDATA[
		
		1. UTF-8 汉字用3个字符表示<br>
UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符（Unicode 范围由 U+0000 至 U+007F）只需一个字节，带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及马尔代夫语（Unicode 范围由 U+0080 至 U+07FF）需要二个字节，其他基本多文种平面（BMP）中的字符（CJK属于此类-Qieqie注）使用<strong><span style="color: red;">三个字节</span></strong>，其他 Unicode 辅助平面的字符使用四字节编码。<br>
例子：数据库字段长度为char(20)，采用urf8编码，那么只能存6个汉字。所以在表单提交时要做如下验证：<br>
var  str = &quot;这是表单提交的数据&quot;;  str.repalce(/[^\x00-\xff]/g,'***').length &gt; 20  则报错<br> <a href="http://hi.baidu.com/cultnoble/blog/item/a8cb91905c0d0a8aa977a485.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/Mysql">Mysql</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/a8cb91905c0d0a8aa977a485.html#comment">查看评论</a>]]></description>
        <pubDate>2008-12-25  11:13</pubDate>
        <category><![CDATA[Mysql]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/a8cb91905c0d0a8aa977a485.html</guid>
</item>

<item>
        <title><![CDATA[svn 解决冲突方法]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/443169fbaad501254e4aeaf2.html]]></link>
        <description><![CDATA[
		
		<div class="cnt" >
<p style="margin-right: 0px;" dir="ltr">转自：<a href="http://www.blogjava.net/shrode/articles/85598.html">http://www.blogjava.net/shrode/articles/85598.html</a></p>
<p style="margin-right: 0px;" dir="ltr">本人使用SVN的时间不是很长，在使用之前也仅仅是粗浅的了解过这个 软件。从今年的8月份开始，由于一个项目使用Eclipse 3.1，跨地域的开发，为了适应不同的开发人员处于不同的地理位置，因此我们使用SVN作为团队开发的管理工具。开始使用时，仅仅是边学边用，遇到不懂的 地方再去查找资料。今天由于有点时间，先把合并过程遇到的冲突问题详细了解一下。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   可以使用svn status -u命令来查看一下某个问题是否会有冲突发生。在使用svn update 的时候，会出现如下一些信息：<br>
$ svn update<br>
U  INSTALL<br>
G  README<br>
C  bar.c<br>
Updated to revision 46.<br>
<br>
那么，U 开头的信息提示你，这个文件在你本地没有修改过，文件已经根据版本库的新版本更新了。G 开头的信息提示你，这个文件在你本地已经修改过，但是和版本库中对应的版本并没有冲突的地方，svn已经合并更新了。而C 开头的信息提示你，这个文件有点麻烦，你在本地的修改和版本库中的版本修改的地方重叠了，也就是说，你修改了某一行，你的同事也修改了同一行。这个就需要 你自己手工去解决了。当冲突发生时，要注意到有三件事情可以帮助你解决问题。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  a.Subversion会给这个文件作出c标记。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  b.如果Subversion认为这个文件时可以合并的，它会一个冲突标记（特殊的横线来分开冲突的代码块）<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  c.对每一个冲突的文件，Subversion放置三个额外的未版本化文件到你的工作拷贝。<br>
<br>
filename.mine<br>
&nbsp;&nbsp;&nbsp;&nbsp;   你更新前的文件，没有冲突标志，只是你最新更改的内容。（如果这个文件不可以合并，.mine文件不会创建，因为它和工作文件相同。）<br>
<br>
filename.rOLDREV<br>
&nbsp;&nbsp;&nbsp;&nbsp;   这个是你做更新操作以前的BASE版本，就是你在上次更新之后未作更改的版本。<br>
<br>
filename.rNEWREV<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  这是Subversion从服务器刚刚收到的版本。这个版本就是版本库的HEAD版本。<br>
<br>
<br>
例如，如果sally修改了一个文件sandwich.txt, 而harry也刚刚修改了这个文件的相同位置并提交到服务器。那么sally在做这个文件的update操作的时候会得到三个额外的文件 sandwich.txt.mine、sandwich.txt.r1、sandwich.txt.r2。并且在提交的时候会遭到服务器的拒绝，因为这个 文件的冲突问题还没有得到解决。要解决这个冲突，可以选择：<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  a. 手工合并冲突文件（检查和修改文件中的冲突标志）。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  b.用一个临时文件（三个中的一个）覆盖你的工作文件。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  c.运行svn revert &lt;filename&gt;来放弃所有的修改。<br>
<br>
一旦解决了你的冲突，需要通过命令svn resolved让subversion知道并删除三个临时文件。这时才可以提交。<br>
<br>
下面再说说手工合并冲突。开始的时候让人觉得害怕，但做一段时间之后，就觉得不那么烦人了。<br>
<br>
看看如下文本：<br>
Mayonnaise<br>
Lettuce<br>
Tomato<br>
Provolone<br>
&lt;&lt;&lt;&lt;&lt;&lt;&lt; .mine<br>
Salami<br>
Mortadella<br>
Prosciutto<br>
=======<br>
Sauerkraut<br>
Grilled Chicken<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r2<br>
Creole Mustard<br>
<br>
<br>
一连串的大于、小于、等于号是冲突标记，这些数据得全部删除才可以提交。其中,<br>
&nbsp;&nbsp;&nbsp;  &lt;&lt;&lt;&lt;&lt;&lt;&lt; .mine<br>
Salami<br>
Mortadella<br>
Prosciutto<br>
=======<br>
是你在冲突区里面做的修改。<br>
<br>
Sauerkraut<br>
Grilled Chicken<br>
&gt;&gt;&gt;&gt;&gt;&gt;&gt; .r2<br>
是别人在冲突区做的修改。<br>
<br>
在冲突区中，或许你需要和你的同事沟通来安排冲突区的文本内容，如果是程序代码，你需要和同事商量一下，中间的这段代码到底应该是什么样子的。<br>
<br>
所有冲突区得到合理的解决之后，你就可以提交你的文件了。</p>
</div> <a href="http://hi.baidu.com/cultnoble/blog/item/443169fbaad501254e4aeaf2.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/%B4%CE%BC%B6%B2%D6%BF%E2">次级仓库</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/443169fbaad501254e4aeaf2.html#comment">查看评论</a>]]></description>
        <pubDate>2008-12-19  12:09</pubDate>
        <category><![CDATA[次级仓库]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/443169fbaad501254e4aeaf2.html</guid>
</item>

<item>
        <title><![CDATA[js函数实现urlencode和urldecode(转)]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/5b27f5738bdc9c1b8701b0be.html]]></link>
        <description><![CDATA[
		
		<dl><dd class="cont"><span >
<p>用的浏览器内部转换器实现转换，方法是动态创建一个容器标签元素，如DIV，将要转换的字符串设置为这个元素的innerText，然后返回这个元素的innerHTML，即得到经过HTML编码转换的字符串。</p>
<p>function HTMLEncode ( input )<br>
{<br>
var converter = document.createElement(&quot;DIV&quot;);<br>
converter.innerText = input;<br>
var output = converter.innerHTML;<br>
converter = null;<br>
return output;<br>
}</p>
<p>当然，还可以用相同的方法实现对字符串的HTMLDecode解码，但有个问题就是紧跟在字符&quot;&lt;&quot;后面的非空字符将连同字符&quot;&lt;&quot;同 时显示不出来。当然，对字符串作相应处理是可以解决这个问题的，比如在字符&quot;&lt;&quot;后面加个空格，解码后再去掉就行，这是后话。毕竟，要使用 HTMLDecode方法解码，自然是字符串已经经过HTMLEncode方法编码了，而经过HTMLEncode编码后的字符串，是不可能有字 符&quot;&lt;&quot;存在的。</p>
<p>function HTMLDecode ( input )<br>
{<br>
var converter = document.createElement(&quot;DIV&quot;);<br>
converter.innerHTML = input;<br>
var output = converter.innerText;<br>
converter = null;<br>
return output;<br>
}</p>
</span></dd></dl> <a href="http://hi.baidu.com/cultnoble/blog/item/5b27f5738bdc9c1b8701b0be.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/%B4%CE%BC%B6%B2%D6%BF%E2">次级仓库</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/5b27f5738bdc9c1b8701b0be.html#comment">查看评论</a>]]></description>
        <pubDate>2008-11-20  11:21</pubDate>
        <category><![CDATA[次级仓库]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/5b27f5738bdc9c1b8701b0be.html</guid>
</item>

<item>
        <title><![CDATA[在访问drupal的时候，到底做了什么  and php 架构]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/2551d83b0175d3ed14cecbf6.html]]></link>
        <description><![CDATA[
		
		当一个url进入drupal的时候，首先执行的是根目录下的index.php，这个文件完成下面三个工作：<br>
1  加载配置文件和需要的函数文件<br>
2  menu_execute_active_handler（），根据url指明的modul，到数据表menu_router中查找对应记录，调用查询出的page_callback函数,产生页面输出信息<br>
3  theme（），用第二步得到的信息，结合主题，最终得到要显示的页面主体信息<br>
<br>
现在的网站，多数都采用MVC架构。<br>
1 本来网站的资源是通过URL来访问的，最原始的情况是这样的：我们访问一个PHP脚本，i.e. example.php，这个脚本完成 处理接受数据，操作数据库，产生输出数据，构造完整的HTML输出脚本。<br>
2 现在我们不想让什么事情都在这一个脚本里面做，我们想把处理逻辑，操作数据库，和构造HTML代码相分离。这时候我们有了一个改进：modules 文件夹，存放example.php，完成处理逻辑和操作数据库；views文件夹，存放example.php，完成构造HTML代码（zen_cart就采用的是这种架构）。<br>
3 单单少数的脚本，似乎2已经完成了MC 和 V的拆分。但是一个网站往往有很多的脚本，他们完成几个主要的功能，i.e.  search , user manage or others。现在想把每个功能的代码放在一个目录下，这是对网站的水平拆分，而2是对网站的垂直拆分。这样交叉在一起就有了新的结果---先垂直再水平：modules/search/,存放搜索相关的MC代码，modules/user/,存放用户相关的MC代码，views/search/，存放搜索相关的V代码，modules/user/,存放用户相关的V代码。或者---先水平再垂直：search/modules/,存放搜索相关的MC代码，user/moldules/,存放用户相关的MC代码，search/views/,存放搜索相关的V代码，user/views/,存放用户相关的V代码。<br>
4 做的好的，可以在MC里面再对MC进行垂直拆分：modules/search/mananger.php完成处理逻辑，modules/search/database.php完成数据库操作。(zend 应该就完整了这个功能)<br>
以前的URL只需要简单的找到文件就可以了，所以URL里面真正有用的信息就是带着文件路径的文件名字。<br>
引进MVC之后，我们必须要对URL进行解析，以得到，MC的存放路径，和V的存放路径。所以现在基本上只要引进了MVC的网站架构，都会对URL进行单独的解析，以确定路由。 <a href="http://hi.baidu.com/cultnoble/blog/item/2551d83b0175d3ed14cecbf6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/Php">Php</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/2551d83b0175d3ed14cecbf6.html#comment">查看评论</a>]]></description>
        <pubDate>2008-11-10  18:36</pubDate>
        <category><![CDATA[Php]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/2551d83b0175d3ed14cecbf6.html</guid>
</item>

<item>
        <title><![CDATA[vim 技巧2]]></title>
        <link><![CDATA[http://hi.baidu.com/cultnoble/blog/item/a7378966c974eb22aa184c57.html]]></link>
        <description><![CDATA[
		
		<div class="tit">两篇很牛的vim使用技巧（1）</div>
<div class="date">2007-08-15 16:42</div>
<div class="cnt">
<div>读本文之前请注意：</div>
<div>1. 本文的目标是提供一些vim的使用技巧，利用这些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用，但是现在基本上都是用vim了。</div>
<div>2. 本文是整理和总结使用技巧，而非讲解vim入门，因此不会涉及最基本的使用，例如如何上移或下移光标，对此类操作请参阅任何一本vim或者vi教程。</div>
<div>3. 本文阅读对象是了解了vim的基本操作，而希望高效地利用vim进行工作的人。熟练使用vim的人自然不必细读，如果能留下您的宝贵意见，本人将感激不尽。</div>
<div>4. 本文由本人搜集整理，转载请注明出处</div>
<div> </div>
<div>本文一般情况下用&lt;C-字母&gt;（里边的字母一般大小写无所谓,除非特别注明）表示按住ctrl同时按下相关字母，命令前加一个i表示在插入模式下用这个命令</div>
<div> </div>
<div><font color="#ff0000"><strong>1. 选定文字 / 拷贝粘贴</strong></font></div>
<div> </div>
<div>v为可视模式,可以选定多行。选定多行之后，可以用yy或者dd等等进行拷贝和剪切。<br>
p 是粘贴<br>
y 和d 可以直接拷贝或者剪切选定的内容<br>
yw是拷贝一个单词<br>
如果要复制整行的最简单办法就是V,y,p 就行了<br>
v是可以选定一行任意个字符的,V是行选定的,一次一整行，然后通过向下或向上移动光标而选定多行。<br>
对于v选定的,拷贝后就是这么多,选多少就拷贝多少,而V选定的,粘贴的话会自动换到下一行<br>
&lt;C-V&gt;命令模式下,也是块选定,不过是列块选定</div>
<div> </div>
<div><font color="#ff0000"><strong>2. 折叠代码</strong></font></div>
<div> </div>
<div>可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)</div>
<div><br>
<font color="#ff0000"><strong>3. 缩进代码</strong></font></div>
<div><br>
&lt;是左缩进, &gt;是右缩进<br>
按v选定后按=就是自动格式化代码,自动缩进,内部的递归的缩进都做到了<br>
行左移&lt;&lt;，行右移&gt;&gt;，该命令用于调整源码缩进格式简便快速。</div>
<div><br>
<font color="#ff0000"><strong>4. 移动光标</strong></font></div>
<div> </div>
<div>%是从大括号的开始移动到大括号的结束位置<br>
:后边加行号就是跳到这一行<br>
&lt;C-O&gt;&nbsp;&nbsp;&nbsp;  光标返回到以前的位置。相当于光标移动的&ldquo;撤销&rdquo;<br>
&lt;C-I&gt;&nbsp;&nbsp;&nbsp;  光标返回到后来的位置。相当于光标移动的&ldquo;恢复&rdquo;</div>
<div><br>
<font color="#ff0000"><strong>5. 多文件编辑 / 缓冲区命令</strong></font></div>
<div><br>
vim下每一个打开的文件对应一个缓冲区（buffer）。<br>
多文件编辑会有两种情形，一种是在进入 vim 前所用的参数就是多个文件（这种情形称为 argument list）。另一种情形是进入 vim 后另外再开其它的文件（称为 buffer list）。不过都可以统称为buffer。</div>
<div> </div>
<div><font color="#0000ff"><strong>5.1 打开文件</strong></font></div>
<div>vi flname1 flname2… flnameN<br>
将多个文件调入缓冲，是 argument list。<br>
:e filename<br>
这是在进入 vim 后，在不离开 vim 的情形下再开其它文件，只要您要编辑的档案是在目前目录，Tab 补全键还是可以使用。是buffer list。<br>
注意：:e 或者:new 或者:split 后边可以跟目录,这样就可以在目录下慢慢找要打开的文件了</div>
<div><br>
<font color="#0000ff"><strong>5.2 缓冲区跳转</strong></font></div>
<div>:n&nbsp;&nbsp;  编辑下一个文件。<br>
:2n 编辑下二个文件。<br>
:N&nbsp;&nbsp;  编辑前一个文件。注意，这种用法只能用于 argument list 的情形。</div>
<div>:rew 回到首文件<br>
:args 查看当前编辑缓冲文件状态</div>
<div>:e# 或 Ctrl-^&nbsp;&nbsp;  编辑前一个档案，用于两文件互相编辑时相当好用。这种用法不管是 argument list 或buffer list 档案间皆可使用。 使用Ctrl－^ 命令更便捷，但如终端类型不正确该功能将无效。</div>
<div>用:ls来显示缓冲区中的文件，编号后边有#的代表是前一个文件，可以通过:e#来进入，有%a的代表是当前文件，什么也没有的可以通过:bn来进入，这里的n代表文件编号。<br>
:b文件名或编号&nbsp;&nbsp;  移至该文件。<br>
在 :ls 中就会出示各文件的编号，这个编号在未离开 vim 前是不会变的。这个指令 elvis 也是可以使用。当然 :e#编号 也是可以的，这样的用法则是所有 vi clone 都通用了。</div>
<div>在 buffers 中，减号 - 表示这个 buffer 并未载入，不过，不必担心，载入相当快速的。加号 + 表示这个 buffer 已经修改过了。</div>
<div>:bn&nbsp;&nbsp;  buffer next。这里的n代表字母n<br>
:bl&nbsp;&nbsp;  buffer last。<br>
以上两个指令 elvis 不适用。</div>
<div>如果您是使用 vim 的 GUI，那就在菜单上就会有 Buffers 这个选项，可以很容易的知道及移动各buffer 间。</div>
<div> </div>
<div><font color="#0000ff"><strong>5.3 移除缓冲区</strong></font></div>
<div>:bd(elete)&nbsp;&nbsp;  buffer 在未离开 vim 前是不会移除的，可使用这个指令移除。其实移除它干什么呢？vim是您在叫用时才会载入的，因此这些 buffers 并不是像 cache 一般要占内存的。</div>
<div><br>
<font color="#0000ff"><strong>5.4 重新编辑</strong></font></div>
<div>放弃一修改过的文件，重新编辑。<br>
(1)使用命令　:q!强行退出后再vi flname重新进入。<br>
(2)使用命令　:e!强行重编辑更便捷。这样也是会打开文件，但会放弃目前编辑文件的改变，否则如果文件已有变动，vim 预设是不让您随便离开的。:e! 后不接什么的话，代表舍弃一切修改，重新载入编辑中文件。</div>
<div> </div>
<div><font color="#0000ff"><strong>5.5 其他命令</strong></font><br>
:files 或 :buffers 或 :ls&nbsp;&nbsp;  会列出目前 buffer 中的所有文件。<br>
在 elvis 中可使用 :b 来叫出 buffers。 <br>
:f 或 Ctrl-g&nbsp;&nbsp;  显示目前编辑的文件名、是否经过修改及目前光标所在之位置。<br>
:f 文件名&nbsp;&nbsp;  改变编辑中的文件名。(file)<br>
:r 文件名&nbsp;&nbsp;  在光标所在处插入一个文件的内容。(read)<br>
:35 r 文件名&nbsp;&nbsp;  将文件插入至 35 行之后。<br>
gf&nbsp;&nbsp;  这是 vim 的特殊打开文件的方法，会打开光标所在处的 word 为名的文件，当然，这个文件要在当前目录内，否则会创建新文件。</div>
<div> </div>
<div><font color="#ff0000"><strong>6. 查找命令</strong></font></div>
<div> </div>
<div>用/查找单词后,n可以跳到下一个,N则是上一个,:nohls可以取消高亮<br>
查找时,:set ignorecase&rdquo;项让VIM忽略大小写，&ldquo;:set noignorecase&rdquo; 来关闭这项功能。</div>
<div> </div>
<div><font color="#ff0000"><strong>7. 修改文字</strong></font></div>
<div> </div>
<div>cw:删除一个单词并进入插入模式,cc:删除一行并进入插入模式。<br>
r:然后输入的字母将替换当前字母并保持命令模式,R则是不停的替换(一个挨着一个)。<br>
0到行首,$到行尾。</div>
<div> </div>
<div><font color="#ff0000"><strong>8. 函数间跳转</strong></font></div>
<div><br>
ctrl+]和ctrl+T分别是查找函数的定义和返回,好像需要ctag的支持<br>
&lt;C-W&gt;i&nbsp;&nbsp;  跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个i,最好是找自己项目下的文件,否则找库函数的话还不如man.<br>
大写 K&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  看光标所指标识符的 man 帮助页</div>
<div><br>
<font color="#ff0000"><strong>9. 窗口命令</strong></font></div>
<div><br>
&lt;C-W&gt; = ctrl+w<br>
:split 文件名 同时在一个页面显示多个文件的内容,类似多窗口,用&lt;C-W&gt;&lt;C-W&gt;切换当前窗口<br>
&lt;C-W&gt;f&nbsp;&nbsp;  切分显示光标在处的文件名，VIM 会在 path 中搜索该文件名，比如常用它打开 #include 语句中的文件<br>
&lt;C-W&gt;_&nbsp;&nbsp;  当同时打开几个文件时，按 &lt;C-W&gt;_ 使当前窗口最大化<br>
用Ctrl-W命令指定光标移动： <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Ctrl-W +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  扩大窗口<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Ctrl-W -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  缩小窗口<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Ctrl-W h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  移动到窗口左边<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Ctrl-W j&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  移动到窗口下边<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Ctrl-W k&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  移动到窗口上边<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Ctrl-W l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  移动到窗口右边<br>
等于是&lt;C-W&gt;按下后,松开键盘,再按下一个命令就可以了.<br>
如果要关闭分割窗口可以用:close，剩下只有一个窗口的话就不能关了。<br>
多窗口是split，像用e打开多个文件是将文件放在缓冲区中。</div>
<div><br>
<font color="#ff0000"><strong>10. 自动完成</strong></font></div>
<div> </div>
<div>i&lt;C-P&gt;&nbsp;&nbsp;  向上搜索，补全一个词<br>
i&lt;C-N&gt;&nbsp;&nbsp;  向下搜索，补全一个词<br>
i&lt;C-X&gt;&lt;C-L&gt; 补全一行。<br>
比如你写过一行 for (int i = 0; i &lt; 100; i++)，你想再写一模一样的一行，只要输入 for&lt;C-X&gt;&lt;C-L&gt;即可。如果补全出来的不是你想要的那一行，你可以按 &lt;C-P&gt; 或 &lt;C-N&gt; 选择上一个或下一个匹配行i&lt;C-X&gt;&lt;C-F&gt;&nbsp;&nbsp;  在文件系统中搜索，补全一个文件名<br>
如果按 &lt;C-P&gt; 或 &lt;C-N&gt; 补全一个词，在当前文件中没有找到匹配，VIM 将搜索 #include 语句中的文件，而文件的位置将在 path 中搜索。<br>
i&lt;C-Y&gt;&nbsp;&nbsp;  把上一行对应列的字符抄下来<br>
i&lt;C-E&gt;&nbsp;&nbsp;  把下一行对应列的字符抄上来,这两个都可以一直按下去,到了行尾自己会停的.</div>
<div><br>
<font color="#ff0000"><strong>11. 注释整块内容</strong></font></div>
<div> </div>
<div>注释块的方法:<br>
&lt;C-V&gt; 选定要注释掉的行&nbsp;&nbsp;  I&nbsp;&nbsp;  //&nbsp;&nbsp;  Esc <br>
I之后输入的东西就是插入到选定的行前边的,直至Esc.<br>
要去掉注释的办法:&lt;C-V&gt;选定注释符//,然后d <br>
列块选定后I是在前边都插入,A是在后边都插入<br>
&lt;C-V&gt;是按列块模式的选定,&lt;shift-V&gt;是行选定,v是普通选定</div>
<div> </div>
<div><font color="#ff0000"><strong>12. 其他命令</strong></font></div>
<div> </div>
<div>u可以撤销上一步操作, ctrl+r可以恢复<br>
i&lt;C-O&gt;命令执行一个普通模式的命令，执行完毕后回到插入模式，不用多次Esc<br>
i&lt;C-V&gt;后续字符&nbsp;&nbsp;  输入特殊的 ASCII 字符或键。<br>
.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  在光标当前位置处重复上一次操作<br>
:!命令行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  执行一条外部命令</div>
</div> <a href="http://hi.baidu.com/cultnoble/blog/item/a7378966c974eb22aa184c57.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/cultnoble/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/cultnoble/blog/item/a7378966c974eb22aa184c57.html#comment">查看评论</a>]]></description>
        <pubDate>2008-10-16  11:03</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[cultnoble]]></author>
		<guid>http://hi.baidu.com/cultnoble/blog/item/a7378966c974eb22aa184c57.html</guid>
</item>


</channel>
</rss>