Archive for the ‘web’ Category

PHP:set_error_handler ……need more

Saturday, September 29th, 2007

本来想自己写个 处理的 logger 结果发现通过 set_error_handler 没办法捕获到 fatal & parse 唉,真愁人呐。

.net 上也没有找到办法,后来反到是在 zend.com 上找到了解决 catch fatal 的办法就是在 auto_prepend_file 和 auto_append_file 上做手脚。

prepend 的文件里面有一个 string 里面是个 page 的 包括一个 script 可以把错误信息发送到 的一个 api 上。

而在 append 的文件里通过 ob_get_contents() 来把那个 string 给去掉,如果能去掉就说明程序中间的执行流程正确,无错,如果有 fatal 则没有办法到达 append 文件这步,所以会显示那个 页面。

方法还可以,但是因为每个 都要 prepend & append 可能效率会不行,和 Xuanyan 讨论了一小会暂时还是没有什么好办法来捕获 fatal & parse

:(

[php5]静态类比全局数组快

Wednesday, July 4th, 2007

好吧,我承认,标题是有点误导人了……

第一种测试方法:

<?
/**
 * @date : Wed Jul 04 11:34:00 CST 2007 11:34:00
 * @author : Deng Wei <dengwei@gmail.com>
 * @package : test
 * @version : $Rev$
 * @info : $Id$
 */

$sth_like_config = array(
 ’a' => 1,
 ’b' => 2,
);

function get_config_a()
{
 global $sth_like_config;
 foreach ( range(1,10000) as $i )
 {
  $b = $sth_like_config['a'];
 }
}

StaticConfig
{
 public static $sth_like_config = array(
  ’a' => 1,
  ’b' => 2,
 );
}

function microtime_float()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}

/**
 * start test
 */

$s = microtime_float();
get_config_a();
echo microtime_float()-$s;
echo "\n";

$s = microtime_float();
foreach ( range(1,10000) as $i )
{
 $b = StaticConfig::$sth_like_config['a'];
}
echo microtime_float()-$s;
echo "\n";

?>

结果:

0.15xxxxxxxx
0.18xxxxxxxxx

按上面这种方式测试的话是数组比静态类快,原因是我们在函数里调用的全局数组,只用了 global 一次,在同一作用域下变量比类快,这是一定的。但是在实际环境里,比如我们的配置数组经常要在一些函数里用,那么就会有多次 global 声明,让我们换一种方式测试。

测试方法二:

<?
/**
 * @date : Wed Jul 04 11:34:00 CST 2007 11:34:00
 * @author : Deng Wei <dengwei@gmail.com>
 * @package : test
 * @version : $Rev$
 * @info : $Id$
 */

$sth_like_config = array(
 ’a' => 1,
 ’b' => 2,
);

function get_config_a()
{
 global $sth_like_config;
 return $sth_like_config['a'];
}

StaticConfig
{
 public static $sth_like_config = array(
  ’a' => 1,
  ’b' => 2,
 );
}

function microtime_float()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}

/**
 * start test
 */

$s = microtime_float();
foreach ( range(1,10000) as $i )
{
 $b = get_config_a();
}
echo microtime_float()-$s;
echo "\n";

$s = microtime_float();
foreach ( range(1,10000) as $i )
{
 $b = StaticConfig::$sth_like_config['a'];
}
echo microtime_float()-$s;
echo "\n";

?>

结果:

0.51952910423279
0.18489503860474

可见 global 有多慢了,并且我们经常还会因为一些原因忘记写他,所以我的“建议”是把一些全局变量都放到静态类里,这样还用的时候就不用一直记着去 global 声明了,并且通过类来访问,我们还可以对访问进行一些控制。:)

不知道您是怎么想?我现在是把配置信息都放到静态类里了。终于告别了“global”~!

做网站的一些定律

Friday, March 30th, 2007

1.250定律

拉德认为:每一位顾客身后,大体有250名亲朋好友。如果您赢得了一位顾客的好感,就意味着赢得了250个人的好感;反之,如果你得罪了一名顾客,也就意味着得罪了250 名顾客。   在你的网站访客中,一个访客可能可以带来一群访客,任何网站都有起步和发展的过程,这个过程中此定律尤其重要。

2.达维多定律

达维多认为,一个企业要想在市场上总是占据主导地位,那么就要做到第一个开发出新产品,又第一个淘汰自己的老产品。   国内网站跟风太严重,比如前段时间的格子网,乞讨网,博客网,一个成功了,大家一拥而上。但实际效果是,第一个出名的往往最成功,所以在网站的定位上,要动自己的脑筋,不是去捡人家剩下的客户。同理,买人家出售的数据来建站效果是很糟糕的。

3.木桶定律

水桶定律是指,一只水桶能装多少水,完全取决于它最短的那块木板。这就是说任何一个组织都可能面临的一个共同问题,即构成组织的各个部分往往决定了整个组织的水平。   注意审视自己的网站,是速度最糟糕?美工最糟糕?宣传最糟糕?你首先要做的,不是改进你最强的,而应该是你最薄弱的。

4.马太效应

《新约》中有这样一个故事,一个国王远行前,交给三个仆人每人一锭银子,吩咐他们:“你们去做生意,等我回来时,再来见我。”国王回来时,第一个仆人说: “主人,你交给我们的一锭银子,我已赚了10锭。”于是国王奖励他10座城邑。第二个仆人报告说:“主人,你给我的一锭银子,我已赚了5锭。” 于是国王例奖励了他5座城邑。第三个仆人报告说:“主人,你给我的一锭银子,我一直包在手巾里存着,我怕丢失,一直没有拿出来。”于是国王命令将第三个仆人的一锭银子也赏给第一个仆人,并且说:“凡是少的,就连他所有的也要夺过来。凡是多的,还要给他,叫他多多益善。”这就是马太效应。   在同类网站中,马太效应是很明显的。一个出名的社区,比一个新建的社区,更容易吸引到新客户。启示是,如果你无法把网站做大,那么你要做专。作专之后再做大就更容易。

