你是世上最强的磁石,走近你的磁场,巳没有逃脱的可能,我巳完全被你俘虏,注定此生为你而沉醉。
2008年6月12日星期四
我会好好对待ATA&微软之星
2008年3月14日星期五
PHP5中的this,self和parent关键字详解
| PHP5是一具备了大部分面向对象语言的特性的语言,比PHP4有了很多的面向对象的特性,但是有部分概念也比较绕人,所以今天拿出来说说,说的不好,请高手见谅. (阅读本文,需要了解PHP5的面向对象的知识) 首先我们来理解三个关键字: this,self,parent,从字面上比较好理解,是指这,自己,父亲,呵呵,比较好玩了,我们先建立几个概念,这三个关键字分别是用在什么地方 呢?我们初步解释一下,this是指向当前对象的指针(我们姑且用C里面的指针来看吧),self是指向当前类的指针,parent是指向父类的指针。 这么说还不能很了解,那我们就根据实际的例子结合来讲讲。 | |
|
class UserName //打印用户名成员函数 //实例化对象 //执行打印 (2)self 首先我们要明确一点,self是指向类本身,也就是self是不指向任何已经实例化的对象,一般self使用来指向类中的静态变量。 我们这里只要注意两个地方,第6行和第12行。我们在第二行定义了一个静态变量$firstCount,并且初始值为0,那么在12行的时候调用了这个值 得,使用的是self来调用,并且中间使用"::"来连接,就是我们所谓的域运算符,那么这时候我们调用的就是类自己定义的静态变量$ frestCount,我们的静态变量与下面对象的实例无关,它只是跟类有关,那么我调用类本身的,那么我们就无法使用this来引用,可以使用self 来引用,因为self是指向类本身,与任何对象实例无关。换句话说,假如我们的类里面静态的成员,我们也必须使用self来调用。 (3)parent 我们知道parent是指向父类的指针,一般我们使用parent来调用父类的构造函数。 //基类 我们注意这么几个细节:成员属性都是public的,特别是父类的,是为了供继承类通过this来访问。我们注意关键的地方,第25行:parent:: __construct( "heiyeluren" ),这时候我们就使用parent来调用父类的构造函数进行对父类的初始化,因为父类的成员都是public的,于是我们就能够在继承类中直接使用 this来调用。 | |
深入探索SQL连接查询
Windows XP Profession
MySQL 5.0.45
Oracle 9i
DB2 UDB 9.1
测试的SQL脚本如下:此脚本适合MySQL、DB2,如果要在Oracle上执行,
需要做个替换BIGINTàINTEGER、VARCHARàVARCHAR2。
CREATE TABLE CUSTOMERS (
ID BIGINT NOT NULL,
NAME VARCHAR(15) NOT NULL,
AGE INT,
PRIMARY KEY (ID)
);
CREATE TABLE ORDERS (
ID BIGINT NOT NULL,
ORDER_NUMBER VARCHAR(15) NOT NULL,
PRICE DOUBLE PRECISION,
CUSTOMER_ID BIGINT,
PRIMARY KEY (ID)
);
COMMIT;
/*
ALTER TABLE ORDERS ADD INDEX FK_CUSTOMER (CUSTOMER_ID), ADD CONSTRAINT FK_CUSTOMER FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMERS (ID);
*/
INSERT INTO CUSTOMERS(ID,NAME,AGE) VALUES(1,'TOM',21);
INSERT INTO CUSTOMERS(ID,NAME,AGE) VALUES(2,'MIKE',24);
INSERT INTO CUSTOMERS(ID,NAME,AGE) VALUES(3,'JACK',30);
INSERT INTO CUSTOMERS(ID,NAME,AGE) VALUES(4,'LINDA',25);
INSERT INTO CUSTOMERS(ID,NAME,AGE) VALUES(5,'TOM',NULL);
COMMIT;
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(1,'TOM_ORDER001',100,1);
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(2,'TOM_ORDER002',200,1);
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(3,'TOM_ORDER003',300,1);
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(4,'MIKE_ORDER001',100,2);
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(5,'JACK_ORDER001',200,3);
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(6,'LINDA_ORDER001',100,4);
INSERT INTO ORDERS(ID,ORDER_NUMBER,PRICE,CUSTOMER_ID) VALUES(7,'UNKNOWNORDER',200,NULL);
COMMIT;
两表的数据如下:
CUSTOMERS表数据:

ORDERS表数据

一、交叉连接(CROSS JOIN)
交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积。
例如:下面的语句1和语句2的结果是相同的。
语句1:隐式的交叉连接,没有CROSS JOIN。
SELECT O.ID, O.ORDER_NUMBER, C.ID, C.NAME
FROM ORDERS O , CUSTOMERS C
WHERE O.ID=1;
语句2:显式的交叉连接,使用CROSS JOIN。
SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM ORDERS O CROSS JOIN CUSTOMERS C
WHERE O.ID=1;
语句1和语句2的结果是相同的,查询结果如下:

二、内连接(INNER JOIN)
内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行。(所谓的链接表就是数据库在做查询形成的中间表)。
例如:下面的语句3和语句4的结果是相同的。
语句3:隐式的内连接,没有INNER JOIN,形成的中间表为两个表的笛卡尔积。
SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C,ORDERS O
WHERE C.ID=O.CUSTOMER_ID;
语句4:显示的内连接,一般称为内连接,有INNER JOIN,形成的中间表为两个表经过ON条件过滤后的笛卡尔积。
SELECT O.ID,O.ORDER_NUMBER,C.ID,C.NAME
FROM CUSTOMERS C INNER JOIN ORDERS O ON C.ID=O.CUSTOMER_ID;
语句3和语句4的查询结果:

