清明节
DevOps
日志格式:
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
写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 的条件语句中默认是大小写不敏感的,就是说 ‘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一周了,逐渐发现了一些和原来不一样的东西。
1. 添加了开发人员工具
使用这个工具就可以调试js了,而且可以单步调试,这对IE来说,确实是一个革新,以前遇到js的问题,就打开firfox,现在不同了,IE单步调试js,一个字“爽”
2. 新标签页打开
IE7添加了标签页,但是总是要按住一个功能键才能从新的标签页打开,否则就打开新窗口;现在IE8可以直接新的标签页里打开了
3. 多进程之间的通信
IE7里面,一个窗口登录后,在新打开一个IE窗口,状态是未登录的;就是说没有进程间的通信,无意间发现IE8虽然多个窗口也是多个进程,但是一个窗口登录了,另一个窗口立马就知道了
在经过数月的等待过后,来自Medevil的蓝牙破解程序iBluetooth终于可以通过Cydia上iSpazio的源进行下载。
软件目前可以进行蓝牙文件的传输,据称已经在很多平台上进行了测试,平均传输速率为70kb/s.
软件需要到Medevil.net进行注册,免费使用期7天,完全版售价为3.99欧元。
由于目前Medevil的网站由于流量过大暂时瘫痪,暂时没有办法取得软件注册,网上只有一些零星的试用报告,更大范围的使用结果还不得而知。
另外iSpazio还表示目前软件还是存在一些bug,可能会需要经常性的respring或是重启。所以大家可以稍微观望一下或是谨慎使用。
strtotime功能强大,可以支持好多语言中的时间:
如: strtotime("Yesterday"); strtotime("tomorrow"); ….
看一段程序吧:
<?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;
}
}
使用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还是比较节省内存空间的。