Firefox 配置参数详解
参考链接:
http://blog.techippo.org/archives/211
http://preferential.mozdev.org/preferences.html
DevOps
Firefox 配置参数详解
参考链接:
http://blog.techippo.org/archives/211
http://preferential.mozdev.org/preferences.html
摘自:PHP手册
通过debug_backtrace()函数可以找到
<?php
// useful and comfortable debug function
// it's show memory usage and time flow between calls, so we can quickly find a block of code that need optimisation...
// example result:
/*
debug example.php> initialize
debug example.php> code-lines: 39-41 time: 2.0002 mem: 19 KB
debug example.php> code-lines: 41-44 time: 0.0000 mem: 19 KB
debug example.php> code-lines: 44-51 time: 0.6343 mem: 9117 KB
debug example.php> code-lines: 51-53 time: 0.1003 mem: 9117 KB
debug example.php> code-lines: 53-55 time: 0.0595 mem: 49 KB
*/
function debug()
{
static $start_time = NULL;
static $start_code_line = 0;
$call_info = array_shift( debug_backtrace() );
$code_line = $call_info['line'];
$file = array_pop( explode('/', $call_info['file']));
if( $start_time === NULL )
{
print "debug ".$file."> initializen";
$start_time = time() + microtime();
$start_code_line = $code_line;
return 0;
}
printf("debug %s> code-lines: %d-%d time: %.4f mem: %d KBn", $file, $start_code_line, $code_line, (time() + microtime() - $start_time), ceil( memory_get_usage()/1024));
$start_time = time() + microtime();
$start_code_line = $code_line;
}
////////////////////////////////////////////////
// example:
debug();
sleep(2);
debug();
// soft-code...
$a = 3 + 5;
debug();
// hard-code
for( $i=0; $i<100000; $i++)
{
$dummy['alamakota'.$i] = 'alamakota'.$i;
}
debug();
usleep(100000);
debug();
unset($dummy);
debug();
?>
PHP为什么没有内置事件机制?
1. PHP本身是一种脚本语言,他是因web诞生的,这么多年的发展,也是为web而发展的
2. 通过事件可以实现一种设计模式(中介者模式),但是似乎PHP不太讲究模式
下面是从其他语言中借鉴过来的思想,心血来潮才仓促之间写下了下面这些 代码,希望能对各位读者,也对自己能够有些启发:
<?php
/**
* @brief: 基于事件机制的PHP程序设计
* @author: phpor <lijunjie1982@yahoo.com.cn>
* @date: 2009-10-10 14:00:00
* @version: 1.2
*/
// 修改历史:
// version 1.1:
// 1. 使用了call_user_func_array函数,大大简化了事件处理,简化了Event类
// 2. 给支持事件的类定义事件参数类
// version 1.2:
// 1. 添加了事件的默认处理器,否则不绑定事件时会报错
/**
* @brief: 事件基类,提供事件相关的一些方法
*/
class Event {
protected $_arrEvent = array();
protected function defaultEventHandler($sender = null, $misc = null) {
return true;
}
public function addEventHandler($eventName, $handler) {
if (!isset($this->_arrEvent[$eventName]) || !is_callable($handler)) {
// 弱类型语言,这里就不报错了
return false;
}
$this->_arrEvent[$eventName] = $handler;
return true;
}
protected function triggerEvent($eventName,$args) {
if(isset($this->_arrEvent[$eventName]) ) {
return call_user_func_array($this->_arrEvent[$eventName], array($this,$args)); // 触发事件时,一般第一个参数为sender
}
return true;
}
}
/**
* @brief: 一个实现了事件机制的表单类
*/
class Form extends Event{
public function __construct () {
// 这里初始化自己支持的事件
$this->_arrEvent = array ("onsubmit"=>array($this,"defaultEventHandler")); // 注意这里不能初始化为null,null就等于没有isset
}
public function submit($action) {
// 在执行动作前触发事件
if (!$this->triggerEvent("onsubmit",new FormEventArgs(array("action"=>$action)))) return false;
echo "submitedn";
// 其实对于有些操作,在执行动作后也可以触发某个事件
return true;
}
}
/**
* @brief: 一个类如果要支持事件,最好定义一个事件参数类,便于传递自己需要抛出的信息
*/
class FormEventArgs {
private $_arrData = array();
public function __construct($arrData = array()) {
$this->_arrData = $arrData;
}
public function getData() {
return $this->_arrData;
}
}
/**
* @brief: 事件处理器可以是一个函数
*/
function handler(Form $form, FormEventArgs $args) {
echo get_class($form)."n";
print_r($args->getData());
echo "I am return true onsubmit, so form can submitn";
return true;
}
/**
* @brief: 一个页面类,演示了如何使用实现了事件机制的类
*/
class Page {
public function show() {
$f = new Form();
$f->addEventHandler("onsubmit","handler"); // 这里可以使一个全局函数
$f->submit("action.php");
echo "n";
$f2 = new Form();
$f2->addEventHandler("onsubmit",array($this,"Form_onsubmit")); // 这里可以使用任意的方法名
$f2->submit("action.php");
}
/**
* @brief: 事件处理器也可以是对象的一个方法
*/
public function Form_onsubmit(Form $form, FormEventArgs $args) {
echo get_class($form)."n";
print_r($args->getData());
echo "I am return false onsubmit, so form can not submitn";
return false;
}
}
// test
$p = new Page();
$p->show();
?>
相关参考:
http://hi.baidu.com/wwwanq/blog/item/0778458033d417d1bd3e1ed4.html
http://www.phpres.com/html/PHPjichujiaocheng/20080628/1980.html
下面代码演示了一个使用捕获事件的方式来控制表单的提交的例子:
<form id="f" action="javascript:alert('执行表单的提交动作');" onsubmit="alert('这里利用onsubmit来阻止表单的自动提交');return false">
<input type="text" />
<input type="submit" />
</form>
<script>
function func() {
alert('这里发现了表单要提交,并且在这里提交表单');
document.getElementById('f').submit();
}
var f = document.getElementById('f');
if(document.all) {
f.attachEvent("onsubmit",func); // 注意:这里用的是 onsubmit
} else {
f.addEventListener("submit",func,false); // 注意:这里用的是 submit
}
</script>
这样做的好处:
1. 支持js的时候可以采用ajax的方式提交表单,在不支持js的时候也能提交表单
2.
相关文章:
http://parkmy.javaeye.com/blog/431306
http://www.javaeye.com/topic/85881
比较高级一些的工程师在做页面和写javascript时,可能会考虑如果浏览器不支持javascript怎么办。如果能做到,当然更好;今天我把自己的浏览器的javascript功能禁止掉,然后去访问搜狐、腾讯、163、yahoo,结果如下:
搜狐:
1. 搜狐首页的登陆框是显示不出来的。
2. 搜狐”通行证“的首页”http://passport.sohu.com/indexAction.action“的登陆框也是显示不出来的。
yahoo:
1. 首页可以显示登录框
2. 首页登录后,先在pass.cn.yahoo.com域种cookie,然后通过js跳转到 bj.passport.koubei.com 时,就停止了,因为是只通过javascript跳转的
腾讯:
1. qq.com.cn首页本身没有登录框
2. mail.qq.com.cn首页的登录,验证码的显示和刷新依赖javascript,所以,没有javascript的支持也是不能登录的
3. xiaoyou.qq.com.cn的首页登录元素显示不全,也是没法登录的
163:
1. 没有javascript也可以登录,但是邮箱是不能玩的
综上: 我们不必去过多地考虑浏览器不支持javascript的情况
/**
* 使用数组的序列来控制替换过程
*/
var aString = "......";
var aArray = [1,2,3,4,5,6];
var rx = /./g;
var newStr = aString.replace(rx,function(arr){
var pos = 0;
return function() {
return arr[pos++];
}
}(aArray));
alert(newStr);
/**
* 替换器
*/
function Replacer(obj) {
var n,rx = [];
for (n in obj) rx.push(n);
rx = new RegExp(rx.join('|'),'g');
return function(s) {
return s.replace(rx, function($0) {
return ($0 in obj ? obj[$0] : $0)
})
}
}
// test
var aObject = {'<br>':'\n','&':'&',' ':' ','<':'<','>':'>'};
var myReplacer = Replacer(aObject);
alert( myReplacer('1+2<4<br>&<br>2+3>4'));
// 摘自: 《javascript语言精髓与编程实践》 周爱民 著
地址: http://svndoc.iusesvn.com/svnbook/1.4/
SVN简易使用手册: http://blog.chinaunix.net/u2/67750/showart_1212829.html
这篇文章写的没太明白,先记录下来,有时间在看:http://blog.csdn.net/kql01/archive/2006/05/06/709149.aspx
今天不小心有发现出现了个D语言,先贴出来个地址,以后又时间在关注一下:http://www.digitalmars.com/
对于url编码一般出现在服务器端和客户端两个地方,我们的服务器端使用PHP脚本语言;而客户端一般是浏览器,这里就谈js的url编码;
关于PHP的urlencode与rawurlencode的比较: <?php
for ($i = 0x20; $i < 0x7f; $i++) {
$str .= dechex($i);
}
$asscii = pack("H*",$str);
echo "所有的可打印的asscii字符:(从空格到~)n". $asscii."\n";
echo "urlencode 的结果:\n".urlencode($asscii);
echo "\n";
echo "urlencode 不做编码的字符:\n".preg_replace("/%.{2}/","",urlencode($asscii));
echo "\n";
echo "rawurlencode 的结果:\n".rawurlencode($asscii);
echo "\n";
echo "rawurlencode 不做编码的字符:\n".preg_replace("/%.{2}/","",rawurlencode($asscii));
echo "\n";
exit;
?>
输出结果:
———————————————————————————
所有的可打印的asscii字符:(从空格到~)
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~
urlencode 的结果:
+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
urlencode 不做编码的字符:
+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
rawurlencode 的结果:
%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
rawurlencode 不做编码的字符:
-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
---------------------------------------------------------------------------------
比较二者的结果:
1. 数字、大小写字母都不编码
2. 减号、点号、下划线 三个不编码
3. rawurlencode比urlencode多编码一个”加号“
关于JavaScript中escape与encodeURIComponent的区别:
>>> console.log(encodeURIComponent("统一注册1"));
<?php
echo iconv("utf-8","gbk",urldecode("%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1"));
echo "\n";
echo urldecode("%u7EDF%u4E00%u6CE8%u518C1");
// 使用下面的unescape可以
//echo
iconv("utf-8","gbk",unescape
(
"%u7EDF%u4E00%u6CE8%u518C1");
exit;
?>
结果说明:
1. encodeURIComponent 总是把输入转换成utf8编码处理的,按字节编码
2. escape是按照unicode编码处理的,因为它也对url中不安全的字符做了编码,所以也可以在url中做编码使用,但是,服务器端不会自动解码,下面提供一个PHP版的解码函数,是用手册里找的:
<?php
function unescape($str) {
$str = rawurldecode($str);
preg_match_all("/(?:%u.{4})|&#x.{4};|&#d+;|.+/U",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(substr($v,0,2) == "%u")
$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
elseif(substr($v,0,3) == "&#x")
$ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
elseif(substr($v,0,2) == "&#") {
$ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
}
}
return join("",$ar);
}
?>
abcdefghijklmnopqrstuvwxyz{|}~"));
>>> console.log(escape("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));
结果比较:
escape未编码的字符: *+-./@_ 共7个
encodeURIComponent未编码的字符: !'()*-._~ 共9个