分类目录归档:编程语言

作为一名计算机宅男,总得要学会一些编程技巧。在这里就将学习过程进行一次展示….

DB2基础函数大全

折腾了DB2也有一段时间了 但是发觉自己都只是查询一下其基本的表项
然而 考虑到以后可能要进行报表的统计 单纯的select语句已经不再够用
所以得要从基本函数着手 开始深入学习DB2了…..

AVG()
返回一组数值的平均值.

SELECT AVG(SALARY) FROM BSEMPMS;

CORR(),CORRELATION()
返回一对数值的关系系数.

SELECT CORRELATION(SALARY,BONUS) FROM BSEMPMS;

COUNT()
返回一组行或值的个数.

SELECT COUNT(*) FROM BSEMPMS;

COVAR(),COVARIANCE()
返回一对数值的协方差.

SELECT COVAR(SALARY,BONUS) FROM BSEMPMS;

MAX()
返回一组数值中的最大值.

SELECT MAX(SALARY) FROM BSEMPMS;

MIN()
返回一组数值中的最小值.

SELECT MIN(SALARY) FROM BSEMPMS;

STDDEV()
返回一组数值的标准偏差.

SELECT STDDEV(SALARY) FROM BSEMPMS;

SUM()
返回一组数据的和.

SELECT SUM(SALARY) FROM BSEMPMS;

VAR(),VARIANCE()
返回一组数值的方差.

SELECT VARIANCE(SALARY) FROM BSEMPMS;

ABS(),ABSVAL()
返回参数的绝对值.

SELECT ABS(-3.4) FROM BSEMPMS;

ACOS()
返回参数的反余弦值.

SELECT ACOS(0.9) FROM BSEMPMS;

ASCII()
返回整数参数最左边的字符的ASCII码.

SELECT ASCII('R') FROM BSEMPMS;

ASIN()
返回用弧度表示的角度的参数的反正弦函数.

SELECT ASIN(0.9) FROM BSEMPMS;

ATAN()
返回参数的反正切值,该参数用弧度表示的角度的参数.

SELECT ATAN(0.9) FROM BSEMPMS;

ATAN2()
返回用弧度表示的角度的X和Y坐标的反正切值.

SELECT ATAN2(0.5,0.9) FROM BSEMPMS;

BIGINT()
返回整型常量中的数字或字符串的64位整数表示

SELECT BIGINT(EMP_NO) FROM BSEMPMS;

CEILING() OR CEIL()
返回比参数大或等于参数的最小的整数值
CHAR()
返回日期时间型,字符串,整数,十进制或双精度浮点数的字符串表示.

SELECT CHAR(SALARY,',') FROM BSEMPMS;

CHR()
返回具有由参数指定的ASCII码的字符

SELECT CHAR(167) FROM BSEMPMS;

CONCAT()
返回两个字符串的连接.

SELECT CONCAT(EMP_NO,EMP_NAM) FROM BSEMPMS;

YEAR()
返回数值的年部分.

SELECT YEAR('2003/01/02') FROM BSEMPMS;

VARCHAR()
返回字符串,日期型,图形串的可变长度的字符串表示

SELECT VARCHAR(EMP_NAM,50) FROM BSEMPMS;

UCASE() OR UPPER()
返回字符串的大写
TRUNCATE() OR TRUNC()
从表达式小数点右边的位置开始截断并返回该数值.

SELECT TRUNCATE(345.6789,2) FROM BSEMPMS;

TIME()
返回一个数值中的时间

SELECT TIME('2001-03-19.12.30.123456') FROM BSEMPMS;

SUBSTR(EXP1,EXP2)
返回EXP1串自EXP2处开始的子串.
SQRT()
返回该参数的平方根.

SELECT SQRT(36) FROM BSEMPMS;

SPACE()
返回由参数指定的长度,包含空格在内的字符串.

SELECT SPACE(10) FROM BSEMPMS;

SECOND()
返回一个数值的秒部分.

SELECT SECOND('18:34:32') FROM BSEMPMS;

RTRIM()
删除字符串尾部的空格.

SELECT RTRIM('COMMENT') FROM BSEMPMS;

ROUND(EXP1,EXP2)
返回EXP1小数点右边的第EXP2位置处开始的四舍五入值.

SELECT ROUND(2345.6789,2) FROM BSEMPMS;

REPLACE(EXP1,EXP2,EXP3)
用EXP3替代EXP1中所有的EXP2

SELECT CHAR(REPLACE('ROMANDD','NDD','CCB'),10) FROM BSEMPMS;

REPEAT(EXP1,EXP2)
返回EXP1重复EXP2次后的字符串.

SELECT CHAR(REPEAT('REPEAT',3),21) FROM BSEMPMS;

REAL()
返回一个数值的单精度浮点数表示.

SELECT REAL(10) FROM BSEMPMS;

RAND()
返回0和1之间的随机浮点数.

SELEC TRAND() FROM BSEMPMS;

POWER(EXP1,EXP2)
返回EXP1的EXP2次幂.

SELEC TPOWER(2,5) FROM BSEMPMS;

POSSTR(EXP1,EXP2)
返回EXP2在EXP1中的位置.

SELECT ('ABCDEFGH','D') FROM BSEMPMS;

NULLIF(EXP1,EXP2)
如果EXP1=EXP2,则为NULL,否则为EXP1
NODENUMBER()
返回行的分区号.

SELECT NODENUMBER(EMP_NO) FROM BSEMPMS;

MONTH()
返回一个数值的月部分.

SELECT MONTH('2003/10/20') FROM BSEMPMS;

MOD(EXP1,EXP2)
返回EXP1除以EXP2的余数.

SELECT MOD(20,8) FROM BSEMPMS
<strong>MINUTE()
</strong>返回一个数值的分钟部分.
SELECT MINUTE('18:34:23') FROM BSEMPMS;

LTRIM()
删除字符串前面的空格.

SELECT LTRIM('CDDD') FROM BSEMPMS;

HOUR()
返回一个数值的小时部分.

SELECT HOUR('18:34:23') FROM BSEMPMS;

DOUBLE()
如果参数是一个数字表达式,返回与其相对应的浮点数,如果参数是字符串表达式,则返回该数的字符串表达式.

SELECT DOUBLE('5678') FROM BSEMPMS;

EXP()
返回参数的指数函数.

SELECT EXP(2) FROM BSEMPMS;

FLOAT()
返回一个数的浮点表示.

SELECT FLOAT(789) FROM BSEMPMS;

FLOOR()
返回小于或等于参数的最大整数.SLECTFLOOR(88.93) FROM BSEMPMS;

HEX()
返回一个表示为字符串的值的16进制表示.

