<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/fangyuqiang" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/fangyuqiang" type="application/rss+xml"></fs:self_link><lastBuildDate>Mon, 14 Mar 2011 03:15:05 GMT</lastBuildDate><title>肉包子的摇滚生活</title><description>JavaScript,Java,PHP,技术博客</description><link>http://www.fangyuqiang.com</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><language>en</language><pubDate>Mon, 14 Mar 2011 03:48:39 GMT</pubDate><item><title>深入解读Supesite CMS的数据库缓存与文件缓存机制(一)</title><link>http://www.fangyuqiang.com/archives/1025</link><content:encoded>&lt;p&gt;各种系统开发中都会大量的使用缓存，用于提高程序执行速度，避免过于频繁的查询或者是过于复杂的查询的性能消耗。例如网站名称这样的设置项,每个页面都会调用到,这属于频繁查询。另外一种比如是一个连接了3,4个表的sql查询，每次查询都会造成很大的数据库消耗，这属于复杂查询。&lt;/p&gt;
&lt;h2&gt;supesite中的缓存类型&lt;/h2&gt;
&lt;p&gt;supesite中有2种缓存，一种是文件缓存，一种是数据库缓存。&lt;/p&gt;
&lt;p&gt;文件缓存的做法就是执行一次查询，然后将返回的结果生成一个.php的缓存文件,可以直接在程序中include进来，所有需要的地方都是直接include，这样就减少了数据库的查询。（当然，这里眼尖的同学会说这个增加了磁盘IO，等会下说个权衡问题）&lt;/p&gt;
&lt;p&gt;数据库缓存的做法是将查询结果，再序列化成字符串，保存到数据库，碰到相同条件的查询语句时候，直接将查询结果又从数据库中读取出来。这里有些同学不理解，既然是减少数据库查询的负担，为什么又把结果保存到数据库再读出来？ 这是我们刚刚提到的复杂查询的缓存。我们将复杂的，性能消耗很高的查询结果保存到数据库，下次碰到一样的查询语句的时候，直接取出来，消耗仅仅是一个最简单的select语句而已，可以完全避免复杂sql的性能消耗。&lt;/p&gt;
&lt;p&gt;以上是2种缓存文件实现提高性能的方式。具体缓存机制如何实现呢？&lt;/p&gt;
&lt;h2&gt;缓存机制的实现&lt;/h2&gt;
&lt;p&gt;无论文件缓存还是数据库缓存，实现都包括3个方面：&lt;/p&gt;
&lt;p&gt;生成，更新，调用。&lt;/p&gt;
&lt;h3&gt;文件缓存的生成&lt;/h3&gt;
&lt;p&gt;文件缓存较为简单。生成文件缓存，只要将数据库结果整理成字符串，然后应用php自带的fwrite()函数将字符串写入文件即可。当然也要注意生成的文件语法要正确，才可以保证include的时候不会出错。&lt;/p&gt;
&lt;p&gt;supesite中生成缓存的代码：&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;$cachefile = S_ROOT.'./data/robot/robot_'.$id. '.cache.php';
$text = '$cacheinfo = '.arrayeval($tarr). ';';
writefile($cachefile, $text, 'php');
&lt;/pre&gt;
&lt;p&gt;其中$tarr是结果集数据组,指定文件名,生成文件就行.arrayeval是supesite中转换数据为缓存内容的函数,具体如下:&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;function arrayeval($array, $level = 0) {
       if(!is_array($array)) {
             return &quot;'&quot;.$array. &quot;'&quot;;
      }
       if(is_array($array) &amp;#038;&amp;#038; function_exists('var_export')) {
             return var_export($array, true);
      }

      $space = '';
       for($i = 0; $i &lt;= $level; $i++) {
            $space .= &quot;\t&quot;;
      }
      $evaluate = &quot;Array\n$space(\n&quot; ;
      $comma = $space;
       if(is_array($array)) {
             foreach($array as $key =&gt; $val) {
                  $key = is_string($key) ? '\''.addcslashes($key, '\'\\').'\'' : $key;
                  $val = !is_array($val) &amp;#038;&amp;#038; (!preg_match(&quot;/^\-?[1-9]\d*$/&quot; , $val) || strlen($val) &gt; 12) ? '\''.addcslashes($val, '\'\\' ).'\'' : $val;
                   if(is_array($val)) {
                        $evaluate .= &quot;$comma$key =&gt; &quot; .arrayeval($val, $level + 1);
                  } else {
                        $evaluate .= &quot;$comma$key =&gt; $val&quot;;
                  }
                  $comma = &quot;,\n$space&quot; ;
            }
      }
      $evaluate .= &quot;\n$space)&quot; ;
       return $evaluate;
}
&lt;/pre&gt;
&lt;p&gt;writefile是supesite封装的一个写文件的函数。主要是保证生成的php文件不会存在语法出错的状况，并且增加一定的可读性。&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;
function writefile($filename, $writetext, $filemod='text', $openmod= 'w', $eixt=1) {
       if(!@$fp = fopen($filename, $openmod)) {
             if($eixt) {
                   exit('File :' .srealpath($filename).'Have no access to write!');
            } else {
                   return false;
            }
      } else {
            $text = '';
             if($filemod == 'php' ) {
                   $text = &quot;&lt;?php\r\n\r\nif(!defined('IN_SUPESITE')) exit('Access Denied');\r\n\r\n&quot;;
            }
            $text .= $writetext;
             if($filemod == 'php' ) {
                  $text .= &quot;\r\n\r\n?&gt;&quot;;
            }
            flock($fp, 2);
            fwrite($fp, $text);
            fclose($fp);
             return true;
      }
}
&lt;/pre&gt;
&lt;h3&gt;文件缓存的更新&lt;/h3&gt;
&lt;p&gt;文件缓存的更新，就涉及到了整个业务机制了。有两种更新需求，一种是即时更新，就是一旦结果集发生变化，缓存文件也要更新，适应于对实时性要求比较高的配置项。另一种是定时更新，每隔一段时间就检查是否到了更新的时间点，到了时间点之后，无论结果是否有变化，都执行更新。不过两种方式没有绝对的性能优劣。假设结果集更新非常频繁，那么显然定时更新的方式性能较优，但是如果结果集很久才变化一次，那么即时更新的方式更划算。&lt;/p&gt;
&lt;p&gt;即时更新的实现难度不大，只要在更新结果集的时候同时更新缓存即可。比如系统修改了设置项，那么在执行完数据库修改语句后，再加上缓存文件的更新代码即可。&lt;/p&gt;
&lt;p&gt;定时更新则会稍微有一点点麻烦，你需要一个配置项来记住当前文件更新的时间间隔（例如1小时），然后每次触发执行的时候，都判断下当前时间与文件时间的差异是否达到了更新的间隔。&lt;/p&gt;
&lt;h3&gt;文件缓存的调用&lt;/h3&gt;
&lt;p&gt;文件缓存的调用非常简单，php中只要include指定的文件就可以了。当然，要稍微注意下include，require，include_once，require_once的差异。一般可使用include_once。&lt;/p&gt;
&lt;h3&gt;数据库缓存的实现&lt;/h3&gt;
&lt;p&gt;数据库缓存的整体实现机制相比文件缓存来说复杂得多，需要一整套完整的从生成更新到调用的机制。&lt;/p&gt;
&lt;p&gt;supesite中采用的机制叫block，中文应该叫簇。这是一个相当好的设计，它极大的简化了数据调用的方式，并且与数据库缓存机制紧密结合，目前这种机制在各种开源CMS中都很流行。&lt;/p&gt;
&lt;p&gt;首先来看看整套缓存表的设计，整个建表语句如下：&lt;/p&gt;
&lt;p&gt;show create table supe_cache;&lt;/p&gt;
&lt;p&gt;查看数据缓存表：&lt;/p&gt;
&lt;pre class=&quot;sql&quot; title=&quot;code&quot;&gt;CREATE TABLE `supe_cache` (
`cachekey` varchar(16) NOT NULL DEFAULT '',
`uid` mediumint(8) unsigned NOT NULL DEFAULT '0',
`cachename` varchar(20) NOT NULL DEFAULT '',
`value` mediumtext NOT NULL,
`updatetime` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`cachekey`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
&lt;/pre&gt;
&lt;p&gt;cachekey缓存主键，用于识别缓存，uid基本是无用，可以忽略。cachename是supesite中区分缓存的内容的类型的，例如分类调用缓存，新闻调用缓存，评论调用缓存等，通过cachename字段，可以允许后台单独对某些分类的缓存进行更新。value则是整个调用结果集，它是php中的结果数组的序列化字符串。updatetime记录的是下次缓存要更新的时间。&lt;/p&gt;
&lt;p&gt;通过这个设计，可以得出整个数据库缓存的实现思路：生成缓存的时候，生成一个唯一的cachekey作为主键，将结果集序列化为数组保存在数据库中，并记录下次更新的时间。调用缓存的时候凭借cachekey主键获取，并判断updatetime时间是否已经到达更新的时间点，如果需要更新，则更新缓存表。否则直接读取缓存的结果集。&lt;/p&gt;
&lt;p&gt;这里面围绕着一个核心的技术问题：&lt;/p&gt;
&lt;p&gt;如何将sql调用跟唯一的cachekey对应起来？也就是说我执行一条sql语句来查询数据，这个查询怎么生成一个唯一的cachekey，然后我下次再次执行同样的sql就可以跟通过cachekey找到缓存结果？&lt;/p&gt;
&lt;p&gt;这里就是supesite的核心函数block的功劳了。&lt;/p&gt;
&lt;p&gt;原谅我继续待续..&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/485304912/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1025&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/485304912/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/485304912/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/1025/feed</wfw:commentRss><slash:comments>0</slash:comments><description>深入解读Supesite CMS的数据库缓存与文件缓存机制。各种系统开发中都会大量的使用缓存，用于提高程序执行速度，避免过于频繁的查询或者是过于复杂的查询的性能消耗。&lt;img src=&quot;http://www1.feedsky.com/t1/485304912/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1025&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/485304912/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/485304912/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>supesite</category><category>cms</category><category>PHP</category><pubDate>Mon, 14 Mar 2011 11:15:05 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/1025#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=1025</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/1025</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/485304912/5832870</fs:itemid></item><item><title>最近2个月的技术文写作计划</title><link>http://www.fangyuqiang.com/archives/1019</link><content:encoded>&lt;p&gt;太懒了..人一旦养成惰性了就容易这样&amp;#8230;博客荒废了这么久,真对不起几百个订阅我博客的观众哈..决定从现在起,每周强制自己至少写一篇技术文。&lt;/p&gt;
&lt;p&gt;本次计划完整的书写关于CMS架构方面的东西，自己在长期的CMS开发中总结的一些技术经验与大家分享。欢迎拍砖。&lt;span id=&quot;more-1019&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;深入解读Supesite CMS的数据库缓存与文件缓存机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的模板与数据调用机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的接口调用机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的静态页生成机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的计划任务执行机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的模型机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的内容采集机制&lt;/li&gt;
&lt;li&gt;深入解读Supesite CMS的debug调试机制&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;每周一篇,敬请期待!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798601/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1019&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798601/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798601/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/1019/feed</wfw:commentRss><slash:comments>0</slash:comments><description>太懒了..人一旦养成惰性了就容易这样&amp;#8230;博客荒废了这么久,真对不起几百个订阅我博客的观众哈..决定从现在起,每周强制自己至少写一篇技术文。 本次计划完整的书写关于CMS架构方面的东西，自己在长期的CMS开发中总结的一些技术经验与大家分享。欢迎拍砖。 深入解读Supesite CMS的数据库缓存与文件缓存机制 深入解读Supesite CMS的模板与数据调用机制 深入解读Supesite CMS的接口调用机制 深入解读Supesite CMS的静态页生成机制 深入解读Supesite CMS的计划任务执行机制 深入解读Supesite CMS的模型机制 深入解读Supesite CMS的内容采集机制 深入解读Supesite CMS的debug调试机制 每周一篇,敬请期待! &amp;#160;&lt;img src=&quot;http://www1.feedsky.com/t1/483798601/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1019&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798601/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798601/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>PHP</category><pubDate>Wed, 09 Mar 2011 15:23:39 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/1019#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=1019</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/1019</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798601/5832870</fs:itemid></item><item><title>拼图游戏的算法分享</title><link>http://www.fangyuqiang.com/archives/1014</link><content:encoded>&lt;p&gt;这里提到的拼图游戏，指的是类似3*3格子的框框，8个拼图移动拼成还原成原始的图片。&lt;/p&gt;
&lt;p&gt;经过我一段时间的摸索。。目前总结出了2种拼图算法，与大家分享~欢迎拼图达人一起探讨~&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 微软雅黑;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;第一种算法：旋转法。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: medium;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;这种方法规则最简单，整个完整的拼图，其实是可以连接成一条长龙，这条长龙可以顺着顺时针或者逆时钟旋转。&lt;br /&gt;
这个算法的原理就是：将中间的格子作为一个寄存拼图的架子，所有拼图围绕中间的拼图旋转，将整个拼图接成一条长龙。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;假设正确拼图如下：&lt;br /&gt;
1 2 3&lt;br /&gt;
4 5 6&lt;br /&gt;
7 8&lt;br /&gt;
如果转换成一圈的长龙，就是&lt;br /&gt;
1 2 3&lt;br /&gt;
4    6&lt;br /&gt;
7 5 8&lt;br /&gt;
目前拼图如下：&lt;br /&gt;
1 3 4&lt;br /&gt;
2 5 7&lt;br /&gt;
8 6&lt;br /&gt;
我们的目标就是将这个图通过旋转，拼成上面那样的长龙。&lt;/p&gt;
&lt;p&gt;第一步，我们要把2接在1后面，那我们将2寄存到中间的位置，6右5下2右，变成：&lt;br /&gt;
1 3 4&lt;br /&gt;
8 2 7&lt;br /&gt;
5 6&lt;/p&gt;
&lt;p&gt;第二步，顺时针旋转外围拼图56743，留出1后面的空位，给2预备&lt;br /&gt;
1    3&lt;br /&gt;
8 2 4&lt;br /&gt;
5 6 7&lt;/p&gt;
&lt;p&gt;第三步，接龙，2上将2移到1后面。&lt;br /&gt;
1 2 3&lt;br /&gt;
8    4&lt;br /&gt;
5 6 7&lt;br /&gt;
接下来每个拼图都如此操作。目前3已经自然接好，那接下来3下面接的是6，6上，把6“寄存”到中间的格子。&lt;br /&gt;
1 2 3&lt;br /&gt;
8 6 4&lt;br /&gt;
5    7&lt;br /&gt;
因为6要接在3的后面，所以向逆时针旋转整个拼图2次，第一次逆时钟58123，第二次逆时针4758123，留出3后面的空位，变成&lt;br /&gt;
3    4&lt;br /&gt;
2 6 7&lt;br /&gt;
1 8 5&lt;br /&gt;
继续接龙，6上，将6接到3后面，变成&lt;br /&gt;
3 6 4&lt;br /&gt;
2    7&lt;br /&gt;
1 8 5&lt;br /&gt;
现在龙已经接了4个了，继续接，8跟在6后面，将8移入中间的格子“寄存”，外围继续逆时钟旋转&lt;br /&gt;
3 6 4&lt;br /&gt;
2 8 7&lt;br /&gt;
1    5&lt;br /&gt;
逆时钟旋转1236&lt;br /&gt;
6    4&lt;br /&gt;
3 8 7&lt;br /&gt;
2 1 5&lt;br /&gt;
接龙&lt;br /&gt;
6 8 4&lt;br /&gt;
3    7&lt;br /&gt;
2 1 5&lt;/p&gt;
&lt;p&gt;接下来8左边是接5，这个旋转的过程比较多，要注意的是，旋转过程，已经接好的龙不要再动，只旋转，不拆分。&lt;br /&gt;
6 8 4&lt;br /&gt;
3 7 5&lt;br /&gt;
2 1&lt;/p&gt;
&lt;p&gt;8 7 4&lt;br /&gt;
6 5&lt;br /&gt;
3 2 1&lt;/p&gt;
&lt;p&gt;4下7右5上，继续往下接&lt;br /&gt;
8 5 7&lt;br /&gt;
6    4&lt;br /&gt;
3 2 1&lt;/p&gt;
&lt;p&gt;好了，现在看到了吗？&lt;br /&gt;
整条龙已经接好了！可以逆时针旋转4次，就是&lt;br /&gt;
1 2 3&lt;br /&gt;
4    6&lt;br /&gt;
7 5 8&lt;br /&gt;
然后5上8左&lt;br /&gt;
1 2 3&lt;br /&gt;
4 5 6&lt;br /&gt;
7 8&lt;br /&gt;
大功告成~&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: small;&quot;&gt;&lt;span style=&quot;color: green;&quot;&gt;所有的拼图都可以以这样的“寄存”，接龙的方式拼成一条长龙，然后经过几次旋转就可以恢复成正确的拼图。刚开始玩的时候算法不熟悉的时候会比较慢，但是到了熟悉了之后就会越来越快，用这个算法，熟练的话可以打过第6关&lt;/p&gt;
&lt;p&gt;上面这个过程是旋转法最基础的做法，我们的目的其实是接龙，而不是旋转，所以不是所有的拼图都一定要移动到中间，旋转接龙的，只要通过移动，可以接到一起 的方式都行。要注意的是，旋转过程，已经接好的龙就不要再拆开。熟练之后，顺时针逆时针的方向旋转都可以接龙，2边同时接。&lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;span style=&quot;font-family: 微软雅黑;&quot;&gt;&lt;span style=&quot;color: red;&quot;&gt;第二种算法: 交换法&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;交换法是一个交换两张对调了的拼图的算法，整个算法类似倒车入库。要熟练应用会比旋转法难一点。但是拼图要往高级的打，就一定要会这个算法。。&lt;/p&gt;
&lt;p&gt;我们还是以上面的拼图为例开始：&lt;br /&gt;
1 3 4                      1 2 3&lt;br /&gt;
2 5 7   =》目标        4 5 6&lt;br /&gt;
8 6                         7 8&lt;/p&gt;
&lt;p&gt;交换法是先完成第一行，123，目前这个要完成123较为简单。7下5右2右，变成&lt;br /&gt;
1 3 4&lt;br /&gt;
2 5&lt;br /&gt;
8 6 7&lt;br /&gt;
867543逆时针旋转&lt;br /&gt;
1    3&lt;br /&gt;
8 2 4&lt;br /&gt;
6 7 5&lt;br /&gt;
2上，最上面的一行123就完成了，接下来简化起见，我们隐藏掉123，进行排序&lt;br /&gt;
8    4&lt;br /&gt;
6 7 5&lt;br /&gt;
接下来是要完成最左边的一行，即4，7要归位。4，7如果归位，那么剩下的3个拼图只要旋转几下就可以归位了。所以核心就在于4，7如何归位。&lt;br /&gt;
目前这种情况，比较简单：&lt;br /&gt;
7上6右变成&lt;br /&gt;
8 7 4&lt;br /&gt;
6 5&lt;br /&gt;
8下，7左，4左变成&lt;br /&gt;
7 4&lt;br /&gt;
8 6 5&lt;br /&gt;
然后就简单了，5上6右8右。&lt;br /&gt;
7 4 5&lt;br /&gt;
8 6&lt;br /&gt;
7下4左。好了，74归位。整个拼图就完成了。&lt;br /&gt;
在很多情况下，交换法会比接龙更节省步数，因为接龙法需要移动所有拼图。上面这种情况比较简单，体现不出交换法的精髓，我们再造一个局：&lt;br /&gt;
7    8&lt;br /&gt;
4 6 5&lt;br /&gt;
这种情况是4，7对调，你会发现一直转来转去，74都对调不过来。交换法的精髓就是以退为进能的借位&lt;br /&gt;
首先将4移动到现在5的位置:&lt;br /&gt;
6上4左:&lt;br /&gt;
7 6 8&lt;br /&gt;
4 5&lt;br /&gt;
7下6左8左:&lt;br /&gt;
6 8&lt;br /&gt;
7 4 5&lt;br /&gt;
&lt;span style=&quot;color: red;&quot;&gt;5上4右8下:&lt;/span&gt; 这一步是交换法的精髓所在,将连在一起的4，7切断&lt;br /&gt;
6    5&lt;br /&gt;
7 8 4&lt;br /&gt;
6右7上，7归位&lt;br /&gt;
7 6 5&lt;br /&gt;
8 4&lt;br /&gt;
8左4左，5下6右，现在让出位置，让47重相逢，但是原先相逢的时候4是在7下面的，但是这次的相逢，4是在7的右边&lt;br /&gt;
7    6&lt;br /&gt;
8 4 5&lt;/p&gt;
&lt;p&gt;再次相逢&lt;br /&gt;
7 4 6&lt;br /&gt;
8    5&lt;br /&gt;
感觉是不是眼熟了呢？没错，就是刚刚旋转法一开始的做法。&lt;br /&gt;
8右7下4左，47归位完成&lt;br /&gt;
4    6&lt;br /&gt;
7 8 5&lt;/p&gt;
&lt;p&gt;这是我目前已知的2种算法。。这2种算法融会贯通的用，打出高分就不是问题~&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798602/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1014&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798602/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798602/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/1014/feed</wfw:commentRss><slash:comments>0</slash:comments><description>这里提到的拼图游戏，指的是类似3*3格子的框框，8个拼图移动拼成还原成原始的图片。

经过我一段时间的摸索。。目前总结出了2种拼图算法，与大家分享~欢迎拼图达人一起探讨~&lt;img src=&quot;http://www1.feedsky.com/t1/483798602/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1014&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798602/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798602/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>算法</category><category>技术周边</category><pubDate>Sun, 30 Jan 2011 16:37:23 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/1014#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=1014</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/1014</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798602/5832870</fs:itemid></item><item><title>一个整理得比较清楚的JS对联广告代码</title><link>http://www.fangyuqiang.com/archives/1009</link><content:encoded>&lt;pre class=&quot;js&quot; title=&quot;code&quot;&gt;// 对联浮动广告代码
var HXFloatPari = {
 lastScrollY : 0,
 heartBeat : function() {
 var diffY;
 if (document.documentElement &amp;amp;&amp;amp; document.documentElement.scrollTop) {
 diffY = document.documentElement.scrollTop;
 } else if (document.body) {
 diffY = document.body.scrollTop
 }
 var percent = .1 * (diffY - HXFloatPari.lastScrollY);
 if (percent &amp;gt; 0) {
 percent = Math.ceil(percent);
 } else {
 percent = Math.floor(percent);
 }
 $(&quot;#FloatPari1&quot;)[0].style.top = parseInt($(&quot;#FloatPari1&quot;)[0].style.top)
 + percent + &quot;px&quot;;
 $(&quot;#FloatPari2&quot;)[0].style.top = parseInt($(&quot;#FloatPari1&quot;)[0].style.top)
 + percent + &quot;px&quot;;
 HXFloatPari.lastScrollY = HXFloatPari.lastScrollY + percent;
 window.setTimeout(&quot;HXFloatPari.heartBeat()&quot;, 1);
 },
 init : function(swf,width,height) {
 var swfstr = &quot;&amp;lt;div &amp;gt;&amp;lt;object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0' width='&quot;+width+&quot;' height='&quot;+height+&quot;'&amp;gt;&quot; +
 &quot;&amp;lt;param name='movie' value='&quot;+swf+&quot;' /&amp;gt;&quot; +
 &quot;&amp;lt;param name='quality' value='high' /&amp;gt;    &quot; +
 &quot;&amp;lt;param name='wmode' value='transparent' /&amp;gt;    &quot; +
 &quot;&amp;lt;embed src='&quot;+swf+&quot;' width='&quot;+width+&quot;' height='&quot;+height+&quot;' quality='high' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash'&amp;gt;&amp;lt;/embed&amp;gt;&quot; +
 &quot;&amp;lt;/object&amp;gt;&amp;lt;/div&amp;gt;&quot;;
 document.write(&quot;&amp;lt;div id=\&quot;FloatPari1\&quot; style='left:2px;POSITION:absolute;TOP:10px;'&amp;gt;&quot;);
 document.write(swfstr);
 document.write(&quot;&amp;lt;p align=left&amp;gt;&amp;lt;a onclick='javascript:$(\&quot;#FloatPari1,#FloatPari2\&quot;).hide()' style='cursor:pointer'&amp;gt;&amp;lt;img src=http://house.nhaidu.com/images/base/advclose.gif&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&quot;);
 document.write(&quot;&amp;lt;div id=\&quot;FloatPari2\&quot; style='right:2px;POSITION:absolute;TOP:10px;'&amp;gt;&quot;);
 document.write(swfstr);
 document.write(&quot;&amp;lt;p align=right&amp;gt;&amp;lt;a onclick='javascript:$(\&quot;#FloatPari1,#FloatPari2\&quot;).hide()' style='cursor:pointer'&amp;gt;&amp;lt;img src=http://house.nhaidu.com/images/base/advclose.gif&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;/div&amp;gt;&quot;);

 HXFloatPari.heartBeat();
 }
}&lt;/pre&gt;
&lt;p&gt;注意本脚本需要结合jquery使用。如果你不是采用jquery的，只要把$调用都改成document.getElementById即可，没有应用jquery的其他api。&lt;/p&gt;
&lt;p&gt;花了1个小时把网上一个现成的JS对联广告代码整理了下，格式会比较清楚，也更通用化，比较面向对象一点呵呵。使用方法很简单，&lt;/p&gt;
&lt;pre&gt;&amp;lt;script&amp;gt;
//对联广告
HXFloatPari.init('{S_URL}/flash/ad/2011/float_pari.swf',110,270);
&amp;lt;/script&amp;gt;
&lt;/pre&gt;
&lt;p&gt;第一个参数填flash地址，第二个参数宽度，第三个参数高度。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798603/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1009&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798603/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798603/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/1009/feed</wfw:commentRss><slash:comments>0</slash:comments><description>花了1个小时把网上一个现成的JS对联广告代码整理了下，格式会比较清楚，也更通用化，比较面向对象一点呵呵。使用方法很简单。
注意本脚本需要结合jquery使用。如果你不是采用jquery的，只要把$调用都改成document.getElementById即可，没有应用jquery的其他api。&lt;img src=&quot;http://www1.feedsky.com/t1/483798603/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1009&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798603/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798603/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>JavaScript</category><pubDate>Mon, 24 Jan 2011 11:30:17 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/1009#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=1009</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/1009</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798603/5832870</fs:itemid></item><item><title>静态页面显示动态数据解决方案</title><link>http://www.fangyuqiang.com/archives/1003</link><content:encoded>&lt;p&gt;经常有人问起我这个问题，生成静态页的页面，如何显示动态的数据？&lt;/p&gt;
&lt;p&gt;大家都知道的，静态的html页面，一般都是跟随着各自CMS的设置进行更新的，比如说CMS的设置是10分钟，那10分钟静态html页面重新生成一次。&lt;/p&gt;
&lt;p&gt;这里有些地方就有特别的要求了。页面上的有些数据不是静态的，而是动态变化的。比如&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;文章的阅读次数，评论次数，投票的次数，当前用户的登陆状态，等等，这些都是动态，并且要即时显示。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;解决的方式就是应用Javascript来实现。Javascript的实现也分2种方式，一种是直接采用document.write页面上进行输出,另外一种就是应用ajax。&lt;/p&gt;
&lt;p&gt;以php为例,新建一个php文件如test.php,输出&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;&amp;lt;?php
echo &quot;document.write('动态输出,此处可以换成自己的变量例如阅读次数')&quot;;
?&amp;gt;&lt;/pre&gt;
&lt;p&gt;页面上在你需要显示此数据的地方采用Javascript链接:&lt;/p&gt;
&lt;p&gt;&amp;lt;script src=&amp;#8221;test.php?testid=1&amp;#8243;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;这样既可达到目标。&lt;/p&gt;
&lt;p&gt;另外一种方式ajax，就更容易理解了。就是每次页面载入的时候执行一个更新数据的ajax，将页面上需要更新的数据动态赋值就可以了。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798604/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1003&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798604/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798604/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/1003/feed</wfw:commentRss><slash:comments>0</slash:comments><description>大家都知道的，静态的html页面，一般都是跟随着各自CMS的设置进行更新的，比如说CMS的设置是10分钟，那10分钟静态html页面重新生成一次。

这里有些地方就有特别的要求了。页面上的有些数据不是静态的，而是动态变化的。&lt;img src=&quot;http://www1.feedsky.com/t1/483798604/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/1003&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798604/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798604/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>PHP</category><pubDate>Thu, 23 Dec 2010 09:12:50 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/1003#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=1003</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/1003</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798604/5832870</fs:itemid></item><item><title>IE6下CSS多类选择符的问题</title><link>http://www.fangyuqiang.com/archives/994</link><content:encoded>&lt;p&gt;IE6&amp;#8230;这个前端开发的梦魇总是在你不经意的时候给你捅一刀.这次碰到的问题是CSS多类选择符的问题。IE6不支持。&lt;span id=&quot;more-994&quot;&gt;&lt;/span&gt;我们来看一段这样简单的代码：&lt;/p&gt;
&lt;pre&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;head&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;title&amp;gt;IE6多类&amp;lt;/title&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;style type=&quot;text/css&quot;&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;div{display:block;width:400px;height:200px;}&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;#id1.c1{background:#ccc;}&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;.c2.c3{border:1px solid red;}&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;/style&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;body&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;div id=&quot;id1&quot; class=&quot;c1&quot;&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;a&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;div id=&quot;id2&quot;  class=&quot;c2 c3&quot;&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;b&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;/body&amp;gt;&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;p&gt;形如#id1.c1的选择符，支持性很好，IE6及以上，ff,opera,safari等浏览器都支持。形如.c2.c3的选择符，在IE6下不支持，后一个类名会覆盖前一个类名，即直接识别为.c3&lt;/p&gt;
&lt;p&gt;所以开发中用多类来组合实现css效果的时候,注意IE6的这个问题。最好的方法就是，不要用类组合的形式。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798605/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/994&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798605/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798605/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/994/feed</wfw:commentRss><slash:comments>2</slash:comments><description>IE6&amp;#8230;这个前端开发的梦魇总是在你不经意的时候给你捅一刀.这次碰到的问题是CSS多类选择符的问题。IE6不支持。我们来看一段这样简单的代码： &amp;#60;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&amp;#62; &amp;#60;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;#62; &amp;#60;head&amp;#62; &amp;#60;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&amp;#62; &amp;#60;title&amp;#62;IE6多类&amp;#60;/title&amp;#62; &amp;#60;style type=&quot;text/css&quot;&amp;#62; div{display:block;width:400px;height:200px;} #id1.c1{background:#ccc;} .c2.c3{border:1px solid red;} &amp;#60;/style&amp;#62; &amp;#60;/head&amp;#62; &amp;#60;body&amp;#62; &amp;#60;div id=&quot;id1&quot; class=&quot;c1&quot;&amp;#62; a &amp;#60;/div&amp;#62; &amp;#60;div id=&quot;id2&quot;  class=&quot;c2 c3&quot;&amp;#62; b &amp;#60;/div&amp;#62; &amp;#60;/body&amp;#62; &amp;#60;/html&amp;#62; 形如#id1.c1的选择符，支持性很好，IE6及以上，ff,opera,safari等浏览器都支持。形如.c2.c3的选择符，在IE6下不支持，后一个类名会覆盖前一个类名，即直接识别为.c3 所以开发中用多类来组合实现css效果的时候,注意IE6的这个问题。最好的方法就是，不要用类组合的形式。&lt;img src=&quot;http://www1.feedsky.com/t1/483798605/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/994&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798605/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798605/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Html+CSS</category><pubDate>Mon, 11 Oct 2010 13:59:27 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/994#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=994</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/994</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798605/5832870</fs:itemid></item><item><title>php两个不错的字符串startswith实现</title><link>http://www.fangyuqiang.com/archives/989</link><content:encoded>&lt;p&gt;写得很轻巧精妙的start with实现，学习借鉴。来自&lt;a href=&quot;http://www.jonasjohn.de/snippets/&quot;&gt;http://www.jonasjohn.de/snippets/&lt;/a&gt;，在他的网站上还能看到更多不错的一些实用函数的实现，有时间可以揣摩看看&lt;span id=&quot;more-989&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;/**
 * StartsWith
 * Tests if a text starts with an given string.
 *
 * @param     string
 * @param     string
 * @return    bool
 */
function StartsWith($Haystack, $Needle){
 // Recommended version, using strpos
 return strpos($Haystack, $Needle) === 0;
}

// Another way, using substr
function StartsWithOld($Haystack, $Needle){
 return substr($Haystack, 0, strlen($Needle)) == $Needle;
}&lt;/pre&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798606/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/989&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798606/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798606/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/989/feed</wfw:commentRss><slash:comments>0</slash:comments><description>写得很轻巧精妙的start with实现，学习借鉴。来自http://www.jonasjohn.de/snippets/，在他的网站上还能看到更多不错的一些实用函数的实现，有时间可以揣摩看看 /** * StartsWith * Tests if a text starts with an given string. * * @param     string * @param     string * @return    bool */ function StartsWith($Haystack, $Needle){ // Recommended version, using strpos return strpos($Haystack, $Needle) === 0; } // Another way, using substr function StartsWithOld($Haystack, $Needle){ return substr($Haystack, 0, strlen($Needle)) == $Needle; }&lt;img src=&quot;http://www1.feedsky.com/t1/483798606/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/989&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798606/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798606/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>PHP</category><pubDate>Thu, 23 Sep 2010 00:40:33 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/989#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=989</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/989</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798606/5832870</fs:itemid></item><item><title>[转]被选择的互联网</title><link>http://www.fangyuqiang.com/archives/981</link><content:encoded>&lt;p&gt;本文来自wettuy的博客，是在月光博客上面看到的：&lt;a href=&quot;http://www.lolibeta.com/pc/it/1574.html&quot;&gt;http://www.lolibeta.com/pc/it/1574.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我转载别人的文章不多，但是这篇文章对百度与google在搜索理念上的分析，让人折服。&lt;/p&gt;
&lt;p&gt;我个人对于百度一向BS，对于百度的框计算，我的观点就是：滥用垄断地位的无耻做法，中国互联网的杀手，变相的竞价排名。会导致竞价的大网站越来越大，然后处于垄断位置，小网站消亡殆尽，最后都失去创新活力，名副其实的中国互联网杀手，杀手！&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-981&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;shadowbox[post-1574];player=img;&quot; href=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/internet1.png&quot;&gt;&lt;img title=&quot;internet-1&quot; src=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/internet1_thumb.png&quot; border=&quot;0&quot; alt=&quot;internet-1&quot; width=&quot;469&quot; height=&quot;324&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;连线杂志的那篇《&lt;a href=&quot;http://www.wired.com/magazine/2010/08/ff_webrip/all/1&quot;&gt;互联网死了&lt;/a&gt;》确 实震动业界，而现在，&lt;a href=&quot;http://www.lolibeta.com/pc/1562.html&quot;&gt;百度的框计算&lt;/a&gt;似乎正在验 证他的话。&lt;/p&gt;
&lt;p&gt;无论是高兴也好，无论是哀嚎也罢，百度的框计算终究给最终用户带来了一些实际的东西。他改变了人们对于传统搜索的认知。而百度这类似的行为，正成为 互联网的一种趋势。可以说，商业化的大潮，正在人为的割裂互联网，让他的边界越来越明显。&lt;/p&gt;
&lt;p&gt;比特客栈写了一篇很有趣的文章《&lt;a href=&quot;http://blog.ticktag.org/2010/09/04/7008/&quot;&gt;让互联 网死亡，让互联网成长&lt;/a&gt;》，文章写的很棒，观点清晰明了，在此推荐一下。&lt;/p&gt;
&lt;p&gt;就像最初的图中那样，互联网正在被人为的割裂。以各种门户网站为代表的商业网站，和传统的草根类个人网站。他们之间的界限是如此的分明，甚至正在越 来越大。究竟是什么造成了互联网这样的格局？而互联网，又究竟给我们带来了些什么呢？&lt;/p&gt;
&lt;h3&gt;付费与免费之争&lt;/h3&gt;
&lt;p&gt;我们首先来看这样的一个实例。&lt;/p&gt;
&lt;p&gt;一个普通的互联网用户，在寻找一个他一直想要得到的稀有资源。这个资源是如此的难以寻找，直到某天，他在一个需要花费积分才能下载的私人FTP论坛 上，发现了这个资源。此时，他面临着两个选择——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;花费10分钟时间，赚取相应的论坛积分，以便开始下载&lt;/li&gt;
&lt;li&gt;花费10分钟甚至可能更多的时间，在搜索引擎上继续寻找其他免费的下载&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在这个时候，这两个选择，可以说是等价的。我们假定这两种选择都只需要花费10分钟的时间，于是得到了这样一个公式&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;付费下载/10分钟=免费下载/10分钟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以说在这个行为中，免费下载所花费的代价，事实上和付费下载是等价的。&lt;/p&gt;
&lt;p&gt;但是这只是建立在一个假定的前提上的，那就是只需要10分钟就能够找到免费的替代资源。当这个时间开始增长的时候，公式也随之而改变。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;付费下载/10分钟=免费下载/20分钟&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在总代价仍然相同的情况下，在单位时间中，免费下载需要付出的更多，才可以得到与付费下载相同的结果。&lt;/p&gt;
&lt;p&gt;在这样的时候，用户会趋向于选择付费下载，也并非不能理解的事情。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;付费下载节省了用户寻找的成本&lt;/span&gt;&lt;/strong&gt;。这也是为何付费的 资源始终能够存在的主要原因。&lt;/p&gt;
&lt;h3&gt;再谈框计算&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;shadowbox[post-1574];player=img;&quot; href=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/baidu.png&quot;&gt;&lt;img title=&quot;baidu&quot; src=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/baidu_thumb.png&quot; border=&quot;0&quot; alt=&quot;baidu&quot; width=&quot;500&quot; height=&quot;253&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;作为一个难得的实例，我们继续以百度的框计算为例，进行分析。&lt;/p&gt;
&lt;p&gt;对于普通用户而言，他想要寻找一个软件的下载，两种方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;访问常规的软件站；搜索自己想要的软件名；点击进入下载页面；找到下载链接然后开始下载&lt;/li&gt;
&lt;li&gt;访问百度；搜索自己想要的软件名；点击框计算中的结果开始下载&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;很显然，框计算节省了用户的步骤。也可以说，框计算节省了用户寻找资源所需的时间成本&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在某种意义上，框计算实现了和付费下载一样的结果。&lt;/p&gt;
&lt;p&gt;从这个角度来看，百度的做法实际上正是现在互联网的一种趋势。而出现这种趋势的一个原因，是因为互联网正在变得越来越快。&lt;/p&gt;
&lt;h3&gt;关于Google&lt;/h3&gt;
&lt;p&gt;曾经有人提到过这个问题。既然百度能够实现框计算，为什么Google没有想到？事实上，Google并非想不到这个问题。&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;shadowbox[post-1574];player=img;&quot; href=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/gimage.jpg&quot;&gt;&lt;img title=&quot;b-image&quot; src=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/bimage_thumb.jpg&quot; border=&quot;0&quot; alt=&quot;b-image&quot; width=&quot;244&quot; height=&quot;157&quot; /&gt;&lt;img title=&quot;g-image&quot; src=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/gimage_thumb.jpg&quot; border=&quot;0&quot; alt=&quot;g-image&quot; width=&quot;244&quot; height=&quot;154&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是百度的图片搜索与Google的图片搜索的对比。而这也是长期为人所诟病的一个地方。&lt;/p&gt;
&lt;p&gt;他们之间最大的区别在于：&lt;strong&gt;百度直接显示出图片；而Google则将用户带领至原始网站&lt;/strong&gt;。即使现在Google的 图片搜索进行了全面的改版，较之之前的版本用户体验已经有了明显的提高，这一宗旨也没有改变。&lt;/p&gt;
&lt;p&gt;正是这样细微的差别，早就了两种截然不同的搜索引擎。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于站长而言，百度的做法与盗链无异，只会增加服务器的负担；但是Google则可以显著的带来流量的增加。&lt;/li&gt;
&lt;li&gt;从用户的角度来说，往往他们并不关心这个图片出自一个怎样的网站；他们要的只是图片本身。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;两种理念&lt;/h3&gt;
&lt;p&gt;让我我们来总结一下Google与百度这两种截然不同的理念。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Google认为，保证网站的生存是第一位的，用户应该尽可能快的离开搜索页面&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;百度认为，让用户找到自己的资源才是最重要的，用户最好在自己的网页上找到所有需要的资源&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然两者在执行中有着诸多不同，但大抵如此。&lt;/p&gt;
&lt;p&gt;决定这两种不同理念的因素有很多，但其中最主要的一点是：&lt;strong&gt;为了保证整个互联网业界的平衡与持续性&lt;/strong&gt;。Google 并非不知道哪一种做法对于用户而言是更好的。只是这种做法，对于网站而言却是一种打击。&lt;/p&gt;
&lt;p&gt;互联网的一个最大的特点，在于&lt;strong&gt;人人都可以创造价值&lt;/strong&gt;。虽然这一点直到Web2.0时代才逐渐被发扬光大，但我始终 认为，这正是互联网最基本的特征之一。无论是Twitter还是Facebook的风行，都证明了这一点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;但是这种特点，也造成了一个很严重的问题：&lt;span style=&quot;color: #ff0000;&quot;&gt;资源的分散&lt;/span&gt;。有可能同样的 资源，会在不同的网站中出现；也有可能更加有意义的资源，是出现在某个不为人知的小博客上&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是一件非常棘手而严峻的事情。每个人都在互联网中占据一小块角落，并且各自为战，最终只会导致互联网被越割越小。但是这个问题并不是无解的。也正 是出于对于这个问题不同的理解，百度和Google分别拿出了各自的解决方法——&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;百度认为，如果资源分散的话，只要将其中最有价值的集中起来就可以了。基于这一理解，框计算应运而 生&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;Google认为，资源的分散是互联网不可避免的问题，无法依靠简单的集中来解决。基于这一理 解，Google试图索引整个互联网的资源&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;百度的做法固然容易理解，但是Google的做法却更加疯狂，也更加彻底。Google所做过的所有事情，包括对站长们发布各种工具和教程，都是为 了帮助他完成这一终极的目标：索引整个互联网。&lt;/p&gt;
&lt;p&gt;对此，我并不愿意评价究竟谁的解决方法更加优秀。因为他们对于业界而言，有着完全相反的意义：&lt;strong&gt;Google的索引将会让互联网更加 趋向于混乱和无序，但能够始终保持增长；百度的框计算将会让互联网更加有序而可靠，但中小网站终将无法生存&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;为什么他们会如此的水火不容？答案是，用户的选择。&lt;/p&gt;
&lt;h3&gt;用户的选择&lt;/h3&gt;
&lt;p&gt;&lt;a rel=&quot;shadowbox[post-1574];player=img;&quot; href=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/choose.png&quot;&gt;&lt;img title=&quot;choose&quot; src=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/choose_thumb.png&quot; border=&quot;0&quot; alt=&quot;choose&quot; width=&quot;488&quot; height=&quot;393&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;互联网究竟给我们带来了什么？有人说，是更多的资源；有人说，是无尽的自由；也有人说，只是另外一种交流方式。在我看来，互联网真正带来的东西，是 选择。&lt;/p&gt;
&lt;p&gt;这里，我必须要感谢你在如此巨大的互联网中，选择了我的博客。即使你并不是在lolibeta.com上读到的这段文字。这并不重要，因为作为互联 网的用户，能够看到这里，你已经做出了一次选择。而你的这个选择，可能会成为促使我继续写下去的动力。&lt;/p&gt;
&lt;p&gt;互联网，正是在这一次次的被选择中成长起来的。&lt;/p&gt;
&lt;p&gt;但是这种用户选择的模式，也有一定的弊端。&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;shadowbox[post-1574];player=img;&quot; href=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/choose1.png&quot;&gt;&lt;img title=&quot;choose-1&quot; src=&quot;http://www.lolibeta.com/wp-content/uploads/2010/09/choose1_thumb.png&quot; border=&quot;0&quot; alt=&quot;choose-1&quot; width=&quot;240&quot; height=&quot;151&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;假设对于普通用户而已，需要访问两个不同的网站以获取自己的资源。此时，出现了一种介于两个网站之间的索引服务，可以同时访问两个网站里的资源。对 于这个用户用户，他在了解了这个索引服务之后，通常就不会继续访问那两个原始网站了。因为他至少节省了一个步骤，就可以获取到和以前同样的资源。&lt;/p&gt;
&lt;p&gt;这就是用户作出的选择。&lt;strong&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;用户始终喜欢简单的东西&lt;/span&gt;&lt;/strong&gt;。 这一点，我之前在《&lt;a href=&quot;http://www.lolibeta.com/pc/1453.html&quot;&gt;界面与自由度&lt;/a&gt;》中就已经论 证过。现在重新引用这一结果。&lt;/p&gt;
&lt;p&gt;无论任何时候，当面临多种不同的选择，大多数用户会趋向于选择最简单的那种。互联网始终在这种以“简单”为主导的选择中，不断的前进着，直到今天。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798607/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/981&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798607/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798607/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/981/feed</wfw:commentRss><slash:comments>2</slash:comments><description>本文来自wettuy的博客，是在月光博客上面看到的：http://www.lolibeta.com/pc/it/1574.html 我转载别人的文章不多，但是这篇文章对百度与google在搜索理念上的分析，让人折服。 我个人对于百度一向BS，对于百度的框计算，我的观点就是：滥用垄断地位的无耻做法，中国互联网的杀手，变相的竞价排名。会导致竞价的大网站越来越大，然后处于垄断位置，小网站消亡殆尽，最后都失去创新活力，名副其实的中国互联网杀手，杀手！ 连线杂志的那篇《互联网死了》确 实震动业界，而现在，百度的框计算似乎正在验 证他的话。 无论是高兴也好，无论是哀嚎也罢，百度的框计算终究给最终用户带来了一些实际的东西。他改变了人们对于传统搜索的认知。而百度这类似的行为，正成为 互联网的一种趋势。可以说，商业化的大潮，正在人为的割裂互联网，让他的边界越来越明显。 比特客栈写了一篇很有趣的文章《让互联 网死亡，让互联网成长》，文章写的很棒，观点清晰明了，在此推荐一下。 就像最初的图中那样，互联网正在被人为的割裂。以各种门户网站为代表的商业网站，和传统的草根类个人网站。他们之间的界限是如此的分明，甚至正在越 来越大。究竟是什么造成了互联网这样的格局？而互联网，又究竟给我们带来了些什么呢？ 付费与免费之争 我们首先来看这样的一个实例。 一个普通的互联网用户，在寻找一个他一直想要得到的稀有资源。这个资源是如此的难以寻找，直到某天，他在一个需要花费积分才能下载的私人FTP论坛 上，发现了这个资源。此时，他面临着两个选择—— 花费10分钟时间，赚取相应的论坛积分，以便开始下载 花费10分钟甚至可能更多的时间，在搜索引擎上继续寻找其他免费的下载 在这个时候，这两个选择，可以说是等价的。我们假定这两种选择都只需要花费10分钟的时间，于是得到了这样一个公式 付费下载/10分钟=免费下载/10分钟 可以说在这个行为中，免费下载所花费的代价，事实上和付费下载是等价的。 但是这只是建立在一个假定的前提上的，那就是只需要10分钟就能够找到免费的替代资源。当这个时间开始增长的时候，公式也随之而改变。 付费下载/10分钟=免费下载/20分钟 在总代价仍然相同的情况下，在单位时间中，免费下载需要付出的更多，才可以得到与付费下载相同的结果。 在这样的时候，用户会趋向于选择付费下载，也并非不能理解的事情。 付费下载节省了用户寻找的成本。这也是为何付费的 资源始终能够存在的主要原因。 再谈框计算 作为一个难得的实例，我们继续以百度的框计算为例，进行分析。 对于普通用户而言，他想要寻找一个软件的下载，两种方法： 访问常规的软件站；搜索自己想要的软件名；点击进入下载页面；找到下载链接然后开始下载 访问百度；搜索自己想要的软件名；点击框计算中的结果开始下载 很显然，框计算节省了用户的步骤。也可以说，框计算节省了用户寻找资源所需的时间成本。 在某种意义上，框计算实现了和付费下载一样的结果。 从这个角度来看，百度的做法实际上正是现在互联网的一种趋势。而出现这种趋势的一个原因，是因为互联网正在变得越来越快。 关于Google 曾经有人提到过这个问题。既然百度能够实现框计算，为什么Google没有想到？事实上，Google并非想不到这个问题。 这是百度的图片搜索与Google的图片搜索的对比。而这也是长期为人所诟病的一个地方。 他们之间最大的区别在于：百度直接显示出图片；而Google则将用户带领至原始网站。即使现在Google的 图片搜索进行了全面的改版，较之之前的版本用户体验已经有了明显的提高，这一宗旨也没有改变。 正是这样细微的差别，早就了两种截然不同的搜索引擎。 对于站长而言，百度的做法与盗链无异，只会增加服务器的负担；但是Google则可以显著的带来流量的增加。 从用户的角度来说，往往他们并不关心这个图片出自一个怎样的网站；他们要的只是图片本身。 两种理念 让我我们来总结一下Google与百度这两种截然不同的理念。 Google认为，保证网站的生存是第一位的，用户应该尽可能快的离开搜索页面 百度认为，让用户找到自己的资源才是最重要的，用户最好在自己的网页上找到所有需要的资源 虽然两者在执行中有着诸多不同，但大抵如此。 决定这两种不同理念的因素有很多，但其中最主要的一点是：为了保证整个互联网业界的平衡与持续性。Google 并非不知道哪一种做法对于用户而言是更好的。只是这种做法，对于网站而言却是一种打击。 互联网的一个最大的特点，在于人人都可以创造价值。虽然这一点直到Web2.0时代才逐渐被发扬光大，但我始终 认为，这正是互联网最基本的特征之一。无论是Twitter还是Facebook的风行，都证明了这一点。 但是这种特点，也造成了一个很严重的问题：资源的分散。有可能同样的 资源，会在不同的网站中出现；也有可能更加有意义的资源，是出现在某个不为人知的小博客上。 这是一件非常棘手而严峻的事情。每个人都在互联网中占据一小块角落，并且各自为战，最终只会导致互联网被越割越小。但是这个问题并不是无解的。也正 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/483798607/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/981&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798607/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798607/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>我操</category><category>业界评论</category><category>网站运营</category><category>随笔</category><pubDate>Tue, 14 Sep 2010 12:15:24 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/981#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=981</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/981</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798607/5832870</fs:itemid></item><item><title>Supesite替换后台编辑器为ckeditor</title><link>http://www.fangyuqiang.com/archives/974</link><content:encoded>&lt;p&gt;Supesite的后台编辑器是ss自己写的，不怎么好用，尤其是查看源代码的功能，所有代码都粘在一起，没有格式化，根本看不了，跟discuz论坛的编辑器对比起来差距太大了，估计这个编辑器是comsenz早期出的东西，supesite一直没有更新，所以编辑器太古董了。最近有些受不了，决定将supesite的编辑器替换为业内目前流行的&lt;a href=&quot;http://docs.cksource.com/&quot; target=&quot;_blank&quot;&gt;ckeditor&lt;/a&gt;，ckeditor的前身就是fckeditor，相信做web的应该都会听过。&lt;span id=&quot;more-974&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;替换supesite的编辑器，主要存在几个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Javascript代码的兼容性，引入ckeditor的js代码，是否会与网站原先的代码产生冲突？&lt;/li&gt;
&lt;li&gt;分页插入。supesite的分页机制较为特殊，与编辑器的结合比较紧密，它的各个分页都是存为一条数据库记录。引入新的编辑器对分页会有不小的影响。&lt;/li&gt;
&lt;li&gt;插入图片功能，supesite的图片上传组件是独立的，引入ckeditor的话需要跟ckeditor再进行融合。&lt;/li&gt;
&lt;li&gt;原有的编辑器的一些特殊功能，插入分页标志，远程下载图片，需要重写并融入ckeditor。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;逐一解决。&lt;/p&gt;
&lt;h3&gt;引入ckeditor&lt;/h3&gt;
&lt;p&gt;下载ckeditor，将整个目录放在supesite的目录下面。包不算很大吧，不过我还是删除了很多无用的语言文件，代码洁癖&amp;#8230;没办法&amp;#8230;&lt;/p&gt;
&lt;p&gt;修改 supesite/admin/tpl/header.htm，删除原有的editor的js的引入，引入ckeditor的代码。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&amp;lt;script language=&amp;#8221;javascript&amp;#8221; type=&amp;#8221;text/javascript&amp;#8221; src=&amp;#8221;ckeditor/ckeditor.js&amp;#8221;&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;修改supesite/admin/tpl/spacenews.htm，去掉原先的editor的编辑器的初始化代码，改为ckeditor的模式。&lt;/p&gt;
&lt;p&gt;原先是：&lt;/p&gt;
&lt;pre class=&quot;html&quot; title=&quot;code&quot;&gt;&amp;lt;div id=&quot;fulledit&quot;&amp;gt;&amp;lt;div id=&quot;message&quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script type=&quot;text/javascript&quot;&amp;gt;

function init() {

&amp;lt;!--{if checkperm('allowpostattach')}--&amp;gt;

et = new word(&quot;message&quot;, &quot;$thevalue[message]&quot;, 0, 1);

&amp;lt;!--{else}--&amp;gt;

et = new word(&quot;message&quot;, &quot;$thevalue[message]&quot;, 0, 3);

&amp;lt;!--{/if}--&amp;gt;

}

if(window.Event) {

window.onload = init;

} else {

init();

}

&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;改成：&lt;/p&gt;
&lt;pre class=&quot;js&quot; title=&quot;code&quot;&gt;&amp;lt;textarea cols=&quot;80&quot; id=&quot;message&quot; name=&quot;message&quot; rows=&quot;10&quot;&amp;gt;$thevalue[message]&amp;lt;/textarea&amp;gt;
 &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
 //&amp;lt;![CDATA[
 CKEDITOR.replace( 'message' );
 //]]&amp;gt;
 &amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;p&gt;OK，刷新下页面。。你就可能看到界面已经变成ckeditor了。华丽丽的ckeditor！同时，我所担心的Javascript兼容问题没有出现，看了ckeditor这方面的确做得相当不错。&lt;/p&gt;
&lt;p&gt;如果你需要的编辑功能很少，到这一步你基本上就可以结束了，基本的编辑功能都ok了。不过如果你是做资讯类的网站，需要大量使用编辑器的各项功能，那还是要做完整的替换修改方案。&lt;/p&gt;
&lt;h3&gt;插入图片功能&lt;/h3&gt;
&lt;p&gt;插入图片功能的实现，是在supesite/function/common.func.php中的getuploadinserthtml函数，因为编辑器的替换，原先的插入图片无法找到原来的编辑区域，所以，只需要将原有的插入代码改成插入到ckeditor的插入代码即可。这里涉及到了ckeditor的一些接口方法调用。&lt;/p&gt;
&lt;p&gt;原先的代码：&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;$inserthtml .= ' | &amp;lt;a href=&quot;javascript:;&quot; onClick=&quot;insertHtml(\''.shtmlspecialchars($thehtml).'\');return false;&quot;&amp;gt;'.($isimg?$lang['insert']:$lang['insert_attachments']).'&amp;lt;/a&amp;gt;';
 if(!empty($thehtmlsmallpic)) {
 $inserthtml .= ' | &amp;lt;a href=&quot;javascript:;&quot; onClick=&quot;insertHtml(\''.shtmlspecialchars($thehtmlsmallpic).'\');return false;&quot;&amp;gt;'.$lang['insertsmall'].'&amp;lt;/a&amp;gt;';
 }&lt;/pre&gt;
&lt;p&gt;修改后的代码：&lt;/p&gt;
&lt;pre class=&quot;php&quot; title=&quot;code&quot;&gt;$inserthtml .= ' | &amp;lt;a href=&quot;javascript:;&quot; onClick=&quot;CKEDITOR.instances.message.insertHtml(\''.shtmlspecialchars($thehtml).'\');return false;&quot;&amp;gt;'.($isimg?$lang['insert']:$lang['insert_attachments']).'&amp;lt;/a&amp;gt;';
 if(!empty($thehtmlsmallpic)) {
 $inserthtml .= ' | &amp;lt;a href=&quot;javascript:;&quot; onClick=&quot;CKEDITOR.instances.message.insertHtml(\''.shtmlspecialchars($thehtmlsmallpic).'\');return false;&quot;&amp;gt;'.$lang['insertsmall'].'&amp;lt;/a&amp;gt;';
 }&lt;/pre&gt;
&lt;p&gt;OK,搞定插入图片功能。&lt;/p&gt;
&lt;h3&gt;插入分页标志与远程下载图片功能&lt;/h3&gt;
&lt;p&gt;这2个功能的实现，就需要做ckeditor的插件开发了。&lt;/p&gt;
&lt;p&gt;未完待续。&lt;/p&gt;
&lt;p&gt;具体涉及的代码较多，有需要的同学可以邮箱联系我了解。fangyuqiang@gmail.com&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798608/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/974&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798608/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798608/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/974/feed</wfw:commentRss><slash:comments>0</slash:comments><description>Supesite的后台编辑器是ss自己写的，不怎么好用，尤其是查看源代码的功能，所有代码都粘在一起，没有格式化，根本看不了，跟discuz论坛的编辑器对比起来差距太大了，估计这个编辑器是comsenz早期出的东西，supesite一直没有更新，所以编辑器太古董了。最近有些受不了，决定将supesite的编辑器替换为业内目前流行的ckeditor，ckeditor的前身就是fckeditor，相信做web的应该都会听过。 替换supesite的编辑器，主要存在几个问题： Javascript代码的兼容性，引入ckeditor的js代码，是否会与网站原先的代码产生冲突？ 分页插入。supesite的分页机制较为特殊，与编辑器的结合比较紧密，它的各个分页都是存为一条数据库记录。引入新的编辑器对分页会有不小的影响。 插入图片功能，supesite的图片上传组件是独立的，引入ckeditor的话需要跟ckeditor再进行融合。 原有的编辑器的一些特殊功能，插入分页标志，远程下载图片，需要重写并融入ckeditor。 逐一解决。 引入ckeditor 下载ckeditor，将整个目录放在supesite的目录下面。包不算很大吧，不过我还是删除了很多无用的语言文件，代码洁癖&amp;#8230;没办法&amp;#8230; 修改 supesite/admin/tpl/header.htm，删除原有的editor的js的引入，引入ckeditor的代码。 &amp;#60;script language=&amp;#8221;javascript&amp;#8221; type=&amp;#8221;text/javascript&amp;#8221; src=&amp;#8221;ckeditor/ckeditor.js&amp;#8221;&amp;#62;&amp;#60;/script&amp;#62; 修改supesite/admin/tpl/spacenews.htm，去掉原先的editor的编辑器的初始化代码，改为ckeditor的模式。 原先是： &amp;#60;div id=&quot;fulledit&quot;&amp;#62;&amp;#60;div id=&quot;message&quot;&amp;#62;&amp;#60;/div&amp;#62;&amp;#60;/div&amp;#62; &amp;#60;script type=&quot;text/javascript&quot;&amp;#62; function init() { &amp;#60;!--{if checkperm('allowpostattach')}--&amp;#62; et = new word(&quot;message&quot;, &quot;$thevalue[message]&quot;, 0, 1); &amp;#60;!--{else}--&amp;#62; et = new word(&quot;message&quot;, &quot;$thevalue[message]&quot;, 0, 3); &amp;#60;!--{/if}--&amp;#62; } if(window.Event) { window.onload = init; } else { init(); } &amp;#60;/script&amp;#62; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/483798608/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/974&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798608/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798608/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>supesite</category><category>PHP</category><category>JavaScript</category><pubDate>Mon, 13 Sep 2010 10:37:16 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/974#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=974</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/974</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798608/5832870</fs:itemid></item><item><title>注意table的cellspacing</title><link>http://www.fangyuqiang.com/archives/970</link><content:encoded>&lt;p&gt;通过为表格定义border-collapse:collapse可以避免table的cellspacing在各个浏览器不一致的状况。&lt;/p&gt;
&lt;p&gt;应用以下的reset来定义表格，即可避免cellspacing带来的问题：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:WordDocument&gt; &lt;w:View&gt;Normal&lt;/w:View&gt; &lt;w:Zoom&gt;0&lt;/w:Zoom&gt; &lt;w:TrackMoves /&gt; &lt;w:TrackFormatting /&gt; &lt;w:PunctuationKerning /&gt; &lt;w:DrawingGridVerticalSpacing&gt;7.8 磅&lt;/w:DrawingGridVerticalSpacing&gt; &lt;w:DisplayHorizontalDrawingGridEvery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt; &lt;w:DisplayVerticalDrawingGridEvery&gt;2&lt;/w:DisplayVerticalDrawingGridEvery&gt; &lt;w:ValidateAgainstSchemas /&gt; &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt; &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt; &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt; &lt;w:DoNotPromoteQF /&gt; &lt;w:LidThemeOther&gt;EN-US&lt;/w:LidThemeOther&gt; &lt;w:LidThemeAsian&gt;ZH-CN&lt;/w:LidThemeAsian&gt; &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt; &lt;w:Compatibility&gt; &lt;w:SpaceForUL /&gt; &lt;w:BalanceSingleByteDoubleByteWidth /&gt; &lt;w:DoNotLeaveBackslashAlone /&gt; &lt;w:ULTrailSpace /&gt; &lt;w:DoNotExpandShiftReturn /&gt; &lt;w:AdjustLineHeightInTable /&gt; &lt;w:BreakWrappedTables /&gt; &lt;w:SnapToGridInCell /&gt; &lt;w:WrapTextWithPunct /&gt; &lt;w:UseAsianBreakRules /&gt; &lt;w:DontGrowAutofit /&gt; &lt;w:SplitPgBreakAndParaMark /&gt; &lt;w:DontVertAlignCellWithSp /&gt; &lt;w:DontBreakConstrainedForcedTables /&gt; &lt;w:DontVertAlignInTxbx /&gt; &lt;w:Word11KerningPairs /&gt; &lt;w:CachedColBalance /&gt; &lt;w:UseFELayout /&gt; &lt;/w:Compatibility&gt; &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt; &lt;m:mathPr&gt; &lt;m:mathFont m:val=&quot;Cambria Math&quot; /&gt; &lt;m:brkBin m:val=&quot;before&quot; /&gt; &lt;m:brkBinSub m:val=&quot;&amp;#45;-&quot; /&gt; &lt;m:smallFrac m:val=&quot;off&quot; /&gt; &lt;m:dispDef /&gt; &lt;m:lMargin m:val=&quot;0&quot; /&gt; &lt;m:rMargin m:val=&quot;0&quot; /&gt; &lt;m:defJc m:val=&quot;centerGroup&quot; /&gt; &lt;m:wrapIndent m:val=&quot;1440&quot; /&gt; &lt;m:intLim m:val=&quot;subSup&quot; /&gt; &lt;m:naryLim m:val=&quot;undOvr&quot; /&gt; &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:LatentStyles DefLockedState=&quot;false&quot; DefUnhideWhenUsed=&quot;true&quot;   DefSemiHidden=&quot;true&quot; DefQFormat=&quot;false&quot; DefPriority=&quot;99&quot;   LatentStyleCount=&quot;267&quot;&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;0&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Normal&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;heading 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 7&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 8&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;9&quot; QFormat=&quot;true&quot; Name=&quot;heading 9&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 7&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 8&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; Name=&quot;toc 9&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;35&quot; QFormat=&quot;true&quot; Name=&quot;caption&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;10&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Title&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; Name=&quot;Default Paragraph Font&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;11&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtitle&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;22&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Strong&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;20&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Emphasis&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;59&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Table Grid&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Placeholder Text&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;1&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;No Spacing&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; UnhideWhenUsed=&quot;false&quot; Name=&quot;Revision&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;34&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;List Paragraph&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;29&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Quote&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;30&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Quote&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 1&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 2&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 3&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 4&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 5&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;60&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Shading Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;61&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light List Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;62&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Light Grid Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;63&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 1 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;64&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Shading 2 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;65&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 1 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;66&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium List 2 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;67&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 1 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;68&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 2 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;69&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Medium Grid 3 Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;70&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Dark List Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;71&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Shading Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;72&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful List Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;73&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; Name=&quot;Colorful Grid Accent 6&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;19&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Emphasis&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;21&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Emphasis&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;31&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Subtle Reference&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;32&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Intense Reference&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;33&quot; SemiHidden=&quot;false&quot;    UnhideWhenUsed=&quot;false&quot; QFormat=&quot;true&quot; Name=&quot;Book Title&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;37&quot; Name=&quot;Bibliography&quot; /&gt; &lt;w:LsdException Locked=&quot;false&quot; Priority=&quot;39&quot; QFormat=&quot;true&quot; Name=&quot;TOC Heading&quot; /&gt; &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--  /* Font Definitions */  @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;} @font-face 	{font-family:&quot;Cambria Math&quot;; 	panose-1:2 4 5 3 5 4 6 3 2 4; 	mso-font-charset:1; 	mso-generic-font-family:roman; 	mso-font-format:other; 	mso-font-pitch:variable; 	mso-font-signature:0 0 0 0 0 0;} @font-face 	{font-family:微软雅黑; 	panose-1:2 11 5 3 2 2 4 2 2 4; 	mso-font-charset:134; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-2147483001 672087122 22 0 262175 0;} @font-face 	{font-family:&quot;\@微软雅黑&quot;; 	panose-1:2 11 5 3 2 2 4 2 2 4; 	mso-font-charset:134; 	mso-generic-font-family:swiss; 	mso-font-pitch:variable; 	mso-font-signature:-2147483001 672087122 22 0 262175 0;} @font-face 	{font-family:&quot;\@宋体&quot;; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 680460288 22 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-unhide:no; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	margin:0cm; 	margin-bottom:.0001pt; 	text-align:justify; 	text-justify:inter-ideograph; 	mso-pagination:none; 	font-size:10.5pt; 	mso-bidi-font-size:10.0pt; 	font-family:&quot;Times New Roman&quot;,&quot;serif&quot;; 	mso-fareast-font-family:宋体; 	mso-font-kerning:1.0pt;} .MsoChpDefault 	{mso-style-type:export-only; 	mso-default-props:yes; 	font-size:10.0pt; 	mso-ansi-font-size:10.0pt; 	mso-bidi-font-size:10.0pt; 	mso-ascii-font-family:&quot;Times New Roman&quot;; 	mso-fareast-font-family:宋体; 	mso-hansi-font-family:&quot;Times New Roman&quot;; 	mso-font-kerning:0pt;}  /* Page Definitions */  @page 	{mso-page-border-surround-header:no; 	mso-page-border-surround-footer:no;} @page WordSection1 	{size:612.0pt 792.0pt; 	margin:72.0pt 90.0pt 72.0pt 90.0pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.WordSection1 	{page:WordSection1;} --&gt;&lt;!--[if gte mso 10]&gt; &lt;mce:style&gt;&lt;!   /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-priority:99; 	mso-style-qformat:yes; 	mso-style-parent:&quot;&quot;; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.5pt; 	mso-bidi-font-size:11.0pt; 	font-family:&quot;Calibri&quot;,&quot;sans-serif&quot;; 	mso-ascii-font-family:Calibri; 	mso-ascii-theme-font:minor-latin; 	mso-fareast-font-family:宋体; 	mso-fareast-theme-font:minor-fareast; 	mso-hansi-font-family:Calibri; 	mso-hansi-theme-font:minor-latin; 	mso-bidi-font-family:&quot;Times New Roman&quot;; 	mso-bidi-theme-font:minor-bidi; 	mso-font-kerning:1.0pt;} --&gt; &lt;!--[endif]--&gt;table{border:0;margin:0;border-collapse:collapse;} table th, table td{padding:0;}&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;在《&lt;a href=&quot;http://www.fangyuqiang.com/archives/548&quot;&gt;一些冷门但是关键时刻很有用的html标签与属性&lt;/a&gt;》这篇文章，我就提到过，table的cellspacing属性，是无法通过css来控制的。。今天碰到一个界面的问题，ff下面界面对得很整齐，但是IE下总是高出一截，无论设置td的高度如何，总是会多出那么一截出来。&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-970&quot;&gt;&lt;/span&gt;后来想起来自己曾经整理过的这篇文章，想起来table的cellspacing属性无法通过css来控制，那也就是说原先网站采用的reset.css并不能保证各个样式都一样的。。偏偏IE跟FF这些浏览器默认的cellspacing的值不一样，导致表格在不设置cellspacing的时候样子总是不同。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;table标签上经常可以看到cellspacing属性与cellpadding属性，还有border。虽然这些是控制外观的属性，但是它们是名正言 顺的标准属性，可以放心用。一般都建议采用css来控制表格样式。但是有个特殊的地方，&lt;strong&gt;cellspacing属性是无法通过css来控 制的&lt;/strong&gt;。所以cellspacing只能在table里直接指定。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;所以，应用表格的时候，一定需要写上&amp;lt;table cellspacing=&amp;#8221;0&amp;#8243;&amp;gt;，至于其他reset的css，就会通用了。&lt;/p&gt;
&lt;div id=&quot;_mcePaste&quot; style=&quot;position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;&quot;&gt;border-collapse:collapse&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/483798609/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/970&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798609/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798609/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.fangyuqiang.com/archives/970/feed</wfw:commentRss><slash:comments>0</slash:comments><description>通过为表格定义border-collapse:collapse可以避免table的cellspacing在各个浏览器不一致的状况。 应用以下的reset来定义表格，即可避免cellspacing带来的问题： table{border:0;margin:0;border-collapse:collapse;} table th, table td{padding:0;} 在《一些冷门但是关键时刻很有用的html标签与属性》这篇文章，我就提到过，table的cellspacing属性，是无法通过css来控制的。。今天碰到一个界面的问题，ff下面界面对得很整齐，但是IE下总是高出一截，无论设置td的高度如何，总是会多出那么一截出来。 后来想起来自己曾经整理过的这篇文章，想起来table的cellspacing属性无法通过css来控制，那也就是说原先网站采用的reset.css并不能保证各个样式都一样的。。偏偏IE跟FF这些浏览器默认的cellspacing的值不一样，导致表格在不设置cellspacing的时候样子总是不同。 table标签上经常可以看到cellspacing属性与cellpadding属性，还有border。虽然这些是控制外观的属性，但是它们是名正言 顺的标准属性，可以放心用。一般都建议采用css来控制表格样式。但是有个特殊的地方，cellspacing属性是无法通过css来控 制的。所以cellspacing只能在table里直接指定。 所以，应用表格的时候，一定需要写上&amp;#60;table cellspacing=&amp;#8221;0&amp;#8243;&amp;#62;，至于其他reset的css，就会通用了。 border-collapse:collapse&lt;img src=&quot;http://www1.feedsky.com/t1/483798609/fangyuqiang/feedsky/s.gif?r=http://www.fangyuqiang.com/archives/970&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;&lt;p class=&quot;fswww1&quot;&gt;&lt;a href=&quot;http://www1.feedsky.com/r/l/feedsky/fangyuqiang/483798609/art01.html&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; ismap=&quot;ismap&quot; src=&quot;http://www1.feedsky.com/r/i/feedsky/fangyuqiang/483798609/art01.gif&quot; onerror=&quot;this.style.display='none'&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description><category>Html+CSS</category><pubDate>Wed, 01 Sep 2010 17:06:13 +0800</pubDate><author>fangyuqiang</author><comments>http://www.fangyuqiang.com/archives/970#comments</comments><guid isPermaLink="false">http://www.fangyuqiang.com/?p=970</guid><dc:creator>fangyuqiang</dc:creator><fs:srclink>http://www.fangyuqiang.com/archives/970</fs:srclink><fs:srcfeed>http://www.fangyuqiang.com/feed</fs:srcfeed><fs:itemid>feedsky/fangyuqiang/~7723697/483798609/5832870</fs:itemid></item></channel></rss>
