[置顶] 时间

[不指定 2009/08/16 17:03 | by phpor ]
因为时间在流逝,所以一切都在变。

管理处理器的亲和性

[不指定 2009/12/09 14:35 | by phpor ]
关键字:
亲和性  cpu affinity 

参考文章:
http://www.ibm.com/developerworks/cn/linux/l-affinity.html
http://www.linuxjournal.com/article/6799   


ssldump

[不指定 2009/10/27 16:41 | by phpor ]
软件简介:
tcpdump是一款很强大、很有用的网络侦听软件,但是对于ssl加密的数据包就无能为力了;ssldump则是一款可以侦听ssl加密的数据包的软件。

下载地址:
wget "http://www.rtfm.com/ssldump/ssldump-0.9b3.tar.gz
"

安装:

安装时曾遇到这种错误:
./base/pcap-snoop.c:52:21: net/bpf.h: No such file or directory
./base/pcap-snoop.c: In function `main':
./base/pcap-snoop.c:207: warning: passing arg 2 of `signal' from incompatible pointer type
./base/pcap-snoop.c:329: warning: passing arg 3 of `pcap_loop' from incompatible pointer type
make: *** [pcap-snoop.o] Error 1

因为该软件依赖libpcap包,下载地址:http://www.tcpdump.org/release/libpcap-1.0.0.tar.gz

我的机器上虽然已经按照了libpcap包,但是net/bpf.h 却不存在,但是存在pcap-bpf.h ,于是我就将pcap-bpf.h重命名为bpf.h 放到了net目录下,编译通过。


我经常会使用无线网卡,所以才发现Ethereal抓不到无线网卡的数据包,而且我安装的windows上的tcpdump也抓不到,感觉是我的无线网卡不支持侦听;
后来实在非常需要侦听我的无线网卡,就往上搜了一下,原来侦听无线网卡的时候需要设置非混杂模式。

tcpdump 设置非混杂模式使用 -p选项
Ethereal 设置非混杂模式: capture => options => capture packets in promiscuous mode


base64_encode 和 urlencode

[不指定 2009/10/22 16:07 | by phpor ]
base64编码是网络传输的比较被青睐的一种编码,因为base64编码的字符集也是基本的asscii字符,所以经常会被当做安全的编码放在url里面传输,当做urlencode编码使用了,其实我们应该明白一下两点:
1. base64编码里面有一个 “+” 号,在urlecode编码中 “+” 会被解码成空格,urlencode时,"+" 号肯定是由空格编码出来的,但是base64编码的结果中 "+" 不是空格编码出来的,如果将base64编码作为安全的url编码使用,则 “+” 将被解码成空格,这是我们不愿看到的; 所以不要base64编码作为url编码来使用

2. 我们知道http头里面可能会用base64编码来传输一些信息,因为这些信息不会被web服务器默认做url解码的,我们可以得到原始的编码信息,所以http头里面使用base64编码是可以接受的

使用nc命令访问memcached的问题

[不指定 2009/10/13 14:14 | by phpor ]
我是经常使用nc来查看mc的状态的,突然有一天,我使用nc命令做set操作,发现总是失败;用telnet没有问题,至少应该不是memcached的问题,可能是nc的问题吧。

今天又遇到了这个问题,我使用tcpdump观察使用nc和使用telnet的差别,发现nc发送的回车为\n ,而telnet发送的回车符为\r\n,差异就这么多了,于是使用下列命令测试:

echo -e "set a 0 0 1\r\na\r\nquit\r\n"|nc host port
结果成功

echo -e "set a 0 0 1\na\nquit\n"|nc host port
结果失败

比较久可以知道问题是出现在回车符上了,至于memcached是怎么解释的,有时间在了解一下源码吧

关于PHP的ini设置

[不指定 2009/10/13 00:35 | by phpor ]
PHP中有些设置是不能修改的,有些设置只能在指定的地方修改,有些设置在任何地方都能修改,原来不能到在哪里控制的,今晚就借着PHP手册到PHP源码里面一探究竟。

手册中提到:
                                                                                                                                                                                                                                                                                    
常量含义
PHP_INI_USER1配置选项可在用户的 PHP 脚本或 Windows  注册表中设置
PHP_INI_PERDIR2配置选项可在 php.ini, .htaccess 或  httpd.conf 中设置
PHP_INI_SYSTEM4配置选项可在 php.ini or httpd.conf  中设置
PHP_INI_ALL7配置选项可在各处设置

根据这些常量查PHP的源码,发现配置选项在设置的时候都指定了这些常量属性的,要想知道某配置选项是否可以修改,在源码中 grep PHP_INI -R * | grep 该配置选项   就行了。


还了解了几个宏定义,如,初始化配置选项时总是先 PHP_INI_BEGIN() 然后PHP_INI_END()  ,这里给出这两个宏的定义:
#define PHP_INI_BEGIN       ZEND_INI_BEGIN
#define PHP_INI_END         ZEND_INI_END

#define ZEND_INI_BEGIN()        static zend_ini_entry ini_entries[] = {
#define ZEND_INI_END()      { 0, 0, NULL, 0, NULL, NULL, NULL, NULL, NULL, 0, NULL, 0, 0, NULL } };

所以,初始化配置选项就是按照一定的数据结构写到一个数组里。

javascript 中正则的单行与多行

[不指定 2009/10/12 00:03 | by phpor ]
一般情况下我们都是用正则来处理一行字符串,如果要处理多行的字符串怎么办呢?
对于函数:
function a(){
...
}

是一个多行的字符串,要取函数名,怎么写?
方法一:
因为函数名肯定出现在第一行,所以可以通过:
/^function +([^(]*)/)[1]  来获取

方法二:
将函数名前面的字符和后面的字符都替换掉:
.replace(/
^function +/,"").replace(/\((.|\n)*/m,"");
注意不要写成:
.replace(/^function +/,"").replace(/\([.\n]*/m,"");
因为
1.  dot 在 [] 里面是不能表示任意字符的
2.  dot 也不包含回车
3.  注意m修改选项
一般情况下我们都用typeof来判断数据类型,但是javascript 中任何一个东西都是对象,如:
var a = new Array();
alert(typeof a); // object
var b = new Date();
alert(typeof b); // object

于是我们就只知道a b都是object,但是不知道这个对象究竟是什么名字,这时候constructor就可以帮助我了:

var a = new Array();
alert(a.constructor); // function Array(){..}

var b = new Date();
alert(b.
constructor); // function Date(){..}

比object具体多了,但是表达方式不太友好,用正则替换一下就行了:
var a = new Array();
alert(a.constructor.toString().match(/^function ([^(]*)/)[1]); // Array

var b = new Date();
alert(b.
constructor.toString().match(/^function ([^(]*)/)[1]); //  Date


javascript 实现的阶乘函数

[不指定 2009/10/09 14:05 | by phpor ]
// Y 函数实现的太绕了,太难以理解了, 无语。

function 
factorial(proc) {
    return function (
n) {
        return (
<= 1) ? proc(n-1);
    }
}

function 
Y(outer) {
    function 
inner(proc) {
        function 
apply(arg) {
            return 
proc(proc)(arg);
        }       
        return 
outer(apply);
    }
    return 
inner(inner);
}

alert("5! is " Y(factorial)(5));
分页: 1/27 第一页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]