SELECT HEX(16) FROM BSEMPMS;

DAYNAME
返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。
DAYOFWEEK
返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期日。
DAYOFWEEK_ISO
返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期一。
DAYOFYEAR
返回参数中一年中的第几天,用范围在1-366 的整数值表示。
DAYS
返回日期的整数表示。
JULIAN_DAY
返回从公元前4712 年1 月1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。
MIDNIGHT_SECONDS
返回午夜和参数中指定的时间值之间的秒数,用范围在0 到86400 之间的整数值表示。
MONTHNAME
对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。
TIMESTAMP_ISO
根据日期、时间或时间戳记参数而返回一个时间戳记值。
TIMESTAMP_FORMAT
从已使用字符模板解释的字符串返回时间戳记。
TIMESTAMPDIFF
根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。
TO_CHAR
返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是VARCHAR_FORMAT 的同义词。
TO_DATE
从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是TIMESTAMP_FORMAT 的同义词。
WEEK
返回参数中一年的第几周,用范围在1-54 的整数值表示。以星期日作为一周的开始。
WEEK_ISO
返回参数中一年的第几周,用范围在1-53 的整数值表示。

要使当前时间或当前时间戳记调整到GMT/CUT,则把当前的时间或时间戳记减去当前时区寄存器:
current time – current timezone
current timestamp – current timezone

给定了日期、时间或时间戳记,则使用适当的函数可以单独抽取出(如果适用的话)年、月、日、时、分、秒及微秒各部分:
YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)

因为没有更好的术语,所以您还可以使用英语来执行日期和时间计算:
current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS – 3 MINUTES + 10 SECONDS

从时间戳记单独抽取出日期和时间也非常简单:
DATE (current timestamp)
TIME (current timestamp)

而以下示例描述了如何获得微秒部分归零的当前时间戳记:

CURRENT TIMESTAMP – MICROSECOND (current timestamp) MICROSECONDS

如果想将日期或时间值与其它文本相衔接,那么需要先将该值转换成字符串。为此,只要使用CHAR() 函数:

char(current date)
char(current time)
char(current date + 12 hours)

要将字符串转换成日期或时间值,可以使用:

TIMESTAMP (‘2002-10-20-12.00.00.000000’)
TIMESTAMP (‘2002-10-20 12:00:00’)
DATE (‘2002-10-20′)
DATE (’10/20/2002′)
TIME (’12:00:00’)
TIME (‘12.00.00’)

TIMESTAMP()、DATE() 和TIME() 函数接受更多种格式。上面几种格式只是示例,我将把它作为一个练习,让读者自己去发现其它格式。

有时,您需要知道两个时间戳记之间的时差。为此,DB2 提供了一个名为TIMESTAMPDIFF() 的内置函数。但该函数返回的是近似值,因为它不考虑闰年,而且假设每个月只有30 天。以下示例描述了如何得到两个日期的近似时差:

timestampdiff (, char(
timestamp(‘2002-11-30-00.00.00’)-
timestamp(‘2002-11-08-00.00.00’)))

对于,可以使用以下各值来替代,以指出结果的时间单位:

1 = 秒的小数部分
2 = 秒
4 = 分
8 = 时
16 = 天
32 = 周
64 = 月
128 = 季度
256 = 年
当日期很接近时使用timestampdiff() 比日期相差很大时精确。如果需要进行更精确的计算,可以使用以下方法来确定时差(按秒计):

(DAYS(t1) – DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) – MIDNIGHT_SECONDS(t2))

为方便起见,还可以对上面的方法创建SQL 用户定义的函数:

CREATE FUNCTION secondsdiff(t1 TIMESTAMP, t2 TIMESTAMP)
RETURNS INT
RETURN (
(DAYS(t1) – DAYS(t2)) * 86400 +
(MIDNIGHT_SECONDS(t1) – MIDNIGHT_SECONDS(t2))
)
@

如果需要确定给定年份是否是闰年,以下是一个很有用的SQL 函数,您可以创建它来确定给定年份的天数:

CREATE FUNCTION daysinyear(yr INT)
RETURNS INT
RETURN (CASE (mod(yr, 400)) WHEN 0 THEN 366 ELSE
CASE (mod(yr, 4)) WHEN 0 THEN
CASE (mod(yr, 100)) WHEN 0 THEN 365 ELSE 366 END
ELSE 365 END
END)@

最后,以下是一张用于日期操作的内置函数表。它旨在帮助您快速确定可能满足您要求的函数,但未提供完整的参考。有关这些函数的更多信息,请参考SQL 参考大全。

SQL 日期和时间函数
DAYNAME 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。
DAYOFWEEK 返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期日。
DAYOFWEEK_ISO 返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期一。
DAYOFYEAR 返回参数中一年中的第几天,用范围在1-366 的整数值表示。
DAYS 返回日期的整数表示。
JULIAN_DAY 返回从公元前4712 年1 月1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。
MIDNIGHT_SECONDS 返回午夜和参数中指定的时间值之间的秒数,用范围在0 到86400 之间的整数值表示。
MONTHNAME 对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。
TIMESTAMP_ISO 根据日期、时间或时间戳记参数而返回一个时间戳记值。
TIMESTAMP_FORMAT 从已使用字符模板解释的字符串返回时间戳记。
TIMESTAMPDIFF 根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。
TO_CHAR 返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是VARCHAR_FORMAT 的同义词。
TO_DATE 从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是TIMESTAMP_FORMAT 的同义词。
WEEK 返回参数中一年的第几周,用范围在1-54 的整数值表示。以星期日作为一周的开始。
WEEK_ISO 返回参数中一年的第几周,用范围在1-53 的整数值表示。
db2日期操作函数
db2日期操作函数
当前时间:
CURRENT DATE
CURRENT TIME
CURRENT TIMESTAMP
获取时间的年、月、日、时、分、秒及微秒各部分:
YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)
时间的加减:
current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS – 3 MINUTES + 10 SECONDS
要计算两个日期之间的天数,您可以对日期作减法:
days (current date) – days (date(‘1999-10-22’))
时间转换为字符串:
char(current date)
字符串转换成时间:
TIMESTAMP()、DATE() 和TIME(), 支持的字符串格式需要参考帮助, 没有oracle的to_date灵活
Data(‘2005-01-01’)
日期和时间的一些函数:
DAYNAME 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。
DAYOFWEEK 返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期日。
DAYOFWEEK_ISO 返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期一。
DAYOFYEAR 返回参数中一年中的第几天,用范围在1-366 的整数值表示。
DAYS 返回日期的整数表示。
JULIAN_DAY 返回从公元前4712 年1 月1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。
MIDNIGHT_SECONDS 返回午夜和参数中指定的时间值之间的秒数,用范围在0 到86400 之间的整数值表示。
MONTHNAME 对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。
TIMESTAMP_ISO 根据日期、时间或时间戳记参数而返回一个时间戳记值。
TIMESTAMP_FORMAT 从已使用字符模板解释的字符串返回时间戳记。
TIMESTAMPDIFF 根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。
TO_CHAR 返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是VARCHAR_FORMAT 的同义词。
TO_DATE 从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是TIMESTAMP_FORMAT 的同义词。
WEEK 返回参数中一年的第几周,用范围在1-54 的整数值表示。以星期日作为一周的开始。
WEEK_ISO 返回参数中一年的第几周,用范围在1-53 的整数值表示。
因为没有更好的术语,所以您还可以使用英语来执行日期和时间计算:

current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS – 3 MINUTES + 10 SECONDS

要计算两个日期之间的天数,您可以对日期作减法,如下所示:

days (current date) – days (date(‘1999-10-22’))

而以下示例描述了如何获得微秒部分归零的当前时间戳记:

CURRENT TIMESTAMP – MICROSECOND (current timestamp) MICROSECONDS

如果想将日期或时间值与其它文本相衔接,那么需要先将该值转换成字符串。为此,只要使用CHAR() 函数:

char(current date)
char(current time)
char(current date + 12 hours)

要将字符串转换成日期或时间值,可以使用:

TIMESTAMP (‘2002-10-20-12.00.00.000000’)
TIMESTAMP (‘2002-10-20 12:00:00’)
DATE (‘2002-10-20′)
DATE (’10/20/2002′)
TIME (’12:00:00’)
TIME (‘12.00.00’)

如果你想将当前日期格式转化成定制的格式(比如‘yyyymmdd’),那又该如何去做呢?按照我的经验,最好的办法就是编写一个自己定制的格式化函数。

下面是这个UDF 的代码:

create function ts_fmt(TS timestamp, fmt varchar(20))
returns varchar(50)
return
with tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as
(
select
substr( digits (day(TS)),9),
substr( digits (month(TS)),9) ,
rtrim(char(year(TS))) ,
substr( digits (hour(TS)),9),
substr( digits (minute(TS)),9),
substr( digits (second(TS)),9),
rtrim(char(microsecond(TS)))
from sysibm.sysdummy1
)
select
case fmt
when ‘yyyymmdd’
then yyyy || mm || dd
when ‘mm/dd/yyyy’
then mm || ‘/’ || dd || ‘/’ || yyyy
when ‘yyyy/dd/mm hh:mi:ss’
then yyyy || ‘/’ || mm || ‘/’ || dd || ‘ ‘ ||
hh || ‘:’ || mi || ‘:’ || ss
when ‘nnnnnn’
then nnnnnn
else
‘date format ‘ || coalesce(fmt,’ ‘) ||
‘ not recognized.’
end
from tmp

建议找一个DB2基础的东东看看,比在这里问快多了,虽然别人找的时候也快!!
SQL 日期和时间函数
DAYNAME 返回一个大小写混合的字符串,对于参数的日部分,用星期表示这一天的名称(例如,Friday)。
DAYOFWEEK 返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期日。
DAYOFWEEK_ISO 返回参数中的星期几,用范围在1-7 的整数值表示,其中1 代表星期一。
DAYOFYEAR 返回参数中一年中的第几天,用范围在1-366 的整数值表示。
DAYS 返回日期的整数表示。
JULIAN_DAY 返回从公元前4712 年1 月1 日(儒略日历的开始日期)到参数中指定日期值之间的天数,用整数值表示。
MIDNIGHT_SECONDS 返回午夜和参数中指定的时间值之间的秒数,用范围在0 到86400 之间的整数值表示。
MONTHNAME 对于参数的月部分的月份,返回一个大小写混合的字符串(例如,January)。
TIMESTAMP_ISO 根据日期、时间或时间戳记参数而返回一个时间戳记值。
TIMESTAMP_FORMAT 从已使用字符模板解释的字符串返回时间戳记。
TIMESTAMPDIFF 根据两个时间戳记之间的时差,返回由第一个参数定义的类型表示的估计时差。
TO_CHAR 返回已用字符模板进行格式化的时间戳记的字符表示。TO_CHAR 是VARCHAR_FORMAT 的同义词。
TO_DATE 从已使用字符模板解释过的字符串返回时间戳记。TO_DATE 是TIMESTAMP_FORMAT 的同义词。
WEEK 返回参数中一年的第几周,用范围在1-54 的整数值表示。以星期日作为一周的开始。
WEEK_ISO 返回参数中一年的第几周,用范围在1-53 的整数值表示。

——————————————————————————–
mymm 回复于:2003-08-04 14:22:38
Example:

YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)

引用:
mymm 回复于:2003-08-08 17:01:11
DAYS函数返回日期的整数表示。

要计算两个日期之间的天数,可以:
days (current date) – days (date(‘2000-9-1’))
要使用 SQL 获得当前的日期、时间及时间戳记,请参考适当的DB2 寄存器:

SELECT current date FROM sysibm.sysdummy1
SELECT current time FROM sysibm.sysdummy1
SELECT current timestamp FROM sysibm.sysdummy1

sysibm.sysdummy1 表是一个特殊的内存中的表,用它可以发现如上面演示的DB2 寄存器的值。您也可以使用关键字VALUES 来对寄存器或表达式求值。例如,在DB2 命令行处理器(Command Line Processor,CLP)上,以下SQL 语句揭示了类似信息:

VALUES current date
VALUES current time
VALUES current timestamp

在余下的示例中,我将只提供函数或表达式,而不再重复SELECT … FROM sysibm.sysdummy1 或使用VALUES 子句。

要使当前时间或当前时间戳记调整到GMT/CUT,则把当前的时间或时间戳记减去当前时区寄存器:

current time – current timezone
current timestamp – current timezone

给定了日期、时间或时间戳记,则使用适当的函数可以单独抽取出(如果适用的话)年、月、日、时、分、秒及微秒各部分:

YEAR (current timestamp)
MONTH (current timestamp)
DAY (current timestamp)
HOUR (current timestamp)
MINUTE (current timestamp)
SECOND (current timestamp)
MICROSECOND (current timestamp)

从时间戳记单独抽取出日期和时间也非常简单:

DATE (current timestamp)
TIME (current timestamp)

因为没有更好的术语,所以您还可以使用英语来执行日期和时间计算:

current date + 1 YEAR
current date + 3 YEARS + 2 MONTHS + 15 DAYS
current time + 5 HOURS – 3 MINUTES + 10 SECONDS