5.手表定理

手表定理是指一个人有一只表时,可以知道现在是几点钟,而当他同时拥有两只表时却无法确定。
一个网站,你只需要关注你特定的用户群需求。不要在意不相干人的看法。

6.不值得定律

不值得定律:不值得做的事情,就不值得做好   不要过度seo,如果你不是想只做垃圾站。不要把时间浪费在美化再美化页面,优化再优化程序,在你网站能盈利后,这些事情可以交给技术人员完成。

7.彼得原理

劳伦斯.彼得认为:在各种组织中,由于习惯于对在某个等级上称职的人员进行晋升提拔,因而雇员总是趋向于晋升到其不称职的地位。
不要轻易改变自己网站的定位。如博客网想变门户,盛大想做娱乐,大家拭目以待吧。

8.零和游戏原理

当你看到两位对弈者时,你就可以说他们正在玩“零和游戏”。因为在大多数情况下, 总会有一个赢,一个输,如果我们把获胜计算为得1分,而输棋为-1分,那么,这两人得分之和就是:1+(-1)=0   不要把目光一直盯在你的竞争网站上,不要花太多时间抢它的访客。我们把这些时间用来寻找互补的合作网站,挖掘新访客。

9.华盛顿合作规律

华盛顿合作规律说的是: 一个人敷衍了事,两个人互相推诿, 三个人则永无成事之日。
如果你看准一个方向,你自己干,缺人手就招。不要轻易找同伴一起搞网站,否则你会发现,日子似乎越过越快了,事情越做越慢了。

10.邦尼人力定律

一个人一分钟可以挖一个洞,六十个人一秒种却挖不了一个洞。合作是一个问题,如何合作也是一个问题。你需要有计划。

11.牛蛙效应

把一只牛蛙放在开水锅里,牛蛙会很快跳出来;但当你把它放在冷水里,它不会跳出来,然后慢慢加热,起初牛蛙出于懒惰,不会有什么动作,当水温高到它无法忍受的时候,想出来,但已经没有了力气。   如果你是soho,注意关注你的财务。不要等到没钱了再想怎么挣,你会发现那时候挣钱更难。

12.蘑菇管理

蘑菇管理是许多组织对待初出茅庐者的一种管理方法,初学者被置于阴暗的角落(不受重视的部门,或打杂跑腿的工作),浇上一头大粪(无端的批评、指责、代人受过),任其自生自灭(得不到必要的指导和提携)。
  做网站毕竟要遭遇这样的阶段,搜索引擎不理你,友情链接找不到,访客不上门。这是磨练。

13.奥卡姆剃刀定律

如无必要,勿增实体。
把网站做得简单,再简单,简单到非常实用,而不是花俏。google的首页为什么比雅虎好?

14.巴莱多定律(Paredo 也叫二八定律)

你所完成的工作里80%的成果,来自于你20%的付出;而80%的付出,只换来20%的成果。
随时衡量你所做的工作,哪些是最有效果的。

1.马蝇效应

林肯少年时和他的兄弟在肯塔基老家的一个农场里犁玉米地,林肯吆马,他兄弟扶犁,而那匹马很懒,慢慢腾腾,走走停停。可是有一段时间马走得飞快。 林肯感到奇怪,到了地头,他发现有一只很大的马蝇叮在马身上,他就把马蝇打落了。看到马蝇被打落了,他兄弟就抱怨说:”哎呀,你为什么要打掉它,正是那家伙使马跑起来的嘛!”   在你心满意足的时候,去寻找你的马蝇。没有firefox,不会有ie7,firefox就是微软的马蝇之一。马蝇不可怕,怕的是会一口吃掉你的东西,像 ie当初对网景干的那样。

2.最高气温效应

每天最热总是下午2 时左右,我们总认为这个时候太阳最厉害,其实这时的太阳早已偏西,不再是供给最大热量的时候了。此时气温之所以最高,不过是源于此前的热量积累。
你今天的网站流量,是你一个星期或更长时间前所做的事带来的。

3.超限效应(溢出效应)

刺激过多、过强和作用时间过久而引起心理极不耐烦或反抗的心理现象,称之为“超限效应”。 别到别人论坛里发太多广告。别在自己网站上放太多广告。别在自己的论坛里太多地太明显地诱导话题。

4.懒蚂蚁效应

生物学家研究发现,成群的蚂蚁中,大部分蚂蚁很勤劳,寻找、搬运食物争先恐后,少数蚂蚁却东张西望不干活。当食物来源断绝或蚁窝被破坏时,那些勤快的蚂蚁一筹莫展。“懒蚂蚁”则“挺身而出”,带领众伙伴向它早已侦察到的新的食物源转移。   不要把注意力仅仅放在一个网站上,即使这个网站现在为你带来一切。你要给自己一些时间寻找新的可行的方向,以备万一。

5.长尾理论

ChrisAnderson认为,只要存储和流通的渠道足够大,需求不旺或销量不佳的产品共同占据的市场份额就可以和那些数量不多的热卖品所占据的市场份额相匹敌甚至更大。   对于搜索引擎,未必你需要一个热门词排在第一位,如果有一千个冷门词排在第一位,效果不但一样,还会更稳定更长远。

6.破窗理论

栋建筑上的一块玻璃,又没有及时修好,别人就可能受到某些暗示性的纵容,去打碎更多的玻璃。   管理论坛时,如果你发现第一个垃圾贴,赶紧删掉他吧。想想:落伍现在为什么那么多××贴?现在控制比最初控制难多了。

7.“羊群效应”,又称复制原则(Copy Strategy)

一个羊群(集体)是一个很散乱的组织,平时大家在一起盲目地左冲右撞。如果一头羊发现了一片肥沃的绿草地,并在那里吃到了新鲜的青草,后来的羊群就会一哄而上,争抢那里的青草,全然不顾旁边虎视眈眈的狼,或者看不到其它地方还有更好的青草。
不要轻易跟风,保持自己思考的能力。

8.墨菲定律

