apache日志分析命令

日志格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\""

实时查看:
tail -f access_log | awk -F"[" ‘{print $2}’ | awk -F"]" ‘{print $1}’ | uniq -c
结果显示每秒的访问量,如果只关心某个接口,添加grep就行了

按天统计:
cat access_log.20090401 | php -R ‘preg_match("/(GET|POST){1} (\/[^? ]+)/",$argn, $matches);$arr[$matches[2]]++; $sum++;’ -E ‘foreach($arr as $key=>$val) echo $val . "\t" . $val/$sum*100 ."%\t". $key ."\n"; echo "total\t$sum";’ |sort -nr

统计查询字符串里面的某个参数:

cat access_log.20090401 | php -R ‘preg_match("/(GET|POST) [^\"]*entry=([^& ]*)[&
]?/",$argn,$matches);echo $matches[2]."\n";’ | sort -n | uniq -c | sort -rn


匹配2009-08-27~29 三天的日志,用户名以 _[0-9a-z]{5} 结尾:

grep  space /data2/ssologs/login/200908/*2[7-9] | grep "| LoginFlow |" | grep "| 2 |" | grep credentail |  awk -F "|"  –posix ‘$6 ~ / [^_]+_[0-9a-z]{5} $/’

注意: 这里的 {} 属于posix的正则,需要选项 –posix

 

关于js的加载顺序

写JavaScript时,加载顺序是非常关心的,下面的一个脚本演示了加载的顺序:

演示地址:
http://phpor.net/projects/js/test_async.js.php?m=a
http://phpor.net/projects/js/test_async.js.php?m=b
http://phpor.net/projects/js/test_async.js.php?m=c
http://phpor.net/projects/js/test_async.js.php?m=d
http://phpor.net/projects/js/test_async.js.php?m=e

—————————test_async.js.php

<?php

if(isset($_GET[‘js2’])){
        
sleep(1);
        echo 
"alert(‘outer2 js’);";
        exit();
}

if(isset($_GET[‘js’])){
        
//sleep(1);
        
echo ‘document.write(\'<script src="?js2"></script>\’);’;
        echo 
"alert(‘outer js’);";
        exit();
}
if(
$_GET[‘m’] == ‘a’){
        echo 
‘<script src="?js"></script>’;
        echo 
‘<script> alert("inner js"); </script>’;
} else if(
$_GET[‘m’] == ‘b’){
        echo 
‘<script>document.write(\'<script src="?js"><\/script>\’);alert("inner js");</script>’;
} else if(
$_GET[‘m’] == ‘c’){
        echo 
‘<script>document.write(\'<script src="?js"><\/script>\’);</script><script>alert("inner js");</script>’;
} else {
?>
<script>
var loadScript = function (id, scriptSource, charset) {
        var head = document.getElementsByTagName(‘head’)[0];
        var oldScript = document.getElementById(id);
        if (oldScript) {
                head.removeChild(oldScript);
        }
        var newScript = document.createElement(‘script’);
        if (charset) {
                newScript.charset = charset;
        } else { 
                newScript.charset = ‘gb2312’;
        }
        newScript.id = id;
        newScript.type = ‘text/javascript’;
        newScript.src = scriptSource;
        head.appendChild(newScript);
};
</script>
<?php
        
if($_GET[‘m’] == ‘d’) {
                echo 
‘<script >loadScript("scriptid","?js");</script>’;
                echo 
‘<script> alert("inner js"); </script>’;
        } else if(
$_GET[‘m’] == ‘e’){
                echo 
‘<script >loadScript("scriptid","?js");alert("inner js");</script>’;
        }
}

?>

——————————————————

mysql 大小写敏感比较 binary

mysql 的条件语句中默认是大小写不敏感的,就是说 ‘a’=’A’  结果为true;如果才能让 a !=A呢? 使用binary关键字,但是还要注意一下问题:

表结构:

mysql> desc innodb;

+———+————–+——+—–+———+——-+

| Field   | Type         | Null | Key | Default | Extra |

+———+————–+——+—–+———+——-+

| name    | varchar(100) | NO   | PRI |         |       |

| content | mediumtext   | YES  |     | NULL    |       |

+———+————–+——+—–+———+——-+

2 rows in set (0.09 sec)

 

表内容:

mysql> select * from innodb;

+——+———+

| name | content |

+——+———+

| c    | d       |

| d    | d       |

| e    | d       |

| kkk  | ttttt   |

+——+———+

4 rows in set (0.01 sec)

 

查询使用了主键索引:

mysql> desc select * from innodb where  name= "C";
+—-+————-+——–+——+—————+———+———+——-+——+————-+
| id | select_type | table  | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+—-+————-+——–+——+—————+———+———+——-+——+————-+
|  1 | SIMPLE      | innodb | ref  | PRIMARY       | PRIMARY | 202     | const |    1 | Using where |
+—-+————-+——–+——+—————+———+———+——-+——+————-+
1 row in set (0.00 sec)

 

使用binary时,主键索引用不上了:

mysql> desc select * from innodb where binary name= "C";
+—-+————-+——–+——+—————+——+———+——+——+————-+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+—-+————-+——–+——+—————+——+———+——+——+————-+
|  1 | SIMPLE      | innodb | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
+—-+————-+——–+——+—————+——+———+——+——+————-+
1 row in set (0.01 sec)

 

修改表结构,直接将列设置为

mysql> alter table innodb modify name  varchar(100) BINARY NOT NULL default ” ;
Query OK, 4 rows affected (0.40 sec)
Records: 4  Duplicates: 0  Warnings: 0

 

显示name列是binary的了,查看一下:

mysql> show create table innodb;
+——–+———————————————————————————
| Table  | Create Table
+——–+———————————————————————————
| innodb | CREATE TABLE innodb (
  name varchar(100) character set gbk collate gbk_bin NOT NULL default ”,
  content mediumtext,
  PRIMARY KEY  (name)
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+——–+———————————————————————————
1 row in set (0.01 sec)

 

再测试select看看是否能用上索引:

 

mysql> desc select * from innodb where name= "C";
+—-+————-+——-+——+—————+——+———+——+——+—————————————————–+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                               |
+—-+————-+——-+——+—————+——+———+——+——+—————————————————–+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
+—-+————-+——-+——+—————+——+———+——+——+—————————————————–+
1 row in set (0.00 sec)

 

很遗憾,索引还是没有用上

 

结论: 主键不要设置为binary的,否则索引无效,如果真的希望主键是大小写敏感的,可能有别的办法,继续探索。。。

 

binary的试试:

IE8新感受

听说IE8 出来了,就试个新儿,装了IE8一周了,逐渐发现了一些和原来不一样的东西。

1.  添加了开发人员工具
     使用这个工具就可以调试js了,而且可以单步调试,这对IE来说,确实是一个革新,以前遇到js的问题,就打开firfox,现在不同了,IE单步调试js,一个字“爽”

2. 新标签页打开
     IE7添加了标签页,但是总是要按住一个功能键才能从新的标签页打开,否则就打开新窗口;现在IE8可以直接新的标签页里打开了

3. 多进程之间的通信
     IE7里面,一个窗口登录后,在新打开一个IE窗口,状态是未登录的;就是说没有进程间的通信,无意间发现IE8虽然多个窗口也是多个进程,但是一个窗口登录了,另一个窗口立马就知道了

 

苹果apple iphone蓝牙破解软件iBluetooth被破解

      在经过数月的等待过后,来自Medevil的蓝牙破解程序iBluetooth终于可以通过Cydia上iSpazio的源进行下载。

      软件目前可以进行蓝牙文件的传输,据称已经在很多平台上进行了测试,平均传输速率为70kb/s.

      软件需要到Medevil.net进行注册,免费使用期7天,完全版售价为3.99欧元。
由于目前Medevil的网站由于流量过大暂时瘫痪,暂时没有办法取得软件注册,网上只有一些零星的试用报告,更大范围的使用结果还不得而知。

      另外iSpazio还表示目前软件还是存在一些bug,可能会需要经常性的respring或是重启。所以大家可以稍微观望一下或是谨慎使用。

文件打开时被重命名的情况

看一段程序吧:

<?php
file_put_contents
(‘a’,‘A’
);
$fp fopen(‘a’,‘w’
);
rename(‘a’,‘b’
);
fwrite($fp,‘B’
);
echo 
file_get_contents(‘a’
);
fclose($fp
);
exit;
?>

结论: 文件a被打开时,重命名为b,此时想资源描述符里写的内容实际写到了b文件里了。

另一种情况:

1. a进程打开文件file1

2. b进程删除file1

3. a进程向file1里写东西, 这时不会报错

4. a进程退出,这时文件被真正删除

两个栈实现队列的功能

用两个栈实现一个队列的功能?

思路:

  假设两个栈 A 和B,且都为空。
  可以认为栈 A 为提供入队列的功能,栈 B 提供出队列的功能。
  入队列: 入栈 A
  出队列:
  1 如果栈B 不为空,直接弹出栈 B 的数据。
  2 如果栈 B 为空,则依次弹出栈 A 的数据,放入栈 B 中,再弹出栈 B 的数据。

 

StatckOne.java 
import java
.util.ArrayList

public class StatckOne 

    private static ArrayList al

    public StatckOne() { 
        if (
al == null

            
al = new ArrayList
(); 

    } 

    public void put(Object o) { 
        
al.add(o
); 
    } 

    public Object top() { 
        
int size al.size
(); 
        if (
al != null
) { 
            if (
size != 0
) { 
                
System.out.println("StatckOne"
); 
                return 
al.get(size – 1
); 
            } else 
                
System.out.println("栈中没有对象"
); 
        } else 
            
System.out.println("没有初始化"
); 
        
System.out.println("StatckOne"
); 
        return 
null

    } 

}

php序列化与json格式的比较

使用mc时,我们会考虑数据的存储格式;php的函数允许我们直接set一个数组到mc里,取出来后也可以直接当做数组来用,确实很简单,但是和json格式比较了一下才发现,简单的代价是浪费了更大的空间,下面是一个小的测试程序:

<?php
$host 
"10.10.10.10"
;
$port "11211"
;

$uid "103630";
$p1 
= array(
    
"et"=>"103630"
// expire time
    
"pt"=>"103630"
//
    
"pv"=>"103630"
,
    
"ut"=>"103630"
,
    
"st"=>"103630"
,
    
"pp"=>"103630"
,
    
"s"=>"103630"
,
    
"ot"=>
"103630"

);
$data[] = $p1
;
$mc = new Memcache
();
$mc->connect($host,$port
);
$mc->set(103631,$data
);
$mc->set(103632,json_encode($data
));
?>

telnet 10.10.10.10 11211
get 103631
VALUE 103631 1 191
a:1:{i:0;a:8:{s:2:"et";s:6:"103630";s:2:"pt";s:6:"103630";s:2:"pv";s:6:"103630";s:2:"ut";s:6:"103630";s:2:"st";s:6:"103630";s:2:"pp";s:6:"103630";s:1:"s";s:6:"103630";s:2:"ot";s:6:"103630";}}
END
get 103632
VALUE 103632 0 114
[{"et":"103630","pt":"103630","pv":"103630","ut":"103630","st":"103630","pp":"103630","s":"103630","ot":"103630"}]
END

可见json还是比较节省内存空间的。

三八妇女节

三八妇女节男同胞活动安排表:
6:00起床洗衣服(手洗、严禁使用洗衣机)。要求声音控制在10分贝以下。
6:30分,拖地,三遍以上。拖完后用干布擦干。
7:30分,出门买菜,老婆喜欢吃什么就买什么,自己喜欢吃什么坚决不买。
8:30分,做早餐,要注意营养搭配。做好后,坐床头等老婆睡到自然醒。
9:30分,等老婆吃完早餐,陪老婆逛街,带好1000元现钱及卡备用。
12:00左右,请老婆吃最好的西餐。(地点由老婆选)
14:00,陪老婆继续逛街。老婆允许的情况下可以买瓶水,但必须老婆先喝。
17:00回家做饭。备红酒、水果、西点等。
19:00陪老婆看电视。频道、时间由老婆选定,不许说话。
22:00哄老婆睡觉。老婆睡着的情况下,可以自由活动。
注:(男同胞打印一份,周日照着做。女同胞也打一份,周日回去要老公照着做)