要计算两个日期之间的天数,您可以对日期作减法,如下所示:

days (current date) – days (date(‘1999-10-22’))

而以下示例描述了如何获得微秒部分归零的当前时间戳记:

CURRENT TIMESTAMP – MICROSECOND (current timestamp) MICROSECONDS

如果想将日期或时间值与其它文本相衔接,那么需要先将该值转换成字符串。为此,只要使用CHAR() 函数:

char(current date)
char(current time)
char(current date + 12 hours)

要将字符串转换成日期或时间值,可以使用:

TIMESTAMP (‘2002-10-20-12.00.00.000000’)
TIMESTAMP (‘2002-10-20 12:00:00’)
DATE (‘2002-10-20′)
DATE (’10/20/2002′)
TIME (’12:00:00’)
TIME (‘12.00.00’)

TIMESTAMP()、DATE() 和TIME() 函数接受更多种格式。上面几种格式只是示例,我将把它作为一个练习,让读者自己去发现其它格式。

你不知道的CMD命令之ECHO

ECHO命令是大家都熟悉的DOS批处理命令的一条子命令。
但是如果你深入了解一下,你会发现他可不仅仅只有将内存中的数据显示到屏幕着一个简单的功能哦….

1. 作为控制批处理命令在执行时是否显示命令行自身的开关

ECHO [ON|OFF]

如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。

2. 显示当前ECHO设置状态

ECHO

3. 输出提示信息

ECHO 信息内容

上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:

4. 关闭DOS命令提示符

在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。

5. 输出空行,即相当于输入一个回车

ECHO.

值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。

在下面的例子中ECHO.输出的回车,经DOS管道转向作为TIME命令的输入,即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态:

C:>ECHO.|TIME

ECHO命令输出空行的另一个应用实例是:将ECHO.加在自动批处理文件中,使原本在屏幕下方显示的提示画面,出现在屏幕上方。

6. 答复命令中的提问

ECHO 答复语|命令文件名

上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:

C:>ECHO Y|CHKDSK/F
C:>ECHO Y|DEL A :*.*

7. 建立新文件或增加文件内容

ECHO 文件内容>文件名
ECHO 文件内容>>文件名

例如:

C:>ECHO @ECHO OFF>AUTOEXEC.BAT建立自动批处理文件
C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT向自动批处理文件中追加内容
C:TYPE AUTOEXEC.BAT显示该自动批处理文件
@ECHO OFF
C:\CPAV\BOOTSAFE

8. 向打印机输出打印内容或打印控制码

格式:

ECHO 打印机控制码>PRN
ECHO 打印内容>PRN

下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:

C:>ECHO +156+42+116>PRN(输入下划线命令FS*t)
C:>ECHO +155@>PRN(输入初始化命令ESC@)
C:>ECHO.>PRN(换行)

9. 使喇叭鸣响

C:>ECHO ^G

“^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。

10.执行ESC控制序列修改屏幕和键盘设置

我们知道DOS的设备驱动程序ANSI.SYS提供了一套用来修改屏幕和键盘设置的ESC控制序列。如执行下述内容的批处理程序可以把功能键F12定义为DOS命令“DIR/W”,并把屏幕颜色修改为白色字符蓝色背景。

