关键字:
亲和性 cpu affinity
参考文章:
http://www.ibm.com/developerworks/cn/linux/l-affinity.html
http://www.linuxjournal.com/article/6799
亲和性 cpu affinity
参考文章:
http://www.ibm.com/developerworks/cn/linux/l-affinity.html
http://www.linuxjournal.com/article/6799
软件简介:
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目录下,编译通过。
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目录下,编译通过。
侦听无线网卡需要设置为非混合模式
[
2009/10/27 13:40 | by phpor ]
2009/10/27 13:40 | by phpor ]
我经常会使用无线网卡,所以才发现Ethereal抓不到无线网卡的数据包,而且我安装的windows上的tcpdump也抓不到,感觉是我的无线网卡不支持侦听;
后来实在非常需要侦听我的无线网卡,就往上搜了一下,原来侦听无线网卡的时候需要设置非混杂模式。
tcpdump 设置非混杂模式使用 -p选项
Ethereal 设置非混杂模式: capture => options => capture packets in promiscuous mode
后来实在非常需要侦听我的无线网卡,就往上搜了一下,原来侦听无线网卡的时候需要设置非混杂模式。
tcpdump 设置非混杂模式使用 -p选项
Ethereal 设置非混杂模式: capture => options => capture packets in promiscuous mode
base64_encode 和 urlencode
[
2009/10/22 16:07 | by phpor ]
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编码是可以接受的
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 ]
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是怎么解释的,有时间在了解一下源码吧
今天又遇到了这个问题,我使用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 ]
2009/10/13 00:35 | by phpor ]
PHP中有些设置是不能修改的,有些设置只能在指定的地方修改,有些设置在任何地方都能修改,原来不能到在哪里控制的,今晚就借着PHP手册到PHP源码里面一探究竟。
手册中提到:
根据这些常量查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 } };
所以,初始化配置选项就是按照一定的数据结构写到一个数组里。
手册中提到:
| 常量 | 值 | 含义 |
|---|---|---|
| PHP_INI_USER | 1 | 配置选项可在用户的 PHP 脚本或 Windows 注册表中设置 |
| PHP_INI_PERDIR | 2 | 配置选项可在 php.ini, .htaccess 或 httpd.conf 中设置 |
| PHP_INI_SYSTEM | 4 | 配置选项可在 php.ini or httpd.conf 中设置 |
| PHP_INI_ALL | 7 | 配置选项可在各处设置 |
根据这些常量查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 ]
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修改选项
对于函数:
function a(){
...
}
是一个多行的字符串,要取函数名,怎么写?
方法一:
因为函数名肯定出现在第一行,所以可以通过: /^function +([^(]*)/)[1] 来获取
方法二:
将函数名前面的字符和后面的字符都替换掉:
.replace(/^function +/,"").replace(/\((.|\n)*/m,"");
注意不要写成:
.replace(/^function +/,"").replace(/\([.\n]*/m,"");
因为
1. dot 在 [] 里面是不能表示任意字符的
2. dot 也不包含回车
3. 注意m修改选项
javascript 中判断数据类型(constructor)
[
2009/10/11 23:48 | by phpor ]
2009/10/11 23:48 | by phpor ]
一般情况下我们都用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
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 ]
2009/10/09 14:05 | by phpor ]
// Y 函数实现的太绕了,太难以理解了, 无语。
function factorial(proc) {
return function (n) {
return (n <= 1) ? 1 : n * 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));