三、外连接(OUTER JOIN):
外连不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。外连接分三类:左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)和全外连接(FULL OUTER JOIN)。
三者的共同点是都返回符合连接条件和查询条件(即:内连接)的数据行。不同点如下:
左外连接还返回左表中不符合连接条件单符合查询条件的数据行。
右外连接还返回右表中不符合连接条件单符合查询条件的数据行。
全外连接还返回左表中不符合连接条件单符合查询条件的数据行,并且还返回右表中不符合连接条件单符合查询条件的数据行。全外连接实际是上左外连接和右外连接的数学合集(去掉重复),即“全外=左外 UNION 右外”。
说明:左表就是在“(LEFT OUTER JOIN)”关键字左边的表。右表当然就是右边的了。在三种类型的外连接中,OUTER 关键字是可省略的。
下面举例说明:
语句5:左外连接(LEFT OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

语句6:右外连接(RIGHT OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;

注意:WHERE条件放在ON后面查询的结果是不一样的。例如:
语句7:WHERE条件独立。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
WHERE O.ORDER_NUMBER<>'MIKE_ORDER001';

语句8:将语句7中的WHERE条件放到ON后面。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID AND O.ORDER_NUMBER<>'MIKE_ORDER001';

从语句7和语句8查询的结果来看,显然是不相同的,语句8显示的结果是难以理解的。因此,推荐在写连接查询的时候,ON后面只跟连接条件,而对中间表限制的条件都写到WHERE子句中。
语句9:全外连接(FULL OUTER JOIN)。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。但是可以通过左外和右外求合集来获取全外连接的查询结果。下图是上面SQL在Oracle下执行的结果:
语句10:左外和右外的合集,实际上查询结果和语句9是相同的。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
UNION
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
语句9和语句10的查询结果是相同的,如下:
四、联合连接(UNION JOIN):
这是一种很少见的连接方式。Oracle、MySQL均不支持,其作用是:找出全外连接和内连接之间差异的所有行。这在数据分析中排错中比较常用。也可以利用数据库的集合操作来实现此功能。
语句11:联合查询(UNION JOIN)例句,还没有找到能执行的SQL环境。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O UNION JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
语句12:语句11在DB2下的等价实现。还不知道DB2是否支持语句11呢!
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
EXCEPT
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
语句13:语句11在Oracle下的等价实现。
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
MINUS
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O INNER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
查询结果如下:
五、自然连接(NATURAL INNER JOIN):
说真的,这种连接查询没有存在的价值,既然是SQL2标准中定义的,就给出个例子看看吧。自然连接无需指定连接列,SQL会检查两个表中是否相同名称的 列,且假设他们在连接条件中使用,并且在连接条件中仅包含一个连接列。不允许使用ON语句,不允许指定显示列,显示列只能用*表示(ORACLE环境下测 试的)。对于每种连接类型(除了交叉连接外),均可指定NATURAL。下面给出几个例子。
语句14:
SELECT *
FROM ORDERS O NATURAL INNER JOIN CUSTOMERS C;
语句15:
SELECT *
FROM ORDERS O NATURAL LEFT OUTER JOIN CUSTOMERS C;
语句16:
SELECT *
FROM ORDERS O NATURAL RIGHT OUTER JOIN CUSTOMERS C;
语句17:
SELECT *
FROM ORDERS O NATURAL FULL OUTER JOIN CUSTOMERS C;
六、SQL查询的基本原理:两种情况介绍。
第一、 单表查询:根据WHERE条件过滤表中的记录,形成中间表(这个中间表对用户是不可见的);然后根据SELECT的选择列选择相应的列进行返回最终结果。
第二、 两表连接查询:对两表求积(笛卡尔积)并用ON条件和连接类型进行过滤形成中间表;然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
第三、 多表连接查询:先对第一个和第二个表按照两表连接做查询,然后用查询结果和第三个表做连接查询,以此类推,直到所有的表都连接上为止,最终形成一个中间的结果表,然后根据WHERE条件过滤中间表的记录,并根据SELECT指定的列返回查询结果。
理解SQL查询的过程是进行SQL优化的理论依据。
七、ON后面的条件(ON条件)和WHERE条件的区别:
ON条件:是过滤两个链接表笛卡尔积形成中间表的约束条件。
WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。在没有ON的单表查询中,是限制物理表或者中间查询结果返回记录的约束。在两表或多表连接中是限制连接形成最终中间表的返回结果的约束。
从这里可以看出,将WHERE条件移入ON后面是不恰当的。推荐的做法是:
ON只进行连接操作,WHERE只过滤中间表的记录。
八、总结
连接查询是SQL查询的核心,连接查询的连接类型选择依据实际需求。如果选择不当,非但不能提高查询效率,反而会带来一些逻辑错误或者性能低下。下面总结一下两表连接查询选择方式的依据:
2、 Col_L是Col_R的子集时用右外连接。
3、 Col_R是Col_L的子集时用左外连接。
4、 Col_R和Col_L彼此有交集但彼此互不为子集时候用全外。
5、 求差操作的时候用联合查询。
多个表查询的时候,这些不同的连接类型可以写到一块。例如:
SELECT T1.C1,T2.CX,T3.CY
FROM TAB1 T1
INNER JOIN TAB2 T2 ON (T1.C1=T2.C2)
INNER JOIN TAB3 T3 ON (T1.C1=T2.C3)
LEFT OUTER JOIN TAB4 ON(T2.C2=T3.C3);
WHERE T1.X >T3.Y;
上面这个SQL查询是多表连接的一个示范。
2008年3月10日星期一
PHP正则相关的几个函数
preg_match_all: 字符串整体比对解析。
preg_replace: 字符串比对解析并取代。
preg_split: 将字符串依指定的规则切开。
preg_match
字符串比对解析。
语法: int preg_match(string pattern, string subject, array [matches]);
返回值: 整数/数组
函数种类: 资料处理
内容说明: 本函数以 pattern 的规则来解析比对字符串 subject。比对结果返回的值放在数组参数 matches 之中,matches[0] 内容就是原字符串 subject、matches[1] 为第一个合乎规则的字符串、matches[2] 就是第二个合乎规则的字符串,余类推。若省略参数 matches,则只是单纯地比对,找到则返回值为 true。
preg_match_all
字符串整体比对解析。
语法: int preg_match_all(string pattern, string subject, array matches, int [order]);
返回值: 整数
函数种类: 资料处理
内容说明: 本函数以 pattern 的规则来整体解析比对字符串 subject。比对结果返回的值放在数组参数 matches 之中,并依顺序值 order 排序。参数 order 的值有 PREG_PATTERN_ORDER 及 PREG_SET_ORDER 二种。若没有 order 值,则系统自动以 PREG_PATTERN_ORDER 代入 order 值中。返回值为合乎比对结果的数目,若没有或错误则返回 false 值。
使用范例
PREG_PATTERN_ORDER 的例子
preg_match_all("|<[^>]+>(.*)[^>]+>|U", "
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n"
?>
返回值为
example: ,
example: , this is a test
PREG_SET_ORDER 的例子
preg_match_all("|<[^>]+>(.*)[^>]+>|U", "
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n"
?>
返回值为
example: , example:
preg_replace
字符串比对解析并取代。
语法: mixed preg_replace(mixed pattern, mixed replacement, mixed subject);
返回值: 混合类型资料
函数种类: 资料处理
内容说明: 本函数以 pattern 的规则来解析比对字符串 subject,欲取而代之的字符串为参数 replacement。返回值为混合类型资料,为取代后的字符串结果。
使用范例
下例返回值为 $startDate = 6/19/1969
$patterns = array("/(19|20\d{2})-(\d{1,2})-(\d{1,2})/", "/^\s*{(\w+)}\s*=/");
$replace = array("\\3/\\4/\\1", "$\\1 =");
print preg_replace($patterns, $replace, "{startDate} = 1969-6-19");
?>
preg_split
将字符串依指定的规则切开。
语法: array preg_split(string pattern, string subject, int [limit]);
返回值: 数组
函数种类: 资料处理
内容说明: 本函数可将字符串依指定的规则分开。切开后的返回值为数组变量。参数 pattern 为指定的规则字符串、参数 subject 则为待处理的字符串、参数 limit 可省略,表示欲处理的最多合乎值。
在Linux下用瑞捷另版实现上网
下载并安装认证程序myxrgsu,以及它所依赖的相应的库文件libpcap.so.0.6.2 .锐捷说要libpcap-0.8.3的库,而实际上系统要求的是0.6.2的版本的。
ubuntu 7.10还需要一个libstdc++.so.5的库
myxrgsu程序下载地址 http://forum.ubuntu.org.cn/download.php?id=16889
libpcap-0.6.2下载地址 http://forum.ubuntu.org.cn/download.php?id=16889
以下操作均root的身份完成。在命令前加上sudo表示以在一般用户状态下可以root的权限上安装,不然系统会提示权限不够,如果已经是以root进入系统的话就不用sudo。
第一步:
关于安装libpcap库文件
如果是用本文上面的链接已给出了libpcap.so.0.6.2库,其实就不用以上那么麻烦,而是直接把它复制到/usr/lib目录就可以了。
命令:
sudo cp PATH/libpcap.so.0.6.2 /usr/lib 注意其中PATH是你下载回来的文件所存放的路径。
第二步:
把下载回来的myxrgsu程序复制到/usr/bin下,命令:
sudo cp PATH/myxrgsu /usr/bin
或者某些朋友刚来LINUX,可能对文件的复制不太了解。下面举例说明。
复制文件可用CP命令,具体如下:假设你下载回来的文件放在/home/todd,就是说里面的文件分别是/home/todd/xrgsu/bin/myxrgsu和/home/todd/xrgsu/lib/libpcap.so.0.6.2
在终端下执行如下命令:
cd /home/todd/xrgsu/bin
sudo cp myxrgsu /usr/bin
cd /home/todd/xrgsu/lib
sudo cp libpcap.so.0.6.2 /usr/lib
这样文件就复制完了。
第三步:配置网络
至于配置网络方面,虽然在WINDOWS下我们学校用的是DHCP动态获取IP的方式,但这个IP租用期一般长达数月,而且在LINUX下只要“正确的静态IP设置+成功的帐号认证”就可以上网了,具体来说就是在WINDOWS下记下你的IP,子网掩码,默认网关和DNS服务器的信息,然后在UBUNTU下右上角的网络配置按钮那里设置为静态的IP方式(static IP address),填回刚才在WINDOWS下记下的IP信息(包括IP,子网掩码,默认网关和DNS服务器)。
但如果就这样然后认证的话可能会出现:WARNING: IintNIC:NIC eth0 does not exist(3) Get parameter error!
所以要在执行认证程序之前加一条命令如下:
ifconfig eth0 xxx.xxx.xxx.xxx //后面的是你的IP(具体各人的IP)
下面是我的认证过程:
user@ubuntu:~#sudo myxrgsu -d
XRGSupplicant 1.1.1 Ruijie Network CopyRight 2004-2005 Please input your user name:2401xxxxxx Please input your password: Use default auth parameter,0-Use 1-UnUse(Default: 0):0 Searching server... Connecting server... Authenticating...
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Authenticate SUCCESSFULLY! eth0:没有进程被杀死 There is already a pid file /var/run/dhclient.pid with pid 6126 removed stale PID file Internet Systems Consortium DHCP Client V3.0.5 Copyright 2004-2006 Internet Systems Consortium. All rights reserved. For info, please visit http://www.isc.org/sw/dhcp/
Listening on LPF/eth0/(此处为mac地址) Sending on LPF/eth0/(此处为mac地址) Sending on Socket/fallback DHCPREQUEST on eth0 to 255.255.255.255 port 67 DHCPACK from 10.1.1.120 bound to 10.1.121.XXX -- renewal in 14234091 seconds. Searching server... Connecting server... Authenticating...
http://nic.chd.edu.cn
Authenticate SUCCESSFULLY! Please input 'unauth' to LogOff:
2008年3月9日星期日
2007 从Windows转向Linux基础教程
Linux是一个优秀的操作系统,它支持多用户、多进程和多线程,实时性好,功能强大而稳定。
Linux标榜自由和开放。简单的说,开源,免费。更重要的是完全DIY。
普及Linux电子书籍。开始Linux之旅的难点在哪?就是如何去安装它。认真看完本教程,相信会有收益的。
本教程适用于:首次接触Linux的朋友,通过本教程的学习让你基本对Linux有个大概的了解及安装Linux的方法,Linux最基础的一些知识。
2007,不再沉默,让我们一起学习Linux操作系统
本电子书内容如下:

用实例学for命令(4)
for /L %%a in (1,1,10) do md BB0%%a
pause
上面批处理文件在当前目录下创建BB01,BB02,BB03...BB010十个目录。
例子12、测试单网段内所有计算机的连通性
为了检测机房内所有计算机的连通性,不用一个一个地输入命令,我们只要输入一条命令就可以了。
@for /l %%a in (1,1,254) do ping 10.10.1.%%a -n 1 -l 16 -w 100 | find "Reply" >> pingall.log
这样该程序就可以很快扫描完所有的计算机。
例13、显示本机IP
@echo off
for /f "tokens=15" %%i in ('ipconfig ^| find /i "ip address"') do set ip=%%i
echo %ip%
pause
运行结果:
10.10.6.88
请按任意键继续. . .
用实例学for命令(3)
假如你有一个文件 todel.txt,里面是所有要删除的文件列表,现在你想将里面列出的每个文件都删掉。
假设这个文件是每个文件名占一行,象这样:
1.txt
2.txt
c:\3.txt
4.txt
那么可以用FOR来完成:
for /f %a in (todel.txt) do del %a
这个命令还可以更强大。比如你的 todel.txt 并不是象上面例子那么干净,而是由DIR直接生成,有一些没用的信息,比如由命令
c:\dir *.txt>>x.txt
生成的如下文件:
驱动器 C 中的卷没有标签。
卷的序列号是 DC16-E8A1
C:\ 的目录
2007-04-15 07:39 147 1.txt
2007-04-15 07:47 4 2.txt
2007-04-15 07:39 147 3.txt
2007-04-15 07:39 147 4.txt
4 个文件 445 字节
0 个目录 5,151,297,536 可用字节
C:\>
for 仍然可以解出其中的文件名并进行操作:
for /f "skip=5 tokens=4" %a in (x.txt) do @if exist %a DEL %a
当然,上面这个命令是在进行删除,如果你只是想看看哪些文件将被操作,把DEL换成echo:
for /f "skip=5 tokens=4" %a in (x.txt) do @if exist %a echo %a
你将看到:
1.txt
2.txt
3.txt
4.txt
x.txt
skip=5表示跳过前5行(就是DIR输出的头部信息),tokens=4表示将每行的第4列作为循环值放入%a,
正好是文件名。
例8. 可以用 /f 参数将某一命令执行结果作为循环范围
非常有用的功能。比如,我们想知道目前的环境变量有哪些名字(我们只要名字,不要值)。可是SET命令的输出是“名字=值”的格式,现在可以用FOR来只取得名字部分:
FOR /F "delims==" %i IN ('set') DO @echo %i
将看到:
ALLUSERSPROFILE
APPDATA
CLASSPATH
CommonProgramFiles
COMPUTERNAME
ComSpec
dircmd
HOMEDRIVE ......
这里是将set命令执行的结果拿来作为循环范围。delims==表示用=作为分隔符,由于FOR /F默认是用每行第一个TOKEN,所以可以分离出变量名。如果是想仅列出值:
FOR /F "delims== tokens=2" %i IN ('set') DO @echo %i
tokens=2和前例相同,表示将第二列(由=作为分隔符)作为循环值。
例9: 可以用 %~ 操作符将文件名分离成文件名、扩展名、盘符等独立部分
这个比较简单,就是说将循环变量的值自动分离成只要文件名,只要扩展名,或只要盘符等等。
例:要将 c:\mp3下所有mp3的歌名列出,如果用一般的 dir /b/s 或 for /r ,将会是这样:
g:\mp3\Archived\05-18-01-A\游鸿明-下沙\游鸿明-01 下沙.mp3
g:\mp3\Archived\05-18-01-A\游鸿明-下沙\游鸿明-02 21个人.mp3
......
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-阿修罗.mp3
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-彼岸花.mp3
g:\mp3\Archived\05-18-01-A\王菲-寓言\王菲-不爱我的我不爱.mp3
......
如果我只要歌名(不要路径和".mp3"):
游鸿明-01 下沙
游鸿明-02 21个人
......
王菲-阿修罗
王菲-彼岸花
王菲-不爱我的我不爱
......
那么可以用FOR命令:
for /r g:\mp3 %a in (*.mp3) do @echo %~na
例10 我们知道 date /t (/t表示不要询问用户输入)的输出是象这样的:
C:\>date /t
2007-04-22 星期日
现在我想分离出日期部分,也就是22:
for /f "tokens=3 delims=- " %a in ('date /t') do @echo %a
实际上把 tokens后面换成1,2,3或4,你将分别得到2007, 04, 22和星期日。注意delims=/后面还有个空格,表示/和空格都是分隔符。由于这个空格delims必须是/f选项的最后一项。
再灵活一点,将日期用 星期日 2002-07-13的格式输出:
for /f "tokens=1,2,3,4 delims=- " %a in ('date /t') do @echo %d %a-%b-%c
当tokens后跟多个值时,将分别映射到%a, %b, %c等。实际上跟你指定的变量有关,如果你指定的是 %i, 它们就会用%i, %j, %k等。
用实例学for命令(2)
在很多情况下,我们编辑处理完文档,都要给文件加上一个包括“通信地址、QQ、E-MAIL等等信息”的落款,如投往编辑部的稿件。如果只有一篇文章,直接输入倒也罢了,但假如你有很多这样的文件,该怎么办呢?难道每一篇稿件都要手工一个字一个字地输入那一成不变的落款吗?NO!完全没有必要这样费神,我们可以一次性地给所有文件添加上落款,假如我们要给放在“c:\java”目录下的所有文本文件加上落款。那么就请先建一个名为Address.txt的文本文件,录入通信地址、QQ、E-mail等等信息,保存到c盘的根目录。
再新建一个文本文件,录入以下内容:
@echo off
MD c:\tempjava
for /r c:\java %%I in (*.txt) do copy %%I+c:\address.txt c:\tempjava
for /r c:\tempjava %%I in (*.txt) do copy %%I c:\java
echo y|del c:\tempjava
pause
录入完毕,经检查确认无误后,另存为“给文件加落款.bat”,也保存到c:\java目录。现在,只需双击此批处理文件,就可以为c:\java文件夹中所有的TXT文件加上落款。
提示:
1、For命令指定参数“%I”从“c:\java”文件夹中的所有文本文件中取值 ;“/r”参数表示包括子目录。
2、 echo y|del c:\tempjava这个命令是说将参数y传给del命令。
例 5 批量获取文件列表
如果我们需要制作某个目录下的文件清单,如电影文件的文件清单,可以用For命令来轻松完成。我们以制作F盘上的所有RM格式的电影文件的清单为例:
先在F盘根目录下建一个名为“列文件清单.bat”的文本文件,然后输入以下内容并保存:
For /r F:\ %%i in (*.rm) DO @echo %%~fi >>F:\RMList.txt
双击此批处理文件,即可快速列出F盘上所有的以RM为扩展名的电影文件的清单。
提示:For命令指定参数“%i”从F盘的所有以RM为扩展名的文件中取值;“@echo %%~fi”表示将所有的RM文件及其完整路径显示出来;“>>F:\RMList.txt”表示将输出结果重定向到F:\RMList.txt文件中,打开该文件,即可看到详细的目录清单;“~f”表示完整路径。还可以使用“%~n”(文件名)、“%~x”(文件扩展名)、“%~d”(驱动器)、“%~p”(路径)、“%~s”(完整路径)、“%~t”(文件日期)、“%~z”(文件大小)等参数。
例6. 快速删除磁盘上的空文件夹
假设我们要清理D盘上的空文件夹,那么请先用记事本建一个名为“kill.bat”的文件,在该文件中输入以下内容:
dir d:\ /ad /b /s |sort /r >>d:\kill.txt
For /f %%i in (d:\kill.txt) DO rd %%i
echo y |del d:\kill.txt
先查找并删除全部“Thumbs.db”文件,然后双击该文件,D盘上所有的空文件夹很快就消失的无影无踪了。
提示:“dir d:\”表示列D盘上的所有目录包括子目录列表,其中参数“/ad”表示列所有目录;参数“/b”表示只列出文件夹名称而不显示标题信息或摘要:参数“/s”表示搜索,即查找D盘中的所有文件夹和子文件夹;“|”是管道符号,将Dir命令的结果传递给“sort”命令;“sort”命令表示排序;“/r”表示逆序列排序。之所以要逆序列排序,是因为通过逆序列排序后,D盘上的所有子文件夹总是会位于其父文件夹的前面,这样在用For命令删除空文件夹时,空的子文件夹被首先删除了,因此空的父文件夹就可以删除了。否则,因空的父文件夹中尚有空的子文件夹,会造成无法删除的情况。“>>d:\kill.txt”的作用是让屏幕回显重新定位到“d:\kill.txt”文件中。
For 命令中参数“/f”的作用是让For命令从指定的文件中读取数据作为变量,示例是从Dir的结果文件“d:\kill.txt”文件中读取数据,每次读取一行传递给RD命令;RD命令的作用是删除由For命令传递过来的每一个文件夹,因RD命令无法删除尚有内容的文件夹,所以经过For命令的循环后,只是删除了所有的空文件夹,有内容的文件夹会完好无损地被保留下来。
用实例学for命令(1)
C:>for/?
对一组文件中的每一个文件执行某个特定命令。
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
有很多的参数和用法说明,下面我们通过实例熟悉这个命令的用法吧
例1:快速报告每个硬盘分区的剩余空间(windows xp中文版测试通过)
for %a in (c: d:) do @dir %a | find "可用字节"
将输出:
7 个目录 5,151,354,880 可用字节
4 个目录 6,330,425,344 可用字节
下面命令将把结果存入1.txt文件
for %a in (c: d:) do @dir %a | find "可用字节" >>1.txt
例2,下面命令将显示当前目录下所有文本文件的内容
for %a in (*.txt) do type %a
例3:批量建立用户
假设我们要建立60个学生用户,分别是s1、s2……s60。建立一个批处理程序,输入如下命令:
for /l %a in (1,1,60) do net user s%a /add
用法说明:
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
序列 (5 4 3 2 1)。
网络中最经典的命令行
ping 192.168.0.8 -t ,参数-t是等待用户去中断测试
2.查看DNS、IP、Mac等
A.Win98:winipcfg
B.Win2000以上:Ipconfig/all
C.NSLOOKUP:如查看河北的DNS
C:\>nslookup
Default Server: ns.hesjptt.net.cn
Address: 202.99.160.68
>server 202.99.41.2 则将DNS改为了41.2
> pop.pcpop.com
Server: ns.hesjptt.net.cn
Address: 202.99.160.68
Non-authoritative answer:
Name: pop.pcpop.com
Address: 202.99.160.212
3.网络信使
Net send 计算机名/IP * (广播) 传送内容,注意不能跨网段
net stop messenger 停止信使服务,也可以在面板-服务修改
net start messenger 开始信使服务
4.探测对方对方计算机名,所在的组、域及当前用户名 (追捕的工作原理)
ping -a IP -t ,只显示NetBios名
nbtstat -a 192.168.10.146 比较全的
5.netstat -a 显示出你的计算机当前所开放的所有端口
netstat -s -e 比较详细的显示你的网络资料,包括TCP、UDP、ICMP 和 IP的统计等
6.探测arp绑定(动态和静态)列表,显示所有连接了我的计算机,显示对方IP和MAC地址
arp -a
7.在代理服务器端
捆绑IP和MAC地址,解决局域网内盗用IP!:
ARP -s 192.168.10.59 00 -50-ff-6c-08-75
解除网卡的IP与MAC地址的绑定:
arp -d 网卡IP
8.在网络邻居上隐藏你的计算机
net config server /hidden:yes
net config server /hidden:no 则为开启
9.几个net命令
A.显示当前工作组服务器列表 net view,当不带选项使用本命令时,它就会显示当前域或网络上的计算机上的列表。
比如:查看这个IP上的共享资源,就可以
C:\>net view 192.168.10.8
在 192.168.10.8 的共享资源
资源共享名 类型 用途 注释
--------------------------------------
网站服务 Disk
命令成功完成。
B.查看计算机上的用户帐号列表 net user
C.查看网络链接 net use
例如:net use z: \192.168.10.8\movie 将这个IP的movie共享目录映射为本地的Z盘
D.记录链接 net session
例如: C:\>net session
计算机 用户名 客户类型 打开空闲时间
-------------------------------------------------------------------------------
\192.168.10.110 ROME Windows 2000 2195 0 00:03:12
\192.168.10.51 ROME Windows 2000 2195 0 00:00:39
命令成功完成。
10.路由跟踪命令
A.tracert pop.pcpop.com
B.pathping pop.pcpop.com 除了显示路由外,还提供325S的分析,计算丢失包的%
11.关于共享安全的几个命令
A.查看你机器的共享资源 net share
B.手工删除共享(可以编个bat文件,开机自运行,把共享都删了!)
net share c$ /d
net share d$ /d
net share ipc$ /d
net share admin$ /d
注意$后有空格。
C.增加一个共享:
c:\net share mymovie=e:\downloads\movie /users:1
mymovie 共享成功。
同时限制链接用户数为1人。
12.在DOS行下设置静态IP
A.设置静态IP
CMD
netsh
netsh>int
interface>ip
interface ip>set add "本地链接" static IP地址 mask gateway
B.查看IP设置
interface ip>show address
Arp
显示和修改“地址解析协议 (ARP)”缓存中的项目。ARP 缓存中包含一个或多个表,它们用于存储 IP 地址及其经过解析的以太网或令牌环物理地址。计算机上安装的每一个以太网或令牌环网络适配器都有自己单独的表。如果在没有参数的情况下使用,则 arp 命令将显示帮助信息。
语法
arp [-a [InetAddr] [-N IfaceAddr]] [-g [InetAddr] [-N IfaceAddr]] [-d InetAddr [IfaceAddr]] [-s InetAddr EtherAddr [IfaceAddr]]
参数
-a [InetAddr] [-N IfaceAddr]
显示所有接口的当前 ARP 缓存表。要显示指定 IP 地址的 ARP 缓存项,请使用带有 InetAddr 参数的 arp -a,此处的 InetAddr 代表指定的 IP 地址。要显示指定接口的 ARP 缓存表,请使用 -N IfaceAddr 参数,此处的 IfaceAddr 代表分配给指定接口的 IP 地址。-N 参数区分大小写。
-g [InetAddr] [-N IfaceAddr]
与 -a 相同。
-d InetAddr [IfaceAddr]
删除指定的 IP 地址项,此处的 InetAddr 代表 IP 地址。对于指定的接口,要删除表中的某项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表分配给该接口的 IP 地址。要删除所有项,请使用星号 (*) 通配符代替 InetAddr。
-s InetAddr EtherAddr [IfaceAddr]
向 ARP 缓存添加可将 IP 地址 InetAddr 解析成物理地址 EtherAddr 的静态项。要向指定接口的表添加静态 ARP 缓存项,请使用 IfaceAddr 参数,此处的 IfaceAddr 代表分配给该接口的 IP 地址。
在命令提示符显示帮助。
注释
InetAddr 和 IfaceAddr 的 IP 地址用带圆点的十进制记数法表示。
物理地址 EtherAddr 由六个字节组成,这些字节用十六进制记数法表示并且用连字符隔开(比如,00-AA-00-4F-2 A-9C)。
通过 -s 参数添加的项属于静态项,它们不会 ARP 缓存中超时。如果终止 TCP/IP 协议后再启动,这些项会被删除。要创建永久的静态 ARP 缓存项,请在批处理文件中使用适当的 arp 命令并通过“计划任务程序”在启动时运行该批处理文件。
只有当网际协议 (TCP/IP) 协议在 网络连接中安装为网络适配器属性的组件时,该命令才可用。
范例
要显示所有接口的 ARP 缓存表,可键入:
arp -a
对于指派的 IP 地址为 10.0.0.99 的接口,要显示其 ARP 缓存表,可键入:
arp -a -N 10.0.0.99
要添加将 IP 地址 10.0.0.80 解析成物理地址 00-AA-00-4F-2 A-9C 的静态 ARP 缓存项,可键入:
arp -s 10.0.0.80 00-AA-00-4F-2 A-9C
At
计划在指定时间和日期在计算机上运行命令和程序。at 命令只能在“计划”服务运行时使用。如果在没有参数的情况下使用,则 at 列出已计划的命令。
语法
at [\ComputerName] [{[ID] [/delete] /delete [/yes]}]
at [[\ComputerName] hours:minutes [/interactive] [{/every:date[,...] /next:date[,...]}] command]
参数
\computername
指定远程计算机。如果省略该参数,则 at 计划本地计算机上的命令和程序。
ID
指定指派给已计划命令的识别码。
/delete
取消已计划的命令。如果省略了 ID,则计算机中所有已计划的命令将被取消。
/yes
删除已计划的事件时,对来自系统的所有询问都回答“是”。
hours:minutes
指定命令运行的时间。该时间用 24 小时制(即从 00:00 [午夜] 到 23:59)的 小时: 分钟格式表示。
/interactive
对于在运行 command 时登录的用户,允许 command 与该用户的桌面进行交互。
/every:
在每个星期或月的指定日期(例如,每个星期四,或每月的第三天)运行 command 命令。
date
指定运行命令的日期。可以指定一周的某日或多日(即,键入 M、T、W、Th、F、S、Su)或一个月中的某日或多日(即,键入从 1 到31 之间的数字)。用逗号分隔多个日期项。如果省略了 date,则 at 使用该月的当前日。
/next:
在下一个指定日期(比如,下一个星期四)到来时运行 command。
command
指定要运行的 Windows 命令、程序(.exe 或 .com 文件)或批处理程序(.bat 或 .cmd 文件)。当命令需要路径作为参数时,请使用绝对路径,也就是从驱动器号开始的整个路径。如果命令在远程计算机上,请指定服务器和共享名的通用命名协定 (UNC) 符号,而不是远程驱动器号。
/?
在命令提示符显示帮助。
注释
Schtasks 是功能更为强大的超集命令行计划工具,它含有 at 命令行工具中的所有功能。对于所有的命令行计划任务,都可以使用 schtasks 来替代 at。有关 schtasks 的详细信息,请参阅“相关主题”。
使用 at
使用 at 命令时,要求您必须是本地 Administrators 组的成员。
net use命令入门
Net use命令的原理与作用 将计算机与共享资源连接或断开,或者显示关于计算机连接的信息。该命令还控制持久网络连接。
(1) 在没有参数的情况下使用,则net use 检索网络连接列表。
如图:

(2) 用户名为system32,密码为ffhh 与远程计算机61.150.115.7进行IPC$连接
命令为:net use 61.150.115.7/IPC$ ffhh /user:system32
(3)用户名为administrator 密码为空,与远程计算机61.150.115.7进行IPC$连接
命令为:net use file://61.150.115.7/IPC$ "" /user:administrator
(4)与计算机建立空连接
命令为:net use file://10.10.3.88/IPC$ "" /user:""如图:

5) 隐藏用户名的密码输入,与远程计算机建立连接
net use file://61.150.115.7/IPC$ /user:administrator
(6)要映射网络驱动器,请使用 net use x: \\计算机名称\共享名称 其中 x: 是要分配给共享资源的驱动器号。
例:
C:\>net use file://10.10.3.88/ipc$ 密码或用户名在 file://10.10.3.88/ipc$ 无效。
为 '10.10.3.88' 输入用户名: administrator输入 10.10.3.88 的密码:命令成功完成。
C:\>net use z: file://10.10.3.88/d$ 命令成功完成。
C:\>z:
Z:\>dir 驱动器 Z 中的卷没有标签。 卷的序列号是 C419-0C32
Z:\ 的目录
2007-03-09 19:32
要断开映射的驱动器,请使用 net use x: /delete 命令,其中 x: 是共享资源的驱动器号。 X也可以是IP地址
例:将远程计算机61.150.115.7的c盘映射到本地为O盘 net use o: file://61.150.115.7/c$
例:删除映射: net use file://61.150.115.7/C$ /delete
net user命令:添加或修改用户帐号,或者显示用户帐号信息
(1)添加一个用户名为ffhh,密码为12332, 将用户账户添加到用户账户数据库,
net user ffhh 12332 /add
(2) 从用户账户数据库中删除用户账户
net user ffhh /del
Net localgroup: 添加、显示或修改本地组
(1)输入不带参数的 net localgroup 命令显示服务器名和计算机上本地组的名称
(2)指定要添加、扩展或删除的本地组的名称。只提供 groupname 以查看用户列表或本地组中的全局组
net localgroup administrators
(3) 添加全局组名称或者向本地组中添加用户名称。要先建立账户
net localgroup administrators rachel /add将rachel帐户加到管理员组
(4) 除帐号: net localgroup administrators rachel /delete
Net share: 创建、删除或显示共享资源
(1) 带参数的 net share 显示关于本地计算机上共享的所有资源的信息
例:
C:\>net share
共享名 资源 注释---------------------------------------------------------D$ D:\ 默认共享ADMIN$ C:\WINDOWS 远程管理IPC$ 远程 IPC命令成功完成。
停止共享资源,如:
C:\>net share c$ /del~
使用批处理命令也能当“黑客”
@echo off
echo 格式:test *.*.*>test.txt
for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \%1.%%Gipc$ "" /user:"Administrator" | find "命令成功完成" >>test.txt
将上面的这段程序保存到一个批处理文件中(如test.bat),执行该批处理文件就能自动扫描同一个C类网段内的所有机器是否包含有管理员空口令的机器,并记录下来。下面把和这程序有关的一些知识给大家做个介绍,方便大家进一步研究。
一、弱口令猜测的主要通道——IPC$
弱口令猜测的主要途径是IPC$,IPC$是Internet Process Connection的简称,也叫“共享命名管道资源”,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相应的权限,在远程管理计算机和查看计算机的共享资源时使用。
利用IPC$,连接者甚至可以与目标主机建立一个空的连接而无需用户名与密码,而利用这个空的连接,连接者还可以得到目标主机上的用户列表。
其实,IPC$并不是真正意义上的漏洞,它是为了方便管理员的远程管理而开放的远程网络登录功能,而且还打开了默认共享,即所有的逻辑盘(c$,d$,e$……)和系统目录Winnt或Windows(admin$)。所有的这些,最初都是为了方便管理员的管理,但一些别有用心者会利用IPC$访问共享资源,导出用户列表,并使用一些字典工具,进行密码探测,寄希望于获得更高的权限,从而达到不可告人的目的。
二、弱口令猜测的主要武器——net命令
用于弱口令扫描的主要命令是net,这里使用到的主要是use参数,具体用法如下:
net use 机器名共享目录 "密码" /user:"用户名"
例如我们想以用户zzy,密码123,连接到192.168.0.1服务器的共享目录soft,使用的命令是:
net use \192.168.0.1soft "123" /user:"zzy"
一旦连接成功,会得到“命令成功完成”的提示。
在这里我们需要用administrator的空口令去连接服务器的IPC$服务,所以命令格式应该是:
net use \192.168.0.1ipc$ "" /user:"administrator"
如果我们得到的是“命令成功完成”的提示,就表示192.168.0.1这台服务器的管理员没有设置口令。
当然如果我们要测试整个C类网段的所有服务器,可以更换IP地址一遍遍地输入上面的命令,不过也确实辛苦了些。
三、弱口令猜测的发动机——For命令
为了能完成对整个C类网段的自动扫描,这里使用了Windows的for命令。
For命令可实现对一组文件中的每一个文件执行某个特定命令。具体的用法如下:
FOR %variable IN (set) DO command [command-parameters]
%variable:指定可替换的参数。
(set) :指定一个或一组文件。可以使用通配符。
command:指定对每个文件执行的命令。
command-parameters:对特定命令所指定的参数。
在上面的批处理中,“FOR /L %variable IN (start,step,end) DO command [command-parameters]”表示以增量形式从开始到结束的一个数字序列。如“for /l in (1,1,5)” 将产生序列 (1 2 3 4 5),这样实际上就完成了按顺序去连接不同IP计算机的命令。
当然,对For命令灵活使用的话,还可以在批处理中加上一个可以实时生成的字典,这样就使得猜解的可能更大了。
四、 程序执行中可能遇到的问题
当然,这个批处理实在是太简单了,在实际应用中难免有不少问题,可以通过系统返回的错误号进行判断。
错误号5:拒绝访问:很可能你使用的用户没有管理员权限;
错误号51:Windows 无法找到网络路径,一般是因为网络有问题;
错误号53,找不到网络路径,有可能是IP地址错误、目标未开机、目标有使用端口过滤技术的防火墙;
错误号1326:未知的用户名或错误密码;
错误号2242,此用户的密码已经过期:目标有账号策略,定期强制要求更改密码。
关于IPC$连不上的问题比较复杂,除了以上的原因,还会有其他一些不确定因素,就靠大家自己体会和试验。
五、如何防范
事实上,这个批处理文件在实际应用中,对Windows NT和Windows 2000的效果往往不好,因为两个系统在安装过程中会以非常显眼的方式强制用户输入Administrator密码。但是对于Windows XP来说,Administrator密码不是必须的,对于习惯了安装软件一路“下一步”的用户来说,往往会忽略设置Administrator密码。对于小区宽带用户来说,只要很短的时间就可以把附近的用户扫描一遍。可以说,Windows XP的缺陷加上共享的小区宽带,使得我们这个非常简陋的批处理也能取得良好的效果。
那么怎么样来防范类似的攻击呢?很简单,只要给电脑中的所有用户加上密码就可以了。具体方法也很简单,打开控制面版,选择“用户账户”,再点击相应的账户(比如Administrator),在弹出的向导中选择设置密码并输入密码就可以了。
2008年3月8日星期六
如何判断USB 接口类型
2、 USB 接口主要有两种类型:USB1.1 和 USB2.0, 两者在传输速度上有很大的差异,前者为12Mbps,而后者可达480Mbps。
3、 USB 是向下兼容的,这和Windows 操作系统的向下兼容性是类似的,也就是说一个USB1.1的设备插在一个USB2.0的接口上一定能运行良好,因为USB2.0完全包含了USB1.1的所有内容,但反之就不一定了。
4 、如何判断电脑上USB接口是USB1.1还是USB2.0呢(以中文XP-SP2系统为例)?
(1)打开设备管理器(右健单击 我的电脑-管理-设备管理器 或者我的电脑-属性-硬件-设备管理器
(2)展开 “通用串行总线控制器” 节点,如果看到 Enhanced Host Controller 那么说明你的电脑是支持USB2.0的,如果没有这句,而只有Universal Host Controller 和 USB Root Hub则说明你的电脑只支持USB1.1
(3 )看到 Enhanced Host Controller 并不代表电脑上所有的USB接口都是2.0的,可能有些接口支持2.0,而有些接口只支持1.1,对于老一点的主板,通常机箱前面的接口是USB1.1 的,而后面的接口是USB2.0的。那么如何判断某一个接口到底是什么类型呢?
(4)找一个USB2.0的设备,现在大多数U盘和mp3都是2.0的,插在某一个接口上,待设备安装完成后,进入任务管理器,选择查看-依连接排序设备,然后展开下面的节点找到你插入的设备,看这个设备的最上层节点是什么,如果是 Enhanced Host Controller,那么说明这个接口是2.0的,如果是Universal Host Controller 则说明这个接口是1.1的,按照同样的方法可以验证其他接口。
5 如果电脑上所有的接口都是USB2.0的,如何让它只支持USB1.1?
很简单,只需禁用Enhanced Host Controller 就可以了,右键选择 Enhanced Host Controller 再选择“停用”。
去掉“windows盗版软件受害者”提示
【症状原因】
盗版windows ,使用微软自动更新 请不要安装这个程序
Windows Genuine Advantage 通知工具(KB905474)
不小心安装上后 ,windows登录画面和系统通知栏总会说“您可能是软件盗版的受害者”
【解决方案】
手工清除 WGA也很简单,
第一步:
打开360,【高级】 》 【高级工具集】 》 【文件粉碎机】。
第二步:
然后点【添加文件】按钮,添加这个文件
C:\windows\system32\WgaLogon.dll和C:\windows\system32\Wgatray.exe
然后点【全选】,再点【粉碎选中文件】即可。注意 去掉粉碎机底下那选项两个勾。
粉碎后 重启电脑就可以了 这个烦人的通知就去掉啦。
Mysql读书笔记(基础知识)
对于将MySQL安装为服务的,先使用net stop MySQL,如果没有将MySQL安装为服务,先停止服务,而后安装新的服务器软件。
2.连接服务器
shell> mysql -h host_name -u user_name -pyour_pass
Enter password: ********
-h选项表示连接的主机
-u选项表示连接的用户
-p选项表示输入密码,注意如果在这里输入密码,应该无空格,直接跟在参数之后,否则,表示的是连入后欲打开的数据库
在安装完系统之后,你第一次连接只能在本机使用,这时可以省略-h host,同时这时没有其他的用户建立,所以用户名是缺省的root用户。
3.数据库的****作
(1)创建数据库
mysql> CREATE DATABASE liuyan;
如示例,我们创建数据库liuyan,同时可见,我们使用分号结束命令,表示命令输入完毕可以执行。
(2)显示数据库
mysql> SHOW DATABASES;
+--------------+
| Database |
+--------------+
| liuyan |
| mysql |
| test |
+--------------+
这时我们可以看见我们创建的数据库已经存在在列表中。
(3)打开数据库
mysql> USE liuyan
Database changed
使用USE命令打开数据库,注意的是,这里我们没有输入分号结尾,其实输入分号结果也是一样的。
4.表的****操作
(1)创建数据表
mysql> CREATE TABLE liuyan_temp (
-> id int(6) NOT NULL auto_increment,
-> url varchar(100) default #,
-> ip varchar(20) default NULL,
-> email varchar(50) default #,
-> qq varchar(20) default NULL,
-> sj varchar(30) default NULL,
-> content text,
-> xm varchar(20) default 没有姓名,
-> KEY id (id)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.20 sec)
(2)显示数据表
mysql> show tables;
+------------------------+
| Tables_in_liuyan |
+------------------------+
| liuyan_temp |
+------------------------+
1 row in set (0.00 sec)
使用show tables命令显示打开数据库中的表清单。
(3)显示数据表的结构
mysql> describe liuyan_temp;
使用describe命令显示指定表的结构。
(4)输入数据
mysql> LOAD DATA LOCAL INFILE liuyan.txt INTO TABLE liuyan_temp
-> LINES TERMINATED BY \r\n;
示例直接从文件liuyan.txt中导入数据表中的内容,另外,我们也可以通过insert into语句来插入数据
mysql> insert into liuyan_temp(url,ip,email,qq,sj,content,xm) values
-> (http://jinjohn.myrice.com,
-> 127.0.0.1,
-> jinjohn@etang.com,
-> 19151579,
-> 2004-10-05,
-> ,
-> jinjohn);
5.用户的****操作
(1)查询现有的用户
mysql> use mysql;
mysql> SELECT * FROM user;
下例要求显示所有的用户及其可登录的计算机
mysql> select user,host from user;
+---------+-------------+
| user | host |
+---------+-------------+
| admin | % |
| | build |
| root | build |
| | localhost|
| root | localhost|
+---------+-------------+
5 rows in set (0.01 sec)
(2)修改用户密码
mysql> SET PASSWORD FOR abe@host_name = eagle;
mysql> SET PASSWORD FOR abe@host_name = PASSWORD(eagle);
mysql> SET PASSWORD FOR some_user@some_host = OLD_PASSWORD(mypass);
(3)增加用户
有二种方式,一种为使用insert into命令来添加用户,另一种为使用grant命令来添加用户,前提是登录的用户必须具有对MYSQL库的读写权限,缺省情况下root@localhost具有所有权限
方法一:使用inset命令向user表中添加记录
shell> mysql --user=root mysql
以root用户身份登录mysql数据库
mysql> INSERT INTO user
-> VALUES(localhost,monty,PASSWORD(some_pass),
-> Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y);
向user表添加用户monty在本机的登录帐号及权限。
mysql> INSERT INTO user
-> VALUES(%,monty,PASSWORD(some_pass),
-> Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y,Y);
向user表添加用户monty在所有机器上都可以登录的帐号及权限。
mysql> INSERT INTO user SET Host=localhost,User=admin,
-> Reload_priv=Y, Process_priv=Y;
向user表添加用户admin在本机登录的帐号。
mysql> INSERT INTO user (Host,User,Password)
-> VALUES(localhost,dummy,);
向user表添加用户dummy在本机登录帐号的用户名和密码。
mysql> FLUSH PRIVILEGES;
提交更改,使其应用于系统中。
方法二,使用GRANT命令
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
-> IDENTIFIED BY some_pass WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@%
-> IDENTIFIED BY some_pass WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
下例授予用户david在一组计算机中登录的所有访问权限。
mysql> GRANT ALL PRIVILEGES ON db.*
-> TO david@192.58.197.0/255.255.255.0;
数据库的访问权限主要分SELECT、INSERT、UPDATE和DELETE。
(4)显示用户所拥有的权限
mysql> SHOW GRANTS FOR bob@pc84.example.com;
6.退出
mysql> quit
解决局域网ARP攻击引起的瑞星提示有病毒问题
解决方法:
先下载MSMS07-017漏洞补丁!清空IE临时文件夹,就是在IE的工具-Internet选项-常规里选择删除文件。如果还不会清除,可以重启电脑 后在地址栏输入C:\\Documents and Settings\\“用户名”\\Local Settings\\Temporary Internet Files\\Content.IE5删除里边的所有文件夹
如果你删除后打开网页瑞星还提示有病毒并且你是通过局域网来上网的,这说明你受到了其它中毒机器的ARP地址欺骗的攻击!解决方法,安装金山ARP防火墙,然后在清空IE临时文件夹!
病毒现象:

CSS+DIV之text属性
1.文本对齐属性(text-align),用来设定文本的对齐方式,其相关参数有:left(居左,缺省值)、right(居右)、center(居中)、justify(两端对齐,不常用)。
示例写法:.apple{text-align:left}或.apple{text-align:right;}
2.文本修饰属性(text-decoration),用来设定文本划线的属性,其相关参数有:none(无,缺省值)、underline(下划线)、overline(上划线)、line-through (当中划线)。我个人常用none和underline。
示例写法:.apple{text-decoration:underline;}
3.文本缩进属性(text-indent),用来设定文本首行缩进。其值单位主要有:length长度,绝对单位(cm, mm, in, pt, pc)或者相对单位 (em, ex, px);或者percentage (百分比,相当于父对象宽度的百分比)
示例写法:.apple{text-indent:20px;}或.apple{text-indent:30%;}
4.行高属性(line-height),用来设定每行之间的距离。其值单位主要有:normal (缺省值)、length、percentage,类似于文本缩进属性。
示例写法:.apple{line-height:20px;}
5.字间距属性(letter-spacing),用来设定字符之间的距离。其值单位主要有:normal (缺省值)、length、percentage,类似于文本缩进属性。
示例写法:.apple{letter-spacing:100px;}
text与border、font有不相同之外,后者都有综合的写法,而文本属性经常是单个使用,综合写法,也只需要把所有参数放在同一个{}即可实现效果,也可在文本属性中增加color颜色属性。以下是练习的例子,仅供参考!
ajax基础
| Ajax应用里有这么个语句相比大家都很熟悉: xmlHttp.onreadystatechange = processRequest 就是当返回状态改变的时候运行processRequest函数,而在processRequest函数中判断状态值,不一样的状态值运行不同的程序进行 处理,但有时候 processRequest函数是有参数的,比如 processRequest(tag),代码改成: xmlHttp.onreadystatechange = processRequest 会出现错误.正确的代码如下: xmlHttp.onreadystatechange =function{processRequest(tag)} 函数的这种语法叫做函数直接量. | |
|
| |
从Ajax中看javascript语法(函数篇)
xmlHttp.onreadystatechange = processRequest
就是当返回状态改变的时候运行processRequest函数,而在processRequest函数中判断状态值,不一样的状态值运行不同的程序进行处理,但有时候 processRequest函数是有参数的,比如 processRequest(tag),代码改成:
xmlHttp.onreadystatechange = processRequest
会出现错误.正确的代码如下:
xmlHttp.onreadystatechange =function{processRequest(tag)}
函数的这种语法叫做函数直接量.
函数的集中构建方法比较:
function f(x) { return x*x; } //function语句
var f = new Function("x","return x*x;") //Function()构造函数
var f = function(x){ return x*x; }; //函数直接量
函数直接量是一个表达式,它定义匿名函数.函数直接量的语法和function语法非常相似,只不过它被用作表达式,而不是作为语句,而且也无需指定函数名.
PHP会话(Session) 使用入门
由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。
对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能只做一次验证。
为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安全。
而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。
当然使用 Session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。
Session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 php.ini 的权限,默认 Session 的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。
开始介绍如何创建 Session。非常简单,真的。
启动 Session 会话,并创建一个 $admin 变量:
// 启动 Session
session_start();
// 声明一个名为 admin 的变量,并赋空值。
$_SESSION["admin"] = null;
?>
如果你使用了 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 Session 文件的创建。
执行完这个程序后,我们可以到系统临时文件夹找到这个 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:
admin|N;
一般该内容是这样的结构:
变量名|类型:长度:值;
并用分号隔开每个变量。有些是可以省略的,比如长度和类型。
我们来看一下验证程序,假设数据库存储的是用户名和 md5 加密后的密码:
login.php
// 表单提交后...
$posts = $_POST;
// 清除一些空白符号
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];
$query = "Select `username` FROM `user` Where `password` = '$password'";
// 取得查询结果
$userInfo = $DB->getRow($query);
if (!empty($userInfo))
{
if ($userInfo["username"] == $username)
{
// 当验证通过后,启动 Session
session_start();
// 注册登陆成功的 admin 变量,并赋值 true
$_SESSION["admin"] = true;
}
else
{
die("用户名密码错误");
}
}
else
{
die("用户名密码错误");
}
?>
我们在需要用户验证的页面启动 Session,判断是否登陆:
// 防止全局变量造成安全隐患
$admin = false;
// 启动会话,这步必不可少
session_start();
// 判断是否登陆
if (isset($_SESSION["admin"]) && $_SESSION["admin"] === true)
{
echo "您已经成功登陆";
}
else
{
// 验证失败,将 $_SESSION["admin"] 置为 false
$_SESSION["admin"] = false;
die("您无权访问");
}
?>
是不是很简单呢?将 $_SESSION 看成是存储在服务器端的数组即可,我们注册的每一个变量都是数组的键,跟使用数组没有什么分别。
如果要登出系统怎么办?销毁 Session 即可。
session_start();
// 这种方法是将原来注册的某个变量销毁
unset($_SESSION["admin"]);
// 这种方法是销毁整个 Session 文件
session_destroy();
?>
Session 能否像 Cookie 那样设置生存周期呢?有了 Session 是否就完全抛弃 Cookie 呢?我想说,结合 Cookie 来使用 Session 才是最方便的。
Session 是如何来判断客户端用户的呢?它是通过 Session ID 来判断的,什么是 Session ID,就是那个 Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保 Session 的安全。一般如果没有设置 Session 的生存周期,则 Session ID 存储在内存中,关闭浏览器后该 ID 自动注销,重新请求该页面后,重新注册一个 Session ID。
如果客户端没有禁用 Cookie,则 Cookie 在启动 Session 会话的时候扮演的是存储 Session ID 和 Session 生存期的角色。
我们来手动设置 Session 的生存期:
session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>
其实 Session 还提供了一个函数 session_set_cookie_params(); 来设置 Session 的生存期的,该函数必须在 session_start() 函数调用之前调用:
// 保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>
如果客户端使用 IE 6.0 , session_set_cookie_params(); 函数设置 Cookie 会有些问题,所以我们还是手动调用 setcookie 函数来创建 cookie。
假设客户端禁用 Cookie 怎么办?没办法,所有生存周期都是浏览器进程了,只要关闭浏览器,再次请求页面又得重新注册 Session。那么怎么传递 Session ID 呢?通过 URL 或者通过隐藏表单来传递,PHP 会自动将 Session ID 发送到 URL 上,URL 形如:http://www.openphp.cn/index.php?PHPSESSID=bba5b2a240a77e5b44cfa01d49cf9669,其中 URL 中的参数 PHPSESSID 就是 Session ID了,我们可以使用 $_GET 来获取该值,从而实现 Session ID 页面间传递。
// 保存一天
$lifeTime = 24 * 3600;
// 取得当前 Session 名,默认为 PHPSESSID
$sessionName = session_name();
// 取得 Session ID
$sessionID = $_GET[$sessionName];
// 使用 session_id() 设置获得的 Session ID
session_id($sessionID);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>
对于虚拟主机来说,如果所有用户的 Session 都保存在系统临时文件夹里,将给维护造成困难,而且降低了安全性,我们可以手动设置 Session 文件的保存路径,session_save_path() 就提供了这样一个功能。我们可以将 Session 存放目录指向一个不能通过 Web 方式访问的文件夹,当然,该文件夹必须具备可读写属性。
// 设置一个存放目录
$savePath = "./session_save_dir/";
// 保存一天
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?>
同 session_set_cookie_params(); 函数一样,session_save_path() 函数也必须在 session_start() 函数调用之前调用。
我们还可以将数组,对象存储在 Session 中。操作数组和操作一般变量没有什么区别,而保存对象的话,PHP 会自动对对象进行序列化(也叫串行化),然后保存于 Session 中。下面例子说明了这一点:
person.php
class person
{
var $age;
function output() {
echo $this->age;
}
function setAge($age) {
$this->age = $age;
}
}
?>
setage.php
session_start();
require_once "person.php";
$person = new person();
$person->setAge(21);
$_SESSION['person'] = $person;
echo "check here to output age";
?>
output.php
// 设置回调函数,确保重新构建对象。
ini_set('unserialize_callback_func', 'mycallback');
function mycallback($classname) {
include_once $classname . ".php";
}
session_start();
$person = $_SESSION["person"];
// 输出 21
$person->output();
?>
当我们执行 setage.php 文件的时候,调用了 setage() 方法,设置了年龄为 21,并将该状态序列化后保存在 Session 中(PHP 将自动完成这一转换),当转到 output.php 后,要输出这个值,就必须反序列化刚才保存的对象,又因为在解序列化的时候需要实例化一个未定义类,所以我们定义了以后回调函数,自动包含 person.php 这个类文件,因此对象被重构,并取得当前 age 的值为 21,然后调用 output() 方法输出该值。
另外,我们还可以使用 session_set_save_handler 函数来自定义 Session 的调用方式