@ECHO”←[0;134;”DIR/W”;13p
@ECHO”←[1;37;44m

(注:批处理文件中“←”字符的输入方法是在编辑状态下按Alt中小键盘上的27)

CMD切换本机IP

在Windows中,如果你要设置IP地址,一般是进入“本地连接”->“属性”,手动设置要更改的IP地址。
其实,在命令行同样可以设置IP地址。如果你的IP需要在几个IP中来回切换,可以使用 netsh 命令更改:

1.进入CMD命令行;

点击“开始”->“运行”,输入“cmd”,回车,

2.设置IP:

设置动态获取IP地址(DHCP)

c:/>netsh interface ip set address name="本地连接" sourse=dhcp

设置固定IP

c:/>netsh interface ip set address name="本地连接" sourse=static addr=192.168.1.2 mask=255.255.255.0 gateway=192.168.1.1 gwnetric=auto

参数说明:

1.name:网络连接名称,一般为“本地连接”。你可以在“控制面板”->“网络连接”中看到。
2.source:获取IP的途径。动态获取,则为dhcp,手动设置,则为static。
3.addr:要设置的IP地址。
4.mask:子网掩码。
5.gateway:网关地址。
6.gwmetric:网关跃点数,可以设置为整型数值,也可以设置为“自动”:auto。

3.设置DNS:

自动获取DNS

c:/>netsh interface ip set address name="本地连接" sourse=dhcp

手动设置单个DNS

c:/>netsh interface ip set address name="本地连接" sourse=static addr=210.52.149.2 register=primary

手动设置多个DNS

c:/>netsh interface ip set address name="本地连接" addr=202.106.0.133 index=2

参数说明:

1.name:网络连接名称,一般为“本地连接”。你可以在“控制面板”->“网络连接”中看到。
2.source:获取IP的途径。动态获取,则为dhcp,手动设置,则为static。
3.addr:要设置的IP地址。
4.register:
5.none: 禁用动态 DNS 注册。
6.primary: 只在主 DNS 后缀下注册。
7.both: 在主 DNS 后缀下注册,也在特定连接后缀下注册。
8.index:设置的DNS的顺序号。

C++ 转换运算符 const_cast

C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymorphism)”。
要想很好的使用多态性,就免不了要使用指针和引用,于是也就免不了会碰到转换的问题。于是把在网上反复查阅了解的知识稍作总结,以供大家参考。

C++提供了四个转换运算符:

const_cast <new_type> (expression)
 static_cast <new_type> (expression)
 reinterpret_cast <new_type> (expression)
 dynamic_cast <new_type> (expression)

它们有着相同的结构,看起来像是模板方法。这些方法就是提供给开发者用来进行指针和引用的转换的。

虽然从字面上很好理解它们大致是什么作用,但是真正像使用起来却用不知道他们具体的用途。
编写代码,只会不断的被编译器提醒Error。所以如果出现理解不到位或错误的地方,还希望前人或来者能够指正。

其实,在我看来这些标准运算符的作用就是对传统运算符的代替,以便做到统一。就像我们用std::endl来输出换行,而不是’\n’。我会用代码来说明相应的传统转换可以如何这些标准运算符。
当然,这这是大致的理解,在标准运算符上,编译器肯定有做更多的处理,特别是dynamic_cast是不能用传统转换方式来完全实现的。

const_cast (expression)

const_cast转换符是用来移除变量的const或volatile限定符。对于后者,我不是太清楚,因为它涉及到了多线程的设计,而我在这方面没有什么了解。所以我只来说const方面的内容。

用const_cast来去除const限定

对于const变量,我们不能修改它的值,这是这个限定符最直接的表现。但是我们就是想违背它的限定希望修改其内容怎么办呢?

下边的代码显然是达不到目的的:

const int constant = 10;
int modifier = constant;

因为对modifier的修改并不会影响到constant,这暗示了一点:const_cast转换符也不该用在对象数据上,因为这样的转换得到的两个变量/对象并没有相关性。

只有用指针或者引用,让变量指向同一个地址才是解决方案,可惜下边的代码在C++中也是编译不过的:

const int constant = 21;
int* modifier = &amp;constant
// Error: invalid conversion from 'const int*' to 'int*'

(上边的代码在C中是可以编译的,最多会得到一个warning,所在在C中上一步就可以开始对constant里面的数据胡作非为了)

把constant交给非const的引用也是不行的。

const int constant = 21;
int&amp; modifier = constant;
// Error: invalid initialization of reference of type 'int&amp;' from expression of type 'const int'

于是const_cast就出来消灭const,以求引起程序世界的混乱。

下边的代码就顺利编译功过了:

const int constant = 21;
const int* const_p = &amp;constant;
int* modifier = const_cast(const_p);
*modifier = 7;

传统转换方式实现const_cast运算符

我说过标:准转换运算符是可以用传统转换方式实现的。const_cast实现原因就在于C++对于指针的转换是任意的,它不会检查类型,任何指针之间都可以进行互相转换,因此const_cast就可以直接使用显示转换(int*)来代替:

const int constant = 21;
const int* const_p = &amp;constant;
int* modifier = (int*)(const_p);

或者我们还可以把他们合成一个语句,跳过中间变量,用

const int constant = 21;
int* modifier = (int*)(&amp;constant);

替代

const int constant = 21;
int* modifier = const_cast(&amp;constant);

为何要去除const限定

从前面代码中已经看到,我们不能对constant进行修改,但是我们可以对modifier进行重新赋值。

但是但是,程序世界真的混乱了吗?我们真的通过modifier修改了constatn的值了吗?修改const变量的数据真的是C++去const的目的吗?

如果我们把结果打印出来:

cout << "constant: "&lt;&lt; constant &lt;&lt;endl;
 cout << "const_p: "&lt;&lt; *const_p &lt;&lt;endl;
 cout << "modifier: "&lt;&lt; *modifier &lt;&lt;endl;
 /**
 constant: 21
 const_p: 7
 modifier: 7
 **/

constant还是保留了它原来的值。

可是它们的确指向了同一个地址呀:

cout << "constant: "<< &constant <<endl;
 cout << "const_p: "<< const_p <<endl;
 cout << "modifier: "<< modifier <<endl;
/**
 constant: 0x7fff5fbff72c
 const_p: 0x7fff5fbff72c
 modifier: 0x7fff5fbff72c
 **/

这真是一件奇怪的事情,但是这是件好事:说明C++里是const,就是const,外界千变万变,我就不变。不然真的会乱套了,const也没有存在的意义了。

IBM的C++指南称呼“*modifier = 7;”为“未定义行为(Undefined Behavior)”。所谓未定义,是说这个语句在标准C++中没有明确的规定,由编译器来决定如何处理。

位运算的左移操作也可算一种未定义行为,因为我们不确定是逻辑左移,还是算数左移。

再比如下边的语句:v[i] = i++; 也是一种未定义行为,因为我们不知道是先做自增,还是先用来找数组中的位置。

对于未定义行为,我们所能做的所要做的就是避免出现这样的语句。对于const数据我们更要这样保证:绝对不对const数据进行重新赋值。

如果我们不想修改const变量的值,那我们又为什么要去const呢?

原因是,我们可能调用了一个参数不是const的函数,而我们要传进去的实际参数确实const的,但是我们知道这个函数是不会对参数做修改的。于是我们就需要使用const_cast去除const限定,以便函数能够接受这个实际参数。

#include
 using namespace std;
void Printer (int* val,string seperator = "\n")
 {
 cout < < val<< seperator;
 }
int main(void)
 {
 const int consatant = 20;
 //Printer(consatant);//Error: invalid conversion from 'int' to 'int*'
 Printer(const_cast(&consatant));
return 0;
 }

出现这种情况的原因,可能是我们所调用的方法是别人写的。还有一种我能想到的原因,是出现在const对象想调用自身的非const方法的时候,因为在类定义中,const也可以作为函数重载的一个标示符。有机会,我会专门回顾一下我所知道const的用法,C++的const真的有太多可以说的了。

在IBM的C++指南中还提到了另一种可能需要去const的情况:

#include
 using namespace std;
int main(void) {
 int variable = 21;
 int* const_p = &variable;
 int* modifier = const_cast(const_p);
*modifier = 7
 cout << "variable:" << variable << endl;
return 0;
 }
 /**
 variable:7
 **/

我们定义了一个非const的变量,但用带const限定的指针去指向它,在某一处我们突然又想修改了,可是我们手上只有指针,这时候我们可以去const来修改了。上边的代码结果也证实我们修改成功了。

不过我觉得这并不是一个好的设计,还是应该遵从这样的原则:使用const_cast去除const限定的目的绝对不是为了修改它的内容,只是出于无奈。(如果真像我说是种无奈,似乎const_cast就不太有用到的时候了,但的确我也很少用到它)

本文转载至: Ider

DB2 找不到有效的产品许可证

很不幸 今天一早开机就发现原来安装的DB2不能正常运行了
提示说DB2未打开 于是赶紧前往命令提示符下用db2start命令 却是被告知

产品名: “DB2 企业服务器版”
到期日期: “已到期”
产品标识: “db2ese” 版本信息: “9.5”
SQL8008N 产品 “DB2 企业服务器版” 未安装有效的许可证密钥,试用期已到期。不启用特定于此产品的功能。 SQL8000N DB2START 处理失败;找不到有效的产品许可证。如果许可您使用此产品,则应 确保正确注册了许可证…

上网搜索了一阵DB2许可证的情况 发现了要解决这个方法其实还是比较简单的
只要使用IBM提供的db2licm命令就可以了…

db2licm命令提供了添加、移除、列示和修改本地系统上安装的许可证功能。

db2licm [-a filename]
    [-e HARD | SOFT]
    [-p prod-password
    REGISTERED | CONCURRENT |
    INTERNET | MEASURED]
    [-r prod-password]
    [-u prod-password num-users]
    [-n prod-password num-processors]
    [-l]
    [-v]
    [-?]

命令选项详解:

-a 添加产品的许可证。
指定包含了有效许可证信息的文件名。这可从您的特许产品 CD中获得,或者与 IBM 代表或授权经销商联系。

-n 更新授权的处理器数目。
指定您有权与此产品配合使用的处理器的数目。

-e 更新系统上的强制策略。 有效值是:HARD 和 SOFT。HARD
指定将不允许没有许可证的请求。 SOFT指定将把没有许可证的请求记录下来,但是不限制。

-l 列示具有可用许可证信息的所有产品。

-p 更新要在系统上使用的许可证策略类型。 可以指定关键字CONCURRENT、REGISTERED 或 CONCURRENTREGISTERED。另外,可以为“DB2 UDB 工作组服务器”产品
指定INTERNET。另外,还可以为 DB2 Connect 非限制产品指定 MEASURED。

-r 除去产品的许可证。除去许可证之后,产品就以“先试后买”方式运作。要获取特定产品的密码,使用 -l 选项调用命令。

-u 更新已购买的用户许可证的数目。指定已购买其许可证的产品的密码和用户数。

-v 显示版本信息。

-? 显示帮助信息。
指定了此选项时,将忽略其它所有选项,仅显示帮助信息。

使用例子:

添加license: db2licm -a xxx.lic

添加完成之后,再使用db2licm -l查看下信息:

Product name: "DB2 Enterprise Server Edition"
 License type: "CPU 选项"
 Expiry date: "永久"
 Product identifier: "db2ese"
 Version information: "9.5"
 Enforcement policy: "软停止"
 Features:
 DB2 Database Partitioning: "未许可"
 DB2 Performance Optimization ESE: "未许可"
 DB2 Storage Optimization: "未许可"
 DB2 Advanced Access Control: "未许可"
 DB2 Geodetic Data Management: "未许可"
 IBM Homogeneous Replication ESE: "未许可"

哈哈 DB2又可以继续用了~~

好吧,到此我也附带一个从他处获得的lic文件吧 至少对于9.5 x86版本的还是可以用的….
下载地址: 百度盘

Tomcat参数报错

最近需要在60服务器上部署对账平台来做相应测试   结果发现缘由的内网平台中只有信息平台…
没办法 赶紧从敏哥那里要了一份程序过来  也做了基本的部署
结果却是发现 总报错  而且是报参数的错误:

 The CATALINA_HOME environment variable is not defined correctly
 This environment variable is needed to run this program

于是  赶紧想着应该是参数填写错误
赶紧按照安装JAVA_HOME的方式来对Tomcat进行全局变量的设置:

1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为D:\java\jdk;
2.安装完成后,右击“我的电脑”,点击“属性”;
3.选择“高级”选项卡,点击“环境变量”;
4.在“系统变量”中,设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓)。若已存在则点击“编辑”,不存在则点击“新建”;
5.JAVA_HOME指明JDK安装路径,就是刚才安装时所选择的路径D:\java\jdk。此路径下包括lib,bin,jre等文件夹(此变量最好设置,因为以后运行tomcat,eclipse等都需要依*此变量);
6.Path使得系统可以在任何路径下识别java命令,设为:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin  其中:%JAVA_HOME%就是引用前面指定的JAVA_HOME,下同;
7.CLASSPATH为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别,设为:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar  (要加.表示当前路径)
8.“开始”->;“运行”,键入“cmd”;
9.键入命令“java -version”,“java”,“javac”几个命令,出现画面,说明环境变量配置成功;
10.按照步骤四设定Tomcat参数 CATALINA_HOME D:\Tomcat
11.双击startup.bat,启动tomcat。

