参考:饭岛爱雄踞百度搜索量第一
2008/12/28
2008/12/25
平安夜,今夜谁和你一起通宵?
打算去看葛优的非诚勿扰,还是等花考完试吧,怕干扰她。
很是怀念在学校时候,平安夜,一群人说去通宵就去通宵玩了,啊,今夜谁和你一起通宵?
还是洗洗睡吧~
2008/12/23
客户端触发,后台方式运行PHP程序
ob_start();
set_time_limit(0);
//run in background
ignore_user_abort(TRUE);
/* close browser connection */
$size = ob_get_length();
header("Connection: close");
header("Content-Length: $size");
ob_end_flush();
flush();
/**
* main
*/
//your code
?>
上面的程序只要客户端浏览器http请求即可触发,然后便主动断开浏览器连接,以后台方式继续运行。可以用在触发执行任务的场合。非常有用!
2008/12/16
我是傲游的忠实用户
2008/12/15
DELL无法安装非官方驱动及其解决办法
- 如果你用的是DELL OEM的系统,就应该安装DELL的驱动。
- 安装公版非官版等需要把驱动解压后,在设备管理器里手动安装。
- 驱动精灵。“DELL的机器强烈建议装系统光盘自带的驱动;然后去驱动之家下载驱动精灵利用软件的在线更新功能分析是否需要升级驱动.需要的话再在线升级驱动程序.如果你对电脑不太熟悉建议只升级通过了微软数字签名的正式版本,升级前记得先备份下驱动. ”。个人体验:驱动精灵很不好使,不知为啥。
2008/12/11
Javascript(Jquery)获取键盘事件的key值,兼容FF2/3,IE,opera
获取event,keyCode是件麻烦事情,浏览器之间不统一。下面代码兼容性好。
//监听keypress事件,执行键盘一些快捷操作
$(document).keypress(function(event){
//获取事件对象 w3c模型/ie模型
//var event = arguments[0] || window.event;
//取得键盘码
var key = event.keyCode || event.which || event.charCode;
switch( key ) {
//a 添加分类
case 97 : go("AddProductLink");return;
//p 商品管理
case 112 : go("ProductsManageLink");return;
//c 分类管理
case 99 : go("CategoriesManageLink");return;
//s 搜索框聚焦
case 115 : setTimeout(function(){$('input#searchText').focus();});return;
default : return;
}
return;
});
</script>
清除事件继续向上冒泡,如果不希望其父级DOM捕获到此事件。
$('input').keypress(function(event){event.cancelBubble ? (event.cancelBubble = ture) : event.stopPropagation();});
2008/12/10
2008/12/08
最节省时间的方法——学习
学习是进化的表现,进化的越好学习能力越强,在这个社会才能更好的生存下去,享受更优质的生活。
不要计划明天做,从现在就开始。
2008/11/26
php serialize and serialize SimpleXMLElement
查了一下,http://bugs.php.net/bug.php?id=46143&edit=1,里面有段描述:
AFAIK, you cannot serialize a SimpleXMLElement, because it's a resource wrapped inside an object and it would be impossible de restore thatresource upon unserialize()-ation. That's why you receive an error: theunserialized object doesn't know where's the original document anymore.Store it in text form instead (asXML()).说是SimpleXMLElement这个对象内部是包装的资源,即php中的resource类型,而resource是不可以序列化的。
上述文字提供了一个解决方案,保存其xml字符串,然后再通过simplexml_load_file/simplexml_load_string恢复SimpleXMLElement对象即可,xml字符串可以通过SimpleXMLElement->asXML()得到。
2008/11/24
nusoap与php5内置soap模块类名冲突解决办法
出现上述错误,原因是与php5内置soap模块类名冲突。
解决办法:
1.关闭php5的soap扩展。windows关掉extension=php_soap.dll即可,Ubuntu下apt-get install安装的没有此选项,只好重新编译。
2.(推荐此法)修改类名即可。将soapclient()改为nusoap_client(),soap_server()改为nusoap_server()。这样就永远不会发生冲突问题了。nusoap代码中有如下片段:
/**
* Backward compatibility
*/
class soap_server extends
nusoap_server {
}
/**
* For backwards compatiblity, define
soapclient unless the PHP SOAP extension is loaded.
*/
class soapclient
extends nusoap_client {
}
3.php5改为php4。
2008/11/22
2008/11/11
SimpleXMLElement解析报错解决方案:剔除字符串中错误字符
报错:
Warning: SimpleXMLElement::__construct() [function.SimpleXMLElement---construct]:PHP在解析XML文档时发生错误,这个问题很常见,主要是由于在xml文档中含有头部声明编码以外的字符,而php严格按照头部声明的编码来解析xml文档。通常都是GB2312编码发生此情况,我一般是使用正则来修改文档头部编码声明来避免。如下:
input conversion failed due to input error, bytes 0xC2 0x2E 0x20 0x20 in
E:\www\alsobuy.php on line 47
$xml = preg_replace("/(^<\?xml.*encoding.*)GB2312(.*\?>)/iU" ,一般将其修改为GBK即可,GB2312包含的汉字实在太少了。
'${1}GBK${2}' , $xml );
今天却不好使,纳闷了,后来终于发现,该XML文档中含有一个错误字符,根本无法解析。
而在使用正则等处理字符串时,里面含有乱码一般不会报错,估计SimpleXmlElement()是堆栈来完成xml文档解析的,遇到错误字符就挂了。
解决方案:根据具体编码,确定字符内码的范围,遍历一遍,剔除错误的字符。
下面是根据GBK编码范围来剔除的,效果很好。
代码:
<?php
//含有两个错误的字符
$str = "我\x97\x7f鎔ㄅㄈ是德\x82\x09文";
$len = strlen($str);//长度
$new_str = "";
for($i=0; $i <= $len-1 ;$i++) { $s_hex = ord($str[$i]); if( $s_hex <= 0x7f && $s_hex >=0x00 )
{
//ACSII
$new_str .= $str[$i];
}
else if( $s_hex >= 0x81 && $s_hex <=0xfe )
{
//双字节
if( $i == $len-1 ) break;
$i++;
$s_hex = ord($str[$i]);
if( $s_hex >= 0x40 && $s_hex <= 0xfe && $s_hex != 0x7f)
{
$new_str .= $str[$i-1];
$new_str .= $str[$i];
}
}
}
echo $str.'<br/>';
echo $new_str.'<br/>';
?>
效果图:
方便看代码:
飓风营救(Taken),十年编程无师自通
还看了一篇很早的文章,《10年编程无师自通》,君子固本,不能太急,十年磨一剑,尤其对于像我这样的新手呵。
2008/11/10
为何keso的可以访问,偶们的就不行?(已解决)
我使用自己的域名托管指向到ghs.google.com就不可以?GFW对keso特殊监控?
--update 19:09
keso回了邮件。解决办法:找到未被封掉的ghs.google.com的ip,然后把自己域名A记录指向过去即可。
2008/11/08
利用BlackBerry架设Now SMS/MMS Gateway服务器失败


Use BlackBerry As Modem For Laptop!
http://www.blackberryforums.com/blackberry-guides/2019-user-howto-use-blackberry-modem-laptop.html
2008/11/06
我的BB8820终于解决GoogleMap的问题了,不再假死
最近装了google map,郁闷了,又出现gmail刚开始的情况,哎,看到http://fisio.cn/blackberry-china-google-maps-232.html#comment-5427又是很兴奋,再次安装googlemap,后来,在APN里填上CMNET,一切ok,这个世界清净了。下班路上试了试,很好很强大!
还有opera mini,好多人都说是黑莓上最好使的,我还是觉得官方浏览器好使一些。PC版的opera还是很棒的。
科技以人为本,如果手机、电脑这电子产品这些都做的像开门关门一样简单,这个世界将会是多么美好啊。
Goolge Map截图一张:

