针对有网友说看不见文章内容, 现提示如下: 点击每一个标题行任一地方都会展开和隐藏此文章内容(不要点击标题). 目前展开隐藏功能只支持IE浏览器,虽然可以改成支持FF浏览器,不过现在一直没时间去弄,等有时间再修改了。 |
blog名称:乱闪Blog 日志总数:267 评论数量:1618 留言数量:-26 访问次数:2654443 建立时间:2005年1月1日 |
|

| |
散列函数中的碰撞
|
[翻译]王小云论文:散列函数中的碰撞
散列(哈希)函数 MD4、MD5、HAVAL-128 和 RIPEMD 中的碰撞
原著:Wang Xiaoyun Feng Dengguo Lai Xuejia Yu Hongbo [由于不知道各人具体的姓名,不便用中文] (中国济南 山东大学 数学和系统科学院 250100、中国北京 中国科学研究院软件学会 100080、中国上海 上海交通大学计算机科学和机械部) xywang@sdu.edu.cn 原文:收藏 翻译:lover_P
1 MD5 中的碰撞
MD5 由 Ron Rivest [9] 设计,是 MD4 [8] 的加强版。1993 年,Bert den Boer 和 Antoon Bosselaers [1] 发现了 MD5 算法的伪碰撞,它从两组不同的初始值得到了相同的消息。H. Dobbertin [3] 发现了一个单体状态的碰撞,它由一个给定的初始值 IV0' 所得到的两个不同的 512 位消息构成。
IV0': A0' = 0x12AC2375, B0' = 0x3B341042, C0' = 0x5F62B97C, D0' = 0xBA763ED
我们的攻击可以发现很多对具有相同原始初始值 IV0 的两个 1024 位 MD5 消息:
IV0: A0 = 0x67452301, B0 = 0xEFCDAB89, C0 = 098BADEFD, D0 = 0x10325476
M' = M + ΔC1, ΔC1 = (0, 0, 0, 0, 231, ..., 215, ..., 231, 0)
Ni' = Ni + ΔC2, ΔC2 = (0, 0, 0, 0 231, ..., -215, ..., 231, 0)
(位置4、11和14非零)
此时,
MD5(M, Ni) = MD5(M', Ni')
在 IBM P690 上,要用将近一个小时的时间来寻找这样的 M 和 M',之后,只需要 15 秒到 5 分钟的时间就可以找到 Ni 和 Ni',此时的 (M, Ni) 和 (M', Ni') 将产生相同的散列值。此外,我们的攻击可以工作于任意给定的初始值。
下面是会产生碰撞的两对 1024 位消息,这两个例子具有相同的前半部 512 位。
X1
M
2dd31d1 c4eee6c5 69a3d69 5cf9af98 87b5ca2f ab7e4612 3e580440 897ffbb8 634ad55 2b3f409 8388e483 5a417125 e8255108 9fc9cdf7 f2bd1dd9 5b3c3780
N1
d11d0b96 9c7b41dc f497d8e4 d555655a c79a7335 cfdebf0 66f12930 8fb109d1 797f2775 eb5cd530 baade822 5c15cc79 ddcb74ed 6dd3c55f d80a9bb1 e3a7cc35
X1'
M'
2dd31d1 c4eee6c5 69a3d69 5cf9af98 7b5ca2f ab7e4612 3e580440 897ffbb8 634ad55 2b3f409 8388e483 5a41f125 e8255108 9fc9cdf7 72bd1dd9 5b3c3780
N1
d11d0b96 9c7b41dc f497d8e4 d555655a 479a7335 cfdebf0 66f12930 8fb109d1 797f2775 eb5cd530 baade822 5c154c79 ddcb74ed 6dd3c55f 580a9bb1 e3a7cc35
H
9603161f f41fc7ef 9f65ffbc a30f9dbf
X2
M
2dd31d1 c4eee6c5 69a3d69 5cf9af98 87b5ca2f ab7e4612 3e580440 897ffbb8 634ad55 2b3f409 8388e483 5a417125 e8255108 9fc9cdf7 f2bd1dd9 5b3c3780
N2
313e82d8 5b8f3456 d4ac6dae c619c936 b4e253dd fd03da87 6633902 a0cd48d2 42339fe9 e87e570f 70b654ce 1e0da880 bc2198c6 9383a8b6 2b65f996 702af76f
X2'
M'
2dd31d1 c4eee6c5 69a3d69 5cf9af98 7b5ca2f ab7e4612 3e580440 897ffbb8 634ad55 2b3f409 8388e483 5a41f125 e8255108 9fc9cdf7 72bd1dd9 5b3c3780
N2
313e82d8 5b8f3456 d4ac6dae c619c936 34e253dd fd03da87 6633902 a0cd48d2 42339fe9 e87e570f 70b654ce 1e0d2880 bc2198c6 9383a8b6 ab65f996 702af76f
H
8d5e7019 6324c015 715d6b58 61804e08
表1 MD5 的两对碰撞
2 HAVAL-128 中的碰撞
HAVAL 也在提议之内 [10]。HAVAL 也是一种散列算法,通过对任意长度的消息经过 3、4 或 5 遍摘要产生一个长度为 128、160、192 或 224 位的指纹。
对 HAVAL 的一个简化版的攻击由 P. R. Kasselman 和 W. T. Penzhorn 给出 [7],这由 HAVAL-128 的最后一轮(摘要)构成。而我们只通过大约 26 次 HAVAL 计算就破坏了整个 HAVAL-128 算法。这里我们给出 HAVAL-128 碰撞的两个例子,其中
M' = M + ΔC, ΔC = (2i-1, 0, 0, 0, 2i-12, ..., 2i-8, 0, ..., 0)
由于位置 0、11、18 非零,且 i = 0, 1, 2, ..., 31,因此 HAVAL(M) = HAVAL(M')。
M1
6377448b d9e59f18 f2aa3cbb d6cb92ba ee544a44 879fa576 1ca34633 76ca5d4f a67a8a42 8d3adc8b b6e3d814 5630998d 86ea5dcd a739ae7b 54fd8e32 acbb2b36 38183c9a b67a9289 c47299b2 27039ee5 dd555e14 839018d8 aabbd9c9 d78fc632 fff4b3a7 40000096 7f466aac fffffbc0 5f4016d2 5f4016d0 12e2b0 f4307f87
M1'
6377488b d9e59f18 f2aa3cbb d6cb92ba ee544a44 879fa576 1ca34633 76ca5d4f a67a8a42 8d3adc8b b6e3d814 d630998d 86ea5dcd a739ae7b 54fd8e32 acbb2b36 38183c9a b67a9289 c47299ba 27039ee5 dd555e14 839018d8 aabbd9c9 d78fc632 fff4b3a7 40000096 7f466aac fffffbc0 5f4016d2 5f4016d0 12e2b0 f4307f87
H
95b5621c ca62817a a48dacd8 6d2b54bf
M2
6377448b d9e59f18 f2aa3cbb d6cb92ba ee544a44 879fa576 1ca34633 76ca5d4f a67a8a42 8d3adc8b b6e3d814 5630998d 86ea5dcd a739ae7b 54fd8e32 acbb2b36 38183c9a b67a9289 c47299b2 27039ee5 dd555e14 839018d8 aabbd9c9 d78fc632 fff4b3a7 40000096 7f466aac fffffbc0 5f4016d2 5f4016d0 12e2b0 f5b16963
M2'
6377488b d9e59f18 f2aa3cbb d6cb92ba ee544a44 879fa576 1ca34633 76ca5d4f a67a8a42 8d3adc8b b6e3d814 d630998d 86ea5dcd a739ae7b 54fd8e32 acbb2b36 38183c9a b67a9289 c47299ba 27039ee5 dd555e14 839018d8 aabbd9c9 d78fc632 fff4b3a7 40000096 7f466aac fffffbc0 5f4016d2 5f4016d0 12e2b0 f5b16963
H
b0e99492 d64eb647 5149ef30 4293733c
表2 两对碰撞,其中 i = 11 且这两个例子只有最后的一个字不同
3 MD4 中的碰撞
MD4 由 R. L. Rivest [8] 设计。H. Dobbertin 于 Eurocrypto '96 的攻击 [2] 能够找到概率为 1/222 的碰撞。我们的攻击却可以通过手算来找到碰撞,如:
M' = M + ΔC, ΔC = (0, 231, -228 + 231, 0, 0, 0, 0, 0, 0, 0, 0, 0, -216, 0, 0, 0)
且 MD4(M) = MD4(M')。
M1
4d7a9c83 56cb927a b9d5a578 57a7a5ee de748a3c dcc366b3 b683a020 3b2a5d9f c69d71b3 f9e99198 d79f805e a63bb2e8 45dd8e31 97e31fe5 2794bf08 b9e8c3e9
M1'
4d7a9c83 d6cb927a 29d5a578 57a7a5ee de748a3c dcc366b3 b683a020 3b2a5d9f c69d71b3 f9e99198 d79f805e a63bb2e8 45dc8e31 97e31fe5 2794bf08 b9e8c3e9
H
5f5c1a0d 71b36046 1b5435da 9b0d807a
M2
4d7a9c83 56cb927a b9d5a578 57a7a5ee de748a3c dcc366b3 b683a020 3b2a5d9f c69d71b3 f9e99198 d79f805e a63bb2e8 45dd8e31 97e31fe5 f713c240 a7b8cf69
M2'
4d7a9c83 d6cb927a 29d5a578 57a7a5ee de748a3c dcc366b3 b683a020 3b2a5d9f c69d71b3 f9e99198 d79f805e a63bb2e8 45dc8e31 97e31fe5 f713c240 a7b8cf69
H
e0f76122 c429c56c ebb5e256 b809793
表3 MD4 的两对碰撞
4 RIPEMD 中的碰撞
RIPEMD 由 RIPE 项目(RACE Integrrity Primitives Evalustion, 1988-1992)开发。在 1995 年,H. Dobbertin 提供的只有两轮(摘要)的 RIPEMD 简化版 [4] 并不是无碰撞的。而我们发现完整的 RIPEMD 也不是无碰撞的。下面是 RIPEMD 的两对碰撞:
Mi' = Mi + ΔC, ΔC = (0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 218 + 231, 0, 0, 0, 0, 231)
M1
579faf8e 9ecf579 574a6aba 78413511 a2b410a4 ad2f6c9f b56202c 4d757911 bdeaae7 78bc91f2 47bc6d7d 9abdd1b1 a45d2015 817104ff 264758a8 61064ea5
M1'
579faf8e 9ecf579 574a6aba 78513511 a2b410a4 ad2f6c9f b56202c 4d757911 bdeaae7 78bc91f2 c7c06d7d 9abdd1b1 a45d2015 817104ff 264758a8 e1064ea5
H
1fab152 1654a31b 7a33776a 9e968ba7
M2
579faf8e 9ecf579 574a6aba 78413511 a2b410a4 ad2f6c9f b56202c 4d757911 bdeaae7 78bc91f2 47bc6d7d 9abdd1b1 a45d2015 a0a504ff b18d58a8 e70c66b6
M2'
579faf8e 9ecf579 574a6aba 78513511 a2b410a4 ad2f6c9f b56202c 4d757911 bdeaae7 78bc91f2 c7c06d7d 9abdd1b1 a45d2015 a0a504ff b18d58a8 670c66b6
H
1f2c159f 569b31a6 dfcaa51a 25665d24
表4 RIPEMD 中的碰撞
5 备注
除了上面我们破坏的几个散列函数,其他一些散列函数也并不具有理想的安全性。例如,SHA-0 [6] 的碰撞就可以通过大约 240 次 SHA-0 计算找到,以及 HAVAL-160 的一个概率为 1/232 的碰撞也是可以被找到的。
注意这篇报告中的所有消息和其他的值都是按照32位字分组的,每个32位字中的最左边一个字节是关键字节(译注:大尾数法表示)。
1 B. den Boer, Antoon Bosselaers, Collisions for the Compression Function of MD5, Eurocrypto,93. 2 H. Dobbertin, Cryptanalysis of MD4, Fast Software Encryption, LNCS 1039, D. , Springer-Verlag, 1996. 3 H. Dobbertin, Cryptanalysis of MD5 compress, presented at the rump session of EurocrZpt'96. 4 Hans Dobbertin, RIPEMD with Two-round Compress Function is Not Collision-Free, J. Cryptology 10(1),1997. 5 H. Dobbertin, A. Bosselaers, B. Preneel, "RIPMEMD-160: A Strengthened Version of RIPMMD," Fast Software EncrZption, LNCS 1039, D.Gollmann, Ed., Springer-Verlag, 1996, pp. 71-82. 6 FIPS 180-1, Secure hash standard, NIST, US Department of Commerce, Washington D. C., April 1995. 7 P. R. Kasselman, W T Penzhorn , Cryptananlysis od reduced version of HAVAL, Vol. 36, No. 1, Electronic Letters, 2000. 8 R. L. Rivest, The MD4 Message Digest Algorithm, Request for Comments (RFC)1320, Internet Activities Board, Internet Privacy Task Force, April 1992. 9 R. L Rivest, The MD5 Message Digest Algorithm, Request for Comments (RFC)1321, Internet Activities Board, Internet PrivacZ Task Force, April 1992.3RIPEMD-1281 10 Y. Zheng, J. Pieprzyk, J. Seberry, HAVAL--A One-way Hashing Algorithm with Variable Length of Output, Auscrypto'92. |
|
如何让你的SQL运行得更快!
|
一、不合理的索引设计 ----例:表record有620000行,试看在不同的索引下,下面几个 SQL的运行情况: ---- 1.在date上建有一非个群集索引 select count(*) from record where date > '19991201' and date < '19991214'and amount > 2000 (25秒) select date,sum(amount) from record group by date (55秒) select count(*) from record where date > '19990901' and place in ('BJ','SH') (27秒) ---- 分析: ----date上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在 范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。 ---- 2.在date上的一个群集索引 select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 (14秒) select date,sum(amount) from record group by date (28秒) select count(*) from record where date > '19990901' and place in ('BJ','SH')(14秒) ---- 分析: ---- 在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范 围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范 围扫描,提高了查询速度。 ---- 3.在place,date,amount上的组合索引 select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000 (26秒) select date,sum(amount) from record group by date (27秒) select count(*) from record where date > '19990901' and place in ('BJ', 'SH')(< 1秒) ---- 分析: ---- 这是一个不很合理的组合索引,因为它的前导列是place,第一和第二条SQL没有引 用place,因此也没有利用上索引;第三个SQL使用了place,且引用的所有列都包含在组 合索引中,形成了索引覆盖,所以它的速度是非常快的。 ---- 4.在date,place,amount上的组合索引 select count(*) from record where date > '19991201' and date < '19991214' and amount > 2000(< 1秒) select date,sum(amount) from record group by date (11秒) select count(*) from record where date > '19990901' and place in ('BJ','SH')(< 1秒) ---- 分析: ---- 这是一个合理的组合索引。它将date作为前导列,使每个SQL都可以利用索引,并 且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。 ---- 5.总结: ---- 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要 建立在对各种查询的分析和预测上。一般来说: ---- ①.有大量重复值、且经常有范围查询 (between, >,< ,>=,< =)和order by 、group by发生的列,可考虑建立群集索引; ---- ②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引; ---- ③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
二、不充份的连接条件: ---- 例:表card有7896行,在card_no上有一个非聚集索引,表account有191122行,在 account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:
select sum(a.amount) from account a, card b where a.card_no = b.card_no(20秒) ---- 将SQL改为: select sum(a.amount) from account a, card b where a.card_no = b.card_no and a. account_no=b.account_no(< 1秒) ---- 分析: ---- 在第一个连接条件下,最佳查询方案是将account作外层表,card作内层表,利用 card上的索引,其I/O次数可由以下公式估算为: ---- 外层表account上的22541页+(外层表account的191122行*内层表card上对应外层 表第一行所要查找的3页)=595907次I/O ---- 在第二个连接条件下,最佳查询方案是将card作外层表,account作内层表,利用 account上的索引,其I/O次数可由以下公式估算为: ---- 外层表card上的1944页+(外层表card的7896行*内层表account上对应外层表每一 行所要查找的4页)= 33528次I/O ---- 可见,只有充份的连接条件,真正的最佳方案才会被执行。 ---- 总结: ---- 1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方 案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的 表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘 积最小为最佳方案。 ---- 2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连 接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,30 2)。 三、不可优化的where子句 ---- 1.例:下列SQL条件语句中的列都建有恰当的索引,但执行速度却非常慢: select * from record where substring(card_no,1,4)='5378'(13秒) select * from record where amount/30< 1000(11秒) select * from record where convert(char(10),date,112)='19991201'(10秒) ---- 分析: ---- where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不 进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么 就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样: select * from record where card_no like '5378%'(< 1秒) select * from record where amount < 1000*30(< 1秒) select * from record where date= '1999/12/01' (< 1秒) ---- 你会发现SQL明显快起来! ---- 2.例:表stuff有200000行,id_no上有非群集索引,请看下面这个SQL: select count(*) from stuff where id_no in('0','1') (23秒) ---- 分析: ---- where条件中的'in'在逻辑上相当于'or',所以语法分析器会将in ('0','1')转化 为id_no ='0' or id_no='1'来执行。我们期望它会根据每个or子句分别查找,再将结果 相加,这样可以利用id_no上的索引;但实际上(根据showplan),它却采用了"OR策略" ,即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉 重复行,最后从这个临时表中计算结果。因此,实际过程没有利用id_no上索引,并且完 成时间还要受tempdb数据库性能的影响。 ---- 实践证明,表的行数越多,工作表的性能就越差,当stuff有620000行时,执行时 间竟达到220秒!还不如将or子句分开: select count(*) from stuff where id_no='0' select count(*) from stuff where id_no='1' ---- 得到两个结果,再作一次加法合算。因为每句都使用了索引,执行时间只有3秒, 在620000行下,时间也只有4秒。或者,用更好的方法,写一个简单的存储过程: create proc count_stuff as declare @a int declare @b int declare @c int declare @d char(10) begin select @a=count(*) from stuff where id_no='0' select @b=count(*) from stuff where id_no='1' end select @c=@a+@b select @d=convert(char(10),@c) print @d ---- 直接算出结果,执行时间同上面一样快! ---- 总结: ---- 可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。
---- 1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时 要尽可能将操作移至等号右边。 ---- 2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把 子句拆开;拆开的子句中应该包含索引。 ---- 3.要善于使用存储过程,它使SQL变得更加灵活和高效。 ---- 从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可 以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实S QL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会 涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下: ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。
2.避免或简化排序 应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素: ●索引中不包括一个或几个待排序的列; ●group by或order by子句中列的次序与索引的次序不一样; ●排序的列来自不同的表。 为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
3.消除对大型表行数据的顺序存取 在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。 还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作: SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008 虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句: SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 UNION SELECT * FROM orders WHERE order_num=1008 这样就能利用索引路径处理查询。
4.避免相关子查询 一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
5.避免困难的正规表达式 MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _” 即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。 另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
6.使用临时表加速查询 把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如: SELECT cust.name,rcvbles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 AND cust.postcode>“98000” ORDER BY cust.name 如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序: SELECT cust.name,rcvbles.balance,……other columns FROM cust,rcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 ORDER BY cust.name INTO TEMP cust_with_balance 然后以下面的方式在临时表中查询: SELECT * FROM cust_with_balance WHERE postcode>“98000” 临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。 注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
7.用排序来取代非顺序存取 非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。 有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
3.优化 tempdb 性能
对 tempdb 数据库的物理位置和数据库选项设置的一般建议包括: 使 tempdb 数据库得以按需自动扩展。这确保在执行完成前不终止查询,该查询所生成的存储在 tempdb 数据库内的中间结果集比预期大得多。
将 tempdb 数据库文件的初始大小设置为合理的大小,以避免当需要更多空间时文件自动扩展。如果 tempdb 数据库扩展得过于频繁,性能会受不良影响。
将文件增长增量百分比设置为合理的大小,以避免 tempdb 数据库文件按太小的值增长。如果文件增长幅度与写入 tempdb 数据库的数据量相比太小,则 tempdb 数据库可能需要始终扩展,因而将妨害性能。
将 tempdb 数据库放在快速 I/O 子系统上以确保好的性能。在多个磁盘上条带化 tempdb 数据库以获得更好的性能。将 tempdb 数据库放在除用户数据库所使用的磁盘之外的磁盘上。有关更多信息,请参见扩充数据库。
4.优化服务器:
使用内存配置选项优化服务器性能 Microsoft® SQL Server™ 2000 的内存管理组件消除了对 SQL Server 可用的内存进行手工管理的需要。SQL Server 在启动时根据操作系统和其它应用程序当前正在使用的内存量,动态确定应分配的内存量。当计算机和SQL Server 上的负荷更改时,分配的内存也随之更改。有关更多信息,请参见内存构架。
下列服务器配置选项可用于配置内存使用并影响服务器性能: min server memory max server memory max worker threads index create memory
min memory per query min server memory 服务器配置选项可用于确保 SQL Server 在达到该值后不会释放内存。可以基于 SQL Server 的大小及活动将该配置选项设置为特定的值。如果选择设置此选项,必须为操作系统和其他程序留出足够的内存。如果操作系统没有足够的内存,会向 SQL Server 请求内存,从而导致影响 SQL Server 性能。
max server memory 服务器配置选项可用于:在 SQL Server 启动及运行时,指定 SQL Server 可以分配的最大内存量。如果知道有多个应用程序与 SQL Server 同时运行,而且想保障这些应用程序有足够的内存运行,可以将该配置选项设置为特定的值。如果这些其它应用程序(如 Web 服务器或电子邮件服务器)只根据需要请求内存,则 SQL Server 将根据需要给它们释放内存,因此不要设置 max server memory 服务器配置选项。然而,应用程序通常在启动时不假选择地使用可用内存,而如果需要更多内存也不请求。如果有这种行为方式的应用程序与 SQL Server 同时运行在相同的计算机上,则将 max server memory 服务器配置选项设置为特定的值,以保障应用程序所需的内存不由 SQL Server 分配出。 不要将 min server memory 和 max server memory 服务器配置选项设置为相同的值,这样做会使分配给 SQL Server 的内存量固定。动态内存分配可以随时间提供最佳的总体性能。有关更多信息,请参见服务器内存选项。
max worker threads 服务器配置选项可用于指定为用户连接到 SQL Server 提供支持的线程数。255 这一默认设置对一些配置可能稍微偏高,这要具体取决于并发用户数。由于每个工作线程都已分配,因此即使线程没有正在使用(因为并发连接比分配的工作线程少),可由其它操作(如高速缓冲存储器)更好地利用的内存资源也可能是未使用的。一般情况下,应将该配置值设置为并发连接数,但不能超过 32727。并发连接与用户登录连接不同。SQL Server 实例的工作线程池只需要足够大,以便为同时正在该实例中执行批处理的用户连接提供服务。如果增加工作线程的数量超过默认值,会降低服务器性能。有关更多信息,请参见max worker threads 选项。 说明 当 SQL Server 运行在 Microsoft Windows® 98 上时,最大工作线程服务器配置选项不起作用。
index create memory 服务器配置选项控制创建索引时排序操作所使用的内存量。在生产系统上创建索引通常是不常执行的任务,通常调度为在非峰值时间执行的作业。因此,不常创建索引且在非峰值时间时,增加该值可提高索引创建的性能。不过,最好将 min memory per query 配置选项保持在一个较低的值,这样即使所有请求的内存都不可用,索引创建作业仍能开始。有关更多信息,请参见 index create memory 选项。 min memory per query 服务器配置选项可用于指定分配给查询执行的最小内存量。当系统内有许多查询并发执行时,增大 min memory per query 的值有助于提高消耗大量内存的查询(如大型排序和哈希操作)的性能。不过,不要将 min memory per query 服务器配置选项设置得太高,尤其是在很忙的系统上,因为查询将不得不等到能确保占有请求的最小内存、或等到超过 query wait 服务器配置选项内所指定的值。如果可用内存比执行查询所需的指定最小内存多,则只要查询能对多出的内存加以有效的利用,就可以使用多出的内存。有关更多信息,请参见 min memory per query 选项和 query wait 选项。
使用 I/O 配置选项优化服务器性能 下列服务器配置选项可用于配置 I/O 的使用并影响服务器性能:
recovery interval recovery interval 服务器配置选项控制 Microsoft® SQL Server™ 2000 在每个数据库内发出检查点的时间。默认情况下,SQL Server 确定执行检查点操作的最佳时间。然而,若要确定这是否为适当的设置,需要使用 Windows NT 性能监视器监视数据库文件上的磁盘写入活动。导致磁盘利用率达到 100% 的活动尖峰值会妨害性能。若更改该参数以使检查点进程较少出现,通常可以提高这种情况下的总体性能。但仍须继续监视性能以确定新值是否已对性能产生正面影响。有关更多信息,请参见recovery interval 选项。 |
|
Global.asa编程完全参考手册
|
Global.asa 文件是一隹裳∥募没Э梢栽诟梦募兄付ㄊ录疟荆⑸骶哂谢峄昂陀τ贸绦蜃饔糜虻亩韵蟆8梦募哪谌?nbsp; 给用户显示的,而是用来存储事件信息和由应用程序全局使用的对象。该文件的名称必须是 Global.asa 且必须存放在应用程序的 根目录中。每个应用程序只能有一个 Global.asa 文件。
Global.asa 文件只能包含如下内容:
1.应用程序事件
2.会话事件
3.<OBJECT> 声明
TypeLibrary 声明 如果包含的脚本没有用 <SCRIPT> 标记封装,或定义的对象没有会话或应用程序作用域,则服务器将返回错误。服务器会忽略已标 记的但未被应用程序或会话事件使用的脚本以及文件中的 HTML 语句。
可以用任何支持脚本的语言编写 Global.asa 文件中包含的脚本。如果多个事件使用同一种脚本语言,就可以将它们组织在一组 <SCRIPT> 标记中。
当用户保存对 Global.asa 文件所做的更改时,在重新编译 Global.asa 文件之前,服务器会结束处理当前应用程序的所有请 求。在此期间,服务器拒绝其他请求并返回一个错误消息,说明正在重启动应用程序,不能处理请求。
当用户当前的所有请求处理完之后,服务器对每个会话调用 Session_OnEnd 事件,删除所有活动会话,并调用 Application_OnEnd 事件关闭应用程序,然后编译 Global.asa 文件。接下来,用户的请求将启动应用程序并创建新的会话,触 发 Application_OnStart 和 Session_OnStart 事件。
但是,保存 Global.asa 文件中所包含的文件的更改并不能使服务器重新编译 Global.asa。为了让服务器识别包含文件的改动, 必须再保存一下 Global.asa 文件。
在 Global.asa 文件中声明的过程只能从一个或多个与 Application_OnStart、Application_OnEnd、Session_OnStart 和 Session_OnEnd 事件相关的脚本中调用。在基于 ASP 的应用程序中的 ASP 页中,它们是不可用的。
要在应用程序之间共享过程,可在单独的文件中声明这些过程,然后使用服务器端的包含 (SSI) 语句将该文件包含在调用该过程 的 ASP 页中。通常,包含文件的扩展名应为 .inc。
基于 ASP 的应用程序由在其根目录及其子目录中所有文件组成。应用程序在用户首次打开应用程序中的某一 Web 页时启动,在服 务器关闭时终止。应用程序有两个事件,即 Application_OnStart 事件和 Application_OnEnd 事件。
用户可以在 Global.asa 文件中为这些事件指定脚本。当应用程序启动时,服务器在 Global.asa 文件中查找并处理 Application_OnStart 事件脚本。当应用程序终止时,服务器处理 Application_OnEnd 事件脚本。
1.Application_OnStart Application_OnStart 事件在首次创建新的会话(即 Session_OnStart 事件)之前发生。只有 Application 和 Server 内建 对象是可用的。在 Application_OnStart 事件脚本中引用 Session、Request 或 Response 对象将导致错误。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnStart. . . End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本语言。它可以是任何支持脚本编写的语言,例如 VB Script 或 JScript。如果多个事件使用同一种 脚本语言,就可以将它们组织在一个 <SCRIPT> 标记下。
2.Application_OnEnd Application_OnEnd 事件在应用程序退出时于 Session_OnEnd 事件之后发生,只有 Application 和 Server 内建对象可用。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Application_OnEnd. . . End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本编写语言。可以是任何一种支持脚本的语言,例如 VBScript 或 JScript。如果有多个事件使用同 一种脚本编写语言,就可以将它们组织在一组 <SCRIPT> 标记下。 注释 不能在 Application_OnEnd 脚本中调用 MapPath 方法。
当没有会话的用户在打开应用程序中的 Web 页时,Web 服务器会自动创建会话。当超时或服务器调用 Abandon 方法时,服务器 将终止该会话。
会话有两个事件,即 Session_OnStart 事件和 Session_OnEnd 事件。
可以在全局文件 Global.asa 中为这两个事件指定脚本。当会话开始时,服务器在 Global.asa 文件中查找并处理 Session_OnStart 事件脚本。该脚本将在处理用户请求的 Web 页之前处理。在会话结束时,服务器将处理 Session_OnEnd 事件 脚本。
1.Session_OnStart Session_OnStart 事件在服务器创建新会话时发生。服务器在执行请求的页之前先处理该脚本。Session_OnStart 事件是设置会 话期变量的最佳时机,因为在访问任何页之前都会先设置它们。所有内建对象 (Application、ObjectContext、Request、 Response、Server 和 Session) 都可以在 Session_OnStart 事件脚本中使用和引用。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnStart. . .End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本编写语言。可以是任何一种支持脚本的语言,例如 VBScript 或 JScript。如果有多个事件使用同 一种脚本编写语言,就可以将它们组织在一组 <SCRIPT> 标记下。 示例 尽管在 Session_OnStart 事件包含 Redirect 或 End 方法调用的情况下 Session 对象仍会保持,然而服务器将停止处理 Global.asa 文件并触发 Session_OnStart 事件的文件中的脚本。
举一个例子,为了确保用户在打开某个特定的 Web 页时始终启动一个会话,就可以在 Session_OnStart 事件中调用 Redirect 方法。当用户进入应用程序时,服务器将为用户创建一个会话并处理 Session_OnStart 事件脚本。您可以将脚本包含在该事件中 以便检查用户打开的页是不是启动页,如果不是,就指示用户调用 Response.Redirect 方法启动网页。其演示如下例所示。
<SCRIPT RUNAT=Server Language=VBScript> Sub Session_OnStart ' Make sure that new users start on the correct ' page of the ASP application.
' Replace the value given to startPage below ' with the virtual path to your application's ' start page.
startPage = "/MyApp/StartHere.asp" currentPage = Request.ServerVariables("SCRIPT_NAME")
' Do a case-insensitive compare, and if they ' don't match, send the user to the start page. if strcomp(currentPage,startPage,1) then Response.Redirect(startPage) end ifEnd Sub</SCRIPT> 上述示例只能在支持 cookie 的浏览器中运行。因为不支持 cookie 的浏览器不能返回 SessionID cookie,所以,每当用户请 求 Web 页时,服务器都会创建一个新会话。这样,对于每个请求,服务器都将处理 Session_OnStart 脚本并将用户重定向到启 动页中。如果您要使用下面的脚本,建议您在启动页上放一个通知,告诉用户该站点要求支持 cookie 的浏览器。
注释 请注意,在 Redirect 方法之后的任何 Session_OnStart 事件脚本都不会执行。因此,应该在您的事件脚本的最后再调用 Redirect 方法。其演示如下例所示。
<SCRIPT LANGUAGE=VBScript RUNAT=Server> Sub Session_OnStart ' Session initialization script Response.Redirect "http:/server/app/StartHere.asp" End sub </SCRIPT> 在上面的例子中,Redirect 方法在执行会话初始化脚本期间隐藏所有显示给客户的文字。
2.Session_OnEnd Session_OnEnd 事件在会话被放弃或超时发生。在服务器内建对象中,只有 Application、Server 和 Session 对象可用。
语法 <SCRIPT LANGUAGE=ScriptLanguage RUNAT=Server> Sub Session_OnEnd. . . End Sub
</SCRIPT>
参数 ScriptLanguage 指定用于编写事件脚本的脚本编写语言。可以是任一支持脚本编写的语言,例如 VBScript 或 JScript。如果有多个事件使用同 一种脚本编写语言,则可以将其组织在一组 <SCRIPT> 标记下。 注释 在 Session_OnEnd 脚本中不能调用 MapPath 方法。
<OBJECT> 声明 用户可以在 global.asa 文件中通过使用扩展的 <OBJECT> 标记创建带有会话或应用程序作用域的对象。该标记是自包含的,且 在任何 <SCRIPT> 标记之外。
在 Global.asa 文件中声明的对象在服务器处理调用该对象之前是不会创建的。这样就只会创建必需的对象,从而节约了资源。
服务器对带有应用程序作用域参数创建的对象不调用 OnStartPage 和 OnEndPage 方法。
语法 <OBJECT RUNAT=Server SCOPE=Scope ID=Identifier {PROGID="progID"¦CLASSID="ClassID"}>. . .
</OBJECT>
参数 Scope 指定对象的作用域。在 Global.asa 文件中,Scope 将被设置为 Session 或 Application。
Identifier 指定对象实例的名称。
ProgID 与类标识相关的标识。无论 ProgID 还是 ClassID 都必须在 <OBJECT> 中指定。ProgID 的格式为 [Vendor.]Component [.Version]。
ClassID 指定 COM 类对象的唯一标识。 无论 ProgID 还是 ClassID 都必须在 <OBJECT> 中指定。 示例 下面的第一个示例使用 ProgID 参数创建一个对象,其会话作用域名为 MyConnection。第二个示例使用 ClassID 参数。
<OBJECT RUNAT=Server SCOPE=Session ID=MyConnection PROGID="ADODB.Connection"> REM Object Script </OBJECT>
<OBJECT RUNAT=Server SCOPE=Session ID=MyConnection CLASSID="Clsid:8AD3067A-B3FC-11CF-A560-00A0C9081C21"> REM Object Script </OBJECT>
注释 在 Global.asa 文件中声明的对象可被应用程序中的任何脚本使用。例如,在声明了下列对象的情况下。
---GLOBAL.ASA--- <OBJECT RUNAT=Server SCOPE=Session ID=MyAd PROGID="MSWC.AdRotator"> </OBJECT>
可以从应用程序中的任何一页引用 MyAd 对象:
---SOME.ASP--- <%= MyAd.GetAdvertisement("/ads/adrot.txt") %>
TypeLibrary 声明
ActiveX 组件常常要描述类型库中该组件支持的常量。类型库是一个文件,其中包含有关 ActiveX 组件所支持的对象和类型的信 息。如果用户的 Web 应用程序依赖于已在类型库中声明了类型的 ActiveX 对象,就可以在 Global.asa 文件中声明其类型。这 样做以后,就可以在应用程序范围内从任何脚本引用已在类型库中声明了的数据类型。
有关在 ASP 中使用常量的详细信息,请参阅“使用变量和常量”。
语法 <!--METADATA TYPE="TypeLib" FILE="file" UUID="typelibraryuuid" VERSION="majorversionnumber.minorversionnumber" LCID="localeid" --> 参数 file 类型库的绝对路径。如果提供了该参数和 typelibraryuuid 参数,则 file 将用于标识类型库。file 参数和 typelibraryuuid 参数都是必选项。
typelibraryuuid 类型库统一的唯一标识。file 参数和 typelibraryuuid 参数都是必选项。
majorversionnumber 用于选择版本。如果找不到所需的版本,将返回错误。该参数是可选项。
minorversionnumber 用于选择版本。如果找不到所需的版本,将返回错误。该参数是可选项。
localeid 现场标识,用于类型库。如果找不到所需的现场,将返回错误。该参数是可选项。 错误信息 服务器可返回下列错误消息。
错误 说明 ASP 0222 指定的类型库无效。METADATA 标记包含无效的类型库指定。 ASP 0223 找不到类型库。METADATA 包含的类型库指定与注册表项不符。 ASP 0224 类型库无法加载。ASP 无法加载 METADATA 标记中指定的类型库。 ASP 0225 类型库不能重叠。ASP 无法从在 METADATA 标记中指定的类型库中创建 Type Library Wrapper 对象。
注释 最好将 METADATA 标记写在 Global.asa 文件的开始位置。但是,无论是内部和外部 SCRIPT 标记,都可以出现在 Global.asa 文件中的任何位置。
通过将类型库的名称加在该常量的前面,可以避免对常量的不明确引用。例如,ADODB.adErrItemNotFound 会比 adErrItemNotFound 更明确。
如果使用 Microsoft Visual InterDev 创建 global.asa 文件,则 METADATA 标记将包含可选的 STARTSPAN 和 ENDSPAN 关 键字。而 IIS 则会忽略这两个关键字。
示例 下面示例中的 MyComponent 是用 Visual Basic 5.0 编写的。MyComponent 使用下列语句定义常量 MyError。
Public Const MyError = "You are not using MyComponent correctly."
类型库包含在 mycomponent.lib 中,该文件安装在下面的目录中。
C:\MyComponent
下面的 METADATA 标记包含在 MyApp 应用程序的 global.asa 文件中。该示例使用可选的 STARTSPAN 和 ENDSPAN 标记。而 IIS 则不需要这两个标记。
<!--METADATA TYPE="TypeLib" FILE="MyComponent.lib" -->
现在,MyApp 应用程序中的任何 ASP 都包含如下脚本:
<% Dim MyVar Set MyVar = Server.CreateObject("MyComponent.MyClass") Currentreturn = MyVar.MyMethod If Currentreturn = False Response.Write(MyError) End If %> |
|
SQL高手篇:精妙SQL语句介绍
|
SQL高手篇:精妙SQL语句介绍
说明:复制表(只复制结构,源表名:a 新表名:b)
SQL: select * into b from a where 1<>1
说明:拷贝表(拷贝数据,源表名:a 目标表名:b)
SQL: insert into b(a, b, c) select d,e,f from b;
说明:显示文章、提交人和最后回复时间
SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
说明:外连接查询(表名1:a 表名2:b)
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
说明:两张关联表,删除主表中已经在副表中没有的信息 SQL:
delete from info where not exists ( select * from infobz where info.infid=infobz.infid
说明:-- SQL:
SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1, (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, (SELECT NUM, UPD_DATE, STOCK_ONHAND FROM TABLE2 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(TO_DATE(TO_CHAR(SYSDATE, 'YYYY/MM') ¦¦ '/01','YYYY/MM/DD') - 1, 'YYYY/MM') Y, WHERE X.NUM = Y.NUM (+) AND X.INBOUND_QTY + NVL(Y.STOCK_ONHAND,0) <> X.STOCK_ONHAND B WHERE A.NUM = B.NUM
说明:-- SQL:
select * from studentinfo where not exists(select * from student where studentinfo.id=student.id) and 系名称='"&strdepartmentname&"' and 专业名称='"&strprofessionname&"' order by 性别,生源地,高考总成绩
说明: 从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源) SQL:
SELECT a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy') AS telyear, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '01', a.factration)) AS JAN, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '02', a.factration)) AS FRI, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '03', a.factration)) AS MAR, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '04', a.factration)) AS APR, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '05', a.factration)) AS MAY, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '06', a.factration)) AS JUE, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '07', a.factration)) AS JUL, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '08', a.factration)) AS AGU, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '09', a.factration)) AS SEP, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '10', a.factration)) AS OCT, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '11', a.factration)) AS NOV, SUM(decode(TO_CHAR(a.telfeedate, 'mm'), '12', a.factration)) AS DEC FROM (SELECT a.userper, a.tel, a.standfee, b.telfeedate, b.factration FROM TELFEESTAND a, TELFEE b WHERE a.tel = b.telfax) a GROUP BY a.userper, a.tel, a.standfee, TO_CHAR(a.telfeedate, 'yyyy')
说明:四表联查问题:
SQL: select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
说明:得到表中最小的未使用的ID号 SQL:
SELECT (CASE WHEN EXISTS(SELECT * FROM Handle b WHERE b.HandleID = 1) THEN MIN(HandleID) + 1 ELSE 1 END) as HandleID FROM Handle WHERE NOT HandleID IN (SELECT a.HandleID - 1 FROM Handle a)
来源:网人帝国 |
|
[sql学习] 多条件数据库查询的优化方法
|
多条件数据库查询的优化方法
在数据库编程中,管理人员需要经常从数据库中查询数据。当查询条件为确定时,我们可以明确用的SQL语句来实现,但是当查询条件为多个条件的动态组合时,查询语句会由于分支太多及IF语句的多重嵌套而变得相当复杂。在此,笔者提供了一种优化方法,运用本方法可以有效地减少查询语句的分支和数量以及IF条件语句的嵌套层数,从而提高程序的运行效率。
下面我们以一个简单的例子来说明,假设有一个名为employee的表,现在我们要从其中查询数据,条件有三个,由用户动态选择,如图1所示:
其中条件A、B、C之间是与的关系,A、B、C均为动态选择,可以取其中的一个、两个或三个,也可以一个都不选,当三个条件都不选择时则认为是无条件查询,按照通常的做法,判断方法如图2所示:
这样,最终的结果有8个,即有8条查询语句,分别是
1.select * from employee;
2.select * from employee where Age =C ;
3.select * from employee where Sex=B;
4.select * from employee where Sex=B and Age=C;
5.select * from employee where Name=A;
6.select * from employee where Name=A and Age=C;
7.select * from employee where Name=A and Sex=B ;
8.select * from employee where Name=A and Sex=B and Age=C;
显然这是比较烦琐的,而且用到了多重嵌套IF语句,因而在条件增多时,其复杂程度将大大增加。我们对它进行优化,方法如下:
首先定义一个字符串Str_Result用来存放组合条件的结果,开始时为空。
用程序语言描述如下:
if A <> "" then Str_Result="where Name =A" end if if B <> "" then if Str_Result="" then Str_Result="where Sex=B" else Str_Result=Str_Result+"and Sex = B" end if end if if C <> "" then if Str_Result="" then Str_Result="where Age =C" else Str_Result=Str_Result+"and Age=C" end if end if 最终的结果查询语句为:select * from employee + Str_Result。
显然,这种方法减少了组合的分支和if语句的多重嵌套,从而提高了程序的效率。
本方法的原理在于定义了一个单独的字符串来表示组合的结果,当该字符串经过条件A后其值为A的条件,经过条件B后其值则为条件A与B 组合的结果,而当经过条件C后其值则变成条件A、B、C的组合,从而减少了组合判断的分支,对于更多条件的组合,其效能将更加明显。
|
|
ASP中取得图片宽度和高度的类(无组件)
|
<% Class ImgWHInfo '获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP Dim ASO Private Sub Class_Initialize Set ASO=Server.CreateObject("ADODB.Stream") ASO.Mode=3 ASO.Type=1 ASO.Open End Sub Private Sub Class_Terminate Err.Clear Set ASO=Nothing End Sub Private Function Bin2Str(Bin) Dim I, Str For I=1 To LenB(Bin) clow=MidB(Bin,I,1) If ASCB(clow)<128 Then Str = Str & Chr(ASCB(clow)) Else I=I+1 If I <= LenB(Bin) Then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow)) End If Next Bin2Str = Str End Function Private Function Num2Str(Num,Base,Lens) Dim Ret Ret = "" While(Num>=Base) Ret = (Num Mod Base) & Ret Num = (Num - Num Mod Base)/Base Wend Num2Str = Right(String(Lens,"0") & Num & Ret,Lens) End Function Private Function Str2Num(Str,Base) Dim Ret,I Ret = 0 For I=1 To Len(Str) Ret = Ret *base + Cint(Mid(Str,I,1)) Next Str2Num=Ret End Function Private Function BinVal(Bin) Dim Ret,I Ret = 0 For I = LenB(Bin) To 1 Step -1 Ret = Ret *256 + AscB(MidB(Bin,I,1)) Next BinVal=Ret End Function Private Function BinVal2(Bin) Dim Ret,I Ret = 0 For I = 1 To LenB(Bin) Ret = Ret *256 + AscB(MidB(Bin,I,1)) Next BinVal2=Ret End Function Private Function GetImageSize(filespec) Dim bFlag Dim Ret(3) ASO.LoadFromFile(filespec) bFlag=ASO.Read(3) Select Case Hex(binVal(bFlag)) Case "4E5089": ASO.Read(15) ret(0)="PNG" ret(1)=BinVal2(ASO.Read(2)) ASO.Read(2) ret(2)=BinVal2(ASO.Read(2)) Case "464947": ASO.read(3) ret(0)="gif" ret(1)=BinVal(ASO.Read(2)) ret(2)=BinVal(ASO.Read(2)) Case "535746": ASO.read(5) binData=ASO.Read(1) sConv=Num2Str(ascb(binData),2 ,8) nBits=Str2Num(left(sConv,5),2) sConv=mid(sConv,6) While(len(sConv)<nBits*4) binData=ASO.Read(1) sConv=sConv&Num2Str(AscB(binData),2 ,8) Wend ret(0)="SWF" ret(1)=Int(Abs(Str2Num(Mid(sConv,1*nBits+1,nBits),2)-Str2Num(Mid(sConv,0*nBits+1,nBits),2))/20) ret(2)=Int(Abs(Str2Num(Mid(sConv,3*nBits+1,nBits),2)-Str2Num(Mid(sConv,2*nBits+1,nBits),2))/20) Case "FFD8FF": Do Do: p1=binVal(ASO.Read(1)): Loop While p1=255 And Not ASO.EOS If p1>191 And p1<196 Then Exit Do Else ASO.read(binval2(ASO.Read(2))-2) Do:p1=binVal(ASO.Read(1)):Loop While p1<255 And Not ASO.EOS Loop While True ASO.Read(3) ret(0)="JPG" ret(2)=binval2(ASO.Read(2)) ret(1)=binval2(ASO.Read(2)) Case Else: If left(Bin2Str(bFlag),2)="BM" Then ASO.Read(15) ret(0)="BMP" ret(1)=binval(ASO.Read(4)) ret(2)=binval(ASO.Read(4)) Else ret(0)="" End If End Select ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &"""" getimagesize=ret End Function Public Function imgW(IMGPath) Dim FSO,IMGFile,FileExt,Arr Set FSO = Server.CreateObject("Scripting.FileSystemObject") If (FSO.FileExists(IMGPath)) Then Set IMGFile = FSO.GetFile(IMGPath) FileExt=FSO.GetExtensionName(IMGPath) Select Case FileExt Case "gif","bmp","jpg","png": Arr=GetImageSize(IMGFile.Path) imgW = Arr(1) End Select Set IMGFile=Nothing Else imgW = 0 End If Set FSO=Nothing End Function Public Function imgH(IMGPath) Dim FSO,IMGFile,FileExt,Arr Set FSO = server.CreateObject("Scripting.FileSystemObject") If (FSO.FileExists(IMGPath)) Then Set IMGFile = FSO.GetFile(IMGPath) FileExt=FSO.GetExtensionName(IMGPath) Select Case FileExt Case "gif","bmp","jpg","png": Arr=getImageSize(IMGFile.Path) imgH = Arr(2) End Select Set IMGFile=Nothing Else imgH = 0 End If Set FSO=Nothing End Function End Class
IMGPath="Test.jpg"
Set PP = New ImgWHInfo W = PP.imgW(Server.Mappath(IMGPath)) H = PP.imgH(Server.Mappath(IMGPath)) Set pp = Nothing Response.Write("<img src='"&IMGPath&"' border=0><br>宽:"&W&";高:"&H) %>
|
|
ASP操作Excel技术总结
|
目录 一、 环境配置 二、 ASP对Excel的基本操作 三、 ASP操作Excel生成数据表 四、 ASP操作Excel生成Chart图 五、 服务器端Excel文件浏览、下载、删除方案 六、 附录
正文 一、 环境配置 服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即: 1.Win9x+PWS+Office 2.Win2000 Professional+PWS+Office 3.Win2000 Server+IIS+Office 目前笔者测试成功的环境是后二者。Office的版本没有特殊要求,考虑到客户机配置的不确定性和下兼容特性,建议服务器端Office版本不要太高,以防止客户机下载后无法正确显示。 服务器端环境配置还有两个偶然的发现是: 1. 笔者开发机器上原来装有金山的WPS2002,结果Excel对象创建始终出现问题,卸载WPS2002后,错误消失。 2. 笔者开发ASP代码喜欢用FrontPage,结果发现如果FrontPage打开(服务器端),对象创建出现不稳定现象,时而成功时而不成功。扩展考察后发现,Office系列的软件如果在服务器端运行,则Excel对象的创建很难成功。 服务器端还必须要设置的一点是COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择Microsoft Excel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限。保存完毕后重新启动服务器。 客户端的环境配置没发现什么特别讲究的地方,只要装有Office和IE即可,版本通用的好象都可以。
二、 ASP对Excel的基本操作 1、 建立Excel对象 set objExcelApp = CreateObject("Excel.Application") objExcelApp.DisplayAlerts = false 不显示警告 objExcelApp.Application.Visible = false 不显示界面 2、 新建Excel文件 objExcelApp.WorkBooks.add set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 3、 读取已有Excel文件 strAddr = Server.MapPath(".") objExcelApp.WorkBooks.Open(strAddr & "\Templet\Table.xls") set objExcelBook = objExcelApp.ActiveWorkBook set objExcelSheets = objExcelBook.Worksheets set objExcelSheet = objExcelBook.Sheets(1) 4、 另存Excel文件 objExcelBook.SaveAs strAddr & "\Temp\Table.xls" 5、 保存Excel文件 objExcelBook.Save (笔者测试时保存成功,页面报错。) 6、 退出Excel操作 objExcelApp.Quit 一定要退出 set objExcelApp = Nothing
三、 ASP操作Excel生成数据表 1、 在一个范围内插入数据 objExcelSheet.Range("B3:k3").Value = Array("67", "87", "5", "9", "7", "45", "45", "54", "54", "10") 2、 在一个单元格内插入数据 objExcelSheet.Cells(3,1).Value="Internet Explorer" 3、 选中一个范围 4、 单元格左边画粗线条 5、 单元格右边画粗线条 6、 单元格上边画粗线条 7、 单元格下边画粗线条 8、 单元格设定背景色 9、 合并单元格 10、 插入行 11、 插入列
四、 ASP操作Excel生成Chart图 1、 创建Chart图 objExcelApp.Charts.Add 2、 设定Chart图种类 objExcelApp.ActiveChart.ChartType = 97 注:二维折线图,4;二维饼图,5;二维柱形图,51 3、 设定Chart图标题 objExcelApp.ActiveChart.HasTitle = True objExcelApp.ActiveChart.ChartTitle.Text = "A test Chart" 4、 通过表格数据设定图形 objExcelApp.ActiveChart.SetSourceData objExcelSheet.Range("A1:k5"),1 5、 直接设定图形数据(推荐) objExcelApp.ActiveChart.SeriesCollection.NewSeries objExcelApp.ActiveChart.SeriesCollection(1).Name = "=""333""" objExcelApp.ActiveChart.SeriesCollection(1).Values = "=" 6、 绑定Chart图 objExcelApp.ActiveChart.Location 1 7、 显示数据表 objExcelApp.ActiveChart.HasDataTable = True 8、 显示图例 objExcelApp.ActiveChart.DataTable.ShowLegendKey = True
五、 服务器端Excel文件浏览、下载、删除方案 浏览的解决方法很多,“Location.href=”,“Navigate”,“Response.Redirect”都可以实现,建议用客户端的方法,原因是给服务器更多的时间生成Excel文件。 下载的实现要麻烦一些。用网上现成的服务器端下载组件或自己定制开发一个组件是比较好的方案。另外一种方法是在客户端操作Excel组件,由客户端操作服务器端Excel文件另存至客户端。这种方法要求客户端开放不安全ActiveX控件的操作权限,考虑到通知每个客户将服务器设置为可信站点的麻烦程度建议还是用第一个方法比较省事。 删除方案由三部分组成: A: 同一用户生成的Excel文件用同一个文件名,文件名可用用户ID号或SessionID号等可确信不重复字符串组成。这样新文件生成时自动覆盖上一文件。 B: 在Global.asa文件中设置Session_onEnd事件激发时,删除这个用户的Excel暂存文件。 C: 在Global.asa文件中设置Application_onStart事件激发时,删除暂存目录下的所有文件。 注:建议目录结构 \Src 代码目录 \Templet 模板目录 \Temp 暂存目录
六、 附录 出错时Excel出现的死进程出现是一件很头疼的事情。在每个文件前加上“On Error Resume Next”将有助于改善这种情况,因为它会不管文件是否产生错误都坚持执行到“Application.Quit”,保证每次程序执行完不留下死进程。 |
|
编写通用的asp防注入程序
|
sql注入被那些菜鸟级别的所谓黑客高手玩出了滋味,,发现现在大部分黑客入侵都是基于sql注入实现的 ,哎,,谁让这个入门容易呢,好了,,不说废话了,,现在我开始说如果编写通用的sql防注入程序 一般的http请求不外乎 get 和 post,所以只要我们在文件中过滤所有post或者get请求中的参数信息中 非法字符即可,所以我们实现http 请求信息过滤就可以判断是是否受到sql注入攻击。 iis传递给asp.dll的get 请求是是以字符串的形式,,当 传递给Request.QueryString数据后,, asp解析器会分析Request.QueryString的信息,,然后根据"&",分出各个数组内的数据 所以get的拦截如下 首先我们定义请求中不能包含如下字符 '|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare 各个字符用"|"隔开,,然后我们判断的得到的Request.QueryString 具体代码如下 dim sql_injdata SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare" SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then For Each SQL_Get In Request.QueryString For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then Response.Write "<Script Language=****>alert('天下电影联盟SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!');history.back(-1)</Script>" Response.end end if next Next End If 这样我们就实现了get请求的注入的拦截,但是我们还要过滤post请求,所以我们还得继续考虑request.form,这个也是以数组形式存在的,,我们只需要再进一次循环判断即可。代码如下 If Request.Form<>"" Then For Each Sql_Post In Request.Form For SQL_Data=0 To Ubound(SQL_inj) if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then Response.Write "<Script Language=****>alert('天下电影联盟SQL通用防注入系统提示↓nn请不要在参数中包含非法字符尝试注入!nnHTTP://www.521movie.com ');history.back(-1)</Script>" Response.end end if next next end if 好了大功告成,,我们已经实现了get和post请求的信息拦截,,你只需要在conn.asp之类的打开数据库文件之前引用这个页面即可。放心的继续开发你的程序,,不用再考虑是否还会受到sql注入攻击。难道不是么? |
|
XML与ASP简单结合实现HTML模板功能
|
本文利用的是XML的DSO数据绑定功能来实现ASP代码和HTML代码的分离,从而实现快速更换HTML模板的功能,由于本人只是刚刚开始接触XML,有许多不太了解的,在这里仅仅是提出一点想法,如果本文有错漏的地方请大家指多.
目前快速更换模板功能基本上是处于replace替换模板中的特殊标签后再显示出来,这样加大了许多ASP的处理时间,而且模板文件过长的话,加载到内存里进行处理时也是对服务器内存的一种考验.而XML中提供了一种DSO数据绑定功能.可以将标识替换操作交付给客户端.由于为了简化HTML模板的制作要求.所以,尽量简化HTML模板的XML技术含量是有必要的.
简单来说这个方式只是使用datasrc和dataFLd这两个HTML标签的属性实现的.废话就不多说了,一切实例说话.以下两个例子将说明一切.
例一:单个数据显示 以下是用ASP生成的XML数据岛. <xml id="xmldata"> <xData> <name>coder</name> <webname>轻灵自由的珍珠</webname> <weburl>http://blog.csdn.net/oyiboy</weburl> </xData> </xml>
显示时的HTML原码: <table datasrc="#xmldata" border=1> <tr> <td colspan=2>我的简单介绍</td> </tr> <tr> <td>我的名称:</td> <td><span dataFLd="name"></span></td> </tr> <tr> <td>网站名称:</td> <td><span dataFLd="webname"></span></td> </tr> <tr> <td>网站地址:</td> <td><a dataFLd="weburl"><span dataFLd="weburl"></span></a></td> </tr> </table>
例二:多条数据显示 以下是用ASP生成的XML数据岛. <xml id="xmldataList"> <xData> <webList> <webname>轻灵自由的珍珠</webname> <weburl>http://blog.csdn.net/oyiboy</weburl> </webList> <webList> <webname>Estyle(靳田)之狂想手扎</webname> <weburl>http://blog.csdn.net/estyle</weburl> </webList> <webList> <webname>最爱白菜</webname> <weburl>http://blog.csdn.net/qunluo</weburl> </webList> </xData> </xml>
显示时的HTML原码: <table datasrc="#xmldataList" border=1> <thead> <tr> <td colspan=2>我关注的Csdn Blog列表</td> </tr> <tr> <td align="center">名称</td> <td align="center">地址</td> </tr> </thead> <tbody> <tr> <td><span dataFLd="webname"></span></td> <td><a dataFLd="weburl"><span dataFLd="weburl"></span></a></td> </tr> </tbody> </table>
(以上两个例子可以copy到一个文件内查看实际运行效果.) 注意例二HTML原码中的thead和tbody,在显示多条记录时会有用的,如果不明白他们有什么用的可以去掉它们后看看会有什么后果.
顺便说一句,图像和按键的数据绑定和超链接的绑定是差不多的,如:<img dataFLd="webimg">和<button dataFLd="buttonvalue"></button>
局限,就是要求浏览器必须支持XML,还有一个疑问
转自:http://goaler.xicp.net/ShowLog.asp?ID=485 |
|
ASP 类 Class入门
|
Class 声明
声明一个类的名字,就是定义一些变量,属性,方法来组成一个类
这是真的!!!?VBScript中能用类!?!?不知道能不能用于ASP!?这样的话,我就不是能写出像object一样的ASP程序?!说干就干!实践是检验真理的唯一标准,自个动手吧!
我们常常看到别的程序语言中中都有类的说明,PHP,VB,C++,这个在VBScript中的类的说明,我是第一次听到,我们的日常工作就是网站开发,在这个里面多多少少搞出点经验,像模像样也能自诩为"内行",所以我就来分享一下我所知道的这个新的东东。我们来看看下面的这个代码吧!(window2000+IIS5.0通过测试)
<% ''声明一个名为aspcn的类 Class aspcn Private aspcn ''初始化类 Private Sub Class_Initialize aspcn="Aspcn Is Good!<br>" End Sub ''定义一个函数 Public Function DoIt() DoIt=aspcn End Function ''定义一个方法 Public Sub QueryStr(stat) Response.write stat End Sub
End Class
Set Hi_aspcn=New aspcn ''定义一个名为Hi_aspcn的aspcn对象实例 response.write Hi_aspcn.DoIt varstr="Aspcn Is Cool!<br><font color=red>http://www.aspcn.com</font><br>WelCome!!!" Hi_aspcn.QueryStr varstr
%>
这是很简单的一个程序,我们在其中声明了一个名为aspcn的类,建立了一个DoIt函数,一个QueryStr方法,这个程序很简单相信大家能看懂,它的显示如下:
Aspcn Is Good! Aspcn Is Cool! http://www.aspcn.com WelCome!!!
可以把我们常用到的程序写成一个类,到时候就用<!--#include file="xxx.asp"-->来包含进来就行了,这给我们开发程序又提供了新的空间
转自:http://goaler.xicp.net/ShowLog.asp?ID=466 |
|
[ASP.net]Loading制作
|
方法很简单。把代码放上来大家看看! 打了包成了个控件。下载地址: http://upserver4.ys168.com/ys168up/D1/YY1.aspx?f=050P1D8E0E3E5D9D5G6ALI7A00A05AKA03D6A00A08A08I5F9G0E0D9E0D8D6E1A24E6E1D9E5D9C3
下面是源码:
===================================
using System;
namespace HDControl { /// <summary> /// Summary description for Loading. /// </summary> public class Loading { private System.Web.UI.Page Sender; private string strImagePath;
public object Page { get { return Sender; } set { Sender = (System.Web.UI.Page)value; } }
public string ImageMapth { get { return strImagePath; } set { strImagePath = value; } }
public Loading() { // }
public Loading( object sender ) { Page = sender; }
public Loading( object sender,string ImageMapth ) { Page = sender; this.strImagePath = ImageMapth; }
/// <summary> /// Load script to page /// </summary> public void Load() { if ( !this.Sender.IsClientScriptBlockRegistered( "startScript" ) ) { this.Sender.RegisterClientScriptBlock( "startScript",this.Start() ); this.Sender.RegisterStartupScript( "endScript",this.End() ); } }
/// <summary> /// Script start. /// </summary> /// <returns></returns> private string Start() { string strStyle = "BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none"; System.Text.StringBuilder strScript = new System.Text.StringBuilder(); strScript.Append( "<div id=\"loading\">" ); strScript.Append( "<table width=\"100%\" height=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\""+ strStyle + "\">" ); strScript.Append( "<tr style=\"" + strStyle + "\" ><td width=\"100%\" height=\"100%\" align=\"center\" valign=\"middle\" style=\"" + strStyle + "\">" ); strScript.Append( "<img src=\"" + this.ImageMapth + "\" border=\"0\">" ); strScript.Append( "</td></tr>" ); strScript.Append( "</table></div>" ); return strScript.ToString(); }
/// <summary> /// Script end. /// </summary> /// <returns></returns> private string End() { System.Text.StringBuilder strScript = new System.Text.StringBuilder(); strScript.Append( "<script language=\"javascript\">" ); strScript.Append( "window.document.getElementById(\"loading\").style.display = \"none\";" ); strScript.Append( "</script>" ); return strScript.ToString(); } } }
=========================
先在面页中
using HDControl;
调用方法(在Page_Load里):
LoadingControl.Loading objLoad = new LoadingControl.Loading( this,"Images/loading.gif" ); objLoad.Load();
或:
LoadingControl.Loading objLoad = new LoadingControl.Loading( ); objLoad.Page = this; objLoad.ImageMapth = "Images/loading.gif"; objLoad.Load(); |
|
关于最近研究XmlHttp的一些心得
|
最近研究了一下xmlhttp,还是很有意思的东东。我喜欢让它在IE6和firefox中都运行正常,后台用的是dom4j进行解析。
1.下载 http://webfx.eae.net/dhtml/xmlextras/xmlextras.zip 包,里面有个xmlextras.js,把它拿出来,我用来生成XmlHttp对象。 2.在xmlextras.js中加上以下代码: // check browsers var ua = navigator.userAgent; var opera = /opera [56789]|opera\/[56789]/i.test(ua); var ie = !opera && /msie [56789]/i.test(ua); // preventing opera to be identified as ie var mozilla = !opera && /mozilla\/[56789]/i.test(ua); // preventing opera to be identified as mz /* end browser checks */if(mozilla) { XMLDocument.prototype.selectSingleNode = function(tagname) { var result = this.evaluate(tagname, this, null, 0, null); return result.iterateNext(); } XMLDocument.prototype.selectNodes = function(tagname) { var result = this.evaluate(tagname, this, null, 0, null); var xns = new XMLNodes(result); return xns; } //定义一个新的类以兼容 IE 中 selectNodes() 的返回类型。 function XMLNodes(result) { this.length = 0; this.pointer = 0; this.array = new Array(); var i = 0; while((this.array[i]=result.iterateNext())!=null) i++; this.length = this.array.length; } XMLNodes.prototype.nextNode = function() { this.pointer++; return this.array[pointer-1]; } XMLNodes.prototype.reset = function() { this.pointer = 0; } } 让firefox支持和IE一样的一些接口。
3.XmlHttp返回之后,如果需要XmlHttp.responseXML对象,在firefox中一切正常,但是在ie6中就不常了, 所以需要,重新 new 一个 XmlDocument:
var doc = XmlDocument.create(); doc.loadXML(xmlHttp.responseText); 4.如果
|
|
JavaScript和ASP.NET的传值
|
JavaScript和ASP.NET的传值
作者:陈缘 联系:luandao2000@21cn.com 网页:http://blog.csdn.net/luandao2000
因项目需要,最近一段时间里对于js的开发有了一定的了解。在基于ASP.NET的开发中,经常性的需要JS脚本来增加一些客户端的控制,比如限制输入字符,日期控件等等。一般这样的控制基本上在客户端完成就比较好,无需回传到服务端。总结了最近的开发中使用的一些js的技巧,提供给大家
1、js脚本如何访问服务器控件的值 界面上有一个TextBox控件,ID为Name,js里可以采用如下脚本取Name的值 var myvalue=document.all('Name').value;
2、服务器控件如何取js中变量的值 目前未发现比较好的办法,我通常采用的方法是在界面上放一个隐藏的控件HtmlInputHidden,然后设置为以服务器控件运行,这样在js脚本中和ASP.NET代码里都可以访问到该控件的值 js中给服务器控件赋值: var bt=document.all('Name').value; bt.value='名称'; ASP.NET中使用Name.Value来访问。
3、如何遍历界面上所有TextBox元素 var inputList = document.body.getElementsByTagName("INPUT"); for(var i=0;i<inputList.length;i++) { if(inputList[i].disabled==false && (inputList[i].type=='text' || inputList[i].type=='password')) { inputList[i].value=""; } }
4、让dropdownlist选择到指定项 选择dropdownlist中值为“我得选择”得项 var handl=document.all('List1'); var my_value='我得选择'; for(var index=0;index<handle.options.length;index++) { if(handle.options[index].text==my_value) { handle.selectedIndex=index; } }
|
|
XML应用,你知道多少?
|
将改变我们生活的XML有关的这些应用,你知道多少?
1. XHTML XHTML 1.0 [W3C 推荐标准]基本上是对 HTML 4 的改写,使其成为结构良好的 XML。HTML 是一种 SGML 应用,当 XML 作为对 SGML 在 Web 应用上的简化和规范化开发出来的时候,HTML(本身是 Web 上的通用语言)就成为采用 XML 的首选目标。于是出现了 HTML 的一种变体,称为 XHTML。XHTML 研究的目标是一种更容易解析(因为 XML 的语法更加严格)的 HTML 语言。XHTML 很容易用现成的 XML 工具处理,力求更好地分离内容与表示。XHTML 是最古老的 XML 应用之一,有许多利益集团在不同的部分和版本中起过作用。我将尽力对其中的大部分加以概括。
与三种HTML 4 DTD——Strict、Transitional 和 Frameset 对应,XHTML 1.0 定义了不同的 DTD 和名称空间。Modularization of XHTML [W3C 推荐标准]提供了一个框架,把 XHTML 分解成单独的模块,作为不同的 DTD 定义。比如,用于定义列表的所有元素和属性组成一个模块,而和表示有关的元素类型则放在另一个模块中。这样,就可以通过增加、减少和修改通用的独立模块开发和重新定义 XHTML。沿着这条路线,第一步就是 XHTML Basic [W3C 推荐标准],它定义了任何作为 XHTML 的语言都必须具有的最小 XHTML 模块集。XHTML Basic 本身可以作为 Web 客户的内容语言,如移动电话、PDA、寻呼机和置顶盒。XHTML 1.1 [W3C 推荐标准]基本上就是使用模块框架分解的 XHTML 1.0 Strict DTD。
XHTML 2.0 [开发中]是对 XHTML 的重写,没有考虑与 HTML 的向后兼容。这种想法差不多就是为 Web 编写一种全新的内容语言,学习过去的经验而又不束缚于过去。其中大的变化有:
取消了 <br/>、 <img/> 以及其他认为过于面向表示的元素
取消 HTML 风格的表单,改为支持 XForm(本系列文章前已述及)
取消 HTML 风格的链接改为 HLink(本系列文章中前已述及)
用 XML Event 代替许多 JavaScript 驱动的动态任务
用 XFrame 代替 HTML 风格的框架
更重要的是,XHTML 2.0 做了许多扩展,增强了作者表达内容结构和含义的能力。打破向后兼容性引起了争议。一些评论者认为保持 (X)HTML 的名称只修改版本号会造成混乱。其他人则说这些修改非常必要,而 XHTML 实际上仍然是一种可扩展超本文标记语言,因此保留原来的名称非常合适。
XHTML 常常和其他嵌入格式一起使用,如 MathML、RDF、SVG、SMIL 和 VoiceXML(后面都将予以介绍)。这种混合文档称为多模的或者非单体的。W3C、ISO 以及其他组织正投入巨大的努力鼓励对这种文档的强力支持。
2. Docbook Docbook 原来是一种流行的 SGML 格式,用于编纂书籍和文档,尤其是带有较多技术特性的文档。后来增加了一个 XML 版本,DocBook XML V4.2 [OASIS 委员会规范]是最新的成果。Docbook 非常流行,得到了许多工具的支持,其中很多工具非常成熟。它作为避免混合表示问题与内容格式的一个范例而受人尊敬。最近,一些开发人员开始抱怨它从过去的版本继承了太多的负担,纷纷讨论(甚至包括它的主要开发者 Norm Walsh)为这种格式重新开发一种新的、不向后兼容的版本。
Text Encoding Initiative (TEI) 甚至比 Docbook 更古老,这种文档格式在某种程度上与 Docbook 的应用范围类似,区别在于它通常处理的是人文学科的文本而非技术文本。TEI 本身不是一种 SGML 或 XML 应用,而是一组用于构造语言(DTD)的指导原则。最常用的 TEI 变体是 TEI Lite [社区标准]。TEI 以其复杂性驰名,这在一定程度上限制了它被大量采用,但是它得到了很好的维护,并在一些社区中有狂热的用户。
3. XSL-FO Extensible Stylesheet Language Formatting Objects (XSL-FO) [W3C 推荐标准]是一种使用 XML 定义的表示语言。(注意,链接规范的标题是 "Extensible Stylesheet Language (XSL)",但内容事实上只包括 XSL 的格式化对象方面。)XSL-FO 是一种 XML 格式,可被任何用户代理用于按照开发人员给定的精确规范呈现内容。它的角色类似于 Web 用户界面中的 XHTML, 但是更加复杂,以便表达适用于打印形式的格式化细节。这些细节和级联样式表(CSS——本系列文章前已述及)中所规定的没有什么不同,但是在 XSL-FO 中,这些细节构成了这种标记语言本身的一个实例,而不是呈现单个标记的指令。
XSL-FO 常用作 XSLT(本系列文章前已述及)的输出格式。事实上,最初 XSLT 和 XSL-FO 是一个系统,称为 XSL,但是工作组明智地将这两个部分分成了两个不同的规范。有多种开放源代码的或者商业化的工具可以将 XSL-FO 转化成 TeX、Adobe 的 PDF 以及其他适于打印和排版的(非 XML)输出格式。这种应用模式使 XSL-FO 非常流行,但是 XSL-FO 一直希望成为 WYSIWYG 工具或者类似工具的原生呈现格式,它的这种应用也开始受到推动。XSL-FO 1.1 [开发中]是这种语言的升级,增加了注释、索引、书签之类的特性,并增强了图像的处理能力。
4. SVG Scalable Vector Graphics (SVG) 1.1 [W3C 推荐标准]是一种描述二维图像的语言。它主要是一种向量图形语言,尽管也支持一些光栅图形特性。SVG 的非凡雄心是提供一种实用的、灵活的、使用(以冗长闻名的)XML 表示的图像格式,而且在这点上做的很成功。SVG 的特性包括:嵌套转换、剪辑路径、alpha 蒙板、光栅过滤效果、模板对象,当然还有可扩展性。SVG 也支持动画、缩放和移动视图、各种图形原语、分组、脚本、超链接、结构化元数据、CSS、一种专用的 DOM 超集(DOM 和 CSS 前已述及),并且很容易嵌入其他 XML 文档。SVG 的一些设计决策经历了不很激烈的争论,其中包括向量路径在单个属性中使用空格分隔的数字列表表示,但是总体上 SVG 已经成为应用最广泛的并受到热烈欢迎的一种 XML 应用。该规范已经被翻译成了多种语言。
SVG 1.1 是对 SVG 1.0 [W3C 推荐标准]的更新,增加了一些新特性,也包括一些更正。最大的区别是 SVG 1.1 以类似 XHTML 1.1+ 的方式进行了模块化。这种模块化使得 SVG 能够扩展甚至精简,就像 Mobile SVG Profiles: SVG Tiny and SVG Basic [W3C 推荐标准]那样。后者定义了 SVG 模块的精简集,适用于移动电话和 PDA。SVG 1.2 [开发中]致力于增加许多新工具,使 SVG 不仅作为一种图像格式,而且成为具有广泛应用前景的平台。
5. VoiceXML Voice Extensible Markup Language (VoiceXML) Version 2.0 [开发中]是一种创建音频、语音和电话应用程序的语言。它包含的音频对话框具有以下特点:语音合成、数字音频、声音识别和电话音质拨号输入和话音输入录制。它寻求把基于 Web 的开发和内容传递的优势带入交互式语音响应应用程序中。VoiceXML 是 W3C Speech Interface Framework [开发中]的一部分,后者还包括其他的标准,由于这些标准与电话行业的界限非常模糊,这里就不讨论了。VoiceXML 2.0 标志着 VoiceXML 规范从 VoiceXML Forum 转向 W3C,前者仍然在努力改进这种技术。关于 VoiceXML 已经有了一些专利声明,其中一些意味着 VoiceXML 用户将面临版权和许可费的问题。
6. MathML Mathematical Markup Language (MathML) 2.0 [W3C 推荐标准]是一种 XML 语言,按照该规范的说法,其目的是“促进数学和科学内容在 Web 上,以及其他应用程序如计算机代数系统、打印排版及语音合成中的使用和重用。MathML 可用于对能够高质量显示的数学符号表示编码,也可用于为语义起着更重要作用的应用程序对数学内容编码,如科学软件或语音合成。”MathML 常用于在教育、科学论文、工业规范、规章内容等领域中表示等式、公式或者类似的信息。这个版本对 MathML 1.01 [W3C 推荐标准]增加了一些相对较新的特性。MathML 经常和 XHTML、SVG 以及其他应用一起使用。
7. Synchronized Multimedia Integration Language (SMIL) SMIL 2.0 [W3C 规范],按照 W3C 的说法,“支持简单地编辑交互式[音频/视频]演示文稿。SMIL 通常用于[‘丰富媒体’或多媒体]演示文稿,其中集成了流式音频和视频、图像、文本或者任何其他媒体类型。SMIL是一种简单易学的类 HTML 语言,许多 SMIL 演示文稿都是使用简单的[文本编辑器]编写的。”SMIL 是 W3C Synchronized Multimedia activity 的一个产品,已经升级到了 SMIL 1.0 [W3C 推荐标准],增加了和动画、元数据、内容控制、链接、定时与同步、事件处理、过渡效果等有关的特性。
8. RDF 差不多在 W3C 致力于以 XML 为代表的下一代标记技术的同时,它也开始了下一代 Web 资源形式化描述技术的研究。Resource Description Framework (RDF) [W3C 推荐标准]是一种模型,用于描述一组 Web 资源声明。这些声明被概念化为三元组,每一个都包含主语(一个 URI——本系列文章前已述及)、谓词(也是一个 URI)和对象(一个 URI 或字面数据值)。要理解这种声明的意义,可以想一想描述 Web 页面的 HTML meta 标签。如果套用在 RDF 上,主语就是 Web 页面本身的 URI,谓词是一个标准 URI 表示一般的描述,而对象就是描述的实际文本。通过大量使用 URI,RDF 希望尽量减少这些声明成分标识的歧义,从而更加形式化以便于机器处理。RDF 能否实现这一目标还存在争议,但是 RDF 以其非常活跃的社区和范围广泛的工具而知名。
RDF 是 W3C Semantic Web activity 的支柱;Semantic Web 是 Web 的一种视像,不仅仅是内容的表示,还包括内容的注释以帮助表达它的含义。比如,在 Semantic Web 中描述 Web 资源时,可以区分 "python"(一种蛇)和 "python"(一种计算机编程语言)这样的概念。RDF 标准化由大量规范组成,包括:
Resource Description Framework (RDF): Concepts and Abstract Syntax [W3C 推荐标准]提出了目标、核心概念、基本数据模型以及 RDF 的抽象语法。
RDF/XML Syntax Specification [W3C 推荐标准]定义了 RDF 的一种通用 XML 表示。许多观察者包括我自己,都抱怨 RDF/XML 语法可怜的标记设计。
RDF Vocabulary Description Language 1.0: RDF Schema [W3C 推荐标准]定义了一个 RDF 词汇表,可用于定义其他 RDF 词汇表。
RDF Semantics [W3C 推荐标准]不是供内心缺乏勇气的人看的,它探讨了 RDF 数据模型底层的形式数学理论。
Web Ontology Language (OWL) [W3C 推荐标准]是 RDF 的一个应用,通常用 RDF/XML 编码,增加了丰富的词汇表可用于对 RDF 资源进行正式分类和归纳。
9. XML Topic Maps Topic Maps [ISO 国际标准,编号 13250]提供了组织信息的一个系统,在某些方面是与 RDF 竞争的一种 Semantic Web 技术。具体而言,XML Topic Maps [ISO 13250 的一部分]是 Topic Maps 一种 Web 友好的版本,使用 XML 语法,并以 URI 作为标识符。与 RDF 相似,Topic Maps 定义了一种类似图的模型,但更细微的差别和这样一个事实有关,即 Topic Maps 的一个重要规定是实际概念与其计算机表示的区分。Topic Maps 的这种做法是 Semantic Web 的一种基本工具,还是增加了不必要的复杂性,在 Topic Maps 与 RDF 支持者之间的这种争论永远不会划上句号。XML Topic Maps 使用了一种非常清晰的 XML 语法,这种语法基于 XLink。
------------参考自IBM developworks |
|
ASP.NET网站建设之代码分离
|
ASP.NET网站建设之代码分离
刘峰 2005-1-20
在我们传统的网站建设中通常是先设计网站页面,再利用开发工具,在网站的框架内进行功能设计。这样的网站建设存在很多弊端,其中最突出的缺点是不利于小组共同开发,各环节之间依赖性太强。
在ASP.NET中我们可以利用后台编码,把HTML用户界面设计(颜色、美学等)与页面代码区分开来。这样就可以解决我们小组的并行开发问题。
其主题思想是:美工来进行网站页面的设计,程序员对网站要实现的功能分模块开发。待到页面和功能模块开发完毕后,我们只要在美工界面中对其HTML代码稍加修改,就可以完成对应的功能。
下面就用一个小例子来进行说明。
程序员完成的功能有如下模块:
1. 在左边的Column1处点击,中间的三个内容显示小组三条新闻
2. 在Column2处点击,中间的三个内容显示三个人员情况
3. 在Column3处点击,弹出一个窗口显示一张照片。
为了测试,我们可以将这三个功能分别交给两个程序员来做。
甲程序员:完成模块1和2
1. 甲可以先建立一个WebApplication,在界面上放入两个ImageButton:IBtnNews,IBtnMember和六个Label:Lb1Title,Lb1Detail, Lb2Title,Lb2Detail, Lb3Title,Lb3Detail。生成一个Web应用程序,点击IBNews,六个Label显示小组新闻,点击IBMember,六个Label显示小组三名成员。这样我们就为建立源文件创建好了条件。
2. 我们建立一个C#类文件CodeBehind.cs。
3. 由于我们是建立的Web程序,则需要在添加引用中,添加System.Web.dll应用。
4. 去掉构造函数,因为后台编码不需要创建类。
5. 让类从Page对象上继承功能,即
public class CodeBehind:System.Web.UI.Page
6. 将刚才生成的WebApplication中的相关代码复制进来,主要有两个部分:声明部分和方法部分,在这里把应用程序中的可访问级别protected,改为public,因为只有这样外部的代码才可以访问我们的方法和变量,要注意的是页面上所有与后台编码文件交户的控件都要有一个对应的本地变量。
7. 生成一个CodeBehind.cs。
至此,甲程序员的工作完成。乙程序员可以用同样的方式生成他的CodeBehind.cs文件。甲乙两位程序员进行代码合成,完成一个完整的CodeBehinde.cs;
代码如下:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace codetest
{
public class News:System.Web.UI.Page
{
public System.Web.UI.WebControls.Label Lb1Title;
public System.Web.UI.WebControls.Label Lb1Detail;
public System.Web.UI.WebControls.Label Lb2Title;
public System.Web.UI.WebControls.Label Lb2Detail;
public System.Web.UI.WebControls.Label Lb3Title;
public System.Web.UI.WebControls.Label Lb3Detail;
public System.Web.UI.WebControls.ImageButton IBtnNews;
public System.Web.UI.WebControls.ImageButton IIBtnMember;
public System.Web.UI.WebControls.ImageButton IBtnContact;
public void IBtnNews_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
…………………………
}
public void IIBtnMember_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
…………………………
}
public void IBtnContact_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
string strScript="<script language=javascript>\n";
strScript+="window.alert("+"\"电话:66763467\""+");";
strScript+="</script>";
Response.Write(strScript);
}
}
}
下面我们来说明如何将建好的后台代码和美工好的网页结合起来。
1.集成工程师生成一个新的WebApplication,将CodeBehind.cs文件保存在bin目录下,并将其加入引用。
2.集成工程师将美工好的网页的图片加入对应的引用,复制HTML代码,放入新的WebApplication的页面中,这样,我们就可以看到美工好的页面展现在我们的.aspx文件中。
3.更改页面最上面的黄色代码,其中Codebehind="CodeBehind.cs":让页面后台支持的代码指向我们写好的cs文件。Inherits="codetest.CodeBehind":让页面继承于类CodeBehind中的功能,codetest为我们定义的名词空间。
4.在HTML代码中<body>内填入< form id="Form1" method="post" runat="server">在</body>上面加上</form>。
5.相对应的地方拖入Web控件,注意这里的ID要与cs文件中的定义对应。
6.在HTML代码中,找到Web控件,添加对应的方法名称。
这样就结合完毕。运行看看效果如何。
大家看上面在改动HTML代码的时候稍显麻烦,我们还有一种更简单的方法,只要在后台文件中加入几行代码,我们就不必在HTML中找到控件的位置,加入事件引用了。
在后台文件中加入
protected override void OnInit(EventArgs e)
//此方法引发Init事件,当服务器控件初始化是发生。
{
初始化控件方法()
base.OnInit(e);
}
private void初始化控件方法();
{
this.控件名.Click+=new EventHandler(控件事件响应方法);
}
上面两个方法的加入,我们可以看到,只要我们在后台代码中加入初始化控件的方法,就可以将对应的事件加入进去,而不用在HTML代码中加入事件引用了。同样,我们将常用的Page_Load事件也可以实现
只要加入:
Private void Page_Load(object sender,System.EventArgs e)
{
代码;
}
private void初始化控件方法();
{
this.控件名.Click+=new System.EventHandler(控件事件响应方法);
this.Load+=new System.EventHandler(this.Page_Load);
}
EventHandler:是表示将处理不包含事件数据的事件的方法。
控件事件响应方法只要符合:方法名(object sender,System.EventArgs e)就可以。
目前存在的问题:
1. 如何保持美工所作的效果不因使用了Web控件而受影响。
2. 多人在做同一个网页的时候,只能通过合并cs文件的方法来集成后台代码。不利于代码的维护。
|
|
[C#]结束Excel的进程的方法
|
在论坛中经常看到问如何结束Excel进程的帖子,很多人给出 的方法是先得到系统进程列表,然后和“Excel”匹配,是Excel 的进程就杀死,我个人认为这个方法是不可行的,如果软件用这种方法 杀死自己启动的进程,应该算是Bug(有可能将用户Excel进程杀掉)。 我在网上找到了另一种杀死Excel 进程的方法,如下: System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); ... System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp); System.Runtime.InteropServices.Marshal.ReleaseComObject(range); worksheets=null; worksheet=null; ... excelApp=null; range=null;
把操作Excel文件用到的对象实例全部释放。
然后资源回收! GC.Collect();
以上的代码最好能放在finally中,防止操作Excel文件时发生异常而执行不到!
在打开任务管理器看看,excel进程是不是已经不在了!
|
|
面试技巧:16个经典面试问题回答思路
|
面试技巧:16个经典面试问题回答思路 问题一:“请你自我介绍一下” 思路: 1、这是面试的必考题目。 2、介绍内容要与个人简历相一致。 3、表述方式上尽量口语化。 4、要切中要害,不谈无关、无用的内容。 5、条理要清晰,层次要分明。6、事先最好以文字的形式写好背熟。 问题二:“谈谈你的家庭情况” 思路:1、 况对于了解应聘者的性格、观念、心态等有一定的作用,这是招聘单位问该问题的主要原因。 2、 简单地罗列家庭人口。 3、 宜强调温馨和睦的家庭氛围。 4、 宜强调父母对自己</FONT><A title=查看更多教育的内容教育的重视。 5、 宜强调各位家庭成员的良好状况。 6、 宜强调家庭成员对自己工作的支持。 7、 宜强调自己对家庭的责任感。 问题三:“你有什么业余爱好?” 思路: 1、 业余爱好能在一定程度上反映应聘者的性格、观念、心态,这是招聘单位问该问题的主要原因。 2、 最好不要说自己没有业余爱好。 3、 不要说自己有那些庸俗的、令人感觉不好的爱好。 4、 最好不要说自己仅限于读书、听音乐、上网,否则可能令面试官怀疑应聘者性格孤僻。 5、 最好能有一些户外的业余爱好来“点缀”你的形象。 问题四:“你最崇拜谁?” 思路: 1、 最崇拜的人能在一定程度上反映应聘者的性格、观念、心态,这是面试官问该问题的主要原因。 2、 不宜说自己谁都不崇拜。 3、 不宜说崇拜自己。 4、 不宜说崇拜一个虚幻的、或是不知名的人。 5、 不宜说崇拜一个明显具有负面形象的人。 6、 所崇拜的人人最好与自己所应聘的工作能“搭”上关系。 7、 最好说出自己所崇拜的人的哪些品质、哪些思想感染着自己、鼓舞着自己。 问题五:“你的座右铭是什么?” 思路: 1、座右铭能在一定程度上反映应聘者的性格、观念、心态,这是面试官问这个问题的主要原因。 2、不宜说那些医引起不好联想的座右铭。 3、不宜说那些太抽象的座右铭。 4、不宜说太长的座右铭。 5、座右铭最好能反映出自己某种优秀品质。 6、 参考答案——“只为成功找方法,不为失败找借口” 问题六:“谈谈你的缺点” 思路: 1、 不宜说自己没缺点。 2、 不宜把那些明显的优点说成缺点。 3、 不宜说出严重影响所应聘工作的缺点。 4、 不宜说出令人不放心、不舒服的缺点。 5、 可以说出一些对于所应聘工作“无关紧要”的缺点,甚至是一些表面上看是缺点,从工作的角度看却是优点的缺点。 问题七:“谈一谈你的一次失败经历” 思路: 1、 不宜说自己没有失败的经历。 2、 不宜把那些明显的成功说成是失败。 3、 不宜说出严重影响所应聘工作的失败经历, 4、 所谈经历的结果应是失败的。 5、 宜说明失败之前自己曾信心白倍、尽心尽力。 6、 说明仅仅是由于外在客观原因导致失败。 7、 失败后自己很快振作起来,以更加饱满的热情面对以后的工作。 问题八:“你为什么选择我们公司?” 思路: 1、 面试官试图从中了解你的动机、愿望以及对此项工作的态度。 2、 建议从行业、企业 <BR> 和岗位这三个角度来回答。 3、 参考答案——“我十分看好贵公司所在的行业,我认为贵公司十分重视人才,而且这项工作很适合我,相信自己一定能做好。” 问题九:“对这项工作,你有哪些可预见的困难?” 思路: 1、 不宜直接说出具体的困难,否则可能令对方怀疑应聘者不行。 2、 可以尝试迂回战术,说出应聘者对困难所持有的态度——“工作中出现一些困难是正常的,也是难免的,但是只要有坚忍不拔的毅力、良好的合作精神以及事前周密而充分的准备,任何困难都是可以克服的。” 问题十:“如果我录用你,你将怎样开展工作” 思路: 1、 如果应聘者对于应聘的职位缺乏足够的了解,最好不要直接说出自己开展工作的具体办法, 2、 可以尝试采用迂回 <BR> 战术来回答,如“首先听取领导的指示和要求,然后就有关情况进行了解和熟悉,接下来制定一份近期的工作计划并报领导批准,最后根据计划开展工作。” 问题十一:“与上级意见不一是,你将怎么办" 思路: 1、 一般可以这样回答“我会给上级以必要的解释和提醒,在这种情况下,我会服从上级的意见。” 2、 如果面试你的是总经理,而你所应聘的职位另有一位经理,且这位经理当时不在场,可以这样回答:“对于非原则性问题,我会服从上级的意见,对于涉及公司利益的重大问题,我希望能向更高层领导反映。” 问题十二:“我们为什么要录用你?” 思路: 1、 应聘者最好站在招聘单位的角度来回答。 2、 招聘单位一般会录用这样的应聘者:基本符合条件、对这份共组感兴趣、有足够的信心。 3、 如“我符合贵公司的招聘条件,凭我目前掌握的技能、高度的责任感和良好的饿适应能力及学习能力 ,完全能胜任这份工作。我十分希望能为贵 公司服务,如果贵公司给我这个机会,我一定能成为贵公司的栋梁!” 问题十三:“你能为我们做什么?” 思路: 1、 基本原则上“投其所好”。 2、 回答这个问题前应聘者最 <BR> 好能“先发制人”,了解招聘单位期待这个职位所能发挥的作用。 3、 应聘者可以根据自己的了解,结合自己在专业领域的优势来回答这个问题。 问题十四:“你是应届,缺乏经验,如何能胜任这项工作?” 思路: 1、 如果招聘单位对应届毕业生的应聘者提出这个问题,说明招聘单位并不真正在乎“经验”,关键看应聘者怎样回答。 2、 对这个问题的回答最好要体现出应聘者的诚恳、机智、果敢及敬业。 3、 如“作为应届毕业生,在工作经验方面的确会有所欠缺,因此在读书期间我一直利用各种机会在这个行业里做兼职。我也发现,实际工作远比书本知识丰富、复杂。但我有较强的责任心、适应能力和学习能力,而且比较勤奋,所以在兼职中均能圆满完成各项工作,从中获取的经验也令我受益非浅。请贵公司放心,学校所学及兼职的工作经验使我一定能胜任这个职位。” 问题十五:“你希望与什么样的上级共事?” 思路: 1、 通过应聘者对上级的“希望”可以判断出应聘者对自我要求的意识,这既上一个陷阱,又上一次机会。 2、 最好回避对上级具体的希望,多谈对自己的要求。 3、 如“做为刚步入社会新人,我应该多要求自己尽快熟悉环境、适应环境,而不应该对环境提出什么要求,只要能发挥我的专长就可以了。” 问题十六:“您在前一家公司的离职原因是什么?” 思路: 1、 最重要的是:应聘者要使找招聘单位相信,应聘者在过往的单位的“离职原因”在此家招聘单位里不存在。 2、 避免把“离职原因”说得太详细、太具体。 3、 不能掺杂主观的负面感受,如“太幸苦”、“人际关系复杂”、“管理太混乱”、“公司不重视人才”、“公司排斥我们某某的员工”等。 4、 但也不能躲闪、回避,如“想换换环境”、“个人原因”等。 5、 不能涉及自己负面的人格特征,如不诚实、懒惰、缺乏责任感、不随和等。 6、 尽量使解释的理由为应聘者个人形象添彩。 7、 如“我离职是因为这家公司倒闭。我在公司工作了三年多,有较深的感情。从去年始,由于市场形势突变,公司的局面急转直下。到眼下这一步我觉得很遗憾,但还要面对显示,重新寻找能发挥我能力的舞台。” 同一个面试问题并非只有一个答案,而同一个答案并不是在任何面试场合都有效,关键在于应聘者掌握了规律后,对面试的具体情况进行把握,有意识地揣摩面试官提出问题的心理背景,然后投其所好。 |
文章收藏 乱闪 发表于 2005/1/28 13:05:50 |
| |
提高flash程序效率得方法
|
随着Flash的ActionScript功能的不断强大,使用Flash制作应用程序也越来越多了,但让众多AS程序员最头疼的就是Flash的程序处理效率太低,就算现在flashplayer7虽然效率比flashplayer6提高了2~8倍,但还是低的要命,尤其是在手持设备中就更加严重了(在PPC上现在Flash2004的所有组件都没法使用,需要自行开发),这样就让很多as程序员不断的研究比较action中哪个方法效率更高,哪条指令更快.甚至有些人只用while循环而不用for循环(因为很多测试表明while循环比for循环要快一点),但这种做法实际上没快多少确让程序读/写起来都要麻烦许多,其实真正提高程序的效率,不是比较类似while for循环哪个更快,而是要找到程序效率低的瓶颈
一段程序的效率,最关键的看算法,就算用最快的计算机语言(比如用c),如果算法不好,大部分执行时间都是被浪费掉了,而不是充分利用起来,那程序一样会很慢,而如果算法得当,可能解决问题根本就不用很大量的计算,因此即使使用效率很低的action一样能很快的解决(虽然action很慢,但每秒一样能循环循环几十万次,同样能在很短的时间内完成很多事情,所谓慢是比较更快的程序语言来说的)
在这里咱们不谈算法,单独从FlashPlayer上说,怎么才能提高action的效率呢?要提高效率就要抓住根本,抓住Flash为什么运行的慢,action执行效率低,最根本的原因是action是解释性语言,每句代码都需要flashplayer去解释执行,这就是action执行效率低的根本原因,那如果去提高action的效率呢?去比较哪句action的效率更高吗,所有的action都是player去解析的,肯定相差不大,那怎么办呢?当然就是尽量少使用action进行处理
大家都知道FlashPlayer是用c语言来写的,那flash里面的所有内置函数肯定都是使用c语言实现的(虽然flash执行action的速度比较慢,但flash的内置函数确实非常快的,比如flash下Math下面的方法都是效率很高的),那我们如果能把我们原来用action来处理的方法改用flash内部方法来处理就肯定要快多了
那怎么才能使用内置方法代替action呢,这个要看个人水平跟对Action的熟悉程度了,下面介绍一个例子,来解释一下:
action程序员都知道action处理String的效率是非常低的,可是说低的可以,下面代码可以说明:
var str = "abcde"; var tmp = ""; var time1 = getTimer(); for(var i=0;i < 10000;i++){ tmp += str; } trace(getTimer() - time1);//1665
将10000个5个字母的字符串连接起来竟然需要1.5s以上的时间(cpu: pm1.4) 而改成10个字母就需要使用4s左右的时间,15个字母就需要5.5s左右的时间 随着字符串的变长,字符串处理的速度越来越低
那怎么能让字符串连接的更快呢?看一看下面这段代码:
time1 = getTimer(); var tmpA = new Array(); for(var i=0;i < 10000;i++){ tmpA[i] = str; } var tmp1 = tmpA.join(""); trace(getTimer() - time1); trace(tmp1 == tmp);
这段代码是接在上面的代码后面的,这里思路有所不同的是,在这里先把字符串一个一个的付给数组,然后利用数组的join方面一下子将整个数组转换为字符串,你也许会想,先付给数组,然后再有数组转换,肯定会更慢.但实际上不是这样的,因为赋值语句在as里面是很快的,所以将10000个字符串付给数组花不了多长时间,而最后调用的数组的方法是as内部函数,完全有c实现的,因此肯定要比as实现快很多倍,因此整体速度跟上面的代码就相差很多了,而且随字符串增长,效率也不会明显降低,下面是执行结果:
同样为10000个字符串连接,5个字符第二种方法只需要140ms,比直接连接字符串快10倍左右,而后面的比较输出true说明两个字符串是一样的 而且当字符串加置10个,15个甚至更多的时候,效率并没有降低,而仍然用时140ms左右,而当字符串长度达到40的时候,用时才超过了200ms
|
|
最全的HTML特殊字符列表
|
  Nonbreaking space ¡ ¡ ¡ Inverted exclamation ¢ ¢ ¢ Cent sign £ £ £ Pound sterling ¤ ¤ ¤ General currency sign ¥ ¥ ¥ Yen sign ¦ ¦ ¦ or &brkbar; Broken vertical bar § § § Section sign ¨ ¨ ¨ or ¨ Diæresis / Umlaut © © © Copyright ª ª ª Feminine ordinal « « « Left angle quote, guillemot left ¬ ¬ ¬ Not sign ­ ­ Soft hyphen ® ® ® Registered trademark ¯ ¯ ¯ or &hibar; Macron accent ° ° ° Degree sign ± ± ± Plus or minus ² ² ² Superscript two ³ ³ ³ Superscript three ´ ´ ´ Acute accent µ µ µ Micro sign ¶ ¶ ¶ Paragraph sign · · · Middle dot ¸ ¸ ¸ Cedilla ¹ ¹ ¹ Superscript one º º º Masculine ordinal » » » Right angle quote, guillemot right ¼ ¼ ¼ Fraction one-fourth ½ ½ ½ Fraction one-half ¾ ¾ ¾ Fraction three-fourths ¿ ¿ ¿ Inverted question mark À À À Capital A, grave accent Á Á Á Capital A, acute accent    Capital A, circumflex à à à Capital A, tilde Ä Ä Ä Capital A, diæresis / umlaut Å Å Å Capital A, ring Æ Æ Æ Capital AE ligature Ç Ç Ç Capital C, cedilla È È È Capital E, grave accent É É É Capital E, acute accent Ê Ê Ê Capital E, circumflex Ë Ë Ë Capital E, diæresis / umlaut Ì Ì Ì Capital I, grave accent Í Í Í Capital I, acute accent Î Î Î Capital I, circumflex Ï Ï Ï Capital I, diæresis / umlaut Ð Ð Ð Capital Eth, Icelandic Ñ Ñ Ñ Capital N, tilde Ò Ò Ò Capital O, grave accent Ó Ó Ó Capital O, acute accent Ô Ô Ô Capital O, circumflex Õ Õ Õ Capital O, tilde Ö Ö Ö Capital O, diæresis / umlaut × × × Multiply sign Ø Ø Ø Capital O, slash Ù Ù Ù Capital U, grave accent Ú Ú Ú Capital U, acute accent Û Û Û Capital U, circumflex Ü Ü Ü Capital U, diæresis / umlaut Ý Ý Ý Capital Y, acute accent Þ Þ Þ Capital Thorn, Icelandic ß ß ß Small sharp s, German sz à à à Small a, grave accent á á á Small a, acute accent â â â Small a, circumflex ã ã ã Small a, tilde ä ä ä Small a, diæresis / umlaut å å å Small a, ring æ æ æ Small ae ligature ç ç ç Small c, cedilla è è è Small e, grave accent é é é Small e, acute accent ê ê ê Small e, circumflex ë ë ë Small e, diæresis / umlaut ì ì ì Small i, grave accent í í í Small i, acute accent î î î Small i, circumflex ï ï ï Small i, diæresis / umlaut ð ð ð Small eth, Icelandic ñ ñ ñ Small n, tilde ò ò ò Small o, grave accent ó ó ó Small o, acute accent ô ô ô Small o, circumflex õ õ õ Small o, tilde ö ö ö Small o, diæresis / umlaut ÷ ÷ ÷ Division sign ø ø ø Small o, slash ù ù ù Small u, grave accent ú ú ú Small u, acute accent û û û Small u, circumflex ü ü ü Small u, diæresis / umlaut ý ý ý Small y, acute accent þ þ þ Small thorn, Icelandic ÿ ÿ ÿ Small y, diæresis / umlaut Latin Extended-B ? &fnof ƒ latin small f with hook, =function, =florin, U0192 ISOtech Greek Α &Alpha Α greek capital letter alpha, U0391 Β &Beta Β greek capital letter beta, U0392 Γ &Gamma Γ greek capital letter gamma, U0393 ISOgrk3 Δ &Delta Δ greek capital letter delta, U0394 ISOgrk3 Ε &Epsilon Ε greek capital letter epsilon, U0395 Ζ &Zeta Ζ greek capital letter zeta, U0396 Η &Eta Η greek capital letter eta, U0397 Θ &Theta Θ greek capital letter theta, U0398 ISOgrk3 Ι &Iota Ι greek capital letter iota, U0399 Κ &Kappa Κ greek capital letter kappa, U039A Λ &Lambda Λ greek capital letter lambda, U039B ISOgrk3 Μ &Mu Μ greek capital letter mu, U039C Ν &Nu Ν greek capital letter nu, U039D Ξ &Xi Ξ greek capital letter xi, U039E ISOgrk3 Ο &Omicron Ο greek capital letter omicron, U039F Π &Pi Π greek capital letter pi, U03A0 ISOgrk3 Ρ &Rho Ρ greek capital letter rho, U03A1 Σ &Sigma Σ greek capital letter sigma, U03A3 ISOgrk3 Τ &Tau Τ greek capital letter tau, U03A4 Υ &Upsilon Υ greek capital letter upsilon, U03A5 ISOgrk3 Φ &Phi Φ greek capital letter phi, U03A6 ISOgrk3 Χ &Chi Χ greek capital letter chi, U03A7 [Page]
Ψ &Psi Ψ greek capital letter psi, U03A8 ISOgrk3 Ω &Omega Ω greek capital letter omega, U03A9 ISOgrk3 a &alpha α greek small letter alpha, U03B1 ISOgrk3 b &beta β greek small letter beta, U03B2 ISOgrk3 g &gamma γ greek small letter gamma, U03B3 ISOgrk3 d &delta δ greek small letter delta, U03B4 ISOgrk3 ε &epsilon ε greek small letter epsilon, U03B5 ISOgrk3 ζ &zeta ζ greek small letter zeta, U03B6 ISOgrk3 η &eta η greek small letter eta, U03B7 ISOgrk3 θ &theta θ greek small letter theta, U03B8 ISOgrk3 ι &iota ι greek small letter iota, U03B9 ISOgrk3 κ &kappa κ greek small letter kappa, U03BA ISOgrk3 λ &lambda λ greek small letter lambda, U03BB ISOgrk3 μ &mu μ greek small letter mu, U03BC ISOgrk3 ν &nu ν greek small letter nu, U03BD ISOgrk3 ξ &xi ξ greek small letter xi, U03BE ISOgrk3 ο &omicron ο greek small letter omicron, U03BF NEW p &pi π greek small letter pi, U03C0 ISOgrk3 ρ &rho ρ greek small letter rho, U03C1 ISOgrk3 ? &sigmaf ς greek small letter final sigma, U03C2 ISOgrk3 σ &sigma σ greek small letter sigma, U03C3 ISOgrk3 τ &tau τ greek small letter tau, U03C4 ISOgrk3 υ &upsilon υ greek small letter upsilon, U03C5 ISOgrk3 φ &phi φ greek small letter phi, U03C6 ISOgrk3 χ &chi χ greek small letter chi, U03C7 ISOgrk3 ψ &psi ψ greek small letter psi, U03C8 ISOgrk3 ω &omega ω greek small letter omega, U03C9 ISOgrk3 ? &thetasym ϑ greek small letter theta symbol, U03D1 NEW ? &upsih ϒ greek upsilon with hook symbol, U03D2 NEW ? &piv ϖ greek pi symbol, U03D6 ISOgrk3 General Punctuation ? &bull • bullet, =black small circle, U2022 ISOpub … &hellip … horizontal ellipsis, =three dot leader, U2026 ISOpub ′ &prime ′ prime, =minutes, =feet, U2032 ISOtech ″ &Prime ″ double prime, =seconds, =inches, U2033 ISOtech  ̄ &oline ‾ overline, =spacing overscore, U203E NEW ? &frasl ⁄ fraction slash, U2044 NEW Letterlike Symbols ? &weierp ℘ script capital P, =power set, =Weierstrass p, U2118 ISOamso ? &image ℑ blackletter capital I, =imaginary part, U2111 ISOamso ? &real ℜ blackletter capital R, =real part symbol, U211C ISOamso ? &trade ™ trade mark sign, U2122 ISOnum ? &alefsym ℵ alef symbol, =first transfinite cardinal, U2135 NEW Arrows ← &larr ← leftward arrow, U2190 ISOnum ↑ &uarr ↑ upward arrow, U2191 ISOnum → &rarr → rightward arrow, U2192 ISOnum ↓ &darr ↓ downward arrow, U2193 ISOnum ? &harr ↔ left right arrow, U2194 ISOamsa ? &crarr ↵ downward arrow with corner leftward, =carriage return, U21B5 NEW ? &lArr ⇐ leftward double arrow, U21D0 ISOtech ? &uArr ⇑ upward double arrow, U21D1 ISOamsa ? &rArr ⇒ rightward double arrow, U21D2 ISOtech ? &dArr ⇓ downward double arrow, U21D3 ISOamsa ? &hArr ⇔ left right double arrow, U21D4 ISOamsa Mathematical Operators ? &forall ∀ for all, U2200 ISOtech ? &part ∂ partial differential, U2202 ISOtech ? &exist ∃ there exists, U2203 ISOtech ? &empty ∅ empty set, =null set, =diameter, U2205 ISOamso ? &nabla ∇ nabla, =backward difference, U2207 ISOtech ∈ &isin ∈ element of, U2208 ISOtech ? ¬in ∉ not an element of, U2209 ISOtech ? &ni ∋ contains as member, U220B ISOtech ∏ &prod ∏ n-ary product, =product sign, U220F ISOamsb ∑ &sum − n-ary sumation, U2211 ISOamsb ? &minus − minus sign, U2212 ISOtech ? &lowast ∗ asterisk operator, U2217 ISOtech √ &radic √ square root, =radical sign, U221A ISOtech ∝ &prop ∝ proportional to, U221D ISOtech ∞ &infin ∞ infinity, U221E ISOtech ∠ &ang ∠ angle, U2220 ISOamso ∧ &and ⊥ logical and, =wedge, U2227 ISOtech ∨ &or ⊦ logical or, =vee, U2228 ISOtech ∩ &cap ∩ intersection, =cap, U2229 ISOtech ∪ &cup ∪ union, =cup, U222A ISOtech ∫ &int ∫ integral, U222B ISOtech ∴ &there4 ∴ therefore, U2234 ISOtech ~ &sim ∼ tilde operator, =varies with, =similar to, U223C ISOtech ? &cong ≅ approximately equal to, U2245 ISOtech ≈ &asymp ≅ almost equal to, =asymptotic to, U2248 ISOamsr ≠ &ne ≠ not equal to, U2260 ISOtech ≡ &equiv ≡ identical to, U2261 ISOtech ≤ &le ≤ less-than or equal to, U2264 ISOtech ≥ &ge ≥ greater-than or equal to, U2265 ISOtech ? &sub ⊂ subset of, U2282 ISOtech ? &sup ⊃ superset of, U2283 ISOtech ? &nsub ⊄ not a subset of, U2284 ISOamsn ? &sube ⊆ subset of or equal to, U2286 ISOtech ? &supe ⊇ superset of or equal to, U2287 ISOtech ⊕ &oplus ⊕ circled plus, =direct sum, U2295 ISOamsb ? &otimes ⊗ circled times, =vector product, U2297 ISOamsb ⊥ &perp ⊥ up tack, =orthogonal to, =perpendicular, U22A5 ISOtech ? &sdot ⋅ dot operator, U22C5 ISOamsb Miscellaneous Technical ? &lceil ⌈ left ceiling, =apl upstile, U2308, ISOamsc ? &rceil ⌉ right ceiling, U2309, ISOamsc ? &lfloor ⌊ left floor, =apl downstile, U230A, ISOamsc ? &rfloor ⌋ right floor, U230B, ISOamsc ? &lang 〈 left-pointing angle bracket, =bra, U2329 ISOtech ? &rang 〉 right-pointing angle bracket, =ket, U232A ISOtech Geometric Shapes ? &loz ◊ lozenge, U25CA ISOpub Miscellaneous Symbols ? &spades ♠ black spade suit, U2660 ISOpub ? &clubs ♣ black club suit, =shamrock, U2663 ISOpub ? &hearts ♥ black heart suit, =valentine, U2665 ISOpub ? &diams ♦ black diamond suit, U2666 ISOpub Using NE NE NCR Using NCR C0 Controls and Basic Latin " " " quotation mark, =apl quote, U0022 ISOnum & & & ampersand, U0026 ISOnum < < < less-than sign, U003C ISOnum > > > greater-than sign, U003E ISOnum Latin Extended-A ? &OElig Œ latin capital ligature oe, U0152 ISOlat2 ? &oelig œ latin small ligature oe, U0153 ISOlat2 ? &Scaron Š latin capital letter s with caron, U0160 ISOlat2 ? &scaron š latin small letter s with caron, U0161 ISOlat2 ? &Yuml Ÿ latin capital letter y with diaeresis, U0178 ISOlat2 Spacing Modifier Letters ? &circ ˆ modifier letter circumflex accent, U02C6 ISOpub ? &tilde ˜ small tilde, U02DC ISOdia General Punctuation ? &ensp   en space, U2002 ISOpub ? &emsp   em space, U2003 ISOpub ? &thinsp   thin space, U2009 ISOpub ? &zwnj ‌ zero width non-joiner, U200C NEW RFC 2070 ? &zwj ‍ zero width joiner, U200D NEW RFC 2070 ? &lrm ‎ left-to-right mark, U200E NEW RFC 2070 ? &rlm ‏ right-to-left mark, U200F NEW RFC 2070 – &ndash – en dash, U2013 ISOpub — &mdash — em dash, U2014 ISOpub ‘ &lsquo ‘ left single quotation mark, U2018 ISOnum ’ &rsquo ’ right single quotation mark, U2019 ISOnum ? &sbquo ‚ single low-9 quotation mark, U201A NEW “ &ldquo “ left double quotation mark, U201C ISOnum ” &rdquo ” right double quotation mark, U201D ISOnum ? &bdquo „ double low-9 quotation mark, U201E NEW ? &dagger † dagger, U2020 ISOpub ? &Dagger ‡ double dagger, U2021 ISOpub ‰ &permil ‰ per mille sign, U2030 ISOtech ? &lsaquo ‹ single left-pointing angle quotation mark, U2039 ISO proposed ? &rsaquo › single right-pointing angle quotation mark, U203A ISO proposed |
|
用Asp+XmlHttp实现RssReader功能
|
演示:http://goaler.xicp.net/RssReader.asp
<style> body {margin:10px;background-color:#ffffff;margin-top:6px;} form{margin:0px;} * {font:12px tahoma;line-height:140%;color:#000000} .title {font-weight:bold;color:red;} .time {font:10px;color:#999999;} a {text-decoration:none;color:blue;} </style> <script type="text/javascript"> var switcher=0; </script> <body ondblclick="if(switcher==0){document.styleSheets[0].addRule('div','display:none');switcher=1}else{document.styleSheets[0].addRule('div','display:block');switcher=0}"> <form name="rssform" method=post action=""> RSS资源:<INPUT TYPE="text" NAME="RssFeed" size=60 style="height:22px" value="<%=request("RssFeed")%>" onfocus=select()> <input type="submit" value="Read It"> 双击鼠标可以关闭摘要,只显示标题 </form> <hr/> <% If(request("RssFeed")="") Then url="/rss2.asp" else url=request("RssFeed") End If
Set xml = Server.CreateObject("Microsoft.XMLHTTP") xml.Open "GET", url, False xml.Send
Set xmlDom = server.createObject("microsoft.xmldom") xmlDom.async=False xmlDom.ValidateOnParse=false xmlDom.load(xml.responseXML)
if xmlDom.ReadyState>2 Then
set oItem=xmlDom.getElementsByTagName("item")
for i=0 to oItem.length-1 response.write "<span style='font:bold 9px verdana;color:#000000'>"&i+1&"</span>. <a class='title' href='"&oItem(i).childNodes(1).text&"' target='_blank'>"&oItem(i).childNodes(0).text&"</a> <span class='time'>["&oItem(i).childNodes(3).text&"]<br />" response.write "<div>摘要:"&oItem(i).childNodes(4).text&"</div><br>" next end if %> 转自: http://goaler.xicp.net/ShowLog.asp?ID=513 |
|
|