双击startup.bat,结果却是发现启动不了tomcat。便想着是不是其中的设置结果出了问题:

1、JAVA_HOME中的路径不能使用分号结尾,如

D:\Java\jdk;

这样写就会出现提示CATALINA_HOME或是JAVA_HOME没有配置好的错误,,还有就是JAVA_HOME的路径一定不要写成了JRE的路径

2、CATALINA_BASE,CATALINA_HOME,TOMCAT_HOME中的路径不能以”\”结尾,如

D:\Tomcat\

这样写就会出现java.util.logging.ErrorManager的错误,屏幕一闪而过

正确的写法:

JAVA_HOME D:\Java\jdk
CATALINA_BASE D:\Tomcat
CATALINA_HOME D:\Tomcat
TOMCAT_HOME D:\Tomcat

注意这里路径的标点符号,不能写多了,也不能写少了

但是 结果发现还是报同样的错误
没办法 只能打开原始的bat文件来查看了
果然  那里面是这样进行设定的

加入设定了相应的环境变量,则以设定的环境变量来进行查看
而如果没有进行环境变量的设定的话,则需要在文件中指定

而本次就是犯下了这个错  因为我在bat文件中进行了设定 故而他是会直接读取其中的配置的文件的
要解决这一个问题也很简单
直接删除该问下下的设定语句 或者将其更改成为正确语句就OK了!!

重启了一下Tomcat  果不其然 现在对账平台能够正常启用啦~~

SQL执行顺序

我们做软件开发的,尤其是像我现在这样在做运维的,大部分人都离不开跟数据库打交道。而现今的数据库动辄即是千万条数据,虽然说我们在获取了需求之后能够立马就想到其查询语句,但是在应对突然之间的数据获取时,谁又能保证在第一时间内就能获取到最新的数据呢?

要知道SQL语句,我想我们有必要知道查询分析器怎么执行我们的SQL语句的。
我们很多人会看执行计划,或者用Profiler来监视和调优查询语句或者存储过程慢的原因。
但是如果我们知道查询分析器的执行逻辑顺序,下手的时候就胸有成竹,那么下手是不是有把握点呢?

在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后被处理。
每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。