----
2008/11/05
Apache2.2开启Gzip和Expires来提升网页浏览速度,yslow评分A(96)
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
在你网站的目录下新建.htaccess,添加如下内容:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A604800
ExpiresByType text/css A604800
</IfModule>
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/html text/css image/gif image/jpeg image/png application/x-javascript
</IfModule>
解释一下。ExpiresByType 是通过MIME类型来设置具体文件的缓存时间,A表示访问,A后面的数字表示访问后的缓存时间。AddOutputFilterByType表示根据后面的MIME类型来压缩文件,这里对css,html,gif,jpeg,png,JavaScript等进行gzip压缩。更多选项请参考apache手册哦。
关闭ETag。Etag的问题在于,它是根据可以辨别网站所在的服务器的具有唯一性的属性来生成的。当浏览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时ETag就会不匹配,这种情况对于使用服务器组和处理请求的网站来说是非常常见的。在配置文件中写入下面一行即可:
FileETag none
如果是多服务器负载均衡,可以设置为FileETag MTime Size,apache默认设置为FileETag INode MTime Size,去掉INode。
经过上面的设置,开启YSlow,评分A(96)。

--
傲游“全新设计的页面内查找工具条”令我很不舒服
或者有什么快捷方式我不知道?
今天把新版的卸载了,安装以前版本,mx_2.1.0.2082cn.exe。
2008/11/03
php生成扭曲变形的验证码
02 /**
03 * 取得验证码图像
04 *
05 * @param string $string 字符
06 * @param int $im_x
07 * @param int $im_y
08 */
09 function getAuthImage( $string , $im_x = 120 , $im_y = 60) {
10 ob_start();
11 $im_x = 120;
12 $im_y = 60;
13
14 $im = imagecreatetruecolor ($im_x, $im_y);
15 imagefill($im, 0, 0, imagecolorallocate($im,255,255,255) );
16
17 $stringColor = imagecolorallocate($im, 17, 158, 20);
18 imagettftext ($im, 24, rand(-6 , 6), $im_x*0.1, $im_y*0.7, $stringColor, ROOT.'/app/vendors/MSYHBD.TTF', $string);
19
20 //扭曲,变形
21 $distortion_im = imagecreatetruecolor ($im_x*1.5 , $im_y);
22 imagefill($distortion_im, 0, 0, imagecolorallocate($distortion_im,255,255,255) );
23 for ( $i=0; $i<$im_x; $i++) {
24 for ( $j=0; $j<$im_y; $j++) {
25 $rgb = imagecolorat($im, $i , $j);
26 if( (int)($i+20+sin($j/$im_y*2*M_PI)*10) <= imagesx($distortion_im) && (int)($i+20+sin($j/$im_y*2*M_PI)*10) >=0 ) {
27 imagesetpixel ($distortion_im, (int)($i+20+sin($j/$im_y*2*M_PI-M_PI*0.4)*8) , $j , $rgb);
28 }
29 }
30 }
31
32 //imageline
33 for($i=0; $i <= 1; $i++) {
34 $linecolor = imagecolorallocate($distortion_im, 17, 158, 20);
35 $lefty = rand(1, $im_y-1);
36 $righty = rand(1, $im_y-1);
37 imageline($distortion_im, 0, $lefty, imagesx($distortion_im), $righty, $linecolor);
38 }
39 //pixel
40 for($i=0; $i <= 64; $i++) {
41 $pointcolor = imagecolorallocate($distortion_im, 17, 158, 20);
42 imagesetpixel($distortion_im, rand(0, imagesx($distortion_im)), rand(0, imagesy($distortion_im)), $pointcolor);
43 }
44 //边框
45 //imagerectangle($distortion_im, 0, 0, imagesx($distortion_im)-1, imagesy($distortion_im)-1, imagecolorallocate($distortion_im, 17, 158, 20) );
46
47 ob_clean();
48 header('Content-type: image/jpeg');
49 imagejpeg ($distortion_im);
50 imagedestroy($im);
51 imagedestroy($distortion_im);
52 }
53 ?>
2008/10/31
ghs.google.com又无法访问了
豆瓣也无法访问……到底怎么了?
2008/10/29
失败的性格,“非常牛逼,相当见血”
【作者:桑地牙哥.拉蒙卡(Santiago Ramony Cajal,1852-1934),西班牙神经解剖学家,1906年诺贝尔医学奖得主。】
我们看过很多极出名的大学老师,很有天分,充满了精力,以及非常主动地行动,实验室里也有很多的实验器材,可是这种老师没有任何原创性的研究,也不曾写过任何书。他的学生,及崇拜他的人,等了很多年,他们认为这么伟大的老师,最终一定会产生旷世杰作来,可是旷世杰作从来不曾出现,而老师也沉默以终。
当然我们在解剖这类意志疾病时,不要被乐观态度或者是善良的心所欺骗了,也就是说要稍微严苛一点,来批评这种意志上的毛病。老师有非常好的声望,在课堂里面也充满热心跟精力,可是这样的老师们患了一种"精神意志病"(即性格的失败处)。当然心理学家不会这么说的,因为他们看起来是多么的健康,他们虽然在学术上慢吞吞的,及忽视了学术责任,但医生们绝不会诊断为丧失了意志力,可是他们的朋友跟学生们,还是要把这种状况,认为是不太正常,而且要对这种老师施予一点精神治疗。吾爱吾师,是国际普遍的道德,虽然对老师的学术或心智能力极为崇敬,可是,毕竟有点问题,值得思考。
这些辉煌的失败人物,可以用下面几类名词来区分,其中第一种就是所谓的半瓶子醋的业余家,又称做空想家;第二类就是博学多闻的人,或者是爱书狂;第三类叫做仪器的崇拜狂;第四类是自大狂;第五类是不适合的人;第六类是理论专家,理论的建构者。
【空想家】
我称呼这一种特别病态的心理,名之为空想家。空想家之中,我们可以看到某些天文学家、自然博物家、化学家、生物学家甚至还有医生。我们可以用下列的症状,来描绘出这种空想家。他们喜欢研究大自然,可那是为了欣赏她美丽玄妙的气质,为了大自然美丽的景象,漂亮的形态,绚丽的颜色跟优雅的结构。如果这个业余家是植物学家,那么他一定会被藻类所迷住,特别是矽藻,因为矽澡美丽的外壳让他着迷,让他欣赏。在他崇拜矽藻的狂热里,他把全部的时间花在欣赏每一种矽藻,以千奇百怪的角度,替它们照相,来显现它的美丽,把这些美丽的藻类排成一个符号,甚至把它艺术化,排成一个矽藻的浮雕,甚至把它排成像盾牌一样的各式各样徽章,或者是装饰用的设计。可是他从来不曾找到一个新的品种,以增加我们所知道的种类,甚至也不会对这些微生物的结构、发育,或功能,增添任何一点新的知识。
如果我们这位被美丽万象所迷惑的研究者,是组织学家的话,他可能就会热心地用染料来染细胞,及器官里的组织,他会把它变成艺术般的美妙。他会很精巧地使用细微的注射针,把染料打到各种的组织及各种器官里,而且他对美丽的图片有非常天真的羡慕,所以会花很多晚上来描绘,用普鲁氏蓝或用卡茗染料注入小肠肌肉或腺体的微血管后,经运输及渗透以后,出现的美丽组织网络。他会把最艺术化的组织学染色技术,学得极为精通,可是从来不曾想到,要把它们应用到新问题上面,或是用这些技术,解决争论得很热烈的题目。
如果他是地质学家的话,他会完完全全沉醉在岩石的切片里,把这些岩石的切片放到偏极光显微镜下面,就可以看到各式各样的颜色,变化万千。如果他是细菌学家,那他就会很高兴地收集产生各种颜色的细菌,甚至产生磷光的菌。如果他是天文学家,他就会把空闲的时光,完全用来拍摄月亮上的山脉,或者是太阳黑子。
我不需要再继续举例下去了,每一个人看过我前面所举的例子,就可以回想到他们在学校中,所遇到的各种有趣学者。他们当然是引人喜好,因为充满了少年般的热心,也因为他们会精彩及辛辣的演说,可是对于任何科学进步,他们却没任何的帮忙。
【爱书狂跟万言通】
我们前面提过的显微摄影专家,擅长于拍矽藻的照片,动物学家着迷于昆虫贝壳跟有美丽羽毛的鸟类。我们的爱书狂最高兴的事情,就是读最新书和专论,他认为这些东西很重要,而且很能够刺激头脑,可是别人没办法,找到另外一本同样的书。我们博学的模范,经过这种策略,让他的朋友惊奇,让他的朋友佩服。
这种"意志疾病"的主要症状,略如下述。这个人想要有百科全书般博学,也就是说对任何知识都感到兴趣。他可以精通许多国家的语言,可是有些完全没用,而且他会订购非常专业化的学术杂志,然后从书店的书架上面,最新出版的书,而且很努力学习任何应该知道的知识,特别是并没有太多兴趣的知识。可惜的是,当谈到写作的时候,这种人就有无法克服的懒惰,提不起笔来,也不喜欢学术报告,跟实验室工作。
很自然地,我们的书虫,住在他的图书馆里面,且为他的图书馆而活,你可以看到他的图书馆非常的壮观,到处塞满了书。在这里,他接待羡慕他的人,快乐生动且很有启发性地交谈。只要客人高兴,通常他会开始下面的问题:"你有否读过谁的书?(这个谁跟谁可以插进去一个美国人、德国人、法国人,或者是北欧人的名字)你有否听过某某人的经典理论呢?"还没听到对方的答复,他就立刻提出狂野的勇敢的理论,而他讲的这些理论跟现实没有任何关系,只是在冥想的层次里打转而已。
我们这位博学的人,能够讨论任何题目,因此浪费了他那么精锐的聪明,这懒惰的科学人,忽略了一个非常简单、非常人性的事实,朋友责骂他,并非对他之同情,反是怜悯多而尊敬少。他们模糊地察觉一项老生常谈:"所谓的博学,其实没有多大科学价值,也就是说,博学必须要掌握某一特定题目,而非百科全书式地泛泛地阅读。"可能,爱书狂最喜欢的希望,也即他的梦想,就是让人感觉到他是天才,而且是充满文化修养的天才,他从来没有停下来想一想,对于学者来讲,他想要免于汲汲无名,跟被人家忽视之命运,一定要有超人的努力,才可以留下身后不朽声名。
很幸运地,这方面我们不需要讲太多,就可以改正一般错误的社会价值。没人能否认下面的事实:"知道了还要能够行动,才能算是有用的人物。"而知道了就去睡觉的人物,是不被历史所尊重的。我们所尊敬的人,能够对现有人类知识作出更多创新贡献,我们并不尊敬把图书馆放到脑袋里的人,就是所谓的两脚书橱。如果一个人只想当留声机的话,他不需要用他的脑筋努力地学习,努力地反省。其实我们的神经细胞,一定要用来做更重要、更有价值的工作,我们不但要"知",而且还要能"转变知识",要能够体会知识,更要能创造知识,这才是科学人所应追寻的行事标准。
对那些有杰出观察重要发现的科学家,让我们致上最高敬意跟感激;反过来,如果他们只会感情洋溢地、声音洪亮地侃侃而谈,让我们就忘掉这种人,因为他们对科学没有任何贡献。就像是一位受群众欢迎的男高音,他宏美的歌喉,渊博的知识,当然到处会受到热情的赞美,尤其是在各种社交场合里,大家都对他赞服不止;可是,他不可能等到,全世界更大之历史舞台的热烈赞美,因为聪明的听众,住在很远的地方,可能甚至还未出生,这些听众读他所写的书,不仅是听一些漂亮的广告,而且全世界听众是很严肃的,长久以来,他们的判断也是正确的。所以,他们认为重要且给予最高荣誉之成就,是科学家所发现的新事实、新现象,是他对现有知识的一些新贡献。因此,获得当世的赞美,其实并非科学家所真正期盼之物。
【自大狂】
一个人如果患了自大狂,其实他本质可能相当高尚,而且也有一些成功的特质,他努力学习,同时也喜欢研究,因此他崇拜行动,也学会了研究必需的技术。他心中真诚爱国,而且诚挚地,希望用科学成就,来为自己的国家及个人,赢得最高的荣誉声望。可是他的热诚,却因一个致命缺陷,变得丝毫没用。他虽然在理论上,是采取渐进的手段,可是在实际上,他完完全全仰赖着幸运女神的眷顾,似相信奇迹定会出现。一开始研究事业时,他就期望有重大的发现,可能这些人还记得以下重要的科学家,如赫兹、梅尔、史旺、仑琴跟居里夫人。他们开始研究时,就有了重大的发现,因此自大狂希望在第一次战役的时候,就从二等兵直接跃升当将军。他把全部的时间用在创造实验,改正实验,永远在热心狂热的工作中,永远在修改,永远在孕育他那伟大的工作,因为他想要一次就把一个最杰出、最广泛的成就,贡献给世界。可是,当年岁逐渐飘逸逝去,期望落空,敌手窃窃私语,而朋友搔头,弄不清楚,我们伟大的科学家为什么还是这样的沉默?为什么还没有重大的成就来震惊世界?同时,这些自大狂这么努力探究的题目,在外国竟有一本本的专论,像雨后春笋般冒出来。这些专论,终于把我们自大狂的优先权,通通夺走了,迫使他不得不改变研究的方向。他对自己的信仰没有变,自大狂现在攻击另外一个问题,而正当他要完成伟大著作时,外国敌手刊出的论文,已经又发表了最详细的研究与理论,使我们的自大狂,再度陷入痛苦的深渊之中。最后,自大狂教授,终于年老了,学生们纵容他,所以不讲任何批评的话,而聪明人知道这个状况,也只能讽刺地微笑。
自大狂之所以会失败,是因为这些科学家开始进行研究时,并没有谦虚地、谨慎地应用自然的规律,也就是说,先研究小问题,如果成功了,自己的能力也增强了,然后,可以去进攻大一点的问题,这似乎是自然定律,其实也是人类审慎做事的基本方针。这一种很小心的做法,当然不一定立刻能博取声名,但至少这种策略能够赢得有学问的人的尊敬,还有同行的称誉及好评。
梦想家让我们立刻想到,古代的闲谈专家(conversationalist),也就是在沙龙里面口沫横飞的清客,我们也可以把他们当作是自大狂的一种。这种梦想家很容易辨识,因为他们说话的时候,会非常的兴奋,而且点子很多,攻击问题的方式非常的新奇,他们的眼光永远非常乐观,似乎用玫瑰色的眼镜来观察每一样东西。他们一向很有信心地说,只要是他们的想法被接受了,那么他们创造的成果,不但能扩大科学的视野,而且能带来无穷无尽的实际应用。这么大话之后,唯一的小缺点,当然是很令人惋惜的,他们的工作,从来没有完成过,甚至还没有及时完毕,就被迫终止;有时候因为支援不够,没钱了,有时候是因为环境不对,更惨的是,他们没有能干的助手,来完成伟大的工作,或者是有些资助的机构,或者***不够聪明,不够文明,以至于没办法鼓励这种工作,甚至给予金钱支持。实情是这样的,梦想家工作不力,没有坚毅的恒心,就好像作家葛拉西恩(Gracian),在他的名著《神谕手册》(Oraculo manual)里面所说的:"有些人在开始的时候,即花了全部的功夫,因此没完成任何事情。他们发明,可是没有进展,每一个事情还没有结束,就停止了,因此聪明有节制的人不应该把他全部的精神,放在挑逗猎物上面,应该把精力,放在杀死猎物上。"
【仪器崇拜狂】
没有效率的科学家中,有一小类就是所谓的崇拜研究仪器的狂人,他们对金属的闪烁非常着迷,就像是夜鹰对它在镜里的反影着迷一样。他们非常仔细照顾所崇拜的东西,把仪器拭擦得雪亮,可以当镜子使用,而且把它摆饰在最崇高的地方,就好像在教堂里面的圣坛。他们的实验室非常的安静,就像是在寺庙里,僧侣都噤口不言,地板也是一尘不染,整个房间都鸦雀无声,听不到一点吵闹。
在仪器狂的口袋里面,有一大串钥匙,走起来叮叮哨哨地响。当教授不在的时候,助理跟学生就不可能找到钥匙来使用一个仪器,或者是看一本重要的专论。他实验室里所有重要的仪器,例如显微镜、分光器、分析天平、化学试剂,完完全全都是在锁跟钥匙的掌控之下,如果助理胆敢不小心破坏了一个蔡司目镜,一个反射仪,或者是一个偏光仪,立刻就会被教授开革,所以这是一个恐怖的场面啊!还有,仪器狂通常不也都顺便掌管实验室的各种耗材吗?他把这些实验室的耗材,看作是大学里面不可侵犯的珍稀库藏,他是否紧张到随时要清点一下这些库藏,来报告他的上级呢?至于做研究证明或是推翻一个学说,那可能要等到他有空的时候才会去做,甚至要等到最近的专论,寄到学校来,有了他想要的不可或缺的资料以后,才开始动手。如果***非常大方地增加了他实验室耗材,或许,那时候他就不会这么地珍视这些耗材,说不定会拿出来当教学使用;可是如果***的钱不来的话,那怎么办呢?
这一类老师,我想大家都至少会记得一、两个例子,是选错行业了,他们把自己当作是热心的模范官员,其实他们只是一个好管家而已。会不会让你想起,那些最优秀的家庭主妇?她们把客厅打扫得一尘不染,把客厅内的家具,谨慎地排放着,每天把地板擦得光光亮亮,可是为了怕遭灰尘及混乱,所以就把家人、亲戚跟朋友赶到餐厅里面去活动。
很明显,这种冷酷的仪器狂,不能对任何人有好处,对自己也是个大伤害。如果这种对仪器的崇拜,再配合另外一种心理特质,那么他所患的病更是无可救药、病人膏肓了。这种特质即自私,加上令人难受的一种偏执,不让任何人能顺利工作,不让任何人使用他们的仪器,因为他们本身不知道怎么样去做事,甚至不想做事。
【不适合的人】
我们看到教授们常常用他的教职,当作从政的敲门砖;或者是利用教职做广告,让他在行医赚钱的时候,招到更多的顾客。如果这种人少一点的话,我们会少看到些,真正职业与例行公事间奇怪的对照,也不会看到赚钱跟学术之间,这么明显的讽刺性对比。因此想要获聘为教授时,这一位候选人,一定要提出研究生涯的目标,提出他适合这工作的性向证据。在竞争之下,我们才能聘到一位教授,他不会只把工作看作是例行公事,或是赚钱的一个跳板。
曾经有一位剑桥大学教授告诉过我,他说:"英国之所以繁荣的原因,就是因为每一个人都尽心地做好自己的工作。"除了几个高贵例外,完完全全相反的情形,发生在我们西班牙,有很多人占着某职务,可是就是不尽责任,仅仅要领薪水,以及享受尸位素餐的快乐。我们能不能想象到一个将军,被摆到一般的***公务职员的职位,或者被摆去当法官;医学教授去研究文学或者考古学;工程师在写悲剧;病理学家把时间专注在伦理学;或者一个形而上哲学家对政治最有兴趣?这不正就是我们西班牙的写照吗?这种状况的结果,就是我们并没把全部精神耗在我们必需的工作上面,我们只把一小部分精力花在正事上,好像是个很痛苦的事情,所以很不情愿地去做它。
当然我们不能要求一个教授的生活,或者是一个科学家的生活,要这么的严苛,要这么的单调,以至于把他整个的生命,都完全奉献到职业责任上面。我们只希望,如果工作之外他还有一点精力的话,可以把这些小精力放在轻松的、快乐的消遣上面,因为在每天认真的努力工作后,精神还是必须要放松,而放松在合法合适的消遣上面,不至于损害第二天的精力。
有些人可能会反驳我,认为不适合的人并不是心理不正常,而是因为环境不良的关系,使得他的工作不合于他自然性向。可是,我们再如何地辩解,我认为这些缺陷及失败,还是由于意志薄弱的关系,因为如果他们自认环境不适,应该有充分的能力及精神,改变他们的前途,改变他们的工作,而不至于终老于一个他不喜欢的工作,徘徊于他自己喜欢的事业,跟一项赚钱的工作之间。
刚才我们的观察,好像把不适合的人,说成无可救药了。但从另外一方面来讲,这种不适合的状况,并不能应用到年轻人,这些年轻人因为家庭的压力,或者是因为社会环境的残暴压力,不能够自己控制生命的方向,因此所从事的工作是被外在环境,所强加上去的。这时候他们的心灵还是很有弹性的,一旦环境许可,他们应该立刻改变他们的工作方向。他们可能在一个他们所不喜欢的科学领域里面工作,好像是从他们喜爱的心灵家乡里被流放在外,他们还是可以努力拯救自己,让他们的工作变得非常有效率。内心里要积极地决断,下决心争取高远的目标,去寻找一个喜欢的工作方向,以适合他们自己的才能。这个工作的方向很适合他们,因此可以把绝大部分的精力投注在上面。在每一个科学领域里,难道没有一个很快乐的绿洲,在那里一个人的精力、智慧可以有快乐发挥的余地吗?
【理论家】
另外有一种心灵,受了高度的教育,有精深的文化素养,头脑也非常的活跃,可是他患了一种脑筋昏睡病,而且这种昏睡病是很严重的,因为对于他们来讲,他们不曾察觉这种昏睡病对他们大有妨害,别人也不认为这种症状有什么重要:这种昏睡症就包括如下征候。他的头脑非常的迅速,很能够清楚表达他的意见,想象力丰富,而且活跃不止,不喜欢在实验室工作,而且非常不喜欢具体的科学,讨厌外表看起来不很重要的资料。这一种心灵的教授,他们喜欢从大尺度、大水平上来看问题,他们住在云端,他们喜欢书本,不喜欢专论,喜欢灿烂勇敢的假设,而不喜欢老生常谈。当他们遇见困难问题的时候,就有挡不住的冲动想要提出一个理论,不喜欢实实在在一步步地去质问大自然。一旦他们发现两个现象之间,有一点点相类似,或者能找到一点新资料,能够适合他们所讲的大理论时,他就诚心诚意相信,他们是最值得钦佩的科学改革家、创意家。他们这种做科学的方法,在原则上是可以的,是合法的,可是他们误用了这种方法,因为他们掉到了陷阱里去,把任何的东西,都用一个单一的观点来看。对于他们来讲,只要观念漂亮,就是最重要的。他们也不管,到底这种观念有没有任何实质的证据,只要是漂亮,只要有创意,只要能白圆其说,他们都会雀跃不止,五体投地地崇拜。
你现在就可以想象到,理论家经常会碰到挫折及失望,因为现在的科学方法并不适合产生无所不包的理论,因此真正的天才还需要经过多年的努力,以及无止境的实验,才能建立一点点小的理论。有很多看起来是真确不移的教条,都已经被现代科学所打破了。
所以基本上来讲,理论家其实是一个很懒惰的人,只是用他的理论来伪装成一个很勤奋的人。他在下意识里面,其实是恪遵最少努力的定律(1aw of minimum effort),也就是什么都不做,因为创造一个理论所花的功夫,远比发现一个现象少得太多。
德国生物化学家李比希对这一类的问题,有很睿智的判断,所以当他碰到了一个年轻有为的化学家时,就写了一些父兄般的劝告,告诉这位年轻的葛布哈特 (Gebhard),因为葛布哈特比较有野心创造综合式理论(ambitious synthesis)。李比希说:"不要创造假设,因为假设会让你变成很多聪明人的敌人;倒是要努力发现新事实,因为新事实是唯一可以赢得荣耀的事,且没有人忽略它。如果你创造了新事实,这会对你有很大的好处,因为聪明的人能够证明新事实是对的,新事实为你带来朋友,甚至你的敌人也不得不重视你及尊敬你。 "
李比希所写的东西,实在是事实及真理。对一个新手的未来而言,高谈理论及假设,的确会带来极大的危险,因为他想用理论来教导别人,就好像是"好为人师"的这种狂妄无知感。这种在他人的面前,显现聪明的优越感,是会引起绝大部分人的反感,大概只有修养最好的学者,以及本身已经发现很多科学事实的人,才会明智地原谅这种无知的举动。让我们先变成有用的工人,然后再看看我们是否有资格成为建筑师或设计家吧!
那读者就可以反问我:"以前不是说过,做研究的时候需要有假设,那现在写什么反对提出假设来了呢?"我可以这么解释,我们要区分所谓工作中的假设(也就是德国科学家魏兹曼 [Weismann]所说的"Arbeits hypothesen"这句原文),以及"科学的理论"。所谓工作中的假设,是对自然提出一种问题,叫自然回答,对自然现象提出一种解释,然后再反过来问自然有没有意见。因此工作中的假设,是研究中不可或缺的部分,甚至也是研究中最初期的工作,也是绝对必需的前提。可是如果只是不停地想象及不停地提出假设,只是以理论为最终的目的,而没有做假设来客观地分析现象,那就等于是抛弃了实际上科学的工作,而进入了哲学的理想主义(idealism),那就等于是抛弃了现实而进入了冥想的世界。
让我们再强调这很明显的结论,学者最重要、最正面对学问的贡献,就是他能发现多少原始资料跟数据。假设来去都很容易,可是资料是可以永远存在的、可以保留下来的;理论很容易抛弃我们,可是资料可以护卫我们,资料是我们真正的资源,我们真正的堡垒,甚至是我们最好的纪录。在世事变化、岁月如梭的人间世中,真正的数据资料可以让我们免于时间的磨损,免于人们的"无知"及"忘怀",更能够免于人们不公平不正义之对待。如果一个人想把自己的命运完全投注在理论上的话,他就忘掉了每十五年、二十年理论就会被取代、抛弃或者被修改了。在过去几十年里,我们看看,已经有不少坚固的物理、化学、地质学、生物学理论都已经垮台了。可是就另外一个方面来讲,解剖学和生理学、化学、地质学、天文学的定律和物理学的方程式,这些树立很久的事实,仍然存在于这些学问里面,还不能被改变,而且受到严酷批评而不败。因此英国哲学家及文学家卡莱尔(Carlyle)就说过有名的话,他说:"给我一个事实,让我在这个事实前面顶礼、膜拜吧!"
简短来说,新手科学家,要把最大的努力,放在发现原创性事实上,他应该精确的观察,及做一些有用的实验,以及精确地描述他所观察到的事实。在开始实验的计划阶段,当然可以用"假说"来刺激想象,也可以用假说来开创新的研究领域,来刺激我们的雄心去开创新的方向。如果听从了我们这些警告之后,他还是感觉到,很需要创造一个巨大的、广泛的科学理论,或者统括宇宙的说法,就让他摆到以后来做吧!当他从事丰富的观察以后,使得人家尊敬他的现察,使得他能够在科学界里,享受到普遍信赖之后,再来做这件事。只有在这时候,别人才会恭敬听他所说的,也才不会嘲笑讥讽他的大理论,这个时侯,如果幸运女神眷顾他,他可能变成科学家跟哲学家的双冠王。
我现在已经描写了心智及意志上有毛病的各种科学家的病症,同时也用相当强烈的色彩,来加重彩绘他们道德上的弱点及知识上的贫乏。我这样做是希望把他们放到镜子前面,希望他们能与学生及羡慕者,一起来用这面镜子观察自己的缺陷。我当然知道这种手段对成年人、对心存恶意的人,其实没什么帮忙。我这样的劝告,其实只是针对那些公开渴求名望的年轻人,不管这些年轻人到底有无资格获得他所向往的名誉。当然我的说法,也可针对那些很有教养及很有训练的教授们,他们能够生产有价值的科学成果,但是因为他们在工作的过程中,受到太多失败打击,遇到太多泄气的事,他们感觉到需要模仿那些不健康、不爱国的炫耀大师,而这种放弃了自己本身的职责,去大吹大擂的倾向,可能是因为学术界已有太多恶例为范,或者是因为欠缺内心坚强的道德意志。这我都不管,不过我希望这些受过良好教育的教授们能够自觉自省。
如果这些劝告还不能影响我想要改变的人,那么这些人应该仔细反省他们的良知,自我决定一下,看看是否应该到外国去接受精神治疗!对于那些注意力已经不专心、意志业已崩溃的教授,外国科学家的实验室可能是一个理想的治疗场所。在那里,老偏见立刻会消失,让他能够感染上神圣、令人兴奋之追求科学的狂热,在有名的学者旁边一起工作,没有意志力的科学家能够浴火重生,能够对研究重新感到兴趣。在这种实验室里,他可以观察实验室同仁们那种热烈燃烧的野心,从未知里夺取科学的秘密;他可以欣赏他们,也会嫉妒他们所表现的野心,可以吸收到实验室工作同仁,对虚浮理论及浮夸大言的轻视及嘲讽,因此可以放弃大理论,卷起袖子开始工作。而且在外国土地上,他可以重新点燃对祖国的热爱,当回到国家去,开始自己的工作之后,他也因为有外国工作的成绩,因此他可以走得更顺利,更不会被别人所攻击。在他自己的国家,他终于可以学到,如何把自己的兴趣聚焦在一点上面;而且他现在也可以了解,过去所崇拜的人物其实都是满可耻的,他可以用悲悯的心来看着他们、来观察他们。
2008/10/28
2008/10/24
密码强度验证javascript,来自Ext.ux.PasswordMeter
02 * Calculates the strength of a password
03 * @param {Object} p The password that needs to be calculated
04 * @return {int} intScore The strength score of the password
05 */
06 var calcStrength = function(p) {
07 var intScore = 0;
08 // PASSWORD LENGTH
09 intScore += p.length;
10
11 if(p.length > 0 && p.length <= 4) { // length 4 or less
12 intScore += p.length;
13 }
14 else if (p.length >= 5 && p.length <= 7) { // length between 5 and 7
15 intScore += 6;
16 }
17 else if (p.length >= 8 && p.length <= 15) { // length between 8 and 15
18 intScore += 12;
19 //alert(intScore);
20 }
21 else if (p.length >= 16) { // length 16 or more
22 intScore += 18;
23 //alert(intScore);
24 }
25
26 // LETTERS (Not exactly implemented as dictacted above because of my limited understanding of Regex)
27 if (p.match(/[a-z]/)) { // [verified] at least one lower case letter
28 intScore += 1;
29 }
30 if (p.match(/[A-Z]/)) { // [verified] at least one upper case letter
31 intScore += 5;
32 }
33 // NUMBERS
34 if (p.match(/\d/)) { // [verified] at least one number
35 intScore += 5;
36 }
37 if (p.match(/.*\d.*\d.*\d/)) { // [verified] at least three numbers
38 intScore += 5;
39 }
40
41 // SPECIAL CHAR
42 if (p.match(/[!,@,#,$,%,^,&,*,?,_,~]/)) { // [verified] at least one special character
43 intScore += 5;
44 }
45 // [verified] at least two special characters
46 if (p.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)) {
47 intScore += 5;
48 }
49
50 // COMBOS
51 if (p.match(/(?=.*[a-z])(?=.*[A-Z])/)) { // [verified] both upper and lower case
52 intScore += 2;
53 }
54 if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)) { // [verified] both letters and numbers
55 intScore += 2;
56 }
57 // [verified] letters, numbers, and special characters
58 if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)) {
59 intScore += 2;
60 }
61 return intScore;
62};
var gradeMsg = grade <=0 ? " : (grade < 23 ? '弱' : (grade < 40 ? '一般' : (grade < 60 ? '强' : '极强'))) ;
五十岁左右的人生最幸福
晚上和大宝打电话,大宝说五十岁左右的人生最幸福。不明白,大宝说因为那个时候对做事分寸拿捏的很好,知道什么样的方式最好,不像二十来岁的时候,虽然想对别人好,却总是会伤害到别人。
我觉得尤其对于所爱的人是这样。
JQuery背景褪色解决方案,需插件Color Animations
背景褪色一般用于信息更改时提醒,一般使用的黄渐变(yellow fade )。
jquery1.2以后可以使用,但需要插件Color Animations ,首先下载插件,在页面中包含进来。
使用animate动画函数,设置backgroundColor属性即可,值形式可以为 rgb(num,num,num),rgb(num%,num%,num%),#a0b1c2
,#fff,。同时适用的属性还有:['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor']。
$('.block').animate( { backgroundColor: 'pink' }, 1000)
.animate( { backgroundColor: 'blue' }, 1000);
});
?>
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script>
$(document).ready(function(){
$("#go").click(function(){
$(".block").animate( { backgroundColor: 'pink' }, 1000)
.animate( { backgroundColor: 'blue' }, 1000);
});
});
</script>
<style>
.block {
background-color: blue;
width: 150px;
height: 70px;
margin: 10px;
}
</style>
</head>
<body>
<script src="http://dev.jquery.com/view/trunk/plugins/color/jquery.color.js"></script>
<button id="go">» Run</button>
<div class="block"></div>
</body>
</html>
jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
jQuery.fx.step[attr] = function(fx){
if ( fx.state == 0 ) {
//取得当前的属性值,转为[255,255,255]的形式
fx.start = getColor( fx.elem, attr );
//取得设置的值,转为[255,255,255]的形式
fx.end = getRGB( fx.end );
}
fx.elem.style[attr] = "rgb(" + [
//用end-start的值乘以比率,在加上start的值,即得到每step的值。fx.pos为动画的完成比率
Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
].join(",") + ")";
}
});
2008/10/23
如何在cakephp的布局文件中包含多个模板?
前几天在网上看到一个实现方法,http://www.xuzhousoft.cn/content/view/48/1/ ,看了一下代码,是用helper来实现的,感觉有点费劲。从代码看,其view文件中应该不支持$session,$html之类的了。
下面介绍一款简单实用的方法。先来看看cake的layout是如何实现下面这个的:
在cake/libs/view/view.php中有个方法叫做: function renderLayout()其中有$data_for_layout如下:
02 $data_for_layout = array_merge($this->viewVars,
03 array(
04 'title_for_layout' => $pageTitle,
05 'content_for_layout' => $content_for_layout,
06 'scripts_for_layout' => join("\n\t", $this->__scripts),
07 'cakeDebug' => $debug
08 )
09 );
10 ?>
也就是说实现的数据都是准备好的,从这一点上来讲就很难扩展了,因为变量就那么几个啊。
下面介绍一个方法,看代码:
02 /**
03 * 引入其他view文件,在layout中支持多个view
04 *
05 * @param string $name 在view目录下的文件
06 * @return string
07 *
08 */
09 function template($name) {
10 $s = addslashes( ROOT.DS.APP_DIR.DS.'views'.DS.$name.'.ctp' );
11 return "require(\"$s\");";
12 }
13 ?>
将这个函数添加到你的项目中去,然后在你的layout中添加如下代码即可包含多个view:
view/layout/default.ctp
2 <?php
3 //包含模板 include you template
4 eval(template('elements'.DS.'hello'));
5 ?>
6 ...
view/elements/hello.ctp
2 echo 'yes!';
3 //可以支持controller中声明的所有变量和helper
4 echo $session->read('Login.name');
5 ?>
呵呵,很简单吧!
2008/10/14
摘几句《死亡诗社》的台词,百看不厌
因为我希望生活有意义
我希望活的深刻
吸取生命中所有的精华
把非生命的一切都击溃
以免当我生命终结
发现自己从没有活过
“I went to the woods because I wanted to live deliberately. I wanted to live deep and suck out all the marrow of life!To put to rout all that was not life. And not, when I came to die, discover that I had not lived。”
“只有在梦想中,人才能真正自由,从来如此,并将永远如此。”
“两条路在森林里分叉,我选择走的人少的那条。”
“假如我们不能改变这个世界,那我们至少应该改变我们的生活,自由自在地活着”。遥远的日子里,米兰昆德拉如是说。
2008/10/07
新的cakephp1.2中你可以在URL中使用名字作为参数
New in CakePHP 1.2 is the ability to use named parameters. You can name parameters and send their values using the URL. A request for /posts/view/title:first+post/category:general would result in a call to the view() action of the PostsController. In that action, you’d find the values of the title and category parameters inside $this->passedArgs[‘title’] and $this->passedArgs[‘category’] respectively.
新的cakephp1.2中你可以在URL中使用名字作为参数,请求 ‘/posts/view/title:first+post/category:general’ 会自动调用PostsController中view()方法,在此action中包含了title和category的值,通过 $this->passedArgs[‘title’]和$this->passedArgs[‘category’] 来访问。
URL to controller action mapping using default routes:
默认路由下URL到控制器和Action的映射:
URL: /monkeys/jump
Mapping: MonkeysController->jump();
URL: /products
Mapping: ProductsController->index();
URL: /tasks/view/45
Mapping: TasksController->view(45);
URL: /donations/view/recent/2001
Mapping: DonationsController->view('recent', '2001');
URL: /contents/view/chapter:models/section:associations
Mapping: ContentsController->view();
$this->passedArgs['chapter'] = 'models';
$this->passedArgs['section'] = 'associations';
2008/09/27
让你的Firefox支持显示XHTML-MP
Firefox does not natively support the mime-type
application/vnd.wap.xhtml+xml. This is one of the possible mime-types for XHTML
Mobile Profile. This extension adds support for this mime-type. (The other,
application/xhtml+xml, is supported natively by Firefox.)
Firefox并不原生支持 mime-type为application/vnd.wap.xhtml+xml的页面,本插件使之成为可能。(Firefox是支持XHTML的)。
IE和FF打开网页不显示背景颜色,只显示图片
今天系统很奇怪,IE浏览器不显示网页背景色,图片和动画都正常,打开Firefox试了一下也不行,只有opera可以。上网搜索一下,解决方法如下:
其实不需要重启浏览器,直接刷新就没有问题了。 原来是自己一不小心修改了控制面板里头的选项。在“控制面板”的“辅助功能选项”下有一“显示”标签,单击该标签后看到“使用高对比度”选项被勾选。清除该选项后,重新启动IE,故障消除。
2008/09/11
cakephp开发笔记(1)
只需在布局模板头部修改成下面这样即可。注意下面第二行的,必须打印,否则php会混淆‘<?’的标记,编译出错。
<?php header('Content-type: application/vnd.wap.xhtml+xml');?>
<?php echo '<?xml version="1.0" encoding="utf-8"?>';?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>...
2.一个构思很酷的函数a()
00210 /**
00211 * Returns an array of all the given parameters.
00212 *
00213 * Example:
00214 *
00215 * a('a', 'b')
00216 *
00217 *
00218 * Would return:
00219 *
00220 * array('a', 'b')
00221 *
00222 *
00223 * @return array Array of given parameters
00224 */
00225 function a() {
00226 $args = func_get_args();
00227 return $args;
00228 }
3.我安装cakephp1.2出现的问题
3.1. .php文件无法执行
解决办法:将php的目录添加到系统环境变量中去。
3.2. 找不到php_exif.dll的扩展
原因是必须在php_mbstring.dll之后加载再加载php_exif.dll。php_exif.dll(EXIF 函数库)需要php_mbstring.dll,并且在 php.ini中,php_exif.dll必须在php_mbstring.dll之后加载。
4.cake bake的几个常用方法(cakephp1.2,已将.../cake/console添加windows环境变量)
创建新的应用,名为baz
cake bake baz
创建model(以下均需cmd到目录:D:\wamp\www\cake\baz(windows))
cake bake model [model name]
创建controller
cake bake controller Users
使用脚手架。额外创建:index, add, view, edit, and delete方法
cake bake controller Users scaffold
带有admin_index, admin_add, admin_view, admin_edit and admin_delete的脚手架
cake bake controller Users scaffold admin
创建视图
cake bake view Users
5.cakephp中取消方法vendor(),改为App::import('Vendor' , '...');
Description
The code I had before was
vendor('Swift');
vendor('EasySwift');
vendor('Swift/Connection/SMTP');
But the latest nightly told me "(vendor) Deprecated, see App::import('Vendor', '...');". So I modified my code to say
App::import('Vendor', 'Swift');
App::import('Vendor', 'EasySwift');
App::import('Vendor', 'Swift/Connection/SMTP');
Unfortunately, the classes no longer loaded. I did some poking around and it seems that App::import('Vendor', ...) doesn't know not to inflect the file names its given.
cakephp生成URL利器:Router::url()
在cakephp中,$html->link() , $html->image() 等方法的第二个参数均为url,都调用了Router::url($url = null, $full = false)。
常见用法:
1.生成url。
假设网站url路径是 http://www.example.com/project-text/。那么下面三者产生的url效果是相同的。
Router::url( array('controller'=>'category' , 'action'=>'list' , $params1, $params2 ) );
Router::url( '/category/list/params1/params2' );
Router::url( 'http://www.example.com/project-text/category/list/params1/params2' );
url均为 http://www.example.com/project-text/category/list/params1/params2' ,前两者产生的均为相对路径,第三个为全路径,需要生成完全路径只需将url()中的第二个参数设为true即可。
2.其他
Router::url( 'javascript:alert("s")' );
Router::url( 'mailto:bit.kevin@gmail.com' );
2008/08/10
JS运动计算公式图解
现在页面里面很流行一些动态效果,比如单击打开某个矩形框,其一般是通过改变div的高度来实现;或者遮罩效果,改变层的透明度。
在大部分情况下,其改变值是随时间呈线性关系,比较枯燥,通过一些函数,可以改变线性关系,获得良好的用户体验。前些天看到网址兽http://www.webbeast.cn/show-39-1.html文,对文章介绍的几个运动公式感兴趣。
这里我通过matlab画出部分函数的曲线图。下面是js代码
Fx.expoIn = function(pos){return Math.pow(2, 10 * (pos - 1))};
Fx.expoOut = function(pos){return (-Math.pow(2, -10 * pos) + 1)};
Fx.quadIn = function(pos){return Math.pow(pos, 2)};
Fx.quadOut = function(pos){return -(pos)*(pos-2)};
Fx.circOut = function(pos){return Math.sqrt(1 - Math.pow(pos-1,2))};
Fx.circIn = function(pos){return -(Math.sqrt(1 - Math.pow(pos, 2)) - 1)};
Fx.backIn = function(pos){return (pos)*pos*((2.7)*pos - 1.7)};
Fx.backOut = function(pos){return ((pos-1)*(pos-1)*((2.7)*(pos-1) + 1.7) + 1)};
Fx.sineOut = function(pos){return Math.sin(pos * (Math.PI/2))};
Fx.sineIn = function(pos){return -Math.cos(pos * (Math.PI/2)) + 1};
Fx.sineInOut = function(pos){return -(Math.cos(Math.PI*pos) - 1)/2};
Fx.wobble = function(pos){return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5};
Fx.pulse = function(pos){return (Math.floor(pos*10) % 2 == 0 ? (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)))};
通过这些很直观的函数图,可以轻易选择使用一些效果函数来实现某些效果。
HTTP中的GET和POST区别分析详解
HTTP中的GET和POST区别分析详解
1.数据发送形式
使用POST请求,数据在请求体(REQUEST HEADER)中传递给服务器。使用GET请求,数据将编码到URL中。
注意:POST请求的URL也可是http://www.example.com/index.php?a=hello&b=world的形式,只是其发送的数据将在请求体中。GET请求会把发送的数据编码后加在URL后,无论此前URL长什么样子。
2.什么时候使用GET和POST
GET 适用于多数请求,而POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是幂等的。也就是说,当使用相同的URL重复GET请求会返回预期的相同结果时,GET方法才是适用的。当对一个请求有副作用的时候(例如,提交数据注册新用户时),应该使用POST请求而不是GET。[参考2]
3.URL长度问题
RFC 2616、 " 超文本传输协议 -- HTTP /1.1, " 未指定任何对 URL 长度要求。
Microsoft Internet Explorer 具有统一资源定位器 (URL) 长度的 2,083 字符。 InternetExplorer 也有路径长度为 2,048 字符。如果使用 GET 方法, 您仅限于最多 2,048 字符, 减去实际路径中的字符数。[参考3]。网上流传256,1k等长度URL限制,可能对于以前古老的浏览器,现在应该纠正了,大概上对于IE是2k。
URL长度限制适用于 POST 请求和 GET 请求 URL。
对使用GET方法提交数据时,在IE环境下,需要注意其数据编码加到URL后其长度受到2083字节的限制。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。POST提交数据大小理论没有限制,HTTP协议规范也没有进行大小限制。“POST数据量存在128K的大小限制”不够准确,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力[参考1]。
4.GET请求的安全性
对于GET请求,其数据将附加在URL中,在浏览器地址栏中会显示出来。在用户登录时,其用户名和密码等信息将显示在浏览器地址栏中,若登录页面被浏览器缓存或者被浏览器历史记录则其他用户可以通过此机器拿到用户信息。而对于网络传输数据层面来讲,GET和POST安全性是没有太大区别的。
GET请求发送数据时,其数据是需要进行URL编码的,一些字符会发生改变,在服务端接受时需要做URL解码处理。对于某些WEB服务器,其GET请求会记录在服务器上,如果里面含有隐私数据将有可能被第三方获取[参考5]。
附件一:
[参考6]
HTTP协议中GET方法和POST方法是有所不同的,RFC1945中的英文原文如下:
8.1 GET
The GET method means retrieve whatever information (in the form of anentity) is identified by the Request-URI. If the Request-URI refersto a data-producing process, it is the produced data which shall bereturned as the entity in the response and not the source text of theprocess, unless that text happens to be the output of the process.
The semantics of the GET method changes to a "conditional GET" if therequest message includes an If-Modified-Since header field. Aconditional GET method requests that the identified resource betransferred only if it has been modified since the date given by theIf-Modified-Since header, as described in Section 10.9. Theconditional GET method is intended to reduce network usage byallowing cached entities to be refreshed without requiring multiplerequests or transferring unnecessary data.
8.3 POST
The POST method is used to request that the destination server acceptthe entity enclosed in the request as a new subordinate of theresource identified by the Request-URI in the Request-Line. POST isdesigned to allow a uniform method to cover the following functions:
o Annotation of existing resources;
o Posting a message to a bulletin board, newsgroup, mailing list,or similar group of articles;
o Providing a block of data, such as the result of submitting aform [3], to a data-handling process;
o Extending a database through an append operation.
The actual function performed by the POST method is determined by theserver and is usually dependent on the Request-URI. The posted entityis subordinate to that URI in the same way that a file is subordinateto a directory containing it, a news article is subordinate to anewsgroup to which it is posted, or a record is subordinate to adatabase.
A successful POST does not require that the entity be created as aresource on the origin server or made accessible for futurereference. That is, the action performed by the POST method might notresult in a resource that can be identified by a URI. In this case,either 200 (ok) or 204 (no content) is the appropriate responsestatus, depending on whether or not the response includes an entitythat describes the result.
If a resource has been created on the origin server, the responseshould be 201 (created) and contain an entity (preferably of type"text/html") which describes the status of the request and refers tothe new resource.
A valid Content-Length is required on all HTTP/1.0 POST requests. AnHTTP/1.0 server should respond with a 400 (bad request) message if itcannot determine the length of the request message's content.
Applications must not cache responses to a POST request because theapplication has no way of knowing that the server would return anequivalent response on some future request.
翻译成中文(黄晓东翻译,xdhuang@eyou.com)就是
8.1 GET
GET方法就是以实体方式得到由请求URI所指定资源的信息。如果请求URI只是一个数据产生过程,那么最终要在回应实体中返回的是由该处理过程的结果所指向的资源,而不是返回该处理过程的描述文字,除非那段文字恰好是处理的输出。 如果请求消息包含If-Modified-Since标题域,GET方法的语法就变成“条件GET”,即“(conditional GET)”。 条件GET方法可以对指定资源进行判断,如果它在If-Modified-Since标题域(见10.9节)中的指定日期后发生了更新,才启动传输,否则不传输。这种条件GET允许被缓存的实体在不必经过多次请求或不必要的数据传输就能进行刷新,从而有助于降低网络负载。
8.3 POST
POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能:
o 对现有资源的注释(Annotation of existing resources);
o 向电子公告栏、新闻组,邮件列表或类似讨论组发送消息;
o 提交数据块,如将表格(form [3])的结果提交给数据处理过程;
o 通过附加操作来扩展数据库。
POST方法的实际功能由服务器来决定,而且通常依赖于请求URI。在POST过程中, 实体是URI的从属部分,就好象文件从属于包含它的目录、新闻组文件从属于发出该文件的新闻组、记录从属于其所在的数据库一样。
成功的POST不需要在原始服务器创建实体,并将其做为资源;也不需要为未来的访问提供条件。也就是说,POST方法不一定会指向URI指定的资源。在这种情况下,200(成功)或204(无内容)都是适当的回应状态,取决于实际回应实体中对结果的描述。
如果在原始服务器上创建了资源,回应应是201(已创建),并包含一个实体 (对"text/html"类型最为适合),该实体中记录着对新资源请求的状态描述。
在所有的HTTP/1.0的POST请求中,必须指定合法的内容长度(Content-Length)。如果HTTP/1.0服务器在接收到请求消息内容时无法确定其长度,就会返回400(非法请求)代码。
应用程序不能缓存对POST请求的回应,因为做为应用程序来说,它们没有办法知道服务器在未来的请求中将如何回应。
附件二:
WWW FAQs: What is the maximum length of a URL?
[参考4]
2006-10-13: Although the specification of the HTTP protocol does not specify any maximum length, practical limits are imposed by web browser and server software.
Microsoft Internet Explorer (Browser)
Microsoft states that the maximum length of a URL in Internet Explorer is 2,083 characters, with no more than 2,048 characters in the path portion of the URL. In my tests, attempts to use URLs longer than this produced a clear error message in Internet Explorer.
Firefox (Browser)
After 65,536 characters, the location bar no longer displays the URL in Windows Firefox 1.5.x. However, longer URLs will work. I stopped testing after 100,000 characters.
Safari (Browser)
At least 80,000 characters will work. I stopped testing after 80,000 characters.
Opera (Browser)
At least 190,000 characters will work. I stopped testing after 190,000 characters. Opera 9 for Windows continued to display a fully editable, copyable and pasteable URL in the location bar even at 190,000 characters.
Apache (Server)
My early attempts to measure the maximum URL length in web browsers bumped into a server URL length limit of approximately 4,000 characters, after which Apache produces a "413 Entity Too Large" error. I used the current up to date Apache build found in Red Hat Enterprise Linux 4. The official Apache documentation only mentions an 8,192-byte limit on an individual field in a request. Microsoft Internet Information ServerThe default limit is 16,384 characters (yes, Microsoft's web server accepts longer URLs than Microsoft's web browser). This is configurable.
Perl HTTP::Daemon (Server)
Up to 8,000 bytes will work. Those constructing web application servers with Perl's HTTP::Daemon module will encounter a 16,384 byte limit on the combined size of all HTTP request headers. This does not include POST-method form data, file uploads, etc., but it does include the URL. In practice this resulted in a 413 error when a URL was significantly longer than 8,000 characters. This limitation can be easily removed. Look for all occurrences of 16x1024 in Daemon.pm and replace them with a larger value. Of course, this does increase your exposure to denial of service attacks.
Recommendations
Extremely long URLs are usually a mistake. URLs over 2,000 characters will not work in the most popular web browser. Don't use them if you intend your site to work for the majority of Internet users. When you wish to submit a form containing many fields, which would otherwise produce a very long URL, the standard solution is to use the POST method rather than the GET method:
The form fields are then transmitted as part of the HTTP transaction header, not as part of the URL, and are not subject to the URL length limit. Short-lived information should not be stored in URLs. As a rule of thumb, if a piece of information isn't needed to regenerate the same page as a result of returning to a favorite or bookmark, then it doesn't belong in the URL.
The Bookmark ProblemIn very rare cases, it may be useful to keep a large amount of "state" information in a URL. For instance, users of a map-navigating website might wish to add the currently displayed map to their "bookmarks" or "favorites" list and return later. If you must do this and your URLs are approaching 2,000 characters in length, keep your representation of the information as compact as you can, squeezing out as much "air" as possible. If your field names take up too much space, use a fixed field order instead. Squeeze out any field that doesn't really need to be bookmarked. And avoid large decimal numbers - use only as much accuracy as you must, and consider a base-64 representation using letters and digits (I didn't say this was easy). In extreme cases, consider using the gzip algorithm to compress your pretty but excessively long URL. Then reencode that binary data in base64 using only characters that are legal in URLs. This can yield a 3-4x space gain, at the cost of some CPU time when you unzip the URL again on the next visit. Again, I never said it was easy!
An alternative is to store the state information in a file or a database. Then you can store only the identifier needed to look up that information again in the URL. The disadvantage here is that you will have many state files or database records. Some of which might be linked to on websites run by others. One solution to this problem is to delete the state files or database records for the URLs that have not been revisited after a certain amount of time.
"What happens if the URL is too long for the server?" What exactly happens if a browser that supports very long URLs (such as Firefox) submits a long URL to a web server that does not support very long URLs (such as a standard build of Apache)?
The answer: nothing dramatic. Apache responds with a "413 Entity Too Large" error, and the request fails.
This response is preferable to cutting the URL short, because the results of cutting the URL short are unpredictable. What would that mean to the web application? It varies. So it's better for the request to fail.
In the bad old days, some web servers and web browsers failed to truncate or ignore long URLs, resulting in dangerous "buffer overflow" situations. These could be used to insert executable code where it didn't belong... resulting in a security hole that could be exploited to do bad things.
These days, the major browsers and servers are secure against such obvious attacks - although more subtle security flaws are often discovered (and, usually, promptly fixed).
While it's true that modern servers are themselves well-secured against long URLs, there are still badly written CGI programs out there. Those who write CGI programs in C and other low-level languages must take responsibility for paying close attention to potential buffer overflows. The CGIC library can help with this.
In any case, if you're a web developer and you're still asking this question, then you probably haven't paid attention to my advice about how to avoid the problem completely.
参考文献:
[1] 表单Post&Get两个长度限制问题的分析[N] http://phoubes.bokee.com/5488853.html
[2] David Flanagan. Javascript权威指南【第五版】[M].北京:机械工业出版社,2007.8
[3] Maximum URL length is 2,083 characters in Internet Explorer[N] http://support.microsoft.com/kb/q208427/
[4] WWW FAQs: What is the maximum length of a URL? [N] http://www.boutell.com/newfaq/misc/urllength.html
[5] HTTP/1.1: Method Definitions[N] http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3
[6] HTTP协议中的GET和POST[N] http://www.cnblogs.com/westsourcer/archive/2008/06/12/702521.html