古人有描写清明扫墓的诗:
三月里来是清明,桃红柳绿百草青;
别家坟上飘白纸,我家坟上冷清清。
南北山头多墓田,清明祭扫各纷然;
纸灰飞作白蝴蝶,泪血染成红杜鹃。
古墓花影白杨树,尽是生死离别处!
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;
}
}