(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

逻辑查询处理阶段简介

  1. FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表VT1
  2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。
  3. OUTER(JOIN):如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 VT2,生成VT3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
  4. WHERE:对VT3应用WHERE筛选器。只有使<where_condition>为true的行才被插入VT4.
  5. GROUP BY:按GROUP BY子句中的列列表对VT4中的行分组,生成VT5.
  6. CUBE|ROLLUP:把超组(Suppergroups)插入VT5,生成VT6.
  7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入VT7.
  8. SELECT:处理SELECT列表,产生VT8.
  9. DISTINCT:将重复的行从VT8中移除,产生VT9.
  10. ORDER BY:将VT9中的行按ORDER BY 子句中的列列表排序,生成游标(VC10).
  11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回调用者。

注:

步骤10,按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10。这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的是,它不返回有效的表,而是返回一个游标。
SQL是基于集合理论的。集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序无关紧要。对表进行排序 的查询可以返回一个对象,包含按特定物理顺序组织的行。

本文参考至:qanholas

DB2 编目catalog

DB2数据库中的编目即catalog这个单词很难理解。至少对于初学者的我来说是比较难于理解的….
具体来说编目有编目节点,编目数据库等。如果要理解编目,必须要讲一下DB2数据库的体系结构。
在DB2数据库中最大的概念是系统(节点)也就是主机,下面是实例,实例下面是数据库,然后是表空间,然后是数据库对象。
现在假设你有一个数据库服务器在自己的ASUS机器上,你有一个客户端在windows,linux或任何平台上,你现在想建立一个客户端到服务器端的连接,具体步骤是什么呢?

第1步:
你必须要在客户端的机器上能够把远程的服务器能够识别出来。即需在DB2使用的编目(catalog)方式,具体来说就是通过编目把远程的服务器写在本地客户端的一个文件中:

db2 catalog tcpip node asus remote 172.10.10.10 server 50000

在上面的这条命令中asus是一个节点名(在一个机器上必须是唯一的),remote后面是服务器的IP地址,server是远程服务器上实例对应的端口号。DB2通过这种方式在本地的SQLNODIR文件中把远程服务器的信息记录下来,所以编目节点其实就是把远程服务器映射到本地,通过SQLNODIR中的记录能够找到远程服务器和实例,类似指向远程服务器和实例的地址指针。

第2步:
当把远程的服务器IP地址,实例编目下来后,第二步应该把该实例下的数据库编目到本地

db2 catalog db REMOTEDB at node asus

在这条命令中,REMOTEDB是远程实例下的数据库,asus是我们在第一步中编目的节点名
这条命令执行后会在本地SQLDBDIR文件中记录远程数据库的信息,这这里编目数据库可以理解为把远程服务器实例下的数据库映射到本地为一个别名

上面是客户端和服务器不在同一台机器上,是通过编目节点、编目数据库来实现客户端连接到服务器上数据库的目的。如果是连接在同一台机器上,那么这时候则不需要显示的编目节点。但是当在我们在服务器上创建一个实例的时候,系统会有一个隐含的把实例在本地编目的过程–假设在asus上创建一个实例名为db2inst1,其实有一个隐含的的步骤:

db2 catalog local node db2inst1 instance db2inst1 system asus ostype aix

同样当你在db2inst1下创建一个数据库MYDB的时候,有一个隐含的编目数据库的步骤

db2 catalog db mydb at node db2inst1

至此你可以这样理解编目:编目就是在本地或远程主机上建立客户端到服务器的数据库连接

.htaccess技巧

.htaccess是个很实用控制Apache Web服务器的文件。
前段时间不是发表过一篇文章来讲述利用其进行子目录的绑定么?
其实他的功能还有很多….
本文将向大家展示.htaccess如何在安全性、功能性以及实用性方面帮助我们建立WordPress博客。

警告

编辑或修改WordPress博客的.htaccess文件时,为防止意外情况发生,请确定你已进行备份。

1. 用.htaccess将WordPress RSS 订阅重定向到Feedburner

没有哪个博客不使用Feedburner。 是的,Feedburner是一项非常友好的服务,你可以从中了解有多少人订阅了你的rss feeds。 唯一的问题是,需要编辑主题文件来手动改变rss的url地址。 令人欣慰的是,现在有了.htaccess这样的修改帮你节省了大量时间。

使用以下代码时记住修改第六行内容,将其更改成你自己的feedburner地址。

# temp redirect wordpress content feeds to feedburner
 RewriteEngine on
 RewriteCond %{HTTP_USER_AGENT} !FeedBurner [NC]
 RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]
 RewriteRule ^feed/?([_0-9a-z-]+)?/?$ http://feeds2.feedburner.com/catswhocode [R=302,NC,L]

备注:也可以根据情况替换成其他订阅服务商,比如国内的Feedsky。设置也非常简单,只需替换相应代码即可。

2. 移除WordPress url或对其分类

默认情况下,WordPress分类的永久链接都是按以下方式显示:

http://www.favorinfo.com/blog/category/wordpress
你会发现,url中的category显得很多余。 下面我们教你怎样把它移除:

首先备份.htaccess文件。 然后打开该文件追加以下命令行:

RewriteRule ^category/(.+)$ http://www.yourblog.com/$1 [R=301,L]

保存后分类页面会显示如下:

wordpress

3. 使用浏览器缓存

使用浏览器缓存是个优化博客加载时间的好方法。 下列代码不能直接改善博客的加载,但在所请求内容没有被修改时,这些代码可以将304未被修改状态发送出去,这样就减轻了服务器的工作负担。

 FileETag MTime Size
 <filesmatch "\.(jpg|gif|png|css|js)$">
 ExpiresActive on
 ExpiresDefault "access plus 1 year"

 

4. 压缩静态数据

你知道吗,现在已经可以向访问者发送压缩文件了,客户端会将这些压缩文件解压。 以下代码节约了你(以及你的访问者)的带宽,减轻了博客页面的压力。

AddOutputFilterByType DEFLATE text/html text/plain text/xml application/xml application/xhtml+xml text/javascript text/css application/x-javascript
 BrowserMatch ^Mozilla/4 gzip-only-text/html
 BrowserMatch ^Mozilla/4.0[678] no-gzip
 BrowserMatch bMSIE !no-gzip !gzip-only-text/html

5. 将日期和姓名永久链接重新导向到/%postname%/

首先登录WordPress管理账号,在settings→Permalinks菜单下选择custom。 将字段填充为/%postname%/。
这时你的永久链接看上去就和下面这个博客一样了:

http://www.yourblog.com/name-of-the-post
下面我们用旧有的永久链接结构将所有反向链接重新导向到新的永久链接结构。 需要编辑WordPress 根目录下的.htaccess文件以达到以上目的。
将以下命令行复制到.htaccess文件中:

RedirectMatch 301 /([0-9]+)/([0-9]+)/([0-9]+)/(.*)$ http://www.domain.com/$4

成功! 在没有丢失任何反向链接的情况下,我们成功的改变了永久链接的结构。

6. 禁止来路不明的评论

对每天收到的垃圾评论感到不耐烦? Akismet插件当然可以阻止这些垃圾评论,但.htaccess同样可以。 事实证明,很多垃圾评论机器人无处不在。 下列代码会追踪评论的来源(评论者所在的页面),如果评论者试图不经你的博客擅自进入wp-comments-post.php文件,这些代码会禁止评论发布。

更改第四行命令,换成自己博客的url。

RewriteEngine On
 RewriteCond %{REQUEST_METHOD} POST
 RewriteCond %{REQUEST_URI} .wp-comments-post\.php*
 RewriteCond %{HTTP_REFERER} !.*yourblog.com.* [OR]
 RewriteCond %{HTTP_USER_AGENT} ^$
 RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