如果坏事情有可能发生,不管这种可能性多么小,它总会发生,并引起最大可能的损失。
除非垃圾站,否则不要作弊,对搜索引擎不要,对广告也不要。

9.光环效应

人们对人的某种品质或特点有清晰的知觉,印象比较深刻、突出, 这种强烈的知觉, 就像月晕形式的光环一样,向周围弥漫、扩散,掩盖了对这个人的其他品质或特点的认识。
不要轻易崇拜一个人或者公司、一个概念、一种做法。

10.蝴蝶效应

一只亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,两周后,可能在美国德克萨斯州引起一场龙卷风。
不管你做什么,网站或者其他,你都应该关注新闻。机遇或者灾难可能就在那。

11.阿尔巴德定理

一个企业经营成功与否,全靠对顾客的要求了解到什么程度。   我赞同别人的点评:看到了别人的需要,你就成功了一半;满足了别人的需求,你就成功了全部。尤其是做网站。

12.史密斯原则

如果你不能战胜他们,你就加入到他们之中去。  
不要试图做孤胆英雄。如果潮流挡不住,至少,你要去思考为什么。

网站上线喽

Wednesday, January 31st, 2007

这就是我前一段时间一直在做的东东 http://www1.uusee.com

个人定制那里挺费脑细胞,还好搞定了。

:)

启发式评估

Friday, December 29th, 2006

什么是启发式评估?
启发式评估是专家评审法的一种,就是让几个评审人员根据一些通用的可用性原则和自己的经验来发现系统内潜在的可用性问题。每一个评审人员可以发现35%的可用性问题,而5个评审人员能找到大约75%的可用性问题。

启发式评估该选择由什么样的人来进行?
启发式评估是专家评审法的一种,选用具有可用性知识或选用具有和被测试系统相关专业知识的“专家”,具有以上两种知识的人是最合适人选,他能多发现约20%的可用性问题。

启发式评估如何进行?
每一个评审人员进行1-2小时的使用系统,之后提供一份独立的报告,在报告中应包括可用性问题的描述,问题的严重性以及改进的建议。

启发式评估的通用准则
 •Visibility of system status.可视性原则
 •Match between system and real world.系统应符合用户的真实世界
 •User control and freedom.用户有自由控制权
 •Consistency.一致性原则
 • strategy.有预防用户出错的措施
 •Recognition rather than recall.要在第一时间让用户看到
 •Flexibility and efficiency of use.使用起来灵活且高效
 •Aesthetics and minialist design.易读性
 •Help users recognize, diagnose, and recover from errors.给用户明确的错误信息,并协助用户方便的从错误中恢复工作
•Help and Documentation.必要的帮助提示与说明文档

附:普渡大学可用性测试检查表
使用说明:本调查表共有100题,回答每一个问题时按照以后三个步骤:
(a)请评估每一个问题是否适用于所评审的系统。如果不适用,跳到下一题。如果适用,请继续回答。
(b)对于所评估的系统,请评价该问题的重要性(1是最不重要的,3是最重要的)
(c)评价系统在该问题上的表现(1是非常糟糕,7是非常好),如果不存在,请选择不存在项
1.兼容性
 1)光标的控制是否符合光标的移动?
 2)用户控制的结果是否符合用户的期望?
 3)所提供的控制是否符合用户的技能水平?
 4)界面的编码(例如,颜色、形状等)是否为用户所熟悉?
 5)用词是否为用户所熟悉?
2.一致性
 6)界面颜色的编码是否符合常规?
 7)编码是否在不同的显示及菜单上都保持一致?
 8)光标的位置是否一致?
 9)显示的格式是否一致?
 10)反馈信息是否一致?
 11)数据字段的格式是否一致?
 12)标号的格式是否一致?
 13)标号的位置是否一致?
 14)标号本身是否一致?
 15)显示的方向是否一致?(漫游或卷动)
 16)系统要求的用户动作是否一致?
 17)在不同的显示中用词是否一致?
 18)数据显示和数据输入的要求是否一致?
 19)数据显示是否符合用户的常规?
 20)图形数据的符号是否符合标准?
 21)菜单的用词和命令语言是否一致?
 22)用词是否符合用户指导的原则?
3. 灵活性
 23)是否可以使用命令语言而绕过菜单的选择?
 24)系统是否有直接操作的功能?
 25)数据输入的设计是否灵活?
 26)用户是否可以灵活地控制显示?
 27)系统是否提供了灵活的流程控制?
 28)系统是否提供了灵活的用户指导?
 29)菜单选项是否前后相关?
 30)用户是否可以根据他们的需要来命名显示和界面单元?
 31)系统是否为不同的用户提供了好的训练?
 32)用户是否可以自己改变视窗?
 33)用户是否可以自己命名系统命令?
 34)系统是否允许用户选择需要显示的数据?
 35)系统是否可以提供用户指定的视窗?
 36)为了扩展显示功能,系统是否提供放大的功能?
4. 可学习性
 37)用词是否清晰?
 38)数据是否有合理的分类,易于学习?
 39)命令语言是否有层次?
 40)菜单的分组是否合理?
 41)菜单的顺利是否合理?
 42)命令的名字是否有意义?
 43)系统是否提供了无惩罚的学习?
5. 极少化的用户动作
 44)系统是否为相关的数据提供了组合输入的功能?
 45)必要的数据是否只需要输入一次?
 46)系统是否提供了默认值?
 47)视窗之间的切换是否容易?
 48)系统是否为经常使用的控制提供了功能键?
 49)系统是否有全局搜索和替代的功能?
 50)菜单的选择是否可以使用点击的功能?(主要的流程控制方法)
 51)菜单的选择是否可以使用键入的功能?(辅助的控制方法)
 52)系统是否要求极少的光标定位?
 53)在选择菜单时,系统是否要求极少的步骤?
 54)系统是否要求极少的用户控制动作?
 55)为了退到更高一级菜单中,系统是否只需要一个简单的键入动作?
 56)为了退到一般的菜单中,系统是否只需要一个简单的键入动作?
6. 极小的记忆负担
 57)系统是否使用了缩写?
 58)系统是否为输入分层次的数据提供了帮助?
 59)指导信息是否总是可以得到的?
 60)系统是否为序列的选择提供了分层次的菜单?
 61)被选的数据是否有突出显示?
 62)系统是否为命令提供了索引?
 63)系统是否为数据提供了索引?
 64)系统是否提示在菜单结构中的当前位置?
 65)数据是否保存简短?
 66)为选择菜单使用的字母代码是否经过认真的设计?
 67)是否将长的数据分成不同的部分?
 68)先前的答案是否可以简便的再利用?
 69)字母大小写是否等同?
 70)系统是否使用短的代码而不使用长的代码?
 71)图符是否有辅助性的字符标号?
7. 知觉的有限性
 72)系统是否为不同的数据类别提供不同的编码?
 73)缩写是否清晰而相互不同?
 74)光标是否不同?
 75)界面单元是否清晰?
 76)用户指导的格式是否清晰?
 77)命令是否有清晰的意义?
 78)命令的拼写是否清晰?
 79)系统是否使用了易于分辨的颜色?
 80)目前活动的窗口是否有清楚的标识?
 81)为了直接比较,数据是否成对的摆在一起?
 82)是否限制语音信息使用的数量?
 83)系统是否提供了一系列相关信息?
 84)菜单是否和其他的显示信息有明显的区别?
 85)颜色的编码是否多余?
 86)系统是否提供了视觉上清晰可辨的数据字段?
 87)不同组的信息是否明显分开?
 88)屏幕的密度是否合理?
8. 用户指导
 89)系统反馈的错误信息是否有用?
 90)系统是否提供了“取消”的功能?
 91)错误的输入是否被显示出来?
 92)系统是否提供了明确的改正错误的方法?
 93)系统是否为控件输入提供了反馈?
 94)是否提供了“帮助”
 95)一个过程的结束是否标志清楚?
 96)是否对重复的错误有提示?
 97)错误信息是否具有建设性并提供有用的信息?
 98)系统是否提供了“重新开始”的功能?
 99)系统是否提供了“撤销”的功能?
 100)用户是否启动流程控制?

转自:http://www.dtell.net/article.asp?id=37

PHP On Rails

Friday, December 8th, 2006

这两天看了几本 On Rails 的书,后来在网上搜索时发现原来 也有 Rails 的东西,比如 Symfony、CakePHP 和国人开发的 FleaPHP 都很不错。

:)

不过因为封装得太多了,以至于程序运行效率有些下降,但是比起其它的语言还是很快。

网页 Meta 标记全面介绍

Wednesday, November 29th, 2006

META标签是语言HEAD区的一个辅助性标签,它位于文档头部的<HEAD>标记和<TITLE>标记之间,它提供用户不可见的信息。meta标签通常用来为搜索引擎robots定义页面主题,或者是定义用户浏览器上的cookie;它可以用于鉴别作者,设定页面格式,标注内容提要和关键字;还可以设置页面使其可以根据你定义的时间间隔刷新自己,以及设置RASC内容等级,等等。
下面介绍一些有关 标记的例子及解释。
  META标签分两大部分:HTTP标题信息(HTTP-EQUIV)和页面描述信息(NAME)。
※ HTTP-EQUIV
  HTTP-EQUIV类似于HTTP的头部协议,它回应给浏览器一些有用的信息,以帮助正确和精确地显示网页内容。常用的HTTP-EQUIV类型有:
  1、Content-Type和Content-Language (显示字符集的设定)
  说明:设定页面使用的字符集,用以说明主页制作所使用的文字已经语言,浏览器会根据此来调用相应的字符集显示page内容。
  用法:<Meta http-equiv="Content-Type" Content="text/; Charset=gb2312">
      <Meta http-equiv="Content-Language" Content="zh-CN">
  注意: 该META标签定义了页面所使用的字符集为GB2132,就是国标汉字码。如果将其中的“charset=GB2312”替换成“BIG5”,则该页面所用的字符集就是繁体中文Big5码。当你浏览一些国外的站点时,IE浏览器会提示你要正确显示该页面需要下载xx语支持。这个功能就是通过读取页面META标签的Content-Type属性而得知需要使用哪种字符集显示该页面的。如果系统里没有装相应的字符集,则IE就提示下载。其他的语言也对应不同的charset,比如日文的字符集是“iso-2022-jp ”,韩文的是“ks_c_5601”。
  Content-Type的Content还可以是:text/xml等文档类型;
  Charset选项:ISO-8859-1(英文)、BIG5、UTF-8、SHIFT-Jis、Euc、Koi8-2、us-ascii, x-mac-roman, iso-8859-2, x-mac-ce, iso-2022-jp, x-sjis, x-euc-jp,euc-kr, iso-2022-kr, gb2312, gb_2312-80, x-euc-tw, x-cns11643-1,x-cns11643-2等字符集;Content-Language的Content还可以是:EN、FR等语言代码。
  2、Refresh (刷新)
   说明:让网页多长时间(秒)刷新自己,或在多长时间后让网页自动链接到其它网页。
   用法:<Meta http-equiv="Refresh" Content="30">
      <Meta http-equiv="Refresh" Content="5; Url=http://www.xia8.net">
   注意:其中的5是指停留5秒钟后自动刷新到URL网址。
  3、Expires (期限)
   说明:指定网页在缓存中的过期时间,一旦网页过期,必须到服务器上重新调阅。
   用法:<Meta http-equiv="Expires" Content="0">
      <Meta http-equiv="Expires" Content="Wed, 26 Feb 1997 08:21:57 GMT">
   注意:必须使用GMT的时间格式,或直接设为0(数字表示多少时间后过期)。
  4、Pragma (cach模式)
   说明:禁止浏览器从本地机的缓存中调阅页面内容。
   用法:<Meta http-equiv="Pragma" Content="No-cach">
   注意:网页不保存在缓存中,每次访问都刷新页面。这样设定,访问者将无法脱机浏览。
  5、Set-Cookie (cookie设定)
  说明:浏览器访问某个页面时会将它存在缓存中,下次再次访问时就可从缓存中读取,以提高速度。

当你希望访问者每次都刷新你广告的图标,或每次都刷新你的计数器,就要禁用缓存了。通常文件没有必要禁用缓存,对于ASP等页面,就可以使用禁用缓存,因为每次看到的页面都是在服务器动态生成的,缓存就失去意义。如果网页过期,那么存盘的cookie将被删除。
   用法:<Meta http-equiv="Set-Cookie" Content="cookievalue=xxx; expires=Wednesday, 21-Oct-98 16:14:21 GMT; path=/">
   注意:必须使用GMT的时间格式。
  6、Window-target (显示窗口的设定)
   说明:强制页面在当前窗口以独立页面显示。
   用法:<Meta http-equiv="Widow-target" Content="_top">
   注意:这个属性是用来防止别人在框架里调用你的页面。Content选项:_blank、_top、_self、_parent。
  7、Pics-label (网页RSAC等级评定)
   说明:在IE的Internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过该参数来设置的。
   用法:<META http-equiv="Pics-label" Contect="(PICS-1.1′http://www.rsac.org/ratingsv01.’ I gen comment ‘RSACi North America Sever’ by ‘inet@microsoft.com’ for ‘http://www.microsoft.com’ on ‘1997.06.30T14:21-0500′ r(n0 s0 v0 l0))">
   注意:不要将级别设置的太高。RSAC的评估系统提供了一种用来评价站点内容的标准。用户可以设置Microsoft Internet Explorer(IE3.0以上)来排除包含有色情和暴力内容的站点。上面这个例子中的取自Microsoft的主页。代码中的(n 0 s 0 v 0 l 0)表示该站点不包含不健康内容。级别的评定是由RSAC,即美国娱乐委员会的评级机构评定的,如果你想进一步了解RSAC评估系统的等级内容,或者你需要评价自己的网站,可以访问RSAC的站点:http://www.rsac.org/
  8、Page-Enter、Page-Exit (进入与退出)
   说明:这个是页面被载入和调出时的一些特效。
   用法:<Meta http-equiv="Page-Enter" Content="blendTrans(Duration=0.5)">
      <Meta http-equiv="Page-Exit" Content="blendTrans(Duration=0.5)">
   注意:blendTrans是动态滤镜的一种,产生渐隐效果。另一种动态滤镜RevealTrans也可以用于页面进入与退出效果:
      <Meta http-equiv="Page-Enter" Content="revealTrans(duration=x,transition=y)">
      <Meta http-equiv="Page-Exit" Content="revealTrans(duration=x,ransition=y)">
       Duration  表示滤镜特效的持续时间(单位:秒)
       Transition 滤镜类型。表示使用哪种特效,取值为0-23。
       0 矩形缩小       1 矩形扩大
       2 圆形缩小       3 圆形扩大
       4 下到上刷新       5 上到下刷新
       6 左到右刷新       7 右到左刷新
       8 竖百叶窗       9 横百叶窗
       10 错位横百叶窗       11 错位竖百叶窗
       12 点扩散       13 左右到中间刷新
       14 中间到左右刷新       15 中间到上下
       16 上下到中间       17 右下到左上
       18 右上到左下       19 左上到右下
       20 左下到右上       21 横条
       22 竖条       23 以上22种随机选择一种
  9、MSThemeCompatible (XP主题)
   说明:是否在IE中关闭 xp 的主题
   用法:<Meta http-equiv="MSThemeCompatible" Content="Yes">
   注意:关闭 xp 的蓝色立体按钮系统显示样式,从而和win2k 很象。
  10、IE6 (页面生成器)
   说明:页面生成器generator,是ie6
   用法:<Meta http-equiv="IE6" Content="Generator">
   注意:用什么东西做的,类似商品出厂厂商。
  11、Content-Script-Type (脚本相关)
   说明:这是近来W3C的规范,指明页面中脚本的类型。
   用法:<Meta http-equiv="Content-Script-Type" Content="text/">
   注意:
※NAME变量
  name是描述网页的,对应于Content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。
  name的value值(name="")指定所提供信息的类型。有些值是已经定义好的。例如description(说明)、keyword(关键字)、refresh(刷新)等。还可以指定其他任意值,如:creationdate(创建日期) 、document ID(文档编号)和level(等级)等。
  name的content指定实际内容。如:如果指定level(等级)为value(值),则Content可能是beginner(初级)、intermediate(中级)、advanced(高级)。
  1、Keywords (关键字)
   说明:为搜索引擎提供的关键字列表
   用法:<Meta name="Keywords" Content="关键词1,关键词2,关键词3,关键词4,……">
   注意:各关键词间用英文逗号“,”隔开。META的通常用处是指定搜索引擎用来提高搜索质量的关键词。当数个META元素提供文档语言从属信息时,搜索引擎会使用lang特性来过滤并通过用户的语言优先参照来显示搜索结果。例如:
      <Meta name="Kyewords" Lang="EN" Content="vacation,greece,sunshine">
      <Meta name="Kyewords" Lang="FR" Content="vacances,grè:ce,soleil">
  2、Description (简介)
   说明:Description用来告诉搜索引擎你的网站主要内容。
   用法:<Meta name="Description" Content="你网页的简述">
   注意:
  3、Robots (机器人向导)
   说明:Robots用来告诉搜索机器人哪些页面需要索引,哪些页面不需要索引。Content的参数有all、none、index、noindex、follow、nofollow。默认是all。
   用法:<Meta name="Robots" Content="All|None|Index|Noindex|Follow|Nofollow">
   注意:许多搜索引擎都通过放出robot/spider搜索来登录网站,这些robot/spider就要用到meta元素的一些特性来决定怎样登录。
    all:文件将被检索,且页面上的链接可以被查询;
    none:文件将不被检索,且页面上的链接不可以被查询;(和 "noindex, no follow" 起相同作用)
    index:文件将被检索;(让robot/spider登录)
    follow:页面上的链接可以被查询;
    noindex:文件将不被检索,但页面上的链接可以被查询;(不让robot/spider登录)
   nofollow:文件将不被检索,页面上的链接可以被查询。(不让robot/spider顺着此页的连接往下探找)
  4、Author (作者)
   说明:标注网页的作者或制作组
   用法:<Meta name="Author" Content="张三,abc@sohu.com">
   注意:Content可以是:你或你的制作组的名字,或Email
  5、Copyright (版权)
   说明:标注版权
   用法:<Meta name="Copyright" Content="本页版权归Zerospace所有。All Rights Reserved">
   注意:
  6、Generator (编辑器)
   说明:编辑器的说明
   用法:<Meta name="Generator" Content="PCDATA|FrontPage|">
   注意:Content="你所用编辑器"
  7、revisit-after (重访)
   说明:
   用法:<META name="revisit-after" CONTENT="7 days" >
   注意:
※Head中的其它一些用法
  1、scheme (方案)
   说明:scheme can be used when name is used to specify how the value of content should
      be interpreted.
   用法:<meta scheme="ISBN" name="identifier" content="0-14-043205-1" />
   注意:
  2、Link (链接)
   说明:链接到文件
   用法:<Link href="soim.ico" rel="Shortcut Icon">
   注意:很多网站如果你把她保存在收件夹中后,会发现它连带着一个小图标,如果再次点击进入之后还会发现地址栏中也有个小图标。现在只要在你的页头加上这段话,就能轻松实现这一功能。<LINK> 用来将目前文件与其它 URL 作连结,但不会有连结按钮,用於 <HEAD> 标记间, 格式如下:
       <link href="URL" rel="relationship">
       <link href="URL" rev="relationship">
  3、Base (基链接)
   说明:插入网页基链接属性
   用法:<Base href="http://www.csdn.net/" target="_blank">
   注意:你网页上的所有相对路径在链接时都将在前面加上“http://www.cn8cn.com/”。其中

target="_blank"是链接文件在新的窗口中打开,你可以做其他设置。将“_blank”改为“_parent”是链接文件将在当前窗口的父级窗口中打开;改为“_self”链接文件在当前窗口(帧)中打开;改为“_top”链接文件全屏显示。

<head>  
<title>文件头,显示在浏览器标题区</title>
<meta http-equiv="Content-Language" content="zh-cn">
 <meta http-equiv="Content-Type" content="text/; charset=gb2312">
 <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
 <meta name="ProgId" content="FrontPage.Editor.Document">
 <meta name="制作人" content="Simonzy">
 <meta name="主题词" content=" 网页制作 C# .NET JS">
</head>

以上是META标签的一些基本用法,其中最重要的就是:Keywords和Description的设定。为什么呢?道理很简单,这两个语句可以让搜索引擎能准确的发现你,吸引更多的人访问你的站点!根据现在流行搜索引擎(Google,Lycos,AltaVista等)的工作原理,搜索引擎先派机器人自动在WWW上搜索,当发现新的网站时,便于检索页面中的Keywords和Description,并将其加入到自己的数据库,然后再根据关键词的密度将网站排序。

各系Rails大点兵

Tuesday, November 28th, 2006

不知道明年今日,会不会出现一队只会用 On Rails的毕业生,像当年的asp、jsp、迅速剿了C++/perl的CGI那样,把我们给剿了。同好们劝我,根据大公司经济学,这基本不会发生。

在茫茫的框架之海认出一个Rails框架,基本上靠四个特征
1.一门动态语言
2.一个extreme simple to use的ORM框架
3.一个extreme simple to use的MVC框架
4.一些自动生成代码的命令、模版
其余ajax、 service、i18n等特性自由扩展

1.: on Rails
Rails系的旗手,一己之力搞得J2EE阵营鸡飞蛋打。
旗手的作用表现在:
*最接近1.0的版本,目前已出到最后一个RC版 1.0 rc4(0.14.3)
*拥有一本amazon超级畅销的《Agile Development with Rails》,而且这本书的组织也好,part I是一个渐进的sample application 让你快速入门,partII是几个重要领域的深入介绍。
*拥有自己的IDE: RadRails ,基于Eclipse但独立成军,目前出到0.5。(是不是怕惨了Eclipse的多变,现在这些IDE的发行版本开始反包含了Eclipse在内。)

2.: DJango、turbogears
认识不深,所以DJango请看limodou的,turbogears看xlp123的。

3.Groovy: grails
如果能顺产,绝对是J2EE阵营里感情分最高涨的项目。因为它语言用Groovy,ORM用annotation版Hibernate,MVC用Spring。不用担心它换汤不换药,因为经过extreme的封装,再结合Groovy,绝对不再是原来的Spring+Hibernate,而是和差不多的一样东西了。不信可以看看他的Sample。
不过这个项目的源码目录树非一般的乱,也还没有0.1版释出。还有一样奇怪的事情,这个Groovy项目,大多数的代码都是写的。

4.: symfony ,cake
据说cake比symfony弱非常多,所以没看。
symfonys是基于php5的项目,成功整合了Propel(ORM)、Mojavi3(MVC),再配合自动生成的脚本打造而成。看他的sample,最后整合出来的东西也很Rails了,除了ORM层的xml文件。
还有一个发现是项目现在可以用pear来安装,很像的gem,的Maven要努力了。
C: />pear channel-discover pear.symfony-project.com
C: />pear install symfony/symfony
这样就装完了symfonys和propel&croel, mojavi3,还有用来运行脚本命令的pake( make),PHing( ant?),一大堆东西。

from :http://www.blogjava.net/calvin/archive/2005/11/22/20938.
author:江南白衣

Rails RESTful (1) 什麼是REST?

Monday, November 27th, 2006

on Rails 1.2 的一個重要進展是 RESTful,在了解怎麼用之前,我們要先了解什麼是 REST(Representational State Transfer)?

什麼是REST?

REST 是一種分散式超媒體系統(如WWW)的軟體架構風格,你可以想像它是一個良好設計的應用程式規則: 一組網路頁面(虛擬的狀態機器),其中 Client 透過點選超連結(狀態變換),結果是下個頁面(表示應用程式的下一個狀態)。

REST 所描述的網路系統包括三個部份:
data elements (resource, resource identifier, representation)
connectors (client, , , resolver, tunnel)
components (origin , gateway, proxy, user agent)

幾個重點:
Data elements 由標準化介面存取
Components 透過介面傳輸 資源表徵 (representations of resources) 來溝通,而不是直接操作資源本身。
Connectors 提供 component 的抽象介面來溝通,隱藏溝通機制的實作細節。
Components 使用 connectors 來存取,connectors 提供資源的存取或居中。
所有來自 connector 的 requests 必須包含所有必要的資訊來了解該 request,不需要依靠之前的request (即 stateless)

嚴格來說REST符合以下幾個條件:
應用程式的狀態跟功能拆成 resources
每個 resource 使用獨一無二用來當作超連結的通用定位語法(在WWW中即URI)
所有 resources 共用一致的介面在 client 跟 resource 之間轉換狀態,包括:
一組有限的良好定義操作 well-defined operations
一組有限的內容格式 content types,也許包括 可執行的程式碼 code-on-demand (在WWW中即)
這種通訊協定 protocol (在WWW中即用HTTP) 包含以下特色:
使用者端/伺服器端 Client/
狀態無關 Stateless
可以快取 Cacheable
分層的 Layered

符合 REST principles 的系統稱做 RESTful。

一般來說REST這個詞彙常被用來描述任何使用XML (or YAML, JSON, plain text) 的簡單介面,而不須靠其他機制(如SOAP)。另外 REST 雖然是個來自 WWW 的架構概念(比WWW晚),但是這兩者並不是綁在一起,有可能設計一個大型軟體系統符合REST但是不用HTTP協定也不需跟WWW互動,也有可能設計一個簡單的 XML+HTTP 界面使用 RPC model 而不符合 REST principles。

Resources

REST的一個最重要的觀念就是 resources (特定資訊的資源),每一個 resource 由一個 global identifier (即URI)所表示。為了操作這些 resources,網路的 components (即 clients 跟servers) 透過標準化的介面 (即HTTP) 來溝通並交換這些 resources 的 representations (即實際上傳達資訊的文件).

任意數量的 connectors (如clients, servers, caches, tunnels等) 可以居中 request,但是都不可以 “seeing past” (不需要其他 layer層)。這樣的應用程式跟一個 resource 互動根據兩件事情: resource的URI 跟 要做的動作 – 它不需要知道是否有 caches, proxies, gateways, firewalls, tunnels, 或其他任何藏在sever之間的東西。這個應用程式只需要知道資訊的格式 (representation),通常是 或 XML 或圖片什麼的。

REST 有什麼優點?
支援快取 caching 將改善反應時間跟的負載能力。
因為不必維持連結狀態,大大改善 的 scalability 能力。這表示不同可以處理同一串 requests。
一個瀏覽器就可以存取任一應用程式跟資源,client 端不需使用別的軟體。
在HTTP之上不依存其他機制跟軟體。
跟其他連結方式相比(如RPC),可以提供相等的功能。
不需要其他的 discovery 機制,因為使用超連結了。
提供比RPC更好的長期相容性,因為 :
如同這種文件具有後前及向後的相容能力
支援新的內容格式不需要丟掉舊的

另外比起RPC-style,URL command line 有極佳的 human-friendly 優點,容易 discovered/ transmitted /scripted/bookmarked 一個 URL。請參考 The Beauty of REST 跟 Tangled in the Threads 的優點介紹。

跟 RPC 的比較

跟 REST 應用程式對比的就是 RPC (Remote procedure call,實作上有XML-RPC或SOAP等) 了。RPC 應用程式曝露一或多個網路物件,每個有特定的 functions 可以呼叫。在 client 與物件溝通之前,它必須知道這個物件的知識來操作。

REST 的設計限制了 resource 的面向,它定義了介面 (動詞 verbs 跟內容型別 content types),導致比RPC更少的型別,但是更多的resource identifiers (名詞nouns)。REST 的設計尋求定義一組 resources 讓 Clients 可以一致性的互動,而且提供超連結在資源之間可以瀏覽,而不需要了解整個 resources 的知識 。 提供的表單 forms 也可以被用在 RESTful 的環境來描述 clients 如何建構 URL 來跟特定的resource做溝通。

這張圖指出了REST的三位一體 : Nouns, 有限的 Verbs 跟 Content Types。

需注意的是,根據不同的用法要求跟效率,在不同的應用程式環境中,該使用哪種架構仍有很大討論的空間跟爭議(SOAP的支持者認為REST仍有其侷限,只適合簡單的應用)。REST的重要性在於它有個目前最成功的大型軟體架構應用: Wide World 。RESTful 是 的天性,也是讓 成功的原因,因此 RESTful 的支持者認為使用 RESTful 架構就是 上最好的方法來做到有擴充性(scalable),彈性跟有威力的應用程式。在有這麼多複雜的RPC技術之後,REST因其簡單又有威力的架構近來越來越受到矚目跟重視。

舉例

一個 RPC 應用程式可能會定義以下的操作:

getUser()
addUser()
removeUser()
updateUser()
getLocation()
addLocation()
removeLocation()
updateLocation()
listUsers()
listLocations()
findLocation()
findUser()

Client 的程式碼可能會這樣存取:

exampleAppObject = new ExampleApp(”example.com:1234″)
exampleAppObject.getUser()

在 REST中,重點在 resources(或稱作 nouns)的多樣性,比如說可能有以下的用法:

http://example.com/users/
http://example.com/users/{user} (one for each user)
http://example.com/findUserForm
http://example.com/locations/
http://example.com/locations/{location} (one for each location)
http://example.com/findLocationForm

Client 的程式碼可能這樣存取:

userResource = new Resource(http://example.com/users/001)
userResource.get()

每個 resource 擁有自己的識別名詞,而 Clients 從單一 resource 開始瀏覽,透過標準操作走訪 resource ,如 GET 下載,PUT更新,DELETE刪除,POST新增,注意到每個物件有自己的URL,而且可以容易被快取,複製跟書籤化(bookmarked)。

參考資源
Representational State Transfer
RestWiki
How to Create a REST Protocol

From :http://ihower.idv.tw//archives/1542

JavaScript中的私有成员

Sunday, November 26th, 2006

Private Members in

是世界上是被误解得最厉害的编程语言。有些人认为它不具备“信息隐藏”的能力,因为的对象没有私有变量和方法。这是误解。对象可以拥有私有成员,下面我们来看看怎么做。(SharkUI.com注:并不是真正拥有私有、公有等等OOP的特性,这篇译文中提到的这些私有、公有、特权等特性,是利用的其他特性(参看本文的“闭包”一节)“模拟”出来的。感兴趣的话可以搜索相关的文章来看,当然也可以不管这些,就当它是真正的OOP来用。Have fun!)

对象

是建立在对象之上的。数组(Array)是对象,函数(Function)是对象,对象(Objects)当然也是对象。那什么是对象呢?对象是一组“名称:值”对(name-value pair)的集合。名称是字符串,值却可以是字符串、数值、布尔或对象(包括数组和函数)。对象通常是用哈希表来实现的,以便可以快速地取值。

如果值是一个函数,我们就可以把它当作一个“方法”。当对象的一个方法被执行,变量this就被设为对象本身。如此,方法就可以通过this变量来访问对象的实例。

对象可以通过“构造器(constructor)”来创建。构造器是一个拥有初始化对象的函数。构造器提供了类似其他语言中的“类()”所提供的特性和功能,包括静态变量和方法。

公有

对象的所有成员都是公有成员。任何函数都可以访问、修改或者删除这些成员,当然也可以添加新的成员。给对象添加成员的两种主要方法:

通过构造器

这种方法一般用来初始化对象实例的公有变量。构造器的this变量被用来给对象添加成员:

function Container(param) {   this.member = param;}

构造一个新的对象:

var myContainer = new Container('abc');

然后,公有变量 myContainer.member 就拥有了值 ‘abc’。

通过原型(prototype)

这种方法通常用来添加公有方法。在对象本身搜寻一个成员但没有找到时,就使用构造器的原型(prototype)成员。这种原型机制实现了面向对象所谓的 “继承(inheritance)”,同时也节省了内存。给创建自同一个构造器的所有的对象加上一个方法,只需要给构造器的prototype增加一个函数:

Container.prototype.stamp = function (string) {   return this.member + string;}

然后我们就可以调用这个方法:

myContainer.stamp('def')

返回’abcdef’。

私有

私有(Private)成员是由构造器创建的。通常构造器中用var声明的变量和函数参数成为私有成员。

function Container(param) {   this.member = param;   var secret = 3;   var self = this;}

这个构造器创建了三个私有的实例变量:param,secret和self。

function Container(param) {   function dec() {      if (secret > 0) {         secret -= 1;         return true;      } else {         return false;      }   }   this.member = param;   var secret = 3;   var self = this;}

私有方法dec会检查实例变量secret,如果它大于0,自减1并返回true;如果它小于0,返回false。这样就实现了由这个架造器所创建对象的dec函数只能用三次的功能。

按惯例,我们创建了一个私有变量self。私有方法可以通过它来访问到对象本身。但这只是一种权宜之计,因为《ECMAScript Language Specification》中有一个错误,使得内部函数的this变量被设置成一个错误值。

公有方法(SharkUI.com注:即上文说的通过prototype创建的方法)是无法调用私有方法的,所以为了能使用私有方法,我们需要引入特权方法(privileged method)。

特权

一个特权方法可以访问私有变量和方法,而它本身可以被公有方法和外界访问。你可以删除或替换一个特权方法,但不能修改它,也不能强制它放弃自己的密秘(SharkUI.com注:原文如此,可能是指它的特权,关于这点请高手指教)。

特权方法是在构造器内部通过this来创建的。

function Container(param) {   function dec() {      if (secret > 0) {         secret -= 1;         return true;      } else {         return false;      }   }   this.member = param;   var secret = 3;   var self = this;   this.service = function () {      if (dec()) {         return self.member;      } else {         return null;      }   };}

service是一个特权方法。前三次调用myContainer.service()将返回’abc’,之后将返回null。service通过调用私有方法dec来访问私有变量secret。对于其他对象和方法来说,可以访问到service,但不能直接访问到私有的成员。

闭包

这种公有、私有和特权成员模式的存在是由于的内在机制:闭包。这意味着一个内部函数永远可以访问它外部函数的变量和参数,即使外部函数已经返回。这是语言非常强大的一个特性。目前还没有关于编程的书籍展示了如何来利用它,它们甚至都没有提到这一点。

私有和特权成员只能在对象初始化的时候创建,而公有成员可以被随时添加进来。

模式

公有
function Constructor(...) {   this.membername = value;}Constructor.prototype.membername = value;
私有
function Constructor(...) {   var self = this;   var membername = value;   function membername(...) {...}}

注:这句代码:

function membername(...) {...}

事实上是以下代码的简略写法

var membername = function membername(...) {...};
特权
function Constructor(...) {   this.membername = function (...) {...};}

后记

Douglas Crockford的这篇文章为我们写出更优美的JavaSciprt程序奠定了基础,为我们创建出更合理的面向对象应用和框架带来了可能。在这篇译文快要完成的时候,惊诧的发现作者网站上出现了一个本文中文版的链接。好事!有越来越多的中国人开始关注这些“边边角角”的技术。虽然做了重复工作,但一样希望各位能从这篇文章中有所收益。也希望有更多的人能投入到原创和翻译前端技术文章中来,在多数人浮躁的时候,我们需要更多基础性的工作。一周一篇不多,一年一篇不少,只要开始了就行!

转载自: http://www.sharkui.com/articles/article.php?id=44