ctrl+s是一个古老的shell控制键,在输入ctrl+q就可以恢复了
CTRL-S and CTRL-Q are called flow-control characters. They represent an antiquated way of stopping and restarting the flow of output from one device to another (e.g., from the computer to your terminal) that was useful when the speed of such output was low. They are rather obsolete in these days of high-speed networks. In fact, under the latter conditions, CTRL-S and CTRL-Q are basically a nuisance. The only thing you really need to know about them is that if your screen output becomes “stuck,” then you may have hit CTRL-S by accident. Type CTRL-Q to restart the output; any keys you may have hit in between will then take effect.
ctrl+s是一个古老的shell控制键,在输入ctrl+q就可以恢复了
CTRL-S and CTRL-Q are called flow-control characters. They represent an antiquated way of stopping and restarting the flow of output from one device to another (e.g., from the computer to your terminal) that was useful when the speed of such output was low. They are rather obsolete in these days of high-speed networks. In fact, under the latter conditions, CTRL-S and CTRL-Q are basically a nuisance. The only thing you really need to know about them is that if your screen output becomes “stuck,” then you may have hit CTRL-S by accident. Type CTRL-Q to restart the output; any keys you may have hit in between will then take effect.
ctrl+s是一个古老的shell控制键,在输入ctrl+q就可以恢复了
来自:http://cn.voidcc.com/question/p-rjdaikmm-ra.html
ASCII编码是计算机所能显示字符的编码,它的取值范围是0-255,其中包括标点、字母、数字、汉字等。在编程过程中,经常把指定的字符转化为ASCII码进行比较。
cat a.php
输出:9 就是ASCII码的:09 水平定位符号
ASCII码表:http://ascii.911cha.com/?year=09
php a.php
最后,发现用终端复制就行,用vscode就不行,经下面这段代码测试,发现是终端可以输出\n这种不可见字符,而vscode在复制时这个没了,于是word就会出现错乱。
直接终端复制就可以。
也可php aaaa.php|pbcopy
即使不加换行\n,也能正常粘贴到表格里。
php aaaa.php|pbcopy #证明pbcopy 会在行尾加换行。
下面是PHP提供的转换ASCII码和字符的函数。
1.chr()函数
该函数用于将ASCII码值转化为字符串。其函数声明如下:
string chr (int ascii);
2.ord()函数
该函数用于将字符串转化为ASCII码值。其函数声明如下:
int ord(string str);
示例:
使用chr()函数和ord()函数进行字符串与ASCII码之间的转换,程序代码如下:
<?php
$str1=chr(88);
echo $str1; //返回值为X
echo "t";
$str2=ord('S');
echo $str2; //返回值为83
?>
中文字符截取$str1=chr(88);
echo $str1; //返回值为X
echo "t";
$str2=ord('S');
echo $str2; //返回值为83
?>
ord() chr() int() intval() 的区别
ord()->本函数返回字符的 ASCII (美国国家标准交换码) 序数值。本函数和 chr() 函数相反
php chr() ord()中文截取乱码问题解决方法
<?php
$lenth = 19;
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
echo strlen($str)<=$lenth ? $str : (substr($str,0,$lenth).chr(0)."....");
?>
$lenth = 19;
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
echo strlen($str)<=$lenth ? $str : (substr($str,0,$lenth).chr(0)."....");
?>
<?
/*
@ 另一种方法,使用ord()函数:
@ 适用于 gb2312 编码:
*/
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
function gb2312_substr($str, $limit) {
$restr ='';
for($i=0;$i< $limit-3;$i++) {
$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i] : $str[$i];
}
return $restr;
}
/*
@ 以下仅适用于 utf-8 编码;
*/
function utf8_substr($str, $limit) {
$restr = '';
for($i=0;$i< $limit-3;$i++) {
$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i].$str[++$i] : $str[$i];
}
return $restr;
}
/*
@ 另一种方法,使用ord()函数:
@ 适用于 gb2312 编码:
*/
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";
function gb2312_substr($str, $limit) {
$restr ='';
for($i=0;$i< $limit-3;$i++) {
$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i] : $str[$i];
}
return $restr;
}
/*
@ 以下仅适用于 utf-8 编码;
*/
function utf8_substr($str, $limit) {
$restr = '';
for($i=0;$i< $limit-3;$i++) {
$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i].$str[++$i] : $str[$i];
}
return $restr;
}
另外一种方法:
/**
* 截取UTF-8编码下字符串的函数
*
* @access public
* @param string $str 被截取的字符串
* @param int $start 截取的起始位置
* @param int $length 截取的长度
* @param bool $append 是否附加省略号
* @return null
*/
function sub_str($str, $start=0, $length=0, $append=true)
{
$str = trim($str);
$reval = '';
if (0 == $length)
{
$length = strlen($str);
}
elseif (0 > $length)
{
$length = strlen($str) + $length;
}
if (strlen($str) <= $length) return $str;
for($i = 0; $i < $length; $i++)
{
if (!isset($str[$i])) break;
if (196 <= ord($str[$i]))
{
$i += 2 ;
$start += 2;
}
}
if ($i >= $start) $reval = substr($str, 0, $i);
if ($i < strlen($str) && $append) $reval .= "...";
return $reval;
}
//解释下上面第一个:chr(0)不是null,null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000虽然chr(0)不会显示出什么,但是他是一个字符。虽然chr(0)不会显示出什么,但是他是一个字符。当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。 * 截取UTF-8编码下字符串的函数
*
* @access public
* @param string $str 被截取的字符串
* @param int $start 截取的起始位置
* @param int $length 截取的长度
* @param bool $append 是否附加省略号
* @return null
*/
function sub_str($str, $start=0, $length=0, $append=true)
{
$str = trim($str);
$reval = '';
if (0 == $length)
{
$length = strlen($str);
}
elseif (0 > $length)
{
$length = strlen($str) + $length;
}
if (strlen($str) <= $length) return $str;
for($i = 0; $i < $length; $i++)
{
if (!isset($str[$i])) break;
if (196 <= ord($str[$i]))
{
$i += 2 ;
$start += 2;
}
}
if ($i >= $start) $reval = substr($str, 0, $i);
if ($i < strlen($str) && $append) $reval .= "...";
return $reval;
}
?>
ord.php:
[/code]
<?php
$a = chr(0);
printf("0x%x",$a);
?>
$a = chr(0);
printf("0x%x",$a);
?>
# php ord.php
0x0
来源:http://www.freesear.com/read.php?tid=4461
腾讯,深圳总部。这是失眠的夜晚。
阅读全文
阅读全文
这段:
就是登陆框里面显示的默认配置!
后面就是打开 libraries 目录下的 config.default.php 文件,依次找到下面各项,按照说明配置即可。
展示登录框的方法:
今天研究了一下phpmyadmin,想让它有个登录!在网上找了一下,自己写出来为了以后方便!
登录phpmyadmin时验证用户权限
首先进入phpmyadmin的根目录,找到libraries目录,打开config.default.php文件,
vi /usr/local/apache2/htdocs/phpMyAdmin/config.inc.php
将$cfg['Servers'][$i]['auth_type'] = 'config';
改成
$cfg['Servers'][$i]['auth_type'] = 'http';
ok!就这么简单!登录试一下!
auth/cookie.auth.lib.php
if ($GLOBALS['cfg']['LoginCookieRecall']) {
$default_user = $GLOBALS['PHP_AUTH_USER'];
$default_server = $GLOBALS['pma_auth_server'];
$autocomplete = '';
} else {
$default_user = 'kary';
$default_server = '127.0.0.1:3306';
// skip the IE autocomplete feature.
$autocomplete = ' autocomplete="off"';
}
$default_user = $GLOBALS['PHP_AUTH_USER'];
$default_server = $GLOBALS['pma_auth_server'];
$autocomplete = '';
} else {
$default_user = 'kary';
$default_server = '127.0.0.1:3306';
// skip the IE autocomplete feature.
$autocomplete = ' autocomplete="off"';
}
就是登陆框里面显示的默认配置!
后面就是打开 libraries 目录下的 config.default.php 文件,依次找到下面各项,按照说明配置即可。
展示登录框的方法:
今天研究了一下phpmyadmin,想让它有个登录!在网上找了一下,自己写出来为了以后方便!
登录phpmyadmin时验证用户权限
首先进入phpmyadmin的根目录,找到libraries目录,打开config.default.php文件,
vi /usr/local/apache2/htdocs/phpMyAdmin/config.inc.php
将$cfg['Servers'][$i]['auth_type'] = 'config';
改成
$cfg['Servers'][$i]['auth_type'] = 'http';
ok!就这么简单!登录试一下!
g++ -Wall 启用所有警告信息
g++ -w 禁用所有警告信息
g++ -Werror 在发生警告时取消编译操作
其他注意大小写:
-E 预处理后即停止,不进行编译,汇编及链接
-S 编译后即停止,不进行汇编及连接
-c 编译或汇编源文件,但不进行连接
-o 指定输出文件为file
默认是连接基本库: /usr/lib/libc.so
math.h需要的库: /usr/lib/libm.so
除非显示的制定,对于math.h没法找到那个libm.so
gcc example /usr/lib/libm.so 就可以编译通过咧。
gcc -x c++ //指定语言
static 选项强制使用静态库。
-g:获得有关调试信息,不能和常见优化如:-O1 -O2,-O3等共同使用。
g++ -w 禁用所有警告信息
g++ -Werror 在发生警告时取消编译操作
其他注意大小写:
-E 预处理后即停止,不进行编译,汇编及链接
-S 编译后即停止,不进行汇编及连接
-c 编译或汇编源文件,但不进行连接
-o 指定输出文件为file
默认是连接基本库: /usr/lib/libc.so
math.h需要的库: /usr/lib/libm.so
除非显示的制定,对于math.h没法找到那个libm.so
gcc example /usr/lib/libm.so 就可以编译通过咧。
gcc -x c++ //指定语言
static 选项强制使用静态库。
-g:获得有关调试信息,不能和常见优化如:-O1 -O2,-O3等共同使用。
背景:有时PHP在操作memcache时会出现set后删除不了疑问题(匪夷所思),需要用shell下对memcache进行调试,这样操作相对方便些。
flush_all 全清:
flush_all
注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。
用status查看其确实还占用内存。
stats
STAT total_items 18375
shell下的使用方法:
先set 几个
[root@host5-7 ~]# telnet 192.168.5.21 19867
Trying 192.168.5.21...
Connected to 192.168.5.21 (192.168.5.21).
Escape character is '^]'.
set test1 0 0 3
123
STORED
set test2 0 0 3
345
STORED
set test3 0 0 3
567
STORED
set test4 0 0 3
789
STORED
quit
Connection closed by foreign host.
实践如下:
添加,删除,修改示例:
telnet 192.168.1.100 11211
add name 0 60 5 [说明 add 是指令名 name 是key的名字 (是以key/value存放), 0 标志, 60 表示数据存放 60s 5表示 放入多大数据 ], 如果一个key已经存在,再放入是失败的.
get name [获取 name的值]
//更新
set name 0 60 5 [如果 name 这个key存在,就是更新, 如果key不存在,就是添加]
//删除
delete key值
本质shell的telnet 的Memcache通讯返回,如下:
Escape character is '^]'.
STAT pid 13574
STAT uptime 8897547
根据这个原理写了监控Memcache的shell如下:
这是通过重定向,实现socket通讯中,发送然后获取返回的例子。其实,上面代码看似一次只能发送一段。时间上。我们可以反复调用:sendmsg ,捕捉输出数据。实现连续的,读与写操作。
阅读全文
flush_all 全清:
flush_all
注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。
用status查看其确实还占用内存。
stats
STAT total_items 18375
shell下的使用方法:
先set 几个
[root@host5-7 ~]# telnet 192.168.5.21 19867
Trying 192.168.5.21...
Connected to 192.168.5.21 (192.168.5.21).
Escape character is '^]'.
set test1 0 0 3
123
STORED
set test2 0 0 3
345
STORED
set test3 0 0 3
567
STORED
set test4 0 0 3
789
STORED
quit
Connection closed by foreign host.
实践如下:
添加,删除,修改示例:
telnet 192.168.1.100 11211
add name 0 60 5 [说明 add 是指令名 name 是key的名字 (是以key/value存放), 0 标志, 60 表示数据存放 60s 5表示 放入多大数据 ], 如果一个key已经存在,再放入是失败的.
get name [获取 name的值]
//更新
set name 0 60 5 [如果 name 这个key存在,就是更新, 如果key不存在,就是添加]
//删除
delete key值
本质shell的telnet 的Memcache通讯返回,如下:
(echo "stats";sleep 2)|telnet 172.*.*.* 12000
Escape character is '^]'.
STAT pid 13574
STAT uptime 8897547
根据这个原理写了监控Memcache的shell如下:
#!/bin/sh
#通过传入ip 以及端口,发送指令获得返回数据
#copyright chengmo qq:8292669
#函数往往放到最上面
function sendmsg()
{
msg=$1;
echo "$1">&8;
getout;
}
#向socket通道发送指令,并且调用获得返回参数
function getout()
{
#read 命令 -u 从打开文件描述符 8 读取数据,-d读取数据忽略掉:\r换行符
while read -u 8 -d $'\r' name;
do
if [ "${name}" == "END" -o "${name}" == "ERROR" ];then
break;
fi;
echo $name;
done
}
#由于:memcached每次通讯完毕,会返回:END或者ERROR(出错),通过判断是否是"END"觉得读取是不是结束,否则循环不会停止
if [ $# -lt 2 ];then
echo "usage:$0 host port [command]";
exit 1;
fi;
[[ $# -gt 2 ]]&&command=$3;
#设置默认值 如果command为定义则为:stats
command="${command=stats}";
host="$1";
port="$2";
exec 8<>/dev/tcp/${host}/${port};
#打开通向通道是8
if [ "$?" != "0" ];then
echo "open $host $port fail!";
exit 1;
fi
sendmsg "$command";
#发送指定命令
sendmsg "quit";
#发送退出通向命令
exec 8<&-;
exec 8>&-;
#关闭socket通道
exit 0;
#通过传入ip 以及端口,发送指令获得返回数据
#copyright chengmo qq:8292669
#函数往往放到最上面
function sendmsg()
{
msg=$1;
echo "$1">&8;
getout;
}
#向socket通道发送指令,并且调用获得返回参数
function getout()
{
#read 命令 -u 从打开文件描述符 8 读取数据,-d读取数据忽略掉:\r换行符
while read -u 8 -d $'\r' name;
do
if [ "${name}" == "END" -o "${name}" == "ERROR" ];then
break;
fi;
echo $name;
done
}
#由于:memcached每次通讯完毕,会返回:END或者ERROR(出错),通过判断是否是"END"觉得读取是不是结束,否则循环不会停止
if [ $# -lt 2 ];then
echo "usage:$0 host port [command]";
exit 1;
fi;
[[ $# -gt 2 ]]&&command=$3;
#设置默认值 如果command为定义则为:stats
command="${command=stats}";
host="$1";
port="$2";
exec 8<>/dev/tcp/${host}/${port};
#打开通向通道是8
if [ "$?" != "0" ];then
echo "open $host $port fail!";
exit 1;
fi
sendmsg "$command";
#发送指定命令
sendmsg "quit";
#发送退出通向命令
exec 8<&-;
exec 8>&-;
#关闭socket通道
exit 0;
这是通过重定向,实现socket通讯中,发送然后获取返回的例子。其实,上面代码看似一次只能发送一段。时间上。我们可以反复调用:sendmsg ,捕捉输出数据。实现连续的,读与写操作。
阅读全文
零、使用系统的 $RANDOM 变量
echo $RANDOM
17617
$RANDOM 的范围是 [0, 32767]
如需要生成超过32767的随机数,可以用以下方法实现。
一、通过时间获得随机数(date)
这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。
例子:
[chengmo@centos5 shell]$ date +%s
1287764773
#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
#如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。
[chengmo@centos5 shell]$ date +%N
738710457
#获得当前时间的纳秒数据,精确到亿分之一秒。
#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞
[chengmo@centos5 shell]$ date +%s%N
1287764807051101270
#这个可以说比较完美了,加入了时间戳,又加上了纳秒
通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。
#!/bin/sh
#写个随机函数,调用方法random min max
#在min 与 max直接获得随机整数
#copyright chengmo QQ:8292669
#获得随机数返回值,shell函数里算出随机数后,更新该值
看看运行结果:
[chengmo@centos5 shell]$ sh testrandom.sh
1,2-10000,5600
2,2-10000,5295
3,2-10000,3432
4,2-10000,3148
5,2-10000,9041
6,2-10000,4290
7,2-10000,2380
8,2-10000,9009
9,2-10000,5474
10,2-10000,3664
一个循环里面,得到值各不相同。
这个是我们常用方法,适应各种语言,是一个通用算法,就算服务器不提供,某时刻相同唯一数据标记,我们也可以通过这种方法,做自己的伪随机数。
来源:http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html
More: http://blog.csdn.net/fdipzone/article/details/24329523
echo $RANDOM
17617
$RANDOM 的范围是 [0, 32767]
如需要生成超过32767的随机数,可以用以下方法实现。
一、通过时间获得随机数(date)
这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。
例子:
[chengmo@centos5 shell]$ date +%s
1287764773
#获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数
#如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面基本不能满足要求了。
[chengmo@centos5 shell]$ date +%N
738710457
#获得当前时间的纳秒数据,精确到亿分之一秒。
#这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现相同结果,不过不同时间里面还会有大量重复碰撞
[chengmo@centos5 shell]$ date +%s%N
1287764807051101270
#这个可以说比较完美了,加入了时间戳,又加上了纳秒
通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。
#!/bin/sh
#写个随机函数,调用方法random min max
#在min 与 max直接获得随机整数
#copyright chengmo QQ:8292669
#获得随机数返回值,shell函数里算出随机数后,更新该值
function random()
{
min=$1;
max=$2-$1;
num=$(date +%s+%N);
((retnum=num%max+min));
#进行求余数运算即可
echo $retnum;
#这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
#还有一种返回,定义全价变量,然后函数改下内容,外面读取
}
#得到1-10的seq数据项
for i in {1..10};
do
out=$(random 2 10000);
echo $i,"2-10000",$out;
done;
{
min=$1;
max=$2-$1;
num=$(date +%s+%N);
((retnum=num%max+min));
#进行求余数运算即可
echo $retnum;
#这里通过echo 打印出来值,然后获得函数的,stdout就可以获得值
#还有一种返回,定义全价变量,然后函数改下内容,外面读取
}
#得到1-10的seq数据项
for i in {1..10};
do
out=$(random 2 10000);
echo $i,"2-10000",$out;
done;
看看运行结果:
[chengmo@centos5 shell]$ sh testrandom.sh
1,2-10000,5600
2,2-10000,5295
3,2-10000,3432
4,2-10000,3148
5,2-10000,9041
6,2-10000,4290
7,2-10000,2380
8,2-10000,9009
9,2-10000,5474
10,2-10000,3664
一个循环里面,得到值各不相同。
这个是我们常用方法,适应各种语言,是一个通用算法,就算服务器不提供,某时刻相同唯一数据标记,我们也可以通过这种方法,做自己的伪随机数。
来源:http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html
More: http://blog.csdn.net/fdipzone/article/details/24329523
先上示例Demo:
awk中Match的用法test:
Hello
Welcom
What
Why
jackxiang
取得每行的大写字母:
H
W
W
W
RSTART 被匹配函数匹配的字符串首
RLENGTH 被匹配函数匹配的字符串长度
确实加LANG=C 就OK了...
GNU Awk 3.1.5
Copyright (C) 1989, 1991-2005 Free Software Foundation.
务必参考:http://www.cnblogs.com/chengmo/archive/2010/10/06/1844818.html
du -lh|awk '{if(match($1,"G") != 0) print$0}'
awk中Match的用法test:
Hello
Welcom
What
Why
jackxiang
取得每行的大写字母:
LANG=C awk ' { if(match($0,/[A-Z]+/)) print substr($0,RSTART,RLENGTH)}' test
H
W
W
W
RSTART 被匹配函数匹配的字符串首
RLENGTH 被匹配函数匹配的字符串长度
确实加LANG=C 就OK了...
awk --version
GNU Awk 3.1.5
Copyright (C) 1989, 1991-2005 Free Software Foundation.
务必参考:http://www.cnblogs.com/chengmo/archive/2010/10/06/1844818.html
cat text.txt | xargs echo -n
awk '{{printf"%s",$0}}' awkF.txt
sed去掉换行:
sed ':a;N;s/\n//;ta' awkF.txt
sed ':a;$!N;s/\n//;ta' awkF.txt
awk '{a[NR]=$0}END{for(i=1;i<=NR;i++)if(i==NR) print a[i];else printf a[i]}' awkF.txt
各级政府将大量的人力物力财力用于维稳,但社会矛盾和社会冲突的数量非但没减,反而不断增加,这种现象忽然就联想起量子物理的“测不准”原理:人不可能同时准确测量一个粒子的动能和势能,对动能的测量会影响到势能,反之亦然。社会冲突背后是利益表达机制的缺失,如果谁表达了就想普朗克定义了普朗克常量,像麦克斯韦写出了波动方程,表达了波的波粒二象性来表达电磁波一样.
黑客通常通过获取一个HTTP Response,然后解析出HTTP Response Header来知道对方用的是什么web 服务器软件,如下:
HTTP/1.1 200 OKServer: Microsoft-IIS/5.0Date: Thu, 07 Jul 2005 13:08:16 GMTContent-Length: 1270对于IIS来说有一个工具(URLScan)可以用来修改这个HTTP Response Header,让黑客得到假的Header信息,URLScan的地址:http://learn.iis.net/page.aspx/473/using-urlscan
对于Tomcat,Header一般会暴露如下信息:
修改是在conf/server.xml,在Connector 元素中设置server属性即可。如下:
对于apache呢?
只要在httpd.conf中配上如下两个参数:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dctfjy/archive/2009/06/05/4244321.aspx
HTTP/1.1 200 OKServer: Microsoft-IIS/5.0Date: Thu, 07 Jul 2005 13:08:16 GMTContent-Length: 1270对于IIS来说有一个工具(URLScan)可以用来修改这个HTTP Response Header,让黑客得到假的Header信息,URLScan的地址:http://learn.iis.net/page.aspx/473/using-urlscan
对于Tomcat,Header一般会暴露如下信息:
Server: Apache-Coyote/1.1
修改是在conf/server.xml,在Connector 元素中设置server属性即可。如下:
对于apache呢?
只要在httpd.conf中配上如下两个参数:
ServerSignature Off
ServerTokens Prod
ServerTokens Prod
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dctfjy/archive/2009/06/05/4244321.aspx
黑客通常通过获取一个HTTP Response,然后解析出HTTP Response Header来知道对方用的是什么web 服务器软件,如下:
HTTP/1.1 200 OKServer: Microsoft-IIS/5.0Date: Thu, 07 Jul 2005 13:08:16 GMTContent-Length: 1270对于IIS来说有一个工具(URLScan)可以用来修改这个HTTP Response Header,让黑客得到假的Header信息,URLScan的地址:http://learn.iis.net/page.aspx/473/using-urlscan
对于Tomcat,Header一般会暴露如下信息:
修改是在conf/server.xml,在Connector 元素中设置server属性即可。如下:
对于apache呢?
只要在httpd.conf中配上如下两个参数:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dctfjy/archive/2009/06/05/4244321.aspx
HTTP/1.1 200 OKServer: Microsoft-IIS/5.0Date: Thu, 07 Jul 2005 13:08:16 GMTContent-Length: 1270对于IIS来说有一个工具(URLScan)可以用来修改这个HTTP Response Header,让黑客得到假的Header信息,URLScan的地址:http://learn.iis.net/page.aspx/473/using-urlscan
对于Tomcat,Header一般会暴露如下信息:
Server: Apache-Coyote/1.1
修改是在conf/server.xml,在Connector 元素中设置server属性即可。如下:
对于apache呢?
只要在httpd.conf中配上如下两个参数:
ServerSignature Off
ServerTokens Prod
ServerTokens Prod
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dctfjy/archive/2009/06/05/4244321.aspx
Tsic506这个能达到 ±0.1℃温感集成块还没有到货的时候,我们开始用市面上最为普通的DS18B20来进行原理图设计实验。DS18B20温感集成块的精度只有±0.5℃,虽然便宜(只要7元人民币),但是它与昂贵的Tsic506(100元人民币)使用的是同样的单总线结构,所以用来做原理图设计实验,足够了。
在查DS18B20相关的资料的时候,无意中发现一个惊喜:看到一篇文章《DS18B20的高精度温度传感器设计》,提供了如何降低误差的方法,并且表明 “可得到误差在0.1℃以内的温度精度” 。大学老师的大作,满篇图形、公式、矩阵……,一看就感觉让人信服!
兴奋啊,想想,100元 vs. 7元!如果能提高精度,别说±0.1℃,只要能到±0.2℃就行,这可是93元的成本差别啊!
于是,仔细研读。
……
……
好景不长,因为,疑窦丛生:
1.前面四章讲的都是DS18B20原理,可以略过。第五章名为“采用最小二乘估计降低线性误差”,嗯,这是正题。
可是,一开始就感觉不对头。
第五章一上来就说“通过以上方法理论上可以得到0.1℃范围内的误差,但由于受各种因数的影响.往往误差范围能达到0.5℃。通过分析.得知误差主要来源于芯片内部半导体热噪声。其类型为线性误差,并随温度的上升而误差增大……”。这是哪儿跟哪儿啊?前四章讲的都是该芯片的内部功能结构,凭什么理论作者们可以得到“
DS18B20官方文档上的误差曲线
通过以上方法理论上可以得到0.1℃范围内的误差”这个结论?!基于这个不靠谱的结论,又说“通过分析.得知误差主要来源于芯片内部半导体热噪声。其类型为线性误差,并随温度的上升而误差增大”,凭什么?凭什么得到这几个结论啊?
2.看看DS18B20官方的文档中的误差曲线(见右图),就可以更加证明了,这篇文章的这几个推导(尤其是上面灰色字体中带下划线的部分)根本是错的!推导错了,这不是最严重的问题,这段话最严重的问题在于:没有论据,就敢如此推断!
3.作者们根据以上结论(不靠谱的结论),建立了误差模型:“为了提高估计精度,对于不同的温度区间应采用不同的修正系数.设该系统的线性误差模型如下:
T=KTγ+C
其中,T为测量值,Tγ为真实值(采用更高精度MS6506测量而得).K为随温度变化的线性误差修正系数,C为误差补偿参数……”
而后,就是大学老师擅长的一堆高数理论,最小二乘估计、矩阵、维度、极限、梯度,一顿眼花缭乱的分析,得出结论“K=1.0408.C=-1.5256,该修正系数是在25℃~40℃温度下得到的。其他温度范围内也可采用相同方法获得修正系数。根据计算得到的修正系 数编写相应的单片机程序,就可得到误差在0.1℃以内的温度精度。基于以上的理论基础,可以设计出高精度、低性价比的温度传感器”。
我们来看看灰色字体部分中那些带下划线的部分:
“K=1.0408.C=-1.5256”,如果我们用上面的这个官方的平均误差图来看,就知道这个结论是不准确的,比如说,假如我们用DS18B20去测一个30℃的温度,那么官方结论是:平均测量温度应该是在29.82℃。如果用这篇论文的计算方法,T=1.0408Tγ-1.5256,测量温度应该在29.6984℃。
“采用更高精度MS6506测量而得”。纵观整篇论文,其实验与推断的关键点在于:建立误差模型,然后通过测试,得到误差模型中的参数。所以,最后结论的准确性其实质是依赖测试的准确性。于是,我对这篇文章中两次被提及的“高精度MS6506”产生了兴趣:如果不贵,万元左右的,买一台,进行温感探头的校准,还是挺值得的,实在不行,租也可以啊。到网上一查,我的天,才几百元!几百元的温度测量设备,就能称作“高精度”?再查查,OMG,淘宝里大把的,你猜猜精度是多少?不是±0.01℃,也不是±0.1℃,也不是±0.5℃,而是±1℃!
拿±1℃的温度计去校准±0.5℃的温感探头?!这简直是太滑稽了吧!
难怪这篇文章里如此模糊地去提及这个测试设备啊,故意的吧!
不是故意的?那你这学术文章,也太不严谨了吧!
在查DS18B20相关的资料的时候,无意中发现一个惊喜:看到一篇文章《DS18B20的高精度温度传感器设计》,提供了如何降低误差的方法,并且表明 “可得到误差在0.1℃以内的温度精度” 。大学老师的大作,满篇图形、公式、矩阵……,一看就感觉让人信服!
兴奋啊,想想,100元 vs. 7元!如果能提高精度,别说±0.1℃,只要能到±0.2℃就行,这可是93元的成本差别啊!
于是,仔细研读。
……
……
好景不长,因为,疑窦丛生:
1.前面四章讲的都是DS18B20原理,可以略过。第五章名为“采用最小二乘估计降低线性误差”,嗯,这是正题。
可是,一开始就感觉不对头。
第五章一上来就说“通过以上方法理论上可以得到0.1℃范围内的误差,但由于受各种因数的影响.往往误差范围能达到0.5℃。通过分析.得知误差主要来源于芯片内部半导体热噪声。其类型为线性误差,并随温度的上升而误差增大……”。这是哪儿跟哪儿啊?前四章讲的都是该芯片的内部功能结构,凭什么理论作者们可以得到“
DS18B20官方文档上的误差曲线
通过以上方法理论上可以得到0.1℃范围内的误差”这个结论?!基于这个不靠谱的结论,又说“通过分析.得知误差主要来源于芯片内部半导体热噪声。其类型为线性误差,并随温度的上升而误差增大”,凭什么?凭什么得到这几个结论啊?
2.看看DS18B20官方的文档中的误差曲线(见右图),就可以更加证明了,这篇文章的这几个推导(尤其是上面灰色字体中带下划线的部分)根本是错的!推导错了,这不是最严重的问题,这段话最严重的问题在于:没有论据,就敢如此推断!
3.作者们根据以上结论(不靠谱的结论),建立了误差模型:“为了提高估计精度,对于不同的温度区间应采用不同的修正系数.设该系统的线性误差模型如下:
T=KTγ+C
其中,T为测量值,Tγ为真实值(采用更高精度MS6506测量而得).K为随温度变化的线性误差修正系数,C为误差补偿参数……”
而后,就是大学老师擅长的一堆高数理论,最小二乘估计、矩阵、维度、极限、梯度,一顿眼花缭乱的分析,得出结论“K=1.0408.C=-1.5256,该修正系数是在25℃~40℃温度下得到的。其他温度范围内也可采用相同方法获得修正系数。根据计算得到的修正系 数编写相应的单片机程序,就可得到误差在0.1℃以内的温度精度。基于以上的理论基础,可以设计出高精度、低性价比的温度传感器”。
我们来看看灰色字体部分中那些带下划线的部分:
“K=1.0408.C=-1.5256”,如果我们用上面的这个官方的平均误差图来看,就知道这个结论是不准确的,比如说,假如我们用DS18B20去测一个30℃的温度,那么官方结论是:平均测量温度应该是在29.82℃。如果用这篇论文的计算方法,T=1.0408Tγ-1.5256,测量温度应该在29.6984℃。
“采用更高精度MS6506测量而得”。纵观整篇论文,其实验与推断的关键点在于:建立误差模型,然后通过测试,得到误差模型中的参数。所以,最后结论的准确性其实质是依赖测试的准确性。于是,我对这篇文章中两次被提及的“高精度MS6506”产生了兴趣:如果不贵,万元左右的,买一台,进行温感探头的校准,还是挺值得的,实在不行,租也可以啊。到网上一查,我的天,才几百元!几百元的温度测量设备,就能称作“高精度”?再查查,OMG,淘宝里大把的,你猜猜精度是多少?不是±0.01℃,也不是±0.1℃,也不是±0.5℃,而是±1℃!
拿±1℃的温度计去校准±0.5℃的温感探头?!这简直是太滑稽了吧!
难怪这篇文章里如此模糊地去提及这个测试设备啊,故意的吧!
不是故意的?那你这学术文章,也太不严谨了吧!
[实践OK]shell年月日时分秒日志封装函数有必要,一行实现输出shell的年月日时分秒[2019/06/18 11:23:55],shell时间,shell创建文件,linux shell编写以日期时间为文件名的脚本学习笔记
Php/Js/Shell/Go jackxiang 2010-10-28 17:14
echo [$(date +%Y/%m/%d\ %H:%M:%S)]
[2019/06/18 11:23:55]
sh funlog.sh
[2019/06/18 11:28:32]: INFO a message
=============================================================================
shell时间:
会生成俩文件:
/root/test_logtime.2819:26
来源:http://liubin.blog.51cto.com/282313/166927
[2019/06/18 11:23:55]
sh funlog.sh
[2019/06/18 11:28:32]: INFO a message
=============================================================================
shell时间:
a=`date +%Y%m%d`
echo $a;
echo $a;
# sh data.sh
20101028
20101028
#!/bin/sh
#log
MYDATE=`date +%d%m%y`
#append MYDATE to the variable LOGFILE that holds the actual filename of the log
LOGFILE=/root/test_log.$MYDATE
#create the file
>$LOGFILE
MYTIME=`date +%d%R`
LOGFILE2=/root/test_logtime.$MYTIME
#create the file
>$LOGFILE2
#log
MYDATE=`date +%d%m%y`
#append MYDATE to the variable LOGFILE that holds the actual filename of the log
LOGFILE=/root/test_log.$MYDATE
#create the file
>$LOGFILE
MYTIME=`date +%d%R`
LOGFILE2=/root/test_logtime.$MYTIME
#create the file
>$LOGFILE2
会生成俩文件:
ls /root/test_log.281010
/root/test_log.281010ls /root/test_logtime.2819:26
/root/test_logtime.2819:26
来源:http://liubin.blog.51cto.com/282313/166927
对用户号码分为1000个表,0--->999,咋个通过awk去管理里面的一些号码呢,那就是用如下的方法,构造SQL语句:
执行了后显示如下结果:
881607843494
8881575730024
888844538713
8881547203329
8881551222564
8881620264123
8881098097115
8881622129944
8881311344768
8881609513205
8881643662199
8881652446787
8881664232709
8881623970620
8881642895112
8881436794690
8881359061975
8881575730024
888844538713
8881547203329
8881551222564
8881620264123
8881098097115
8881622129944
8881311344768
8881609513205
8881643662199
8881652446787
8881664232709
8881623970620
8881642895112
8881436794690
8881359061975
cat QQ.txt |awk '{print "select * from Tbl_User_"$1%1000 "where FQQ='\''" $1 "'\'';"}'
执行了后显示如下结果:
select * from Tbl_User_494where FQQ='1607843494';
select * from Tbl_User_24where FQQ='1575730024';
select * from Tbl_User_713where FQQ='844538713';
select * from Tbl_User_329where FQQ='1547203329';
select * from Tbl_User_564where FQQ='1551222564';
select * from Tbl_User_123where FQQ='1620264123';
select * from Tbl_User_115where FQQ='1098097115';
select * from Tbl_User_944where FQQ='1622129944';
select * from Tbl_User_768where FQQ='1311344768';
select * from Tbl_User_205where FQQ='1609513205';
select * from Tbl_User_199where FQQ='1643662199';
select * from Tbl_User_787where FQQ='1652446787';
select * from Tbl_User_709where FQQ='1664232709';
select * from Tbl_User_620where FQQ='1623970620';
select * from Tbl_User_112where FQQ='1642895112';
select * from Tbl_User_690where FQQ='1436794690';
select * from Tbl_User_975where FQQ='1359061975';
select * from Tbl_User_24where FQQ='1575730024';
select * from Tbl_User_713where FQQ='844538713';
select * from Tbl_User_329where FQQ='1547203329';
select * from Tbl_User_564where FQQ='1551222564';
select * from Tbl_User_123where FQQ='1620264123';
select * from Tbl_User_115where FQQ='1098097115';
select * from Tbl_User_944where FQQ='1622129944';
select * from Tbl_User_768where FQQ='1311344768';
select * from Tbl_User_205where FQQ='1609513205';
select * from Tbl_User_199where FQQ='1643662199';
select * from Tbl_User_787where FQQ='1652446787';
select * from Tbl_User_709where FQQ='1664232709';
select * from Tbl_User_620where FQQ='1623970620';
select * from Tbl_User_112where FQQ='1642895112';
select * from Tbl_User_690where FQQ='1436794690';
select * from Tbl_User_975where FQQ='1359061975';
这个应该是这样的,在你上次调试的时候,chwh.exe 没有正常退出(可以通过任务管理器查看出此进程是否正在运行).
//那个error主要是在进程里通过任务管理器查看出此进程还在运行,终止就行了,在我这就可以运行
//那个error主要是在进程里通过任务管理器查看出此进程还在运行,终止就行了,在我这就可以运行
int类型究竟占几个字节:
最近在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节。后来,查了The C Programming language这本书,里面有一句话是这样的:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节(例如,GCC)。
From: https://blog.51cto.com/charlesxie/939680
字节(Byte)是存储数据的基本单位,并且是硬件所能访问的最小单位。前面说过,CPU 只能直接处理内存数据,不能直接处理硬盘数据。硬盘数据必须先调入内存条中才可以运行。内存中存储数据的最小单位是“位(Bit)”。字节是存储数据的基本单位,位是存储数据的最小单位,不要混淆了。
内存里面存放的全是二进制代码。内存里面有很多“小格子”,每个“格子”中只能存放一个 0 或 1。一个“小格子”就是一位,所以“位”要么是 0,要么是 1,不可能有比位更小的单位。那么字节和位是什么关系呢?8 个“小格子”就是一字节,即一字节等于 8 位。
那么为什么硬件所能访问的最小单位是字节,而不是位呢?因为硬件是通过地址总线访问内存的,而地址是以字节为单位进行分配的,所以地址总线只能精确到字节。那如何控制到它的某一位呢?这个只能通过“位运算符”,即通过软件的方式来控制。
字节换算
常见的存储单位主要有bit(位)、B(字节)、KB(千字节)、MB(兆字节)、GB(千兆字节)。它们之间主要有如下换算关系:
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
其中 B 是 Byte 的缩写。
https://blog.csdn.net/wydyd110/article/details/84589541
Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,
有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647(约为21亿)。
对32位cpu来说
整型的范围为 -2147483648~~~2147483647 这个应该对吧?
那无符号整型为:0 ~~~ 4694967295 对吧
按理说 我定义个 unsigned int aaa=2147483648; 没有越界阿
不知道为什么得到的结果不对!!
printf("%ld\n",aaa); 得到的结果是:
-2147483648
帮忙给解释一下吧 !!
这一打印就对了:
特别注意:
程序在编译时分配内存,所以比如int型占多少内存是看编译器的,在TC2.0里,int占用2个字节,在VC6.0或WinGW是占4个字节的。其它类型的内存占用问题类似。而C-Free是一个IDE(集成开发环境),将许多的工具(比如:编译器、调试器……)集成在一起,形成一个比较方便的开发工具,其中编译器用的是WInGW,所以是占4个字节!
最近在看深入理解计算机系统这本书,上面提到了在32位机器和64机器中int类型都占用4个字节。后来,查了The C Programming language这本书,里面有一句话是这样的:Each compiler is free to choose appropriate sizes for its own hardware, subject only to the restriction that shorts and ints are at least 16bits, longs are at least 32bits, and short is no longer than int, which is no longer than long.意思大致是编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节(例如,GCC)。
From: https://blog.51cto.com/charlesxie/939680
字节(Byte)是存储数据的基本单位,并且是硬件所能访问的最小单位。前面说过,CPU 只能直接处理内存数据,不能直接处理硬盘数据。硬盘数据必须先调入内存条中才可以运行。内存中存储数据的最小单位是“位(Bit)”。字节是存储数据的基本单位,位是存储数据的最小单位,不要混淆了。
内存里面存放的全是二进制代码。内存里面有很多“小格子”,每个“格子”中只能存放一个 0 或 1。一个“小格子”就是一位,所以“位”要么是 0,要么是 1,不可能有比位更小的单位。那么字节和位是什么关系呢?8 个“小格子”就是一字节,即一字节等于 8 位。
那么为什么硬件所能访问的最小单位是字节,而不是位呢?因为硬件是通过地址总线访问内存的,而地址是以字节为单位进行分配的,所以地址总线只能精确到字节。那如何控制到它的某一位呢?这个只能通过“位运算符”,即通过软件的方式来控制。
字节换算
常见的存储单位主要有bit(位)、B(字节)、KB(千字节)、MB(兆字节)、GB(千兆字节)。它们之间主要有如下换算关系:
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB
其中 B 是 Byte 的缩写。
https://blog.csdn.net/wydyd110/article/details/84589541
Long(长整型)变量存储为 32 位(4 个字节)有符号的数值形式,
有符号的数值形式,其范围从 -2,147,483,648 到 2,147,483,647(约为21亿)。
对32位cpu来说
整型的范围为 -2147483648~~~2147483647 这个应该对吧?
那无符号整型为:0 ~~~ 4694967295 对吧
按理说 我定义个 unsigned int aaa=2147483648; 没有越界阿
不知道为什么得到的结果不对!!
printf("%ld\n",aaa); 得到的结果是:
-2147483648
帮忙给解释一下吧 !!
printf("%ld\n",aaa); 得到的结果是:
-2147483648
帮忙给解释一下吧 !!
-2147483648
帮忙给解释一下吧 !!
这一打印就对了:
printf("%u\n",aaa);
特别注意:
程序在编译时分配内存,所以比如int型占多少内存是看编译器的,在TC2.0里,int占用2个字节,在VC6.0或WinGW是占4个字节的。其它类型的内存占用问题类似。而C-Free是一个IDE(集成开发环境),将许多的工具(比如:编译器、调试器……)集成在一起,形成一个比较方便的开发工具,其中编译器用的是WInGW,所以是占4个字节!