7. 将访问者重定向到维护页面

升级博客或改变主题/版面设计时,最好不要让访问者发现你的博客有设计或代码方面,或者更严重的安全方面的问题。

解决方法是,设计一个“维护页面”,在维护完成前暂时将访问者导向维护页面。

将代码第二行中的maintenance.html换成希望访问者被导向的页面,第三行中的IP地址改为自己的IP。

注意:这里用到了一个302重新定向以防止搜索引擎排名将维护页面当作博客的真正主页。

RewriteEngine on
 RewriteCond %{REQUEST_URI} !/maintenance.html$
 RewriteCond %{REMOTE_ADDR} !^123\.123\.123\.123
 RewriteRule $ /maintenance.html [R=302,L]

8. 保护博客不受盗链侵扰

在某一网页中使用来自另一个网站的图片,这就被称为盗链。 很多博客经常被盗链,他们的带宽被用到了别的网站上。 下面的代码可以有效防止WordPress博客遭遇盗链。

RewriteEngine On
 #Replace ?mysite\.com/ with your blog url
 RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
 RewriteCond %{HTTP_REFERER} !^$
 #Replace /images/nohotlink.jpg with your "don't hotlink" image url
 RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

9. 不允许其他IP地址进入wp-admin目录

除非是合作撰写的博客,否则一定要将w—admin目录权限设为仅本人可见。 以下代码在固定IP下可用。

你只需在第八行中输入自己的固定IP地址。需要注意的是,必要时可以添加多个IP地址,这只要在代码中创建新的命令行: 允许来自xx.xx.xxx.xx。

AuthUserFile /dev/null
 AuthGroupFile /dev/null
 AuthName "Example Access Control"
 AuthType Basic
 order deny,allow
 deny from all
 allow from xx.xx.xx.xx

10. 用.htaccess禁止WordPress垃圾评论

大家都知道垃圾评论多么的令人讨厌。 如果有人或者机器不停的给你发垃圾评论,只要将他们的IP拉入黑名单就可以解决问题。

将代码第三行中的IP地址换成垃圾评论者的IP。 要想添加多个垃圾评论者的IP地址,可以在代码中创建新的命令行,如禁止xxx.xx.xxx.xxx。

order allow,deny
 deny from 200.49.176.139
 allow from all

本文参考至:http://www.wordpress.la/10-htaccess-hacks.html

PHP判断终端访问方式

之前在自己的网站上用了一个简单的判断手机的方式 当时只是采用判断HTTP_USER_AGENT的方式来进行判断
当然 这种方式在一定程度上解决了常用的终端访问方式 但是这终归不是一种比较全面的方式
然后 今天在网上闲逛的时候 竟然发现了一种更为全面的方式 迫不及待的想拿出来和大家分享一下了~~~~

相关文章: 
自动识别设备

他的方式其实和之前分享的差不多 也是通过判断HTTP头来进行区分的
只是 它考虑的问题相对来说比较细一点….

$agent = check_wap();
if( $agent )
{
header('Location: http://m.favorinfo.com');
exit;
}

// 检查是否是通过WAP方式上网
function check_wap(){
// 先检查是否为wap代理,准确度高
if(stristr($_SERVER['HTTP_VIA'],"wap")){
return true;
}
// 检查浏览器是否接受 WML.
elseif(strpos(strtoupper($_SERVER['HTTP_ACCEPT']),"VND.WAP.WML") > 0){
return true;
}
//检查USER_AGENT(采用通配符的方式)
elseif(preg_match('/(blackberry|configuration\/cldc|hp |hp-|htc |htc_|htc-|iemobile|kindle|midp|mmp|motorola|mobile|nokia|opera mini|opera |Googlebot-Mobile|YahooSeeker\/M1A1-R2D2|android|iphone|ipod|mobi|palm|palmos|pocket|portalmmm|ppc;|smartphone|sonyericsson|sqh|spv|symbian|treo|up.browser|up.link|vodafone|windows ce|xda |xda_)/i', $_SERVER['HTTP_USER_AGENT'])){
return true;
}
else{
return false;
}
}

当然 他也提供了另外一种方式 即通过剥离框架的方式来检测是否为移动设备
这种检测方式 虽然看代码的话感觉繁杂一些 但实际上他是通过接收过来的数据细化了各种可能性 其实也是一种不错的方法

function is_mobile_request()
{
$_SERVER['ALL_HTTP'] = isset($_SERVER['ALL_HTTP']) ? $_SERVER['ALL_HTTP'] : '';
$mobile_browser = '0';
if(preg_match('/(up.browser|up.link|mmp|symbian|smartphone|midp|wap|phone|iphone|ipad|ipod|android|xoom)/i', strtolower($_SERVER['HTTP_USER_AGENT'])))
$mobile_browser++;
if((isset($_SERVER['HTTP_ACCEPT'])) and (strpos(strtolower($_SERVER['HTTP_ACCEPT']),'application/vnd.wap.xhtml+xml') !== false))
$mobile_browser++;
if(isset($_SERVER['HTTP_X_WAP_PROFILE']))
$mobile_browser++;
if(isset($_SERVER['HTTP_PROFILE']))
$mobile_browser++;
$mobile_ua = strtolower(substr($_SERVER['HTTP_USER_AGENT'],0,4));
$mobile_agents = array(
'w3c ','acs-','alav','alca','amoi','audi','avan','benq','bird','blac',
'blaz','brew','cell','cldc','cmd-','dang','doco','eric','hipt','inno',
'ipaq','java','jigs','kddi','keji','leno','lg-c','lg-d','lg-g','lge-',
'maui','maxo','midp','mits','mmef','mobi','mot-','moto','mwbp','nec-',
'newt','noki','oper','palm','pana','pant','phil','play','port','prox',
'qwap','sage','sams','sany','sch-','sec-','send','seri','sgh-','shar',
'sie-','siem','smal','smar','sony','sph-','symb','t-mo','teli','tim-',
'tosh','tsm-','upg1','upsi','vk-v','voda','wap-','wapa','wapi','wapp',
'wapr','webc','winw','winw','xda','xda-'
);
if(in_array($mobile_ua, $mobile_agents))
$mobile_browser++;
if(strpos(strtolower($_SERVER['ALL_HTTP']), 'operamini') !== false)
$mobile_browser++;
//检查其是否以Win的方式来进行
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows') !== false)
$mobile_browser=0;
//别忘了WP7既然也是采用的Win的框架,当然要拿出来小小的分析一下~~
if(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'windows phone') !== false)
$mobile_browser++;
if($mobile_browser>0)
return true;
else
return false;
}

本文参考至: