<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title>一米阳光</title><link>http://www.51yc.cn/</link><description>柳絮的个人技术Blog～这里是我个人Web开发过程中的一些心得和技术要点,欢迎加入讨论学习,共同进步！</description><pubDate>Thu, 23 Feb 2012 00:00:00 GMT</pubDate><item><title><![CDATA[细说HttpHandler 的映射过程]]></title><pubDate>Wed, 01 Feb 2012 15:37:03 GMT</pubDate><category>.net技术</category><link>http://www.51yc.cn/html/2012/02/201202011537038611.htm</link><description><![CDATA[<p>详见： <a target="_blank" href="http://www.cnblogs.com/fish-li/archive/2012/01/29/2331477.html">www.cnblogs.com/fish-li/archive/2012/01/29/2331477.html</a></p>]]></description></item><item><title><![CDATA[QV中对历史日库存的补充处理方式！]]></title><pubDate>Sun, 27 Nov 2011 21:13:23 GMT</pubDate><category>QlikView点滴</category><link>http://www.51yc.cn/html/2011/11/201111272113239427.htm</link><description><![CDATA[<p>历史日库存的处理，废话不多说了，这里提供的是一个思路！</p>
<p>[code]SET ThousandSep=','; <br />
SET DecimalSep='.'; <br />
SET MoneyThousandSep=','; <br />
SET MoneyDecimalSep='.'; <br />
SET MoneyFormat='￥#,##0.00;￥-#,##0.00'; <br />
SET TimeFormat='h:mm:ss'; <br />
SET DateFormat='YYYY/M/D'; <br />
SET TimestampFormat='YYYY/M/D h:mm:ss[.fff]'; <br />
SET MonthNames='一月;二月;三月;四月;五月;六月;七月;八月;九月;十月;十一月;十二月'; <br />
SET DayNames='周一;周二;周三;周四;周五;周六;周日'; <br />
<br />
Directory; <br />
<br />
//CONNECT TO [Provider=SQLNCLI.1;Persist Security Info=True;User ID=sa;Initial Catalog=Emax;Data Source=192.105.179.3;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=BISERVER;Use Encryption for Data=False;Tag with column collation when possible=False;MARS Connection=False;DataTypeCompatibility=0;Trust Server Certificate=False] (XPassword is ESUNCVJNMTaUGWRX); <br />
<br />
//OLEDB CONNECT TO [Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=Emax;Data Source=192.105.179.3;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=BISERVER;Use Encryption for Data=False;Tag with column collation when possible=False] (XPassword is WQPIOVJNMTaUGWBX); <br />
<br />
CONNECT TO [Provider=SQLOLEDB.1;Password=jjljjl;Persist Security Info=True;User ID=sa;Initial Catalog=Emax;Data Source=192.105.179.3;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=BISERVER;Use Encryption for Data=False;Tag with column collation when possible=False](MODE IS WRITE); <br />
<br />
LET i=0; <br />
LET j=0; <br />
LET START_YEAR_MONTH=DATE('2011-08-01','YYYY-MM'); //定义库存起始月份。合并月库存用。 <br />
LET NOWDAY=TODAY()-1; //当前日期，自动更新库存用 <br />
//LET NOWDAY='2011-11-01'; //当前日期，手动调整抽取时用 <br />
LET DAYNUM=DAY(NOWDAY); //截止当前日期当月的天数 <br />
LET YEAR_MONTH=DATE(NOWDAY,'YYYY-MM'); //当前月份 <br />
LET MONTH_START_DAY=MONTHSTART(NOWDAY); //当前月起始日 <br />
LET LAST_YEAR_MONTH=DATE(ADDMONTHS(NOWDAY,-1),'YYYY-MM'); //计算上一个月 <br />
LET LAST_MONTH_END_DAY=DAY(MONTHEND(NOWDAY,-1)); //上一个月月末日期 <br />
LET LAST_MONTH_START_DAY=MONTHSTART(NOWDAY,-1); //上一个月月初日期 <br />
<br />
<br />
//上月日库存抽取 月结后 <br />
SUB LASTMONTH_EVERYDAY_STOCK(_LAST_MONTH_END_DAY) <br />
DO WHILE _LAST_MONTH_END_DAY>j <br />
LET _LAST_STOCK_DATE=DATE(LAST_MONTH_START_DAY+j,'YYYY-MM-DD'); <br />
上月临时表: <br />
SQL exec BI_History_Stock @Stock_Date='$(_LAST_STOCK_DATE)'; <br />
<br />
SQL select * from TRptDcubeStoc003dududu; <br />
<br />
上月日库存临时表: <br />
NOCONCATENATE LOAD <br />
[Store] AS 店仓ID, <br />
Style AS 款号, <br />
Sku AS SKU, <br />
DPrice AS 标准零售价, <br />
Fob AS 成本价, <br />
Qty AS 库存数量, <br />
Amount AS 库存金额, <br />
Cost AS 库存成本, <br />
'$(_LAST_STOCK_DATE)' AS 库存日期 <br />
RESIDENT <br />
上月临时表; <br />
STORE 上月日库存临时表 INTO QVD\$(LAST_YEAR_MONTH)\$(_LAST_STOCK_DATE)库存.QVD; <br />
DROP Table 上月临时表; <br />
DROP Table 上月日库存临时表; <br />
LET j=j+1; <br />
LOOP <br />
END SUB <br />
<br />
//上月日库存合并 <br />
SUB LASTMONTH_ALL_STOCK(_LAST_MONTH_END_DAY) <br />
LET j=0; <br />
DO WHILE _LAST_MONTH_END_DAY>j <br />
LET _LAST_STOCK_DATE=DATE(LAST_MONTH_START_DAY+j,'YYYY-MM-DD'); <br />
上月汇总库存临时表: <br />
LOAD <br />
店仓ID, <br />
款号, <br />
SKU, <br />
标准零售价, <br />
成本价, <br />
库存数量, <br />
库存金额, <br />
库存成本, <br />
库存日期 <br />
FROM <br />
QVD\$(LAST_YEAR_MONTH)\$(_LAST_STOCK_DATE)库存.QVD(qvd); <br />
LET j=j+1; <br />
LOOP <br />
STORE 上月汇总库存临时表 INTO QVD\$(LAST_YEAR_MONTH)\$(LAST_YEAR_MONTH)库存.QVD; <br />
DROP TABLE 上月汇总库存临时表; <br />
END SUB <br />
<br />
//当月日库存合并 <br />
SUB NOWMONTH_ALL_STOCK(_DAYNUM) <br />
LET j=0; <br />
DO WHILE _DAYNUM>j <br />
LET _NOW_STOCK_DATE=DATE(MONTH_START_DAY+j,'YYYY-MM-DD'); <br />
当月汇总库存临时表: <br />
LOAD <br />
店仓ID, <br />
款号, <br />
SKU, <br />
标准零售价, <br />
成本价, <br />
库存数量, <br />
库存金额, <br />
库存成本, <br />
库存日期 <br />
FROM <br />
QVD\$(YEAR_MONTH)\$(_NOW_STOCK_DATE)库存.QVD(qvd); <br />
LET j=j+1; <br />
LOOP <br />
STORE 当月汇总库存临时表 INTO QVD\$(YEAR_MONTH)\$(YEAR_MONTH)库存.QVD; <br />
DROP TABLE 当月汇总库存临时表; <br />
END SUB <br />
<br />
//历史月库存合并 <br />
SUB EVERYMONTH_ALL_STOCK(X) <br />
DO WHILE START_YEAR_MONTH<=YEAR_MONTH <br />
历史月库存临时表: <br />
LOAD <br />
店仓ID, <br />
款号, <br />
SKU, <br />
标准零售价, <br />
成本价, <br />
库存数量, <br />
库存金额, <br />
库存成本, <br />
库存日期 <br />
FROM <br />
QVD\$(START_YEAR_MONTH)\$(START_YEAR_MONTH)库存.QVD(qvd); <br />
LET START_YEAR_MONTH=DATE(ADDMONTHS(START_YEAR_MONTH,1),'YYYY-MM'); <br />
LOOP <br />
STORE 历史月库存临时表 INTO QVD\历史日库存表_TEMP.QVD; <br />
DROP TABLE 历史月库存临时表; <br />
END SUB <br />
<br />
<br />
DO WHILE DAYNUM>i <br />
LET STOCKDATE=DATE(MONTH_START_DAY+i,'YYYY-MM-DD'); <br />
// LET PATH=QvWorkPath; <br />
// LET vCreateFolder = CreateFolder(PATH&amp;'\QVD\'&amp;YEAR_MONTH); <br />
<br />
IF DAYNUM=1 THEN //每月第一天执行前一个月的库存处理 1表示月结日 <br />
CALL LASTMONTH_EVERYDAY_STOCK('$(LAST_MONTH_END_DAY)'); //重新抽取一遍上个月每天的库存 一般是月结后的库存 <br />
CALL LASTMONTH_ALL_STOCK('$(LAST_MONTH_END_DAY)') //上月日库存合并 <br />
END IF <br />
<br />
临时表: <br />
SQL exec BI_History_Stock @Stock_Date='$(STOCKDATE)'; //业务系统的库存查询接口，每个系统不一样。 <br />
SQL select * from TRptDcubeStoc003dududu; //查询出来的日库存记录（临时表） <br />
<br />
日库存临时表: <br />
NOCONCATENATE LOAD <br />
[Store] AS 店仓ID, <br />
Style AS 款号, <br />
Sku AS SKU, <br />
DPrice AS 标准零售价, <br />
Fob AS 成本价, <br />
Qty AS 库存数量, <br />
Amount AS 库存金额, <br />
Cost AS 库存成本, <br />
'$(STOCKDATE)' AS 库存日期 <br />
RESIDENT <br />
临时表; <br />
<br />
STORE 日库存临时表 INTO QVD\$(YEAR_MONTH)\$(STOCKDATE)库存.QVD; <br />
DROP Table 临时表; <br />
DROP Table 日库存临时表; <br />
LET i=i+1; <br />
LOOP <br />
<br />
CALL NOWMONTH_ALL_STOCK('$(DAYNUM)') //当月日库存合并 <br />
CALL EVERYMONTH_ALL_STOCK('$(YEAR_MONTH)') //月库存存合并成一个完整库存 <br />
[/code]</p>]]></description></item><item><title><![CDATA[QV中实现DB到QVD数据文件的增量更新功能（可以看到更新日志哦）]]></title><pubDate>Wed, 10 Aug 2011 14:52:38 GMT</pubDate><category>QlikView点滴</category><link>http://www.51yc.cn/html/2011/08/201108101452383101.htm</link><description><![CDATA[<p>创建日志文件，并在日志表中写入需要要做增量的表名和相关信息，具体信息看代码<br />
<br />
[code]/************************************* <br />
Module Name: ETL增量数据更新功能 v1.0 <br />
Module Use: 增加需要做增量更新的新表 <br />
Create Author: wilson <br />
Create Time: 2011-8-5 <br />
Modify Author: wilson <br />
Modify Time: 2011-8-5 <br />
*************************************/ <br />
<br />
//开始： 增加新表 <br />
//注意1：如果不增加新表请注释掉这部分 <br />
//注意2：如果是第一次操作需要注释掉Load操作的UpdateLog.qvd部分，否则报错; <br />
//格式： 需要增量的表名，最后更新时间，状态 0-成功 1，2，3，,4，,5，,6.。。更新行数 （可以用errorscript来获取） <br />
<br />
//ADD_TABLE: <br />
// <br />
//LOAD SourceTables, <br />
// LastUpdataTime, <br />
// State, <br />
// Rows <br />
//FROM <br />
//UpdateLog.qvd <br />
//(qvd); <br />
// <br />
//LOAD * INLINE [ <br />
// SourceTables,LastUpdataTime,State,Rows <br />
// XF_QOHBAL,2000-1-1 00:00:00,0,0 <br />
//]; <br />
//Store ADD_TABLE into UpdateLog.qvd; <br />
//Drop Table ADD_TABLE; <br />
<br />
//结束：增加新表 <br />
[/code]</p>
<p>实现通过日志文件，读取表的最后更新日期，并赋值到变量后开始增量更新操作，最后按更新日期写入到日志文件，具体表名和日期段需要做更改。</p>
<p>[code]/************************************* <br />
Module Name: ETL增量数据更新功能 v1.0 <br />
Module Use: 单表实现增量更新 <br />
Create Author: wilson <br />
Create Time: 2011-8-5 <br />
Modify Author: wilson <br />
Modify Time: 2011-8-5 <br />
*************************************/ <br />
Let nowdate=Date(Now(),'YYYY-MM-DD')&amp;' '&amp;Time(Now(),'h:mm:ss');  //第一次执行增量，注意时间变量，与实际执行时间中间的时间差</p>
<p><br />
//开始：增量更新功能 <br />
///这部分查询最后日志表的最后更新日期 并赋值到变量 Endtime 中 <br />
<br />
SELECT_UPDATALOG: <br />
LOAD SourceTables as st, <br />
LastUpdataTime as lut, <br />
State as s, <br />
Rows as r <br />
FROM <br />
UpdateLog.qvd <br />
(qvd); <br />
<br />
ADD_UPDATALOG: <br />
LOAD <br />
st as SourceTables, <br />
lut as LastUpdataTime, <br />
s as State, <br />
r as Rows <br />
resident <br />
SELECT_UPDATALOG order by lut Desc; //这里要更改条件 //注意表名 <br />
<br />
Let Endtime=FieldValue('LastUpdataTime',1); <br />
<br />
///变量赋值完成 <br />
////开始增量更新操作 通过where条件把日期变量带进去 <br />
<br />
XF_ITEMDM: <br />
SQL select * from XF_ITEMDM where XF_LASTMODTIME4SYNC<=to_date('$(nowdate)','yyyy/mm/dd hh24:mi:ss') order by XF_LASTMODTIME4SYNC; //这里的条件要注意 第一次调用$(nowdate)变量，以后就调用'$(Endtime) 变量 <br />
<br />
///第一次更新数据不要加载下面的这个load操作 ,第二次以后就必须更新load了 <br />
//Concatenate (XF_ITEMDM) LOAD * <br />
//FROM <br />
//XF_ITEMDM.qvd <br />
//(qvd); <br />
<br />
Store XF_ITEMDM into XF_ITEMDM.qvd; //注意表名 <br />
Drop table XF_ITEMDM; //注意表名 <br />
////结束增量更新操作 <br />
<br />
///开始构造写入日志记录表 <br />
//ADD_UPDATALOG: <br />
Concatenate (ADD_UPDATALOG) LOAD <br />
'XF_ITEMDM' as SourceTables, //注意表名 <br />
'$(nowdate)' as LastUpdataTime, <br />
'0' AS State, <br />
Count(XF_LASTMODTIME4SYNC) AS Rows <br />
FROM <br />
XF_ITEMDM.qvd //注意表名 <br />
(qvd); <br />
///add日志表 <br />
Store ADD_UPDATALOG into UpdateLog.qvd; <br />
<br />
Drop table SELECT_UPDATALOG; <br />
//Drop table ADD_UPDATALOG; <br />
<br />
//结束：增量更新功能 <br />
<br />
[/code]</p>
<p>总结：此方法目前在功能上，只实现了量上的更新，如果在配合inner jion ，keep的话就可以实现数据修改的更新。</p>
<p>还有更新的状态那个地方可以用Set ErrorMode 和ScriptError来获取文件执行的状态，这样就可以真实的记录到执行状态到日志，如果表数据量很大，且几个表都第一次做增量的话，请注意一下时间差。</p>]]></description></item><item><title><![CDATA[Oracle日期数据查询的一个问题。]]></title><pubDate>Wed, 10 Aug 2011 14:39:27 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2011/08/201108101439279803.htm</link><description><![CDATA[<p>以前也遇到过只是没记录下来就忘了，这里在记录下，以后万一又忘了就知道了。<br />
如果一个字段CDate是DATE类型，其值的格式，如：2011/8/10 12:11:30<br />
正常的查询语句是：<br />
[code]select * from tablename where CDate=to_date('2011-06-13','yyyy-MM-dd');[/code]<br />
这样的查询语句是查不出来的，也不是语句错误，至于为什么我估计是日期分隔符和带了时分秒的问题。<br />
在改良下代码就可以了，能正确执行的代码如下：<br />
[code]select * from tablename where to_date('CDate','yyyy-MM-dd')=2011-06-13;[/code]</p>]]></description></item><item><title><![CDATA[VS2008 TeamSystem版和VS2010 Ultimate版在数据同步上的一点区别]]></title><pubDate>Fri, 05 Aug 2011 11:06:45 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2011/08/201108051106451054.htm</link><description><![CDATA[<p>今天在做一个库的数据同步，发现VS2008和VS2010在schemacompare和datacompare中对数据库的支持是不一样的，<br />
VS2008支持SQL2000以上版本，而VS2010只支持SQL2005以上版本。<br />
还郁闷了一小会儿，还是只能在装了在装了VS2010的基础上在装个VS2008 Team了。</p>]]></description></item><item><title><![CDATA[QVW中实现日期区间的选择功能！~]]></title><pubDate>Thu, 04 Aug 2011 19:48:26 GMT</pubDate><category>QlikView点滴</category><link>http://www.51yc.cn/html/2011/08/201108041948264156.htm</link><description><![CDATA[<p>QV在日期的选择上不是很灵活，日期区段的选择可以在列表框中直接用鼠标拖拉区段，如果跨周期比较长了还是不是很方便啦。</p>
<p>下面介绍的方式是完全实现了起始日期的选择功能。</p>
<p><font color="#ff0000">注：日期这个字段在抽取的时候一定要格式化成统一的格式，我这里统一都用YYYY-MM-DD这个格式！</font></p>
<p>相关的VBScript代码如下：</p>
<p>[code]'调用日期处理函数 wilson 2011.08.17 修改 <br />
'调用方法，新建一个按钮---操作---新增--外部--执行宏--宏名称里填写 XF_CREATETIME即可。同一qvw文件下可以多个调用了哦。多加一个执行函数改变下date参数就可以。 <br />
<br />
function XF_CREATETIME <br />
call BeginToEndDate("Date") <br />
end function <br />
<br />
function XF_STOREDS_TXDATE <br />
call BeginToEndDate("XF_STOREDS_TXDATE") <br />
end function <br />
<br />
'时间段处理函数 <br />
function BeginToEndDate(Column) <br />
Set daystart=ActiveDocument.Variables("StartDate") <br />
Set dayend=ActiveDocument.Variables("EndDate") <br />
Dim startstring,endstring,rangstring,differ <br />
daystart=daystart.Getcontent.string <br />
dayend=dayend.Getcontent.string <br />
startstring=">="&amp;daystart <br />
endstring="<="&amp;dayend <br />
differ= DateDiff("d",daystart,dayend) <br />
If Differ<0 then <br />
msgbox "结束日期应该在开始日期以后！",,"错误提示：" <br />
Else <br />
rangstring=startstring&amp;endstring <br />
'msgbox rangstring <br />
Set f=activedocument.fields(Column) <br />
'一定要清空一下日期选择 否则只会在上次查询的结果中查询 具体是只清空选择的时间字段 还是clearall 可以依据自己的需要来设置 <br />
f.Clear <br />
f.select rangstring <br />
End if <br />
end function <br />
[/code]</p>
<p>实现界面及相关控件设置：</p>
<p>一、定义了四个变量。</p>
<p>二、2个日历控件分别向变量SDate和EDate赋值，StartDate和EndDate分别格式化变量的值（图片太大了，可以直接在图片上点右键属性获取图片URL，然后新窗口打开看大图）。</p>
<p> <img alt="" src="http://www.51yc.cn/upfiles/images//NEWPIC/11.gif" /></p>
<p>如果结束日期在开始日期之前则提示错误。</p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images//NEWPIC/22.gif" /></p>
<p>日历变量赋值和格式相关设置。</p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images//NEWPIC/33.gif" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images//NEWPIC/44.gif" /></p>]]></description></item><item><title><![CDATA[mysql（Invalid hostname for server 1. Please review your configuration.）error！]]></title><pubDate>Wed, 30 Mar 2011 09:35:25 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2011/03/201103300935250440.htm</link><description><![CDATA[<p> 此错误网上百度了下，都是如下的解决方法：</p>
<p>[code]mysql <br />
Invalid hostname for server 1. Please review your configuration. 错误解决方法 <br />
<br />
phpmyadmin/config.inc.php <br />
把$cfg['Servers'][$i]['host'] = ''; 改成 $cfg['Servers'][$i]['host'] = '127.0.0.1'; 即可解决!![/code]</p>
<p>其实这个是不完全能正确的，在不同版本下可能不行，仔细分析了下问题出在COOKIES上，所以设置下IE就可以了。</p>
<p>win2003为例的具体方法：</p>
<p>&ldquo;打开IE&rdquo;-------&ldquo;Internet选项&rdquo;-------&ldquo;隐私&rdquo;-----设置里面&ldquo;高级&rdquo;------然后在出来的高级隐私策略设置里，勾选&ldquo;覆盖自动Cookies处理&rdquo;，下面第一方，第三方全部选&ldquo;接受&rdquo;----另外也勾选&ldquo;总是会话cookies   ，就这样点一路确定下去就可以了，重启浏览器在访问phpmyadmin 能进了吧！~</p>]]></description></item><item><title><![CDATA[伪3D轮播]]></title><pubDate>Mon, 07 Mar 2011 16:41:19 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2011/03/201103071641198142.htm</link><description><![CDATA[<p> 很不错的代码：</p>
<p>[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> [/n]<html xmlns="http://www.w3.org/1999/xhtml"> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> [/n]<title>myFocus v1.0.final Demo</title> [/n]<script type="text/javascript" src="http://www.cosmissy.com/myfocus/js/myfocus-1.0.min.js"></script> [/n]<style> [/n]body{padding:20px;} [/n]/*=========mF_slide3D========*/ [/n].mF_slide3D_wrap{padding:8px;border:1px solid #999;float:left;background:#fff;}/*背景边框*/ [/n].mF_slide3D .pic li{float:left;display:inline;overflow:hidden;} [/n].mF_slide3D .pic li img{width:0;} [/n].mF_slide3D .mask11,.mF_slide3D .mask12{position:absolute;top:0;left:0;width:0;height:0;overflow:hidden;border-style:solid dashed dashed solid;border-color:#fff transparent transparent #fff;filter:chroma(color=#000000);} [/n].mF_slide3D .mask12{top:auto;bottom:0;border-style:dashed dashed solid solid;border-color:transparent transparent #fff #fff;} [/n].mF_slide3D .mask21,.mF_slide3D .mask22{position:absolute;top:0;right:0;width:0;height:0;overflow:hidden;border-style:solid solid dashed dashed;border-color:#fff #fff transparent transparent;filter:chroma(color=#000000);} [/n].mF_slide3D .mask22{top:auto;bottom:0;border-style:dashed solid solid dashed;border-color:transparent #fff #fff transparent;} [/n].mF_slide3D .num{position:absolute;z-index:3;bottom:12px;left:12px;}/*按钮样式*/ [/n].mF_slide3D .num li{float:left;display:inline;width:18px;height:18px;line-height:18px;border:1px solid #f60;overflow:hidden;text-align:center;margin-right:4px;cursor:pointer;} [/n].mF_slide3D .num li a{color:#333;display:block;background:#FCF2CF;} [/n].mF_slide3D .num li.current a,.mF_slide3D .num li.hover a{color:#fff;background:#f60;}/*当前/悬停按钮样式*/ [/n].mF_slide3D .next{position:absolute;z-index:3;bottom:12px;right:12px;border:1px solid #f60;padding:0 4px;background:#FCF2CF;cursor:pointer;} [/n]</style> [/n]<script type="text/javascript"> [/n]myFocus.extend({//*********************mF_slide3D****************** [/n] mF_slide3D:function(par){ [/n] var box=this.$(par.id); [/n] this.addList(box,['mask11','mask12','mask21','mask22','num','next']); [/n] var pics=this.$c('pic',box),num=this.$li('num',box),m11=this.$c('mask11',box),m12=this.$c('mask12',box),m21=this.$c('mask21',box),m22=this.$c('mask22',box),nex=this.$c('next',box),n=num.length; [/n] pics.innerHTML+=pics.innerHTML; [/n] nex.innerHTML='NEXT'; [/n] //CSS [/n] var pic=this.$li('pic',box); [/n] m11.style.cssText=m12.style.cssText='border-width:0px '+par.width/2+'px;'; [/n] m21.style.cssText=m22.style.cssText='border-width:45px 0px;'; [/n] //PLAY [/n] eval(this.switchMF(function(mf){ [/n] mf.$$('img',pic[n])[0].style.cssText='width:'+par.width+'px;height:'+par.height+'px'; [/n] mf.$$('img',pic[n+1])[0].style.cssText='width:0px;height:'+par.height+'px'; [/n] mf.$$('img',pic[n])[0].src=mf.$$('img',pic[index])[0].src; [/n] m11.style.cssText=m12.style.cssText='border-width:0px '+par.width/2+'px;'; [/n] m21.style.cssText=m22.style.cssText='border-width:45px 0px;'; [/n] num[index].className=''; [/n] },function(mf){ [/n] mf.$$('img',pic[n+1])[0].src=mf.$$('img',pic[next])[0].src; [/n] mf.slide(mf.$$('img',pic[n])[0],{width:0},30); [/n] mf.slide(mf.$$('img',pic[n+1])[0],{width:par.width},30); [/n] mf.slide(m11,{borderLeftWidth:0,borderRightWidth:0,borderTopWidth:45,borderBottomWidth:45},30); [/n] mf.slide(m12,{borderLeftWidth:0,borderRightWidth:0,borderTopWidth:45,borderBottomWidth:45},30); [/n] mf.slide(m21,{borderLeftWidth:par.width/2,borderRightWidth:par.width/2,borderTopWidth:0,borderBottomWidth:0},30); [/n] mf.slide(m22,{borderLeftWidth:par.width/2,borderRightWidth:par.width/2,borderTopWidth:0,borderBottomWidth:0},30); [/n] num[next].className='current'; [/n] })); [/n] eval(this.bind('num','par.trigger',par.delay)); [/n] eval(this.turn('nex','nex')); [/n] } [/n]}); [/n]new myFocus.setting({ [/n] id:'myFocus',//焦点图ID [/n] style:'mF_slide3D',//风格样式 [/n] time:3,//切换时间间隔(秒) [/n] trigger:'click',//触发切换模式：'click'(点击)/'mouseover'(悬停) [/n] width:450,//设置宽度(主图区) [/n] height:296,//设置高度(主图区) [/n] txtHeight:0,//文字层高度设置，'default'为默认高度，0为隐藏 [/n] wrap:true//添加边框背景 [/n]}); [/n]</script> [/n]</head> [/n]<body> [/n]<h2>论坛demo需刷新多一次才看到效果</h2> [/n]<div id="myFocus"><!--焦点图盒子--> [/n] <div class="loading"><span>请稍候...</span></div><!--载入画面--> [/n] <ul class="pic"><!--内容列表--> [/n] <li><a href="#"><img src="http://www.cosmissy.com/myfocus/img/1.jpg" thumb="" alt="图片1来源于网络，版权属于作者" text="图片1更详细的描述文字" /></a></li> [/n] <li><a href="#"><img src="http://www.cosmissy.com/myfocus/img/2.jpg" thumb="" alt="版权属于作者，图片2来源于网络" text="图片2更详细的描述文字" /></a></li> [/n] <li><a href="#"><img src="http://www.cosmissy.com/myfocus/img/3.jpg" thumb="" alt="图片3来源于网络，版权属于作者" text="图片3更详细的描述文字" /></a></li> [/n] <li><a href="#"><img src="http://www.cosmissy.com/myfocus/img/4.jpg" thumb="" alt="版权属于作者，图片4来源于网络" text="图片4更详细的描述文字" /></a></li> [/n] </ul> [/n]</div> [/n]</body> [/n]</html>[/html]</p>]]></description></item><item><title><![CDATA[商业智能中数据仓库与Web平台架构设计]]></title><pubDate>Thu, 06 Jan 2011 11:16:10 GMT</pubDate><category>项目方案</category><link>http://www.51yc.cn/html/2011/01/201101061116109174.htm</link><description><![CDATA[<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; font-family: Tahoma, Arial; text-align: left">      此文为《程序员》杂志约稿，发表在2010年6月刊。<br />
<br />
　　文章以&ldquo;<a style="color: rgb(79,99,113); text-decoration: none" href="http://kbi.xoyo.com/" target="_blank">KBI用户行为分析</a>&rdquo;的项目架构为原型，对Web商业智能平台的架构设计进行了概要介绍。实现海量数据的分析挖掘计算相对较易，如何以灵活的可扩展性框架，来便捷地应对项目开发周期中，来自众多项目干系人的需求变更，才是难点。</span></span></p>
<p align="center"> </p>
<p align="center"><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; font-family: Tahoma, Arial; text-align: left"><img alt="" src="http://www.51yc.cn/upfiles/images/kbi1.png" /></span></span></p>
<p align="center"><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; font-family: Tahoma, Arial; text-align: left"><img alt="" src="http://www.51yc.cn/upfiles/images/kbi2.png" /></span></span></p>]]></description></item><item><title><![CDATA[项目管理手记(29)ERP项目高层大力支持的冰火两重天]]></title><pubDate>Thu, 30 Dec 2010 15:37:12 GMT</pubDate><category>项目管理</category><link>http://www.51yc.cn/html/2010/12/201012301537127268.htm</link><description><![CDATA[<div class="Section0" style="layout-grid:  15.6pt none">
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-weight: bold; font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">一、背景：</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">    ERP<font face="宋体">项目的实施离不开公司一把手的支持，这个说法不新鲜了。但即便是得到公司高层的大力支持，我们还得看看这是什么样的支持。高层支持到位了，支持对头了，项目才能顺利推行下去；如果高层支持的劲道用错地方了，可能会把</font><font face="微软雅黑">ERP</font><font face="宋体">项目打入</font><font face="Times New Roman">&ldquo;</font><font face="宋体">冰窖</font><font face="Times New Roman">&rdquo;</font><font face="宋体">中，往往会使项目处于冰封状态，迟迟不见突破。从这个角度而言，同样是公司高层的大力支持，但对于</font><font face="微软雅黑">ERP</font><font face="宋体">项目的实施工作来说，效果可能会是</font><font face="Times New Roman">&ldquo;</font><font face="宋体">冰火两重天</font><font face="Times New Roman">&rdquo;</font><font face="宋体">。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-weight: bold; font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">二、故事<font face="微软雅黑">1</font><font face="宋体">：客户高层大力支持是犹如</font><font face="Times New Roman">&ldquo;</font><font face="宋体">冬天里的一把火</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     前两个周日晚上，例行看全国实施同事的项目周报，全国各地在实施项目的进展情况一个个地过，其中发现某重点项目<font face="微软雅黑">X</font><font face="宋体">又有了新的突破性进展，原来在召开了项目工作周会上，我方项目小组与客户方项目小组有了一个较明显的分歧，对这个明显分歧的主张是客户方的一位副总裁提出来的，并且认为这样的需求是有其坚持的理由，非要实现了之后才进行系统上线。而我方认为这个需求明显与之前双方确认的方案不符，而且这个设想在客户方难以落地执行，实现的风险极大，这时候才有了这个项目周会上的争议与故事。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">    本次的项目周会因为需要解决这个争议性的问题，客户方副总裁<font face="微软雅黑">A</font><font face="宋体">一再要求按照他的想法展开实施工作，他认为：目前系统已经实现了他</font><font face="微软雅黑">75%</font><font face="宋体">想要的内容，但还有</font><font face="微软雅黑">25%</font><font face="宋体">的需求是没有实现的，基于这个情况，他要求这部分功能实现了之后再上线。同时为了取得支持，把客户方的总裁</font><font face="微软雅黑">Y</font><font face="宋体">（也是公司的一把手）拉到了会议现场，以便取得支持拍板按他的思路来做。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">A</font><font face="宋体">总首先说：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">我认为他们没有实现我要的企业管控思路，所以我认为项目没有不能上线。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">Y</font><font face="宋体">总裁问：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">之前我们双方是怎么约定的？之前软件方和你们也做了这么多工作了，为什么到现在再来说没有实现？之前做的工作都干什么去了？</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">A</font><font face="宋体">总说：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">我们之前做的工作还是很有成效的，但我认为只是实现了</font><font face="微软雅黑">75%</font><font face="宋体">的要求，还有</font><font face="微软雅黑">25%</font><font face="宋体">是没有实现的。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">Y</font><font face="宋体">总裁问：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">那我们看看这</font><font face="微软雅黑">25%</font><font face="宋体">的东西对于我们系统应用来说，能带来什么价值？软件方为什么认为这些不做呢？</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     对于这个需求情况，我方的项目经理说：<font face="Times New Roman">&ldquo;</font><font face="微软雅黑">A</font><font face="宋体">总，对于您说的这个</font><font face="微软雅黑">25%</font><font face="宋体">的需求，我们在做需求调研的时候我们是有做记录的，在我们的调研访谈纪要与调研报告中有都有体现；但在我们进行方案设计阶段，与您以及</font><font face="微软雅黑">Y</font><font face="宋体">总裁进行了充分的沟通，我们一致认为这部分内容的实现风险很高，因此我们在方案中还是把这一块给略掉了，而且您也同意采用我们的方案进行实现。</font><font face="微软雅黑">A</font><font face="宋体">总，当初您说十句话，我们肯定是记了十句话的，但如何实现的这个层面，我们是按</font><font face="微软雅黑">7</font><font face="宋体">句话的范围来实现的，您看当初的方案您也是签了字的，现在再改变，我们的项目要变更的话，可能这</font><font face="微软雅黑">25%</font><font face="宋体">的工作量就会让我们把项目重来一次了，毕竟这些都是涉及到我们打地基的工作呀。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">Y</font><font face="宋体">总裁问：</font><font face="Times New Roman">&ldquo;</font><font face="微软雅黑">A</font><font face="宋体">总，这是你之前签字的吗？如果是你签字的，现在又说要改，是不是当初你没有想清楚？当初没有想清楚，现在再来折腾。有必要吗？</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">A</font><font face="宋体">总说：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">是我签字的。但之前的情况还不明朗，所以我才签的，项目做到现在，我就越觉的这部分的内容非常重要了，我负责的这块业务一定要把这个业务推起来，才能达到我们的管理目的。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">Y</font><font face="宋体">总裁说：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">这</font><font face="微软雅黑">25%</font><font face="宋体">的东西，我们现在全国各地分公司是按这个模式运作的吗？这套管控的想法按我们现在的管理水平能达到吗？</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     我方的项目经理说：<font face="Times New Roman">&ldquo;</font><font face="宋体">经过我们的前期调研，这</font><font face="微软雅黑">25%</font><font face="宋体">的内容在各地分公司是没有运作起来的，现在我们的管理思路是。。。。（省略</font><font face="微软雅黑">2000</font><font face="宋体">字），所以</font><font face="微软雅黑">A</font><font face="宋体">总的思路应该是一个比较超前的管理思路，我方判断如果要执行这个管理思路与方法的话，咱们公司的管理精细化程度暂时还不足以支撑，这也是之前与</font><font face="微软雅黑">A</font><font face="宋体">总达到共识的</font><font face="Times New Roman">&rdquo;</font><font face="宋体">。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">A</font><font face="宋体">总：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">这套思路是比较新，但是未来的趋势。执行的问题我认为只要软件能够实现，就一定可以执行下去的，再说软件方可以不用理会我们是怎么做制度执行的，只要把软件功能实现了就可以。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     客户方<font face="微软雅黑">Y</font><font face="宋体">总裁：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">软件系统做到现在，我们的主要目标是什么？我们是要快速应用起来，快速见效！而不是贪大求全，做到</font><font face="微软雅黑">100%</font><font face="宋体">的尽善尽美。管理无止境，软件也同样无止境，要认识到这个客户规律。这</font><font face="微软雅黑">25%</font><font face="宋体">的东西如果不影响我们现在的业务，也是未来一段时间才会应用的，那我们当前任务就是把系统用起来，这是我的最终决定。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     直至到此，这个争议处理结束，客户方<font face="微软雅黑">Y</font><font face="宋体">总裁决定按时展开系统上线，其它的内容可以作为项目</font><font face="微软雅黑">2</font><font face="宋体">期内容再行优化。我们的项目经理回来之后跟我眉飞色舞地说完这次工作周会汇报过程，我突然有了一个很深的感慨：作为</font><font face="微软雅黑">ERP</font><font face="宋体">项目实施的项目经理，如果在一个项目实施过程中，得到客户一把手的支持，是多少重要的一件事；同时也是多么幸福的一件事。在这个故事中，客户的</font><font face="微软雅黑">Y</font><font face="宋体">总裁对于企业信息化与企业管理的认识非常理性。认为管理无止境，管理软件也是无止境是其一；充分认识到项目的首要目标是什么，这是其二；第三就是清晰公平地界定了问题的责任方，情愿把拍子拍在自己人身上，而不护犊子，难能可贵。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     对于这样的客户方一把手，我们的项目经理没有理由不把这个项目做好，也没有办法不把这个项目做好。这样的客户方一把手，可遇不可求。所以说，这个项目的项目经理真是一个<font face="Times New Roman">&ldquo;</font><font face="宋体">幸福</font><font face="Times New Roman">&rdquo;</font><font face="宋体">的家伙。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-weight: bold; font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">三、故事<font face="微软雅黑">2</font><font face="宋体">：高层支持把</font><font face="微软雅黑">ERP</font><font face="宋体">项目往</font><font face="Times New Roman">&ldquo;</font><font face="宋体">冰窖</font><font face="Times New Roman">&rdquo;</font><font face="宋体">里推</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     是不是有了公司高层的大力支持，一定就能够把<font face="微软雅黑">ERP</font><font face="宋体">项目做好了呢？不一定，如果公司高层的支持方向是正确的话，结果会是</font><font face="Times New Roman">&ldquo;</font><font face="宋体">皆大欢喜</font><font face="Times New Roman">&rdquo;</font><font face="宋体">。但如果大力支持的方向错了，那么就会把</font><font face="微软雅黑">ERP</font><font face="宋体">项目推入到</font><font face="Times New Roman">&ldquo;</font><font face="宋体">冰窖</font><font face="Times New Roman">&rdquo;</font><font face="宋体">中，可能会使项目陷入冰封状态。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     说一下另一个案例：<font face="微软雅黑">G</font><font face="宋体">公司在</font><font face="微软雅黑">2009</font><font face="宋体">年起完成了全集团的信息规划，并于当年启动了</font><font face="微软雅黑">ERP</font><font face="宋体">项目实施的工作，公司的董事长兼总裁</font><font face="微软雅黑">H</font><font face="宋体">总亲自挂帅担任</font><font face="微软雅黑">ERP</font><font face="宋体">领导小组的组长，为的就是要把</font><font face="微软雅黑">ERP</font><font face="宋体">项目做成功。</font><font face="微软雅黑">H</font><font face="宋体">总之前在</font><font face="微软雅黑">EMBA</font><font face="宋体">的课程中，听说了联想当年实施</font><font face="微软雅黑">ERP</font><font face="宋体">系统，柳传志说</font><font face="微软雅黑">ERP</font><font face="宋体">不成功，就自己罚薪半年，其它人看着办的故事。在</font><font face="微软雅黑">ERP</font><font face="宋体">项目启动会上也说了一句狠话：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">你们当中谁不好好整</font><font face="微软雅黑">ERP</font><font face="宋体">，我就会好好地来整你！</font><font face="Times New Roman">&rdquo;</font><font face="宋体">，下面各个业务部门听到这句话，当然把</font><font face="微软雅黑">ERP</font><font face="宋体">当成头等重要的大事来做了。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     H<font face="宋体">总在做</font><font face="微软雅黑">ERP</font><font face="宋体">项目之前，向行业内的同行们打听过，知道在企业管理与信息化管理领域，做的最好的同行企业就是</font><font face="微软雅黑">L</font><font face="宋体">集团。因此</font><font face="微软雅黑">H</font><font face="宋体">总特意花重金从</font><font face="微软雅黑">L</font><font face="宋体">集团请来资深</font><font face="微软雅黑">IT</font><font face="宋体">人士</font><font face="微软雅黑">J</font><font face="宋体">担任</font><font face="微软雅黑">CIO</font><font face="宋体">，并要求</font><font face="微软雅黑">G</font><font face="宋体">公司的</font><font face="微软雅黑">ERP</font><font face="宋体">系统一定要达到</font><font face="微软雅黑">L</font><font face="宋体">集团的应用水平才算成功。而且</font><font face="微软雅黑">H</font><font face="宋体">总也把</font><font face="微软雅黑">ERP</font><font face="宋体">项目交给了</font><font face="微软雅黑">L</font><font face="宋体">集团的</font><font face="微软雅黑">ERP</font><font face="宋体">软件供应商来完成。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     在<font face="微软雅黑">ERP</font><font face="宋体">项目启动会上，</font><font face="微软雅黑">H</font><font face="宋体">总要求</font><font face="微软雅黑">ERP</font><font face="宋体">软件方的顾问要把系统给大家讲一遍，并且说：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">系统做完了，</font><font face="微软雅黑">L</font><font face="宋体">集团怎么用我们就应该怎么用，新</font><font face="微软雅黑">CIO</font><font face="宋体">会告诉大家系统要怎么做，大家一定要怎么做。</font><font face="Times New Roman">&rdquo;</font><font face="宋体">启动大会上，</font><font face="微软雅黑">J</font><font face="宋体">总（新</font><font face="微软雅黑">CIO</font><font face="宋体">）也把</font><font face="微软雅黑">L</font><font face="宋体">集团的一些系统成功经验做了介绍，并设定了</font><font face="微软雅黑">ERP</font><font face="宋体">系统实现目标。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     之后，<font face="微软雅黑">ERP</font><font face="宋体">软件方的顾问通过各个部门的业务访谈，就参照</font><font face="微软雅黑">L</font><font face="宋体">集团的组织架构分工、业务流程、管理体系等进行业务流程梳理，并基于</font><font face="微软雅黑">G</font><font face="宋体">公司的现实情况做了调整，在方案初步确定之后，向</font><font face="微软雅黑">H</font><font face="宋体">总进行了汇报，在方案汇报过程中，</font><font face="微软雅黑">H</font><font face="宋体">总问的最多的就是：</font><font face="Times New Roman">&ldquo;</font><font face="微软雅黑">L</font><font face="宋体">集团是这么做的吗？</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     当<font face="微软雅黑">H</font><font face="宋体">总知道这个方案中许多内容都是基于</font><font face="微软雅黑">G</font><font face="宋体">公司做了调整，与</font><font face="微软雅黑">L</font><font face="宋体">集团的应用现状相差较远了，</font><font face="微软雅黑">H</font><font face="宋体">总就火了，说道：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">我请你们来是为了实现我们公司的管理提升的，我们也是想学习</font><font face="微软雅黑">L</font><font face="宋体">集团的先进管理经验的，现在你们给我出的方案，就只是基于</font><font face="微软雅黑">G</font><font face="宋体">公司提出来的。那我们要你们来做什么呢？这个方案重做，或者再不行的话，</font><font face="微软雅黑">L</font><font face="宋体">集团的方案给我们公司再做一次就是了，如果方案不改过来，你们也不用找我汇报了。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     而<font face="微软雅黑">H</font><font face="宋体">总此时的态度也符合</font><font face="微软雅黑">CIO J</font><font face="宋体">总的想法，他认为在</font><font face="微软雅黑">L</font><font face="宋体">集团的许多运作已经很成熟了，应该是可以移植到</font><font face="微软雅黑">G</font><font face="宋体">公司的，而且软件也是现成的，项目的实施风险会较小。但</font><font face="微软雅黑">ERP</font><font face="宋体">软件方的顾问则有不同的担心：</font><font face="微软雅黑">L</font><font face="宋体">集团的系统已经运行了超过</font><font face="微软雅黑">5</font><font face="宋体">年，业务流程与系统的匹配度非常高，而且各业务部门人员对系统的掌握程度也非常高，已经到了</font><font face="微软雅黑">ERP</font><font face="宋体">系统应用的高级阶段；而</font><font face="微软雅黑">G</font><font face="宋体">公司只是在</font><font face="微软雅黑">ERP</font><font face="宋体">系统应用的起始阶段，还谈不上初级阶段，如果一开始就按这个标准上去的话，公司的组织架构、人员素质和管理制度都较难以支撑，系统上线的风险将会非常大。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     针对这个问题，<font face="微软雅黑">ERP</font><font face="宋体">软件厂商分别找</font><font face="微软雅黑">H</font><font face="宋体">总和</font><font face="微软雅黑">J</font><font face="宋体">总进行汇报，想扭转他们的想法，但</font><font face="微软雅黑">H</font><font face="宋体">总坚信只要自己亲自参与，肯定能够把系统上去并且用好的，用他的话说：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">我们公司这点执行力还是有的，要我们连个</font><font face="微软雅黑">ERP</font><font face="宋体">也用不起来，我们公司明天就可以关门了。</font><font face="Times New Roman">&rdquo;</font><font face="宋体">在</font><font face="微软雅黑">H</font><font face="宋体">总的再三催促之下，</font><font face="微软雅黑">ERP</font><font face="宋体">软件方只好按照</font><font face="微软雅黑">H</font><font face="宋体">总的想法，按照</font><font face="微软雅黑">L</font><font face="宋体">集团的系统重新构建方案，并展开相应的系统准备工作。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     由于方案中涉及到大量的组织分工与<font face="微软雅黑">G</font><font face="宋体">公司不一样，首要的是</font><font face="微软雅黑">G</font><font face="宋体">公司要重新进行组织分工，划分岗位职责；同时需要重新整理总部与区域公司的职权关系，</font><font face="微软雅黑">H</font><font face="宋体">总也就照搬</font><font face="微软雅黑">L</font><font face="宋体">集团的模式，但进行相应的组织分工调整过程中发现了难以推行下去：一是这个调整的动静太大了，公司的元老们都觉的</font><font face="微软雅黑">H</font><font face="宋体">总是在趁着</font><font face="微软雅黑">ERP</font><font face="宋体">系统这个时候</font><font face="Times New Roman">&ldquo;</font><font face="宋体">削蕃</font><font face="Times New Roman">&rdquo;&mdash;</font><font face="宋体">限制各地公司的权力，这样一来大家对</font><font face="微软雅黑">ERP</font><font face="宋体">项目的抵触心理极大；二来原本许多职能部门都是放在区域公司的，现在要收回到总部来，但是缺乏相应的人才积累，放回到总部根本不知道如何进行各区域公司的统一管理；第三，现在各区域公司还没有统一的管理规范，业务没有走起来，系统也就无法走起来，为了梳理业务流程与职责，</font><font face="微软雅黑">ERP</font><font face="宋体">系统迟迟不能上线。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     基于这种情况，一边是业务理不清楚系统上不了线；一边是各个业务口的负责人也不想用这个系统，虽然<font face="微软雅黑">H</font><font face="宋体">总老是催着</font><font face="微软雅黑">J</font><font face="宋体">总和软件方赶快上线，可是</font><font face="微软雅黑">ERP</font><font face="宋体">系统就是迟迟无法响应，导致几经折腾之后，</font><font face="微软雅黑">H</font><font face="宋体">总也觉的</font><font face="微软雅黑">ERP</font><font face="宋体">要推行起来太难，也就先把</font><font face="微软雅黑">ERP</font><font face="宋体">放在一边了，而各地分公司的业务原来是怎么走的也就怎么走，一切照旧，此时再来看</font><font face="微软雅黑">ERP</font><font face="宋体">项目已经处于了</font><font face="Times New Roman">&ldquo;</font><font face="宋体">冰封</font><font face="Times New Roman">&rdquo;</font><font face="宋体">状态。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     基于<font face="微软雅黑">G</font><font face="宋体">公司当前的</font><font face="微软雅黑">ERP</font><font face="宋体">项目进展情况，</font><font face="微软雅黑">H</font><font face="宋体">总有些心有不甘，认为自己花了这么大的精力来推行</font><font face="微软雅黑">ERP</font><font face="宋体">项目，为什么还不能见效呢？估计没有哪几个</font><font face="微软雅黑">ERP</font><font face="宋体">项目是能够像他一样做到</font><font face="Times New Roman">&ldquo;</font><font face="宋体">一把手</font><font face="Times New Roman">&rdquo;</font><font face="宋体">工程的吧。问题在哪？</font><font face="微软雅黑">H</font><font face="宋体">总带着这个问题去咨询他的</font><font face="微软雅黑">EMBA</font><font face="宋体">老师</font><font face="微软雅黑">Y---</font><font face="宋体">行业内有名的信息化专家。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     Y<font face="宋体">老师在听了</font><font face="微软雅黑">H</font><font face="宋体">总的项目过程讲解之后，告诉</font><font face="微软雅黑">H</font><font face="宋体">总：</font><font face="Times New Roman">&ldquo;</font><font face="宋体">你是把</font><font face="微软雅黑">ERP</font><font face="宋体">项目当成</font><font face="Times New Roman">&ldquo;</font><font face="宋体">一把手</font><font face="Times New Roman">&rdquo;</font><font face="宋体">工程了，但你身边还缺了一个重要角色</font><font face="Times New Roman">&mdash;</font><font face="宋体">军师。没有一个能够给你出谋划策的高级参谋，导致你的信息化意识有了，但期望值太高，发力的方向错了。原本应该是软件方和你的</font><font face="微软雅黑">CIO</font><font face="宋体">给你相应的建议的，可是你的一腔热情，导致你把项目风险都忽视了</font><font face="Times New Roman">&ldquo;</font><font face="宋体">。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">     Y<font face="宋体">老师接着说：</font><font face="Times New Roman">&ldquo;</font><font face="微软雅黑">ERP</font><font face="宋体">系统有一个特点就是由浅入深，逐渐深化的过程。举个例子，</font><font face="微软雅黑">G</font><font face="宋体">集团现在是在读研究生，而你们公司才只是小学三年级，你想通过本次</font><font face="微软雅黑">ERP</font><font face="宋体">系统实施，直接由三年级跳到研究生，这个目标本来定的有问题。当年，华为任正非提出来的</font><font face="Times New Roman">&ldquo;</font><font face="宋体">先僵化，后固化，再优化</font><font face="Times New Roman">&rdquo;</font><font face="宋体">这其实也是代表了信息系统建设的三个阶段，你一上来就优化，动作太大，难保公司上下对</font><font face="微软雅黑">ERP</font><font face="宋体">都惧而远之呀。是否可以考虑一下，重新调整</font><font face="微软雅黑">ERP</font><font face="宋体">项目的目标，当然设定这个目标的原则可以是</font><font face="Times New Roman">&ldquo;</font><font face="宋体">基于现状，高于现状</font><font face="Times New Roman">&rdquo;</font><font face="宋体">，我看之前软件方给你设定的方案还是挺合理的，你不妨听听他们的实施建议吧。</font><font face="Times New Roman">&rdquo;</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"> </span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-weight: bold; font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">四、总结</span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">ERP<font face="宋体">项目实施是需要高层的大力支持进行推进，但在推进</font><font face="微软雅黑">ERP</font><font face="宋体">项目实施过程中需要使对力，从两个不同的项目中就可以看到同样的支持不同的项目结果。分析一下原因：</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">1<font face="宋体">、 </font><font face="微软雅黑">ERP</font><font face="宋体">项目的实施是要讲究方法和科学的，所以需要专业顾问来完成，公司高层要善于借助专业顾问来完成这些工作，而不要自己一推到底；</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; margin-bottom: 0pt; padding-bottom: 11pt; padding-top: 0pt; border-bottom: medium none; mso-border-bottom-alt: none"><span style="font-size: 10pt; font-family: '微软雅黑'; mso-spacerun: 'yes'">2<font face="宋体">、 </font><font face="微软雅黑">ERP</font><font face="宋体">项目实施要学标杆，但学习标杆企业也得基于企业管理现实展开，而不能一味贪大求全，否则</font><font face="Times New Roman">&ldquo;</font><font face="宋体">多走一步是先进，多走三步就是先烈</font><font face="Times New Roman">&rdquo;</font><font face="宋体">，要学会跑步之前，还是先学会怎么走比较好。</font></span><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p>
</div>
<!--EndFragment-->]]></description></item><item><title><![CDATA[让IE6到IE9都崩溃的超无敌Bug！]]></title><pubDate>Sat, 30 Oct 2010 13:02:27 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2010/10/201010301302271537.htm</link><description><![CDATA[<p>许多人都非常讨厌Internet Explorer，在西方万圣节即将到来之际，让我们来看一个真正吓人的东西&mdash;&mdash;如何用一段简单的HTML和CSS，将任何版本的IE搞死。我们只需要简单地打开任意文本编辑器，将下面的代码复制进去，然后保存文件，例如Test.html。<br />
[code]<html><head> <br />
<style type="text/css"> <br />
#a { <br />
margin:0 10px 10px; <br />
} <br />
<br />
#b { <br />
width:100%; <br />
} <br />
<br />
</style> <br />
<title>IE Crasher</title> <br />
</head> <br />
<body> <br />
<table><tr><td> <br />
<div id="a"> <br />
<form id="b"> <br />
<input type="text" name="test"/> <br />
</div> <br />
</td><td width="1"></td></tr></table> <br />
</body></html> [/code]</p>
<p>这里可以直接点运行（记住在IE浏览器下才能显示出效果）！<br />
[html]<html><head> [/n]<style type="text/css"> [/n]#a { [/n]margin:0 10px 10px; [/n]} [/n] [/n]#b { [/n]width:100%; [/n]} [/n] [/n]</style> [/n]<title>IE Crasher</title> [/n]</head> [/n]<body> [/n]<table><tr><td> [/n]<div id="a"> [/n]<form id="b"> [/n]<input type="text" name="test"/> [/n]</div> [/n]</td><td width="1"></td></tr></table> [/n]</body></html> [/html]<br />
<br />
<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: Verdana; text-align: left">然后用Internet Explorer打开它&mdash;&mdash;哈哈！它很惨地死给你看了。</span></span></p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: Verdana; text-align: left"><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: Verdana; text-align: left">这个bug几乎存在于现在流行的所有IE版本，从IE6到刚刚发布的Internet Explorer 9的第6个平台预览版。在IE6中，该页面往往显示为空白，但是整个窗口都无法交互。在IE8中，崩溃来得很彻底。而IE9 Beta增强了坚固性，经过我的实测，这个页面又是会导致整个进程无响应，而有时IE9会提示你网页存在的问题，但是这都无法避免崩溃的现实。</span></span></span></span></p>
<p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: Verdana; text-align: left"><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: Verdana; text-align: left"><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 14px; line-height: 21px; font-family: Verdana; text-align: left">事实上，<a style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; color: rgb(0,51,102); padding-top: 0px; text-decoration: none" href="http://groups.google.com/group/microsoft.public.internetexplorer.general/browse_frm/thread/80a2645dc598a4b2?pli=1">很早就有人</a>发现过这个问题了，而且还有一个专门的网站（<a style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; color: rgb(0,51,102); padding-top: 0px; text-decoration: none" href="http://crashie8.com/">http://crashie8.com/</a>，请谨慎传播此链接）。除了IE以外的浏览器打开那个页面都不会有任何问题，但是IE却莫名其妙地崩溃。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
当然，如果你细心的话，会发现上面的HTML代码中<form>标签没有闭合。我们需要在<input>标签后使用</form>闭合标签才能让这段代码符合规范。规范的代码就不会让IE崩溃了，这样看来似乎并不是IE的错。<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
<br style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px" />
但是，<strong style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px">当其他浏览器都能有很高的容错性时，IE没有，甚至到了IE9还是没有，这就是IE的悲剧了。</strong></span></span></span></span></span></span></p>]]></description></item><item><title><![CDATA[asp.net绑定数据源的截取方法]]></title><pubDate>Sat, 12 Jun 2010 11:11:03 GMT</pubDate><category>.net技术</category><link>http://www.51yc.cn/html/2010/06/201006121111035864.htm</link><description><![CDATA[<p>[code]<%# Eval("company").ToString().Length > 10 ? Eval("company").ToString().Substring(0, 10):Eval("company").ToString()%>[/code]</p>
<p>先判断，在截取处理。</p>
<p>[code]order by newid()[/code]</p>
<p>这个是随机排序的。</p>]]></description></item><item><title><![CDATA[开机启动报Winload.exe出现0xc000000e错误的解决办法]]></title><pubDate>Wed, 12 May 2010 10:19:34 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2010/05/201005121019342746.htm</link><description><![CDATA[<p>       今天在给朋友TinkPad SL400电脑装Windows7系统的时候，装好了，但在后来用激活工具激活系统后重启电脑就出现了如下错误信息，仔细回想了下，曾经用同样的方法正常的激活了Windows7也没出现任何问题，而且这次激活的时候也提示激活成功了！问题肯定不在激活程序上。开始以为是反盗版的问题，后来在网上搜索了下相关错误信息的解决办法，都无疑的是使用三条命令解决，我也照着做了但是问题依然没有解决。开机同样提示报错。</p>
<p>开机启动时提示的错误信息如下：<br />
==============Error info================= <br />
Windows启动管理器 Windows未能启动，原因可能是最近更改了硬件或软件，解决此问题的步骤 <br />
1.插入Windows安装光盘并重新启动计算机 <br />
2.选择语言设置，然后单击&ldquo;下一步&rdquo;<br />
 3.单击&ldquo;修复计算机&rdquo; 如果没有此光盘，请与您的系统管理员或计算机制造商联系，以获得帮助文件 \Windows\System32\Winload.exe 状态 0xc00000e 信息 无法加载所选项，因为应用程序失去或损坏 <br />
========================================= <br />
<br />
=========网上收集过来的解决办法========== <br />
使用WinPE盘启动,然后切换到新硬盘系统分区的:windows\system32目录下 <br />
<br />
切换目录命令为: <br />
cd c:\windows\system32     C:为系统分区盘符 <br />
<br />
运行以下三条命令:<br />
bcdedit /set {default} osdevice boot <br />
bcdedit /set {default} device boot <br />
bcdedit /set {default} detecthal 1 <br />
========================================= <br />
<br />
在仔细看了下解决方法后认为方法应该是没问题的，但是问题出在哪里呢？再次用WinPE启动电脑，用PQ察看了下硬盘的分区信息，通常情况下系统盘都第一个硬盘的第一个分区，而这台电脑的却是第一个硬盘的第二个分区。问题就在这里。这事TinkPad系列电脑的问题，硬盘通常有2个影藏的分区，第一个和最后一个分区。<br />
<br />
而我刚才运行的启动配置数据第三条命令：/detectha 1 是NTLDR和BOOT.INI的接口，参数为1。<br />
<br />
没猜错的话激活工具肯定也是在更改了系统的启动也是1。 <br />
<br />
知道问题的所在了，解决方法就出来了：<br />
<br />
方法一、（在网上的方法的基础上作修改）：</p>
<p><br />
[code] 使用WinPE盘启动（这里提醒下，不一定是WinPE，可以任何能启动电脑的东西，包括U盘启动，光盘启动,只要能调出DOS的都可以）,调用DOS然后切换到新硬盘系统分区的:windows\system32目录下 <br />
<br />
<br />
切换目录命令为: <br />
Code: <br />
cd c:\windows\system32 C:为系统分区盘符 <br />
<br />
运行以下三条命令: <br />
<br />
bcdedit /set {default} osdevice boot <br />
bcdedit /set {default} device boot <br />
bcdedit /set {default} detecthal 2 <br />
<br />
把这个参数改为2，就OK。 <br />
[/code]<br />
<br />
<br />
方法二：<br />
 [code]使用WinPE盘启动（这里也提醒下，不一定是WinPE，可以任何能启动电脑的东西，里面包含有常用的分区操作软件PQ、DM都可以） 然后打开PQ分区软件，删除硬盘的第一个小分区（一般大小不操作10G）！这里的盘符因电脑而异可能有不同。只要是第一个分区就行！ 成功删除分区后，重启电脑就OK了。 <br />
[/code]<br />
原因描述：主要是在系统正常运行后，用了PQ，DM等工具对硬盘分区做了调整改变了原来的活动分区影响到了系统分区或者使用第三方的软件改变了<span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; line-height: 16px; font-family: Verdana, Arial, Helvetica, sans-serif">启动配置数据 (BCD)<span class="Apple-converted-space"> </span></span></span>，从而无法加载系统引导文件，此问题基本上在所有的操作系统都会出现，只是这个错误提示信息在Vista\Win7\Windows Server 2008系统上才会这么显示。</p>]]></description></item><item><title><![CDATA[解决div总是被select遮挡的问题]]></title><pubDate>Thu, 06 May 2010 20:52:14 GMT</pubDate><category>DIV/CSS</category><link>http://www.51yc.cn/html/2010/05/201005062052147794.htm</link><description><![CDATA[<p>解决div总是被select遮挡的问题，代码如下：</p>
<p>[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> [/n]<html xmlns="http://www.w3.org/1999/xhtml"> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> [/n]<title>解决div总是被select遮挡的问题</title> [/n]<style> [/n]body{margin:0px;padding:0px;} [/n]#message_box{ position:absolute; width:800px; height:536px; z-index:10000; visibility:hidden; border:#000 3px solid;background-color:#FFF;margin:40px 0px 0px 50px;} [/n]#mask{ position:absolute; top:0; left:0; width:expression(body.scrollWidth); height:expression(body.scrollHeight); background:#000; filter:ALPHA(opacity=80); z-index:1; visibility:hidden} [/n].close-what{float:right;cursor:hand;} [/n].message{background-color:#F4F4F4;width:754px;height:200px;margin:20px 20px 20px 20px;color:#FF6600;} [/n]/*代码转自懒人图库*/ [/n]</style> [/n]</head> [/n] [/n]<body> [/n] [/n]<div id="message_box"> [/n] <iframe src="" style="width:800px;height:536px;top:0px;left:0px;position:absolute;visibility:inherit;z-index:-1;" frameborder=0></iframe> [/n] <div class="close-what" onclick="document.getElementById('message_box').style.visibility='hidden';document.getElementById('mask').style.visibility='hidden'">关闭</div> [/n] <div class="message"> [/n] <p>新华社重庆５月６日电（记者郭立、张琴）记者６日下午从重庆市气象局获悉，截至１５时４５分，发生在垫江、梁平、涪陵等地的强风雹和暴雨灾害的死亡人数增至２９人，受伤１９０人。 [/n] [/n] 从５月５日夜间开始，重庆各地出现了一次明显的降温降雨伴随局地强风雹和暴雨天气过程。垫江县沙坪镇和回龙镇分别于６日零时４８分和２时左右出现强风雹和强降雨天气，瞬时最大风速达到１１级，梁平县还出现了冰雹。 [/n] [/n] 据重庆市气象局介绍，截至５月６日１２时，垫江、彭水、涪陵、长寿、武隆等区县的１８个乡镇达大暴雨（目前最大降水量出现在彭水县汉葭镇１５７．０毫米），垫江、梁平、彭水、涪陵、丰都、长寿、忠县、武隆、酉阳、秀山、合川、綦江等区县的１０３个乡镇达暴雨，其余大部地区为中到大雨。 [/n] [/n] 重庆市气象局：强风雹和暴雨灾害系南下冷空气触发 [/n] [/n] 新华社重庆５月６日电（记者郭立、李松）重庆垫江、梁平等地强风雹和暴雨灾害发生后，重庆市气象局初步分析认为，前期增温快，不稳定能量积累高，在冷空气的触发下形成这场强雷雨大风和冰雹过程。 [/n] [/n] 重庆市气象局专家分析认为，５月５日，受中高纬大环流形势的影响，重庆出现晴热高温天气，气温迅速回升，各地最高气温普遍升到３０－３４摄氏度，本地不稳定能量急剧积累，同时，北方冷空气达到四川盆地北部边缘。５日夜间开始，快速南下的冷空气触发了重庆不稳定能量的强烈释放。重庆自西向东不断有强对流云团生成，部分对流云团前部形成了很强的下沉气流，这些下沉气流到达地面形成强烈的大风；部分地区由于不断有对流云团生成或移过则形成强降水。 [/n] [/n] 重庆市气象局副局长顾建峰介绍，此次天气过程部分乡镇瞬时大风风速达到了１１级（２８．５－３２．６米／秒）。６日２时左右，垫江沙坪镇出现了３１．２米／秒的大风，梁平回龙镇出现了３０米／秒的大风，相当于１０８公里／小时速度，为该区域以往从未观测到的大风记录，这样的风速破坏性非常强，对于单砖结构的房屋极易出现倒塌伤人事件。３０米／秒以上的大风极值在重庆地区曾出现过，２００２年４月５日，永川出现了历史极大风速３１．５米／秒。</p> [/n] <p>效果演示：<a href="http://www.51yc.cn/" target="_blank">51yc.CN</a></p> [/n] </div> [/n]</div> [/n]<div id="mask"></div> [/n]<table width="960" height="2603" border="0" align="center" cellpadding="0" cellspacing="0"> [/n] <tr> [/n] <td width="960" height="303" align="center"> [/n] <p><span onclick="document.getElementById('mask').style.visibility='visible';document.getElementById('message_box').style.visibility='visible'" style="cursor:hand"><a href="#">点这里试下？</a></span></p> [/n] <p> [/n] <select name="select"> [/n] <option value="51yc.cn">还能看到我不？</option> [/n] </select> [/n] </p> [/n] <p>效果演示：<a href="http://www.51yc.cn/" target="_blank">51yc.CN</a></p> [/n] <p>只要在层里面加上下面代码就可以了~</p> [/n] <p><iframe src="" style="width:800px;height:536px;top:0px;left:0px;position:absolute;visibility:inherit;z-index:-1;" frameborder=0></iframe></p> [/n] </td> [/n] </tr> [/n] <tr> [/n] <td height="2300" align="center"></td> [/n] </tr> [/n]</table> [/n]</body> [/n]</html>[/html]</p>]]></description></item><item><title><![CDATA[清空数据库表的三个命令异同]]></title><pubDate>Fri, 11 Dec 2009 16:34:49 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2009/12/200912111634495201.htm</link><description><![CDATA[<p>TRUNCATE   TABLE   在功能上与不带   WHERE   子句的   DELETE   语句相同：二者均删除表中的全部行。但   TRUNCATE   TABLE   比   DELETE   速度快，且使用的系统和事务日志资源少。     <br />
    <br />
  DELETE   语句每次删除一行，并在事务日志中为所删除的每行记录一项。TRUNCATE   TABLE   通过释放存储表数据所用的数据页来删除数据，并且只在事务日志中记录页的释放。   <br />
    <br />
  TRUNCATE   TABLE   删除表中的所有行，但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值，请改用   DELETE。如果要删除表定义及其数据，请使用   DROP   TABLE   语句。   <br />
    <br />
  对于由   FOREIGN   KEY   约束引用的表，不能使用   TRUNCATE   TABLE，而应使用不带   WHERE   子句的   DELETE   语句。由于   TRUNCATE   TABLE   不记录在日志中，所以它不能激活触发器。     <br />
    <br />
  TRUNCATE   TABLE   不能用于参与了索引视图的表。  </p>]]></description></item><item><title><![CDATA[mdx技巧一个[Measures].currentmember]]></title><pubDate>Wed, 09 Dec 2009 16:24:06 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2009/12/200912091624064423.htm</link><description><![CDATA[<p>[code]sum({[Dim Material].[Material Group Code].&amp;[902], <br />
[Dim Material].[Material Group Code].&amp;[903], <br />
[Dim Material].[Material Group Code].&amp;[904], <br />
[Dim Material].[Material Group Code].&amp;[905], <br />
[Dim Material].[Material Group Code].&amp;[906], <br />
[Dim Material].[Material Group Code].&amp;[907], <br />
[Dim Material].[Material Group Code].&amp;[908], <br />
[Dim Material].[Material Group Code].&amp;[998], <br />
[Dim Material].[Material Group Code].&amp;[999]}, <br />
[Measures].currentmember)[/code]</p>
<p>注意这个： <font color="#ff0000"><strong>[Measures].currentmember</strong></font></p>]]></description></item><item><title><![CDATA[.net执行package\job的方法（思路）]]></title><pubDate>Fri, 04 Dec 2009 21:02:03 GMT</pubDate><category>C#技术</category><link>http://www.51yc.cn/html/2009/12/200912042102033907.htm</link><description><![CDATA[<p>[code]using System; <br />
using System.Collections; <br />
using System.Configuration; <br />
using System.Data; <br />
using System.Web; <br />
using System.Web.Security; <br />
using System.Web.UI; <br />
using System.Web.UI.HtmlControls; <br />
using System.Web.UI.WebControls; <br />
using System.Web.UI.WebControls.WebParts; <br />
using System.Text; <br />
using System.Data.SqlClient; <br />
using System.Threading; <br />
<br />
public partial class Do_Event : System.Web.UI.Page <br />
{ <br />
SQLHelper help = new SQLHelper(); <br />
string tableName = ""; <br />
protected void Page_Load(object sender, EventArgs e) <br />
{ <br />
string types = Request.QueryString["types"].Trim().ToString(); <br />
switch (types) <br />
{ <br />
case "0": <br />
tableName = "DingZhongLvExcelToTable"; break; //JOB名称和FeisSAPSource库LOG表里面RFC值必须一致。 <br />
case "1": <br />
tableName = "ChuYunYunFeiTongJiExcelToTable"; break; <br />
default: <br />
tableName = "DingZhongLvExcelToTable"; break; <br />
} <br />
try <br />
{ <br />
SqlConnection jobConnection; <br />
SqlCommand jobCommand; <br />
SqlParameter jobReturnValue; <br />
SqlParameter jobParameter; <br />
int jobResult; <br />
<br />
jobConnection = new SqlConnection("Data Source=(local);Initial Catalog=msdb;Integrated Security=SSPI"); <br />
//jobConnection = new SqlConnection("server=10.17.8.43;uid=sa;pwd=P@ssw0rd;Integrated Security=false"); <br />
jobCommand = new SqlCommand("sp_start_job", jobConnection); <br />
jobCommand.CommandType = CommandType.StoredProcedure; <br />
<br />
jobReturnValue = new SqlParameter("@RETURN_VALUE", SqlDbType.Int); <br />
jobReturnValue.Direction = ParameterDirection.ReturnValue; <br />
jobCommand.Parameters.Add(jobReturnValue); <br />
<br />
jobParameter = new SqlParameter("@job_name", SqlDbType.VarChar); <br />
jobParameter.Direction = ParameterDirection.Input; <br />
jobCommand.Parameters.Add(jobParameter); <br />
jobParameter.Value = tableName; //执行job名称 <br />
<br />
jobConnection.Open(); <br />
jobCommand.ExecuteNonQuery(); <br />
jobResult = (Int32)jobCommand.Parameters["@RETURN_VALUE"].Value; <br />
jobConnection.Close(); <br />
<br />
switch (jobResult) <br />
{ <br />
case 0: <br />
Do_SS(); <br />
break; <br />
default: <br />
Response.Write(0); <br />
break; <br />
} <br />
Console.Read(); <br />
} <br />
catch <br />
{ <br />
Response.Write(0); <br />
} <br />
<br />
} <br />
private string check() <br />
{ <br />
StringBuilder strSql = new StringBuilder(); <br />
strSql.Append("select DateDIFF(mi,max(Time),getDate()) as MTime"); <br />
strSql.Append(" FROM Log"); <br />
strSql.Append(" WHERE [RFC]='" + tableName + "' and Success='Y'"); <br />
DataSet ds = new DataSet(); <br />
ds = help.getdata(strSql.ToString(), "tab"); //查询出Source库中log表的RFC最新记录的时间差。单位：分钟。 <br />
int Countt = ds.Tables[0].Rows.Count; <br />
if (Countt == 1) <br />
{ <br />
string ParseID = ds.Tables[0].Rows[0]["MTime"].ToString(); <br />
return ParseID; <br />
} <br />
else <br />
{ <br />
return "101"; <br />
} <br />
<br />
} <br />
private bool BackSS(int contt) <br />
{ <br />
int CallBackNum; <br />
CallBackNum = Convert.ToInt32(check().ToString()); <br />
if (CallBackNum < 2) //控制时间差 单位：分钟 <br />
{ <br />
return true; <br />
} <br />
else <br />
{ <br />
return false; <br />
} <br />
} <br />
private void Do_SS() <br />
{ <br />
int contt = 0; <br />
int ver = 0; <br />
while (contt < 10) // 控制循环次数 <br />
{ <br />
Thread.Sleep(10000); //延迟执行 <br />
bool rValue = BackSS(contt); <br />
if (rValue == true) <br />
{ <br />
ver = 1; <br />
break; <br />
} <br />
contt++; <br />
} <br />
if (ver == 1) <br />
{ <br />
Response.Write(1); //查到条件更新记录后返回值打印到屏幕 0为job任务失败，1job任务成功且packpag执行正常，2job任务成功但Package执行超时 <br />
} <br />
else <br />
{ <br />
Response.Write(2); <br />
} <br />
<br />
} <br />
<br />
} <br />
[/code]</p>]]></description></item><item><title><![CDATA[MDX示例]]></title><pubDate>Fri, 06 Nov 2009 16:15:21 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2009/11/200911061615218783.htm</link><description><![CDATA[<p>MDX语句整理</p>
<p>基本概念: <br />
成员:属于维度,描述CUBE的维度 <br />
元组:来自CUBE的数据切片.成员向导 <br />
集合:由0,1,多个成员组成.代表范围,不代表值.</p>
<p>MDX语句基本格式: <br />
WITH <br />
MEMBER   &hellip;&hellip; <br />
&hellip;&hellip;. <br />
SET   &hellip;&hellip; <br />
&hellip;&hellip;. <br />
SELECT   {&hellip;&hellip;}   ON   COLUMNS, <br />
{&hellip;&hellip;}   ON   ROWS <br />
FROM   CUBENAME <br />
WHERE   (&hellip;&hellip;)</p>
<p>维度描述:</p>
<p>[地理维度]: 所有地理维度 <br />
北京 S1 <br />
北京 S2 <br />
上海 S3 <br />
上海 S4</p>
<p>[措施维度]: 所有措施维度 <br />
措1 C1 <br />
措1 C2 <br />
措2 C3 <br />
措2 C4</p>
<p>[时间维度]: <br />
2007 1月 <br />
2007 2月 <br />
2007 3月 <br />
2007 4月</p>
<p>TABLE1 <br />
所有地理维度 <br />
1月</p>
<p>SELECT   {[地理维度].[所有地理维度]}   ON   COLUMNS, <br />
{[时间维度].[1月]}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE2 <br />
S1 <br />
1月</p>
<p>SELECT   {[地理维度].[S1]}   ON   COLUMNS, <br />
{[时间维度].[1月]}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TALBE3 <br />
S1 S2 S3 <br />
1月</p>
<p>SELECT   {[地理维度].[S1],   [地理维度].[S2],   [地理维度].[S3]}   ON   COLUMNS, <br />
{[时间维度].[1月]}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE4 <br />
上海 <br />
1月</p>
<p>SELECT   {[地理维度].[上海]}   ON   COLUMNS, <br />
{[时间维度].[1月]}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>WITH   MEMBER   [地理维度].[AA]   AS   &lsquo;SUM({S1,S2})&rsquo; <br />
SELECT   {[地理维度].[AA]}   ON   COLUMNS, <br />
{[时间维度].[1月]}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE5 <br />
C3做切片 <br />
S1 S2 <br />
1月</p>
<p>SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{[时间维度].[1月]}   ON     ROWS <br />
FROM   [CUBENAME] <br />
WHERE   ([措施维度].[C3])</p>
<p>TABLE6 <br />
S1 S2 <br />
1月 <br />
3月</p>
<p>SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{[时间维度].[1月],   [时间维度].[3月]}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE7 <br />
S1 S2 <br />
1月 C1 <br />
3月 C1</p>
<p>SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{{[时间维度].[1月],   [时间维度].[3月]}*{[措施维度].[C1]}}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{([时间维度].[1月],   [措施维度].[C1]),(   [时间维度].[3月],   [措施维度].[C1])}   ON   ROWS   <br />
FROM   [CUBENAME]</p>
<p>TABLE8 <br />
S1 S2 <br />
1月 C1 <br />
1月 C2 <br />
3月 C1 <br />
3月 C2</p>
<p>SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{{[时间维度].[1月],   [时间维度].[3月]}*{[措施维度].[C1],   [措施维度].[C2]}}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE9 <br />
M表示度量值 <br />
S1 S2 <br />
M1 M2 M1 M2 <br />
1月 C1 <br />
C2 <br />
3月 C1 <br />
C2</p>
<p>SELECT   {{[地理维度].[S1],[地理维度].[S2]}*{[MEASURES].[M1],   [MEASURES].[M2]}}   ON   COLUMNS, <br />
{{[时间维度].[1月],   [时间维度].[3月]}*{[措施维度].[C1],   [措施维度].[C2]}}   ON     ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE10 <br />
M1 M2 <br />
1月 北京 C1 <br />
C2 <br />
上海 C1 <br />
C2 <br />
3月 北京 C1 <br />
C2 <br />
上海 C1 <br />
C2</p>
<p>SELECT   {[MEASURES].[M1],[MEASURES].[M2]}   ON   COLUMNS, <br />
{{[时间维度].[1月],[时间维度].[3月]}*{[地理维度].[北京],[地理维度].[上海]}*{[措施维度].[C1],[措施维度].[C2]}}   ON   ROWS <br />
RROM   [CUBENAME]</p>
<p>TABLE11 <br />
S1 S2 S2-S1 <br />
1月 <br />
3月</p>
<p>WITH   <br />
MEMBER   [地理维度].[AA]   AS   &lsquo;[地理维度].[S2]-[地理维度].[S1]&rsquo; <br />
SELECT   {[地理维度].[S1],[地理维度].[S2],[地理维度].[AA]}   ON   COLUMNS, <br />
{[时间维度].[1月],[时间维度].[3月]}   ON   ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE12 <br />
S1 S2 <br />
1月 <br />
3月</p>
<p>WITH   <br />
SET   [SETA]   AS   &lsquo;{[时间维度].[1月],[时间维度].[3月]}&rsquo; <br />
SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{[SETA]}   ON   ROWS <br />
FROM   [CUBENAME]</p>
<p>TABLE13 <br />
S1 S2 <br />
1月 100 102 <br />
3月 160 156</p>
<p>WITH <br />
MEMBER   [MEASURES].[AA]   AS   &lsquo;IIF(MEASURES.M1> 156,1,0)&rsquo; <br />
SELECT   {[地理维度].[S1],[地理维度].[S2]}   ON   COLUMNS, <br />
{[SETA]}   ON   ROWS <br />
FROM   [CUBENAME] <br />
WHRER   ([MEASURES].[AA])</p>
<p>IIF(MEASURES.M1> 156,&rdquo;T&rdquo;,&rdquo;F&rdquo;) <br />
参数是字符串得加双引号.</p>
<p>排序函数ORDER({[地理维度].[S1],[地理维度].[S2]},S1,BDSC)</p>
<p><br />
维度聚合属性分类: <br />
COUNT,SUM,MAX,MIN,DISTINCTCOUNT</p>
<p>CURRENTMEMBER代表当前的的成员函数.</p>
<p>MDX函数如果没有参数的话，是不应该加括号的.比如CURRENTMEMBER.</p>]]></description></item><item><title><![CDATA[常用的SQL写法]]></title><pubDate>Tue, 27 Oct 2009 15:08:56 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2009/10/200910271508569629.htm</link><description><![CDATA[<p>[code]--本周星期一 <br />
SELECT DATEADD(dd,(case @@datefirst when 7 then 2 else 2-@@datefirst end)-datepart(dw,getdate()),getdate()) <br />
--本周星期日 <br />
SELECT DATEADD(dd,6+(case @@datefirst when 7 then 2 else 2-@@datefirst end)-datepart(dw,getdate()),getdate()) <br />
--上周星期日 <br />
SELECT DATEADD(day,-(@@datefirst+datepart(weekday,getdate())-1)%7,getdate()) <br />
--格式化后的下周第一天 <br />
SELECT convert(char(10),(dateadd(dd,6+(case @@datefirst when 7 then 2 else 2-@@datefirst end)-datepart(dw,getdate()-1),getdate())),120) <br />
--本月第一天 <br />
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) <br />
--下月第一天 <br />
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate())+1, 0) <br />
--本月最后一天 <br />
SELECT DATEADD(dd, -1, DATEADD(mm, 1+ DATEDIFF(mm, 0, getdate()), 0)) <br />
--本年第一天 <br />
SELECT DATEADD(yy,DATEDIFF(yy,0,getdate()),0) <br />
--下一年第一天 <br />
SELECT DATEADD(yy,DATEDIFF(yy,0,getdate()+366),0) <br />
--格式化时间 <br />
SELECT CONVERT(CHAR(10),getdate(),120) <br />
[/code]</p>]]></description></item><item><title><![CDATA[OA之手机短信模块功能的实现]]></title><pubDate>Thu, 17 Sep 2009 10:56:55 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/09/200909171056558507.htm</link><description><![CDATA[<p>前言<br />
   短信模块功能的应用是非常多的，基本上正规点的系统都有这个功能，但是他的实现方式有好多种。<br />
用途<br />
1.可以用于OA,即时通讯,预警系统等。<br />
2.也可以写成组件,供其它模块调用,如工作流等。<br />
3.业务逻辑的及时提醒，在处理关键部分时可以通过短信发送相关信息，以确保信息安全。<br />
开发手机技术简介<br />
1.SP服务提供商.现在移动,电信,联通,都有自己的短信能服务代理公司,你只要向他们买服务,就会提供技术资料,网关和帐号.可供开发一般会有三种方法：<br />
      第一种是以API方式,提供,你只要把他们提供的DLL文件,应用在工程即可.调用其发送方法即可.我个人认为它是把对网关访问的服务给封装起来。<br />
      第二种以数据库方式，你只要安装好他们提供的引擎，配置好ODBC，在数据库中按照要求配置好上行表（接收）和下行表（发送）。往下行表写短信就会自动发送出去。<br />
      第三种类似于API的方式，通过http向指定web接口post或get一个带指定参数的请求，然后发送方处理返回指令即可。<br />
2.硬件短信猫. 可以去一些公司买短信猫，他们会提供软件和硬件，接在手机，连上电脑，即可发短信。<br />
3.一些网站的短信WebService。一些网站会提供一些服务给普通开发者，他们是免费的，好像新浪就有。需要的可以去网上查查<br />
4. 还有一种，我记不清楚了好像要用C++写一大堆代码，好复杂，我不懂。<br />
技术<br />
1.       C# 开发语言。<br />
2.       Asp.net 等类似的web语言，开发的是Web程序。<br />
3.       Ado.net 也就是写数据库。<br />
4.       短信SP 本文主要针对SP写数据库开发。<br />
应用环境<br />
   主要给公司给各部门的文员使用，发送部门内部，或对外发送，同时可以管理本部门员工的通讯录。<br />
模块功能<br />
1.       通讯录模块，主要是公司组织模块，如果有这一块就不用。<br />
2.       公司组织模块，用于群发时候选择部门或职务类别等方式使用。<br />
3.       个人通讯录模块，用于管理非公司，或自己的联络人。<br />
4.       通讯录目录权限授权<br />
5.       手机短信模块，可以发送，接受短信，<br />
6.       群发短信<br />
7.       定时发送，需要自己写。<br />
8.       短信管理，费用统计。<br />
数据库<br />
  1.组织目录表，就一树形表，用来存储组织结构的<br />
[code]CREATE TABLE [dbo].[SmsGroup]( <br />
[id] [int] IDENTITY(1,1) NOT NULL, <br />
[name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[parentID] [int] NOT NULL <br />
) [/code]<br />
 2.用户表，存储用户的，一个完整的OA系统是应该用的，不需要在这里搞。<br />
[code]CREATE TABLE [dbo].[SmsUser]( <br />
[id] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[name] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[job] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[position] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[tel] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[fix] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[fax] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[email] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[qq] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[msn] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, <br />
[status] [int] NOT NULL, <br />
<br />
) [/code]<br />
3.下行表，用来引擎扫描的表，也就是发短信的表。有一个字段是表示短信的状态的<br />
[code]CREATE TABLE [dbo].[SmsSend]( <br />
[uninstand] [uniqueidentifier] NOT NULL, <br />
[id] [decimal](18, 0) IDENTITY(1,1) NOT NULL, <br />
[to] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[content] [varchar](160) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[status] [int] NOT NULL <br />
)[/code]<br />
4.短信管理表，用来提供给用户管理已发短信的和统计短信，当然也可以点击某一条重发。呵呵！<br />
[code]CREATE TABLE [dbo].[SmsList]( <br />
[uninstand] [uniqueidentifier] NOT NULL, <br />
[to] [varchar](2000) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[date] [datetime] NOT NULL, <br />
[userID] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[status] [int] NOT NULL <br />
)[/code]<br />
5.组织和用户表，就是用来搭建组织目录树的，一个部门下面对应多少个用户的东东。<br />
[code]CREATE TABLE [dbo].[SmsGroupUser]( <br />
[groupID] [int] NOT NULL, <br />
[userID] [varchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[sysID] [int] IDENTITY(1,1) NOT NULL <br />
) <br />
[/code]<br />
6.自定义用户表，用来存储用户的自定义联络人。<br />
[code]CREATE TABLE [dbo].[SmsMyUser]( <br />
[userID] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[name] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, <br />
[sysID] [int] IDENTITY(1,1) NOT NULL, <br />
[remark] [varchar](2000) COLLATE Chinese_PRC_CI_AS NULL, <br />
[tel] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL <br />
)[/code]<br />
7.常用短语表，用来存储用户自己常用短信表<br />
[code]CREATE TABLE [dbo].[SmsWords]( <br />
[userID] [varchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[Content] [varchar](2000) COLLATE Chinese_PRC_CI_AS NOT NULL, <br />
[sysID] [int] IDENTITY(1,1) NOT NULL <br />
)[/code]<br />
还有一张表用来定时发短信的，因为sp提供的引擎没有这个功能，所以需要我自己来写，很简单的.</p>
<p>此文章是参考博客园代维雅的文章，在他文章上都做了修改和完善，另外还有其他的实现方法，后面有时间在把这个话题补充完整，如果有兴趣的朋友也可以加我QQ共同探讨。</p>]]></description></item><item><title><![CDATA[C#正则表达式小结]]></title><pubDate>Thu, 17 Sep 2009 10:31:50 GMT</pubDate><category>C#技术</category><link>http://www.51yc.cn/html/2009/09/200909171031505511.htm</link><description><![CDATA[<div id="postmessage_3300" class="t_msgfont">以下是一些常用的正则表达式，觉得实用就收藏一下吧。<br />
<br />
只能输入数字："^[0-9]*$"。<br />
只能输入n位的数字："^\d{n}$"。<br />
只能输入至少n位的数字："^\d{n,}$"。<br />
只能输入m~n位的数字：。"^\d{m,n}$"<br />
只能输入零和非零开头的数字："^(0|[1-9][0-9]*)$"。<br />
只能输入有两位小数的正实数："^[0-9]+(.[0-9]{2})?$"。<br />
只能输入有1~3位小数的正实数："^[0-9]+(.[0-9]{1,3})?$"。<br />
只能输入非零的正整数："^\+?[1-9][0-9]*$"。<br />
只能输入非零的负整数："^\-[1-9][]0-9"*$。<br />
只能输入长度为3的字符："^.{3}$"。<br />
<br />
只能输入由26个英文字母组成的字符串："^[A-Za-z]+$"。<br />
只能输入由26个大写英文字母组成的字符串："^[A-Z]+$"。<br />
只能输入由26个小写英文字母组成的字符串："^[a-z]+$"。<br />
只能输入由数字和26个英文字母组成的字符串："^[A-Za-z0-9]+$"。<br />
只能输入由数字、26个英文字母或者下划线组成的字符串："^\w+$"。<br />
<br />
验证用户密码："^[a-zA-Z]\w{5,17}$"正确格式为：以字母开头，长度在6~18之间，只能包含字符、数字和下划线。<br />
验证是否含有^%&amp;',;=?$\"等字符："[^%&amp;',;=?$\x22]+"。<br />
只能输入汉字："^[\u4e00-\u9fa5]{0,}$"<br />
验证Email地址："^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。<br />
验证InternetURL："^http://([\w-]+\.)+[\w-]+(/[\w-./?%&amp;=]*)?$"。<br />
验证电话号码："^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正确格式为："XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。<br />
验证身份证号（15位或18位数字）："^\d{15}|\d{18}$"。<br />
验证一年的12个月："^(0?[1-9]|1[0-2])$"正确格式为："01"～"09"和"1"～"12"。<br />
验证一个月的31天："^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为；"01"～"09"和"1"～"31"。 <br />
<br />
利用正则表达式限制网页表单里的文本框输入内容：<br />
用正则表达式限制只能输入中文： <br />
用正则表达式限制只能输入全角字符：  <br />
用正则表达式限制只能输入数字：<br />
用正则表达式限制只能输入数字和英文：<br />
得用正则表达式从URL地址中提取文件名的javascript程序，如下结果为page1<br />
s="http://www.janbao.net"<br />
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")<br />
alert(s)<br />
匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />
应用：计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br />
String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}<br />
匹配空行的正则表达式：\n[\s| ]*\r<br />
匹配HTML标记的正则表达式：/<(.*)>.*<\/\1>|<(.*) \/>/<br />
匹配首尾空格的正则表达式：(^\s*)|(\s*$)<br />
String.prototype.trim = function()<br />
{<br />
    return this.replace(/(^\s*)|(\s*$)/g, "");<br />
}<br />
<br />
利用正则表达式分解和转换IP地址：<br />
下面是利用正则表达式匹配IP地址，并将IP地址转换成对应数值的Javascript程序：<br />
function IP2V(ip)<br />
{<br />
  re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匹配IP地址的正则表达式 <br />
if(re.test(ip))<br />
{<br />
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1<br />
}<br />
else<br />
{<br />
  throw new Error( "Not a valid IP address!")<br />
}<br />
}<br />
不过上面的程序如果不用正则表达式，而直接用split函数来分解可能更简单，程序如下：<br />
var ip="10.100.20.168"<br />
ip=ip.split(".")<br />
alert("IP值是："+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))<br />
符号解释：<br />
字符 描述 <br />
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。<br />
   例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 <br />
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。 <br />
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。 <br />
* 匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 <br />
+ 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。 <br />
? 匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 <br />
{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。 <br />
{n,} n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 <br />
{n,m} m 和 n 均为非负整数，其中n <= m。最少匹配 n 次且最多匹配 m 次。例如，"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 <br />
? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 "oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。 <br />
. 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。 <br />
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0&hellip;$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。 <br />
(?:pattern) 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 <br />
(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 <br />
(?!pattern) 负向预查，在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 <br />
x|y 匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 <br />
[xyz] 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。 <br />
[^xyz] 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。 <br />
[a-z] 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 <br />
[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 <br />
\b 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。 <br />
\B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。 <br />
\cx 匹配由 x 指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 <br />
\d 匹配一个数字字符。等价于 [0-9]。 <br />
\D 匹配一个非数字字符。等价于 [^0-9]。 <br />
\f 匹配一个换页符。等价于 \x0c 和 \cL。 <br />
\n 匹配一个换行符。等价于 \x0a 和 \cJ。 <br />
\r 匹配一个回车符。等价于 \x0d 和 \cM。 <br />
\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 <br />
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 <br />
\t 匹配一个制表符。等价于 \x09 和 \cI。 <br />
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 <br />
\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 <br />
\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 <br />
\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如，'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。. <br />
\num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 <br />
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为向后引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 <br />
\nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式，则 nm 为向后引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 <br />
\nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 <br />
\un 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。</div>]]></description></item><item><title><![CDATA[淘宝已上架产品下架倒计时转换成准确的下架时间。]]></title><pubDate>Sat, 12 Sep 2009 13:58:12 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/09/200909121358120302.htm</link><description><![CDATA[<p>淘宝已上架的产品都是按倒计时来计算下架时间的，这就有点困难了。几天还好说，小时和分钟就不那么好算了。</p>
<p>为了方便以后能直接查看特地做了这么个小程序。</p>
<p>日期格式一定要按说明的来，否则会报错了。</p>
<p>我这个算法是比较笨的了，相信别的还有更好的算法。<br />
<br />
[html]<style type="text/css"> [/n]body,td,th { [/n] font-size: 12px; [/n]} [/n]#now{ color:#FF0000;} [/n]#ss{background:#FFFFCC;border:#FF6600 1px solid; padding:10px; margin:auto 200px;} [/n]</style> [/n] [/n]<script language="javascript"> [/n]Date.prototype.dateAdd = function(interval,number) [/n]{ [/n]var d = this; [/n]var k={"y":"FullYear", "q":"Month", "m":"Month", "w":"Date", "d":"Date", "h":"Hours", "n":"Minutes", "s":"Seconds", "ms":"MilliSeconds"}; [/n]var n={"q":3, "w":7}; [/n]eval("d.set"+k[interval]+"(d.get"+k[interval]+"()+"+((n[interval]||1)*number)+")"); [/n]return d; [/n]}; [/n]function cc() [/n]{ [/n]document.getElementById("times").value="0天0时0分"; [/n]document.getElementById("ss").innerHTML=""; [/n]document.getElementById("ss").style.visibility ="hidden" [/n]} [/n]function Msg(ttt) [/n]{ [/n]document.getElementById("ss").style.visibility ="visible" [/n]document.getElementById("ss").innerHTML=ttt; [/n]} [/n]function chk() [/n]{ [/n]var now= new Date(); [/n]var s; [/n]s = document.getElementById("times"); [/n]s=s.value; [/n]var s = s.split("天"); [/n] a_1=s[0]; [/n] s= s[1].split("时"); [/n]var a_2=s[0]; [/n] s= s[1].split("分"); [/n]var a_3=s[0]; [/n] [/n]if (Number(a_1)>13) [/n] { [/n] Msg("错误：淘宝产品上架时间不超过14天！"); [/n] return; [/n] } [/n]else if(Number(a_2)==24&amp;&amp;Number(a_3)>0) [/n] { [/n] Msg("错误：时间不正确，&ldquo;小时&rdquo;不能大于24。且等于24的时候，分只能为0！"); [/n] return; [/n] } [/n]else if(Number(a_2)>24) [/n] { [/n] Msg("错误：时间不正确，&ldquo;小时&rdquo;不能大于24。且等于24的时候，分只能为0！"); [/n] return; [/n] } [/n]else if(Number(a_3)>=60) [/n] { [/n] Msg("错误：时间不正确，&ldquo;分&rdquo;只能小于60。"); [/n] return; [/n] } [/n]else if(Number(a_3)<0||Number(a_1)<0||Number(a_2)<0) [/n] { [/n] Msg("错误：不能为负数！"); [/n] return; [/n] } [/n]a_1=a_1*24*60; [/n]a_2=a_2*60; [/n]a_4=eval(Number(a_1)+Number(a_2)+Number(a_3)); [/n]var d1 = new Date(); [/n]a_4=d1.dateAdd("n" ,Number(a_4)).toLocaleString(); [/n]//document.all.e_times.value=a_1+"|"+a_2+"|"+a_3+"|"+a_4; [/n] Msg("淘宝产品下架时间为：<b>"+a_4+"</b>"); [/n]} [/n] [/n]window.onload = function(){showlocaltime();} [/n] [/n]function showlocaltime(){ [/n] [/n] var now = new Date(); [/n] [/n] var _day = new Array(7); [/n] [/n] _day[0]='日'; [/n] [/n] _day[1]='一'; [/n] [/n] _day[2]='二'; [/n] [/n] _day[3]='三'; [/n] [/n] _day[4]='四'; [/n] [/n] _day[5]='五'; [/n] [/n] _day[6]='六'; [/n] [/n] [/n] [/n] var hours = now.getHours(); [/n] [/n] var minutes = now.getMinutes(); [/n] [/n] var seconds = now.getSeconds(); [/n] [/n] var timezone= now.getTimezoneOffset()/60; [/n] [/n] if (timezone == 0) [/n] [/n] { var timeValue = "格林尼治";} [/n] [/n] else [/n] [/n] { var timeValue = ((timezone < 0)? " 东"+(-1)*timezone : " 西"+timezone) +'区';} [/n] [/n] [/n] [/n] timeValue += '时间：' [/n] [/n] +eval(now.getYear())+' 年' [/n] [/n] +eval(now.getMonth()+1)+'月' [/n] [/n] +now.getDate()+'日 星期' [/n] [/n] +_day[now.getDay()]+' '+hours; [/n] [/n] [/n] [/n] timeValue += ((minutes < 10) ? ":0" : ":") + minutes; [/n] [/n] timeValue += ((seconds < 10) ? ":0" : ":") + seconds+" "; [/n] [/n] document.getElementById("now").innerText = timeValue ; [/n] timerID = setTimeout("showlocaltime()",1000); [/n] timerRunning = true; [/n] [/n]} [/n]</script> [/n]<title>淘宝产品下架日期倒计时转换程序</title><center> [/n]<strong>淘宝产品下架日期倒计时转换程序</strong>
[/n]
[/n]<DIV id="now"></DIV> [/n]
[/n]
[/n]<input name="times" type="text" id="times" value="0天0时0分" /> [/n]<br/>(格式一定为<font color=red>*天*时*分</font> ，比如3小时后表示为: 0天3时0分 )<br/>
<input name="tt" type="button" id="tt" value="计 算" onclick="chk();"/> <input name="cc" type="button" id="cc" value="清 空" onclick="cc();"/> [/n]<br/><br/>
[/n]<div id="ss" style="visibility:hidden;"></div> [/n]
[/n]</br> [/n]</br> [/n]--------by DU JING WEI [/n]</center>[/html]<br />
<br />
以下为程序代码：<br />
<br />
[code]<style type="text/css"> <br />
body,td,th { <br />
font-size: 12px; <br />
} <br />
#now{ color:#FF0000;} <br />
#ss{background:#FFFFCC;border:#FF6600 1px solid; padding:10px; margin:auto 200px;} <br />
</style> <br />
<br />
<script language="javascript"> <br />
Date.prototype.dateAdd = function(interval,number) <br />
{ <br />
var d = this; <br />
var k={"y":"FullYear", "q":"Month", "m":"Month", "w":"Date", "d":"Date", "h":"Hours", "n":"Minutes", "s":"Seconds", "ms":"MilliSeconds"}; <br />
var n={"q":3, "w":7}; <br />
eval("d.set"+k[interval]+"(d.get"+k[interval]+"()+"+((n[interval]||1)*number)+")"); <br />
return d; <br />
}; <br />
function cc() <br />
{ <br />
document.getElementById("times").value="0天0时0分"; <br />
document.getElementById("ss").innerHTML=""; <br />
document.getElementById("ss").style.visibility ="hidden" <br />
} <br />
function Msg(ttt) <br />
{ <br />
document.getElementById("ss").style.visibility ="visible" <br />
document.getElementById("ss").innerHTML=ttt; <br />
} <br />
function chk() <br />
{ <br />
var now= new Date(); <br />
var s; <br />
s = document.getElementById("times"); <br />
s=s.value; <br />
var s = s.split("天"); <br />
a_1=s[0]; <br />
s= s[1].split("时"); <br />
var a_2=s[0]; <br />
s= s[1].split("分"); <br />
var a_3=s[0]; <br />
<br />
if (Number(a_1)>13) <br />
{ <br />
Msg("错误：淘宝产品上架时间不超过14天！"); <br />
return; <br />
} <br />
else if(Number(a_2)==24&amp;&amp;Number(a_3)>0) <br />
{ <br />
Msg("错误：时间不正确，&ldquo;小时&rdquo;不能大于24。且等于24的时候，分只能为0！"); <br />
return; <br />
} <br />
else if(Number(a_2)>24) <br />
{ <br />
Msg("错误：时间不正确，&ldquo;小时&rdquo;不能大于24。且等于24的时候，分只能为0！"); <br />
return; <br />
} <br />
else if(Number(a_3)>=60) <br />
{ <br />
Msg("错误：时间不正确，&ldquo;分&rdquo;只能小于60。"); <br />
return; <br />
} <br />
else if(Number(a_3)<0||Number(a_1)<0||Number(a_2)<0) <br />
{ <br />
Msg("错误：不能为负数！"); <br />
return; <br />
} <br />
a_1=a_1*24*60; <br />
a_2=a_2*60; <br />
a_4=eval(Number(a_1)+Number(a_2)+Number(a_3)); <br />
var d1 = new Date(); <br />
a_4=d1.dateAdd("n" ,Number(a_4)).toLocaleString(); <br />
//document.all.e_times.value=a_1+"|"+a_2+"|"+a_3+"|"+a_4; <br />
Msg("淘宝产品下架时间为：<b>"+a_4+"</b>"); <br />
} <br />
<br />
window.onload = function(){showlocaltime();} <br />
<br />
function showlocaltime(){ <br />
<br />
var now = new Date(); <br />
<br />
var _day = new Array(7); <br />
<br />
_day[0]='日'; <br />
<br />
_day[1]='一'; <br />
<br />
_day[2]='二'; <br />
<br />
_day[3]='三'; <br />
<br />
_day[4]='四'; <br />
<br />
_day[5]='五'; <br />
<br />
_day[6]='六'; <br />
<br />
<br />
<br />
var hours = now.getHours(); <br />
<br />
var minutes = now.getMinutes(); <br />
<br />
var seconds = now.getSeconds(); <br />
<br />
var timezone= now.getTimezoneOffset()/60; <br />
<br />
if (timezone == 0) <br />
<br />
{ var timeValue = "格林尼治";} <br />
<br />
else <br />
<br />
{ var timeValue = ((timezone < 0)? " 东"+(-1)*timezone : " 西"+timezone) +'区';} <br />
<br />
<br />
<br />
timeValue += '时间：' <br />
<br />
+eval(now.getYear())+' 年' <br />
<br />
+eval(now.getMonth()+1)+'月' <br />
<br />
+now.getDate()+'日 星期' <br />
<br />
+_day[now.getDay()]+' '+hours; <br />
<br />
<br />
<br />
timeValue += ((minutes < 10) ? ":0" : ":") + minutes; <br />
<br />
timeValue += ((seconds < 10) ? ":0" : ":") + seconds+" "; <br />
<br />
document.getElementById("now").innerText = timeValue ; <br />
timerID = setTimeout("showlocaltime()",1000); <br />
timerRunning = true; <br />
<br />
} <br />
</script> <br />
<title>淘宝产品下架日期倒计时转换程序</title><center> <br />
<strong>淘宝产品下架日期倒计时转换程序</strong>
<br />

<br />
<DIV id="now"></DIV> <br />

<br />

<br />
<input name="times" type="text" id="times" value="0天0时0分" /> <br />
<br/>(格式一定为<font color=red>*天*时*分</font> ，比如3小时后表示为: 0天3时0分 )<br/>
<input name="tt" type="button" id="tt" value="计 算" onclick="chk();"/> <input name="cc" type="button" id="cc" value="清 空" onclick="cc();"/> <br />
<br/><br/>
<br />
<div id="ss" style="visibility:hidden;"></div> <br />

<br />
</br> <br />
</br> <br />
--------by DU JING WEI <br />
</center>[/code]<br />
<br />
还可以到这里预览：<a href="http://www.51yc.cn//QT/Taobao_Time.html">http://www.51yc.cn//QT/Taobao_Time.html</a></p>]]></description></item><item><title><![CDATA[监控系统中的各种干扰解决大全~~实用哦，不看后悔！]]></title><pubDate>Tue, 18 Aug 2009 00:09:23 GMT</pubDate><category>网站运维</category><link>http://www.51yc.cn/html/2009/08/200908180009237787.htm</link><description><![CDATA[<div class="t_msgfont" id="postmessage_384383">1. 木纹状的干扰 <br />
<br />
　　这种干扰的出现，轻微时不会淹没正常图像，而严重时图像就无法观看了(甚至破坏同步)。这种故障现象产生的原因较多也较复杂。大致有如下几种原因：　<br />
（1）视频<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E4%BC%A0%E8%BE%93">传输</span>线的质量不好，特别是屏蔽性能差（屏蔽网不是质量很好的铜线网，或屏蔽网过稀而起不到屏蔽作用）。与此同时，这类视频线的线电阻过大，因而造成信号产生较大衰减也是加重故障的原因。此外，这类视频线的特性阻抗不是75&Omega;以及参数超出规定也是产生故障的原因之一。由于产生上述的干扰现象不一定就是视频线不良而产生的故障，因此这种故障原因在判断时要准确和慎重。只有当排除了其它可能后，才能从视频线不良的角度去考虑。若真是电缆质量问题，最好的办法当然是把所有的这种电缆全部换掉，换成符合要求的电缆，这是彻底<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%A7%A3%E5%86%B3">解决</span>问题的最好办法。　<br />
（2）由于供电<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%B3%BB%E7%BB%9F">系统</span>的电源不&ldquo;洁净&rdquo;而引起的。这里所指的电源不&ldquo;洁净&rdquo;，是指在正常的电源（50周的正弦波）上叠加有干扰信号。而这种电源上的干扰信号，多来自本电网中使用可控硅的设备。特别是大电流、高电压的可控硅设备，对电网的污染非常严重，这就导致了同一电网中的电源不&ldquo;洁净&rdquo;。比如本电网中有大功率可控硅调频调速装置、可控硅整流装置、可控硅交直流变换装置等等，都会对电源产生污染。 这种情况的解决方法比较简单，只要对整个系统采用净化电源或在线UPS供电就基本上可以得到解决。 <br />
（3）系统附近有很强的干扰源。这可以通过调查和了解而加以判断。如果属于这种原因，解决的办法是加强<strong><a href="http://www.huakaida.com/Product27.asp" target="_blank"><strong><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E6%91%84%E5%83%8F%E6%9C%BA">摄像机</span></strong></a></strong>的屏蔽，以及对视频电缆线的管道进行接地处理等。　<br />
　<br />
2. 较深较乱的大面积网纹干扰　<br />
　　严重时图像全部被破坏，形不成图像和同步信号，这种故障是由于视频电缆线的芯线与屏蔽网短路、断路造成的。这种情况多出现在BNC接头或其它类型的视频接头上。即这种故障现象出现时，往往不会是整个系统的各路信号均出问题，而仅仅出现在那些接头不好的路数上。只要认真逐个检查这些接头，就可以解决。<br />
　　<br />
3. 若干条间距相等的竖条干扰　<br />
　　干扰信号的频率基本上是行频的整数倍，这是由于视频传输线的特性阻抗不是75&Omega;而导致阻抗失配造成的。也可以说，产生这种干扰现象是由视频电缆的特性阻抗和分布参数都不符合要求综合引起的。解决的方法一般靠&ldquo;始端串接电阻&rdquo;或&ldquo;终端并接电阻&rdquo;的方法去解决。另外，值得注意的是，在视频传输距离很短时（一般为 150米以内），使用上述阻抗失配和分布参数过大的视频电缆不一定会出现上述的干扰现象。解决上述问题的根本办法是在<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E9%80%89%E8%B4%AD">选购</span>视频电缆时，一定要保证质量。必要时应对电缆进行抽样检测。　<br />
<br />
4. 由传输线引入的空间辐射干扰　<br />
　　这种干扰现象的产生，多数是因为在传输系统、系统前端或中心控制室附近有较强的、频率较高的空间辐射源。这种情况的解决办法一个是在系统建立时，应对周边环境有所了解，尽量设法避开或远离辐射源；另一个办法是当无法避开辐射源时，对前端及中心设备加强屏蔽，对传输线的管路采用钢管并良好接地。<br />
<br />
<strong><a href="http://www.huakaida.com/Product27.asp" target="_blank"><strong><span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E7%9B%91%E6%8E%A7%E6%91%84%E5%83%8F%E6%9C%BA">监控摄像机</span></strong></a></strong>如何才能提高抗干扰能力：<br />
<br />
由于监控摄像机一般采用最常用的传输方式是视频基带传输（基带传输是指不需经过频率变换等任何处理而直接传送电视信号的方式）。这种传输方式的优点是传输系统构架简单，在一定范围内，失真小、噪声低（系统信噪比高）；缺点是传输距离不能太远，必须在线缆特性要求的范围内传输，并且一根视频同轴电缆同时只能传送一路电视信号。 <br />
由于这种传输方式具有稳定性高，系统中使用的设备简单，布线方便等优点，因而在现实生活中得到了广泛的应用。但是线缆高带宽和实际低频率的使用，造成信号在电缆中传输时，其振幅及相位在低频段与高频段的差别就会很大，特别是在相位失真太大时，便难以用简单的电路进行补偿的。以及基带传输低频部分很容易受到强电、发射塔、基站、电动机、变频器等干扰源的干扰。 比如<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%B7%A5%E7%A8%8B">工程</span>中常见的干扰源： <br />
<br />
1、广播干扰： <br />
电缆在空中架设时，这时电缆本身就相当于一根很长的天线。由于天线效应的结果，电缆中会产生相当大的广播干扰电压，并在电缆外皮上产生干扰电流，这一电流通过电缆两端接地点与地构成回路，于是在终端负载上就会产生广播干扰信号的电压，使干扰信号混入视频信号中。这种干扰信号在图像上表现为较密的横纹、竖纹、斜纹等，严重时甚至会淹没整个视频图象。 <br />
<br />
2、高频干扰： <br />
电缆屏蔽层对于频率越低的信号其屏蔽效果越差，由于这种原因而引入的高频干扰信号有载波电话，电台的信号等。它们在图像上造成水平条纹的干扰。 <br />
<br />
3、电源干扰： <br />
当系统需要始端与末端同时接地时，由于两端接地电位不同及电缆外皮电阻的存在，在两地之间引起50Hz的地电位差，从而产生干扰信号电压。当干扰信号被叠加在视频信号上时，使正常图像上出现很宽的横暗带等。 <br />
<br />
4、谐波干扰： <br />
谐波干扰主要表现在大电流或高电压的电力线周围，是电力电缆向四周的辐射信号，其频率为2500Hz和125000Hz，主要干扰视频信号的低频段。 <br />
<br />
5、传输线路干扰： <br />
视频线缆质量不好，屏蔽性能差（屏蔽层稀疏或非铜介质屏蔽层等），线缆电阻过大，而造成的视频信号严重衰减等。 <br />
6、不洁净电源干扰： <br />
<br />
比如本电网中有大功率可控硅调频调速装置、可控硅整流装置、可控硅交直流变换装置等，都会对电源产生污染。不洁净电源使<strong><a href="http://www.huakaida.com/Product.asp" target="_blank"><strong>摄像机</strong></a></strong>和其它有源设备工作不稳定，进而形成干扰。 <br />
以上几个部分使得现场的视频图像受到强烈干扰，我们用SHWIT品牌多款的视频抗干扰器能够很好的解决以上多种干扰。具体解决方法如下： <br />
<br />
1、移频：采用移频技术将视频信号（0-6MHZ）移频至一个49-300MHZ范围内；视频信号经过抗干扰器发送端进行远距离传输，在接收端将信号还原成正常的视频信号输出。由于提高了频率，所以在远距离传输的同时有效躲避了多种干扰信号； <br />
2、编码：视频信号进入抗干扰器后进行数字编码处理，到达监控中心设备前再进行解码处理。从而避免干扰源对视频信号的干扰和视频信号自身的串扰及衰减； <br />
3、增强： 由于所有的信号传输距离越远信号衰减越大，因此我们必须在发送端对信号载体能力进行加强，以便于它可以传输的更远； <br />
4、自适应：在设备内部含有对信号强度的自动调整和适应<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%8A%9F%E8%83%BD">功能</span>，因此设备具有0距离到其最远距离的传输自动适应能力； <br />
5、免调试： 一个好的设备不应该有很多的调试部分，因此我们的设备在出厂时已经具备了90%的市场适应性，基本上是连接上就可以使用，无需多余的调试； <br />
6、安全性： 宽电压（12V&mdash;24V）的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E8%AE%BE%E8%AE%A1">设计</span>理念，避免瞬间电源电压的突增或突降烧坏设备，用以保护设备以及操作人的安全； <br />
7、稳定性： 设备出厂前的长时间的老化和测试试验，以及对工程的监视结果统计，本产品可以实现全天候的连续使用，并能够满足长期稳定的工作要求。</div>]]></description></item><item><title><![CDATA[网站开发架构设计要求]]></title><pubDate>Wed, 29 Jul 2009 11:03:54 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/07/200907291103546372.htm</link><description><![CDATA[<p align="left">网站文件名：</p>
<p align="left"><br />
1、 网站文件名以标准英文单词描述业务内容。如果1个英文单词无法描述，可以增加2个或者3个，但尽量为完全单词，例如article.aspx/ articleView.aspx /    articleList.aspx 等。</p>
<p>2、 文件名尽量不用数字描述。<br />
3、 文件名尽量不能太长，以不超过20个字母为宜。<br />
4、 图片文件名尽量描述图片内容分类。尽量以btn,menu,title,arrow,line,dotline,bg等前缀命名。例如：<br />
Btn_friendlinks.gif / title_contactus.gif<br />
5、 禁止采用.inc等对include文件命名，此文件名可下载，不利安全。有动态内容的文件，都要采用<br />
开发技术命名。例如：dbconn.inc.aspx / index.lang.aspx。<br />
6、 虽然可能在不同文件夹，尽量不要产生同名文件。例如：modules/index.aspx language/index.aspx<br />
对设计师的要求：<br />
1、 图片文件的保存。网站页面设计者在切图后把图片分类，有文字的图片放到language/语言/images/文件夹下。没有文字的图片放到templates/当前网站名/images/文件夹下。<br />
2、 CSS样式文件的保存。网站设计最少2个CSS文件，一个是language/语言/下langStyle.css 文件。此css文件负责语言转换后文字大小，字体的定义。另外的css 文件保存在templates/当前网站名/styles文件夹下，此类css为页面布局显示作用。<br />
3、 Media文件的保存。Swf文件等常用media文件可以同图片文件保存一样。但要分有文字和无文字。<br />
4、 页面文件的保存。所有页面文件均保存在templates/当前网站名/目录下，不分子目录，文件扩展名为.HTML或者.tpl.aspx / .tpl.php 等。链接统一采用一种绝对或者相对，不能混用。<br />
5、 文件名按照第二点说明命名，不需要提取inc等文件。如果设计师修改了公共部分，可以注明以哪个文件为准。<br />
对程序员的要求：<br />
1、 模块化编程，采用显示层/控制层/数据层分层开发。模块设计时考虑可重用性，方便应用于别的项目。<br />
2、 基于类的编程，增加代码可重用性，可阅读性。<br />
3、 注释清晰，方便后续开发人员修改。<br />
4、 HTML的模版读取，控制模块分类，数据操作等要思路清晰，不能混淆。<br />
5、 基于多语言，多模版的开发思路，方便网站升级，改版，功能扩展和移植。<br />
其他说明：<br />
1、 网站后台管理功能也适用于上述架构，当然可以取消模版功能设计部分。<br />
2、 HTML的针对搜索引擎的亲和设计，DIV+CSS布局设计，就是要看设计者的综合技能了。<br />
3、 程序员对交互内容传输安全性的考虑。可以引用SSL技术来加密传输敏感数据，也可以采用Javascript加密+后台脚本解密，交换秘钥方式发送接收加密数据，这样的方案成本低，速度快。<br />
4、 程序员对防止SQL注入攻击，暴力破解的代码防范，upload功能的漏洞检测等。<br />
5、 技术隐藏实现和URLRewrite的应用。IIS下URLRewrite应用或者隐藏扩展名的开发部署。<br />
6、 本架构输出是基于功能动作访问的不是基于页面访问的。例如：访问会员资料修改以前是直接访问/member/infoModify.aspx。而本架构是通过 /cmd?act=memberModify 访问。<br />
7、 Components目录和Modules目录的区别。Components组件目录通常保存完全独立的完全可移植的功能组件，例如vote投票，counts统计,editor通用HTML编辑器等等。而Modules多为网站业务层的，移植性较差，相当于网站栏目，功能离散复杂。也可以理解为开发了组件，可以兼容各种网站；而模块必须为独立业务逻辑服务</p>
<script type="text/javascript">function forumhottag_callback(data){ tags = data; }</script>
<script src="cache/hottags_forum_cache_jsonp.txt" type="text/javascript"></script>
<script type="text/javascript">parsetag();</script>]]></description></item><item><title><![CDATA[弹出层定位控制。]]></title><pubDate>Mon, 27 Jul 2009 13:56:01 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2009/07/200907271356017966.htm</link><description><![CDATA[<p>[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> [/n]<html xmlns="http://www.w3.org/1999/xhtml"> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> [/n]<title>无标题文档</title> [/n]</head> [/n]<style type="text/css"> [/n]#msgBox{position:relative;} [/n]#remind{background-color:#FF6600; width:620px; position:absolute; padding:5px;clear:both;} [/n]#remind_c{background-color: #FFFFCC; height:135px; float:left;} [/n]#remind_close{ position:relative; width:60px; float:right;} [/n]#remind_text{ position: relative; margin:25px 10px; color:#666666;} [/n]#remind_input{ margin:auto 10px;} [/n].remind_input_1{ width:450px;} [/n].remind_input_2{ width:105px;} [/n]</style> [/n] [/n]<script type="text/javascript"> [/n] [/n]function $(i){ return document.getElementById(i); } [/n] [/n]function alertMsg(evt){ [/n] var _event = evt ? evt : evt.event; [/n] var _p = $("msgBox"); [/n] var host_url=window.location.href; [/n] var divx; [/n] var divy; [/n] show("msgBox",false); [/n] _p.style.top =_event.clientY + document.body.scrollTop-270+'px'; [/n] _p.style.left = _event.clientX + document.body.scrollLeft-50+'px'; [/n] //alert(_event.clientY+'|'+_event.clientX); [/n] //alert(divx); [/n] show("msgBox",true); [/n] _p.focus(); [/n] //alert(host_url); [/n] $("remind_url").value=host_url; [/n] [/n]} [/n] [/n] [/n] [/n]function hideMsg(evt){ [/n] var _event = evt ? evt : evt.event; [/n] show("msgBox",false); [/n]} [/n]function show(obj,ifShow){ [/n] obj = (typeof(obj) == "string" ? $(obj) : obj); [/n] if(obj) obj.style.display = (ifShow ? "block" : "none"); [/n]} [/n] [/n]/////////////////////////////////////////////////////// [/n]function copyToClipBoard(a) [/n]{ [/n] var txt=document.getElementById(a); [/n] //var str_name=document.getElementById(b); [/n]if(window.clipboardData) { [/n]window.clipboardData.clearData(); [/n]window.clipboardData.setData("Text",txt.value); [/n]alert("Success！"); [/n]//alert("已复制&ldquo;"+str_name.value+"&rdquo;号码："+txt.value) [/n]} else if(navigator.userAgent.indexOf("Opera")!= -1) { [/n]window.location = txt; [/n]} else if (window.netscape) { [/n]try { [/n]netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); [/n]} catch (e) { [/n]alert("您的firefox安全限制限制您进行剪贴板操作，请打开'about:config'将signed.applets.codebase_principal_support'设置为true'之后重试,因为firefox默认情况下是不支持脚本操作剪切板的。") [/n]return false; [/n]} [/n]var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard); [/n]if (!clip) [/n]return; [/n]var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable); [/n]if (!trans) [/n]return; [/n]trans.addDataFlavor('text/unicode'); [/n]var str = new Object(); [/n]var len = new Object(); [/n]var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString); [/n]var copytext = txt; [/n]str.data = copytext; [/n]trans.setTransferData("text/unicode",str,copytext.length*2); [/n]var clipid = Components.interfaces.nsIClipboard; [/n]if (!clip) [/n]return false; [/n]clip.setData(trans,null,clipid.kGlobalClipboard); [/n]} [/n]else [/n] {alert("你的浏览器不是常用浏览器，不能正常使用剪贴板功能！");} [/n]} [/n]</script> [/n]<body> [/n] [/n]
[/n]
[/n]
[/n]<br/><br/><br/>
[/n]<br/><br/><br/><br/><br/><br/>
[/n]<a id=code:showbox onclick="alertMsg(event)">测试打开</a> [/n] [/n]<DIV id="msgBox" style="display:none"> [/n] <DIV id="remind"> [/n] <DIV id="remind_c"> [/n] <DIV id="remind_close"><a id=code:showbox_c onclick="hideMsg(event)"><font color="#FF6600"><b>X</b></font> close</a></DIV> [/n] <DIV id="remind_text">If you think this product is true, please copy the following Web site after MSN, Email, etc. do you recommend to friends. We express our sincere thanks!</DIV> [/n] <DIV id="remind_input"> [/n] <input type="text" class="remind_input_1" id="remind_url" value=""/> [/n] <input type="button" class="remind_input_2" id="00" value="Copy url" onclick="copyToClipBoard('remind_url');"/> [/n] </DIV> [/n] </DIV> [/n] </DIV> [/n]</DIV> [/n]</body> [/n]</html> [/n][/html]</p>
<p>比较常用的，写个来放着。拿去改改就可以用啦。</p>]]></description></item><item><title><![CDATA[DOS命令：subst]]></title><pubDate>Wed, 22 Jul 2009 08:16:26 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/07/200907220816267697.htm</link><description><![CDATA[<p>DOS命令；</p>
<div class="spctrl"> </div>
<p>　　subst：路径替换 ，将路径与驱动器号关联，就是把一个目录当作一个磁盘驱动器来看，不过不能格式化；</p>
<div class="spctrl"> </div>
<p>　　<strong>Makefile 里的subst</strong></p>
<div class="spctrl"> </div>
<p>　　用法是$(subst FROM,TO,TEXT),即将TEXT中的东西从FROM变为TO</p>
<p><strong>命令介绍</strong></p>
<p>Subst是DOS下的一个优秀的命令，对于Windows98,它的可执行文件Subst．exe在C:＼Windows＼Command文件夹下，</p>
<div class="spctrl"> </div>
<p>　　而Windows XP及以后版本应该在C:\Windows\System32文件夹下，</p>
<div class="spctrl"> </div>
<p>　　其正规的中文名称应该是&ldquo;给目录赋驱动器符命令&rdquo;。</p>
<div class="spctrl"> </div>
<p>　　它的功能是以磁盘驱动器符代替路径名称，以使驱动器符与指定的子目录路径等效。</p>
<div class="spctrl"> </div>
<p>　　其命令格式很简单：SubstDrive1Drive2Path，</p>
<div class="spctrl"> </div>
<p>　　其中&ldquo;Drive1&rdquo;是指定替代磁盘路径的虚拟的新驱动器符，</p>
<div class="spctrl"> </div>
<p>　　&ldquo;Drive2Path&rdquo;是指定所要替代的文件夹及其路径。</p>
<div class="spctrl"> </div>
<p>　　用户可以利用它将任意目录虚拟成一个磁盘驱动器，</p>
<div class="spctrl"> </div>
<p>　　如果用户需要删除虚拟的盘符，可以执行SubstDrive1／D命令。</p>
<div class="spctrl"> </div>
<p>　　同时，并非所有的程序都可以正确使用Subst命令所生成的驱动器符，</p>
<div class="spctrl"> </div>
<p>　　比如Format、Sys、Fdisk等一些如今还常用的命令，这些命令必须使用真实的驱动器，</p>
<div class="spctrl"> </div>
<p>　　它们拒绝对Subst虚拟的驱动器进行操作。对于网络磁盘驱动器，Subst命令也是无能为力的</p>
<p><strong>用法格式</strong></p>
<p>一、subst [盘符] [路径]　将指定的路径替代盘符，该路径将作为驱动器使用</p>
<div class="spctrl"> </div>
<p>　　二、subst /d　解除替代</p>
<div class="spctrl"> </div>
<p>　　[例子] C:\DOS>subst a: c:\temp 用c盘temp目录替代a盘</p>
<div class="spctrl"> </div>
<p>　　C:\>subst a: /d　解除替代</p>
<div class="spctrl"> </div>
<p>　　SUBST [drive1: [drive2:]path]</p>
<div class="spctrl"> </div>
<p>　　SUBST drive1: /D</p>
<div class="spctrl"> </div>
<p>　　drive1: 指定要指派路径的虚拟驱动器。</p>
<div class="spctrl"> </div>
<p>　　[drive2:]path 指定物理驱动器和要指派给虚拟驱动器的路径。</p>
<div class="spctrl"> </div>
<p>　　/D 删除被替换的 (虚拟) 驱动器。</p>
<div class="spctrl"> </div>
<p>　　不加任何参数键入 SUBST，可以显示当前虚拟驱动器的清单。</p>
<p><strong>高级使用技巧</strong></p>
<p>初步了解了Subst命令的用途及用法，不妨再看看它的一些高级使用技巧：</p>
<div class="spctrl"> </div>
<p><strong>　　</strong>1．隐藏驱动器Subst的看家本领是虚拟磁盘驱动器符，虽然微软建议用户采用没有使用的盘符进行虚拟，但并不表示它不能虚拟已经存在的盘符，比如A盘、C盘等。于是用户可以通过Subst命令虚拟A、C等盘符，直接覆盖这些已经存在的盘符，使他人无法看到该盘的真正内容，以达到隐藏真实驱动器的目的。例如，用户先在D盘根目录下创建一个名为&ldquo;Aaa&rdquo;的文件夹，最好将文件夹的属性设置为&ldquo;只读&rdquo;和&ldquo;隐藏&rdquo;。然后在C盘根目录下打开&ldquo;Autoexec．bat&rdquo;文件，加入以下代码：</p>
<div class="spctrl"> </div>
<p>　　＠EchoOff</p>
<div class="spctrl"> </div>
<p>　　C:＼Windows＼System32＼Subst A:D:＼Aaa</p>
<div class="spctrl"> </div>
<p>　　(注：在Windows XP中Subst是在System32目录下，其他的系统可能有所不同）这样每次在系统启动后软盘的图标就变为硬盘的样子，其中的内容也变了，从而实现偷梁换柱的目的。需要还原的时候，只需在MS-DOS（命令提示符）方式下，运行&ldquo;Subst A:／D&rdquo;就行了。</p>
<div class="spctrl"> </div>
<p>　　2．特殊软件的安装有少数软件在安装时会提示需要从A盘中提取安装信息，这时难道只有将文件拷贝到软盘后再安装吗？完全没有这个必要，Subst命令可以&ldquo;欺骗&rdquo;这些需要用软盘安装的软件。用户把软盘中的文件全部拷贝到硬盘上的任意文件夹中，再将该文件夹用Subst命令虚拟成A盘后，即可顺利安装。</p>
<div class="spctrl"> </div>
<p>　　3．模拟光盘自动运行目前大部分多媒体光盘都带有一个自动运行命令，方便了用户的使用。然而若将光盘上的所有内容全盘拷贝到硬盘上就不能正常运行。这时，用户可以将放置光盘内容的文件夹虚拟成光盘驱动器（Subst F:D:＼guangpan，假设F为光驱），则软件能正常运行。</p>]]></description></item><item><title><![CDATA[可以多次加载的ajax类]]></title><pubDate>Thu, 04 Jun 2009 12:05:16 GMT</pubDate><category>Ajax</category><link>http://www.51yc.cn/html/2009/06/200906041205160373.htm</link><description><![CDATA[<p>[html]/******************************************************** [/n] * XAjax类修改之西门轩辕的 [/n] * [ [/n] * 1.2版修改内容：增加方法setarg，用来指定获取方法和同步异步的关系 [/n] * 调用前增加object.setarg(1,true); [/n] * 参数1代表使用get的方式获得数据,此方法最大返回数据量不能超过2K [/n] * 反之则是用post方法获取数据,此方法"没有"数据量限制 [/n] * 参数true代表使用异步的方法取得数据---- [/n] * (异步指js执行到此句继续执行,类似多线程的感念.) [/n] * 反之则是使用同步的方式获取数据--- [/n] * (同步的意思则是js得等待取得数据后才往下执行.) [/n] * ] [/n] * 在ajax返回值中用到了回调函数，解决在页面中多次使用ajax加载问题 [/n] ********************************************************/ [/n]XAjax = function(){ [/n] var http_request = false; [/n] var result = "Author By 51yc.cn"; [/n] var method = 1; [/n] var anc = true; [/n] this.setarg = function(m, a){ [/n] method = (m == 0) ? 0 : 1; [/n] anc = (a) ? true : false; [/n] } [/n] this.init = function(){ [/n] http_request = false; [/n] if (window.XMLHttpRequest) { // Mozilla, Safari,... [/n] http_request = new XMLHttpRequest(); [/n] } [/n] else [/n] if (window.ActiveXObject) { // IE [/n] try { [/n] http_request = new ActiveXObject("Msxml2.XMLHTTP"); [/n] } [/n] catch (e) { [/n] try { [/n] http_request = new ActiveXObject("Microsoft.XMLHTTP"); [/n] } [/n] catch (e) { [/n] alert("Can't Creat AJAX Object!"); [/n] return false; [/n] } [/n] } [/n] } [/n] } [/n] this.get = function(url, callback){ [/n] this.init(); [/n] http_request.onreadystatechange = function(){ [/n] if (http_request.readyState == 4) { [/n] if (http_request.status == 200) { [/n] result = http_request.responseText; [/n] try { [/n] callback(result); [/n] } [/n] catch (e) { [/n] alert("The CallBack Method Wrong!" + e); [/n] return false; [/n] [/n] } [/n] } [/n] [/n] } [/n] else [/n] { [/n] var zz="<img src=images/loading.gif>正在加载数据！"; [/n] callback(zz); [/n] } [/n] }; [/n] if (method == 1) { [/n] http_request.open('GET', url, anc); [/n] } [/n] else { [/n] http_request.open('POST', url, anc); [/n] } [/n] [/n] http_request.send(null); [/n] } [/n]} [/n] [/n] [/n]function aa(){ [/n] var rand=Math.random(); [/n] var QQonline = new XAjax(); [/n] QQonline.setarg(1,true); //觉得这个没有什么用处，估计是在这里没实现吧。 [/n] QQonline.get("contentol.html", function(v){show_qq(v);}); [/n] [/n] function show_qq(text) [/n] { [/n] document.getElementById("qq_online").innerHTML=text; [/n] } [/n] [/n] [/n] var kfonline = new XAjax(); [/n] kfonline.setarg(1,true); [/n] kfonline.get("kf_online.html",function(v){show_kf(v);}); [/n] function show_kf(text) [/n] { [/n] document.getElementById("kf_online").innerHTML=text; [/n] document.getElementById("53kf").innerText=text; [/n] } [/n][/html]</p>
<p>有用得着的兄弟就拿去用吧，在此感谢原作者，西门轩辕。</p>
<p> </p>
<p> </p>]]></description></item><item><title><![CDATA[超详细 Windows 7 与 XP、Vista 特性对照表]]></title><pubDate>Thu, 14 May 2009 08:20:33 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/05/200905140820334509.htm</link><description><![CDATA[<p><strong>这里为大家提供微软的 Windows 7 与 XP、Vista 特性对照表，从中可以整体性地了解到 Windows 7 主要的改进和新增功能，当然除此之外，Windows 7 相对于 Vista 还有数不胜数的细节和底层改进，这就要我们在实际使用过程中慢慢发现咯。</strong></p>
<p><strong><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20090530145404.png" /></strong></p>]]></description></item><item><title><![CDATA[当设计师遇上前端开发]]></title><pubDate>Mon, 04 May 2009 08:50:22 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/05/200905040850228502.htm</link><description><![CDATA[<div>
<p><img alt="" src="http://ued.taobao.com/blog/wp-content/uploads/2009/05/3270103042_b5979f4ce4_o2.png" /></p>
<p>作为互联网产品设计师，在和前端开发人员沟通时你是否常常会听到这样的声音：</p>
</div>
<div> </div>
<div>&mdash;&mdash; &ldquo;大姐，给点专业精神好不好，这个表格是自适应的，你这样设计页面不好扩展啊&hellip;&rdquo;</div>
<div>&mdash;&mdash;&ldquo;用ajax不是不行，不过你要事前给我说嘛，你不说我怎么知道呢，你说了我就知道了嘛&hellip;&rdquo;</div>
<div> </div>
<div>面对这些回答，除了欲哭无泪，你有没有想过是什么原因导致出现这样沟通偏差，有没有解决的办法呢？设计师需要了解哪些知识才能和前端开发人员来更好的合作呢？</div>
<div> </div>
<div>首先得从这两者之间都有哪些不同说起。我认为最主要原因在于设计师和前端开发在部门中不同的职责划分。通常情况下，产品设计师的产出物多是线框图（wireframe),视觉设计稿（mockup）等，前端负责编写HTML,CSS等代码（demo），有时还会根据需要编写程序代码（如 JSP/ASP/PHP/Rails),光看这些分工，就知道不同的角色对产品的理解和着重点是截然不同的。</div>
<div> </div>
<div>按照正常的项目流程，设计团队通常需要先设计出界面mockup或demo（HTML/CSS),接着开发人员才开始正式编写代码。然而多数情况下为了保证项目进度，需要开发人员和设计师在项目前期就介入进来，不同的是，开发人员多是审核通过项目计划书（PRD）和原型评审，她们更关注于技术可实现性；而设计师更倾向理解产品经理的项目需求以及通过什么样方式来解决需求从而达到提升用户体验的目的，她们更关注创意的可行性。</div>
<p> </p>
<div>更令人纠结的是前端开发对&ldquo;界面元素&rdquo;和&ldquo;交互动作&rdquo;的理解和设计师有很大不同。统一的界面元素对网站的前端架构也会很有好处，他们更关注代码的可重用性。 一方面是CSS：前端开发要实现设计师（或者自己引以为自豪）的界面设计，如果新页面的设计和原先页面中相同功能元素的设计有出入，哪怕是一点出入，都有可能带来很多重复的工作，将CSS文件变得越来越臃肿。另一方面是JavaScript：对于很多应用型网站，会有很多需要JavaScript的页面交互元素。这些交互元素的视觉或者行为设计与之前的有出入，也会让前端工程师为了既保证代码的健壮性来方便后端工程师的开发，又为了实现一些设计上的差别而对现有代码修修补补忙得不可开交，最可怕的是最终淹没于bug的海洋&hellip;而交互设计师的侧重点并不在程序的编码实现，而注重于用户如何最好地与系统交互操作，在设计中重点需要考虑的是界面元素的易用性：比如他们会考虑到并非每个用户都是计算机的熟练用户，面对隐藏的层和特殊设计的菜单可能会抓瞎，用户不见得能明白双击左键能自动滚屏或者怎样能让自动滚屏停下来，直接看最下面的结果？总之，设计师（完美主义者更甚）会不断完善产品，来满足更好的用户体验。</div>
<div> </div>
<div>那么设计师怎样来解决这些问题呢？我觉得最重要的就是&ldquo;沟通&rdquo;，这是最根本的解决办法。在原型设计前期就要针对自己想法的询问前端开发在技术上的可行性，在界面设计过程中会有很多精确到像素级的标准，同样要和他们沟通了解代码的实现方式，不然很有可能做无用功。在提交界面设计之后，交互设计师也要主动出击，不定时的去关注demo的实现效果（mockup和demo多多少少存在不一致，在后期需要跟进；另外涉及到复杂的交互方式前端很可能会忘记或者搞混，也需要不断的去核查）。另外建立标准的文档管理和设计规范也很重要，好在我们开始建立设计规范和标准(淘斯基和TPL 模式库）的文档管理方法（SVN)，包括：</div>
<ul>
    <li>制定文件命名标准</li>
    <li>设定文件统一路径</li>
    <li>保存原始创作文件（例如PSD、Fla源文件）</li>
    <li>最终完成文件（经过产品经理认可的文件）</li>
    <li>视觉模式库和与其对应的代码模式库</li>
</ul>
<div>当然，前端都很忙的，经常去&ldquo;骚扰&rdquo;他们会被鄙视的。跟他们沟通也需要技巧和一些基础认识，我总结了以下几点需要谨记：</div>
<ol>
    <li>网站的页面是动态的。photoshop呈现的是静态的东西，而网站页面是动态的展现内容、布局和交互。设计师过多关注用户体验层面，很难对所有的细节做到面面俱到。而前端（包括开发）需要照顾到所有的功能点涉及到的页面，因此在前期要考虑的尽量周全，别让别人帮我们收拾烂摊子。</li>
    <li>关注新技术。网页设计缺少技术支持永远只是艺术。设计师必须经常关注新的技术和交互方式，这样才能在设计的时候提供多种解决方案，才能权衡利弊找到最优化的方案。</li>
    <li>界面元素的标准化和统一。前端关注代码的可重用性，设计师关注新创意。因此在设计前期就要考虑哪些元素和交互方式既可以满足用户体验又能够被重复使用，以此来提高效率。</li>
    <li>团队合作很重要。设计师很容易沉浸在自己的小世界里不能自拔，这是我们经常犯的通病。&ldquo;沟通&rdquo;是团队合作的关键，一切皆在沟通。</li>
    <li>相信自己。前端通常出于不同的原因对一些交互方式可行性做出判断，比如代码复杂程度，技术可实现性等等。好的设计师需要有一些超前意识和冒险精神，当他们受 新技术的激发，认为它能够大大提升用户体验的时候，就需要把它当作挑战来实现。在对技术的深入了解后去说服前端一起努力实现。</li>
</ol>
<div>好了，这些血和泪的经验是我工作一段时间慢慢总结的，如果你有更多的方法，希望能一起分享。</div>]]></description></item><item><title><![CDATA[邮件退信处理]]></title><pubDate>Fri, 03 Apr 2009 10:11:01 GMT</pubDate><category>网站运维</category><link>http://www.51yc.cn/html/2009/04/200904031011015353.htm</link><description><![CDATA[<p>退信内容：<br />
[code](1)ac-jady@hotmail.com : 550 DY-001 Mail rejected by Windows Live Hotmail for policy reasons. We generally do not accept email from dynamic IP's <br />
(2)gxcktest@yahoo.com.cn : 553 Mail from 124.135.63.130 not allowed - [80] <br />
(3)gxcktest@sina.com : 550 Rejected due to the sending MTA's poor reputation. Please refer http://mail.sina.com.cn/help2/rwmail.html[/code]</p>
<p>确认操作：<br />
[code]（1）针对HOTMAIL出现的错误提示，因为我们公司使用的是网通的IP，因为我在与网通的技术交涉后确认我们公司申请的IP确实是固定IP地址。 <br />
（2）针对（2）与（3）出现的系统对信，我已在http://cbl.abuseat.org/lookup.cgi中确认了我们公司的IP地址没有在黑名单当中。[/code]</p>
<p>微软HOTMAIL回信：<br />
[code]1、由于您的IP地址(比如：123.123.123.123)位于Spamhaus的 IP地址阻止列表中，因此您的IP地址已经被Windows Live Hotmail封锁。http://www.spamhaus.org/query/bl?ip=123.123.123.123. 我们建议您直接与Spamhaus取得联系，并尝试解决您的问题。 <br />
2、请访问http://www.senderbase.org 以确认您的IP没有在任何第三方的阻止清单里。 <br />
3、我们查看了您的DNS解析报告，发现您的缺少了查找IP的反向DNS (PTR) 解析，根据我们的相关准则（http://postmaster.msn.com/troubleshooting.aspx）对于反向DNS解析失败的发件人我们无法通过。目前在您的IP上查找反向DNS (PTR) 解析失败,同时也违反了RFC1912 2.1. <br />
4、我们查看了您的域名和DNS zone文件但是无法查找到您的SPF记录。如果您希望您的域名被认证，您的每个域名都需要有SPF记录。您可以登录以下网站通过我们的Sender-ID wizard来轻松建立您的SPF记录：http://www.microsoft.com/senderid/wizard 请注意该Wizard可以自定义您的记录。为了取得最大的兼容性与传送能力，我们强烈建议您不要包含&ldquo;PTR&rdquo;记录 （在RFC 4408中IETF同样不推荐使用），并且建立一个可以优化&ldquo;Mail From&rdquo;和Purported Responsible Address, (PRA)的记录。[/code]</p>]]></description></item><item><title><![CDATA[Ajax：拥抱JSON，让XML走开]]></title><pubDate>Fri, 27 Mar 2009 11:57:26 GMT</pubDate><category>Ajax</category><link>http://www.51yc.cn/html/2009/03/200903271157265385.htm</link><description><![CDATA[<p>Ajax(Asynchronous<a href="http://www.knowsky.com/article.asp?typeid=36">javascript</a>and XML)说到底就是一种浏览器异步读取服务器上XML内容的技术。现在的技术凡是跟XML扯上关系，再加上个概念做幌子，就像金装了一样，拽得不行。门外 的人看得很是热闹，门里的人摇摇头不外如是。XML呢，跨平台的新潮语言？其实XML＝TXT。XML只是符合很多规范的文本。它本身什么都不是，只是保 存字符的文件。而浏览器异步读取的只是服务器上的文本内容，所以在Ajax开发时完全不必拘泥于XML。[版权所有，<a href="http://www.jialing.net/">www.jialing.net</a>]</p>
<p>　　JSON的来历</p>
<p>　　XML 的作用是格式化数据内容。如果我们不用XML还有什么更好的方法吗？这个答案是JSON。介绍JSON之前我先介绍一下JavaScript这门脚本语 言。脚本语言自身有动态执行的天赋。即我们可以把想要执行的语句放在字符串里，通过eval()这个动态执行函数来执行。字符串里的内容会像我们写的脚本 一样被执行。</p>
<p>　　示例1：</p>
<p>＜HTML＞<br />
＜HEAD＞<br />
　＜TITLE＞eval example 1＜/TITLE＞<br />
＜/HEAD＞<br />
＜BODY＞<br />
　＜script＞<br />
　　str = "alert('hello')";<br />
　　eval(str);<br />
　＜/script＞<br />
＜/BODY＞<br />
＜/HTML＞ </p>
<p>　　打开页面会弹出hello窗口。</p>
<p>　　我们可以在字符串中放任何脚本语句，包括声明语句：</p>
<p>＜HTML＞<br />
＜HEAD＞<br />
＜TITLE＞eval example 2＜/TITLE＞<br />
＜/HEAD＞<br />
＜BODY＞<br />
＜script＞<br />
　define = "{name:'Michael',email:'17bity@gmail.com'}";<br />
　eval("<a onclick="javascript:tagshow(event, 'data');" href="javascript:;" target="_self"><u><strong>data</strong></u></a> = "+define);<br />
　alert("name:"+data.name);<br />
　alert("email:"+data.email);<br />
＜/script＞<br />
＜/BODY＞<br />
＜/HTML＞</p>
<p>　　如果我们在后台异步传来的文本是JavaScript的声明语句，那么不是一条eval方法就能解析了？对于解析复杂的XML，这样的效率是多么大的提高啊！</p>
<p>　　现在就来告诉你什么是JSON：JavaScript. Object Notation。我更愿意把它翻译为JavaScript对象声明。比如要从后台载入一些通讯录的信息，如果写成XML，如下：</p>
<p>＜contact＞<br />
　＜friend＞<br />
　　＜name＞Michael＜/name＞<br />
　　＜email＞<a href="mailto:17bity@gmail.com">17bity@gmail.com</a>＜/email＞<br />
　　＜homepage＞<a href="http://www.jialing.net/">http://www.jialing.net</a>＜/homepage＞<br />
　＜/friend＞<br />
　＜friend＞<br />
　　＜name＞John＜/name＞<br />
　　＜email＞<a href="mailto:john@gmail.com">john@gmail.com</a>＜/email＞<br />
　　＜homepage＞<a href="http://www.john.com/">http://www.john.com</a>＜/homepage＞<br />
　＜/friend＞<br />
　＜friend＞<br />
　　＜name＞Peggy＜/name＞<br />
　　＜email＞<a href="mailto:peggy@gmail.com">peggy@gmail.com</a>＜/email＞<br />
　　＜homepage＞<a href="http://www.peggy.com/">http://www.peggy.com</a>＜/homepage＞<br />
　＜/friend＞<br />
＜/contact＞</p>
<p>　　而写成JSON呢：</p>
<p>[<br />
{<br />
　name:"Michael",<br />
　email:"<a href="mailto:17bity@gmail.com">17bity@gmail.com</a>",<br />
　homepage:"<a href="http://www.jialing.net/">http://www.jialing.net</a>"<br />
},<br />
{<br />
　name:"John",<br />
　email:"<a href="mailto:john@gmail.com">john@gmail.com</a>",<br />
　homepage:"<a href="http://www.jobn.com/">http://www.jobn.com</a>"<br />
},<br />
{<br />
　name:"Peggy",<br />
　email:"<a href="mailto:peggy@gmail.com">peggy@gmail.com</a>",<br />
　homepage:"<a href="http://www.peggy.com/">http://www.peggy.com</a>"<br />
}<br />
]</p>
<p>　　简单的不只是表达上，最重要的是可以丢弃让人晕头转向的DOM解析了。因为只要符合JavaScript的声明规范，JavaScrip会自动帮你解析好 的。Ajax中使用JSON的基本方法是前台载入后台声明JavaScript对象的字符串，用eval方法来将它转为实际的对象，最后通过 DHTML更新页面信息。<br />
　　<strong>JSON的格式</strong><br />
<br />
　　JSON的基本格式如下，图片来自json.org:<br />
<br />
　　&middot;对象是属性、值对的集合。一个对象的开始于"{"，结束于"}"。每一个属性名和值间用":"提示，属性间用","分隔。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" height="113" alt="object.gif" src="http://www.jcwcn.com/Files01/BeyondPic/2007-1/12/58460/bb0y8nz51048.gif" width="598" border="0" /></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　&middot;数组是有顺序的值的集合。一个数组开始于"["，结束于"]"，值之间用","分隔。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" height="113" alt="array.gif" src="http://www.jcwcn.com/Files01/BeyondPic/2007-1/12/58460/wva7opi2z74h.gif" width="598" border="0" /></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　&middot;值可以是引号里的字符串、数字、true、false、null，也可以是对象或数组。这些结构都能嵌套。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" height="278" alt="value.gif" src="http://www.jcwcn.com/Files01/BeyondPic/2007-1/12/58460/qp334o136332.gif" width="598" border="0" /></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　&middot;字符串的定义和C或<a onclick="javascript:tagshow(event, 'Java');" href="javascript:;" target="_self"><u><strong>Java</strong></u></a>基本一致。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" height="413" alt="string.gif" src="http://www.jcwcn.com/Files01/BeyondPic/2007-1/12/58460/954bf7nbgb0k.gif" width="598" border="0" /></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　&middot;数字的定义也和C或Java基本一致。<br />
<br />
<table width="90%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <div align="center"><img title="点击图片可在新窗口打开" style="width: 400px; cursor: pointer" height="266" alt="number.gif" src="http://www.jcwcn.com/Files01/BeyondPic/2007-1/12/58460/7p0vk3bg611d.gif" width="598" border="0" /></div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>　　JSON VS XML</p>
<p>　　&middot;可读性</p>
<p>　　JSON和XML的可读性可谓不相上下，一边是建议的语法，一边是规范的标签形式，很难分出胜负。</p>
<p>&middot;可扩展性</p>
<p>　　XML天生有很好的扩展性，JSON当然也有，没有什么是XML能扩展，JSON不能的。</p>
<p>　　&middot;编码难度</p>
<p>　　XML有丰富的编码工具，比如Dom4j、JDom等，JSON也有json.org提供的工具，但是JSON的编码明显比XML容易许多，即使不借助工具也能写出JSON的<a onclick="javascript:tagshow(event, '%B4%FA%C2%EB');" href="javascript:;" target="_self"><u><strong>代码</strong></u></a>，可是要写好XML就不太容易了。</p>
<p>　　&middot;解码难度</p>
<p>　　XML的解析得考虑子节点父节点，让人头昏眼花，而JSON的解析难度几乎为0。这一点XML输的真是没话说。</p>
<p>　　&middot;流行度</p>
<p>　　XML已经被业界广泛的使用，而JSON才刚刚开始，但是在Ajax这个特定的领域，未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous JavaScript. and JSON)了。</p>]]></description></item><item><title><![CDATA[我眼中的CTO：立足现在，着眼未来]]></title><pubDate>Fri, 27 Mar 2009 11:45:19 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2009/03/200903271145198890.htm</link><description><![CDATA[<p>摘要：本文首先通过国内外行业内对CTO的定义及工作职责的介绍，归纳出在本人眼中CTO所应该具备的三个基本方面的知识与技能，即技术方面、商务方面以及项目管理方面的知识与技能。其次是提出衡量一个CTO是否杰出的两个因素。其中主要因素是对技术未来发展趋势的把握，另一个因素是能够根据企业实际情况制定出合理的技术路线。在谈到把握未来技术发展趋势时，本人根据自身经验对未来技术发展进行了预测，认为未来技术的发展主要三个方面的整合。即<a title="软件" style="color: #000000" href="http://software.it168.com/" target="_blank">软件</a>的应用及架构整合，硬件的整合，用户体验的整合。最后在文章的结尾介绍了本人参加此次活动的感受。</p>
<p>  CTO是Chief Technology Officer的缩写，国内一般译为首席技术官，又常称为技术官或技术总监。维基百科解释如下：是企业团体里的高阶主管职位之一，是企业内负责技术的最高负责人。百度百科对CTO的解释更为明确一些，CTO是技术资源的管理者，职责是把握总体技术方向，对技术选型和具体技术问题进行指导和把关，完成所赋予的各项技术任务/项目。</p>
<p>  对于CTO的工作职责，国内外的描述也有所不同。国外的CTO主要职责是设计公司的未来，制定下一代产品的策略和进行研究工作，其更多的工作应该是前瞻性的，是技术战略的重要执行者。另外CTO还担负着部分高级市场人员的职责，他可以从技术角度非常有效地帮助公司推广理念，其中包括公司对技术趋势所持的看法。</p>
<p>  国内对于CTO的工作职责虽然还在摸索中，但是主要的分为两类，一类是负责把所有同开发相关的资源都管理起来，按时完成项目，类似于项目经理；另一类是作为技术方面的权威，要对公司下一步的技术发展方向进行一些研究、探讨，做出判断并帮助CEO做出决策，类似于技术顾问，系统架构师。另一方面，CTO具体的工作职责也根据行业，企业规模，企业所处的发展阶段不同而有所不同。</p>
<p>  在我看来，国内国外对CTO的要求是一致的，只不过由于目前国内外IT行业的发展阶段不同，才对CTO的职责有着不同的解读。对于国内的CTO来说，只有先将现在的事情做好，才有能力设计未来。成为一个优秀的CTO是我职业规划中的一个里程碑，在我眼中一个的CTO需要具备以下三方面的基本能力，首先是技术方面的知识与技能，这是CTO的立足之本，并且要了解技术发展的过去，现在和未来；其次是商务知识与技能，要能够了解公司的商业目标，选择性价比最高的方式来完成任务；最后要具备一定项目项目管理的知识与技能，能够保证研究成果，产品，项目保质保量的按时完成。除了以上三方面基本能力外，CTO还要有很强的学习能力，能够快速掌握了解新技术；较强的沟通能力等等。</p>
<p>  在技术方面，CTO肯定本身对技术有浓厚的兴趣和广泛的涉猎。随着互联网的发展，软件技术及相关的管理模式出现爆炸式的发展，技术领域划分方式，编程语言类别，应用系统的规模和复杂度都在大幅提高。然而万变不离其中，计算机的发展都是有其根本的理论和模型的，所谓了解过去，就是要求CTO具有极为丰富的计算机理论功底。很多方案可以从原理上就知道其是否可行。</p>
<p>  了解现在就是要求CTO从不同的视角，来看待技术的发展和演变，比如说javascript与XML技术就结合出Ajax新的技术，扩展了UI的展现方式；将面向对象的思维融入关系型数据库中，极大的扩展了数据库的<a title="存储" style="color: #000000" href="http://storage.it168.com/" target="_blank">存储</a>范围和应用领域。通过对现在技术结合及应用的分析判断，可以极大的提高CTO对未来技术趋势的判断能力，有能力为公司制定技术战略目标。<br />
 <br />
  在商务方面，CTO作为管理团队的一员，要协助CEO完成公司的战略目标，所谓工欲善其事必先利其器，作为CEO的助手，CTO首先要能够了解此类的商务目标，并转化为技术需求，根据CEO的方法提供合适的工具。比如说企业的目标是将年行政费用降低30%，虽然没有明确的说要通过技术方式或者应用<a title="信息化" style="color: #000000" href="http://cio.it168.com/" target="_blank">信息化</a>来解决，作为CTO要思考是不是可以通过IT方式来降低成本，这就要求CTO具有分析投资收益的能力。所以CTO也要对会计、市场、管理、经营、绩效等方面有所了解。另一方面服务不同行业的客户，如制造业、零售业、金融服务业等也要求CTO具备很强的行业知识，避免闭门造车的事情发生。<br />
 <br />
  在项目管理方面，作为CTO，或多或少都要参与到一些实际的项目中，或者领导着一些项目的开发。项目能够按时完成，按时上线影响着企业的命运。CTO要有能力领导监督项目，识别出项目的风险，协调各个项目之间的技术资源，指导项目经理的工作。更为重要的是能够建立一些如CMM的管理流程和管理方法，制定出技术框架和实施模式，建立了健全的项目管理体系，并良好地运行。再好的想法只有实现了才有价值。<br />
 <br />
  能够从商务角度考虑战略目标，并且根据目标提出技术解决方案，具备利用项目管理知识将方案实现能力，具备解决实现过程中的技术难题，在我看来，已经具备成为一个CTO的基本条件。要想成为一个杰出的CTO，还要有对未来技术发展趋势敏锐的洞察力，并且能够判断是否应用新的技术以及如何应用。<br />
 <br />
  在2003年是否魄力用asp.net来代替asp提升开发效率?在2004年是自己开发一个GIS系统，还是利用WebService?在2005年要是做一个订票系统，是自己写复杂的消息队列，还是利用SQL Server 2005的SQL Broker?在2006年完成一个信息系统整合的项目，是全部推倒重做还是利用BizTalk Server进行集成?在2007年企业内部门户，自己去做一个文件管理系统还是基于SharePoint Server进行构建?2008年如果不用Hyper-V是不是觉得X64的<a title="服务器" style="color: #000000" href="http://server.it168.com/" target="_blank">服务器</a>有些资源浪费？作为一个CTO不仅要最好的掌握了解新的技术，还要不断平衡新老技术应用所带来风险。如果不对未来的技术发展有所预判，那么很容易走弯路。</p>
<p>  虽然目前我距离成为一个CTO还有一定距离，但是我认为未来3-5年IT技术趋势是以整合为主。整个分为几个方面，<a title="软件" style="color: #000000" href="http://software.it168.com/" target="_blank">软件</a>的应用及架构整合，硬件的整合，用户体验的整合。天下大事合久必分，分久必和。近20年来，计算机在各个方面都有了各自的快速发展，很都领域已经还是融合，那么技术的未来发展趋势就是看那个企业有能力有比较好的方式，整合出来更好的技术和应用。<br />
 <br />
  在软件的体系结构上，有BS(Browser&amp;Server)和CS(Client&amp;Server)之分，随着互联网的发展，现在这种划分界限也越来越模糊了，微软以前推出的WebService 是基于一种BS结构的应用，最近提出的的WCF(Windows Communiction Foundation)框架则结合了BS结构和CS结构各自的特点，打破了原来的划分界限。越来越多桌面应用程序，也可以在不安装的情况下直接在互联网上应用，比如说Google推出的Docs&amp;Spreadsheets具备了文档编辑、表格处理，另外具有文档共享以及多人编辑等交互功能。<br />
<br />
  更让人震惊的是很多公司已经发布了基于互联网访问的<a title="操作系统" style="color: #000000" href="http://product.it168.com/list/b/0501_1.shtml" target="_blank">操作系统</a>。纵观目前的技术发展已经和互联网紧密的融合起来，已经很难用传统的架构进行区分。SOA理念的提出，就是将传统的应用都包装为服务，通过统一的标准进行通讯，使整合集成各个应用，信息交换更为方面。作为CTO需要在技术的变革过程中为公司的未来寻找到方向，如微软就基于信息交换集成提出BizTalk Server，作为其SOA解决方案的重要的一个环节，SQL SERVER产品线也为SOA做了相应的调整。</p>
<p>  在目前看来SOA仅仅是一个先锋官，真正CTO将要面对的是云计算时代的来临。云计算是指基于互联网的超级计算模式。即把<a title="存储" style="color: #000000" href="http://storage.it168.com/" target="_blank">存储</a>于个人电脑、移动电话和其他设备上的大量信息和处理器资源集中在一起，协同工作。是一种新兴的共享基础架构的方法，可以将巨大的系统池连接在一起以提供各种IT服务。在未来3-5年会在很多方面产生新的商业技术机会，其中包括连接设备、实时数据流、SOA的采用以及搜索、开放协作、社会<a title="网络" style="color: #000000" href="http://net.it168.com/" target="_blank">网络</a>和移动商务以及Web 2.0应用等。<br />
 <br />
  在硬件方面，由于现在的计算机硬件条件已经远远超过了软件需求，所以很多公司面临的问题的如果应用现在的高性能机器和以前大量的低性能的机器。对于高性能机器，微软公司提出的虚拟化解决方案解决方案相信会被更多的企业所采用。在一台高性能的机器上虚拟出多台不同应用的<a title="服务器" style="color: #000000" href="http://server.it168.com/" target="_blank">服务器</a>，不仅降低了企业的初期投入而且也降低了用户的维护成本。作为CTO也要看到这样的发展趋势，考虑如果将企业的产品和这种虚拟机器进行融合。而对于低性能的计算机，可以利用云计算通过群集的方式提供服务，也可以降低企业的投入成本。并行计算，联机存储等技术方面也是最近几年技术的发展趋势。<br />
 <br />
  计算机与用户交互已经不仅仅是靠<a title="键盘" style="color: #000000" href="http://product.it168.com/list/b/0201_1.shtml" target="_blank">键盘</a>和显示器，在微软研究院中，已经有可以根据用户哼唱的一段音乐进行搜索的演示系统；苹果公司的iphone支持用户通过触摸拖动<a title="屏幕" style="color: #000000" href="http://product.it168.com/list/b/0107_1.shtml" target="_blank">屏幕</a>窗口；Sony公司的Wii游戏机可以通过<a title="传感器" style="color: #000000" href="http://product.it168.com/list/b/0470_1.shtml" target="_blank">传感器</a>模拟用户的移动，以上例子足以证明未来的人机交互不仅仅是通过屏幕和键盘，以及Ajax,Flash，Silverlight此类时髦的，绚丽的UI界面。</p>
<p>  计算机可以听到、看到以及感应到人类发出的一些信息，这些人机交互的发展无形之中更近一步的扩大了IT的技术的应用领域和使用人群。嵌入式近几年的飞速发展更是将计算机应用带到了地球的各个角落，甚至的已经登陆到了火星。在医疗，交通，航天等行业，把握好人机交互的技术发展，会带来更多的技术应用。<br />
 <br />
  《孙子兵法》里提到&ldquo;不谋万世者，不足以谋一时；不谋全局者，不足以谋一域&rdquo;，我认为，以上两点正是衡量一个CTO是否杰出的重要标准。作为一个杰出的CTO不仅要考虑技术的未来发展趋势，还要根据公司的实际情况，技术实力，竞争对手以及企业的战略目标等诸多问题，从全局的角度综合考虑，为企业指明技术方向。还要有能力根据环境和市场的发展及时调整战术安排，万万不能唯技术论，否则很容易将企业带到一个弃之不舍，食之无味的两难处境。<br />
衡量棋手的好坏是看其能预测步数的多少，能预测的步数越多赢得概率越大。</p>
<p>  然而这需要长时间的积累与磨练才会历练出来的。可是很少有公司会冒险提供CTO的职位供人练习，所以就需要怀着成为CTO梦想的人利用平时各种机会进行学习与交流，早日培养出CTO的思维和工作习惯。<br />
<br />
  很感谢IT168提供这样一个学习交流的平台，不仅使参与者通过每日答题，PK大赛等方式了解了微软的各个产品尤其是虚拟化解决方案，而且也为有志成为CTO的人提供了一个交流的平台。通过这次活动一方面让我从新对微软的产品系列有了新的了解和认识，最为重要的是，提醒了我，要看一看，想一想未来的技术发展趋势是什么。在学习掌握成为一个CTO所要求的基本知识与技能的过程中，同时也要锻炼自己对CTO的思维习惯，和工作习惯的培养。<br />
 <br />
  立足现在，着眼未来，这就是我眼中的CTO。</p>
<p> </p>]]></description></item><item><title><![CDATA[ASP存储过程参数数据类型一览]]></title><pubDate>Sun, 18 Jan 2009 23:23:43 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2009/01/200901182323435815.htm</link><description><![CDATA[<div class="postTitle">在使用存储过程的时候需要注意的，整理了下，放在这里备用，需要的朋友可以参考。</div>
<div class="postText">
<p>常量 值 说明 <br />
AdArray<br />
（不适用于 ADOX。） 0x2000 <br />
一个标志值，通常与另一个数据类型常量组合，指示该数据类型的数组。 <br />
adBigInt <br />
20 指示一个八字节的有符号整数 (DBTYPE_I8)。 <br />
adBinary <br />
128 指示一个二进制值 (DBTYPE_BYTES)。 <br />
adBoolean <br />
11 指示一个布尔值 (DBTYPE_BOOL)。 <br />
adBSTR <br />
8 指示以 Null 终止的字符串 (Unicode) (DBTYPE_BSTR)。 <br />
adChapter <br />
136 指示一个四字节的子集值，标识子行集合中的行 (DBTYPE_HCHAPTER)。 <br />
adChar <br />
129 指示一个字符串值 (DBTYPE_STR)。 <br />
adCurrency <br />
6 指示一个货币值 (DBTYPE_CY)。货币是一个定点数字，小数点右侧有四位数字。该值存储为八字节、范围为 10,000 的有符号整数。 <br />
adDate <br />
7 指示日期值 (DBTYPE_DATE)。日期保存为双精度数，数字的整数部分是从 1899 年 12 月 30 日算起的天数，小数部分是一天当中的片段时间。 <br />
adDBDate <br />
133 指示日期值 (yyyymmdd) (DBTYPE_DBDATE)。 <br />
adDBTime <br />
134 指示时间值 (hhmmss) (DBTYPE_DBTIME)。 <br />
adDBTimeStamp <br />
135 指示日期/时间戳（yyyymmddhhmmss 加十亿分之一的小数）(DBTYPE_DBTIMESTAMP)。 <br />
adDecimal <br />
14 指示具有固定精度和范围的确切数字值 (DBTYPE_DECIMAL)。 <br />
adDouble <br />
5 指示一个双精度浮点值 (DBTYPE_R8)。 <br />
adEmpty <br />
0 指定没有值 (DBTYPE_EMPTY)。 <br />
adError <br />
10 指示一个 32 位的错误代码 (DBTYPE_ERROR)。 <br />
adFileTime <br />
64 指示一个 64 位的值，表示从 1601 年 1 月 1 日开始的 100 个十亿分之一秒间隔的数量 (DBTYPE_FILETIME)。 <br />
adGUID <br />
72 指示全局唯一标识符 (GUID) (DBTYPE_GUID)。 <br />
adIDispatch <br />
9 指示指向 COM 对象上 IDispatch 接口的指针 (DBTYPE_IDISPATCH)。 <br />
注意 ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。</p>
<p>adInteger <br />
3 指示一个四字节的有符号整数 (DBTYPE_I4)。 <br />
adIUnknown <br />
13 指示指向 COM 对象上 IUnknown 接口的指针 (DBTYPE_IUNKNOWN)。 <br />
注意 ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。</p>
<p>adLongVarBinary <br />
205 指示一个长二进制值（仅限于 Parameter 对象）。 <br />
adLongVarChar <br />
201 指示一个长字符串值（仅限于 Parameter 对象）。 <br />
adLongVarWChar <br />
203 指示一个以 Null 终止的长 Unicode 字符串值（仅限于 Parameter 对象）。 <br />
adNumeric <br />
131 指示具有固定精度和范围的确切数字值 (DBTYPE_NUMERIC)。 <br />
adPropVariant <br />
138 指示一个 Automation PROPVARIANT (DBTYPE_PROP_VARIANT)。 <br />
adSingle <br />
4 指示一个单精度浮点值 (DBTYPE_R4)。 <br />
adSmallInt <br />
2 指示一个双字节的有符号整数 (DBTYPE_I2)。 <br />
adTinyInt <br />
16 指示一个单字节的有符号整数 (DBTYPE_I1)。 <br />
adUnsignedBigInt <br />
21 指示一个八字节的无符号整数 (DBTYPE_UI8)。 <br />
adUnsignedInt <br />
19 指示一个四字节的无符号整数 (DBTYPE_UI4)。 <br />
adUnsignedSmallInt <br />
18 指示一个双字节的无符号整数 (DBTYPE_UI2)。 <br />
adUnsignedTinyInt <br />
17 指示一个单字节的无符号整数 (DBTYPE_UI1)。 <br />
adUserDefined <br />
132 指示一个用户定义的变量 (DBTYPE_UDT)。 <br />
adVarBinary <br />
204 指示一个二进制值（仅限于 Parameter 对象）。 <br />
adVarChar <br />
200 指示一个字符串值（仅限于 Parameter 对象）。 <br />
adVariant <br />
12 指示一个 Automation Variant (DBTYPE_VARIANT)。 <br />
注意 ADO 目前不支持这种数据类型。使用它可能导致不可预料的结果。</p>
<p>adVarNumeric <br />
139 指示一个数字值（仅限于 Parameter 对象）。 <br />
adVarWChar <br />
202 指示一个以 Null 终止的 Unicode 字符串（仅限于 Parameter 对象）。 <br />
adWChar <br />
130 指示一个以 Null 终止的 Unicode 字符串 (DBTYPE_WSTR)。</p>
<p> </p>
<p>附：存储过程表明参数类型数字的意义</p>
<p>0：类型无法确定<br />
1：输入参数 <br />
2：输出参数<br />
3：输入或输出参数<br />
4：返回值</p>
</div>]]></description></item><item><title><![CDATA[大型高并发高负载网站的系统架构 ]]></title><pubDate>Fri, 05 Dec 2008 21:54:09 GMT</pubDate><category>网站运维</category><link>http://www.51yc.cn/html/2008/12/200812052154096981.htm</link><description><![CDATA[<p>      大型(门户/行业/商务)网站建设中的架构是一个高度的技术难题。本篇内容依所个人在新浪网多年担任新浪频道技术总监及众多项目的项目经理所写，希望各位指教。<br />
 <br />
<strong>1、HTML静态化</strong><br />
      其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采 用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息 发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录 入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。<br />
&shy;<br />
      除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。<br />
&shy;<br />
      同 时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论 坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分 内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。<br />
&shy;<br />
<strong>2、图片服务器分离</strong><br />
      大家知道，对于Web服务器来说，不管 是 Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服 务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器 上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗 和执行效率。<br />
&shy;<br />
<strong>3、数据库集群和库表散列</strong><br />
      大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。<br />
&shy;<br />
      在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。<br />
&shy;<br />
      上 面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最 有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能 进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架 构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统 随时增加一台低成本的数据库进来补充系统性能。<br />
&shy;<br />
<strong>4、缓存</strong><br />
      缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br />
架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br />
网 站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大 型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多 了，.net不是很熟悉，相信也肯定有。<br />
&shy;<br />
<strong>5、镜像</strong><br />
      镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网 络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实 时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等 工具。<br />
&shy;<br />
<strong>6、负载均衡</strong><br />
      负载均衡将是大型网站解决高负荷访问和大量并发请求采，用的终极解决办法。<br />
负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br />
 <br />
<strong>硬件四层交换</strong><br />
      第 四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚 IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的 载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决 定。<br />
在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。<br />
&shy;<br />
<strong>软件四层交换</strong><br />
      大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br />
      软 件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满 足多种应用需求，这对于分布式的系统来说必不可少。<br />
&shy;<br />
      一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。</p>]]></description></item><item><title><![CDATA[经常用到ajax，所以把这个常用函数发出来。]]></title><pubDate>Fri, 28 Nov 2008 21:32:10 GMT</pubDate><category>Ajax</category><link>http://www.51yc.cn/html/2008/11/200811282132101922.htm</link><description><![CDATA[<p>[html]<script type="text/javascript" defer="defer"> [/n]var xmlhttp; [/n]window.onload=FF(); [/n]function createXMLHttpRequest() [/n]{//This Function will create a XMLHttpRequest object . [/n] if(window.ActiveXObject) [/n] { [/n] xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); [/n] //alert("IE"); [/n] } [/n] else if(window.XMLHttpRequst) [/n] {//firefox and the other broswers. [/n] xmlhttp=new XMLHttpRequest(); [/n] } [/n] } [/n] [/n]function FF(y,z,x) [/n]{ [/n] if (!y) [/n] { [/n] y=110; //初始查询数据库ID [/n] } [/n] if (!z) [/n] { [/n] z=1; //初始默认page [/n] } [/n] if (!x) [/n] { [/n] x=0; //控制Ajax提交后程序处理数据函数 [/n] } [/n] //alert(y+"*"+z+"*"+x); [/n] createXMLHttpRequest(); [/n] if (xmlhttp) [/n] { [/n] xmlhttp.onreadystatechange =handleStateChange; [/n] xmlhttp.open("get","SF_Books_List.asp?folderid="+y+"&amp;page="+z+"&amp;leixing="+x); [/n] xmlhttp.send(null); [/n] } [/n]} [/n] [/n] [/n] [/n]function handleStateChange() [/n]{ [/n] if(xmlhttp.readyState==4) //ok [/n] { [/n] if(xmlhttp.status==200) //success [/n] { [/n] var yy=unescape(xmlhttp.responseText); [/n] show(yy); [/n] } [/n] else [/n] { [/n] alert("error"); [/n] } [/n] } [/n] else [/n] { [/n] var zz="<img src=SF_Books/loading.gif>正在加载数据！"; [/n] show(zz); [/n] } [/n]} [/n] [/n]function show(text) [/n]{ [/n] document.getElementById("main_M").innerHTML=text; [/n]} [/n]</script>[/html]</p>
<p>直接 javascript:FF(0,0,2) 就可以。</p>]]></description></item><item><title><![CDATA[给DIV加个链接]]></title><pubDate>Tue, 11 Nov 2008 22:33:03 GMT</pubDate><category>DIV/CSS</category><link>http://www.51yc.cn/html/2008/11/200811112233039343.htm</link><description><![CDATA[<p>[code]<div onmouseover="this.style.cursor='pointer'" <br />
onclick="document.location='http://www.51YC.cn';" >link Test</div> <br />
[/code]</p>
<p>[html]<div onmouseover="this.style.cursor='pointer'"  onclick="document.location='http://www.51YC.cn';" >link Test</div> [/n][/html]</p>
<p>开始一直在想用<div><a herf="#"></a></div> 来做，但发现我加了position：absolute;后一直没反应，郁闷。。</p>
<p>DIV的宽高得问题吧，懒得测试了。</p>
<p>还是用onclick吧，万能得超链接。</p>]]></description></item><item><title><![CDATA[新开心网（kaixin.com）的邀请注册地址，不是kaixin001.com哦]]></title><pubDate>Thu, 16 Oct 2008 16:57:19 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2008/10/200810161657197103.htm</link><description><![CDATA[<p>     邀请地址：<a href="http://reg.kaixin.com/inviteregist.do?i=700017721&amp;appId=&amp;code=bM569vMPF9&amp;from=&amp;inviteType=2&amp;buddygroup=&amp;ss=80100&amp;logid=260402">http://reg.kaixin.com/inviteregist.do?i=700017721&amp;appId=&amp;code=bM569vMPF9&amp;from=&amp;inviteType=2&amp;buddygroup=&amp;ss=80100&amp;logid=260402</a> （直接点链接打开即可！）</p>
<p>     两个开心网kaixin001.com是老牌的开心网，kaixin.com是新的开心网，都是真的，是商业竞争的结果。kaixin.com是千橡公司继校内网（xiaonei.com）后的SNS。这三个都差不多的玩法，他们的关系呢，kaixin001.com 里面大多数人是上班一族，俗称&ldquo;白领&rdquo;的居多，新开心网和校内网都是一个公司的，校内网的用户大多是学生一族，新开心网就是抢kaixin001.com的饭碗的。还真有意思。</p>
<p> </p>]]></description></item><item><title><![CDATA[WebBrowser脚本错误的完美解决方案 ]]></title><pubDate>Thu, 16 Oct 2008 16:37:16 GMT</pubDate><category>.net技术</category><link>http://www.51yc.cn/html/2008/10/200810161637160084.htm</link><description><![CDATA[<p>        当IE浏览器遇到脚本错误时浏览器，左下角会出现一个黄色图标，点击可以查看脚本错误的详细信息，并不会有弹出的错误信息框。当我们使用WebBrowser控件时有错误信息框弹出，这样程序显的很不友好，而且会让一些自动执行的程序暂停。我看到有人采取的解决方案是做一个窗体杀手程序来关闭弹出的窗体。今天探讨的方法是从控件解决问题。<br />
        1、SHDocVw.dll<br />
在COM时代我们使用的WebBrowser控件是SHDocVw.dll。屏蔽错误信息的方法很简单使用下面的一句就可以搞定。<br />
[code]WebBrowser1.Silent = true[/code]<br />
        2、.Net中<br />
在.Net中提供了托管的WebBrowser可供我们使用，当然我们仍然可以在.Net中使用COM组建SHDocVw.dll，如果使用SHDocVw.dll处理错误方式和上面的方法一样。但如果我们是使用.Net组件如何解决这个问题呢？<br />
        这个组件给我们提供了一个方法ScriptErrorsSuppressed 。但是在.net framework2.0中他是不起作用的，据说在低版本中使用如下的方式解决<br />
   [code]webBrowser1.ScriptErrorsSuppressed = true（据说在.net framework2.0以前是这样，我没有使用过）[/code]<br />
        那么在.net framework2.0中如何解决这个问题呢？<br />
       有一种方法不能彻底解决，可以部分解决问题这里也介绍给大家。<br />
[code]//捕获控件的错误 <br />
this.WebBrowser.Document.Window.Error += new HtmlElementErrorEventHandler(Window_Error); <br />
//对错误进行处理 <br />
void Window_Error(object sender, HtmlElementErrorEventArgs e) <br />
{ <br />
// 自己的处理代码 <br />
e.Handled = true; <br />
}[/code]<br />
        上面的方法对于多个框架嵌套等等的情形还是不能很好的解决。<br />
        为了彻底解决这个问题，我们借助AxWebBrowser来解决WebBrowser的问题。<br />
        我们定义一个自己的类，他的父类是WebBrowser，以后使用这个类就可以了。在这个类的定义中需要引用SHDocVw。<br />
[code] class EWebBrowser : System.Windows.Forms.WebBrowser <br />
{ <br />
SHDocVw.IWebBrowser2 Iwb2; <br />
<br />
protected override void AttachInterfaces(object nativeActiveXObject) <br />
{ <br />
Iwb2 = (SHDocVw.IWebBrowser2)nativeActiveXObject; <br />
Iwb2.Silent = true; <br />
base.AttachInterfaces(nativeActiveXObject); <br />
} <br />
<br />
protected override void DetachInterfaces() <br />
{ <br />
Iwb2 = null; <br />
base.DetachInterfaces(); <br />
} <br />
<br />
}[/code]<br />
         从上面的代码可以看出EWebBrowser截取了AxWebBrowser接口，并利用了AxWebBrowser的属性Silent来实现。<br />
        shdocvw.dll位置Add References -> c:\windows\system32\shdocvw.dll</p>]]></description></item><item><title><![CDATA[MD5加密算法(16位，32位)的C#,VB的实现]]></title><pubDate>Wed, 15 Oct 2008 18:32:31 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/10/200810151832311982.htm</link><description><![CDATA[<p>以下为MD5算法用c#的实现<br />
[html]//MD5.cs [/n]//MD5 16-bit,32-bits algorithm implemented in C# [/n] [/n]using System; [/n]using System.Text; [/n] [/n]namespace Encrypter [/n]{ [/n] /// <summary> [/n] /// Summary description for MD5. [/n] /// </summary> [/n] public class MD5 [/n] { [/n] const int BITS_TO_A_BYTE = 8; [/n] const int BYTES_TO_A_WORD = 4; [/n] const int BITS_TO_A_WORD = 32; [/n] private static long[] m_lOnBits = new long[30 + 1]; [/n] private static long[] m_l2Power = new long[30 + 1]; [/n] [/n] private static long LShift(long lValue, long iShiftBits) [/n] { [/n] long LShift = 0; [/n] if (iShiftBits == 0) [/n] { [/n] LShift = lValue; [/n] return LShift; [/n] } [/n] else [/n] { [/n] if( iShiftBits == 31) [/n] { [/n] if (Convert.ToBoolean(lValue &amp; 1)) [/n] { [/n] LShift = 0x80000000; [/n] } [/n] else [/n] { [/n] LShift = 0; [/n] } [/n] return LShift; [/n] } [/n] else [/n] { [/n] if( iShiftBits < 0 || iShiftBits > 31) [/n] { [/n] // Err.Raise 6; [/n] } [/n] } [/n] } [/n] [/n] if (Convert.ToBoolean((lValue &amp; m_l2Power[31 - iShiftBits]))) [/n] { [/n] LShift = ((lValue &amp; m_lOnBits[31 - (iShiftBits + 1)]) * m_l2Power[iShiftBits]) | 0x80000000; [/n] } [/n] else [/n] { [/n] LShift = ((lValue &amp; m_lOnBits[31 - iShiftBits]) * m_l2Power[iShiftBits]); [/n] } [/n] [/n] return LShift; [/n] } [/n] [/n] private static long RShift(long lValue, long iShiftBits) [/n] { [/n] long RShift = 0; [/n] if (iShiftBits == 0) [/n] { [/n] RShift = lValue; [/n] return RShift; [/n] } [/n] else [/n] { [/n] if( iShiftBits == 31) [/n] { [/n] if (Convert.ToBoolean(lValue &amp; 0x80000000)) [/n] { [/n] RShift = 1; [/n] } [/n] else [/n] { [/n] RShift = 0; [/n] } [/n] return RShift; [/n] } [/n] else [/n] { [/n] if( iShiftBits < 0 || iShiftBits > 31) [/n] { [/n] // Err.Raise 6; [/n] } [/n] } [/n] } [/n] [/n] RShift = (lValue &amp; 0x7FFFFFFE) / m_l2Power[iShiftBits]; [/n] [/n] if (Convert.ToBoolean((lValue &amp; 0x80000000))) [/n] { [/n] RShift = (RShift | (0x40000000 / m_l2Power[iShiftBits - 1])); [/n] } [/n] [/n] return RShift; [/n] } [/n] [/n] private static long RotateLeft(long lValue, long iShiftBits) [/n] { [/n] long RotateLeft = 0; [/n] RotateLeft = LShift(lValue, iShiftBits) | RShift(lValue, (32 - iShiftBits)); [/n] return RotateLeft; [/n] } [/n] [/n] private static long AddUnsigned(long lX, long lY) [/n] { [/n] long AddUnsigned = 0; [/n] long lX4 = 0; [/n] long lY4 = 0; [/n] long lX8 = 0; [/n] long lY8 = 0; [/n] long lResult = 0; [/n] [/n] lX8 = lX &amp; 0x80000000; [/n] lY8 = lY &amp; 0x80000000; [/n] lX4 = lX &amp; 0x40000000; [/n] lY4 = lY &amp; 0x40000000; [/n] [/n] lResult = (lX &amp; 0x3FFFFFFF) + (lY &amp; 0x3FFFFFFF); [/n] if (Convert.ToBoolean(lX4 &amp; lY4)) [/n] { [/n] lResult = lResult ^ 0x80000000 ^ lX8 ^ lY8; [/n] } [/n] else if( Convert.ToBoolean(lX4 | lY4)) [/n] { [/n] if (Convert.ToBoolean(lResult &amp; 0x40000000)) [/n] { [/n] lResult = lResult ^ 0xC0000000 ^ lX8 ^ lY8; [/n] } [/n] else [/n] { [/n] lResult = lResult ^ 0x40000000 ^ lX8 ^ lY8; [/n] } [/n] } [/n] else [/n] { [/n] lResult = lResult ^ lX8 ^ lY8; [/n] } [/n] AddUnsigned = lResult; [/n] return AddUnsigned; [/n] } [/n] [/n] private static long md5_F(long x, long y, long z) [/n] { [/n] long md5_F = 0; [/n] md5_F = (x &amp; y) | (( ~x) &amp; z); [/n] return md5_F; [/n] } [/n] [/n] private static long md5_G(long x, long y, long z) [/n] { [/n] long md5_G = 0; [/n] md5_G = (x &amp; z) | (y &amp; ( ~z)); [/n] return md5_G; [/n] } [/n] [/n] private static long md5_H(long x, long y, long z) [/n] { [/n] long md5_H = 0; [/n] md5_H = (x ^ y ^ z); [/n] return md5_H; [/n] } [/n] [/n] private static long md5_I(long x, long y, long z) [/n] { [/n] long md5_I = 0; [/n] md5_I = (y ^ (x | (~z))); [/n] return md5_I; [/n] } [/n] [/n] private static void md5_FF(ref long a, long b, long c, long d, long x, long s, long ac) [/n] { [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac)); [/n] a = RotateLeft(a, s); [/n] a = AddUnsigned(a, b); [/n] } [/n] [/n] private static void md5_GG(ref long a, long b, long c, long d, long x, long s, long ac) [/n] { [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac)); [/n] a = RotateLeft(a, s); [/n] a = AddUnsigned(a, b); [/n] } [/n] [/n] private static void md5_HH(ref long a, long b, long c, long d, long x, long s, long ac) [/n] { [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac)); [/n] a = RotateLeft(a, s); [/n] a = AddUnsigned(a, b); [/n] } [/n] [/n] private static void md5_II(ref long a, long b, long c, long d, long x, long s, long ac) [/n] { [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac)); [/n] a = RotateLeft(a, s); [/n] a = AddUnsigned(a, b); [/n] } [/n] [/n] private static long[] ConvertToWordArray(string sMessage) [/n] { [/n] long[] ConvertToWordArray = null; [/n] int lMessageLength = 0; [/n] int lNumberOfWords = 0; [/n] long[] lWordArray = null; [/n] int lBytePosition = 0; [/n] int lByteCount = 0; [/n] int lWordCount = 0; [/n] [/n] const int MODULUS_BITS = 512; [/n] const int CONGRUENT_BITS = 448; [/n] [/n] lMessageLength = sMessage.Length; [/n] lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD); [/n] lWordArray = new long[lNumberOfWords]; [/n] [/n] lBytePosition = 0; [/n] lByteCount = 0; [/n] [/n] while(lByteCount < lMessageLength) [/n] { [/n] lWordCount = lByteCount / BYTES_TO_A_WORD; [/n] lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE; [/n] lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(Convert.ToByte(sMessage.Substring(lByteCount, 1).ToCharArray()[0]), lBytePosition); [/n] lByteCount = lByteCount + 1; [/n] } [/n] [/n] lWordCount = lByteCount / BYTES_TO_A_WORD; [/n] lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE; [/n] lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(0x80, lBytePosition); [/n] lWordArray[lNumberOfWords - 2] = LShift(lMessageLength, 3); [/n] lWordArray[lNumberOfWords - 1] = RShift(lMessageLength, 29); [/n] ConvertToWordArray = lWordArray; [/n] [/n] return ConvertToWordArray; [/n] } [/n] [/n] private static string WordToHex(long lValue) [/n] { [/n] string WordToHex = ""; [/n] long lByte = 0; [/n] int lCount = 0; [/n] for(lCount = 0; lCount <= 3; lCount++) [/n] { [/n] lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) &amp; m_lOnBits[BITS_TO_A_BYTE - 1]; [/n] WordToHex = WordToHex + (("0" + ToHex(lByte)).Substring(("0" + ToHex(lByte)).Length - 2)); [/n] } [/n] return WordToHex; [/n] } [/n] [/n] private static string ToHex(long dec) [/n] { [/n] string strhex = ""; [/n] while(dec > 0) [/n] { [/n] strhex = tohex(dec % 16) + strhex; [/n] dec = dec / 16; [/n] } [/n] return strhex; [/n] } [/n] [/n] private static string tohex(long hex) [/n] { [/n] string strhex = ""; [/n] switch(hex) [/n] { [/n] case 10: strhex = "a"; break; [/n] case 11: strhex = "b"; break; [/n] case 12: strhex = "c"; break; [/n] case 13: strhex = "d"; break; [/n] case 14: strhex = "e"; break; [/n] case 15: strhex = "f"; break; [/n] default : strhex = hex.ToString(); break; [/n] } [/n] return strhex; [/n] } [/n] [/n] [/n] public static string Encrypt(string sMessage, int stype) [/n] { [/n] string MD5 = ""; [/n] [/n] for(int i=0; i<=30; i++) [/n] { [/n] m_lOnBits[i] = Convert.ToInt64(Math.Pow(2, i+1) -1); [/n] m_l2Power[i] = Convert.ToInt64(Math.Pow(2, i)); [/n] } [/n] [/n] long[] x = null; [/n] int k = 0; [/n] long AA = 0; [/n] long BB = 0; [/n] long CC = 0; [/n] long DD = 0; [/n] long a = 0; [/n] long b = 0; [/n] long c = 0; [/n] long d = 0; [/n] [/n] const int S11 = 7; [/n] const int S12 = 12; [/n] const int S13 = 17; [/n] const int S14 = 22; [/n] const int S21 = 5; [/n] const int S22 = 9; [/n] const int S23 = 14; [/n] const int S24 = 20; [/n] const int S31 = 4; [/n] const int S32 = 11; [/n] const int S33 = 16; [/n] const int S34 = 23; [/n] const int S41 = 6; [/n] const int S42 = 10; [/n] const int S43 = 15; [/n] const int S44 = 21; [/n] [/n] x = ConvertToWordArray(sMessage); [/n] [/n] a = 0x67452301; [/n] b = 0xEFCDAB89; [/n] c = 0x98BADCFE; [/n] d = 0x10325476; [/n] [/n] for(k = 0; k < x.Length; k += 16) [/n] { [/n] AA = a; [/n] BB = b; [/n] CC = c; [/n] DD = d; [/n] [/n] md5_FF(ref a, b, c, d, x[k + 0], S11, 0xD76AA478); [/n] md5_FF(ref d, a, b, c, x[k + 1], S12, 0xE8C7B756); [/n] md5_FF(ref c, d, a, b, x[k + 2], S13, 0x242070DB); [/n] md5_FF(ref b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); [/n] md5_FF(ref a, b, c, d, x[k + 4], S11, 0xF57C0FAF); [/n] md5_FF(ref d, a, b, c, x[k + 5], S12, 0x4787C62A); [/n] md5_FF(ref c, d, a, b, x[k + 6], S13, 0xA8304613); [/n] md5_FF(ref b, c, d, a, x[k + 7], S14, 0xFD469501); [/n] md5_FF(ref a, b, c, d, x[k + 8], S11, 0x698098D8); [/n] md5_FF(ref d, a, b, c, x[k + 9], S12, 0x8B44F7AF); [/n] md5_FF(ref c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); [/n] md5_FF(ref b, c, d, a, x[k + 11], S14, 0x895CD7BE); [/n] md5_FF(ref a, b, c, d, x[k + 12], S11, 0x6B901122); [/n] md5_FF(ref d, a, b, c, x[k + 13], S12, 0xFD987193); [/n] md5_FF(ref c, d, a, b, x[k + 14], S13, 0xA679438E); [/n] md5_FF(ref b, c, d, a, x[k + 15], S14, 0x49B40821); [/n] md5_GG(ref a, b, c, d, x[k + 1], S21, 0xF61E2562); [/n] md5_GG(ref d, a, b, c, x[k + 6], S22, 0xC040B340); [/n] md5_GG(ref c, d, a, b, x[k + 11], S23, 0x265E5A51); [/n] md5_GG(ref b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); [/n] md5_GG(ref a, b, c, d, x[k + 5], S21, 0xD62F105D); [/n] md5_GG(ref d, a, b, c, x[k + 10], S22, 0x2441453); [/n] md5_GG(ref c, d, a, b, x[k + 15], S23, 0xD8A1E681); [/n] md5_GG(ref b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); [/n] md5_GG(ref a, b, c, d, x[k + 9], S21, 0x21E1CDE6); [/n] md5_GG(ref d, a, b, c, x[k + 14], S22, 0xC33707D6); [/n] md5_GG(ref c, d, a, b, x[k + 3], S23, 0xF4D50D87); [/n] md5_GG(ref b, c, d, a, x[k + 8], S24, 0x455A14ED); [/n] md5_GG(ref a, b, c, d, x[k + 13], S21, 0xA9E3E905); [/n] md5_GG(ref d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); [/n] md5_GG(ref c, d, a, b, x[k + 7], S23, 0x676F02D9); [/n] md5_GG(ref b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); [/n] md5_HH(ref a, b, c, d, x[k + 5], S31, 0xFFFA3942); [/n] md5_HH(ref d, a, b, c, x[k + 8], S32, 0x8771F681); [/n] md5_HH(ref c, d, a, b, x[k + 11], S33, 0x6D9D6122); [/n] md5_HH(ref b, c, d, a, x[k + 14], S34, 0xFDE5380C); [/n] md5_HH(ref a, b, c, d, x[k + 1], S31, 0xA4BEEA44); [/n] md5_HH(ref d, a, b, c, x[k + 4], S32, 0x4BDECFA9); [/n] md5_HH(ref c, d, a, b, x[k + 7], S33, 0xF6BB4B60); [/n] md5_HH(ref b, c, d, a, x[k + 10], S34, 0xBEBFBC70); [/n] md5_HH(ref a, b, c, d, x[k + 13], S31, 0x289B7EC6); [/n] md5_HH(ref d, a, b, c, x[k + 0], S32, 0xEAA127FA); [/n] md5_HH(ref c, d, a, b, x[k + 3], S33, 0xD4EF3085); [/n] md5_HH(ref b, c, d, a, x[k + 6], S34, 0x4881D05); [/n] md5_HH(ref a, b, c, d, x[k + 9], S31, 0xD9D4D039); [/n] md5_HH(ref d, a, b, c, x[k + 12], S32, 0xE6DB99E5); [/n] md5_HH(ref c, d, a, b, x[k + 15], S33, 0x1FA27CF8); [/n] md5_HH(ref b, c, d, a, x[k + 2], S34, 0xC4AC5665); [/n] md5_II(ref a, b, c, d, x[k + 0], S41, 0xF4292244); [/n] md5_II(ref d, a, b, c, x[k + 7], S42, 0x432AFF97); [/n] md5_II(ref c, d, a, b, x[k + 14], S43, 0xAB9423A7); [/n] md5_II(ref b, c, d, a, x[k + 5], S44, 0xFC93A039); [/n] md5_II(ref a, b, c, d, x[k + 12], S41, 0x655B59C3); [/n] md5_II(ref d, a, b, c, x[k + 3], S42, 0x8F0CCC92); [/n] md5_II(ref c, d, a, b, x[k + 10], S43, 0xFFEFF47D); [/n] md5_II(ref b, c, d, a, x[k + 1], S44, 0x85845DD1); [/n] md5_II(ref a, b, c, d, x[k + 8], S41, 0x6FA87E4F); [/n] md5_II(ref d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); [/n] md5_II(ref c, d, a, b, x[k + 6], S43, 0xA3014314); [/n] md5_II(ref b, c, d, a, x[k + 13], S44, 0x4E0811A1); [/n] md5_II(ref a, b, c, d, x[k + 4], S41, 0xF7537E82); [/n] md5_II(ref d, a, b, c, x[k + 11], S42, 0xBD3AF235); [/n] md5_II(ref c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); [/n] md5_II(ref b, c, d, a, x[k + 9], S44, 0xEB86D391); [/n] [/n] a = AddUnsigned(a, AA); [/n] b = AddUnsigned(b, BB); [/n] c = AddUnsigned(c, CC); [/n] d = AddUnsigned(d, DD); [/n] } [/n] [/n] if (stype == 32) [/n] { [/n] MD5 = ((((WordToHex(a)) + (WordToHex(b))) + (WordToHex(c))) + (WordToHex(d))).ToLower(); [/n] //MD5 = ((((WordToHex(c).Substring(3, 4)) + (WordToHex(a).Substring(3, 4))) + (WordToHex(d).Substring(3, 4))) + (WordToHex(b).Substring(3, 4))).ToLower(); [/n] } [/n] else [/n] { [/n] MD5 = ((WordToHex(b)) + (WordToHex(c))).ToLower(); [/n] } [/n] return MD5; [/n] } [/n] } [/n]} [/n] [/n][/html]</p>
<p>以下为MD5算法用VB的实现<br />
[html]//MD5.vb [/n]//MD5 16-bit,32-bits algorithm implemented in C# [/n]Namespace Encrypter [/n] [/n] Public Class MD5 [/n] Private Const BITS_TO_A_BYTE As Integer = 8 [/n] Private Const BYTES_TO_A_WORD As Integer = 4 [/n] Private Const BITS_TO_A_WORD As Integer = 32 [/n] [/n] Private Shared m_lOnBits(30) As Long [/n] Private Shared m_l2Power(30) As Long [/n] [/n] Public Shared Function LShift(ByVal lValue As Long, ByVal iShiftBits As Integer) As Long [/n] If iShiftBits = 0 Then [/n] LShift = lValue [/n] Exit Function [/n] ElseIf iShiftBits = 31 Then [/n] If lValue And 1 Then [/n] LShift = &amp;H80000000 [/n] Else [/n] LShift = 0 [/n] End If [/n] Exit Function [/n] ElseIf iShiftBits < 0 Or iShiftBits > 31 Then [/n] Err.Raise(6) [/n] End If [/n] [/n] If (lValue And m_l2Power(31 - iShiftBits)) Then [/n] LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &amp;H80000000 [/n] Else [/n] LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits)) [/n] End If [/n] End Function [/n] [/n] Public Shared Function RShift(ByVal lValue As Long, ByVal iShiftBits As Integer) As Long [/n] If iShiftBits = 0 Then [/n] RShift = lValue [/n] Exit Function [/n] ElseIf iShiftBits = 31 Then [/n] If lValue And &amp;H80000000 Then [/n] RShift = 1 [/n] Else [/n] RShift = 0 [/n] End If [/n] Exit Function [/n] ElseIf iShiftBits < 0 Or iShiftBits > 31 Then [/n] Err.Raise(6) [/n] End If [/n] [/n] RShift = (lValue And &amp;H7FFFFFFE) \ m_l2Power(iShiftBits) [/n] [/n] If (lValue And &amp;H80000000) Then [/n] RShift = (RShift Or (&amp;H40000000 \ m_l2Power(iShiftBits - 1))) [/n] End If [/n] End Function [/n] [/n] Public Shared Function RotateLeft(ByVal lValue As Long, ByVal iShiftBits As Integer) As Long [/n] RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits)) [/n] End Function [/n] [/n] Private Shared Function AddUnsigned(ByVal lX As Long, ByVal lY As Long) As Long [/n] Dim lX4 As Long [/n] Dim lY4 As Long [/n] Dim lX8 As Long [/n] Dim lY8 As Long [/n] Dim lResult As Long [/n] [/n] lX8 = lX And &amp;H80000000 [/n] lY8 = lY And &amp;H80000000 [/n] lX4 = lX And &amp;H40000000 [/n] lY4 = lY And &amp;H40000000 [/n] [/n] lResult = (lX And &amp;H3FFFFFFF) + (lY And &amp;H3FFFFFFF) [/n] [/n] If lX4 And lY4 Then [/n] lResult = lResult Xor &amp;H80000000 Xor lX8 Xor lY8 [/n] ElseIf lX4 Or lY4 Then [/n] If lResult And &amp;H40000000 Then [/n] lResult = lResult Xor &amp;HC0000000 Xor lX8 Xor lY8 [/n] Else [/n] lResult = lResult Xor &amp;H40000000 Xor lX8 Xor lY8 [/n] End If [/n] Else [/n] lResult = lResult Xor lX8 Xor lY8 [/n] End If [/n] [/n] AddUnsigned = lResult [/n] End Function [/n] [/n] Private Shared Function md5_F(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long [/n] md5_F = (x And y) Or ((Not x) And z) [/n] End Function [/n] [/n] Private Shared Function md5_G(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long [/n] md5_G = (x And z) Or (y And (Not z)) [/n] End Function [/n] [/n] Private Shared Function md5_H(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long [/n] md5_H = (x Xor y Xor z) [/n] End Function [/n] [/n] Private Shared Function md5_I(ByVal x As Long, ByVal y As Long, ByVal z As Long) As Long [/n] md5_I = (y Xor (x Or (Not z))) [/n] End Function [/n] [/n] Private Shared Sub md5_FF(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long) [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac)) [/n] a = RotateLeft(a, s) [/n] a = AddUnsigned(a, b) [/n] End Sub [/n] [/n] Private Shared Sub md5_GG(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long) [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac)) [/n] a = RotateLeft(a, s) [/n] a = AddUnsigned(a, b) [/n] End Sub [/n] [/n] Private Shared Sub md5_HH(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long) [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac)) [/n] a = RotateLeft(a, s) [/n] a = AddUnsigned(a, b) [/n] End Sub [/n] [/n] Private Shared Sub md5_II(ByRef a As Long, ByVal b As Long, ByVal c As Long, ByVal d As Long, ByVal x As Long, ByVal s As Long, ByVal ac As Long) [/n] a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac)) [/n] a = RotateLeft(a, s) [/n] a = AddUnsigned(a, b) [/n] End Sub [/n] [/n] Private Shared Function ConvertToWordArray(ByVal sMessage As String) [/n] Dim lMessageLength As Integer [/n] Dim lNumberOfWords As Integer [/n] Dim lWordArray() As Long [/n] Dim lBytePosition As Integer [/n] Dim lByteCount As Integer [/n] Dim lWordCount As Integer [/n] [/n] Const MODULUS_BITS As Long = 512 [/n] Const CONGRUENT_BITS As Long = 448 [/n] [/n] lMessageLength = Len(sMessage) [/n] [/n] lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD) [/n] ReDim lWordArray(lNumberOfWords - 1) [/n] [/n] lBytePosition = 0 [/n] lByteCount = 0 [/n] Do Until lByteCount >= lMessageLength [/n] lWordCount = lByteCount \ BYTES_TO_A_WORD [/n] lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE [/n] lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition) [/n] lByteCount = lByteCount + 1 [/n] Loop [/n] [/n] lWordCount = lByteCount \ BYTES_TO_A_WORD [/n] lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE [/n] [/n] lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&amp;H80, lBytePosition) [/n] [/n] lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3) [/n] lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) [/n] [/n] ConvertToWordArray = lWordArray [/n] End Function [/n] [/n] Public Shared Function WordToHex(ByVal lValue As Long) [/n] Dim lByte As Long [/n] Dim lCount As Long [/n] [/n] For lCount = 0 To 3 [/n] lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1) [/n] WordToHex = WordToHex &amp; Right("0" &amp; Hex(lByte), 2) [/n] Next [/n] End Function [/n] [/n] Public Shared Function Encrypt(ByVal sMessage As String, ByVal stype As Integer) [/n] m_lOnBits(0) = CLng(1) [/n] m_lOnBits(1) = CLng(3) [/n] m_lOnBits(2) = CLng(7) [/n] m_lOnBits(3) = CLng(15) [/n] m_lOnBits(4) = CLng(31) [/n] m_lOnBits(5) = CLng(63) [/n] m_lOnBits(6) = CLng(127) [/n] m_lOnBits(7) = CLng(255) [/n] m_lOnBits(8) = CLng(511) [/n] m_lOnBits(9) = CLng(1023) [/n] m_lOnBits(10) = CLng(2047) [/n] m_lOnBits(11) = CLng(4095) [/n] m_lOnBits(12) = CLng(8191) [/n] m_lOnBits(13) = CLng(16383) [/n] m_lOnBits(14) = CLng(32767) [/n] m_lOnBits(15) = CLng(65535) [/n] m_lOnBits(16) = CLng(131071) [/n] m_lOnBits(17) = CLng(262143) [/n] m_lOnBits(18) = CLng(524287) [/n] m_lOnBits(19) = CLng(1048575) [/n] m_lOnBits(20) = CLng(2097151) [/n] m_lOnBits(21) = CLng(4194303) [/n] m_lOnBits(22) = CLng(8388607) [/n] m_lOnBits(23) = CLng(16777215) [/n] m_lOnBits(24) = CLng(33554431) [/n] m_lOnBits(25) = CLng(67108863) [/n] m_lOnBits(26) = CLng(134217727) [/n] m_lOnBits(27) = CLng(268435455) [/n] m_lOnBits(28) = CLng(536870911) [/n] m_lOnBits(29) = CLng(1073741823) [/n] m_lOnBits(30) = CLng(2147483647) [/n] [/n] m_l2Power(0) = CLng(1) [/n] m_l2Power(1) = CLng(2) [/n] m_l2Power(2) = CLng(4) [/n] m_l2Power(3) = CLng(8) [/n] m_l2Power(4) = CLng(16) [/n] m_l2Power(5) = CLng(32) [/n] m_l2Power(6) = CLng(64) [/n] m_l2Power(7) = CLng(128) [/n] m_l2Power(8) = CLng(256) [/n] m_l2Power(9) = CLng(512) [/n] m_l2Power(10) = CLng(1024) [/n] m_l2Power(11) = CLng(2048) [/n] m_l2Power(12) = CLng(4096) [/n] m_l2Power(13) = CLng(8192) [/n] m_l2Power(14) = CLng(16384) [/n] m_l2Power(15) = CLng(32768) [/n] m_l2Power(16) = CLng(65536) [/n] m_l2Power(17) = CLng(131072) [/n] m_l2Power(18) = CLng(262144) [/n] m_l2Power(19) = CLng(524288) [/n] m_l2Power(20) = CLng(1048576) [/n] m_l2Power(21) = CLng(2097152) [/n] m_l2Power(22) = CLng(4194304) [/n] m_l2Power(23) = CLng(8388608) [/n] m_l2Power(24) = CLng(16777216) [/n] m_l2Power(25) = CLng(33554432) [/n] m_l2Power(26) = CLng(67108864) [/n] m_l2Power(27) = CLng(134217728) [/n] m_l2Power(28) = CLng(268435456) [/n] m_l2Power(29) = CLng(536870912) [/n] m_l2Power(30) = CLng(1073741824) [/n] [/n] [/n] Dim x() As Long [/n] Dim k As Integer [/n] Dim AA As Integer [/n] Dim BB As Integer [/n] Dim CC As Integer [/n] Dim DD As Integer [/n] Dim a As Integer [/n] Dim b As Integer [/n] Dim c As Integer [/n] Dim d As Integer [/n] [/n] Const S11 As Integer = 7 [/n] Const S12 As Integer = 12 [/n] Const S13 As Integer = 17 [/n] Const S14 As Integer = 22 [/n] Const S21 As Integer = 5 [/n] Const S22 As Integer = 9 [/n] Const S23 As Integer = 14 [/n] Const S24 As Integer = 20 [/n] Const S31 As Integer = 4 [/n] Const S32 As Integer = 11 [/n] Const S33 As Integer = 16 [/n] Const S34 As Integer = 23 [/n] Const S41 As Integer = 6 [/n] Const S42 As Integer = 10 [/n] Const S43 As Integer = 15 [/n] Const S44 As Integer = 21 [/n] [/n] x = ConvertToWordArray(sMessage) [/n] [/n] a = &amp;H67452301 [/n] b = &amp;HEFCDAB89 [/n] c = &amp;H98BADCFE [/n] d = &amp;H10325476 [/n] [/n] For k = 0 To UBound(x) Step 16 [/n] AA = a [/n] BB = b [/n] CC = c [/n] DD = d [/n] [/n] md5_FF(a, b, c, d, x(k + 0), S11, &amp;HD76AA478) [/n] md5_FF(d, a, b, c, x(k + 1), S12, &amp;HE8C7B756) [/n] md5_FF(c, d, a, b, x(k + 2), S13, &amp;H242070DB) [/n] md5_FF(b, c, d, a, x(k + 3), S14, &amp;HC1BDCEEE) [/n] md5_FF(a, b, c, d, x(k + 4), S11, &amp;HF57C0FAF) [/n] md5_FF(d, a, b, c, x(k + 5), S12, &amp;H4787C62A) [/n] md5_FF(c, d, a, b, x(k + 6), S13, &amp;HA8304613) [/n] md5_FF(b, c, d, a, x(k + 7), S14, &amp;HFD469501) [/n] md5_FF(a, b, c, d, x(k + 8), S11, &amp;H698098D8) [/n] md5_FF(d, a, b, c, x(k + 9), S12, &amp;H8B44F7AF) [/n] md5_FF(c, d, a, b, x(k + 10), S13, &amp;HFFFF5BB1) [/n] md5_FF(b, c, d, a, x(k + 11), S14, &amp;H895CD7BE) [/n] md5_FF(a, b, c, d, x(k + 12), S11, &amp;H6B901122) [/n] md5_FF(d, a, b, c, x(k + 13), S12, &amp;HFD987193) [/n] md5_FF(c, d, a, b, x(k + 14), S13, &amp;HA679438E) [/n] md5_FF(b, c, d, a, x(k + 15), S14, &amp;H49B40821) [/n] [/n] md5_GG(a, b, c, d, x(k + 1), S21, &amp;HF61E2562) [/n] md5_GG(d, a, b, c, x(k + 6), S22, &amp;HC040B340) [/n] md5_GG(c, d, a, b, x(k + 11), S23, &amp;H265E5A51) [/n] md5_GG(b, c, d, a, x(k + 0), S24, &amp;HE9B6C7AA) [/n] md5_GG(a, b, c, d, x(k + 5), S21, &amp;HD62F105D) [/n] md5_GG(d, a, b, c, x(k + 10), S22, &amp;H2441453) [/n] md5_GG(c, d, a, b, x(k + 15), S23, &amp;HD8A1E681) [/n] md5_GG(b, c, d, a, x(k + 4), S24, &amp;HE7D3FBC8) [/n] md5_GG(a, b, c, d, x(k + 9), S21, &amp;H21E1CDE6) [/n] md5_GG(d, a, b, c, x(k + 14), S22, &amp;HC33707D6) [/n] md5_GG(c, d, a, b, x(k + 3), S23, &amp;HF4D50D87) [/n] md5_GG(b, c, d, a, x(k + 8), S24, &amp;H455A14ED) [/n] md5_GG(a, b, c, d, x(k + 13), S21, &amp;HA9E3E905) [/n] md5_GG(d, a, b, c, x(k + 2), S22, &amp;HFCEFA3F8) [/n] md5_GG(c, d, a, b, x(k + 7), S23, &amp;H676F02D9) [/n] md5_GG(b, c, d, a, x(k + 12), S24, &amp;H8D2A4C8A) [/n] [/n] md5_HH(a, b, c, d, x(k + 5), S31, &amp;HFFFA3942) [/n] md5_HH(d, a, b, c, x(k + 8), S32, &amp;H8771F681) [/n] md5_HH(c, d, a, b, x(k + 11), S33, &amp;H6D9D6122) [/n] md5_HH(b, c, d, a, x(k + 14), S34, &amp;HFDE5380C) [/n] md5_HH(a, b, c, d, x(k + 1), S31, &amp;HA4BEEA44) [/n] md5_HH(d, a, b, c, x(k + 4), S32, &amp;H4BDECFA9) [/n] md5_HH(c, d, a, b, x(k + 7), S33, &amp;HF6BB4B60) [/n] md5_HH(b, c, d, a, x(k + 10), S34, &amp;HBEBFBC70) [/n] md5_HH(a, b, c, d, x(k + 13), S31, &amp;H289B7EC6) [/n] md5_HH(d, a, b, c, x(k + 0), S32, &amp;HEAA127FA) [/n] md5_HH(c, d, a, b, x(k + 3), S33, &amp;HD4EF3085) [/n] md5_HH(b, c, d, a, x(k + 6), S34, &amp;H4881D05) [/n] md5_HH(a, b, c, d, x(k + 9), S31, &amp;HD9D4D039) [/n] md5_HH(d, a, b, c, x(k + 12), S32, &amp;HE6DB99E5) [/n] md5_HH(c, d, a, b, x(k + 15), S33, &amp;H1FA27CF8) [/n] md5_HH(b, c, d, a, x(k + 2), S34, &amp;HC4AC5665) [/n] [/n] md5_II(a, b, c, d, x(k + 0), S41, &amp;HF4292244) [/n] md5_II(d, a, b, c, x(k + 7), S42, &amp;H432AFF97) [/n] md5_II(c, d, a, b, x(k + 14), S43, &amp;HAB9423A7) [/n] md5_II(b, c, d, a, x(k + 5), S44, &amp;HFC93A039) [/n] md5_II(a, b, c, d, x(k + 12), S41, &amp;H655B59C3) [/n] md5_II(d, a, b, c, x(k + 3), S42, &amp;H8F0CCC92) [/n] md5_II(c, d, a, b, x(k + 10), S43, &amp;HFFEFF47D) [/n] md5_II(b, c, d, a, x(k + 1), S44, &amp;H85845DD1) [/n] md5_II(a, b, c, d, x(k + 8), S41, &amp;H6FA87E4F) [/n] md5_II(d, a, b, c, x(k + 15), S42, &amp;HFE2CE6E0) [/n] md5_II(c, d, a, b, x(k + 6), S43, &amp;HA3014314) [/n] md5_II(b, c, d, a, x(k + 13), S44, &amp;H4E0811A1) [/n] md5_II(a, b, c, d, x(k + 4), S41, &amp;HF7537E82) [/n] md5_II(d, a, b, c, x(k + 11), S42, &amp;HBD3AF235) [/n] md5_II(c, d, a, b, x(k + 2), S43, &amp;H2AD7D2BB) [/n] md5_II(b, c, d, a, x(k + 9), S44, &amp;HEB86D391) [/n] Console.WriteLine(a) [/n] a = AddUnsigned(a, AA) [/n] b = AddUnsigned(b, BB) [/n] c = AddUnsigned(c, CC) [/n] d = AddUnsigned(d, DD) [/n] Next [/n] [/n] If stype = 32 Then [/n] Encrypt = LCase(WordToHex(a) &amp; WordToHex(b) &amp; WordToHex(c) &amp; WordToHex(d)) [/n] Else [/n] Encrypt = LCase(WordToHex(b) &amp; WordToHex(c)) [/n] End If [/n] End Function [/n] [/n] End Class [/n] [/n]End Namespace [/n] [/n][/html]</p>]]></description></item><item><title><![CDATA[DVBBS8.2手动修改版面帖子按发帖时间排序方式]]></title><pubDate>Wed, 15 Oct 2008 10:05:22 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2008/10/200810151005227204.htm</link><description><![CDATA[<p>[code] <br />
'DVBBS8.2手动修改版面帖子按发帖时间排序方式 <br />
'1、打开index.asp页面，查找Dim OrderField,OrderStr <br />
'2、将下面 If OrderId=0 Then <br />
' OrderField="LastPostTime" <br />
'修改为： If OrderId=0 and Dvbbs.BoardID<>23 Then <br />
' OrderField="LastPostTime" <br />
' ElseIf OrderId=0 and Dvbbs.BoardID=23 then <br />
' OrderField="TopicId" <br />
'其中23为你修改版面的BoardID参数，在每个页面的地址栏可以看到这个参数 <br />
'如有需要修改多个版面按发帖时间排序的话请对应修改.如：If OrderId=0 and Dvbbs.BoardID<>23 or Dvbbs.BoardID<>24 和 ElseIf OrderId=0 and Dvbbs.BoardID=23 or Dvbbs.BoardID=24 这两处即可。 <br />
'其它排序方式可参考此修改方法。 <br />
'注：此方法修改后会有个小BUG ，会造成前台手动提交按回复时间排序失效，其它排序方式正常。 <br />
'Javen.Du 2008.10.15修改</p>
<p>'以下为ShowTopic_2() 函数最后修改后的<br />
<br />
Sub ShowTopic_2() Rem 查询普通帖子列表 <br />
Dim SQLQuery,d <br />
If IsSqlDataBase=1 Then <br />
d="" <br />
Else <br />
d="'" <br />
End If <br />
Select Case CInt(list_type(0)) Rem 条件查询 <br />
Case 0 : SQLQuery = " " <br />
Case 1 : SQLQuery = " And datediff("&amp;(d&amp;"d"&amp;d)&amp;",DateAndTime,"&amp;SqlNowString&amp;")=0" <br />
Case 2 : SQLQuery = " And datediff("&amp;(d&amp;"ww"&amp;d)&amp;",DateAndTime,"&amp;SqlNowString&amp;")=0" <br />
Case 3 : SQLQuery = " And datediff("&amp;(d&amp;"m"&amp;d)&amp;",DateAndTime,"&amp;SqlNowString&amp;")=0" <br />
Case 4 : SQLQuery = " And datediff("&amp;(d&amp;"d"&amp;d)&amp;",DateAndTime,"&amp;SqlNowString&amp;")=180" <br />
Case 5 : SQLQuery = " And datediff("&amp;(d&amp;"yyyy"&amp;d)&amp;",DateAndTime,"&amp;SqlNowString&amp;")=0" <br />
Case 6 : SQLQuery = " And isbest=1" <br />
Case 7 : SQLQuery = " And isvote=1" <br />
Case 8 <br />
If Dvbbs.UserID>0 Then SQLQuery = " And postuserid="&amp;Dvbbs.UserID <br />
Case Else : SQLQuery = " " <br />
End Select <br />
Dim OrderId,SortId <br />
OrderId=CInt(list_type(1)) <br />
SortId=CInt(list_type(2)) <br />
<br />
If Not IsObject(Conn) Then ConnectionDatabase <br />
If IsSqlDataBase=1 And IsBuss=1 Then <br />
Set Cmd = Dvbbs.iCreateObject("ADODB.Command") <br />
Set Cmd.ActiveConnection=conn <br />
Cmd.CommandText="dv_TopicList" <br />
Cmd.CommandType=4 <br />
Cmd.Parameters.Append cmd.CreateParameter("@boardid",3) <br />
Cmd.Parameters.Append cmd.CreateParameter("@pagenow",3) <br />
Cmd.Parameters.Append cmd.CreateParameter("@pagesize",3) <br />
Cmd.Parameters.Append cmd.CreateParameter("@topicmode",3) <br />
Cmd.Parameters.Append cmd.CreateParameter("@inConditions",200,1,250) <br />
Cmd.Parameters.Append cmd.CreateParameter("@inOrder",3) <br />
Cmd.Parameters.Append cmd.CreateParameter("@inSort",3) <br />
Cmd.Parameters.Append cmd.CreateParameter("@totalrec",3,2,4) <br />
<br />
Cmd("@boardid")=Dvbbs.BoardID <br />
Cmd("@pagenow")=Page <br />
Cmd("@pagesize")=Cint(Dvbbs.Board_Setting(26)) <br />
Cmd("@topicmode")=TopicMode <br />
Cmd("@inConditions")=SQLQuery <br />
Cmd("@inOrder")=OrderId <br />
Cmd("@inSort")=SortId <br />
<br />
Set Rs=Cmd.Execute <br />
If Not Rs.EoF Then <br />
Topic=Rs.GetRows(-1) <br />
Else <br />
Topic=Null <br />
End If <br />
Rs.close() <br />
Set Rs=Nothing <br />
Count = Cmd("@totalrec") <br />
Set Cmd = Nothing <br />
Else <br />
Dim OrderField,OrderStr <br />
'2008.10.15 Javen 修改程序 公告栏版面按发帖时间排序 <br />
If OrderId=0 and Dvbbs.BoardID<>23 Then '原：If OrderId=0 Then <br />
OrderField="LastPostTime" <br />
ElseIf OrderId=0 and Dvbbs.BoardID=23 then '原"" <br />
OrderField="TopicId" '原"" <br />
ElseIf OrderId=1 Then <br />
OrderField="TopicId" <br />
ElseIf OrderId=2 Then <br />
OrderField="hits" <br />
ElseIf OrderId=3 Then <br />
OrderField="child" <br />
Else <br />
OrderField="LastPostTime" <br />
End If <br />
' Response.Write OrderField&amp;"|"&amp;OrderId&amp;"|"&amp;Dvbbs.BoardID <br />
'修改完毕 <br />
If SortId=0 Then <br />
OrderStr="DESC" <br />
Else <br />
OrderStr="ASC" <br />
End If <br />
<br />
Set Rs = Dvbbs.iCreateObject("adodb.recordset") <br />
If Cint(TopicMode)=0 Then <br />
Sql="Select TopicID,boardid,title,postusername,postuserid,dateandtime,child,hits,votetotal,lastpost,lastposttime,istop,isvote,isbest,locktopic,Expression,TopicMode,Mode,GetMoney,GetMoneyType,UseTools,IsSmsTopic,hidename From Dv_Topic Where BoardID="&amp;Dvbbs.BoardID&amp;" And IsTop=0 "&amp;SQLQuery&amp;" Order By "&amp;OrderField&amp;" "&amp; OrderStr <br />
Else <br />
Sql="Select TopicID,boardid,title,postusername,postuserid,dateandtime,child,hits,votetotal,lastpost,lastposttime,istop,isvote,isbest,locktopic,Expression,TopicMode,Mode,GetMoney,GetMoneyType,UseTools,IsSmsTopic,hidename From Dv_Topic Where Mode="&amp;TopicMode&amp;" and BoardID="&amp;Dvbbs.BoardID&amp;" And IsTop=0 "&amp;SQLQuery&amp;" Order By "&amp;OrderField &amp;" "&amp; OrderStr <br />
End If <br />
Rs.Open Sql,Conn,1,1 <br />
If Page >1 Then <br />
Rs.Move (page-1) * Clng(Dvbbs.Board_Setting(26)) <br />
End If <br />
If Not Rs.EoF Then <br />
Topic=Rs.GetRows(Dvbbs.Board_Setting(26)) <br />
Else <br />
Topic=Null <br />
End If <br />
<br />
Count = Rs.RecordCount <br />
<br />
Rs.close() <br />
Set Rs=Nothing <br />
End If <br />
[/code]</p>]]></description></item><item><title><![CDATA[不用JS数组，关联二级下拉选筐]]></title><pubDate>Mon, 13 Oct 2008 17:12:17 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2008/10/200810131712172801.htm</link><description><![CDATA[<p>[html]<script language="javascript"type="text/jscript"> [/n] [/n]function change(str) [/n]{ [/n]if(str!=0) [/n]{ [/n]document.getElementById("Selectcd").innerHTML=document.getElementById("sText"+str).innerHTML; [/n]}else [/n]{ [/n]document.getElementById("Selectcd").innerHTML=document.getElementById("csh2").innerHTML; [/n]} [/n]} [/n]</script> [/n] [/n]<body> [/n]<form method="post" action=""> [/n]所属频道： [/n]<div id="Selectpd"> [/n]<select name="wj_Pd" id="Select1" onChange="change(this.options[this.selectedIndex].value)"> [/n]<option value="0">===请选择频道===</option> [/n]<option value="1">频道1</option> [/n]<option value="2">频道2</option> [/n]</select> [/n]</div> [/n]<div id="Selectcd"> [/n]<select id="Select2"> [/n]<option value="0">===请选择分别===</option> [/n]</select> [/n]</div> [/n]<input name="Submit1" type="submit" value="提交"> [/n]</form> [/n] [/n] [/n]<!--下面是关联表清单--> [/n] [/n]<div id="Selectpd2" style="display:none"> [/n]<div id="csh2"> [/n]<select id="Select2"> [/n]<option selected="selected" value="0">===请选择分类===</option> [/n]</select> [/n]</div> [/n] [/n]<!--如果数据从数据库中读出 sText1 为 sText+数据大表中的value 依次循环下去 --> [/n]<div id="sText1"> [/n]<select id="Select2" name="wj_ClassID"> [/n]<option value="0">===请选择分类===</option> [/n]<option value="3">频道1-类别1</option> [/n]<option value="4">频道1-类别2</option> [/n]<option value="5">频道1-类别3</option> [/n]</select> [/n]</div> [/n] [/n]<div id="sText2"> [/n]<select id="Select2" name="wj_ClassID"> [/n]<option value="0">===请选择分类===</option> [/n]<option value="6">频道2-类别1</option> [/n]<option value="7">频道2-类别2</option> [/n]<option value="8">频道2-类别3</option> [/n]</select> [/n]</div> [/n] [/n] [/n]</div> [/n] [/n]</body> [/n][/html]</p>]]></description></item><item><title><![CDATA[Foxmail邮件客户端mailto缓冲区溢出漏洞]]></title><pubDate>Fri, 10 Oct 2008 16:38:20 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/10/200810101638203345.htm</link><description><![CDATA[<p><strong>发布日期：</strong>2008-09-22<br />
<strong>更新日期：</strong>2008-09-24<br />
<br />
<strong>受影响系统：</strong></p>
<blockquote>Tencent Foxmail 6.5</blockquote>
<p><strong>描述：</strong></p>
<hr />
<p>BUGTRAQ  ID: <a target="_blank" href="http://www.securityfocus.com/bid/31294">31294</a><br />
<br />
Foxmail是在中国非常广泛使用的邮件客户端。<br />
<br />
Foxmail客户端在处理href标签中的mailto字段时存在缓冲区溢出漏洞。如果用户将Foxmail设置为默认的邮件客户端的话，则受骗点击了网页中的发送邮件链接的话就可能触发这个溢出，导致客户端崩溃。<br />
<br />
<*来源：Friddy<br />
  *><br />
<br />
<strong>测试方法：</strong></p>
<hr />
<p><html><br />
<body><br />
<P>Author:friddy   QQ:568623<br />
<P>Result:Program Crash<br />
<BR><br />
<A href="mailto:A%...............................................................................................................AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.com"><br />
<br />
ClickME</a><br />
>Clickme</A><br />
</body><br />
</html><br />
<br />
<strong>建议：</strong>
<p> </p>
<hr />
<p>厂商补丁：<br />
<br />
Tencent<br />
-------<br />
目前厂商还没有提供补丁或者升级程序，我们建议使用此软件的用户随时关注厂商的主页以获取最新版本：<br />
<br />
<a target="_blank" href="http://fox.foxmail.com.cn/">http://fox.foxmail.com.cn/</a></p>
</p>
<p align="center">警 告<br />
<br />
以下程序(方法)可能带有攻击性，仅供安全研究与教学之用。使用者风险自负！</p>]]></description></item><item><title><![CDATA[订单及对应包号二级联动菜单模块]]></title><pubDate>Tue, 23 Sep 2008 15:50:56 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2008/09/200809231550562807.htm</link><description><![CDATA[<p>[html] <% [/n]'************************************************** [/n]'订单及对应包号二级联动菜单模块 [/n]'Javen.Du 2008.9.23 [/n]'说明： [/n]'支持多浏览器 [/n]'所有类别信息在同一个表中 [/n]'表结构：SF_PCNO [表名] [/n]'SF_DD_ID： 自动编号 [/n]'SF_DD_BH： 类别名称[文本] [/n]'SF_DD_XH: 箱号 [/n]'SF_DD_DDID： 父类id号[数字] [/n]'************************************************** [/n]Dim SubClsCount, rsCl [/n]Set rsCl = Server.Createobject("Adodb.Recordset") [/n]rsCl.Open "SELECT * FROM SF_PCNO where SF_DD_FL=1 and SF_DD_DDID<>0 Order by SF_CZ_Time DESC",Conn,1,1 '小类 [/n]%> [/n]<script language = "JavaScript"> [/n]var TCount = 0; [/n]subCls = new Array(); [/n]//数组中三个元素的说明：(小类ID：包号箱号Select的value内容，小类父ID：所属的订单号的ID，小类名称：Select列表显示的包号箱号名称) [/n]<% [/n]SubClsCount = 0 [/n]Do While Not rsCl.Eof [/n] %> [/n] subCls[<%=SubClsCount%>] = new Array("<%=Trim(rsCl("SF_DD_ID"))%>","<%=rsCl("SF_DD_DDID")%>","<%=Trim(rsCl("SF_DD_XH"))%>"); [/n] <% [/n] SubClsCount = SubClsCount + 1 [/n] rsCl.Movenext [/n]Loop [/n]rsCl.Close [/n]Set rsCl = Nothing [/n]%> [/n]TCount=<%=SubClsCount%>; [/n]function changelocation(locationid) [/n]{ [/n] document.getElementById("SmallClassID").length = 0; [/n] var locationid = locationid; [/n] var i; [/n] for (i=0;i < TCount; i++) [/n] { [/n] if (subCls[i][1] == locationid) [/n] { [/n] //（前边：字段三内容，显示在列表中；后边：字段一内容，显示在VALUE值中！） [/n] document.getElementById("SmallClassID").options[document.getElementById("SmallClassID").length] = new Option(subCls[i][2], subCls[i][0]); [/n] } [/n] } [/n] if (document.getElementById("SmallClassID").options.length <= 0) [/n] { [/n] document.getElementById("SmallClassID").options[document.getElementById("SmallClassID").length] = new Option("暂无包号箱号", 0); [/n] } [/n]} [/n]</script> [/n]<% [/n]Dim SelClassID [/n]Set rsCl = Server.Createobject("Adodb.Recordset") [/n]rsCl.Open "SELECT * FROM SF_PCNO where SF_DD_FL=1 and SF_DD_DDID=0 Order by SF_CZ_Time DESC",Conn,1,1 '订单号 [/n]If rsCl.Eof And rsCl.Bof Then [/n] Response.Write "请添加订单号!" [/n] Response.End() [/n]Else [/n] %> [/n] 订单号： [/n] <select name="BigClassID" size="1" id="BigClassID" onChange="changelocation(document.getElementById('BigClassID').options[document.getElementById('BigClassID').selectedIndex].value)"> [/n] <% [/n] SelClassID = rsCl("SF_DD_ID") [/n] Do While Not rsCl.Eof [/n] %> [/n] <option value="<%=rsCl("SF_DD_ID")%>"><%=rsCl("SF_DD_BH")%></option> [/n] <% [/n] rsCl.Movenext [/n] Loop [/n] %> [/n] </select> [/n] <% [/n]End If [/n]rsCl.Close [/n]%> [/n]包(箱)号： [/n]<% [/n]Dim SmallClassList [/n]SmallClassList = "<select name=SmallClassID id=SmallClassID>" [/n]rsCl.Open "SELECT * FROM SF_PCNO Where SF_DD_FL=1 and SF_DD_DDID="&amp;SelClassID&amp;" Order by SF_CZ_Time DESC",Conn,1,1 '包号箱号 [/n]If Not (rsCl.Eof And rsCl.Bof) Then [/n] Do While Not rsCl.Eof [/n] SmallClassList = SmallClassList &amp; "<option value='"&amp;rsCl("SF_DD_ID")&amp;"'>"&amp;rsCl("SF_DD_XH")&amp;"</option>" [/n] rsCl.Movenext [/n] Loop [/n]Else [/n] SmallClassList = SmallClassList &amp; "<option value='0'>暂无包(箱)号</option>" [/n]End If [/n]rsCl.Close [/n]Set rsCl = Nothing [/n]SmallClassList = SmallClassList &amp; "</select>" [/n]Response.Write(SmallClassList) [/n]%> [/html]</p>]]></description></item><item><title><![CDATA[一个高效率的分页方法！]]></title><pubDate>Sat, 20 Sep 2008 15:18:20 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2008/09/200809201518206457.htm</link><description><![CDATA[<p>SQL部分<br />
[code]' ' ' ' ' ' ' ' ' ' ' '分页SQL语句函数 <br />
Function GetPageSQL(TableName,FieldName,SearchWhere,OrderFieldName,OnlyFieldName,OrderType,PageSizeNum,Page) <br />
'Power by Love_Computer 2005-05-26 12:28 <br />
'www.531.hk <br />
StrWhere = " " <br />
StrOrder = " " <br />
StrSQL = " " <br />
MaxMinID = " " <br />
If SearchWhere = " " Then <br />
StrWhere = " " <br />
MaxMinID = " WHERE ( [ " &amp; OnlyFieldName &amp; "] " <br />
Else <br />
StrWhere = " WHERE " &amp; SearchWhere &amp; " " <br />
MaxMinID = " AND ( [ " &amp; OnlyFieldName &amp; "] " <br />
End If <br />
If OrderType = 0 Then <br />
MaxMinID = MaxMinID &amp; " > ( SELECT MAX " <br />
StrOrder = " ORDER BY [ " &amp; OrderFieldName &amp; "] ASC " <br />
Else <br />
MaxMinID = MaxMinID &amp; " < ( SELECT MIN " <br />
StrOrder = " ORDER BY [ " &amp; OrderFieldName &amp; "] DESC " <br />
End If <br />
If Page = 1 or Page = 0 Then <br />
StrSQL = "SELECT TOP " &amp; PageSizeNum &amp; " " &amp; FieldName &amp; " FROM [ " &amp; TableName &amp; "] " &amp; StrWhere &amp; StrOrder <br />
Else <br />
StrSQL = "SELECT TOP " &amp; PageSizeNum &amp; " " &amp; FieldName &amp; " FROM [ " &amp; TableName &amp; "] " &amp; StrWhere &amp; MaxMinID <br />
StrSQL = StrSQL &amp; " ([ " &amp; OnlyFieldName &amp; "]) FROM ( SELECT TOP " <br />
StrSQL = StrSQL &amp; PageSizeNum * (Page - 1) &amp; " [ " &amp; OnlyFieldName &amp; "] FROM [ " &amp; TableName &amp; "] " &amp; StrWhere &amp; StrOrder <br />
StrSQL = StrSQL &amp; " ) AS TempTable ) ) " &amp; StrOrder <br />
End If <br />
GetPageSQL = StrSQL <br />
End Function [/code]<br />
<br />
分页代码部分：<br />
[code]'''''''''''''''''''''''''''''''''''' <br />
'' 功能完整的分页程序 + 高效SQL查询语句 <br />
'' ACCESS SQL 通用 <br />
'' Power by 51yc.cn <br />
'' 最后修改时间: 2008-05-26 12:28 <br />
'''''''''''''''''''''''''''''''''''' <br />
TableName = "TestInfo" <br />
FieldName = " * " <br />
SearchWhere = "" <br />
OrderFieldName = "id" <br />
OnlyFieldName = "id" <br />
OrderType = 1 <br />
PageSizeNum = 10 <br />
Page = Trim(Request.QueryString("page")) <br />
Call ShowTotalPage() <br />
rsTotal = Session("rsTotal") <br />
TotalPages = Session("TotalPages") <br />
CurrentPage = Session("CurrentPage") <br />
Session("rsTotal") = "" <br />
Session("TotalPages") = "" <br />
Session("CurrentPage") = "" <br />
''''''''''''''''''''''''''''''''''''''''''''''''''''''''' <br />
PageSQL = GetPageSQL(TableName,FieldName,SearchWhere,OrderFieldName,OnlyFieldName,OrderType,PageSizeNum,CurrentPage) <br />
<br />
'''显示分页 <br />
Call ShowPages(1,1,1) <br />
<br />
'''''创建时间：2008-6-8 15：25 <br />
'''''最后修改时间 14:21 2008-8-30 <br />
''''获取总页数，总记录数 <br />
Sub ShowTotalPage() <br />
Rem 以下内容直接COPY调用，不用任何修改 <br />
If Page = "" or IsEmpty(Page) = True or Page = "0" or Page = Empty Then Page = 1 <br />
StrWhere = "" <br />
If SearchWhere = "" Then <br />
StrWhere = "" <br />
Else <br />
StrWhere = " WHERE " &amp; SearchWhere <br />
End If <br />
StrTotal = "SELECT COUNT([" &amp; OnlyFieldName &amp; "]) AS [rsTotal] FROM [" &amp; TableName &amp; "] " &amp; StrWhere <br />
Set rsTotalRecord = Conn.Execute(StrTotal) <br />
rsTotal = rsTotalRecord("rsTotal") <br />
rsTotalRecord.Close:Set rsTotalRecord = Nothing <br />
CurrentPage = Page <br />
CurrentPage = Int(CurrentPage) <br />
If rsTotal mod PageSizeNum = 0 Then <br />
TotalPages = int(rsTotal \ PageSizeNum) <br />
Else <br />
TotalPages = int(rsTotal \ PageSizeNum) + 1 <br />
End If <br />
If CurrentPage > TotalPages Then CurrentPage = TotalPages <br />
Session("rsTotal") = rsTotal'总记录 <br />
Session("TotalPages") = TotalPages'总页数 <br />
Session("CurrentPage") = CurrentPage'当前页 <br />
End Sub <br />
<br />
'''''''''''''显示分页信息 <br />
'' http://www.531.hk <br />
Sub ShowPages(ShowListOrder,ShowSelect,ShowHidden) <br />
If rsTotal <= PageSizeNum Then Exit Sub <br />
StrURL = PageURL <br />
If CurrentPage = 1 Then <br />
PreviousPage = "首页 上页" <br />
Else <br />
PreviousPage = " <a href='" &amp; StrURL &amp; "1'>首页 </a> <a href='" &amp; StrURL &amp; CurrentPage - 1 &amp; "'>上页 </a>" <br />
End If <br />
If CurrentPage = TotalPages Then <br />
NextPage = "下页 末页" <br />
Else <br />
NextPage = " <a href='" &amp; StrURL &amp; CurrentPage + 1 &amp; "'>下页 </a> <a href='" &amp; StrURL &amp; TotalPages &amp; "'>末页 </a>" <br />
End If <br />
ShowPageNum = "" <br />
If ShowListOrder = 0 Then <br />
If CurrentPage > 5 Then <br />
xx = CurrentPage - 4 <br />
yy = CurrentPage + 5 <br />
Else <br />
xx = 1 <br />
yy = 10 <br />
End If <br />
<br />
For ii = xx TO yy <br />
If ii > TotalPages Then Exit For <br />
ShowPageNum = ShowPageNum &amp; " <a href='" &amp; StrURL &amp; ii &amp; "'>[" <br />
If ii = CurrentPage Then ShowPageNum = ShowPageNum &amp; " <font color='#FF0000'> <b>" <br />
ShowPageNum = ShowPageNum &amp; ii <br />
If ii = CurrentPage Then ShowPageNum = ShowPageNum &amp; " </b> </font>" <br />
ShowPageNum = ShowPageNum &amp; "] </a>" <br />
Next <br />
End If <br />
<br />
ShowTotal = "共 <font color='#FF0000'> <b>" &amp; rsTotal &amp; " </b> </font>条记录 <font color='#FF0000'> <b>" <br />
If ShowListOrder = 1 Then <br />
ShowTotal = ShowTotal &amp; CurrentPage &amp; "/" <br />
End If <br />
ShowTotal = ShowTotal &amp; TotalPages &amp; " </b> </font>页" <br />
ShowTable = " <table width='100%' border='0' cellspacing='0' cellpadding='0'>" <br />
If ShowSelect = 0 Then <br />
ShowTable = ShowTable &amp; " <form name='page' method='get' action=''>" <br />
End If <br />
ShowTable = ShowTable &amp; " <tr> <td align='center' valign='middle'>" <br />
ShowTable = ShowTable &amp; PreviousPage &amp; " " &amp; ShowPageNum &amp; " " &amp; NextPage &amp; " " &amp; ShowTotal &amp; " " <br />
Response.Write ShowTable <br />
If ShowHidden = 0 Then <br />
Call ShowHiddenText() <br />
End If <br />
ShowTable = "" <br />
If ShowSelect = 0 Then <br />
ShowTable = ShowTable &amp; "转到 <select name='page' onchange='this.form.submit()'>" <br />
For n = 1 TO TotalPages <br />
ShowTable = ShowTable &amp; " <option value='" &amp; n &amp; "'" <br />
If n = CurrentPage Then ShowTable = ShowTable &amp; " selected" <br />
ShowTable = ShowTable &amp; ">" &amp; n &amp; " </option>" <br />
Next <br />
ShowTable = ShowTable &amp; " </select>页" <br />
End If <br />
ShowTable = ShowTable &amp; " </td> </tr>" <br />
If ShowSelect = 0 Then <br />
ShowTable = ShowTable &amp; " </form>" <br />
End If <br />
ShowTable = ShowTable &amp; " </table>" <br />
Response.Write ShowTable <br />
End Sub <br />
'''''''获取完整URL <br />
'' 来源于网上 好像是阿信的吧 具体不太清楚啦 HEHE <br />
Function FullURL() <br />
Dim strTemp <br />
If LCase(Request.ServerVariables("HTTPS")) = "off" Then <br />
strTemp = "http://" <br />
Else <br />
strTemp = "https://" <br />
End If <br />
strTemp = strTemp &amp; Request.ServerVariables("SERVER_NAME") <br />
If Request.ServerVariables("SERVER_PORT") <> 80 Then strTemp = strTemp &amp; ":" &amp; Request.ServerVariables("SERVER_PORT") <br />
strTemp = strTemp &amp; Request.ServerVariables("URL") <br />
If Trim(Request.QueryString) <> "" Then strTemp = strTemp &amp; "?" &amp; Trim(Request.QueryString) <br />
FullURL = strTemp <br />
End Function <br />
<br />
''''''''''获取URL - 分页专用 <br />
Function PageURL() <br />
URL = FullURL <br />
TempUrl = Split(URL,"?") <br />
If ubound(TempUrl) = 0 then <br />
URL = URL &amp; "?page=" <br />
Else <br />
TempUrl = Split(URL,"?page=") <br />
If ubound(TempUrl) = 0 Then <br />
TempUrl = Split(URL,"&amp;page") <br />
URL = TempUrl(0) &amp; "&amp;page=" <br />
Else <br />
URL = TempUrl(0) &amp; "?page=" <br />
End If <br />
End If <br />
PageURL = URL <br />
End Function <br />
<br />
''''''''''''分页SQL语句函数 <br />
Function GetPageSQL(TableName,FieldName,SearchWhere,OrderFieldName,OnlyFieldName,OrderType,PageSizeNum,Page) <br />
' 2008-05-26 12:28 <br />
StrWhere = "" <br />
StrOrder = "" <br />
StrSQL = "" <br />
MaxMinID = "" <br />
If SearchWhere = "" Then <br />
StrWhere = "" <br />
MaxMinID = " WHERE ( [" &amp; OnlyFieldName &amp; "] " <br />
Else <br />
StrWhere = " WHERE " &amp; SearchWhere &amp; " " <br />
MaxMinID = " AND ( [" &amp; OnlyFieldName &amp; "] " <br />
End If <br />
If OrderType = 0 Then <br />
MaxMinID = MaxMinID &amp; " > ( SELECT MAX" <br />
StrOrder = " ORDER BY [" &amp; OrderFieldName &amp; "] ASC " <br />
Else <br />
MaxMinID = MaxMinID &amp; " < ( SELECT MIN" <br />
StrOrder = " ORDER BY [" &amp; OrderFieldName &amp; "] DESC " <br />
End If <br />
If Page = 1 or Page = 0 Then <br />
StrSQL = "SELECT TOP " &amp; PageSizeNum &amp; " " &amp; FieldName &amp; " FROM [" &amp; TableName &amp; "] " &amp; StrWhere &amp; StrOrder <br />
Else <br />
StrSQL = "SELECT TOP " &amp; PageSizeNum &amp; " " &amp; FieldName &amp; " FROM [" &amp; TableName &amp; "] " &amp; StrWhere &amp; MaxMinID <br />
StrSQL = StrSQL &amp; " ([" &amp; OnlyFieldName &amp; "]) FROM ( SELECT TOP " <br />
StrSQL = StrSQL &amp; PageSizeNum * (Page - 1) &amp; " [" &amp; OnlyFieldName &amp; "] FROM [" &amp; TableName &amp; "] " &amp; StrWhere &amp; StrOrder <br />
StrSQL = StrSQL &amp; " ) AS TempTable ) ) " &amp; StrOrder <br />
End If <br />
GetPageSQL = StrSQL <br />
End Function <br />
'' ==== OVER ====[/code]</p>]]></description></item><item><title><![CDATA[最精确的硬盘整数分区方法]]></title><pubDate>Fri, 19 Sep 2008 09:35:56 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/09/200809190935562388.htm</link><description><![CDATA[<p>最精确的硬盘整数分区方法<br />
[参考]硬盘整数分区计算方法一般算法（来自电脑报）：分区大小＝（分区大小-1）&times;4＋1024&times;分区大小 <br />
如果按照硬盘分区整数G计算公式X-1)*4+1024*X=Y 其中X就是你想要得到的整数分区的数值,单位是G,Y是你分区时应该输入的数字,单位是M,<br />
<br />
比如40GB＝（40－1）&times;4＋1024&times;40＝41116MB 按照这样的计算方法:<br />
5G=5136MB<br />
10G=10276MB<br />
15G=15416MB<br />
20G=20556MB<br />
30G=30836MB<br />
40G=41116MB<br />
<br />
30G以内，输入上面的数据，如10G你输入10276，在Windows资源管理器里面显示的刚好10.00GB，而在管理工具-磁盘管理界面显示就是10.04GB，如果是40G你输入41116，那么在Windows资源管理器里面显示的刚好40.01GB。<br />
因此上面的计算公式还不是很准确。<br />
<br />
最精确硬盘分区的算法如下（来自网络搜索）: <br />
<br />
硬盘一般有255磁头，63扇区，故每柱面大小为：<br />
512byte x 255 x 63＝8225280bytes ＝7.84423828125 MB <br />
如果要分40GB,那么要40x1024MB=40960MB <br />
需要柱面数为40960&divide;7.84423828125=5221.66 <br />
取整数既为5222个柱面 <br />
应分M数为5222x7.84423828125=40962.6123046875MB <br />
不管小数点后面几位都进1，也就是40963MB，windows就认为是40GB了。 <br />
这个方法NTFS和FAT32通用。<br />
<br />
下面附10GB到200GB整10GB递增的精确计算结果： <br />
10GB ＝ 10245MB <br />
20GB ＝ 20482MB <br />
30GB ＝ 30726MB <br />
40GB ＝ 40963MB <br />
50GB ＝ 51208MB <br />
60GB ＝ 61444MB <br />
70GB ＝ 71681MB <br />
80GB ＝ 81926MB <br />
90GB ＝ 92162MB <br />
100GB ＝ 102407MB <br />
110GB ＝ 112644MB <br />
120GB ＝ 122888MB <br />
130GB ＝ 133125MB <br />
140GB ＝ 143362MB <br />
150GB ＝ 153606MB <br />
160GB ＝ 163843MB <br />
170GB ＝ 174088MB <br />
180GB ＝ 184324MB <br />
190GB ＝ 194561MB<br />
<br />
此精确分区结果，在管理工具-磁盘管理界面，和Windows资源管理器里面显示的是整数，10G就是10.00GB，20G就是20.00GB，40G就是40.00GB。</p>]]></description></item><item><title><![CDATA[关于爱和幸福的箴言]]></title><pubDate>Wed, 10 Sep 2008 09:16:01 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2008/09/200809100916017303.htm</link><description><![CDATA[<div id="content_3">
<li>我们在遇到合适的人选之前，上帝总让我们先碰上一些不适宜的人。这样当我们最终遇到自己的意中人时，才知道对这份礼物心存感激。</li>
<li>给某人以全部的爱未必能保证对方也爱你。若等不到爱的回报，也应感到满足，因为爱已在你心中生长。</li>
<li>不要追求外表，它有欺骗性；不要追求财富，它总会消逝。寻找令你微笑的人。</li>
<li>爱以微笑开始，因亲吻而滋长，以泪水终结。</li>
<li>最幸福的是那些懂得充分享受每时每刻的人，并非那些拥有一切的人。</li>
<li>美好的未来以遗忘过去为基础，不让往事的心痛随风而去，就不会有顺心的生活。</li>
<li>对一个人产生好感只要一分钟，喜欢上一个人只需一小时，爱上一个人一天就够了，但忘却一个人却需要一生的时间。 　　您能全读懂吗？</li>
</div>
<pre id="content_data_3" style="display: none"> </pre>]]></description></item><item><title><![CDATA[VBS修改远程桌面的默认端口,并添加至Windows防火墙]]></title><pubDate>Wed, 10 Sep 2008 09:12:53 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2008/09/200809100912538966.htm</link><description><![CDATA[<p>这段代码很使用哈，相关的部分修改下就OK。</p>
<p>[html]'##################### [/n]'VBS修改远程桌面的默认端口,并添加至Windows防火墙 [/n]'作者51yc.cn[/n]'56868为要设置的端口 [/n]'##################### [/n] [/n]Set WshShell = WScript.CreateObject("WScript.Shell") [/n]WshShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber",56868,"REG_DWORD" [/n]WshShell.RegWrite "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp\PortNumber",56868,"REG_DWORD" [/n] [/n] [/n]Function Addfirewall(name,port,state) [/n] Set objFirewall = CreateObject("HNetCfg.FwMgr") [/n] Set objPolicy = objFirewall.LocalPolicy.CurrentProfile [/n] [/n] Set objPort = CreateObject("HNetCfg.FwOpenPort") [/n] objPort.Port = port [/n] objPort.Name = name [/n] objPort.Enabled = state [/n] Set colPorts = objPolicy.GloballyOpenPorts [/n] errReturn = colPorts.Add(objPort) [/n]End Function [/n] [/n]call Addfirewall("远程桌面56868",56868,1) [/n]set WshShell = nothing [/n] [/n]msgbox "设置成功" [/n] [/n][/html]</p>]]></description></item><item><title><![CDATA[使用.htaccess来防盗链]]></title><pubDate>Thu, 04 Sep 2008 10:20:02 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/09/200809041020025410.htm</link><description><![CDATA[<p>      先解释一下图片防盗链和转向：</p>
<p>       图片防盗链有什么用？</p>
<p>       防止其它网站盗用你的图片，浪费你宝贵的流量。</p>
<p>       图片转向有什么用？</p>
<p>         如果你的网站以图片为主，哪天发现月底没到流量就快用光了，那就可以利用图片转向，在不修改网页的前提下，把图片下载请求转向到其它空间(比如试用主机)，临时过渡。</p>
<p>        下面开始讲解，比如你的图片都在img目录下，那就在该目录下放一个名为 .htaccess 的文件，内容如下：</p>
<p>[code]RewriteEngine on <br />
<br />
RewriteCond %{HTTP_REFERER} !^$ [NC] <br />
RewriteCond %{HTTP_REFERER} !simcole.cn [NC] <br />
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC] <br />
RewriteCond %{HTTP_REFERER} !google.com [NC] <br />
RewriteCond %{HTTP_REFERER} !baidu.com [NC] <br />
RewriteCond %{HTTP_REFERER} !bloglines.com [NC] <br />
<br />
RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L] <br />
<br />
RewriteRule ^(.*)$ http:\/\/image.simcole.cn\/image\/$1 [L] <br />
[/code]</p>
<p>大概解释下：</p>
<p>[code]RewriteCond %{HTTP_REFERER} !^$ [NC] <br />
RewriteCond %{HTTP_REFERER} !simcole.cn [NC] <br />
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC] <br />
RewriteCond %{HTTP_REFERER} !google.com [NC] <br />
RewriteCond %{HTTP_REFERER} !baidu.com [NC] <br />
RewriteCond %{HTTP_REFERER} !bloglines.com [NC] <br />
[/code]</p>
<p>        这部分是判断是否盗链，如果以上条件都成立(即访问图片的请求，既不是直接输入网址，也不是来自simcole.cn，也不是来自zhuaxia.com，也不是来自google.com，也不是来自baidu.com，也不是来自bloglines.com 的话)，就执行下列转向：</p>
<p>[code]RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L][/code]</p>
<p><span style="font-size: 12px">        意思是让所有盗链 img 目录下 jpg、gif、png、bmp、swf、jpeg 文件的网页，显示的图片都用 image 目录下的 replace.gif 图片替换掉。注意替换显示的图片不要放在设置防盗链的 img 目录下。如果照上面的规则判断出图片请求不是盗链的，就执行以下转向：</span></p>
<p><span style="font-size: 12px">[code]RewriteRule ^(.*)$ http:\/\/image.51yc.cn\/image\/$1 [L] </span></p>
<p><span style="font-size: 12px"><span style="font-size: 12px">         意思是对 img 目录下所有的请求都转向到目标服务器，比如有个图片原来的 url 是 </span><span style="font-size: 12px"><span style="color: #333333"><a href="http://www.51yc.cn/img/girl.jpg">http://www.51yc.cn/img/girl.jpg</a></span></span><span style="font-size: 12px"> ，现在就会转到 </span><span style="font-size: 12px"><span style="color: #333333"><a href="http://image.51yc.cn/image/girl.jpg">http://image.51yc.cn/image/girl.jpg</a></span></span><span style="font-size: 12px"> 去。当然了你得先把原服务器 img 目录下的文件统统拷贝到临时服务器的 image 目录下，转向才会真正可用。起到的效果就是把原服务器图片下载所占用的流量统统省下，让临时服务器来承受了</span><br />
[/code]</span></p>]]></description></item><item><title><![CDATA[关于rs.bof 和 rs.eof]]></title><pubDate>Mon, 25 Aug 2008 10:53:36 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2008/08/200808251053360754.htm</link><description><![CDATA[<div id="contentTxt">关于rs.bof 和 rs.eof<br />
<br />
if rs.bof then<br />
表示：当前指针的位置是在第一行记录之前，则...<br />
if rs.eof then<br />
表示：当前指针的位置是在最后一行记录之后，则...<br />
if not rs.eof then <br />
表示：当前指针的位置没有到达最后一条记录<br />
if not rs.bof then <br />
表示：当前指针的位置没有到达第一条记录<br />
－－－－－－－－－－－－－－－－－－－－－－－－－<br />
＃＃＃推荐使用下面两条<br />
if not (rs.bof and rs.eof) then<br />
表示：指针位于 RecordSet 的当中（并非是最后一条和第一条） ，说明一定有记录。<br />
if rs.bof and rs.eof then<br />
表示：没有任何记录</div>]]></description></item><item><title><![CDATA[常用的负载均衡技术]]></title><pubDate>Sat, 23 Aug 2008 09:42:24 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/08/200808230942240855.htm</link><description><![CDATA[<p>目前比较常用的负载均衡技术主要有： <br />
　　1. 基于DNS的负载均衡 <br />
　　通过DNS服务中的随机名字解析来实现负载均衡，在DNS服务器中，可以为多个不同的地址配置同一个名字，而最终查询这个名字的客户机将在解析这个名字时得到其中一个地址。因此，对于同一个名字，不同的客户机会得到不同的地址，他们也就访问不同地址上的Web服务器，从而达到负载均衡的目的。 <br />
<br />
　　2. 反向代理负载均衡 （如Apache+JK2+Tomcat这种组合）<br />
　　使用代理服务器可以将请求转发给内部的Web服务器，让代理服务器将请求均匀地转发给多台内部Web服务器之一上，从而达到负载均衡的目的。这种代理方式与普通的代理方式有所不同，标准代理方式是客户使用代理访问多个外部Web服务器，而这种代理方式是多个客户使用它访问内部Web服务器，因此也被称为反向代理模式。<br />
<br />
　　3. 基于NAT（Network Address Translation）的负载均衡技术 （如Linux Virtual Server，简称LVS）<br />
　　网络地址转换为在内部地址和外部地址之间进行转换，以便具备内部地址的计算机能访问外部网络，而当外部网络中的计算机访问地址转换网关拥有的某一外部地址时，地址转换网关能将其转发到一个映射的内部地址上。因此如果地址转换网关能将每个连接均匀转换为不同的内部服务器地址，此后外部网络中的计算机就各自与自己转换得到的地址上服务器进行通信，从而达到负载分担的目的。</p>]]></description></item><item><title><![CDATA[IIS服务器没有及时响应启动或控制请求]]></title><pubDate>Tue, 19 Aug 2008 09:33:36 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/08/200808190933362693.htm</link><description><![CDATA[<p>       系统为：xp2+II5.1</p>
<p>        打开IIS网站全部停止掉了，于是把它启动起来但却报&ldquo;服务器没有及时响应启动或控制请求&rdquo;，检查了发现我的服务里面：world wide web Publishing 的服务没有启动。于是我尝试把他启动，但启动不了，却报了一个：在本地计算机无法启动world wide web Publishing 服务 错误 127:找不到指定的程序。在网上查了下资料，把微软补丁KB939373,卸载掉就可以了。</p>
<p>      问题原因是：这个补丁后里面有个阻止iis远程代码执行的，会造成WWW无法启动，已更改是微软的一个小遗漏吧。</p>
<p> </p>]]></description></item><item><title><![CDATA[08月15日奥运官网首页图片幻灯切换效果]]></title><pubDate>Sat, 16 Aug 2008 10:12:30 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/08/200808161012308560.htm</link><description><![CDATA[<p>[html]<html><HEAD><TITLE>首页 - 北京2008年第29届奥运会官方网站</TITLE> [/n]<META http-equiv=Content-Type content="text/html; charset=utf-8"> [/n]<META content=第29届奥林匹克运动会网站 name=title> [/n]<META content=第29届奥林匹克运动会网站 name=author> [/n]<META content=第29届奥林匹克运动会官方网站,包括新闻,观众服务,票务,志愿者,奥林匹克百科等内容 name=description> [/n]<META content=奥运官方网站,奥运官网,奥运网站,北京奥运会网站,北京奥运网站 name=keywords> [/n]<SCRIPT src="http://www.beijing2008.cn/upload/cms_owrp2/column_cn/beijing2008_flashobj.js" type=text/javascript></SCRIPT> [/n]</HEAD> [/n]<BODY> [/n]<DIV class=focusFlash> [/n]<DIV id=sasFlashFocus27> [/n]<OBJECT id=27 height=245 width=522 classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000><PARAM NAME="_cx" VALUE="13811"><PARAM NAME="_cy" VALUE="6482"><PARAM NAME="FlashVars" VALUE=""><PARAM NAME="Movie" VALUE="http://images.beijing2008.cn/demo7.swf"><PARAM NAME="Src" VALUE="http://images.beijing2008.cn/demo7.swf"><PARAM NAME="WMode" VALUE="Opaque"><PARAM NAME="Play" VALUE="0"><PARAM NAME="Loop" VALUE="-1"><PARAM NAME="Quality" VALUE="High"><PARAM NAME="SAlign" VALUE=""><PARAM NAME="Menu" VALUE="-1"><PARAM NAME="Base" VALUE=""><PARAM NAME="AllowScriptAccess" VALUE=""><PARAM NAME="Scale" VALUE="ShowAll"><PARAM NAME="DeviceFont" VALUE="0"><PARAM NAME="EmbedMovie" VALUE="0"><PARAM NAME="BGColor" VALUE=""><PARAM NAME="SWRemote" VALUE=""><PARAM NAME="MovieData" VALUE=""><PARAM NAME="SeamlessTabbing" VALUE="1"><PARAM NAME="Profile" VALUE="0"><PARAM NAME="ProfileAddress" VALUE=""><PARAM NAME="ProfilePort" VALUE="0"><PARAM NAME="AllowNetworking" VALUE="all"><PARAM NAME="AllowFullScreen" VALUE="false"></OBJECT></DIV> [/n]<SCRIPT> [/n]var sohuFlash2 = new sohuFlash("http://images.beijing2008.cn/demo7.swf", "27", 522, 245, "7"); [/n]sohuFlash2.addParam("quality", "high"); [/n]sohuFlash2.addParam("wmode", "opaque"); [/n]sohuFlash2.addVariable("image","http://img05.beijing2008.cn/20080815/Img214545497.jpg|http://img00.beijing2008.cn/20080816/Img214547315.jpg|http://img02.beijing2008.cn/20080815/Img214546483.jpg|http://img11.beijing2008.cn/20080815/Img214544688.jpg"); [/n]sohuFlash2.addVariable("image2","http://img06.beijing2008.cn/20080815/Img214545504.jpg|http://img03.beijing2008.cn/20080816/Img214547316.jpg|http://img06.beijing2008.cn/20080815/Img214546502.jpg|http://img04.beijing2008.cn/20080815/Img214544672.jpg"); [/n]sohuFlash2.addVariable("url","http://www.beijing2008.cn/news/sports/headlines/weightlifting/n214545528.shtml|http://www.beijing2008.cn/news/sports/headlines/badminton/n214546992.shtml|http://www.beijing2008.cn/news/sports/headlines/judo/n214545962.shtml|http://www.beijing2008.cn/news/sports/headlines/artisticgymnastics/n214544385.shtml"); [/n]sohuFlash2.addVariable("info", "11女子75公斤级:中国选手曹磊破3项奥运会纪录夺冠|22羽毛球女双：于洋/杜婧2-0轻松战胜韩国组合获得冠军|33女柔78公斤以上级：佟文一本战胜卫冕冠军 勇夺金牌|44女子体操全能柳金完美发挥战胜约翰逊夺金 杨伊琳获铜牌"); [/n]sohuFlash2.addVariable("stopTime","5000"); [/n]sohuFlash2.write("sasFlashFocus27"); [/n]</SCRIPT> [/n]</DIV> [/n]点这里看演示：<a href="http://www.51yc.cn/QT/beijing2008/beijing2008.html">http://www.51yc.cn/QT/beijing2008/beijing2008.html</a></BODY></html>[/html]</p>
<p>晕，直接运行代码显示不出效果来。</p>
<p>给个演示地址吧：<a target="_blank" href="http://www.51yc.cn/QT/beijing2008/beijing2008.html">http://www.51yc.cn/QT/beijing2008/beijing2008.html</a></p>
<p>效果不错，文件都打包了，大家下载吧。</p>
<p>           下载地址： <a target="_blank" href="http://www.51yc.cn/QT/beijing2008/beijing2008.html">http://www.51yc.cn/QT/beijing2008/beijing2008.rar</a></p>]]></description></item><item><title><![CDATA[数据库被置疑的解决方案]]></title><pubDate>Fri, 15 Aug 2008 09:27:55 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2008/08/200808150927557089.htm</link><description><![CDATA[<p>今天早上上班，重启了下服务器后准备调试程序，发现数据库连接失败的提示。</p>
<p>发现查看应用程序日志其中主要有一个这样的错误描述：</p>
<p>[code]错误: 0，严重度: 19，状态: 0 <br />
SqlDumpExceptionHandler: 进程 10 发生了严重的异常 c0000005 EXCEPTION_ACCESS_VIOLATION。SQL Server 将终止该进程。 <br />
有关更多信息，请参阅在 http://go.microsoft.com/fwlink/events.asp 的帮助和支持中心。 <br />
字节方式显示： <br />
0000: 00 00 00 00 13 00 00 00 ........ <br />
0008: 07 00 00 00 53 00 45 00 ....S.E. <br />
0010: 52 00 56 00 45 00 52 00 R.V.E.R. <br />
0018: 00 00 09 00 00 00 62 00 ......b. <br />
0020: 79 00 62 00 62 00 73 00 y.b.b.s. <br />
0028: 64 00 6e 00 74 00 00 00 d.n.t...[/code]</p>
<p>从以上信息基本判定是数据库bybbsdnt造成的，连接服务器后发现数据库一直无法启动（SQL2000+SP4），所以无法正常查看数据库状态，每次都是自动启动了又关闭，然后在启动。这样</p>
<p>反复多次终于启动成功了，进入企业管理器发现我在日志里出现的数据库出现了置疑，基本跟我想的一样（那数据库大小在4G），在反复多次在网查找了下方法。如下：</p>
<p>[code]USE MASTER <br />
GO <br />
SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE <br />
GO <br />
UPDATE SYSDATABASES SET STATUS =32768 WHERE NAME='bybbsdnt' <br />
Go <br />
sp_dboption 'bybbsdnt', 'single user', 'true' <br />
Go <br />
DBCC CHECKDB('bybbsdnt') <br />
Go <br />
update sysdatabases set status =28 where name='bybbsdnt' <br />
Go <br />
sp_configure 'allow updates', 0 reconfigure with override <br />
Go <br />
sp_dboption 'bybbsdnt', 'single user', 'false' <br />
Go <br />
[/code]</p>
<p>执行这段代码后，会有报错。不用管他，继续停掉MSSQL然后在启动。</p>
<p>报错代码如下：</p>
<p>[code]已将配置选项 'allow updates' 从 0 改为 1。请运行 RECONFIGURE 语句以安装。 <br />
<br />
（所影响的行数为 0 行） <br />
<br />
服务器: 消息 15010，级别 16，状态 1，过程 sp_dboption，行 71 <br />
数据库 'bybbsdnt' 不存在。请用 sp_helpdb 来显示可用的数据库。 <br />
<br />
<br />
服务器: 消息 911，级别 16，状态 1，行 2 <br />
未能在 sysdatabases 中找到数据库 'bybbsdnt' 所对应的条目。没有找到具有该名称的条目。请确保正确地输入了名称。 <br />
<br />
（所影响的行数为 0 行） <br />
<br />
已将配置选项 'allow updates' 从 1 改为 0。请运行 RECONFIGURE 语句以安装。 <br />
服务器: 消息 15010，级别 16，状态 1，过程 sp_dboption，行 71 <br />
数据库 'bybbsdnt' 不存在。请用 sp_helpdb 来显示可用的数据库。 <br />
<br />
<br />
[/code]</p>
<p>这样虽然不质疑了，但是数据库应该还是有问题，还在解决中，初步方法是创建结构相同的数据库，然后使用数据导入导出工具把质疑库里的数据导出来在使用！！：）</p>
<p>幸好不是master库，要是master库被质疑就完了，只好从新安装数据库，然后找到MDF文件附加数据库了！</p>
<p> </p>]]></description></item><item><title><![CDATA[本世纪第一次日全食实拍（转）]]></title><pubDate>Sat, 02 Aug 2008 10:00:27 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2008/08/200808021000274414.htm</link><description><![CDATA[<p><embed src="http://www.tudou.com/v/izOB1jMVZUw" width="400" height="342" scale="ShowAll" loop="loop" menu="menu" wmode="transparent" quality="1" type="application/x-shockwave-flash"></embed></p>]]></description></item><item><title><![CDATA[爱爱爱]]></title><pubDate>Sat, 26 Jul 2008 09:06:41 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/07/200807260906414393.htm</link><description><![CDATA[<p>[html]using System; [/n]using System.Data; [/n]using System.Configuration; [/n]using System.Collections; [/n]using System.Web; [/n]using System.Web.Security; [/n]using System.Web.UI; [/n]using System.Web.UI.WebControls; [/n]using System.Web.UI.WebControls.WebParts; [/n]using System.Web.UI.HtmlControls; [/n] [/n]public partial class en_Default2 : System.Web.UI.Page [/n]{ [/n] protected void Page_Load(object sender, EventArgs e) [/n] { [/n] //123.text=theSlectImg.play(); [/n] } [/n]}[/html]</p>]]></description></item><item><title><![CDATA[1亿动态pv/天的超级数据库缓存解决方案，开源了，还有测试代码。]]></title><pubDate>Fri, 25 Jul 2008 13:30:30 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/07/200807251330300900.htm</link><description><![CDATA[<p>说是支持1亿pv/天，也许有点夸张，也是为了吸引您能点进来，如果您能认真看完相信也不会让您失望，当然，肯定有很多&ldquo;高手&rdquo;会对此会嗤之以鼻，没关系，有很多眼高手低的人总喜欢评论别人却从不会看清自己。 <br />
<br />
如果大家真想支持我、支持中国人开源项目，请把该文贴到自己的博客中或者收藏本文，记得包含文档的下载地址！！！！！！！谢谢。 <br />
<br />
我说的系统主要是构建在hibernate之上的高效数据库缓存系统，其中包含了分布式解决方案，该系统已经应用在舍得网上了，没有发现大问题，本人也相信该系统已经足够强大，应付数百万IP/天的应用都不是问题，我这么说肯定有人会对此表示怀疑，其实系统到底能撑多少IP/天不在于系统本身而是在于使用该系统的人。 <br />
<br />
代码看上去很简单，其实却是两年经验的总结，整过过程也遇到了很多难点，最后一一解决了，所以也请各位珍惜他人的劳动成果。本系统非常简洁易用，主程序BaseManager.java不到1000行代码，用&ldquo;精悍&rdquo;来形容绝对不为过，1000行代码却包含了数据库对象的缓存、列表和长度的缓存、按字段散列缓存、update延时更新、自动清除列表缓存等功能，用它来实现像论坛、博客、校友录、交友社区等绝大部分应用网站都足够了。 <br />
<br />
我在理想状态下做了压力测试，在没有数据库操作的jsp页面(舍得网新首页)里可以完成2000多requests每秒（正常情况可能有1/1000的request有数据库查询，其余999/1000都是直接从缓存里读取），物品详情页每秒可完成3000多requests，纯静态html页面也只能完成7000多requests/秒，我对首页进行了三个小时的压力测试，完成了24850800个requests，java一点事都没有，内存没有上涨。按照2000个requests/秒算，一天按15小时计算，那么每天能完成3600*15*2000=1亿零8百万requests，当然这是理想状态，实际状态就算打一折，还能完成1000万pv/天，要知道，这只是一个普通1万3千块钱买的服务器，内存4G，CPU2个，LinuxAS4系统，apache2.0.63/resin2.1.17/jdk6.0的环境。 <br />
<br />
现在进入正题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 <br />
<br />
为什么要用缓存？如果问这个问题说明你还是新手，数据库吞吐量毕竟有限，每秒读写5000次了不起了，如果不用缓存，假设一个页面有100个数据库操作，50个用户并发数据库就歇菜，这样最多能支撑的pv也就50*3600*15=270万，而且数据库服务器累得半死，搞不好什么时候就累死了。我的这套缓存系统比单独用memcached做缓存还要强大，相当于在memcached上再做了两级缓存，大家都知道memcached很强了，但是吞吐量还是有限，每秒20000次get和put当遇到超大规模的应用时还是会歇菜，本地HashMap每秒可执行上百万次put和get，在这上面损耗的性能几乎可以忽略不记了。温馨提示：能不用分布式的时候就不要用分布式，非用分布式的时候再考虑用memcached，我的缓存系统在这方面都已经实现了，改个配置就可以了，有兴趣的可以仔细测试测试！ <br />
<br />
一般数据库缓存在我看来包含四种。第一种：单个对象的缓存（一个对象就是数据库一行记录），对于单个对象的缓存，用HashMap就可以了，稍微复杂一点用LRU算法包装一个HashMap，再复杂一点的分布式用memcached即可，没什么太难的；第二种：列表缓存，就像论坛里帖子的列表；第三种：长度的缓存，比如一个论坛板块里有多少个帖子，这样才方便实现分页。第四种：复杂一点的group，sum，count查询，比如一个论坛里按点击数排名的最HOT的帖子列表。第一种比较好实现，后面三种比较困难，似乎没有通用的解决办法，我暂时以列表缓存（第二种）为例分析。 <br />
<br />
mysql和hibernate的底层在做通用的列表缓存时都是根据查询条件把列表结果缓存起来，但是只要该表的记录有任何变化（增加/删除/修改），列表缓存要全部清除，这样只要一个表的记录经常变化（通常情况都会这样），列表缓存几乎失效，命中率太低了。 <br />
<br />
本人想了一个办法改善了列表缓存，当表的记录有改变时，遍历所有列表缓存，只有那些被影响到的列表缓存才会被删除，而不是直接清除所有列表缓存，比如在一个论坛版（id=1）里增加了一个帖子，那么只要清除id=1这个版对应的列表缓存就可以了，版id=2就不用清除了。这样处理有个好处，可以缓存各种查询条件（如等于、大于、不等于、小于）的列表缓存，但也有个潜在的性能问题，由于需要遍历，CPU符合比较大，如果列表缓存最大长度设置成10000，两个4核的CPU每秒也只能遍历完300多次，这样如果每秒有超过300个insert/update/delete，系统就吃不消了。 <br />
<br />
在前面两种解决办法都不完美的情况下，本人和同事经过几个星期的思索，总算得出了根据表的某几个字段做散列的缓存办法，这种办法无需大规模遍历，所以CPU符合非常小，由于这种列表缓存按照字段做了散列，所以命中率极高。思路如下：每个表有3个缓存Map（key=value键值对），第一个Map是对象缓存A，在A中，key是数据库的id，Value是数据库对象（也就是一行数据）；第二个Map是通用列表缓存B，B的最大长度一般1000左右，在B中，key是查询条件拼出来的String（如start=0,length=15#active=0#state=0），Value是该条件查询下的所有id组成的List；第三个Map是散列缓存C，在C中，key是散列的字段（如根据userId散列的话，其中某个key就是userId=109这样的String）组成的String，value是一个和B类似的HashMap。其中只有B这个Map是需要遍历的，不知道说明白了没有，看完小面这个例子应该就明白了，就用论坛的回复表作说明，假设回复表T中假设有字段id，topicId，postUserId等字段（topicId就是帖子的id，postUserId是发布者id）。 <br />
<br />
第一种情况，也是最常用的情况，就是获取一个帖子对应的回复，sql语句应该是象 <br />
select id from T where topicId=2008 order by createTime desc limit 0,5 <br />
select id from T where topicId=2008 order by createTime desc limit 5,5 <br />
select id from T where topicId=2008 order by createTime desc limit 10,5 <br />
的样子，那么这种列表很显然用topicId做散列是最好的，把上面三个列表缓存（可以是N个）都散列到key是topicId=2008这一个Map中，当id是2008的帖子有新的回复时，系统自动把key是topicId=2008的散列Map清除即可。由于这种散列不需要遍历，因此可以设置成很大，例如100000，这样10万个帖子对应的所有回复列表都可以缓存起来，当有一个帖子有新的回复时，其余99999个帖子对应的回复列表都不会动，缓存的命中率极高。 <br />
<br />
第二种情况，就是后台需要显示最新的回复，sql语句应该是象 <br />
select id from T order by createTime desc limit 0,50 <br />
的样子，这种情况不需要散列，因为后台不可能有太多人访问，常用列表也不会太多，所以直接放到通用列表缓存B中即可。 <br />
<br />
第三种情况，获取一个用户的回复，sql语句象 <br />
select id from T where userId=2046 order by createTime desc limit 0,15 <br />
select id from T where userId=2046 order by createTime desc limit 15,15 <br />
select id from T where userId=2046 order by createTime desc limit 30,15 <br />
的样子，那么这种列表和第一种情况类似，用userId做散列即可。 <br />
<br />
第四种情况，获取一个用户对某个帖子的回复，sql语句象 <br />
select id from T where topicId=2008 and userId=2046 order by createTime desc limit 0,15 <br />
select id from T where topicId=2008 and userId=2046 order by createTime desc limit 15,15 <br />
的样子，这种情况比较少见，一般以topicId=2008为准，也放到key是topicId=2008这个散列Map里即可。 <br />
<br />
总结：这种缓存思路可以存储大规模的列表，缓存命中率极高，因此可以承受超大规模的应用，但是需要技术人员根据自身业务逻辑来配置需要做散列的字段，一般用一个表的索引键做散列（注意顺序，最散的字段放前面），假设以userId为例，可以存储N个用户的M种列表，如果某个用户的相关数据发生变化，其余N-1个用户的列表缓存纹丝不动。以上说明的都是如何缓存列表，缓存长度和缓存列表思路完全一样，如缓存象select count(*) from T where topicId=2008这样的长度，也是放到topicId=2008这个散列Map中。如果再配合好使用mysql的内存表和memcached，加上F5设备做分布式负载均衡，该系统对付像1000万IP/天这种规模级的应用都足够了，除搜索引擎外一般的应用网站到不了这种规模。 <br />
<br />
<span style="color: #000000"><strong>再次申明：系统到底是不是强大不在系统本身而在于使用该系统的人！！！</strong></span> <br />
<br />
这个缓存系统是我和同事几年经验的总结，看似简单，其实也没那么简单，把它作为开源有下面几个目的：第一，真的希望有很多人能用它；第二：希望更多的人能够完善和改进它；第三：希望大家能聚到一起为通用高效数据库缓存构架作出贡献，毕竟，数据库操作是各种应用最常用的操作，也是最容易产生性能瓶颈的地方。 <br />
<br />
Zip包中包含了配置方法和测试用的jsp，只要把它配置成一个web应用就可以快速调试并看到缓存的力量了，文档和下载地址是<a target="_blank" href="http://shedewang.com/akaladocs/api/com/akala/dbcache/core/BaseManager.html">http://shedewang.com/akaladocs/api/com/akala/dbcache/core/BaseManager.html</a>。群组的地址是<a target="_blank" href="http://groups.csdn.net/shedewang_db_cache">http://groups.csdn.net/shedewang_db_cache</a> <br />
<br />
配置说明文件在docs/开始配置.txt里有说明。 <br />
<br />
最后啰嗦一句，如果大家真想支持我、支持中国人开源项目，请把该文贴到自己的博客中或者收藏本文，记得包含文档的下载地址！！！！！！！谢谢。thank you and Good luck。</p>]]></description></item><item><title><![CDATA[超酷的图片轮换渐变效果··来自腾讯]]></title><pubDate>Thu, 24 Jul 2008 13:41:01 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2008/07/200807241341011047.htm</link><description><![CDATA[<p>[html]<style type="text/css"> [/n].woon{border:1px solid #fff;} [/n].wooff{border:1px solid #ffffff;filter:progid:DXImagetransform.Microsoft.Alpha(style=1,opacity=1500,finishOpacity=1);} [/n]</style> [/n]<script language="JavaScript" type="text/JavaScript"> [/n]<!-- [/n]window.onerror = function(){return true} [/n]function MM_openBrWindow(theURL,winName,features) { //v2.0 [/n] window.open(theURL,winName,features); [/n]} [/n]//--> [/n]</script> [/n]<table width=252 border=0 align=center cellPadding=0 cellSpacing=0 background="http://img1.qq.com/lady/pics/3931/3931550.jpg"> [/n] <tr> [/n] <td height="470" align="center"> [/n] <div id=fc style="filter:progid:DXImagetransform.Microsoft.GradientWipe(duration=3,gradientSize=0.5,motion=forward ); WIDTH:240px; HEIGHT:454px; border:1px solid #D85C8A"> [/n] <div style="display:block"><A [/n] href="http://lady.qq.com/a/20071007/000003.htm" target=_blank><img onmouseover=clearAuto(); [/n] onmouseout=setAuto() height=454 [/n] src="http://mat1.qq.com/lady/images/index/2007/10/07/hot1.jpg" width=240 border=0></A></div> [/n] [/n] <div style="display: none"><a href="http://lady.qq.com/a/20071007/000009.htm" target="_blank"><img onmouseover=clearAuto(); [/n] onmouseout=setAuto() height=454 [/n] src="http://mat1.qq.com/lady/images/index/2007/10/07/hot2.jpg" width=240 border=0></a></div> [/n] [/n] <div style="display: none"><A href="http://lady.qq.com/a/20071007/000005.htm" target=_blank><img onmouseover=clearAuto(); [/n] onmouseout=setAuto() height=454 [/n] src="http://mat1.qq.com/lady/images/index/2007/10/07/hot3.jpg" width=240 border=0></A></div> [/n] <div style="display: none"><a href="http://lady.qq.com/a/20071007/000006.htm" target=_blank><img onmouseover=clearAuto(); [/n] onmouseout=setAuto() height=454 [/n] src="http://mat1.qq.com/lady/images/index/2007/10/07/hot4.jpg" width=240 border=0></a></div> [/n] </div></td> [/n] </tr> [/n] <tr> [/n] <td height=99 valign="top"> <table border=0 align=center cellPadding=0 cellSpacing=1 id=num> [/n] <tr> [/n] [/n] <td class=woon onmouseover=clearAuto();onclick=Mea(0); onmouseout=setAuto() [/n] ><img src="http://mat1.qq.com/lady/images/index/2007/10/07/hot01.jpg" width="57" height="90" style="cursor: hand" onDblClick="MM_openBrWindow('http://lady.qq.com/a/20071007/000003.htm','','')"></td> [/n] [/n] <td class=wooff onmouseover=clearAuto(); [/n] onclick=Mea(1); onmouseout=setAuto() [/n] ><img src="http://mat1.qq.com/lady/images/index/2007/10/07/hot02.jpg" width="57" height="90" border="0" style="cursor: hand" onDblClick="MM_openBrWindow('http://lady.qq.com/a/20071007/000009.htm','','')"></td> [/n] <td class=wooff onmouseover=clearAuto(); [/n] onclick=Mea(2); onmouseout=setAuto() [/n] ><img src="http://mat1.qq.com/lady/images/index/2007/10/07/hot03.jpg" width="57" height="90" style="cursor: hand" onDblClick="MM_openBrWindow('http://lady.qq.com/a/20071007/000005.htm','','')"></td> [/n] [/n] <td class=wooff onmouseover=clearAuto(); [/n] onclick=Mea(3); onmouseout=setAuto() [/n] ><img src="http://mat1.qq.com/lady/images/index/2007/10/07/hot04.jpg" width="57" height="90" style="cursor: hand" onDblClick="MM_openBrWindow('http://lady.qq.com/a/20071007/000006.htm','','')"></td> [/n] </td> [/n] </tr> [/n] [/n] </table> [/n] [/n]<script> [/n]var n=0; [/n]var showNum = document.getElementById("num"); [/n]function Mea(value){ [/n] n=value; [/n] setBg(value); [/n] plays(value); [/n] } [/n]function setBg(value){ [/n] for(var i=0;i<4;i++) [/n] if(value==i){ [/n] showNum.getElementsByTagName("td")[i].className='woon'; [/n] } [/n] else{ [/n] showNum.getElementsByTagName("td")[i].className='wooff'; [/n] } [/n] } [/n]function plays(value){ [/n] with (fc){ [/n] filters[0].Apply(); [/n] for(i=0;i<4;i++)i==value?children[i].style.display="block":children[i].style.display="none"; [/n] filters[0].play(); [/n] } [/n]} [/n]function clearAuto(){clearInterval(autoStart)} [/n]function setAuto(){autoStart=setInterval("auto(n)", 5000)} [/n]function auto(){ [/n] n++; [/n] if(n>3)n=0; [/n] Mea(n); [/n]} [/n]function sub(){ [/n] n--; [/n] if(n<0)n=3; [/n] Mea(n); [/n]} [/n]setAuto(); [/n]</script> [/n]</body> [/n]</html>[/html]</p>]]></description></item><item><title><![CDATA[路由表]]></title><pubDate>Mon, 16 Jun 2008 21:01:04 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/06/200806162101040408.htm</link><description><![CDATA[<p>源码:-------------------------------------------------------------------------------- <br />
Active Routes: <br />
Network Destination Netmask Gateway Interface Metric <br />
0.0.0.0 0.0.0.0 192.168.123.254 192.168.123.88 1 <br />
0.0.0.0 0.0.0.0 192.168.123.254 192.168.123.68 1 <br />
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 <br />
192.168.123.0 255.255.255.0 192.168.123.68 192.168.123.68 1 <br />
192.168.123.0 255.255.255.0 192.168.123.88 192.168.123.88 1 <br />
192.168.123.68 255.255.255.255 127.0.0.1 127.0.0.1 1 <br />
192.168.123.88 255.255.255.255 127.0.0.1 127.0.0.1 1 <br />
192.168.123.255 255.255.255.255 192.168.123.68 192.168.123.68 1 <br />
192.168.123.255 255.255.255.255 192.168.123.88 192.168.123.88 1 <br />
224.0.0.0 224.0.0.0 192.168.123.68 192.168.123.68 1 <br />
224.0.0.0 224.0.0.0 192.168.123.88 192.168.123.88 1 <br />
255.255.255.255 255.255.255.255 192.168.123.68 192.168.123.68 1 <br />
Default Gateway: 192.168.123.254 ---------------------------------------------------- <br />
<br />
当前的路由： <br />
destination 目的网段 <br />
mask 子网掩码 <br />
interface 到达该目的地的本路由器的出口ip <br />
gateway 下一跳路由器入口的ip，路由器通过interface和gateway定义一调到下一个路由器的链路，通常情况下，interface和gateway是同一网段的 <br />
metric 跳数，该条路由记录的质量，一般情况下，如果有多条到达相同目的地的路由记录，路由器会采用metric值小的那条路由 <br />
<br />
第一条 <br />
缺省路由：意思就是说，当一个数据包的目的网段不在你的路由记录中，那么，你的路由器该把那个数据包发送到哪里！缺省路由的网关是由你的连接上的default gateway决定的 <br />
该路由记录的意思是：当我接收到一个数据包的目的网段不在我的路由记录中，我会将该数据包通过192.168.123.88这个接口发送到192.168.123.254这个地址，这个地址是下一个路由器的一个接口，这样这个数据包就可以交付给下一个路由器处理，与我无关。该路由记录的线路质量 1 <br />
<br />
第二条 <br />
缺省路由：该路由记录的意思是：当我接收到一个数据包的目的网段不在我的路由记录中，我会将该数据包通过192.168.123.68这个接口发送到192.168.123.254这个地址，这个地址是下一个路由器的一个接口，这样这个数据包就可以交付给下一个路由器处理，与我无关。该路由记录的线路质量 1 <br />
<br />
第三条 <br />
本地环路：127.0.0.0这个网段内所有地址都指向自己机器，如果收到这样一个数据，应该发向哪里 该路由记录的线路质量 1 <br />
<br />
第四条 <br />
直联网段的路由记录：当路由器收到发往直联网段的数据包时该如何处理，这种情况，路由记录的interface和gateway是同一个。 <br />
当我接收到一个数据包的目的网段是192.168.123.0时，我会将该数据包通过192.168.123.68这个接口直接发送出去，因为这个端口直接连接着192.168.123.0这个网段，该路由记录的线路质量 1 <br />
<br />
第五条 <br />
直联网段的路由记录 <br />
当我接收到一个数据包的目的网段是192.168.123.0时，我会将该数据包通过192.168.123.88这个接口直接发送出去，因为这个端口直接连接着192.168.123.0这个网段，该路由记录的线路质量 1 <br />
<br />
第六条 <br />
本地主机路由：当路由器收到发送给自己的数据包时将如何处理 <br />
当我接收到一个数据包的目的网段是192.168.123.68时，我会将该数据包收下，因为这个数据包时发送给我自己的，该路由记录的线路质量 1 <br />
<br />
第七条 <br />
本地主机路由：当路由器收到发送给自己的数据包时将如何处理 <br />
当我接收到一个数据包的目的网段是192.168.123.88时，我会将该数据包收下，因为这个数据包时发送给我自己的，该路由记录的线路质量 1 <br />
<br />
第八条 <br />
本地广播路由：当路由器收到发送给直联网段的本地广播时如何处理 <br />
当我接收到广播数据包的目的网段是192.168.123.255时，我会将该数据从192.168.123.68接口以广播的形势发送出去，该路由记录的线路质量 1 <br />
<br />
第九条 <br />
本地广播路由：当路由器收到发送给直联网段的本地广播时如何处理 <br />
当我接收到广播数据包的目的网段是192.168.123.255时，我会将该数据从192.168.123.88接口以广播的形势发送出去，该路由记录的线路质量 1 <br />
<br />
第十条 <br />
组播路由：当路由器收到一个组播数据包时该如何处理 <br />
当我接收到组播数据包时，我会将该数据从192.168.123.68接口以组播的形势发送出去，该路由记录的线路质量 1 <br />
<br />
第十一条 <br />
组播路由：当路由器收到一个组播数据包时该如何处理 <br />
当我接收到组播数据包时，我会将该数据从192.168.123.88接口以组播的形势发送出去，该路由记录的线路质量 1 <br />
<br />
第十二条 <br />
广播路由：当路由器收到一个绝对广播时该如何处理 <br />
当我接收到绝对广播数据包时，将该数据包丢弃掉</p>]]></description></item><item><title><![CDATA[The Ludlows]]></title><pubDate>Fri, 02 May 2008 15:54:53 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2008/05/200805021554531394.htm</link><description><![CDATA[<p><embed src="http://www.tudou.com/v/1HQ6ojFpuWM" width="402" height="177" scale="ShowAll" loop="loop" menu="menu" wmode="opaque" quality="1" type="application/x-shockwave-flash"></embed></p>
<p>燃情岁月，邀你一起聆听着燃自岁月的音乐！</p>
<p> </p>]]></description></item><item><title><![CDATA[彻底弄懂CSS盒子模式一(DIV布局快速入门)]]></title><pubDate>Fri, 02 May 2008 14:57:03 GMT</pubDate><category>DIV/CSS</category><link>http://www.51yc.cn/html/2008/05/200805021457039087.htm</link><description><![CDATA[<p><strong>前言</strong><br />
    如果你想尝试一下不用表格来排版网页，而是用CSS来排版你的网页，也就是常听的用DIV来编排你的网页结构，又或者说你想学习网页标准设计，再或者说你的上司要你改变传统的表格排版方式，提高企业竞争力，那么你一定要接触到的一个知识点就是CSS的盒子模式，这就是DIV排版的核心所在，传统的表格排版是通过大小不一的表格和表格嵌套来定位排版网页内容，改用CSS排版后，就是通过由CSS定义的大小不一的盒子和盒子嵌套来编排网页。因为用这种方式排版的网页代码简洁，更新方便，能兼容更多的浏览器，比如PDA设备也能正常浏览，所以放弃自己之前钟爱的表格排版也是值得的，更重要的是CSS排版网页的优势远远不只这些，本人在这里就不多说，自己可以去查找相关信息。</p>
<p><strong>理解CSS盒子模型</strong><br />
      什么是CSS的盒子模式呢？为什么叫它是盒子？先说说我们在网页设计中常听的属性名：内容(content)、填充(padding)、边框(border)、边界(margin)， CSS盒子模式都具备这些属性。</p>
<p align="center"><font color="#ff0000"><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080502145534.gif" /></font></p>
<p align="center">CSS盒子模式</p>
<p align="left"><font color="#000000">这些属性我们可以把它转移到我们日常生活中的盒子（箱子）上来理解，日常生活中所见的盒子也具有这些属性，所以叫它盒子模式。那么内容就是盒子里装的东西；而填充就是怕盒子里装的东西（贵重的）损坏而添加的泡沫或者其它抗震的辅料；边框就是盒子本身了；至于边界则说明盒子摆放的时候的不能全部堆在一起，要留一定空隙保持通风，同时也为了方便取出嘛。在网页设计上，内容常指文字、图片等元素，但是也可以是小盒子（DIV嵌套），与现实生活中盒子不同的是，现实生活中的东西一般不能大于盒子，否则盒子会被撑坏的，而CSS盒子具有弹性，里面的东西大过盒子本身最多把它撑大，但它不会损坏的。填充只有宽度属性，可以理解为生活中盒子里的抗震辅料厚度，而边框有大小和颜色之分，我们又可以理解为生活中所见盒子的厚度以及这个盒子是用什么颜色材料做成的，边界就是该盒子与其它东西要保留多大距离。在现实生活中，假设我们在一个广场上，把不同大小和颜色的盒子，以一定的间隙和顺序摆放好，最后从广场上空往下看，看到的图形和结构就类似我们要做的网页版面设计了，如下图。<br />
</font></p>]]></description></item><item><title><![CDATA[FW中特别的虚线]]></title><pubDate>Thu, 03 Apr 2008 18:54:57 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/04/200804031854577648.htm</link><description><![CDATA[<p>Fireworks中自带有虚线：三条破折线、加粗破折线、双破折线、基本破折线、实边破折线、点状线。<br />
在网页设计中，我通常的用的是实边破折线。因为它和网页CSS中border的dotted、dashed两个参数效果相似。在制作网页时，不需要导出切割图片，而是用CSS定义。<br />
但有时候需要效果，如：只是为了网页而设计图时；或是为了设计更有特色的网页设计图时。我们还需要用到其他的虚线。自带的那些，怎么看都觉得不够是不是？<br />
<br />
这里有两种方法：<br />
<br />
一是，画一个1像素高的矩形（边宽为0，填充所需色），然后给它添加纹理，纹理总量设为100%。<br />
以下是一般可用的1像素高的纹理虚线效果图：<br />
<img alt="" src="http://www.51yc.cn/upfiles/images/1.gif" /><br />
（说明：高于1像素的要多一个步骤：按Ctrl+Alt+Shift+Z把矩形转换成位图后，再把上面多余的黑色线删除。）<br />
其实还有许多纹理，你不妨都去试一下&ldquo;饼干&rdquo;、&ldquo;点&rdquo;这些都是有效果的。<br />
如果要画的不是横线而是纵线的话方法也有三：<br />
1.选择&ldquo;水平线&rdquo;等可以直接出现虚线的纹理；<br />
2.转成位图，然后旋转90度；<br />
3.把矩形宽度用1个像素以上，直至出现虚线后，再转位图，去多余线。<br />
<br />
二是，同上画一个矩形，然后在&ldquo;填充-图案-其他&rdquo;中选择自己画好的线段<br />
通常也是1像素高的gif文件，按你需要的虚线形式，用画笔或是线段工具画一个几个像素宽的虚线。<br />
要注意的是，按这个图案填充的矩形，如果你觉得效果不满意，想要改一下，也有两个方法：<br />
1.在FW中图案真充是有一个填充拉伸杆的，拉伸这个杆，调整出你想要的效果；<br />
2.如果填充杆依然要不到你想要的效果就改外部gif文件。但要另存为一个文件名，再在FW中把矩形的填充重新选一下。因为，你直接把填充外部文件的样式改了后，FW文件中的填充矩形是不会跟着外部文件改的。<br />
<img alt="" src="http://www.51yc.cn/upfiles/images/2.gif" /></p>]]></description></item><item><title><![CDATA[收到百度Hi的测试邀请]]></title><pubDate>Tue, 01 Apr 2008 08:20:45 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2008/04/200804010820455573.htm</link><description><![CDATA[<p>今天是愚人节，一早来上班打开邮件就看到了百度H&#105;的邀请函。下载回来H&#105;全绿色版本。登录了感觉还不错挺快的，就是里面没有一个人。</p>
<p>[&#99;&ordm;&#100;&eth;]尊敬的用户：<br />
<br />
您好！首先感谢您对百度产品的关注与兴趣，现在百度正式诚邀您第一时间使用百度H&#105;的体验版本，并为您的百度帐号&ldquo;&yacute;&acirc;&#99;&#104;&#117;&acirc;&#110;5&sup2;0&rdquo;开通了登录权限。我们非常渴望得到您的宝贵意见，对于提供有价值反馈的用户，我们会奉上一份精美的小礼品。<br />
<br />
&sup1;．如何使用？<br />
请点击此链接下载百度H&#105;体验版安装文件：<br />
&#104;&thorn;&thorn;&#112;://&#105;&#109;.&#98;&acirc;&#105;&#100;&#117;.&#99;&ordm;&#109;/&#100;&ordm;&#119;&#110;&#108;&ordm;&acirc;&#100;/B&acirc;&#105;&#100;&#117;H&#105;_&sup1;.0_B&eth;&thorn;&acirc;&sup1;.&eth;&#120;&eth;<br />
安装完毕后，请用您的百度帐号&ldquo;&yacute;&acirc;&#99;&#104;&#117;&acirc;&#110;5&sup2;0&rdquo;登录百度H&#105;。<br />
<br />
&sup2;．如何邀请好友使用百度H&#105;？<br />
(&sup1;) 在您第一次登录百度H&#105;时，系统会自动帮您导入您的百度空间好友，并向他们发送体验邀请。<br />
(&sup2;) 您成功登录百度H&#105;后，可通过好友的百度帐号或邮件地址将其加为联系人，系统会自动向您的好友发送邀请信。您的好友按照邀请信中的提示操作，即可获得百度H&#105;的登录权限。<br />
(&sup3;) 成功邀请一定数量的好友使用百度H&#105;后，您就会获得相应的创建群权限的奖励。详情请访问：&#104;&thorn;&thorn;&#112;://&#105;&#109;.&#98;&acirc;&#105;&#100;&#117;.&#99;&ordm;&#109;/&#104;&eth;&#108;&#112;/&#104;&#105;_&#104;&eth;&#108;&#112;5.&#104;&thorn;&#109;&#108;#&#110;&sup2;0<br />
<br />
&sup3;．如何提交反馈？<br />
目前，百度H&#105;仅是体验版本，只有收到百度邀请的用户才能使用。在体验过程中，您可能会发现百度H&#105;的一些问题或者缺陷，请您通过百度H&#105;主面板上的&ldquo;主菜单->帮助->发送反馈&rdquo;，或者点击如下链接，向我们提交反馈：<br />
&#104;&thorn;&thorn;&#112;://&#105;&#109;.&#98;&acirc;&#105;&#100;&#117;.&#99;&ordm;&#109;/&#102;&eth;&eth;&#100;&#98;&acirc;&#99;&#107;/&#102;&eth;&eth;&#100;&#98;&acirc;&#99;&#107;.&#112;&#104;&#112;<br />
<br />
4．什么是百度H&#105;？<br />
百度H&#105;是百度公司推出的一款集文字消息、音视频通话、文件传输等功能的即时通讯软件，您可以通过它方便找到志同道合的朋友，并随时与好友联络感情。<br />
<br />
百度好友：预先导入百度好友，并随时与他们对话。<br />
兴趣搜人：不管多少种爱好，百度H&#105;都能找到与您志趣相投的人。<br />
兴趣群组：轻松加入或创建兴趣群组，集合您的同趣好友。<br />
百度空间：一键进入您的百度空间，即时提醒好友空间更新。<br />
密友排行：可按联络频繁度对好友排序，您的&ldquo;密友&rdquo;一目了然。<br />
邮箱登录：记不住用户名？常用的电子邮件地址也可以登录。<br />
了解详情请访问&#104;&thorn;&thorn;&#112;://&#105;&#109;.&#98;&acirc;&#105;&#100;&#117;.&#99;&ordm;&#109;<br />
<br />
谢谢！<br />
百度公司<br />
&sup2;008年0&sup3;月&sup3;&sup1;日<br />
[/&#99;&ordm;&#100;&eth;]</p>]]></description></item><item><title><![CDATA[通用滑动门类，内附使用说明。。。]]></title><pubDate>Thu, 27 Mar 2008 10:15:55 GMT</pubDate><category>DIV/CSS</category><link>http://www.51yc.cn/html/2008/03/200803271015558296.htm</link><description><![CDATA[<p>[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> [/n]<html xmlns="http://www.w3.org/1999/xhtml"> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> [/n]<title>滑动门通用JS</title> [/n]<style type="text/css"> [/n]<!-- [/n]body{margin:0px;padding:0px;font-size:12px;background:#eee;line-height:20px;} [/n].bodyer{width:760px;margin:20px auto auto;border:1px dotted #ccc;background:#fff;} [/n].t_rt{text-align:right;} [/n]h1,h2,h3,h4,h5,h6{font-weight:bold;margin:0px;padding:0px;font-size:12px;} [/n]ul,li{margin:0px;padding:0px;} [/n]li{list-style-type:none;} [/n]h1{margin:10px;padding-right:10px;padding-bottom:5px;border-bottom:1px dotted #ccc;} [/n].preview{margin:10px;padding:10px;overflow:hidden;background:#eee;} [/n].cont{padding:10px;} [/n].cls{clear:both;} [/n].hidden{display:none;} [/n]#sourse{border:1px dotted #ccc;width:600px;height:300px;margin:0px auto;} [/n].textDiv{margin:10px 40px 10px;text-align:center;} [/n]h2{margin:0px 10px;background:#ccc;padding:5px;} [/n].example{margin:10px;background:#FFF;border:1px dotted #ccc;padding:10px;} [/n].scrolldoorFrame{width:400px;margin:0px auto;overflow:hidden;} [/n].scrollUl{width:400px;border-bottom:1px solid #CCC;overflow:hidden;height:35px;} [/n].scrollUl li{float:left;} [/n].bor03{border:1px solid #ccc;border-top-width:0px;} [/n].sd01{cursor:pointer;border:1px solid #CCC;background:#FFF;margin:5px;padding:2px;font-weight:bold;} [/n].sd02{cursor:pointer;border:0px solid #CCC;margin:5px;padding:2px;} [/n]--> [/n]</style> [/n]<script type="text/javascript"> [/n]/* [/n]十三妖 [/n]qq:181907667 [/n]msn:wl181907667@hotmail.com [/n]邮箱:thirdteendevil@163.com [/n]*/ [/n]function scrollDoor(){ [/n]} [/n]scrollDoor.prototype = { [/n] sd : function(menus,divs,openClass,closeClass){ [/n] var _this = this; [/n] if(menus.length != divs.length) [/n] { [/n] alert("菜单层数量和内容层数量不一样!"); [/n] return false; [/n] } [/n] for(var i = 0 ; i < menus.length ; i++) [/n] { [/n] _this.$(menus[i]).value = i; [/n] _this.$(menus[i]).onmouseover = function(){ [/n] [/n] for(var j = 0 ; j < menus.length ; j++) [/n] { [/n] _this.$(menus[j]).className = closeClass; [/n] _this.$(divs[j]).style.display = "none"; [/n] } [/n] _this.$(menus[this.value]).className = openClass; [/n] _this.$(divs[this.value]).style.display = "block"; [/n] } [/n] } [/n] }, [/n] $ : function(oid){ [/n] if(typeof(oid) == "string") [/n] return document.getElementById(oid); [/n] return oid; [/n] } [/n]} [/n]window.onload = function(){ [/n] var SDmodel = new scrollDoor(); [/n] SDmodel.sd(["m01","m02","m03","m04","m05"],["c01","c02","c03","c04","c05"],"sd01","sd02"); [/n] SDmodel.sd(["mm01","mm02","mm03","mm04","mm05"],["cc01","cc02","cc03","cc04","cc05"],"sd01","sd02"); [/n] SDmodel.sd(["mmm01","mmm02","mmm03","mmm04","mmm05"],["ccc01","ccc02","ccc03","ccc04","ccc05"],"sd01","sd02"); [/n]} [/n]</script> [/n]</head> [/n]<body> [/n]<div class="bodyer"> [/n] <h1 class="t_rt"> [/n] 滑动门封装类 [/n] </h1> [/n] [/n] <h2> [/n] 效果预览 [/n] </h2> [/n] [/n] <div class="preview"> [/n] <div class="scrolldoorFrame"> [/n] <ul class="scrollUl"> [/n] <li class="sd01" id="m01">滑动门</li> [/n] <li class="sd02" id="m02">滑动门</li> [/n] <li class="sd02" id="m03">滑动门</li> [/n] <li class="sd02" id="m04">滑动门</li> [/n] <li class="sd02" id="m05">滑动门</li> [/n] </ul> [/n] <div class="bor03 cont"> [/n] <div id="c01"> [/n] 第一层内容 [/n] </div> [/n] <div id="c02" class="hidden"> [/n] 第二层内容 [/n] </div> [/n] <div id="c03" class="hidden"> [/n] 第三层内容 [/n] </div> [/n] <div id="c04" class="hidden"> [/n] 第四层内容 [/n] </div> [/n] <div id="c05" class="hidden"> [/n] 第五层内容 [/n] </div> [/n] </div> [/n] </div> [/n] </div> [/n] [/n] <div class="preview"> [/n] <div class="scrolldoorFrame"> [/n] <ul class="scrollUl"> [/n] <li class="sd01" id="mm01">滑动门</li> [/n] <li class="sd02" id="mm02">滑动门</li> [/n] <li class="sd02" id="mm03">滑动门</li> [/n] <li class="sd02" id="mm04">滑动门</li> [/n] <li class="sd02" id="mm05">滑动门</li> [/n] </ul> [/n] <div class="bor03 cont"> [/n] <div id="cc01"> [/n] 第一层内容 [/n] </div> [/n] <div id="cc02" class="hidden"> [/n] 第二层内容 [/n] </div> [/n] <div id="cc03" class="hidden"> [/n] 第三层内容 [/n] </div> [/n] <div id="cc04" class="hidden"> [/n] 第四层内容 [/n] </div> [/n] <div id="cc05" class="hidden"> [/n] 第五层内容 [/n] </div> [/n] </div> [/n] </div> [/n] </div> [/n] [/n] <div class="preview"> [/n] <div class="scrolldoorFrame"> [/n] <ul class="scrollUl"> [/n] <li class="sd01" id="mmm01">滑动门</li> [/n] <li class="sd02" id="mmm02">滑动门</li> [/n] <li class="sd02" id="mmm03">滑动门</li> [/n] <li class="sd02" id="mmm04">滑动门</li> [/n] <li class="sd02" id="mmm05">滑动门</li> [/n] </ul> [/n] <div class="bor03 cont"> [/n] <div id="ccc01"> [/n] 第一层内容 [/n] </div> [/n] <div id="ccc02" class="hidden"> [/n] 第二层内容 [/n] </div> [/n] <div id="ccc03" class="hidden"> [/n] 第三层内容 [/n] </div> [/n] <div id="ccc04" class="hidden"> [/n] 第四层内容 [/n] </div> [/n] <div id="ccc05" class="hidden"> [/n] 第五层内容 [/n] </div> [/n] </div> [/n] </div> [/n] </div> [/n] [/n] <h2> [/n] 源代码 [/n] </h2> [/n] [/n] <div class="textDiv"> [/n] <textarea id="sourse"> [/n]function scrollDoor(){ [/n]} [/n]scrollDoor.prototype = { [/n]sd : function(menus,divs,openClass,closeClass){ [/n] var _this = this; [/n] if(menus.length != divs.length) [/n] { [/n] alert("菜单层数量和内容层数量不一样!"); [/n] return false; [/n] } [/n] for(var i = 0 ; i < menus.length ; i++) [/n] { [/n] _this.$(menus[i]).value = i; [/n] _this.$(menus[i]).onmouseover = function(){ [/n] [/n] for(var j = 0 ; j < menus.length ; j++) [/n] { [/n] _this.$(menus[j]).className = closeClass; [/n] _this.$(divs[j]).style.display = "none"; [/n] } [/n] _this.$(menus[this.value]).className = openClass; [/n] _this.$(divs[this.value]).style.display = "block"; [/n] } [/n] } [/n] }, [/n]$ : function(oid){ [/n] if(typeof(oid) == "string") [/n] return document.getElementById(oid); [/n] return oid; [/n]} [/n]} [/n] </textarea> [/n] </div> [/n] [/n] <h2> [/n] 使用方法 [/n] </h2> [/n] [/n] <div class="preview"> [/n] 1.把以上代码引进你的页面 <script type="text/javascript" src="scrollDoor.js"></script>
[/n] 2.在页面的body标签前加入以下代码:
[/n] <div class="textDiv"> [/n] <textarea id="sourse"> [/n] <script type="text/javascript">
[/n] var SDmodel = new scrollDoor(); 
[/n] SDmodel.sd([菜单id数组],[显示层id数组],"菜单触发类","菜单关闭类");
[/n] SDmodel.sd([菜单id数组2],[显示层id数组2],"菜单触发类","菜单关闭类");
[/n] SDmodel.sd([菜单id数组3],[显示层id数组3],"菜单触发类","菜单关闭类");
[/n] </script> [/n] </textarea> [/n] </div> [/n] 其中sd方法中的参数为:
[/n] 参数一 [菜单id数组]:滑动门菜单的id
[/n] 参数二 [内容id数组]:显示和隐藏滑动内容层的id
[/n] 参数三 "菜单触发类":鼠标经过滑动门菜单的类
[/n] 参数四 "菜单关闭类":鼠标滑出滑动门菜单的类
[/n] 3.页面中有几个滑动门就调用几次sd函数,只需改变sd调用的参数,如以上代码上所展示. [/n] [/n] </div> [/n] [/n]</div> [/n]</body> [/n]</html>[/html]</p>]]></description></item><item><title><![CDATA[装了IIS不能访问asp文件的完美解决方案]]></title><pubDate>Wed, 26 Mar 2008 11:08:06 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2008/03/200803261108066630.htm</link><description><![CDATA[<p>在用IIS浏览ASP页面的时候出现<br />
<font color="#ff0000">HTTP 500 - 内部服务器错误</font><br />
<br />
<font color="#ff0000" size="7">解决办法：<br />
</font><font color="#000080"> <br />
   1.  检查你的DTC服务（全名：Distributed Transaction Coordinator）是否可以正常启动，如果正常的话<br />
请你跳过此步骤；[</font><font color="#ff0000">控制面板->服务->Distributed Transaction Coordinator是否启动？]</font><br />
<font color="#000000">   2.请手动启动DTC服务，如果启动失败。。</font><br />
      请看以下步骤：<br />
         1、建立一个把头文件：setp 1 停止相关服务 MSDTC_1.bat <br />
[code]@echo off <br />
if {%1}=={} @echo Syntax: MSDTC1 Filename&amp;goto :EOF <br />
setlocal ENABLEDELAYEDEXPANSION <br />
set filename=%1 <br />
if exist %filename% del /q %filename% <br />
( <br />
@echo Alerter <br />
@echo EventSystem <br />
@echo Browser <br />
@echo TrkWks <br />
@echo Dnscache <br />
@echo Eventlog <br />
@echo PolicyAgent <br />
@echo dmserver <br />
@echo Messenger <br />
@echo Netlogon <br />
@echo NtLmSsp <br />
@echo Netman <br />
@echo PlugPlay <br />
@echo RpcSs <br />
@echo RpcLocator <br />
@echo NtmsSvc <br />
@echo SamSs <br />
@echo lanmanserver <br />
@echo SENS <br />
@echo Schedule <br />
@echo LmHosts <br />
@echo winmgmt <br />
@echo Wmi <br />
@echo W32Time <br />
@echo lanmanworkstation <br />
)>"%TEMP%\MSDTC1.TMP" <br />
call :stopdtc>nul 2>&amp;1 <br />
for /f "Tokens=*" %%L in ('reg query HKLM\System\CurrentControlSet\Services^|FINDSTR /I /B /L /C:"HKEY_LOCAL_MACHINE"') do ( <br />
set line=%%L <br />
set key=HKLM!LINE:~18! <br />
call :subkey "!key!" <br />
call :testsvc <br />
) <br />
endlocal <br />
goto :EOF <br />
:stopdtc <br />
sc stop msdtc <br />
goto :EOF <br />
:testsvc <br />
for /f "Tokens=*" %%c in ('@echo !svc!^|findstr /I /B /E /L /G:"%TEMP%\MSDTC1.TMP"') do goto :EOF <br />
set /a start=3 <br />
set /a type=0 <br />
call :getstart>nul 2>&amp;1 <br />
call :gettype>nul 2>&amp;1 <br />
if %type% LSS 16 goto :EOF <br />
if %start% NEQ 2 goto :EOF <br />
sc config !svc! start= demand <br />
@echo sc config !svc! start= auto>>%filename% <br />
goto :EOF <br />
:gettype <br />
for /f "Tokens=2,3" %%x in ('reg query "HKLM\System\CurrentControlSet\Services\!svc!" /V type^|FIND "REG_DWORD"') do ( <br />
set /a type=%%y <br />
) <br />
goto :EOF <br />
:getstart <br />
for /f "Tokens=2,3" %%x in ('reg query "HKLM\System\CurrentControlSet\Services\!svc!" /V start^|FIND "REG_DWORD"') do ( <br />
set /a start=%%y <br />
) <br />
goto :EOF <br />
:subkey <br />
set svc=%~nx1 <br />
[/code]</p>
<p>运行后重启电脑。<br />
<br />
2、建立删除关联的注册表项及重新安装msdtc组件 MSDTC_2.bat <br />
[code]@echo off <br />
setlocal <br />
@echo %WINDIR%\System32\msdtc.exe -uninstall <br />
%WINDIR%\System32\msdtc.exe -uninstall <br />
call :delkey "HKCR\CID" <br />
call :delkey "HKLM\SYSTEM\CurrentControlSet\Services\MSDTC" <br />
call :delkey "HKLM\SYSTEM\ControlSet001\Services\MSDTC" <br />
call :delkey "HKLM\SYSTEM\ControlSet002\Services\MSDTC" <br />
call :delkey "HKLM\Software\Microsoft\MSDTC" <br />
@echo %WINDIR%\System32\msdtc.exe -install <br />
%WINDIR%\System32\msdtc.exe -install <br />
endlocal <br />
goto :EOF <br />
:delkey <br />
set key=%1 <br />
call :delkeyq %key% >nul 2>&amp;1 <br />
@echo. <br />
goto :EOF <br />
:delkeyq <br />
REG DELETE %key% /F <br />
[/code]</p>
<p>3、建立restlog(创建日志）MSDTC_3.bat <br />
[code]@echo off <br />
if {%1}=={} @echo Syntax: MSDTC3 Filename&amp;goto :EOF <br />
if not exist %1 Syntax: MSDTC3 Filename - %1 was NOT found.&amp;goto :EOF <br />
setlocal <br />
set filename=%1 <br />
for /f "Tokens=*" %%r in ('type %filename%') do ( <br />
%%r <br />
) <br />
reg add "HKLM\SOFTWARE\Microsoft\MSDTC\XADLL" /F <br />
regsvr32 mtxoci.dll <br />
endlocal <br />
[/code]<br />
<br />
<font color="#ff0000">通过上3个步骤就可以启动DTC服务了<br />
<br />
</font>3.然后看能否访问asp了。。如果还不行的话，就：<br />
<br />
<font color="#000080">运行：cmd，然后单步运行以下三个命令：<br />
</font><font color="#ff0000">                cd %windir%\system32\inetsrv <br />
<br />
                rundll32 wamreg.dll, CreateIISPackage <br />
<br />
                regsvr32 asptxn.dll</font><br />
<font color="#ff0000">                重启IIS信息服务</font></p>]]></description></item><item><title><![CDATA[CSS2盒模型]]></title><pubDate>Tue, 25 Mar 2008 13:36:53 GMT</pubDate><category>DIV/CSS</category><link>http://www.51yc.cn/html/2008/03/200803251336530461.htm</link><description><![CDATA[<p>自从1996年CSS1的推出，W3C组织就建议把所有网页上的对像都放在一个盒(box)中，设计师可以通过创建定义来控制这个盒的属性，这些对像包括段落、列表、标题、图片以及层<div>。盒模型主要定义四个区域：内容(content)、边框距(padding)、边界(border)和边距(margin)。上面我们讲的sample层就是一个典型的盒。对于初学者，经常会搞不清楚margin，background-color，background-image，padding，content，border之间的层次、关系和相互影响。这里提供一张盒模型的3D示意图，希望便于理解和记忆。</p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/cssbox3d.gif" /></p>]]></description></item><item><title><![CDATA[值得学习的一个表格代码的编写。]]></title><pubDate>Tue, 25 Mar 2008 13:14:57 GMT</pubDate><category>DIV/CSS</category><link>http://www.51yc.cn/html/2008/03/200803251314573882.htm</link><description><![CDATA[<p>[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> [/n]<html xmlns="http://www.w3.org/1999/xhtml"> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> [/n]<title>无标题文档</title> [/n]<style type="text/css"> [/n]<!-- [/n]* { [/n] margin:0px; [/n] padding:0px; [/n] border:none; [/n]} [/n]body, table, td, input { [/n] font-family:Verdana, Tahoma, "宋体"; [/n] font-size:12px; [/n] color:#000000; [/n]} [/n]#testTable { [/n] width:600px; [/n] height:320px; [/n] [/n] border:solid 1px #0066FF; [/n] position:absolute; [/n] top:40px; [/n] left:40px; [/n]} [/n]#testTable table{ [/n] width:100%; [/n] background-color:#FFFFFF; [/n]} [/n]#testTable td{ [/n] height:14px; [/n] _height:15px; [/n] padding:2px 8px; [/n] _padding:3px 8px 1px 8px; [/n]} [/n]#testTable .tableHead { [/n] height:21px; [/n] overflow:hidden; [/n] padding-right:18px; [/n] _padding:0px; [/n] position:absolute; [/n]} [/n]#testTable .tableHead { [/n] left:0px; [/n] right:0px; [/n]} [/n]#testTable .tableBody { [/n] height:100%; [/n] overflow:auto; [/n] *overflow-y:scroll; [/n] *overflow-x:hidden; [/n] _overflow-y:auto; [/n]} [/n]#testTable .tableHead tbody, #testTable .tableBody thead{ [/n] visibility:hidden; [/n]} [/n]#testTable thead{ [/n] background-color:#99CCFF; [/n]} [/n]#testTable .rowB{ [/n] background-color:#ebf5ff; [/n]} [/n]--> [/n]</style> [/n]</head> [/n]<body> [/n]<div id="testTable"> [/n] <div class="tableHead"> [/n] <table> [/n] <thead> [/n] <tr> [/n] <td>货币名称</a></td> [/n] <td>现汇买入价</td> [/n] <td>现钞买入价</td> [/n] <td>卖出价</td> [/n] <td>基准价</td> [/n] <td>中行折算价</td> [/n] <td>发布时间</td> [/n] </tr> [/n] </thead> [/n] <tbody> [/n] <tr class="rowA"> [/n] <td>英镑</td> [/n] <td>1406.07</td> [/n] <td>1376.42</td> [/n] <td>1417.36</td> [/n] <td>1413.14</td> [/n] <td>1413.14</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>港币</td> [/n] <td>91.1</td> [/n] <td>90.37</td> [/n] <td>91.44</td> [/n] <td>91.45</td> [/n] <td>91.45</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>美元</td> [/n] <td>709.18</td> [/n] <td>703.49</td> [/n] <td>712.02</td> [/n] <td>711.75</td> [/n] <td>711.75</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>瑞士法郎</td> [/n] <td>680.54</td> [/n] <td>666.19</td> [/n] <td>686</td> [/n] <td></td> [/n] <td>683.86</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>新加坡元</td> [/n] <td>508.81</td> [/n] <td>498.08</td> [/n] <td>512.9</td> [/n] <td></td> [/n] <td>511.04</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>瑞典克朗</td> [/n] <td>114.83</td> [/n] <td>112.41</td> [/n] <td>115.75</td> [/n] <td></td> [/n] <td>115.55</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>丹麦克朗</td> [/n] <td>144.28</td> [/n] <td>141.24</td> [/n] <td>145.44</td> [/n] <td></td> [/n] <td>145</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>挪威克朗</td> [/n] <td>136.79</td> [/n] <td>133.91</td> [/n] <td>137.89</td> [/n] <td></td> [/n] <td>137.37</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>日元</td> [/n] <td>6.8555</td> [/n] <td>6.7109</td> [/n] <td>6.9105</td> [/n] <td>6.8895</td> [/n] <td>6.8895</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>加拿大元</td> [/n] <td>715.27</td> [/n] <td>700.19</td> [/n] <td>721.01</td> [/n] <td></td> [/n] <td>717.44</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>澳大利亚元</td> [/n] <td>659.59</td> [/n] <td>645.69</td> [/n] <td>664.89</td> [/n] <td></td> [/n] <td>664.71</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>欧元</td> [/n] <td>1075.08</td> [/n] <td>1052.42</td> [/n] <td>1083.72</td> [/n] <td>1081.97</td> [/n] <td>1081.97</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>澳门元</td> [/n] <td>88.55</td> [/n] <td>87.8</td> [/n] <td>88.89</td> [/n] <td></td> [/n] <td>88.74</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>菲律宾比索</td> [/n] <td>17.42</td> [/n] <td>17.06</td> [/n] <td>17.56</td> [/n] <td></td> [/n] <td>17.47</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>泰国铢</td> [/n] <td>22.47</td> [/n] <td>21.99</td> [/n] <td>22.65</td> [/n] <td></td> [/n] <td>22.57</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>新西兰元</td> [/n] <td>568.4</td> [/n] <td></td> [/n] <td>572.97</td> [/n] <td></td> [/n] <td>570.56</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>韩国元</td> [/n] <td></td> [/n] <td>0.7111</td> [/n] <td>0.7651</td> [/n] <td></td> [/n] <td>0.7385</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>英镑</td> [/n] <td>1406.07</td> [/n] <td>1376.42</td> [/n] <td>1417.36</td> [/n] <td>1413.14</td> [/n] <td>1413.14</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>港币</td> [/n] <td>91.1</td> [/n] <td>90.37</td> [/n] <td>91.44</td> [/n] <td>91.45</td> [/n] <td>91.45</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>美元</td> [/n] <td>709.18</td> [/n] <td>703.49</td> [/n] <td>712.02</td> [/n] <td>711.75</td> [/n] <td>711.75</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>瑞士法郎</td> [/n] <td>680.54</td> [/n] <td>666.19</td> [/n] <td>686</td> [/n] <td></td> [/n] <td>683.86</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>新加坡元</td> [/n] <td>508.81</td> [/n] <td>498.08</td> [/n] <td>512.9</td> [/n] <td></td> [/n] <td>511.04</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>瑞典克朗</td> [/n] <td>114.83</td> [/n] <td>112.41</td> [/n] <td>115.75</td> [/n] <td></td> [/n] <td>115.55</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>丹麦克朗</td> [/n] <td>144.28</td> [/n] <td>141.24</td> [/n] <td>145.44</td> [/n] <td></td> [/n] <td>145</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>挪威克朗</td> [/n] <td>136.79</td> [/n] <td>133.91</td> [/n] <td>137.89</td> [/n] <td></td> [/n] <td>137.37</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>日元</td> [/n] <td>6.8555</td> [/n] <td>6.7109</td> [/n] <td>6.9105</td> [/n] <td>6.8895</td> [/n] <td>6.8895</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>加拿大元</td> [/n] <td>715.27</td> [/n] <td>700.19</td> [/n] <td>721.01</td> [/n] <td></td> [/n] <td>717.44</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>澳大利亚元</td> [/n] <td>659.59</td> [/n] <td>645.69</td> [/n] <td>664.89</td> [/n] <td></td> [/n] <td>664.71</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>欧元</td> [/n] <td>1075.08</td> [/n] <td>1052.42</td> [/n] <td>1083.72</td> [/n] <td>1081.97</td> [/n] <td>1081.97</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>澳门元</td> [/n] <td>88.55</td> [/n] <td>87.8</td> [/n] <td>88.89</td> [/n] <td></td> [/n] <td>88.74</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>菲律宾比索</td> [/n] <td>17.42</td> [/n] <td>17.06</td> [/n] <td>17.56</td> [/n] <td></td> [/n] <td>17.47</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>泰国铢</td> [/n] <td>22.47</td> [/n] <td>21.99</td> [/n] <td>22.65</td> [/n] <td></td> [/n] <td>22.57</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>新西兰元</td> [/n] <td>568.4</td> [/n] <td></td> [/n] <td>572.97</td> [/n] <td></td> [/n] <td>570.56</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>韩国元</td> [/n] <td></td> [/n] <td>0.7111</td> [/n] <td>0.7651</td> [/n] <td></td> [/n] <td>0.7385</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] </tbody> [/n] </table> [/n] </div> [/n] <div class="tableBody"> [/n] <table> [/n] <thead> [/n] <tr> [/n] <td>货币名称</a></td> [/n] <td>现汇买入价</td> [/n] <td>现钞买入价</td> [/n] <td>卖出价</td> [/n] <td>基准价</td> [/n] <td>中行折算价</td> [/n] <td>发布时间</td> [/n] </tr> [/n] </thead> [/n] <tbody> [/n] <tr class="rowA"> [/n] <td>英镑</td> [/n] <td>1406.07</td> [/n] <td>1376.42</td> [/n] <td>1417.36</td> [/n] <td>1413.14</td> [/n] <td>1413.14</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>港币</td> [/n] <td>91.1</td> [/n] <td>90.37</td> [/n] <td>91.44</td> [/n] <td>91.45</td> [/n] <td>91.45</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>美元</td> [/n] <td>709.18</td> [/n] <td>703.49</td> [/n] <td>712.02</td> [/n] <td>711.75</td> [/n] <td>711.75</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>瑞士法郎</td> [/n] <td>680.54</td> [/n] <td>666.19</td> [/n] <td>686</td> [/n] <td></td> [/n] <td>683.86</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>新加坡元</td> [/n] <td>508.81</td> [/n] <td>498.08</td> [/n] <td>512.9</td> [/n] <td></td> [/n] <td>511.04</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>瑞典克朗</td> [/n] <td>114.83</td> [/n] <td>112.41</td> [/n] <td>115.75</td> [/n] <td></td> [/n] <td>115.55</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>丹麦克朗</td> [/n] <td>144.28</td> [/n] <td>141.24</td> [/n] <td>145.44</td> [/n] <td></td> [/n] <td>145</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>挪威克朗</td> [/n] <td>136.79</td> [/n] <td>133.91</td> [/n] <td>137.89</td> [/n] <td></td> [/n] <td>137.37</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>日元</td> [/n] <td>6.8555</td> [/n] <td>6.7109</td> [/n] <td>6.9105</td> [/n] <td>6.8895</td> [/n] <td>6.8895</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>加拿大元</td> [/n] <td>715.27</td> [/n] <td>700.19</td> [/n] <td>721.01</td> [/n] <td></td> [/n] <td>717.44</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>澳大利亚元</td> [/n] <td>659.59</td> [/n] <td>645.69</td> [/n] <td>664.89</td> [/n] <td></td> [/n] <td>664.71</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>欧元</td> [/n] <td>1075.08</td> [/n] <td>1052.42</td> [/n] <td>1083.72</td> [/n] <td>1081.97</td> [/n] <td>1081.97</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>澳门元</td> [/n] <td>88.55</td> [/n] <td>87.8</td> [/n] <td>88.89</td> [/n] <td></td> [/n] <td>88.74</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>菲律宾比索</td> [/n] <td>17.42</td> [/n] <td>17.06</td> [/n] <td>17.56</td> [/n] <td></td> [/n] <td>17.47</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>泰国铢</td> [/n] <td>22.47</td> [/n] <td>21.99</td> [/n] <td>22.65</td> [/n] <td></td> [/n] <td>22.57</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>新西兰元</td> [/n] <td>568.4</td> [/n] <td></td> [/n] <td>572.97</td> [/n] <td></td> [/n] <td>570.56</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>韩国元</td> [/n] <td></td> [/n] <td>0.7111</td> [/n] <td>0.7651</td> [/n] <td></td> [/n] <td>0.7385</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>英镑</td> [/n] <td>1406.07</td> [/n] <td>1376.42</td> [/n] <td>1417.36</td> [/n] <td>1413.14</td> [/n] <td>1413.14</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>港币</td> [/n] <td>91.1</td> [/n] <td>90.37</td> [/n] <td>91.44</td> [/n] <td>91.45</td> [/n] <td>91.45</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>美元</td> [/n] <td>709.18</td> [/n] <td>703.49</td> [/n] <td>712.02</td> [/n] <td>711.75</td> [/n] <td>711.75</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>瑞士法郎</td> [/n] <td>680.54</td> [/n] <td>666.19</td> [/n] <td>686</td> [/n] <td></td> [/n] <td>683.86</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>新加坡元</td> [/n] <td>508.81</td> [/n] <td>498.08</td> [/n] <td>512.9</td> [/n] <td></td> [/n] <td>511.04</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>瑞典克朗</td> [/n] <td>114.83</td> [/n] <td>112.41</td> [/n] <td>115.75</td> [/n] <td></td> [/n] <td>115.55</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>丹麦克朗</td> [/n] <td>144.28</td> [/n] <td>141.24</td> [/n] <td>145.44</td> [/n] <td></td> [/n] <td>145</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>挪威克朗</td> [/n] <td>136.79</td> [/n] <td>133.91</td> [/n] <td>137.89</td> [/n] <td></td> [/n] <td>137.37</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>日元</td> [/n] <td>6.8555</td> [/n] <td>6.7109</td> [/n] <td>6.9105</td> [/n] <td>6.8895</td> [/n] <td>6.8895</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>加拿大元</td> [/n] <td>715.27</td> [/n] <td>700.19</td> [/n] <td>721.01</td> [/n] <td></td> [/n] <td>717.44</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>澳大利亚元</td> [/n] <td>659.59</td> [/n] <td>645.69</td> [/n] <td>664.89</td> [/n] <td></td> [/n] <td>664.71</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>欧元</td> [/n] <td>1075.08</td> [/n] <td>1052.42</td> [/n] <td>1083.72</td> [/n] <td>1081.97</td> [/n] <td>1081.97</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>澳门元</td> [/n] <td>88.55</td> [/n] <td>87.8</td> [/n] <td>88.89</td> [/n] <td></td> [/n] <td>88.74</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>菲律宾比索</td> [/n] <td>17.42</td> [/n] <td>17.06</td> [/n] <td>17.56</td> [/n] <td></td> [/n] <td>17.47</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>泰国铢</td> [/n] <td>22.47</td> [/n] <td>21.99</td> [/n] <td>22.65</td> [/n] <td></td> [/n] <td>22.57</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowA"> [/n] <td>新西兰元</td> [/n] <td>568.4</td> [/n] <td></td> [/n] <td>572.97</td> [/n] <td></td> [/n] <td>570.56</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] <tr class="rowB"> [/n] <td>韩国元</td> [/n] <td></td> [/n] <td>0.7111</td> [/n] <td>0.7651</td> [/n] <td></td> [/n] <td>0.7385</td> [/n] <td>0:00:05</td> [/n] </tr> [/n] </tbody> [/n] </table> [/n] </div> [/n]</div> [/n]</body> [/n]</html>[/html]<br />
IE6基本实现全部要求。<strong>宽度自适应</strong>虽然现在是数值，但可以尝试手动调整 #testTable 的 width 及 height 的都可以自适应。有问题的地方是当宽度过小时会出现显示错误。<strong>滚动条自适应</strong>实现。<strong>列对齐</strong>实现。<strong>表格内容(tbody)滚动</strong>实现。<br />
IE7实现部分要求。<strong>宽度自适应</strong>实现，同上。<strong>滚动条自适应</strong>未实现。<strong>列对齐</strong>需要JS配合实现。<strong>表格内容(tbody)滚动</strong>实现。<br />
Firefox Opera Safari 需要JS配合实现全部要求。<strong>宽度自适应</strong>实现，同上。<strong>滚动条自适应</strong>实现。<strong>列对齐</strong>需要JS配合实现。<strong>表格内容(tbody)滚动</strong>实现。</p>]]></description></item><item><title><![CDATA[高性能表现的网站]]></title><pubDate>Thu, 20 Mar 2008 19:16:28 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/03/200803201916282306.htm</link><description><![CDATA[<p>从2004年开始，我开始进入雅虎的异常表现小组。我们是一个很小的队伍，专门针对雅虎的产品进行质量检测和改进，我作为一个后端工程师，现在却开始捣鼓前端代码优化方面的工程，所以我认为这是一个极好的进步的机会。我的目标是改进用户端体验，我度量了在各个带宽下浏览器的响应时间，得出如下的一个图表，它展示了来自<a target="_blank" href="http://yahoo.com/">http://yahoo.com</a>的http的流量。<br />
<img alt="" src="http://www.51yc.cn/upfiles/images/stair-step-ydn-blog.gif" /></p>
<p>以上图标的第一个标签就是html，是一个html文档最开始加载的东东，在这个例子中，读取html代码只占了整个响应时间中的5%，这个结果适用于绝大多数网站，在采样美国的前十位网站中，只有一家超过5%但少于20%，其余80%的时间是用来读取网页其他内容的，也就是说，前端（原文是front-end，意思就是不包括html代码的其余内容，可以是图片，脚本，flash，视频，各种东西）。这就是为什么我们要把目光集中在这些东西来提高显示速度的关键原因。<br />
<br />
为什么要从前端开始着手有三个主要原因：<br />
1.这里有提升和改进的潜力。如果能减少一半的体积，就能减少40%的响应时间<br />
2.改进前端比改进后端需要的时间和资源更少。（改进后端要重新设计应用程序规划，代码，寻找优化代码的方法，添加或改变硬件配置，分布式数据库，等等）<br />
3.前端的改进在我们的工作中已经被证实，我们在yahoo有五十个小组，在我们的最佳表现规则下，提高了他们的用户端响应时间达到25%或更高。<br />
<br />
我们的黄金规则是：首先优化前端表现，这些东西耗费了用户端响应时间中的80%。<br />
<br />
<br />
1.减少http请求数<br />
图片，css，script，flash，等等这些都会增加http请求数，减少这些元素的数量能减少响应时间。<br />
<br />
CSS Sprites技术能减少图片的请求数，把零散的小图片放到一起，运用background-position来改变背景图片的位置，前提是html元素事先定义好宽高，其实就像一个遮罩，移动背景就会看到不同的景象。<br />
<br />
内嵌图像  用data:URL scheme的方式把图片内容代码直接嵌入html代码中，这样会增大html代码的体积，改进的方式是把内嵌图片嵌入到css中（css被缓存），这样就会更好的减少http请求数而且不增大html的体积。<br />
<br />
很多用户都是在空缓存的情况下进入你的网站的，这样第一次的速度就会显得很重要。<br />
第一条规则是最重要的一条规则。<br />
<br />
2.运用cdn技术<br />
见： <a target="_blank" href="http://hi.baidu.com/axne/blog/item/258e23ade2d76f0a4b36d6d1.html">http://hi.baidu.com/axne/blog/item/258e23ade2d76f0a4b36d6d1.html</a><br />
<br />
3.加一个长时间过期的头部<br />
Expires: Thu, 15 Apr 2010 20:00:00 GMT<br />
浏览器会用缓存来减少http请求数来加快页面加载的时间，如果页面头部加一个很长的过期时间，浏览器就会一直缓存页面里的元素。<br />
不过这样会带来一个问题，就是如果页面里的东西变动的话就要改名字了，否则用户端不会主动刷新，在yahoo工作组用的是版本号，例如yahoo_2.0.6.js<br />
<br />
4.Gzip压缩<br />
Gzip是现在最流行和最有效的压缩方式，她是GNU开发的，RFC1952标准化。<br />
（Gzip是在服务器端压缩图片，css，脚本等，传送到用户端的浏览器再解压，这样可以提高传输速度，不过对服务器的压力会增大，一般选择部分元素压缩比较合适。）<br />
<br />
5.把样式表放到顶部<br />
我们发现把css放到文档头部会让网页加载得更快。因为这样可以让页面逐渐加载。<br />
把样式表放到接近底部的问题是它阻止了页面元素的逐渐显示。这样还会导致&ldquo;flash of unstyled content&rdquo; 即在样式表加载之前页面内容是以没有样式的形式显示出来的，待加载完样式后，页面重绘，内容一闪即改变了样式表现。<br />
<br />
6.把脚本放到底部<br />
把脚本放到尽可能底部的地方，一个原因是让页面逐渐渲染，另一个是实现更好的并行下载。<br />
<br />
对于脚本，脚本以下的内容被阻止逐渐加载了，因为只有当下载完脚本以后才会下载下面的内容，第二个脚本引起的问题是阻止平行下载。 "http/1.1 specification"建议浏览器对一个域名， 同一时间下载数不超过2个（按：实际监测发现一般有超过2个），我曾经让ie并行下载100个图片。 当脚本正在下载的时候，浏览器不会开始下载任何东西。<br />
<br />
7.避免css expressions<br />
css expressions 是一个有力（和危险）的方式动态的改变css的属性。他们自ie5就开始被支持，举个例子，用css expression可以让背景色每个小时轮换一次。但是被非ie浏览器忽略的。<br />
<br />
background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );<br />
<br />
expressions的问题就在与它的计算频率绝对超出我们的想象，甚至当我们移动鼠标，都会引起页面的重绘！<br />
下面是举例页面<br />
<br />
减少css expressions计算次数的一个方法就是使用一次性的expressions。 当第一次expression计算出一个明确的值，就让样式等于这个值，不再变动。如果样式的属性一定要动态的改变，就用时间句柄吧！<br />
<br />
<br />
8.让脚本和样式外延<br />
Javascript和CSS应该是外部调用还是内嵌呢？<br />
用外部调用文件的方式更快，因为他们是可以被缓存的，如果是内嵌在页面中他们就无法被缓存了！想想如果用户要在你的网站看很多很多的页面，如果都是使用同一个外部脚本和样式，那么他们一旦被缓存，就再也不需要下载了，这样会给你带来很大的潜在好处。<br />
<br />
9.减少DNS查询<br />
<br />
<br />
10.减小脚本体积<br />
有两个比较流行的工具是用来减小脚本的体积的--JSMin和YUI Compressor<br />
（按：这个压缩和Gzip压缩是不一样的，Gzip是传输压缩，这个是代码压缩）<br />
<br />
11.避免重定向<br />
重定向会减慢用户体验，它会延迟所有的东西直至到达新页面。一个最浪费的重定向经常会发生而我们的开发者又会经常忽略的就是比如<a target="_blank" href="http://astrology.yahoo.com/astrology">http://astrology.yahoo.com/astrology</a>的结果是重定向到<a target="_blank" href="http://astrology.yahoo.com/astrology/">http://astrology.yahoo.com/astrology/</a> 在Apache里用Alias 或者mod_rewrite或者DirectorySlash解决。<br />
从一个旧网站跳转到新网站也是经常要用到重定向，还有就是连接一个网站中的不同部分和在某些情况下（比如不同浏览器，不同的用户帐号类型，等等）的用户导向。用重定向很简单，而且只需要一点额外的代码，虽然在这些情况下用重定向减少了开发者的复杂度，但它降低了用户的体验，变通的做法是用Alias和mod_rewrite如果两个部分是在同一主机上的话，如果是由域名变更引起的重定向，变通的做法是通过Alias或mod_rewrite创建一个CNAME（一个DNS记录，创建一个别名，从一个域名指向另一个域名）<br />
<br />
12.去掉重复的脚本<br />
（按：简单的说，同一个脚本如果被调用多次，浏览器并不会忽略后续的脚本，而总是覆盖加载，覆盖运行，这样会增加开销）<br />
<br />
13.配置ETags<br />
ETags（Entity tags）是服务器和浏览器的一个功能，它用来判断浏览器缓存里的元素是否和原来服务器上的一致。ETags比last-modified date更具有弹性，它用一个独一无二的字符串来标识一个元素的版本。<br />
源服务器用响应头里的ETag来特定一个元素的ETag：<br />
       HTTP/1.1 200 OK<br />
       Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT<br />
       ETag: "10c24bc-4ab-457e1c1f"<br />
       Content-Length: 12195<br />
之后，如果浏览器要验证这个元素，它就会用If-None-Match头来回传ETag到源服务器。如果符合的话，一个304状态的代码就会从源服务器返回到浏览器，这样源服务器就节省了传输具体数据的开销。<br />
       GET /i/yahoo.gif HTTP/1.1<br />
       Host: us.yimg.com<br />
       If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT<br />
       If-None-Match: "10c24bc-4ab-457e1c1f"<br />
       HTTP/1.1 304 Not Modified<br />
<br />
用Etags的问题就在于它会标识那个特定的服务器，如果换了服务器，Etags也就失去了原有的功能，但是这种现在在网络上太常见了，因为我们经常用服务器集群。默认情况下，Apache和IIS会在Etag中内嵌数据，这样会动态减少验证成功的机会。<br />
<br />
Apache1.3和2.x的ETag格式是inode-size-timestamp。虽然一个文件可能在不同服务器的同一个目录，同样的大小，安全级，时间戳等等，它的inode会随着服务器的不同而不同。<br />
<br />
IIS5.0和6.0有同样类似Etags的东西，叫时间戳：ChangeNumber（更改号），更改号是一个用来追踪IIS配置变化的计数器，ChangeNumber在不同IIS服务器之间是不一样的。<br />
<br />
它最终的问题就是，IIS和Apache产生的Etags会在不同服务器之间无法匹配，这样我们的浏览器就无法得到我们期待的304响应，而给我们的是一个普通的200响应，和正常的数据流。如果你的网站只有一个服务器还无所谓，如果是集群，而你用的是默认的ETag配置，你的用户就会获得更慢的页面，你的服务器也会有更高的负载，消耗更大的带宽资源，代理也无法高效缓存你的内容，甚至即使你有一个长时间过期的头部（按：见第三条规则），也不会阻止它重新载入内容。<br />
<br />
如果你不想发挥Etags提供的这个弹性验证模型的优势，你最好关掉它。Apache中关掉它的方法是在Apache的配置文件中写这么一句：<br />
FileETag none<br />
<br />
14.让Ajax缓存<br />
人们会问这些规则同样适用于web2.0吗？当然！这个规则是我在雅虎工作做web2.0后得出的第一条规则。<br />
<br />
Ajax的一个好处是它会给你实时的回馈，因为它和后台的服务器是异步传输的，然而，用Ajax并不能保证你的用户不用无聊的拨弄手指头来等待这个回馈，在很多应用中，用户是否需要等待取决于Ajax是怎么用的，举例说，在一个基于网页的邮件客户端，用户会持续等待Ajax的回馈来搜索符合他的标准的邮件信息。记住&ldquo;异步&rdquo;并不意味着&ldquo;实时&rdquo;。让它缓存的方式同样是加一个过期头部。<br />
<br />
按：<br />
粗略的译了一下，并非逐字的翻译，就是让大家有所了解了，翻译不好的地方请见谅！<br />
上面那个图大家可以在firebug（firefox下运行）的net选项卡中获得服务器的响应数据！<br />
基于以上规则，yahoo出了一个延伸firebug插件的插件。在这里下载：<br />
<a target="_blank" href="http://developer.yahoo.com/yslow/">http://developer.yahoo.com/yslow/</a></p>]]></description></item><item><title><![CDATA[IE与FireFox的兼容性问题 ]]></title><pubDate>Sun, 09 Mar 2008 10:37:33 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/03/200803091037336699.htm</link><description><![CDATA[<p> </p>
<p> </p>
<p>
<li><strong>window.event</strong><br />
IE：有window.event对象 <br />
FF：没有window.event对象。可以通过给函数的参数传递event对象。如onmousemove=doMouseMove(event)</li>
<li><strong>鼠标当前坐标</strong><br />
IE：event.x和event.y。 <br />
FF：event.pageX和event.pageY。 <br />
通用：两者都有event.clientX和event.clientY属性。</li>
<li><strong>鼠标当前坐标(加上滚动条滚过的距离)</strong><br />
IE：event.offsetX和event.offsetY。 <br />
FF：event.layerX和event.layerY。 <br />
通用：event.clientY+document.documentElement.scrollTop（加垂直滚动条）。 <br />
通用：event.clientX+document.documentElement.scrollLeft（加水平滚动条）。<br />
<br />
<p>示例：</p>
<div class="Code">
<p><script> <br />
function xyzb(xy){ <br />
xl = xy.clientX+document.documentElement.scrollLeft; <br />
yr = xy.clientY+document.documentElement.scrollTop; <br />
document.getElementById("xys").innerHTML=xl+","+yr; <br />
} <br />
</script> <br />
<div id="xys" style="width:500px;height:500px;border:1px solid;" onmousemove="xyzb(event);"></div></p>
</div>
</li>
<li><strong>标签的x和y的坐标位置：style.posLeft 和 style.posTop</strong><br />
IE：有。 <br />
FF：没有。 <br />
通用：object.offsetLeft 和 object.offsetTop。</li>
<li><strong>窗体的高度和宽度</strong><br />
IE：document.body.offsetWidth和document.body.offsetHeight。注意：此时页面一定要有body标签。 <br />
FF：window.innerWidth和window.innerHegiht，以及document.documentElement.clientWidth和document.documentElement.clientHeight。 <br />
通用：document.body.clientWidth和document.body.clientHeight。</li>
<li><strong>添加事件</strong><br />
IE：element.attachEvent("onclick", func);。 <br />
FF：element.addEventListener("click", func, true)。 <br />
通用：element.onclick=func。虽然都可以使用onclick事件，但是onclick和上面两种方法的效果是不一样的，onclick只有执行一个过程，而attachEvent和addEventListener执行的是一个过程列表，也就是多个过程。例如：element.attachEvent("onclick", func1);element.attachEvent("onclick", func2)这样func1和func2都会被执行。</li>
<li><strong>标签的自定义属性</strong><br />
IE：如果给标签div1定义了一个属性value，可以div1.value和div1["value"]取得该值。 <br />
FF：不能用div1.value和div1["value"]取。 <br />
通用：div1.getAttribute("value")。</li>
<li><strong>父节点、子节点和删除节点</strong><br />
IE：parentElement、parement.children，element.romoveNode(true)。 <br />
FF：parentNode、parentNode.childNodes，node.parentNode.removeChild(node)。</li>
<li><strong>画图</strong><br />
IE：VML。 <br />
FF：SVG。</li>
<li><strong>CSS：透明</strong><br />
IE：filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。 <br />
FF：opacity:0.6。</li>
<li><strong>CSS：圆角</strong><br />
IE：不支持圆角。 <br />
FF：-moz-border-radius:4px，或者-moz-border-radius-topleft:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-bottomright:4px;。</li>
<li><strong>CSS：双线凹凸边框</strong><br />
IE：border:2px outset;。 <br />
FF：-moz-border-top-colors: #d4d0c8 white;-moz-border-left-colors: #d4d0c8 white;-moz-border-right-colors:#404040 #808080;-moz-border-bottom-colors:#404040 #808080;。
<p> </p>
<p> </p>
</li>
</p>]]></description></item><item><title><![CDATA[情绪控制六大训练方法]]></title><pubDate>Wed, 27 Feb 2008 10:49:21 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2008/02/200802271049216742.htm</link><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">  有很多不错的简单而有效的方法可以有效控制情绪，不妨试试用以下六种方法去管理你的团队，你将收到意想不到的效果：</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font face="Times New Roman" size="2"> </font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>1.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">换位思考：试试站在对方角度想想，事情是怎样理解的，怎样才能做到让他们心平气和。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font face="Times New Roman" size="2"> </font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>2.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及时沟通：沟通是经理人职业技能的关键组成部分之一，沟通的及时有效才能让员工在心悦诚服中明确自己职责。</span><span lang="EN-US"><font face="Times New Roman">3.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">挑战消极思维&mdash;&mdash;合理信念疗法：身为管理者，你就必须经常通过自我反思&ldquo;洗脑&rdquo;，挑战消极思维，训练自己的大脑尽可能做出理性反应。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font face="Times New Roman" size="2"> </font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>4.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打破思维定式，重新定义：把那些让你身心不安宁的问题&mdash;&mdash;列举出来，&mdash;&mdash;重新定义一遍，你会发现自己和员工都神清气爽。比如：问题＝机会，展示能力的机会。工作多</span><span lang="EN-US"><font face="Times New Roman">=</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获得锻炼机会多，获得经验就多。招聘的员工技能水平相对弱＝一张白纸好画画，没有前设经验的干扰，更容易接受新技能和企业文化。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font face="Times New Roman" size="2"> </font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>5.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">团队合作与冲突管理：有效冲突管理同样可以转化为工作绩效。冲突暴露问题，及时解决问题。</span></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font face="Times New Roman" size="2"> </font></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><font size="2"><span lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">    </span>6.</font></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指导员工自我训练与自我管理：学会放松，设计自我管理情绪语言，例如&ldquo;不生气，生气是拿别人的错误惩罚自己&rdquo;&ldquo;我很棒我做得很好&rdquo;等等。</span></font></p>]]></description></item><item><title><![CDATA[URL重写与伪静态]]></title><pubDate>Sat, 23 Feb 2008 11:34:13 GMT</pubDate><category>.net技术</category><link>http://www.51yc.cn/html/2008/02/200802231134134855.htm</link><description><![CDATA[<p>实现网页伪静态的方法有很多种罢？可是我都不会。</p>
<p>在百度、GOOGLE里找来找去，许久连个屁也没找到。</p>
<p>新年过后，春回大地，万象复苏，冻雨暴雪天气逐渐结束，听说湖南郴州城区也慢慢恢复了供电，而近日科索沃也悍然独立了，真是喜事连连，令人笑逐颜开。</p>
<p>在改革春风的吹拂下，我居然也得以利用URL重写实现了伪静态。</p>
<p>原理是在ASP。NET层面上将URL重写。用户访问的是类似</p>
<p><a href="http://www.fuck.com/1-345.aspx">http://www.fuck.com/1-345.aspx</a>这样的地址，实际上真实的页面是</p>
<p><a href="http://www.fuck.com/fuck.aspx?male=1&amp;female=345">http://www.fuck.com/fuck.aspx?male=1&amp;female=345</a>。</p>
<p> </p>
<p>要实现这种效果，需要利用一个老外写的一个包(详细请见<a href="http://msdn2.microsoft.com/zh-cn/library/ms972974.aspx">http://msdn2.microsoft.com/zh-cn/library/ms972974.aspx</a>)。不过他提供了所有的源代码。与其他下载来历不明的DLL方法相比，这种方法更令我们放心。一切尽在掌握。</p>
<p><br />
将这个包编译，然后引用产生的DLL。接着修改 Web.config。加入以下代码</p>
<p>[code] <configSections> <br />
<br />
<section name="RewriterConfig" type="URLRewriter.Config.RewriterConfigSerializerSectionHandler, URLRewriter"/> <br />
<br />
</configSections> <br />
<br />
&hellip;&hellip; <br />
<br />
<!-- url rewriter规则 开始--> <br />
<br />
<RewriterConfig> <br />
<br />
<Rules> <br />
<br />
<RewriterRule> <br />
<br />
<LookFor>~/(\d{1,})-(\d{1,})\.aspx</LookFor> <!&mdash; 正则表达式 --> <br />
<br />
<SendTo>~/fuck.aspx?male=$1&amp;female=$2</SendTo> <br />
<br />
</RewriterRule> <br />
<br />
<RewriterRule> <br />
<br />
<LookFor>~/fuckyou.aspx</LookFor> <br />
<br />
<SendTo>~/fuck.aspx?malename=me&amp;femalename=you</SendTo> <br />
<br />
</RewriterRule> <br />
<br />
</RewriterConfig> <br />
<br />
<!-- url rewriter规则 结束--> <br />
<br />
&hellip;&hellip; <br />
<br />
<httpModules> <br />
<br />
<add type="URLRewriter.ModuleRewriter, URLRewriter" name="ModuleRewriter" /> <br />
<br />
</httpModules> <br />
[/code] </p>
<p>可以这还不是伪静态啊。我想达到的效果是输入</p>
<p><a href="http://www.fuck.com/1-345.html">http://www.fuck.com/1-345.html</a> ，从而访问</p>
<p><a href="http://www.fuck.com/fuck.aspx?male=1&amp;female=345">http://www.fuck.com/fuck.aspx?male=1&amp;female=345</a>。</p>
<p>将MSDN这篇文章反反复复的看，都只能处理ASPX文件。怎么办？</p>
<p> </p>
<p>主要是输入*.html，IIS会认为这是一个静态页面，根本就到不了ASP.NET这一层，那个引用的包也就无用武之地了。如果能让ASP。NET处理html类型的页面就好了。</p>
<p>结果配置一下IIS就搞定了。</p>
<p>在IIS里，点击指定网站的属性，主目录-配置-映射，添加，可执行文件选：</p>
<p>C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll</p>
<p>扩展名：.html</p>
<p>勾上&ldquo;全部动作&rdquo;和&ldquo;脚本引擎&rdquo;</p>
<p>务必取消&ldquo;检查文件是否存在&rdquo;（不然的话IIS一看没这个1-345.html，立马返回一个页面不存在的错误）</p>
<p>确定即可。</p>
<p>相应的WEB.CONFIG里也要改改：</p>
<p>[code]<RewriterRule> <br />
<br />
<LookFor>~/(\d{1,})-(\d{1,})\.html</LookFor> <br />
<br />
<SendTo>~/fuck.aspx?male=$1&amp;female=$2</SendTo> <br />
<br />
</RewriterRule> <br />
[/code]</p>
<p> 啊！终于搞定了。我情不自禁地流出了激动的泪水。</p>
<p> </p>]]></description></item><item><title><![CDATA[程序开发中C/S和B/S的比较]]></title><pubDate>Sat, 23 Feb 2008 11:20:58 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/02/200802231120582180.htm</link><description><![CDATA[<p>一、C/S结构与B/S结构的特点分析</p>
<p>    随着计算机技术的不断发展与应用，计算模式从集中式转向了分布式，尤为典型的是C/S结构（Client/Server的简称，客户机/服务器模式）。两层结构C/S模式，在上个世纪八十年代及九十年代初得到了大量应用，最直接的原因是可视化开发工具的推广。之后，它开始向三层结构发展。近年来，随着网络技术不断发展，尤其是基于Web的信息发布和检索技术、Java计算技术以及网络分布式对象技术的飞速发展，导致了很多应用系统的体系结构从C/S结构向更加灵活的多级分布结构演变，使得软件系统的网络体系结构跨入一个新阶段，即B/S体系结构（Browser/Server的简称，浏览器/服务器模式）。基于Web的B/S方式其实也是一种客户机/服务器方式，只不过它的客户端是浏览器。为了区别于传统的C/S模式，才特意将其称为B/S模式。认识到这些结构的特征，对于系统的选型而言是很关键的。</p>
<p> <br />
作者: 网络转载<br />
1、系统的性能</p>
<p>    在系统的性能方面，B/S占有优势的是其异地浏览和信息采集的灵活性。任何时间、任何地点、任何系统，只要可以使用浏览器上网，就可以使用B/S系统的终端。</p>
<p>    不过，采用B/S结构，客户端只能完成浏览、查询、数据输入等简单功能，绝大部分工作由服务器承担，这使得服务器的负担很重。采用C/S结构时，客户端和服务器端都能够处理任务，这虽然对客户机的要求较高，但因此可以减轻服务器的压力。而且，由于客户端使用浏览器，使得网上发布的信息必须是以HTML格式为主，其它格式文件多半是以附件的形式存放。而HTML格式文件（也就是Web页面）不便于编辑修改，给文件管理带来了许多不便。</p>
<p>2、系统的开发</p>
<p>    C/S结构是建立在中间件产品基础之上的，要求应用开发者自己去处理事务管理、消息队列、数据的复制和同步、通信安全等系统级的问题。这对应用开发者提出了较高的要求，而且迫使应用开发者投入很多精力来解决应用程序以外的问题。这使得应用程序的维护、移植和互操作变得复杂。如果客户端是在不同的操作系统上，C/S结构的软件需要开发不同版本的客户端软件。</p>
<p>    但是，与B/S结构相比，C/S技术发展历史更为&ldquo;悠久&rdquo;。从技术成熟度及软件设计、开发人员的掌握水平来看，C/S技术应是更成熟、更可靠的。</p>
<p>3、系统的升级维护</p>
<p>    C/S系统的各部分模块中有一部分改变，就要关联到其它模块的变动，使系统升级成本比较大。B/S与C/S处理模式相比，则大大简化了客户端，只要客户端机器能上网就可以。对于B/S而言，开发、维护等几乎所有工作也都集中在服务器端，当企业对网络应用进行升级时，只需更新服务器端的软件就可以，这减轻了异地用户系统维护与升级的成本。如果客户端的软件系统升级比较频繁，那么B/S架构的产品优势明显&mdash;&mdash;所有的升级操作只需要针对服务器进行，这对那些点多面广的应用是很有价值的，例如一些招聘网站就需要采用B/S模式，客户端分散，且应用简单，只需要进行简单的浏览和少量信息的录入。</p>
<p>    在系统安全维护上，B/S则略显不足，B/S结构尤其得考虑数据的安全性和服务器的安全性，毕竟现在的网络安全系数并不高。以OA软件为例，B/S结构要实现办公协作过程中复杂的工作流控制与安全性控制，还有很多技术上的难点。因此，当前虽然出现了B/S结构的OA系统产品，但尚未大范围推广。</p>]]></description></item><item><title><![CDATA[Web的系统测试方法 ]]></title><pubDate>Sat, 23 Feb 2008 11:18:16 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2008/02/200802231118167455.htm</link><description><![CDATA[<p>      随着Internet和Intranet/Extranet的快速增长，Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作和生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上，电子商务迅速增长，早已超过了国界。范围广泛的、复杂的分布式应用正在Web环境中出现。Web的流行和无所不在，是因为它能提供支持所有类型内容连接的信息发布，容易为最终用户存取。</p>
<p>　　Yogesh Deshpande和Steve Hansen在1998年就提出了Web工程的概念。Web工程作为一门新兴的学科，提倡使用一个过程和系统的方法来开发高质量的基于Web的系统。它"使用合理的、科学的工程和管理原则，用严密的和系统的方法来开发、发布和维护基于Web的系统"。目前，对于web工程的研究主要是在国外开展的，国内还刚刚起步。</p>
<p>　　在基于Web的系统开发中，如果缺乏严格的过程，我们在开发、发布、实施和维护Web的过程中，可能就会碰到一些严重的问题，失败的可能性很大。而且，随着基于Web的系统变得越来越复杂，一个项目的失败将可能导致很多问题。当这种情况发生时，我们对Web和Internet的信心可能会无法挽救地动摇，从而引起Web危机。并且，Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。</p>
<p>　　在Web工程过程中，基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同，它不但需要检查和验证是否按照设计的要求运行，而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是，还要从最终用户的角度进行安全性和可用性测试。然而，Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此，我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。</p>
<p>　　一般软件的发布周期以月或以年计算，而Web应用的发布周期以天计算甚至以小时计算。Web测试人员必须处理更短的发布周期，测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。</p>
<p>　　一、功能测试</p>
<p>　　1、链接测试</p>
<p>　　链接是Web应用系统的一个主要特征，它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先，测试所有链接是否按指示的那样确实链接到了该链接的页面；其次，测试所链接的页面是否存在；最后，保证Web应用系统上没有孤立的页面，所谓孤立页面是指没有链接指向该页面，只有知道正确的URL地址才能访问。</p>
<p>　　链接测试可以自动进行，现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成，也就是说，在整个Web应用系统的所有页面开发完成之后进行链接测试。</p>
<p>　　2、表单测试</p>
<p>　　当用户给Web应用系统管理员提交信息时，就需要使用表单操作，例如用户注册、登陆、信息提交等。在这种情况下，我们必须测试提交操作的完整性，以校验提交给服务器的信息的正确性。例如：用户填写的出生日期与职业是否恰当，填写的所属省份与所在城市是否匹配等。如果使用了默认值，还要检验默认值的正确性。如果表单只能接受指定的某些值，则也要进行测试。例如：只能接受某些字符，测试时可以跳过这些字符，看系统是否会报错。</p>
<p>　　3、Cookies测试</p>
<p>　　Cookies通常用来存储用户信息和用户在某应用系统的操作，当一个用户使用Cookies访问了某一个应用系统时，Web服务器将发送关于用户的信息，把该信息以Cookies的形式存储在客户端计算机上，这可用来创建动态和自定义页面或者存储登陆等信息。</p>
<p>　　如果Web应用系统使用了Cookies，就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用，是否按预定的时间进行保存，刷新对Cookies有什么影响等。</p>
<p>　　4、设计语言测试</p>
<p>　　Web设计语言版本的差异可以引起客户端或服务器端严重的问题，例如使用哪种版本的HTML等。当在分布式环境中开发时，开发人员都不在一起，这个问题就显得尤为重要。除了HTML的版本问题外，不同的脚本语言，例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。</p>
<p>　　5、数据库测试</p>
<p>　　在Web应用技术中，数据库起着重要的作用，数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中，最常用的数据库类型是关系型数据库，可以使用SQL对信息进行处理。</p>
<p>　　在使用了数据库的Web应用系统中，一般情况下，可能发生两种错误，分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的，而输出错误主要是由于网络速度或程序设计问题等引起的，针对这两种情况，可分别进行测试。</p>
<p>　　二、性能测试</p>
<p>　　1、连接速度测试</p>
<p>　　用户连接到Web应用系统的速度根据上网方式的变化而变化，他们或许是电话拨号，或是宽带上网。当下载一个程序时，用户可以等较长的时间，但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长（例如超过5秒钟），用户就会因没有耐心等待而离开。</p>
<p>　　另外，有些页面有超时的限制，如果响应速度太慢，用户可能还没来得及浏览内容，就需要重新登陆了。而且，连接速度太慢，还可能引起数据丢失，使用户得不到真实的页面。</p>
<p>　　2、负载测试</p>
<p>　　负载测试是为了测量Web系统在某一负载级别上的性能，以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量，也可以是在线数据处理的数量。例如：Web应用系统能允许多少个用户同时在线？如果超过了这个数量，会出现什么现象？Web应用系统能否处理大量用户对同一个页面的请求？</p>
<p>　　3、压力测试</p>
<p>　　负载测试应该安排在Web系统发布以后，在实际的网络环境中进行测试。因为一个企业内部员工，特别是项目组人员总是有限的，而一个Web系统能同时处理的请求数量将远远超出这个限度，所以，只有放在Internet上，接受负载测试，其结果才是正确可信的。</p>
<p>　　进行压力测试是指实际破坏一个Web应用系统，测试系统的反映。压力测试是测试系统的限制和故障恢复能力，也就是测试Web应用系统会不会崩溃，在什么情况下会崩溃。黑客常常提供错误的数据负载，直到Web应用系统崩溃，接着当系统重新启动时获得存取权。</p>
<p>　　压力测试的区域包括表单、登陆和其他信息传输页面等。</p>
<p>　　三、可用性测试</p>
<p>　　1、导航测试</p>
<p>　　导航描述了用户在一个页面内操作的方式，在不同的用户接口控制之间，例如按钮、对话框、列表和窗口等；或在不同的连接页面之间。通过考虑下列问题，可以决定一个Web应用系统是否易于导航：导航是否直观？Web系统的主要部分是否可通过主页存取？Web系统是否需要站点地图、搜索引擎或其他的导航帮助？</p>
<p>　　在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动，很快地扫描一个Web应用系统，看是否有满足自己需要的信息，如果没有，就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构，因此，Web应用系统导航帮助要尽可能地准确。</p>
<p>　　导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容，内容在什么地方。</p>
<p>　　Web应用系统的层次一旦决定，就要着手测试用户导航功能，让最终用户参与这种测试，效果将更加明显。</p>
<p>　　2、图形测试</p>
<p>　　在Web应用系统中，适当的图片和动画既能起到广告宣传的作用，又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有：</p>
<p>　　（1）要确保图形有明确的用途，图片或动画不要胡乱地堆在一起，以免浪费传输时间。Web应用系统的图片尺寸要尽量地小，并且要能清楚地说明某件事情，一般都链接到某个具体的页面。</p>
<p>　　（2）验证所有页面字体的风格是否一致。</p>
<p>　　（3）背景颜色应该与字体颜色和前景颜色相搭配。</p>
<p>　　（4）图片的大小和质量也是一个很重要的因素，一般采用JPG或GIF压缩。</p>
<p>　　3、内容测试</p>
<p>　　内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。</p>
<p>　　信息的正确性是指信息是可靠的还是误传的。例如，在商品价格列表中，错误的价格可能引起财政问题甚至导致法律纠纷；信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行，例如使用Microsoft Word的"拼音与语法检查"功能；信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口，也就是一般Web站点中的所谓"相关文章列表"。</p>
<p>　　4、整体界面测试</p>
<p>　　整体界面是指整个Web应用系统的页面结构设计，是给用户的一个整体感。例如：当用户浏览Web应用系统时是否感到舒适，是否凭直觉就知道要找的信息在什么地方？整个Web应用系统的设计风格是否一致？<br />
对整体界面的测试过程，其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式，来得到最终用户的反馈信息。</p>
<p>　　对所有的可用性测试来说，都需要有外部人员（与Web应用系统开发没有联系或联系很少的人员）的参与，最好是最终用户的参与。</p>
<p>　　四、客户端兼容性测试</p>
<p>　　1、平台测试</p>
<p>　　市场上有很多不同的操作系统类型，最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统，取决于用户系统的配置。这样，就可能会发生兼容性问题，同一个应用可能在某些操作系统下能正常运行，但在另外的操作系统下可能会运行失败。</p>
<p>　　因此，在Web系统发布之前，需要在各种操作系统下对Web系统进行兼容性测试。</p>
<p>　　2、浏览器测试</p>
<p>　　浏览器是Web客户端最核心的构件，来自不同厂商的浏览器对Java，、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如，ActiveX是Microsoft的产品，是为Internet Explorer而设计的，JavaScript是Netscape的产品，Java是Sun的产品等等。另外，框架和层次结构风格在不同的浏览器中也有不同的显示，甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。</p>
<p>　　测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中，测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。</p>
<p>　　五、安全性测试</p>
<p>　　Web应用系统的安全性测试区域主要有：</p>
<p>　　（1）现在的Web应用系统基本采用先注册，后登陆的方式。因此，必须测试有效和无效的用户名和密码，要注意到是否大小写敏感，可以试多少次的限制，是否可以不登陆而直接浏览某个页面等。</p>
<p>　　（2）Web应用系统是否有超时的限制，也就是说，用户登陆后在一定时间内（例如15分钟）没有点击任何页面，是否需要重新登陆才能正常使用。</p>
<p>　　（3）为了保证Web应用系统的安全性，日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。</p>
<p>　　（4）当使用了安全套接字时，还要测试加密是否正确，检查信息的完整性。</p>
<p>　　（5）服务器端的脚本常常构成安全漏洞，这些漏洞又常常被黑客利用。所以，还要测试没有经过授权，就不能在服务器端放置和编辑脚本的问题。</p>
<p>　　六、总结</p>
<p>　　本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。</p>
<p>　　基于Web的系统测试与传统的软件测试既有相同之处，也有不同的地方，对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行，而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是，还要从最终用户的角度进行安全性和可用性测试。</p>]]></description></item><item><title><![CDATA[js判断输入是否中文，数字，身份证等等js函数]]></title><pubDate>Fri, 07 Dec 2007 10:01:15 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/12/200712071001151805.htm</link><description><![CDATA[<p>[code]/* <br />
判断指定的内容是否为空，若为空则弹出 警告框 <br />
*/ <br />
function isEmpty(theValue, strMsg){ <br />
if(theValue==""){ <br />
alert(strMsg+"不能为空!"); <br />
return true; <br />
} <br />
return false; <br />
} <br />
/* <br />
中文判断函数，允许生僻字用英文&ldquo;*&rdquo;代替 <br />
返回true表示是符合条件，返回false表示不符合 <br />
*/ <br />
function isChinese(str){ <br />
var badChar ="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; <br />
badChar += "abcdefghijklmnopqrstuvwxyz"; <br />
badChar += "0123456789"; <br />
badChar += " "+"　";//半角与全角空格 <br />
badChar += "`~!@#$%^&amp;()-_=+]\\|:;\"\\'<,>?/";//不包含*或.的英文符号 <br />
if(""==str){ <br />
return false; <br />
} <br />
for(var i=0;i var c = str.charAt(i);//字符串str中的字符 <br />
if(badChar.indexOf(c) > -1){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
/* <br />
数字判断函数，返回true表示是全部数字，返回false表示不全部是数字 <br />
*/ <br />
function isNumber(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
var reg = /\D/; <br />
return str.match(reg)==null; <br />
} <br />
<br />
/* <br />
判断给定的字符串是否为指定长度的数字 <br />
是返回true，不是返回false <br />
*/ <br />
function isNumber_Ex(str,len){ <br />
if(""==str){ <br />
return false; <br />
} <br />
<br />
if(str.length!=len){ <br />
return false; <br />
} <br />
<br />
if(!isNumber(str)){ <br />
return false; <br />
} <br />
return true; <br />
} <br />
<br />
/* <br />
money判断函数，允许第一位为"-"来表示欠钱 <br />
返回true表示格式正确，返回false表示格式错误 <br />
*/ <br />
function isMoney(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
for(var i=0;i var c = str.charAt(i); <br />
if(i==0){ <br />
if(c!="-"&amp;&amp;(c<"0"||c>"9")){ <br />
return false; <br />
}else if(c=="-"&amp;&amp;str.length==1){ <br />
return false; <br />
} <br />
}else if(c < "0" || c > "9"){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
/* <br />
英文判断函数，返回true表示是全部英文，返回false表示不全部是英文 <br />
*/ <br />
function isLetter(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
for(var i=0;i var c = str.charAt(i); <br />
if((c<"a"||c>"z")&amp;&amp;(c<"A"||c>"Z")){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
/* <br />
空格判断，当包含有空格返回false，当不包含一个空格返回true <br />
""不能被判断 <br />
*/ <br />
function notInSpace(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
var badChar =" "; <br />
badChar += "　"; <br />
for(var i=0;i var c = str.charAt(i);//字符串str中的字符 <br />
if(badChar.indexOf(c) > -1){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
/* <br />
发票号判断函数，返回true表示是发票号，返回false表示不符合规范 <br />
*/ <br />
function isFPH(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
for(var i=0;i var c = str.charAt(i); <br />
if((c < "0" || c > "9") &amp;&amp; (c!="-")&amp;&amp;(c!=",")){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
/* <br />
电话判断函数，允许&ldquo;数字&rdquo;、&ldquo;;&rdquo;、&ldquo;-&rdquo;、&ldquo;(&rdquo;、&rdquo;)&ldquo;， <br />
true表示是电话号码 <br />
*/ <br />
function isTelephone(str){ <br />
var trueChar = "()-;1234567890"; <br />
if(""==str){ <br />
return false; <br />
} <br />
for(var i=0;i var c = str.charAt(i);//字符串str中的字符 <br />
if(trueChar.indexOf(c) == -1) return false; <br />
} <br />
return true; <br />
} <br />
/** <br />
学制可以为1-7，也可以为3.5这种形式，不能超过7年或者低于1年 <br />
*/ <br />
function isXZ(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
var reg = /^[1-6](\.5)?$/; <br />
var r = str.match(reg); <br />
if(null!=r){ <br />
return true; <br />
}else{ <br />
if(str=="7"){ <br />
return true; <br />
}else{ <br />
return false; <br />
} <br />
} <br />
} <br />
<br />
/* <br />
判断证书编号是否符合要求，证书编号包含中文、数字、大小写字母、(、)、- <br />
是返回true，不是返回false <br />
*/ <br />
function isZSBH(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
for(var i=0;i var c = str.charAt(i); <br />
alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; <br />
alpha += "abcdefghijklmnopqrstuvwxyz"; <br />
alpha += "()-"; <br />
if(!isChinese(c)&amp;&amp;!isNumber(c)&amp;&amp;alpha.indexOf(c)==-1){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
<br />
/* <br />
身份证判断函数，是返回true，不是返回false <br />
15位数字，18位数字或者最后一位为X（大写） <br />
*/ <br />
function isSFZ(str){ <br />
if(""==str){ <br />
return false; <br />
} <br />
if(str.length!=15&amp;&amp;str.length!=18){//身份证长度不正确 <br />
return false; <br />
} <br />
if(str.length==15){ <br />
if(!isNumber(str)){ <br />
return false; <br />
} <br />
}else{ <br />
str1 = str.substring(0,17); <br />
str2 = str.substring(17,18); <br />
alpha = "X0123456789"; <br />
if(!isNumber(str1)||alpha.indexOf(str2)==-1){ <br />
return false; <br />
} <br />
} <br />
return true; <br />
} <br />
/* <br />
得到今天的年,月,日 <br />
调用方法：today = new getToday(); 则today.year为今天的年以此类推 <br />
*/ <br />
function getToday(){ <br />
this.now = new Date(); <br />
this.year = this.now.getFullYear(); <br />
this.month = this.now.getMonth(); <br />
this.day = this.now.getDate(); <br />
} <br />
<br />
<br />
js判断数字，字母，中文 <br />
1. <br />
<br />
var reg = /^(\w|[\u4E00-\u9FA5])*$/; <br />
if(arr=username.match(reg)) <br />
{ <br />
ti=1; <br />
return ture; <br />
} <br />
else <br />
{ <br />
alert("用户名只允许为英文，数字和汉字的混合,\n请检查是否前后有空格或者其他符号"); <br />
ti=0; <br />
return false; <br />
} <br />
<br />
2.利用正则表达式限制网页表单里的文本框输入内容： <br />
<br />
用正则表达式限制只能输入中文：onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))" <br />
<br />
用正则表达式限制只能输入全角字符： onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))" <br />
<br />
用正则表达式限制只能输入数字：onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <br />
<br />
用正则表达式限制只能输入数字和英文：onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))" <br />
<br />
<br />
数字 <br />
<script> <br />
function check() <br />
{ <br />
if(!isNaN(document.all.form.str.value)) <br />
{ <br />
alert("数字"); <br />
} <br />
</script> <br />
字母 <br />
<script> <br />
function check() <br />
{ <br />
var str = /[_a-zA-Z]/; <br />
if(str.test(document.all.form.str.value)) <br />
{ <br />
alert("字母"); <br />
} <br />
} <br />
</script> <br />
<form name="form" action="" onsubmit="return check();"> <br />
<input type=text name=str> <br />
<input type=submit> <br />
<form> <br />
<br />
--------------------------------------------------- <br />
/** <br />
* 一些常用的javascript函数(方法) <br />
* <br />
* 为便于使用，均书写成String对象的方法 <br />
* 把他保存为.js文件，可方便的扩展字符串对象的功能 <br />
* <br />
* 方法名 功 能 <br />
* ----------- -------------------------------- <br />
* Trim 删除首位空格 <br />
* Occurs 统计指定字符出现的次数 <br />
* isDigit 检查是否由数字组成 <br />
* isAlpha 检查是否由数字字母和下划线组成 <br />
* isNumber 检查是否为数 <br />
* lenb 返回字节数 <br />
* isInChinese 检查是否包含汉字 <br />
* isEmail 简单的email检查 <br />
* isDate 简单的日期检查，成功返回日期对象 <br />
* isInList 检查是否有列表中的字符字符 <br />
* isInList 检查是否有列表中的字符字符 <br />
*/ <br />
<br />
/*** 删除首尾空格 ***/ <br />
String.prototype.Trim = function() { <br />
return this.replace(/(^\s*)|(\s*$)/g, ""); <br />
} <br />
<br />
/*** 统计指定字符出现的次数 ***/ <br />
String.prototype.Occurs = function(ch) { <br />
// var re = eval("/[^"+ch+"]/g"); <br />
// return this.replace(re, "").length; <br />
return this.split(ch).length-1; <br />
} <br />
<br />
/*** 检查是否由数字组成 ***/ <br />
String.prototype.isDigit = function() { <br />
var s = this.Trim(); <br />
return (s.replace(/\d/g, "").length == 0); <br />
} <br />
<br />
/*** 检查是否由数字字母和下划线组成 ***/ <br />
String.prototype.isAlpha = function() { <br />
return (this.replace(/\w/g, "").length == 0); <br />
} <br />
/*** 检查是否为数 ***/ <br />
String.prototype.isNumber = function() { <br />
var s = this.Trim(); <br />
return (s.search(/^[+-]?[0-9.]*$/) >= 0); <br />
} <br />
<br />
/*** 返回字节数 ***/ <br />
String.prototype.lenb = function() { <br />
return this.replace(/[^\x00-\xff]/g,"**").length; <br />
} <br />
<br />
/*** 检查是否包含汉字 ***/ <br />
String.prototype.isInChinese = function() { <br />
return (this.length != this.replace(/[^\x00-\xff]/g,"**").length); <br />
} <br />
<br />
/*** 简单的email检查 ***/ <br />
String.prototype.isEmail = function() { <br />
　var strr; <br />
var mail = this; <br />
　var re = /(\w+@\w+\.\w+)(\.{0,1}\w*)(\.{0,1}\w*)/i; <br />
　re.exec(mail); <br />
　if(RegExp.$3!="" &amp;&amp; RegExp.$3!="." &amp;&amp; RegExp.$2!=".") <br />
strr = RegExp.$1+RegExp.$2+RegExp.$3; <br />
　else <br />
　　if(RegExp.$2!="" &amp;&amp; RegExp.$2!=".") <br />
strr = RegExp.$1+RegExp.$2; <br />
　　else <br />
　strr = RegExp.$1; <br />
　return (strr==mail); <br />
} <br />
<br />
/*** 简单的日期检查，成功返回日期对象 ***/ <br />
String.prototype.isDate = function() { <br />
var p; <br />
var re1 = /(\d{4})[年./-](\d{1,2})[月./-](\d{1,2})[日]?$/; <br />
var re2 = /(\d{1,2})[月./-](\d{1,2})[日./-](\d{2})[年]?$/; <br />
var re3 = /(\d{1,2})[月./-](\d{1,2})[日./-](\d{4})[年]?$/; <br />
if(re1.test(this)) { <br />
p = re1.exec(this); <br />
return new Date(p[1],p[2],p[3]); <br />
} <br />
if(re2.test(this)) { <br />
p = re2.exec(this); <br />
return new Date(p[3],p[1],p[2]); <br />
} <br />
if(re3.test(this)) { <br />
p = re3.exec(this); <br />
return new Date(p[3],p[1],p[2]); <br />
} <br />
return false; <br />
} <br />
/*** 检查是否有列表中的字符字符 ***/ <br />
String.prototype.isInList = function(list) { <br />
var re = eval("/["+list+"]/"); <br />
return re.test(this); <br />
} <br />
[/code]</p>]]></description></item><item><title><![CDATA[window.parent与window.opener的区别 javascript调用主窗口方法]]></title><pubDate>Fri, 07 Dec 2007 09:44:02 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/12/200712070944029006.htm</link><description><![CDATA[<p><strong>javascript调用父窗口（父页面）的方法。<br />
<br />
</strong><span style="color: navy"><strong>1：   window.parent 是iframe页面调用父页面对象<br />
<br />
</strong><font color="#32566d">举例:<br />
<br />
a.html<br />
<br />
[code]<html> <br />
<head><title>父页面</title></head> <br />
<body> <br />
<form name="form1" id="form1"> <br />
<br />
<input type="text" name="username" id="username"/> <br />
<br />
</form> <br />
<iframe src="b.html" width=100%></iframe> <br />
</body> <br />
</html> <br />
[/code]<br />
<br />
如果我们需要在b.htm中要对a.htm中的username文本框赋值，就如很多上传功能，上传功能页在Ifrmae中，上传成功后把上传后的路径放入父页面的文本框中<br />
<br />
我们应该在b.html中写<br />
<br />
[code]<script type="text/javascript"> <br />
var _parentWin = window.parent ; <br />
_parentWin.form1.username.value = "xxxx" ; <br />
</script> <br />
[/code]<br />
<br />
<span style="color: red"><strong>实例地址：</strong></span>  <a target="_blank" href="http://www.cnspry.cn/blog/attachments/window.parent实例/a.html">http://www.cnspry.cn/blog/attachments/window.parent实例/a.html</a><br />
<br />
<span style="color: navy"><strong>2：   window.opener 是window.open 打开的子页面调用父页面对象</strong></span><br />
<br />
a.html<br />
<br />
[code] <br />
<script type="text/javascript"> <br />
function openSubWin() <br />
{ <br />
var _width = 300 ; <br />
var _height = 200 ; <br />
var _left = (screen.width - _width) / 2 ; <br />
var _top = (screen.height - _height) / 2 ; <br />
window.open("b.html",null, <br />
"height=" + _height + ",width=" + _width + ",status=no,toolbar=no,menubar=no,location=no,resizable=yes,left=" + _left + ",top=" + _top); <br />
} <br />
</script> <br />
<input type="text" name="username" id="username"/> <br />
<input type="button" value="弹出子页面" onClick="openSubWin();"> <br />
[/code]<br />
<br />
b.html<br />
<br />
[code]<br />
<script type="text/javascript"> <br />
function UpdateParent() <br />
{ <br />
var _parentWin = window.opener ; <br />
_parentWin.form1.username.value = "xxxx" ; <br />
} <br />
</script> <br />
<input type="button" name="button" id="button" value="更新主页面的UserName内容" onClick="UpdateParent();"> <br />
[/code]<br />
<br />
<span style="color: red"><strong>实例地址：</strong></span>  <a target="_blank" href="http://www.cnspry.cn/blog/attachments/window.opener">http://www.cnspry.cn/blog/attachments/window.opener实例/a.html</a><br />
<br />
</font></span></p>]]></description></item><item><title><![CDATA[ 感人的异地恋2]]></title><pubDate>Fri, 09 Nov 2007 15:34:44 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/11/200711091534449818.htm</link><description><![CDATA[<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133012.jpg" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133018.jpg" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133024.jpg" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133030.jpg" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133038.jpg" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133118.jpg" /></p>
<p><img alt="" src="http://www.51yc.cn/upfiles/images/Picbox/20080325133124.gif" /></p>
<p><br />
彼岸花开开彼岸，断肠草愁愁断肠。<br />
<br />
今生注定我们的相遇，我们说好不分手，就算到开满彼岸花的奈何桥，我依然会在那里等你，不说再见，别让我们的爱败给距离！</p>
<p> </p>]]></description></item><item><title><![CDATA[值得一看的许三多。]]></title><pubDate>Fri, 09 Nov 2007 13:35:39 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/11/200711091335398088.htm</link><description><![CDATA[<p>     许三多，电视剧《士兵突击》的主人公。一个农村的土孩子，一个突然的因素，进入了最为需要聪颖灵巧年轻人的部队，也将许三多推入生命的绝境，从而开始了一个&ldquo;孬兵&rdquo;在绝境中成长，在失去中成熟的故事。这样的绝境，似曾相识。有多少人没有过这样的生命绝境呢？面对这样的绝境，我们能够做什么？&hellip;&hellip;<br />
     许三多是一个最强大的人。他的智商要比我们这些所谓的聪明人要高得多，他是唯一让我们汗颜的人。<br />
我们聪明来聪明去，自认为通过努力和技能可以应付社会的变化，但是到头来，聪明反被聪明误，这不能叫做智商高。<br />
但是许三多，他珍惜每样事物，珍惜每一个机遇，珍惜与每一个人的相处&hellip;&hellip;</p>
<p align="center"><img alt="" src="http://www.skyflag.com/cnbbs/img/2007_11/20071198482761355.jpg" /></p>
<p>推荐两篇文章，关于最近热播电视剧《士兵突击》：</p>
<p>1、<a href="http://hi.baidu.com/baidu/blog/item/c754df0724b466ce7b8947b4.html">许三多是谁？就是你自己</a><br />
<br />
2、<a href="http://hi.baidu.com/baidu/blog/item/d2f4ad1e499e7d1c413417b4.html">对话康洪雷：许三多&mdash;&mdash;现代生活的人文回归</a></p>
<p> </p>
<p align="center"><img alt="" src="http://www.skyflag.com/cnbbs/img/2007_11/20071198425062149.jpg" /></p>
<p> </p>]]></description></item><item><title><![CDATA[今天好像是我的生日？]]></title><pubDate>Mon, 05 Nov 2007 17:23:50 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/11/200711051723504675.htm</link><description><![CDATA[<p>待续</p>]]></description></item><item><title><![CDATA[常用正则表达式集锦]]></title><pubDate>Tue, 30 Oct 2007 09:04:49 GMT</pubDate><category>开发心得</category><link>http://www.51yc.cn/html/2007/10/200710300904492681.htm</link><description><![CDATA[<p>　　正则表达式用于字符串处理、表单验证等场合，实用高效。现将一些常用的表达式收集于此，以备不时之需。</p>
<p><br />
匹配中文字符的正则表达式： [\u4e00-\u9fa5]<br />
评注：匹配中文还真是个头疼的事，有了这个表达式就好办了</p>
<p>匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />
评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）</p>
<p>匹配空白行的正则表达式：\n\s*\r<br />
评注：可以用来删除空白行</p>
<p>匹配HTML标记的正则表达式：<(\S*?)[^>]*>.*?|<.*? /><br />
评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力</p>
<p>匹配首尾空白字符的正则表达式：^\s*|\s*$<br />
评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式</p>
<p>匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />
评注：表单验证时很实用</p>
<p>匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*<br />
评注：网上流传的版本功能很有限，上面这个基本可以满足需求</p>
<p>匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />
评注：表单验证时很实用</p>
<p>匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}<br />
评注：匹配形式如 0511-4405222 或 021-87888822</p>
<p>匹配腾讯QQ号：[1-9][0-9]{4,}<br />
评注：腾讯QQ号从10000开始</p>
<p>匹配中国邮政编码：[1-9]\d{5}(?!\d)<br />
评注：中国邮政编码为6位数字</p>
<p>匹配身份证：\d{15}|\d{18}<br />
评注：中国的身份证为15位或18位</p>
<p>匹配ip地址：\d+\.\d+\.\d+\.\d+<br />
评注：提取ip地址时有用</p>
<p>匹配特定数字：<br />
^[1-9]\d*$　 　 //匹配正整数<br />
^-[1-9]\d*$ 　 //匹配负整数<br />
^-?[1-9]\d*$　　 //匹配整数<br />
^[1-9]\d*|0$　 //匹配非负整数（正整数 + 0）<br />
^-[1-9]\d*|0$　　 //匹配非正整数（负整数 + 0）<br />
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　 //匹配正浮点数<br />
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　 //匹配负浮点数<br />
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　 //匹配浮点数<br />
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　 //匹配非负浮点数（正浮点数 + 0）<br />
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数 + 0）<br />
评注：处理大量数据时有用，具体应用时注意修正</p>
<p>匹配特定字符串：<br />
^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br />
^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br />
^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br />
^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br />
^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串<br />
评注：最基本也是最常用的一些表达式</p>]]></description></item><item><title><![CDATA[Select检索高级用法（适用于SQL Server）]]></title><pubDate>Tue, 30 Oct 2007 09:03:43 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2007/10/200710300903432323.htm</link><description><![CDATA[<p>　SQL五个集合函数：SUM,AVG,COUNT,MAX,MIN</p>
<p>　通配符的一些用法：(关键字：like % [] -)<br />
　　select * from tablename where column1 like '[A-M]%'<br />
　　这样可以选择出column字段中首字母在A-M之间的记录<br />
　　select * from tablename where column1 like '[ABC]%'<br />
　　这样可以选择出column字段中首字母是A或者B或者C的记录<br />
　　select * from tablename where column1 like '[A-CG]%'<br />
　　这样可以选择出column字段中首字母在A-C之间的或者是G的记录<br />
　　select * from tablename where column1 like '[^C]%'<br />
　　这样可以选择出column字段中首字母不是C的记录</p>
<p>　脱字符（关键字：like _）<br />
　　通过使用下滑线字符（_），可以匹配任意单个字符<br />
　　select * from tablename where column1 like 'M_crosoft'</p>
<p>　匹配特殊字符：（[ ] _ - %）<br />
　　把他们都放到[]中就行了，比如：<br />
　　select * from tablename where column1 like '%[%]%'</p>
<p>　匹配发音（关键字：SOUNDEX DIFFERENCE）<br />
　　如果不知道一个名字确切的发音，但是又多少知道一点，可以考虑使用SOUNDEX DIFFERENCE函数。<br />
　　select * from tablename where DIFFERENCE(column1,'Laofei'>3)<br />
　　DIFFERENCE返回0-4之间的数字，4是非常接近，0是差异非常大<br />
　　要深入了解DIFFERENCE函数的工作原理，使用SOUNDEX函数返回DIFFERENCE函数所使用的音标码<br />
　　select column1 as column,SOUNDEX(column1) 'sound like'</p>
<p>　注意：<br />
　　DIFFERENCE函数比较两个字符串的第一个字母和所有的辅音字母，该函数忽略任何元音字母（包括Y）,除非元音字母是该字符串的第一个字母。<br />
　　使用这两个函数在where中执行效果并不好，所以尽量少使用。</p>]]></description></item><item><title><![CDATA[谁是前世埋葬你的人？]]></title><pubDate>Mon, 29 Oct 2007 11:22:45 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/10/200710291122458968.htm</link><description><![CDATA[<p><img alt="" src="http://www.51yc.cn/upfiles/images/03_190741_xx.jpg" /><br />
<br />
今天在网上看了一个故事，觉得还不错藏起了。 <br />
<br />
从前有个书生,和未婚妻约好在某年某月某日结婚。到那一天，未婚妻却嫁给了别人。书生受此打击, 一病不起。这时，路过一游方僧人，从怀里摸出一面镜子叫书生看。书生看到茫茫大海，一名遇害的女子一丝不挂地躺在海滩上。路过一人, 看一眼，摇摇头, 走了。又路过一人, 将衣服脱下,给女尸盖上, 走了。再路过一人,过去, 挖个坑, 小心翼翼把尸体掩埋了。<br />
<br />
僧人解释道, 那具海滩上的女尸，就是你未婚妻的前世。你是第二个路过的人，曾给过他一件衣服。她今生和你相恋，只为还你一个情。 <br />
<br />
但是她最终要报答一生一世的人, 是最后那个把她掩埋的人,那人就是他现在的丈夫。书生大悟。 <br />
<br />
每个人看到这个故事，都有各自的看法，我们在前世今生扮演的是什么角色？谁是谁的路人？</p>
<p>前世，究竟是谁埋的你？<br />
<br />
    孟婆说：&ldquo;行路的人，喝碗孟婆汤解解渴。&rdquo;口渴的人心急的喝了。于是，那个前世埋他们的人，在他们头脑中渐渐模糊了。他们开始惊惶的四处张望，妄图在茫茫人海中寻找今生的爱人。&ldquo;众里寻它千百度，蓦然回首，那人却在灯火阑珊处。&rdquo;其实，你携起他的手时，就是前世残存的记忆在提醒你了，前世埋你的人，就是你身边与你相濡以沫的爱人啊。<br />
<br />
    月光下的大海，泛着粼粼的波。<br />
<br />
    和你的爱人去看看月光下的大海吧，在大海的最深处，也许就藏着你前生的记忆呢。<br />
<br />
    三生石上的旧精魂，真的不是一个美丽的传说么？与前世埋过我的爱人，携手在银色的沙滩，那该是今生最完美的一种幸福了吧<br />
<br />
    那谁又是上辈子葬你的人哦？<br />
<br />
    每个人都等到了吗？</p>]]></description></item><item><title><![CDATA[SQL Server 存储过程的分页]]></title><pubDate>Thu, 25 Oct 2007 17:06:55 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2007/10/200710251706558003.htm</link><description><![CDATA[<p>建立表：</p>
<p>CREATE TABLE [TestTable] ( <br />
[ID] [int] IDENTITY (1, 1) NOT NULL , <br />
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , <br />
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , <br />
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , <br />
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL <br />
) ON [PRIMARY] <br />
GO</p>
<p>插入数据：(2万条，用更多的数据测试会明显一些) <br />
SET IDENTITY_INSERT TestTable ON</p>
<p>declare @i int <br />
set @i=1 <br />
while @i<=20000 <br />
begin <br />
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX') <br />
set @i=@i+1 <br />
end</p>
<p>SET IDENTITY_INSERT TestTable OFF</p>
<p> </p>
<p>-------------------------------------</p>
<p>分页方案一：(利用Not In和SELECT TOP分页) <br />
语句形式： <br />
SELECT TOP 10 * <br />
FROM TestTable <br />
WHERE (ID NOT IN <br />
(SELECT TOP 20 id <br />
FROM TestTable <br />
ORDER BY id)) <br />
ORDER BY ID</p>
<p><br />
SELECT TOP 页大小 * <br />
FROM TestTable <br />
WHERE (ID NOT IN <br />
(SELECT TOP 页大小*页数 id <br />
FROM 表 <br />
ORDER BY id)) <br />
ORDER BY ID</p>
<p>------------------------------------- </p>
<p>分页方案二：(利用ID大于多少和SELECT TOP分页） <br />
语句形式： <br />
SELECT TOP 10 * <br />
FROM TestTable <br />
WHERE (ID > <br />
(SELECT MAX(id) <br />
FROM (SELECT TOP 20 id <br />
FROM TestTable <br />
ORDER BY id) AS T)) <br />
ORDER BY ID</p>
<p><br />
SELECT TOP 页大小 * <br />
FROM TestTable <br />
WHERE (ID > <br />
(SELECT MAX(id) <br />
FROM (SELECT TOP 页大小*页数 id <br />
FROM 表 <br />
ORDER BY id) AS T)) <br />
ORDER BY ID</p>
<p><br />
-------------------------------------</p>
<p>分页方案三：(利用SQL的游标存储过程分页) <br />
create procedure XiaoZhengGe <br />
@sqlstr nvarchar(4000), --查询字符串 <br />
@currentpage int, --第N页 <br />
@pagesize int --每页行数 <br />
as <br />
set nocount on <br />
declare @P1 int, --P1是游标的id <br />
@rowcount int <br />
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output <br />
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页 <br />
set @currentpage=(@currentpage-1)*@pagesize+1 <br />
exec sp_cursorfetch @P1,16,@currentpage,@pagesize <br />
exec sp_cursorclose @P1 <br />
set nocount off</p>
<p>其它的方案：如果没有主键，可以用临时表，也可以用方案三做，但是效率会低。 <br />
建议优化的时候，加上主键和索引，查询效率会提高。</p>
<p>通过SQL 查询分析器，显示比较：我的结论是: <br />
分页方案二：(利用ID大于多少和SELECT TOP分页）效率最高，需要拼接SQL语句 <br />
分页方案一：(利用Not In和SELECT TOP分页) 效率次之，需要拼接SQL语句 <br />
分页方案三：(利用SQL的游标存储过程分页) 效率最差，但是最为通用</p>
<p>在实际情况中，要具体分析。</p>]]></description></item><item><title><![CDATA[SQL SERVER数据库开发之存储过程应用]]></title><pubDate>Thu, 25 Oct 2007 16:18:27 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2007/10/200710251618279310.htm</link><description><![CDATA[<p>说　　明：由于个人能力有限，文章中难免会出现错误或遗漏的地方，敬请谅解！同时欢迎你指出，以便我能及时修改，以免误导下一个看官。最后希望本文能给你带来一定的帮助。<br />
<br />
<br />
序<br />
　　可能有不少朋友使用SQL SERVER做开发也已经有段日子，但还没有或者很少在项目中使用存储过程，或许有些朋友认为根本没有必要使用存储过程等等。其实当你一个项目做完到了维护阶段时，就会发现存储过程给我们带来了好处了，修改方便，不能去改我们的应用程序，只需要改存储过程的内容，而且还可以使我们的程序速度得到提高<br />
<br />
[code]SQL SERVER 联机丛书中的定义： <br />
　　存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。 <br />
　　可以创建一个过程供永久使用，或在一个会话中临时使用（局部临时过程），或在所有会话中临时使用（全局临时过程）。 <br />
　　也可以创建在 Microsoft SQL Server 启动时自动运行的存储过程。[/code]<br />
<br />
　　要使用存储过程，首先我们必需熟悉一些基本的T-SQL语句，因为存储过程是由于一组T-SQL语句构成的，并且，我们需要了解一些关于函数、过程的概念，因为我们需要在应用程序中调用存储过程，就像我们调用应用程序的函数一样，不过调用的方法有些不同。<br />
<br />
　　下面我们来看一下存储过程的建立和使用方法。<br />
<br />
<strong>一、创建存储过程</strong><br />
<br />
　　和数据表一样，在使用之前我们需要创建存储过程，它的简明语法是：<br />
<br />
[code]CREATE PROC 存储过程名称 <br />
[参数列表（多个以&ldquo;,&rdquo;分隔）] <br />
AS <br />
SQL 语句[/code]<br />
<br />
例：<br />
[code]CREATE PROC upGetUserName <br />
@intUserId INT, <br />
@ostrUserName NVARCHAR(20) OUTPUT -- 要输出的参数 <br />
AS <br />
BEGIN <br />
-- 将uName的值赋给 @ostrUserName 变量，即要输出的参数 <br />
SELECT @ostrUserName=uName FROM uUser WHERE uId=@intUserId <br />
END[/code]<br />
<br />
　　其中 CREATE PROC 语句（完整语句为CREATE PROCEDURE）的意思就是告诉SQL SERVER，现在需要建立一个存储过程，upGetUserName 就是存储过程名称，@intUserId 和 @ostrUserName 分别是该存储过程的两个参数，注意，在SQL SERVER中，所有用户定义的变量都以&ldquo;<font color="#ff0000">@</font>&rdquo;开头，<font color="#800080">OUTPUT</font>关键字表示这个参数是用来输出的，<font color="#0000ff">AS</font>之后就是存储过程内容了。只要将以上代码在&ldquo;查询分析器&rdquo;里执行一次，SQL SERVER就会在当前数据库中创建一个名为&ldquo;upGetUserName&rdquo;的存储过程。你可以打开&ldquo;企业管理器&rdquo;，选择当前操作的数据库，然后在左边的树型列表中选择&ldquo;存储过程&rdquo;，此时就可以在右边的列表中看到你刚刚创建的存储过程了（如果没有，刷新一下即可）。<br />
<br />
<strong>二、存储过程的调用</strong><br />
<br />
　　之前我们已经创建了一个名为&ldquo;upGetUserName&rdquo;的存储过程，从字面理解该存储过程的功能是用来取得某一个用户的名称。存储过程建立好了，接下来就是要在应用程序里调用了，下面看一下在ASP程序里的调用。<br />
[code]Dim adoComm <br />
'// 创建一个对象，我们用来调用存储过程 <br />
Set adoComm = CreateObject("ADODB.Command") <br />
With adoComm <br />
'// 设置连接，设 adoConn 为已经连接的 ADODB.Connection 对象 <br />
.ActiveConnection = adoConn <br />
'// 类型为存储过程，adCmdStoredProc = 4 <br />
.CommandType = 4 <br />
'// 存储过程名称 <br />
.CommandText = "upGetUserName" <br />
'// 设置用户编号 <br />
.Parameters.Item("@intUserId").Value = 1 <br />
'// 执行存储过程 <br />
.Execute <br />
<br />
'// 取得从存储过程返回的用户名称 <br />
Response.Write "用户名：" &amp; .Parameters.Item("@ostrUserName").Value <br />
End With <br />
'// 释放对象 <br />
Set adoComm = Nothing[/code]<br />
<br />
　　通过以上两步，我们已经可以创建和使用简单的存储过程了。下面我们来看一个稍微复杂点的存储过程，以进一步了解存储过程的应用。<br />
<br />
<strong>三、存储过程的实际应用</strong><br />
<br />
　　用户登录在ASP项目中经常会使用到，相信很多朋友也都做过类似的系统，但使用存储过程来做验证朋友可能不多，那么我们就以它来做例子，写一个简单的用户登录验证的存储过程。<br />
<br />
[code]CREATE PROC upUserLogin <br />
@strLoginName NVARCHAR(20), <br />
@strLoginPwd NVARCHAR(20), <br />
@blnReturn BIT OUTPUT <br />
AS <br />
-- 定义一个临时用来保存密码的变量 <br />
DECLARE @strPwd NVARCHAR(20) <br />
BEGIN <br />
-- 从表中查询当前用户的密码，赋值给 @strPwd 变量，下面要对他进行比较 <br />
SELECT @strPwd=uLoginPwd FROM uUser WHERE uLoginName=@strLoginName <br />
<br />
IF @strLoginPwd = @strPwd <br />
BEGIN <br />
SET @blnReturn = 1 <br />
-- 更新用户最后登录时间 <br />
UPDATE uUser SET uLastLogin=GETDATE() WHERE uLoginName=@strLoginName <br />
END <br />
ELSE <br />
SET @blnReturn = 0 <br />
END[/code]<br />
<br />
　用户登录的存储过程建立好了，现在在程序里试一下吧。注意，在一个区域内如果有多条语句时，必需使用<font color="#0000ff">BEGIN...END</font>关键字。<br />
<br />
[code]Dim adoComm <br />
'// 创建一个对象，我们用来调用存储过程 <br />
Set adoComm = CreateObject("ADODB.Command") <br />
With adoComm <br />
'// 设置连接，设 adoConn 为已经连接的 ADODB.Connection 对象 <br />
.ActiveConnection = adoConn <br />
'// 类型为存储过程，adCmdStoredProc = 4 <br />
.CommandType = 4 <br />
'// 存储过程名称 <br />
.CommandText = "upUserLogin" <br />
'// 设置登录名称 <br />
.Parameters.Item("@strLoginName").Value = "admin" <br />
'// 设置登录密码 <br />
.Parameters.Item("@strLoginPwd").Value = "123456" <br />
'// 执行存储过程 <br />
.Execute <br />
<br />
'// 判断是否登录成功 <br />
If .Parameters.Item("@blnReturn").Value = 1 Then <br />
Response.Write "恭喜你，登录成功！" <br />
Else <br />
Response.Write "不是吧，好像错了哦。。。" <br />
End If <br />
End With <br />
'// 释放对象 <br />
Set adoComm = Nothing[/code]<br />
<br />
　　通过以上的步骤，简单用户登录验证过程也做完了，现在只要把它整合到程序中就可以实现简单的用户登录验证了，关于其他细节就由你自己来处理了。<br />
　　上面介绍的两个存储过程都是只返回一个值的，下面我们来看一个返回一个记录集的存储过程。<br />
[code]CREATE PROC upGetUserInfos <br />
@intUserGroup INT <br />
AS <br />
BEGIN <br />
-- 从数据库中抽取符合条件的数据 <br />
SELECT uName,uGroup,uLastLogin FROM uUser WHERE uGroup=@intUserGroup <br />
-- 插入一列合计 <br />
UNION <br />
SELECT '合计人数:',COUNT(uGroup),NULL FROM uUser WHERE uGroup=@intUserGroup <br />
END[/code]<br />
<br />
现在我们来看一下ASP程序的调用。<br />
[code]Dim adoComm <br />
Dim adoRt <br />
'// 创建一个对象，我们用来调用存储过程 <br />
Set adoComm = CreateObject("ADODB.Command") <br />
Set adoRs = CreateObject("ADODB.Recordset") <br />
With adoComm <br />
'// 设置连接，设 adoConn 为已经连接的 ADODB.Connection 对象 <br />
.ActiveConnection = adoConn <br />
'// 类型为存储过程，adCmdStoredProc = 4 <br />
.CommandType = 4 <br />
'// 存储过程名称 <br />
.CommandText = "upGetUserInfos" <br />
'// 设置用户组 <br />
.Parameters.Item("@intUserGroup").Value = 1 <br />
'// 执行存储过程，和以上几个例子不同，这里使用RecordSet的Open方法 <br />
adoRs.Open adoComm <br />
'// 显示第一个值 <br />
Response.write adoRs.Fields(0).Value <br />
End With <br />
'// 释放对象 <br />
Set adoRs = Nothing <br />
Set adoComm = Nothing[/code]<br />
<br />
　　怎么样，是不是也很简单呢，不过存储过程的用处不仅仅只有这些，他还有更强大的功能，比如使用游标、临时表来从多个表，甚至是多个数据库中调用数据，然后返回给用户，这些你可以在使用过程中慢慢的去发掘。<br />
<br />
　　好了，存储过程应用就先介绍到这里，如果你对本文有任何疑问，欢迎跟贴提出，我将尽力给予解答。下次我将给大家介绍触发器的应用。<br />
<br />
<img alt="" src="http://www.51yc.cn/upfiles/images/存储过程应用.jpg" /></p>]]></description></item><item><title><![CDATA[经验总结：ASP与存储过程解析]]></title><pubDate>Wed, 24 Oct 2007 10:13:15 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2007/10/200710241013155722.htm</link><description><![CDATA[<p>         ASP与存储过程(Stored Procedures)的文章不少，但是我怀疑作者们是否真正实践过。我在初学时查阅过大量相关资料，发现其中提供的很多方法实际操作起来并不是那么回事。对于简单的应用，这些资料也许是有帮助的，但仅限于此，因为它们根本就是千篇一律，互相抄袭，稍微复杂点的应用，就全都语焉不详了。</p>
<p>　　现在，我基本上通过调用存储过程访问SQL Server，以下的文字都是实践的总结，希望对大家能有帮助。</p>
<p>　　存储过程就是作为可执行对象存放在数据库中的一个或多个SQL命令。</p>
<p>　　定义总是很抽象。存储过程其实就是能完成一定操作的一组SQL语句，只不过这组语句是放在数据库中的(这里我们只谈SQL Server)。如果我们通过创建存储过程以及在ASP中调用存储过程，就可以避免将SQL语句同ASP代码混杂在一起。这样做的好处至少有三个：</p>
<p>　　第一、大大提高效率。存储过程本身的执行速度非常快，而且，调用存储过程可以大大减少同数据库的交互次数。</p>
<p>　　第二、提高安全性。假如将SQL语句混合在ASP代码中，一旦代码失密，同时也就意味着库结构失密。</p>
<p>　　第三、有利于SQL语句的重用。</p>
<p>　　在ASP中，一般通过command对象调用存储过程，根据不同情况，本文也介绍其它调用方法。为了方便说明，根据存储过程的输入输出，作以下简单分类：</p>
<p>　　1. 只返回单一记录集的存储过程</p>
<p>　　假设有以下存储过程(本文的目的不在于讲述T-SQL语法，所以存储过程只给出代码，不作说明)：</p>
<p>/*SP1*/</p>
<p>CREATE PROCEDURE dbo.getUserList</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>select * from dbo.[userinfo]</p>
<p>end</p>
<p>go</p>
<p>　　以上存储过程取得userinfo表中的所有记录，返回一个记录集。通过command对象调用该存储过程的ASP代码如下:</p>
<p>'**通过Command对象调用存储过程**</p>
<p>DIM MyComm,MyRst</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>MyComm.CommandText = "getUserList" '指定存储过程名</p>
<p> MyComm.CommandType = 4 '表明这是一个存储过程</p>
<p>MyComm.Prepared = true '要求将SQL命令先行编译</p>
<p>Set MyRst = MyComm.Execute</p>
<p>Set MyComm = Nothing</p>
<p>　　存储过程取得的记录集赋给MyRst，接下来，可以对MyRst进行操作。</p>
<p>　　在以上代码中，CommandType属性表明请求的类型，取值及说明如下：</p>
<p>　　-1 表明CommandText参数的类型无法确定</p>
<p>　　1 表明CommandText是一般的命令类型</p>
<p>　　2 表明CommandText参数是一个存在的表名称</p>
<p>　　4 表明CommandText参数是一个存储过程的名称</p>
<p>　　还可以通过Connection对象或Recordset对象调用存储过程，方法分别如下：</p>
<p>'**通过Connection对象调用存储过程**</p>
<p>DIM MyConn,MyRst</p>
<p>Set MyConn = Server.CreateObject("ADODB.Connection")</p>
<p>MyConn.open MyConStr 'MyConStr是数据库连接字串</p>
<p>Set MyRst = MyConn.Execute("getUserList",0,4) '最后一个参断含义同CommandType</p>
<p>Set MyConn = Nothing</p>
<p>'**通过Recordset对象调用存储过程**</p>
<p>DIM MyRst</p>
<p>Set MyRst = Server.CreateObject("ADODB.Recordset")</p>
<p>MyRst.open "getUserList",MyConStr,0,1,4</p>
<p>'MyConStr是数据库连接字串,最后一个参断含义与CommandType相同</p>
<p>　　2. 没有输入输出的存储过程</p>
<p>　　请看以下存储过程：</p>
<p>/*SP2*/</p>
<p>CREATE PROCEDURE dbo.delUserAll</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>delete from dbo.[userinfo]</p>
<p>end</p>
<p>go</p>
<p>　　该存储过程删去userinfo表中的所有记录，没有任何输入及输出，调用方法与上面讲过的基本相同，只是不用取得记录集：</p>
<p>'**通过Command对象调用存储过程**</p>
<p>DIM MyComm</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>MyComm.CommandText = "delUserAll" '指定存储过程名</p>
<p>MyComm.CommandType = 4 '表明这是一个存储过程</p>
<p>MyComm.Prepared = true '要求将SQL命令先行编译</p>
<p>MyComm.Execute '此处不必再取得记录集</p>
<p>Set MyComm = Nothing</p>
<p>　　当然也可通过Connection对象或Recordset对象调用此类存储过程，不过建立Recordset对象是为了取得记录集，在没有返回记录集的情况下，还是利用Command对象吧。</p>
<p>3. 有返回值的存储过程</p>
<p>　　在进行类似SP2的操作时，应充分利用SQL Server强大的事务处理功能，以维护数据的一致性。并且，我们可能需要存储过程返回执行情况，为此，将SP2修改如下：</p>
<p>/*SP3*/</p>
<p>CREATE PROCEDURE dbo.delUserAll</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>BEGIN TRANSACTION</p>
<p>delete from dbo.[userinfo]</p>
<p>IF error=0</p>
<p>begin</p>
<p>COMMIT TRANSACTION</p>
<p>return 1</p>
<p>end</p>
<p>ELSE</p>
<p>begin</p>
<p>ROLLBACK TRANSACTION</p>
<p>return 0</p>
<p>end</p>
<p>return</p>
<p>end</p>
<p>go</p>
<p>　　以上存储过程，在delete顺利执行时，返回1，否则返回0，并进行回滚操作。为了在ASP中取得返回值，需要利用Parameters集合来声明参数：</p>
<p>'**调用带有返回值的存储过程并取得返回值**</p>
<p>DIM MyComm,MyPara</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>MyComm.CommandText = "delUserAll" '指定存储过程名</p>
<p>MyComm.CommandType = 4 '表明这是一个存储过程</p>
<p>MyComm.Prepared = true '要求将SQL命令先行编译</p>
<p>'声明返回值</p>
<p>Set Mypara = MyComm.CreateParameter("RETURN",2,4)</p>
<p>MyComm.Parameters.Append MyPara</p>
<p>MyComm.Execute</p>
<p>'取得返回值</p>
<p>DIM retValue</p>
<p>retValue = MyComm(0) '或retValue = MyComm.Parameters(0)</p>
<p>Set MyComm = Nothing</p>
<p>　　在MyComm.CreateParameter("RETURN",2,4)中，各参数的含义如下：</p>
<p>　　第一个参数("RETURE")为参数名。参数名可以任意设定，但一般应与存储过程中声明的参数名相同。此处是返回值，我习惯上设为"RETURE"；</p>
<p>　　第二个参数(2)，表明该参数的数据类型，具体的类型代码请参阅ADO参考，以下给出常用的类型代码：</p>
<p>adBigInt: 20 ;</p>
<p>adBinary : 128 ;</p>
<p>adBoolean: 11 ;</p>
<p>adChar: 129 ;</p>
<p>adDBTimeStamp: 135 ;</p>
<p>adEmpty: 0 ;</p>
<p>adInteger: 3 ;</p>
<p>adSmallInt: 2 ;</p>
<p>adTinyInt: 16 ;</p>
<p>adVarChar: 200 ;</p>
<p>　　对于返回值，只能取整形，且-1到-99为保留值；</p>
<p>　　第三个参数(4)，表明参数的性质，此处4表明这是一个返回值。此参数取值的说明如下：</p>
<p>　　0 : 类型无法确定； 1: 输入参数；2: 输入参数；3：输入或输出参数；4: 返回值</p>
<p>　　以上给出的ASP代码，应该说是完整的代码，也即最复杂的代码，其实</p>
<p>Set Mypara = MyComm.CreateParameter("RETURN",2,4)</p>
<p>MyComm.Parameters.Append MyPara</p>
<p>　　可以简化为</p>
<p>MyComm.Parameters.Append MyComm.CreateParameter("RETURN",2,4)</p>
<p>　　甚至还可以继续简化，稍后会做说明。</p>
<p>　　对于带参数的存储过程，只能使用Command对象调用(也有资料说可通过Connection对象或Recordset对象调用，但我没有试成过)。</p>
<p>　　4. 有输入参数和输出参数的存储过程</p>
<p>　　返回值其实是一种特殊的输出参数。在大多数情况下，我们用到的是同时有输入及输出参数的存储过程，比如我们想取得用户信息表中，某ID用户的用户名，这时候，有一个输入参数----用户ID，和一个输出参数----用户名。实现这一功能的存储过程如下：</p>
<p>/*SP4*/</p>
<p>CREATE PROCEDURE dbo.getUserName</p>
<p>@UserID int,</p>
<p>@UserName varchar(40) output</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>if @UserID is null return</p>
<p>select @UserName=username</p>
<p>from dbo.[userinfo]</p>
<p>where <a href="mailto:userid=@UserID">userid=@UserID</a></p>
<p>return</p>
<p>end</p>
<p>go</p>
<p>　　调用该存储过程的ASP代码如下：</p>
<p>'**调用带有输入输出参数的存储过程**</p>
<p>DIM MyComm,UserID,UserName</p>
<p>UserID = 1</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>MyComm.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>MyComm.CommandText = "getUserName" '指定存储过程名</p>
<p>MyComm.CommandType = 4 '表明这是一个存储过程</p>
<p>MyComm.Prepared = true '要求将SQL命令先行编译</p>
<p>'声明参数</p>
<p>MyComm.Parameters.append MyComm.CreateParameter("@UserID",3,1,4,UserID)</p>
<p>MyComm.Parameters.append MyComm.CreateParameter("@UserName",200,2,40)</p>
<p>MyComm.Execute</p>
<p>'取得出参</p>
<p>UserName = MyComm(1)</p>
<p>Set MyComm = Nothing</p>
<p>　　在以上代码中，可以看到，与声明返回值不同，声明输入参数时需要5个参数，声明输出参数时需要4个参数。声明输入参数时5个参数分别为：参数名、参数数据类型、参数类型、数据长度、参数值。声明输出参数时，没有最后一个参数：参数值。</p>
<p>　　需要特别注意的是：在声明参数时，顺序一定要与存储过程中定义的顺序相同，而且各参数的数据类型、长度也要与存储过程中定义的相同。</p>
<p>　　如果存储过程有多个参数，ASP代码会显得繁琐，可以使用with命令简化代码：</p>
<p>'**调用带有输入输出参数的存储过程(简化代码)**</p>
<p>DIM MyComm,UserID,UserName</p>
<p>UserID = 1</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>with MyComm</p>
<p>　.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>　.CommandText = "getUserName" '指定存储过程名</p>
<p>　.CommandType = 4 '表明这是一个存储过程</p>
<p>　.Prepared = true '要求将SQL命令先行编译</p>
<p>　.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)</p>
<p>　.Parameters.append .CreateParameter("@UserName",200,2,40)</p>
<p>　.Execute</p>
<p>end with</p>
<p>UserName = MyComm(1)</p>
<p>Set MyComm = Nothing</p>
<p>　　假如我们要取得ID为1到10，10位用户的用户名，是不是要创建10次Command对象呢？不是的。如果需要多次调用同一存储过程，只需改变输入参数，就会得到不同的输出：</p>
<p>'**多次调用同一存储过程**</p>
<p>DIM MyComm,UserID,UserName</p>
<p>UserName = ""</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>for UserID = 1 to 10</p>
<p>　with MyComm</p>
<p>　　.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>　　.CommandText = "getUserName" '指定存储过程名</p>
<p>　　.CommandType = 4 '表明这是一个存储过程</p>
<p>　　.Prepared = true '要求将SQL命令先行编译</p>
<p>　　if UserID = 1 then</p>
<p>　　　.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)</p>
<p>　　　.Parameters.append .CreateParameter("@UserName",200,2,40)</p>
<p>　　　.Execute</p>
<p>　　else</p>
<p>　　　'重新给入参赋值(此时参数值不发生变化的入参以及出参不必重新声明)</p>
<p>　　.Parameters("@UserID") = UserID</p>
<p>　　　.Execute</p>
<p>　　end if</p>
<p>　end with</p>
<p>　UserName = UserName + MyComm(1) + "," '也许你喜欢用数组存储</p>
<p>next</p>
<p>Set MyComm = Nothing</p>
<p>　　通过以上代码可以看出：重复调用同一存储过程时，只需为值发生改变的输入参数重新赋值即可，这一方法在有多个输入输出参数，且每次调用时只有一个输入参数的值发生变化时，可以大大减少代码量。</p>
<p>5. 同时具有返回值、输入参数、输出参数的存储过程</p>
<p>　　前面说过，在调用存储过程时，声明参数的顺序要与存储过程中定义的顺序相同。还有一点要特别注意：如果存储过程同时具有返回值以及输入、输出参数，返回值要最先声明。</p>
<p>　　为了演示这种情况下的调用方法，我们改善一下上面的例子。还是取得ID为1的用户的用户名，但是有可能该用户不存在(该用户已删除，而userid是自增长的字段)。存储过程根据用户存在与否，返回不同的值。此时，存储过程和ASP代码如下：</p>
<p>/*SP5*/</p>
<p>CREATE PROCEDURE dbo.getUserName</p>
<p>--为了加深对"顺序"的印象，将以下两参数的定义顺序颠倒一下</p>
<p>@UserName varchar(40) output,</p>
<p>@UserID int</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>if @UserID is null return</p>
<p>select @UserName=username</p>
<p>from dbo.[userinfo]</p>
<p>where <a href="mailto:userid=@UserID">userid=@UserID</a></p>
<p>if rowcount> 0</p>
<p>return 1</p>
<p>else</p>
<p>return 0</p>
<p>return</p>
<p>end</p>
<p>go</p>
<p>'**调用同时具有返回值、输入参数、输出参数的存储过程**</p>
<p>DIM MyComm,UserID,UserName</p>
<p>UserID = 1</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>with MyComm</p>
<p>.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>.CommandText = "getUserName" '指定存储过程名</p>
<p>.CommandType = 4 '表明这是一个存储过程</p>
<p>.Prepared = true '要求将SQL命令先行编译</p>
<p>'返回值要最先被声明</p>
<p>.Parameters.Append .CreateParameter("RETURN",2,4)</p>
<p>'以下两参数的声明顺序也做相应颠倒</p>
<p>.Parameters.append .CreateParameter("@UserName",200,2,40)</p>
<p>.Parameters.append .CreateParameter("@UserID",3,1,4,UserID)</p>
<p>.Execute</p>
<p>end with</p>
<p>if MyComm(0) = 1 then</p>
<p>UserName = MyComm(1)</p>
<p>else</p>
<p>UserName = "该用户不存在"</p>
<p>end if</p>
<p>Set MyComm = Nothing</p>
<p>　　6. 同时返回参数和记录集的存储过程</p>
<p>　　有时候，我们需要存储过程同时返回参数和记录集，比如在利用存储过程分页时，要同时返回记录集以及数据总量等参数。以下给出一个进行分页处理的存储过程：</p>
<p>/*SP6*/</p>
<p>CREATE PROCEDURE dbo.getUserList</p>
<p>@iPageCount int OUTPUT, --总页数</p>
<p>@iPage int, --当前页号</p>
<p>@iPageSize int --每页记录数</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>--创建临时表</p>
<p>create table #t (ID int IDENTITY, --自增字段</p>
<p>userid int,</p>
<p>username varchar(40))</p>
<p>--向临时表中写入数据</p>
<p>insert into #t</p>
<p>select userid,username from dbo.[UserInfo]</p>
<p>order by userid</p>
<p>--取得记录总数</p>
<p>declare @iRecordCount int</p>
<p>set @iRecordCount = rowcount</p>
<p>--确定总页数</p>
<p>IF @iRecordCount%@iPageSize=0</p>
<p>SET @iPageCount=CEILING(@iRecordCount/@iPageSize)</p>
<p>ELSE</p>
<p>SET @iPageCount=CEILING(@iRecordCount/@iPageSize)+1</p>
<p>--若请求的页号大于总页数，则显示最后一页</p>
<p>IF @iPage > @iPageCount</p>
<p>SELECT @iPage = @iPageCount</p>
<p>--确定当前页的始末记录</p>
<p>DECLARE @iStart int --start record</p>
<p>DECLARE @iEnd int --end record</p>
<p>SELECT @iStart = (@iPage - 1) * @iPageSize</p>
<p>SELECT @iEnd = @iStart + @iPageSize + 1</p>
<p>--取当前页记录</p>
<p>select * from #t where ID> @iStart and ID <@iEnd</p>
<p>--删除临时表</p>
<p>DROP TABLE #t</p>
<p>--返回记录总数</p>
<p>return @iRecordCount</p>
<p>end</p>
<p>go</p>
<p>　　在上面的存储过程中，输入当前页号及每页记录数，返回当前页的记录集，总页数及记录总数。为了更具典型性，将记录总数以返回值的形式返回。以下是调用该存储过程的ASP代码(具体的分页操作略去):</p>
<p>'**调用分页存储过程**</p>
<p>DIM pagenow,pagesize,pagecount,recordcount</p>
<p>DIM MyComm,MyRst</p>
<p>pagenow = Request("pn")</p>
<p>'自定义函数用于验证自然数</p>
<p>if CheckNar(pagenow) = false then pagenow = 1</p>
<p>pagesize = 20</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>with MyComm</p>
<p>.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>.CommandText = "getUserList" '指定存储过程名</p>
<p>.CommandType = 4 '表明这是一个存储过程</p>
<p>.Prepared = true '要求将SQL命令先行编译</p>
<p>'返回值(记录总量)</p>
<p>.Parameters.Append .CreateParameter("RETURN",2,4)</p>
<p>'出参(总页数)</p>
<p>.Parameters.Append .CreateParameter("@iPageCount",3,2)</p>
<p>'入参(当前页号)</p>
<p>.Parameters.append .CreateParameter("@iPage",3,1,4,pagenow)</p>
<p>'入参(每页记录数)</p>
<p>.Parameters.append .CreateParameter("@iPageSize",3,1,4,pagesize)</p>
<p>Set MyRst = .Execute</p>
<p>end with</p>
<p>if MyRst.state = 0 then '未取到数据，MyRst关闭</p>
<p>recordcount = -1</p>
<p>else</p>
<p>MyRst.close '注意：若要取得参数值，需先关闭记录集对象</p>
<p>recordcount = MyComm(0)</p>
<p>pagecount = MyComm(1)</p>
<p>if cint(pagenow)> =cint(pagecount) then pagenow=pagecount</p>
<p>end if</p>
<p>Set MyComm = Nothing</p>
<p>'以下显示记录</p>
<p>if recordcount = 0 then</p>
<p>Response.Write "无记录"</p>
<p>elseif recordcount > 0 then</p>
<p>MyRst.open</p>
<p>do until MyRst.EOF</p>
<p>......</p>
<p>loop</p>
<p>'以下显示分页信息</p>
<p>......</p>
<p>else 'recordcount=-1</p>
<p>Response.Write "参数错误"</p>
<p>end if</p>
<p>　　对于以上代码，只有一点需要说明：同时返回记录集和参数时，若要取得参数，需先将记录集关闭，使用记录集时再将其打开。</p>
<p>　　7. 返回多个记录集的存储过程</p>
<p>　　本文最先介绍的是返回记录集的存储过程。有时候，需要一个存储过程返回多个记录集，在ASP中，如何同时取得这些记录集呢？为了说明这一问题，在userinfo表中增加两个字段：usertel及usermail，并设定只有登录用户可以查看这两项内容。</p>
<p>/*SP7*/</p>
<p>CREATE PROCEDURE dbo.getUserInfo</p>
<p>@userid int,</p>
<p>@checklogin bit</p>
<p>as</p>
<p>set nocount on</p>
<p>begin</p>
<p>if @userid is null or @checklogin is null return</p>
<p>select username</p>
<p>from dbo.[usrinfo]</p>
<p>where <a href="mailto:userid=@userid">userid=@userid</a></p>
<p>--若为登录用户，取usertel及usermail</p>
<p>if @checklogin=1</p>
<p>select usertel,usermail</p>
<p>from dbo.[userinfo]</p>
<p>where <a href="mailto:userid=@userid">userid=@userid</a></p>
<p>return</p>
<p>end</p>
<p>go</p>
<p>　　以下是ASP代码：</p>
<p>'**调用返回多个记录集的存储过程**</p>
<p>DIM checklg,UserID,UserName,UserTel,UserMail</p>
<p>DIM MyComm,MyRst</p>
<p>UserID = 1</p>
<p>'checklogin()为自定义函数，判断访问者是否登录</p>
<p>checklg = checklogin()</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>with MyComm</p>
<p>　.ActiveConnection = MyConStr 'MyConStr是数据库连接字串</p>
<p>　.CommandText = "getUserInfo" '指定存储过程名</p>
<p>　.CommandType = 4 '表明这是一个存储过程</p>
<p>　.Prepared = true '要求将SQL命令先行编译</p>
<p>　.Parameters.append .CreateParameter("@userid",3,1,4,UserID)</p>
<p>　.Parameters.append .CreateParameter("@checklogin",11,1,1,checklg)</p>
<p>　Set MyRst = .Execute</p>
<p>end with</p>
<p>Set MyComm = Nothing</p>
<p>'从第一个记录集中取值</p>
<p>UserName = MyRst(0)</p>
<p>'从第二个记录集中取值</p>
<p>if not MyRst is Nothing then</p>
<p>　Set MyRst = MyRst.NextRecordset()</p>
<p>　UserTel = MyRst(0)</p>
<p>　UserMail = MyRst(1)</p>
<p>end if</p>
<p>Set MyRst = Nothing</p>
<p>　　以上代码中，利用Recordset对象的NextRecordset方法，取得了存储过程返回的多个记录集。</p>
<p>　　至此，针对ASP调用存储过程的各种情况，本文已做了较为全面的说明。最后说一下在一个ASP程序中，调用多个存储过程的不同方法。</p>
<p>在一个ASP程序中，调用多个存储过程至少有以下三种方法是可行的：</p>
<p>　　1. 创建多个Command对象</p>
<p>DIM MyComm</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>'调用存储过程一</p>
<p>......</p>
<p>Set MyComm = Nothing</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>'调用存储过程二</p>
<p>......</p>
<p>Set MyComm = Nothing</p>
<p>......</p>
<p>　　2. 只创建一个Command对象，结束一次调用时，清除其参数</p>
<p>DIM MyComm</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>'调用存储过程一</p>
<p>.....</p>
<p>'清除参数(假设有三个参数)</p>
<p>MyComm.Parameters.delete 2</p>
<p>MyComm.Parameters.delete 1</p>
<p>MyComm.Parameters.delete 0</p>
<p>'调用存储过程二并清除参数</p>
<p>......</p>
<p>Set MyComm = Nothing</p>
<p>　　此时要注意：清除参数的顺序与参数声明的顺序相反，原因嘛，我也不知道。</p>
<p>　　3. 利用Parameters数据集合的Refresh方法重置Parameter对象</p>
<p>DIM MyComm</p>
<p>Set MyComm = Server.CreateObject("ADODB.Command")</p>
<p>'调用存储过程一</p>
<p>.....</p>
<p>'重置Parameters数据集合中包含的所有Parameter对象</p>
<p>MyComm.Parameters.Refresh</p>
<p>'调用存储过程二</p>
<p>.....</p>
<p>Set MyComm = Nothing</p>
<p>　　一般认为，重复创建对象是效率较低的一种方法，但是经测试(测试工具为Microsoft Application Center Test)，结果出人意料：</p>
<p>　　方法2 > = 方法1 > > 方法3</p>
<p>　　方法2的运行速度大于等于方法1(最多可高4%左右)，这两种方法的运行速度远大于方法3(最多竟高达130%)，所以建议在参数多时，采用方法1，在参数较少时，采用方法2。</p>
<p>　　花了一天的时间，终于把我对于在ASP中调用存储过程的一些粗浅的经验形成了文字。这其中，有些是我只知其果而不明其因的，有些可能是错误的，但是，这些都是经过我亲身实践的。各位看官批判地接受吧。有不同意见，希望一定向我指明，先谢了。</p>]]></description></item><item><title><![CDATA[ASP实用函数库]]></title><pubDate>Tue, 23 Oct 2007 15:52:18 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2007/10/200710231552187705.htm</link><description><![CDATA[<p>[code]<% <br />
'判断文件名是否合法 <br />
Function isFilename(aFilename) <br />
Dim sErrorStr,iNameLength,i <br />
isFilename=TRUE <br />
sErrorStr=Array("/","\",":","*","?","""","<",">","|") <br />
iNameLength=Len(aFilename) <br />
If iNameLength<1 Or iNameLength=null Then <br />
isFilename=FALSE <br />
Else <br />
For i=0 To 8 <br />
If instr(aFilename,sErrorStr(i)) Then <br />
isFilename=FALSE <br />
End If <br />
Next <br />
End If <br />
End Function <br />
<br />
'去掉字符串头尾的连续的回车和空格 <br />
function trimVBcrlf(str) <br />
trimVBcrlf=rtrimVBcrlf(ltrimVBcrlf(str)) <br />
end function <br />
<br />
'去掉字符串开头的连续的回车和空格 <br />
function ltrimVBcrlf(str) <br />
dim pos,isBlankChar <br />
pos=1 <br />
isBlankChar=true <br />
while isBlankChar <br />
if mid(str,pos,1)=" " then <br />
pos=pos+1 <br />
elseif mid(str,pos,2)=VBcrlf then <br />
pos=pos+2 <br />
else <br />
isBlankChar=false <br />
end if <br />
wend <br />
ltrimVBcrlf=right(str,len(str)-pos+1) <br />
end function <br />
<br />
'去掉字符串末尾的连续的回车和空格 <br />
function rtrimVBcrlf(str) <br />
dim pos,isBlankChar <br />
pos=len(str) <br />
isBlankChar=true <br />
while isBlankChar and pos>=2 <br />
if mid(str,pos,1)=" " then <br />
pos=pos-1 <br />
elseif mid(str,pos-1,2)=VBcrlf then <br />
pos=pos-2 <br />
else <br />
isBlankChar=false <br />
end if <br />
wend <br />
rtrimVBcrlf=rtrim(left(str,pos)) <br />
end function <br />
<br />
'判断Email是否有效,返回1表示正确 <br />
Function isEmail(aEmail) <br />
Dim iLocat,v,iLength,i,checkletter <br />
If instr(aEmail,"@") = 0 Or instr(aEmail,".") = 0 Then <br />
isEmail=0 <br />
EXIT FUNCTION <br />
End If <br />
iLocat=instr(aEmail,"@") <br />
If instr(iLocat,aEmail,".")=0 Or instr(iLocat+1,aEmail,"@")>0 Then <br />
isEmail=0 <br />
EXIT FUNCTION <br />
End If <br />
If left(aEmail,1)="." Or right(aEmail,1)="." Or left(aEmail,1)="@" Or right(aEmail,1)="@" Then <br />
isEmail=0 <br />
EXIT FUNCTION <br />
End If <br />
v="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-.@" <br />
iLength=len(aEmail) <br />
For i=1 To iLength <br />
checkletter=mid(aEmail,i,1) <br />
If instr(v,checkletter)=0 Then <br />
isEmail=0 <br />
EXIT FUNCTION <br />
End If <br />
Next <br />
isEmail=1 <br />
End Function <br />
<br />
'测试用:显示服务器信息 <br />
Sub showServer <br />
Dim name <br />
Response.write "<Table border=1 bordercolor=lightblue CELLSPACING=0>" <br />
for each name in request.servervariables <br />
Response.write "<tr>" <br />
Response.write "<td>"&amp;name&amp;"</td>" <br />
Response.write "<td>"&amp;request.servervariables(name)&amp;"<br></td>" <br />
Response.write "</tr>" <br />
next <br />
Response.write "</table>" <br />
End Sub <br />
<br />
'测试用:显示Rs结果集以及字段名称 <br />
Sub showRs(rs) <br />
Dim strTable,whatever <br />
Response.write "<center><table><tr>" <br />
for each whatever in rs.fields <br />
response.write "<td><b>" &amp; whatever.name &amp; "</B></TD>" <br />
next <br />
strTable = "</tr><tr><td>"&amp;rs.GetString(,,"</td><td>","</tr><tr><td>"," ") &amp;"</td></tr></table></center>" <br />
Response.Write(strTable) <br />
End Sub <br />
<br />
'用HTML格式显示文本 <br />
Function txt2Html(str) <br />
if isnull(str) then <br />
txt2Html="" <br />
exit Function <br />
end if <br />
str=Replace(str,chr(34),""") <br />
str=Replace(str,"<","<") <br />
str=Replace(str,">",">") <br />
str=Replace(str,chr(13)+chr(10),"<br>") <br />
str=Replace(str,chr(9)," ") <br />
str=Replace(str," "," ") <br />
txt2Html=str <br />
End Function <br />
<br />
'测试用:显示调试错误信息 <br />
Sub showError <br />
Dim sErrMsg <br />
sErrMsg=Err.Source&amp;" "&amp;Err.Description <br />
Response.write "<center>"&amp;sErrMsg&amp;"</center>" <br />
Err.clear <br />
End Sub <br />
<br />
'显示文字计数器 <br />
Sub showCounter <br />
Dim fs,outfile,filename,count <br />
filename=server.mappath("count.txt") <br />
Set fs = CreateObject("Scripting.FileSystemObject") <br />
If fs.fileExists(filename) Then <br />
Set outfile=fs.openTextFile(filename,1) <br />
count=outfile.readline <br />
count=count+1 <br />
Response.write "<center>浏览人次："&amp;count&amp;"<center>" <br />
outfile.close <br />
Set outfile=fs.CreateTextFile(filename) <br />
outfile.writeline(count) <br />
Else <br />
Set outfile=fs.openTextFile(filename,8,TRUE) <br />
count=0 <br />
outfile.writeline(count) <br />
END IF <br />
outfile.close <br />
set fs=nothing <br />
End Sub <br />
%> <br />
<br />
Array() <br />
　FUNCTION: 返回一个数组 <br />
　SYNTAX: Array(list) <br />
　ARGUMENTS: 字符，数字均可 <br />
　EXAMPLE: <% <br />
Dim myArray() <br />
For i = 1 to 7 <br />
　 Redim Preserve myArray(i) <br />
　 myArray(i) = WeekdayName(i) <br />
Next <br />
%> <br />
　RESULT: 建立了一个包含7个元素的数组myArray <br />
myArray("Sunday","Monday", ... ... "Saturday") <br />
　 <br />
CInt() <br />
　FUNCTION: 将一个表达式转化为数字类型 <br />
　SYNTAX: CInt(expression) <br />
　ARGUMENTS: 任何有效的字符均可 <br />
　EXAMPLE: <% <br />
f = "234" <br />
response.write cINT(f) + 2 <br />
%> <br />
　RESULT: 236 <br />
转化字符"234"为数字"234"，如果字符串为空，则返回0值　 <br />
　 <br />
CreateObject() <br />
　FUNCTION: 建立和返回一个已注册的ACTIVEX组件的实例。 <br />
　SYNTAX: CreateObject(objName) <br />
　ARGUMENTS: objName 是任何一个有效、已注册的ACTIVEX组件的名字. <br />
　EXAMPLE: <% <br />
Set con = Server.CreateObject("ADODB.Connection") <br />
%> <br />
　RESULT:　 <br />
　 <br />
CStr() <br />
　FUNCTION: 转化一个表达式为字符串. <br />
　SYNTAX: CStr(expression) <br />
　ARGUMENTS: expression 是任何有效的表达式。 <br />
　EXAMPLE: <% <br />
s = 3 + 2 <br />
response.write "The result is: " &amp; cStr(s) <br />
%> <br />
　RESULT: 转化数字&ldquo;5&rdquo;为字符&ldquo;5&rdquo;。 <br />
　 <br />
Date() <br />
　FUNCTION: 返回当前系统日期. <br />
　SYNTAX: Date() <br />
　ARGUMENTS: None. <br />
　EXAMPLE: <%=Date%> <br />
　RESULT: 8/4/99 <br />
　 <br />
DateAdd() <br />
　FUNCTION: 返回一个被改变了的日期。 <br />
　SYNTAX: DateAdd(timeinterval,number,date) <br />
　ARGUMENTS: timeinterval is the time interval to add; number is amount of <br />
time intervals to add; and date is the starting date. <br />
　EXAMPLE: <% <br />
currentDate = #8/4/99# <br />
newDate = DateAdd("m",3,currentDate) <br />
response.write newDate <br />
%> <br />
<br />
<% <br />
currentDate = #12:34:45 PM# <br />
newDate = DateAdd("h",3,currentDate) <br />
response.write newDate <br />
%> <br />
　RESULT: 11/4/99 <br />
3:34:45 PM <br />
<br />
"m" = "month"; <br />
"d" = "day"; <br />
<br />
If currentDate is in time format then, <br />
"h" = "hour"; <br />
"s" = "second"; <br />
　 <br />
DateDiff() <br />
　FUNCTION: 返回两个日期之间的差值 。 <br />
　SYNTAX: DateDiff(timeinterval,date1,date2 [, firstdayofweek ][, <br />
firstweekofyear]]) <br />
　ARGUMENTS: timeinterval 表示相隔时间的类型，如&ldquo;M&ldquo;表示&ldquo;月&rdquo;。 <br />
　EXAMPLE: <% <br />
fromDate = #8/4/99# <br />
toDate = #1/1/2000# <br />
response.write "There are " &amp; _ <br />
　 DateDiff("d",fromDate,toDate) &amp; _ <br />
　 " days to millenium from 8/4/99." <br />
%> <br />
　RESULT: 从8/4/99 到2000年还有 150 天. <br />
　 <br />
Day() <br />
　FUNCTION: 返回一个月的第几日　. <br />
　SYNTAX: Day(date) <br />
　ARGUMENTS: date 是任何有效的日期。　 <br />
　EXAMPLE: <%=Day(#8/4/99#)%> <br />
　RESULT: 4 <br />
　 <br />
FormatCurrency() <br />
　FUNCTION: 返回表达式，此表达式已被格式化为货币值　 <br />
　SYNTAX: FormatCurrency(Expression [, Digit ][, LeadingDigit ][, Paren ][, <br />
GroupDigit]]]]) <br />
　ARGUMENTS:　Digit 指示小数点右侧显示位数的数值。默认值为 -1，指示使用的是 <br />
计算机的区域设置; LeadingDigit 三态常数，指示是否显示小数值小数点前面的 <br />
零。　 <br />
　EXAMPLE: <%=FormatCurrency(34.3456)%> <br />
　RESULT: $34.35 <br />
　 <br />
FormatDateTime() <br />
　FUNCTION: 返回表达式，此表达式已被格式化为日期或时间 <br />
　SYNTAX: FormatDateTime(Date, [, NamedFormat]) <br />
　ARGUMENTS: NamedFormat 指示所使用的日期/时间格式的数值，如果省略，则使用 <br />
vbGeneralDate. <br />
　EXAMPLE: <%=FormatDateTime("08/4/99", vbLongDate)%> <br />
　RESULT: Wednesday, August 04, 1999 <br />
　 <br />
FormatNumber() <br />
　FUNCTION: 返回表达式，此表达式已被格式化为数值. <br />
　SYNTAX: FormatNumber(Expression [, Digit ][, LeadingDigit ][, Paren ][, <br />
GroupDigit]]]]) <br />
　ARGUMENTS:　Digit 指示小数点右侧显示位数的数值。默认值为 -1，指示使用的是 <br />
计算机的区域设置。; LeadingDigit i指示小数点右侧显示位数的数值。默认值为 - <br />
1，指示使用的是计算机的区域设置。; Paren 指示小数点右侧显示位数的数值。默认 <br />
值为 -1，指示使用的是计算机的区域设置。; GroupDigit i指示小数点右侧显示位数 <br />
的数值。默认值为 -1，指示使用的是计算机的区域设置。. <br />
　EXAMPLE: <%=FormatNumber(45.324567, 3)%> <br />
　RESULT: 45.325 <br />
　 <br />
FormatPercent() <br />
　FUNCTION: 返回表达式，此表达式已被格式化为尾随有 % 符号的百分比（乘以 <br />
100 ）。 (%) <br />
　SYNTAX: FormatPercent(Expression [, Digit ][, LeadingDigit ][, Paren ][, <br />
GroupDigit]]]]) <br />
　ARGUMENTS: 同上. <br />
　EXAMPLE: <%=FormatPercent(0.45267, 3)%> <br />
　RESULT: 45.267% <br />
　 <br />
Hour() <br />
　FUNCTION: 以24时返回小时数. <br />
　SYNTAX: Hour(time) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <%=Hour(#4:45:34 PM#)%> <br />
　RESULT: 16 <br />
(Hour has been converted to 24-hour system) <br />
　 <br />
Instr() <br />
　FUNCTION: 返回字符或字符串在另一个字符串中第一次出现的位置. <br />
　SYNTAX: Instr([start, ] strToBeSearched, strSearchFor [, compare]) <br />
　ARGUMENTS: Start为搜索的起始值，strToBeSearched接受搜索的字符串　 <br />
strSearchFor要搜索的字符.compare比较方式（详细见ASP常数） <br />
　EXAMPLE: <% <br />
strText = "This is a test!!" <br />
pos = Instr(strText, "a") <br />
response.write pos <br />
%> <br />
　RESULT: 9 <br />
　 <br />
InstrRev() <br />
　FUNCTION: 同上，只是从字符串的最后一个搜索起 <br />
　SYNTAX: InstrRev([start, ] strToBeSearched, strSearchFor [, compare]) <br />
　ARGUMENTS: 同上. <br />
　EXAMPLE: <% <br />
strText = "This is a test!!" <br />
pos = InstrRev(strText, "s") <br />
response.write pos <br />
%> <br />
　RESULT: 13 <br />
<br />
　 <br />
Int() <br />
　FUNCTION: 返回数值类型,不四舍五入，注意取值是不大于它的整数。 <br />
　SYNTAX: Int(number) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <%=INT(32.89)%>　 <%=int(-3.33)%> <br />
　RESULT: 32　　-4 <br />
　 <br />
IsArray() <br />
　FUNCTION: 判断一对象是否为数组，返回布尔值　. <br />
　SYNTAX: IsArray(name) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "Test!" <br />
response.write IsArray(strTest) <br />
%> <br />
　RESULT: False <br />
　 <br />
IsDate() <br />
　FUNCTION: 判断一对象是否为日期，返回布尔值 <br />
　SYNTAX: IsDate(expression) <br />
　ARGUMENTS: expression is any valid expression. <br />
　EXAMPLE: <% <br />
strTest = "8/4/99" <br />
response.write IsDate(strTest) <br />
%> <br />
　RESULT: True <br />
　 <br />
IsEmpty() <br />
　FUNCTION: 判断一对象是否初始化，返回布尔值. <br />
　SYNTAX: IsEmpty(expression) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
Dim i <br />
response.write IsEmpty(i) <br />
%> <br />
　RESULT: True <br />
　 <br />
IsNull() <br />
　FUNCTION: 判断一对象是否为空，返回布尔值. <br />
　SYNTAX: IsNull(expression) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
Dim i <br />
response.write IsNull(i) <br />
%> <br />
　RESULT: False <br />
　 <br />
IsNumeric() <br />
　FUNCTION: 判断一对象是否为数字，返回布尔值. <br />
　SYNTAX: IsNumeric(expression) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
i = "345" <br />
response.write IsNumeric(i) <br />
%> <br />
　RESULT: True <br />
就算数字加了引号，ASP还是认为它是数字。 <br />
　 <br />
IsObject() <br />
　FUNCTION: 判断一对象是否为对象，返回布尔值. <br />
　SYNTAX: IsObject(expression) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
Set con = Server.CreateObject("ADODB.Connection") <br />
response.write IsObject(con) <br />
%> <br />
　RESULT: True <br />
　 <br />
LBound() <br />
　FUNCTION: 返回指定数组维的最小可用下标. <br />
　SYNTAX: Lbound(arrayname [, dimension]) <br />
　ARGUMENTS: ; dimension 指明要返回哪一维下界的整数。使用 1 表示第一维，2 <br />
表示第二维，以此类推。如果省略 dimension 参数，默认值为 1. <br />
　EXAMPLE: <% <br />
i = Array("Monday","Tuesday","Wednesday") <br />
response.write LBound(i) <br />
%> <br />
　RESULT: 0 <br />
　 <br />
LCase() <br />
　FUNCTION:　 返回字符串的小写形式 <br />
　SYNTAX: Lcase(string) <br />
　ARGUMENTS: string is any valid string expression. <br />
　EXAMPLE: <% <br />
strTest = "This is a test!" <br />
response.write LCase(strTest) <br />
%> <br />
　RESULT: this is a test! <br />
　 <br />
Left() <br />
　FUNCTION: 返回字符串左边第length个字符以前的字符（含第length个字符). <br />
　SYNTAX: Left(string, length) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "This is a test!" <br />
response.write Left(strTest, 3) <br />
%> <br />
　RESULT: Thi <br />
　 <br />
Len() <br />
　FUNCTION: 返回字符串的长度. <br />
　SYNTAX: Len(string | varName) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "This is a test!" <br />
response.write Len(strTest) <br />
%> <br />
　RESULT: 15 <br />
　 <br />
LTrim() <br />
　FUNCTION: 去掉字符串左边的空格. <br />
　SYNTAX: LTrim(string) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = " This is a test!" <br />
response.write LTrim(strTest) <br />
%> <br />
　RESULT: This is a test! <br />
　 <br />
Mid() <br />
　FUNCTION: 返回特定长度的字符串(从start开始,长度为length). <br />
　SYNTAX: Mid(string, start [, length]) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "This is a test! Today is Monday." <br />
response.write Mid(strTest, 17, 5) <br />
%> <br />
　RESULT: Today <br />
　 <br />
Minute() <br />
　FUNCTION: 返回时间的分钏. <br />
　SYNTAX: Minute(time) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <%=Minute(#12:45:32 PM#)%> <br />
　RESULT: 45 <br />
　 <br />
Month() <br />
　FUNCTION: 返回日期. <br />
　SYNTAX: Month(date) <br />
　ARGUMENTS: date is any valid date expression. <br />
　EXAMPLE: <%=Month(#08/04/99#)%> <br />
　RESULT: 8 <br />
　 <br />
MonthName() <br />
　FUNCTION: Returns a string identifying the specified month. <br />
　SYNTAX: MonthName(month, [, Abb]) <br />
　ARGUMENTS: month is the numeric representation for a given month; Abb <br />
(optional) is a boolean value used to display month abbreviation. True <br />
will display the abbreviated month name and False (default) will not show <br />
the abbreviation. <br />
　EXAMPLE: <%=MonthName(Month(#08/04/99#))%> <br />
　RESULT: August <br />
　 <br />
Now() <br />
　FUNCTION: Returns the current system date and time. <br />
　SYNTAX: Now() <br />
　ARGUMENTS: None <br />
　EXAMPLE: <%=Now%> <br />
　RESULT: 8/4/99 9:30:16 AM <br />
　 <br />
Replace() <br />
　FUNCTION: Returns a string in which a specified sub-string has been <br />
replaced with another substring a specified number of times. <br />
　SYNTAX: Replace(strToBeSearched, strSearchFor, strReplaceWith [, start <br />
][, count ][, compare]]]) <br />
　ARGUMENTS: strToBeSearched is a string expression containing a sub- <br />
string to be replaced; strSearchFor is the string expression to search for <br />
within strToBeSearched; strReplaceWith is the string expression to replace <br />
sub-string strSearchFor; start (optional) is the numeric character <br />
position to begin search; count (optional) is a value indicating the <br />
comparision constant. <br />
　EXAMPLE: <% <br />
strTest = "This is an apple!" <br />
response.write Replace(strTest, "apple", "orange") <br />
%> <br />
　RESULT: This is an orange! <br />
　 <br />
Right() <br />
　FUNCTION: 返回字符串右边第length个字符以前的字符（含第length个字符). <br />
　SYNTAX: Right(string, length) <br />
　ARGUMENTS: . <br />
　EXAMPLE: <% <br />
strTest = "This is an test!" <br />
response.write Right(strTest, 3) <br />
%> <br />
　RESULT: st! <br />
　 <br />
Rnd() <br />
　FUNCTION: 产生一个随机数. <br />
　SYNTAX: Rnd [ (number) ] <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
Randomize() <br />
response.write RND() <br />
%> <br />
　RESULT: 任何一个在0 到 1 之间的数 <br />
　 <br />
Round() <br />
　FUNCTION: 返回按指定位数进行四舍五入的数值. <br />
　SYNTAX: Round(expression [, numRight]) <br />
　ARGUMENTS: numRight数字表明小数点右边有多少位进行四舍五入。如果省略，则 <br />
Round 函数返回整数. <br />
　EXAMPLE: <% <br />
i = 32.45678 <br />
response.write Round(i) <br />
%> <br />
　RESULT: 32 <br />
　 <br />
Rtrim() <br />
　FUNCTION: 去掉字符串右边的字符串. <br />
　SYNTAX: Rtrim(string) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "This is a test!! " <br />
response.write RTrim(strTest) <br />
%> <br />
　RESULT: This is a test!! <br />
　 <br />
Second() <br />
　FUNCTION: 返回秒. <br />
　SYNTAX: Second(time) <br />
　ARGUMENTS: . <br />
　EXAMPLE: <%=Second(#12:34:28 PM#)%> <br />
　RESULT: 28 <br />
　 <br />
StrReverse() <br />
　FUNCTION: 反排一字符串 <br />
　SYNTAX: StrReverse(string) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "This is a test!!" <br />
response.write StrReverse(strTest) <br />
%> <br />
　RESULT: !!tset a si sihT <br />
　 <br />
Time() <br />
　FUNCTION: 返回系统时间. <br />
　SYNTAX: Time() <br />
　ARGUMENTS: . <br />
　EXAMPLE: <%=Time%> <br />
　RESULT: 9:58:28 AM <br />
　 <br />
Trim() <br />
　FUNCTION: 去掉字符串左右的空格. <br />
　SYNTAX: Trim(string) <br />
　ARGUMENTS: string is any valid string expression. <br />
　EXAMPLE: <% <br />
strTest = " This is a test!! " <br />
response.write Trim(strTest) <br />
%> <br />
　RESULT: This is a test!! <br />
　 <br />
UBound() <br />
　FUNCTION: 返回指定数组维数的最大可用下标. <br />
　SYNTAX: Ubound(arrayname [, dimension]) <br />
　ARGUMENTS: ; dimension (optional) 指定返回哪一维上界的整数。1 表示第一 <br />
维，2 表示第二维，以此类推。如果省略 dimension 参数，则默认值为 1. <br />
　EXAMPLE: <% <br />
i = Array("Monday","Tuesday","Wednesday") <br />
response.write UBound(i) <br />
%> <br />
　RESULT: 2 <br />
　 <br />
UCase() <br />
　FUNCTION: 返回字符串的大写形式. <br />
　SYNTAX: UCase(string) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
strTest = "This is a test!!" <br />
response.write UCase(strTest) <br />
%> <br />
　RESULT: THIS IS A TEST!! <br />
　 <br />
VarType() <br />
　FUNCTION: 返回指示变量子类型的值 <br />
　SYNTAX: VarType(varName) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <% <br />
i = 3 <br />
response.write varType(i) <br />
%> <br />
　RESULT: 2(数字)详见"asp常数" <br />
　 <br />
WeekDay() <br />
　FUNCTION: 返回在一周的第几天. <br />
　SYNTAX: WeekDay(date [, firstdayofweek]) <br />
　ARGUMENTS: . <br />
　EXAMPLE: <% <br />
d = #8/4/99# <br />
response.write Weekday(d) <br />
%> <br />
　RESULT: 4(星期三) <br />
　 <br />
WeekDayName() <br />
　FUNCTION: 返回一周第几天的名字. <br />
　SYNTAX: WeekDayName(weekday [, Abb ][, firstdayofweek]]) <br />
　ARGUMENTS: Abb可选。Boolean 值，指明是否缩写表示星期各天的名称。如果省 <br />
略， 默认值为 False，即不缩写星期各天的名称.firstdayofweek指明星期第一天的 <br />
数值 <br />
　EXAMPLE: <% <br />
d = #8/4/99# <br />
response.write WeekdayName(Weekday(d)) <br />
%> <br />
　RESULT: Wednesday <br />
　 <br />
Year() <br />
　FUNCTION: 返回当前的年份. <br />
　SYNTAX: Year(date) <br />
　ARGUMENTS:　 <br />
　EXAMPLE: <%=Year(#8/4/99#)%> <br />
　RESULT: 1999 <br />
[/code]</p>]]></description></item><item><title><![CDATA[asp生成静态分页的处理方法]]></title><pubDate>Tue, 23 Oct 2007 15:47:44 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2007/10/200710231547448755.htm</link><description><![CDATA[<p>静态分页问题是一个比较困难的事情,好的方法暂时没有,上网去搜了一番发现了几个还行的方式，在这里贴出来供大家共享<br />
<br />
1、JS代码生成链接页面代码<br />
<br />
[html]<script language="JavaScript" type="text/javascript"> [/n]//========================================================================= [/n]//update by CuCuGo [/n]//qq:13174128 [/n]//site:www.lovemx.com [/n]//2007.4.24 [/n]//每个文件中放一个此JS,作到第几页就将cur_No 变量赋几 前台页面自动适应链接 [/n]//每个页以"new_n.htm"存储 [/n]//========================================================================= [/n]var cur_No=50 [/n]var s_link; [/n]for(var i=cur_No-5;i<=cur_No+5;i++) [/n]{ [/n]if (i!=cur_No){ [/n]s_link = "new_"+i.toString() +".htm"; [/n]document.write("<a class=c1 href=" + s_link +">" + i.toString()+"</a> "); [/n]} [/n]else [/n]{ [/n]document.write(i.toString()+" "); [/n]} [/n]} [/n] </script>[/html]<br />
<br />
2、具体的分页方式<br />
<br />
[code]<!--#include file="inc/conn.asp"--> <br />
<html><head><TITLE>分页测试</TITLE><LINK href="inc/style.css" type=text/css rel=stylesheet></head> <br />
<%strHead=strHead&amp;"<html>" <br />
strHead=strHead&amp;"<head>" <br />
strHead=strHead&amp;"<TITLE>分页测试</TITLE>" <br />
strHead=strHead&amp;"<LINK href=""inc/style.css"" type=text/css rel=stylesheet>" <br />
strHead=strHead&amp;"</head>" <br />
%> <br />
<% <br />
sql="select * from news" <br />
set rs=server.createObject("ADODB.Recordset") <br />
rs.open sql,conn,1,1 <br />
%><% <br />
rs.pagesize=5 <br />
totalpage=rs.pagecount <br />
rs.close <br />
set rs=nothing <br />
<br />
for j=1 to totalpage <br />
sql="select * from news" <br />
set rs=server.createObject("ADODB.Recordset") <br />
rs.open sql,conn,1,1 <br />
<br />
whichpage=j <br />
rs.pagesize=5 <br />
totalpage=rs.pagecount <br />
rs.absolutepage=whichpage <br />
howmanyrecs=0 <br />
%><% <br />
str0="" <br />
str0=str0&amp;"</p>" <br />
str0=str0&amp;"<table bgcolor=#cecfce align=center border=0 width=800 cellpadding=2 cellspacing=1><tr bgcolor=#f7f7f7><td bgcolor=#f7f7f7 align=""center"">序号</td><td bgcolor=#f7f7f7 align=""center"">标题</td></tr>" <br />
%><% <br />
do while not rs.eof and howmanyrecs<rs.pagesize <br />
%><% <br />
str0=str0&amp;"<tr bgcolor=#f7f7f7>" <br />
str0=str0&amp;"<td bgcolor=#f7f7f7 align=""center"">"&amp;rs(0)&amp;"</td>" <br />
str0=str0&amp;"<td bgcolor=#f7f7f7 align=""center"">"&amp;rs(1)&amp;"</td>" <br />
str0=str0&amp;"</tr>" <br />
%><% <br />
rs.movenext <br />
howmanyrecs=howmanyrecs+1 <br />
loop <br />
rs.close <br />
set rs=nothing <br />
%><%str0=str0&amp;"</table>" <br />
%><% <br />
<br />
'分页部分 <br />
ref="" <br />
<br />
ref=ref&amp;"<br>" <br />
ref=ref&amp;"<table bgcolor=#cecfce align=center border=0 width=800 cellpadding=0 cellspacing=1> " <br />
ref=ref&amp;"<tr bgcolor=#f7f7f7>" <br />
ref=ref&amp;"<td> " <br />
ref=ref&amp;"<b>Pages： " &amp; j &amp; " / " &amp; totalpage &amp;"</b>" <br />
ref=ref&amp;"</td>" <br />
ref=ref&amp;"<td> " <br />
<br />
ref=ref&amp;"<a href=list_1.html"&amp;">" &amp; "首页" &amp; "</a> " <br />
if whichpage=1 then <br />
ref=ref&amp;"上一页" <br />
else <br />
ref=ref&amp;"<a href=list_"&amp;j-1&amp;".html"&amp;">" &amp; "上一页" &amp; "</a> " <br />
end if <br />
<br />
'for counter=1 to totalpage <br />
'ref=ref&amp;"<a href=list_"&amp;counter&amp;".html"&amp;">[" &amp; counter &amp; "]</a>" <br />
'ref=ref&amp; " " <br />
'if counter mod 10 = 0 then <br />
'ref=ref&amp; "<br>" <br />
'end if <br />
'next <br />
<br />
if (whichpage>totalpage or whichpage=totalpage) then <br />
ref=ref&amp;"下一页" <br />
else <br />
ref=ref&amp;"<a href=list_"&amp;j+1&amp;".html"&amp;">" &amp; "下一页" &amp; "</a> " <br />
end if <br />
ref=ref&amp;"<a href=list_"&amp;totalpage&amp;".html"&amp;">" &amp; "尾页" &amp; "</a> " <br />
<br />
Dim fso,f <br />
Dim strTitle,strContent,strOut <br />
'创建文件系统对象 <br />
Set fso=Server.createObject("Scripting.FileSystemObject") <br />
Set f=fso.createTextFile(Server.MapPath("html/list_"&amp;j&amp;".html"),true) <br />
<br />
'写入网页内容 <br />
f.WriteLine strHead&amp;str0&amp;ref <br />
f.close <br />
response.write "正在生成第"&amp;j&amp;"个页面!<br>" <br />
%><% <br />
next%> <br />
[/code]<br />
<br />
3、其他的方法<br />
<br />
[code]<% <br />
dim dde,fcontent,fkn,kg,pn,pz,nz 'dde：当前页；fcontent：内容；fkn：扩展名；kg：空格；pn每页多少条记录； 'pz：总页数；nz：记录总条数； <br />
dde=1 <br />
pn=10 <br />
nz=29 <br />
fenter="<br>" 'fenter：回车符号 <br />
fcontent="<br>" 'fcontent：设变量起始值为回车符号 <br />
fkn=".html" <br />
kg="  " <br />
<br />
if nz mod pn=0 then '计算总页数 <br />
pz=nz\pn 'pz:总页数 <br />
else <br />
pz=nz\pn+1 <br />
end if <br />
<br />
for i=1 to nz <br />
fcontent=fcontent&amp;"第"&amp;i&amp;"条记录"&amp;fenter <br />
if((i>1 and (i mod pn=0)) or i=nz) then <br />
<br />
if dde>1 then <br />
fy="<a href='1"&amp;fkn&amp;"'>首页</a>"&amp;kg <br />
fy=fy&amp;"<a href='"&amp;(dde-1)&amp;fkn&amp;"'>上一页</a>"&amp;kg <br />
else <br />
fy=fy&amp;"首页"&amp;kg <br />
fy=fy&amp;"上一页"&amp;kg <br />
end if <br />
fy=fy&amp;dde&amp;kg <br />
if dde<pz then <br />
fy=fy&amp;"<a href='"&amp;(dde+1)&amp;fkn&amp;"'>下一页</a>"&amp;kg <br />
fy=fy&amp;"<a href='"&amp;pz&amp;fkn&amp;"'>尾页</a>"&amp;kg <br />
else <br />
fy=fy&amp;"下一页"&amp;kg <br />
fy=fy&amp;"尾页"&amp;kg <br />
end if <br />
<br />
call createfile(server.mappath(dde&amp;fkn),fcontent&amp;fenter&amp;fy) <br />
response.write "第"&amp;dde&amp;"页生成!<br>" <br />
fcontent="<br>" <br />
dde=dde+1 <br />
end if <br />
next <br />
<br />
function createfile(fname,nfasp) <br />
set myFSO=server.createobject("scripting.filesystemobject") <br />
set myfile=myfso.opentextfile(fname,2,true) <br />
myfile.write nfasp <br />
myfile.close <br />
set myFso=nothing <br />
end function <br />
%> <br />
[/code]</p>]]></description></item><item><title><![CDATA[精品SQL语句下载]]></title><pubDate>Thu, 18 Oct 2007 15:22:53 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2007/10/200710181522535041.htm</link><description><![CDATA[<p>asc 按升序排列<br />
desc 按降序排列<br />
下列语句部分是Mssql语句，不可以在access中使用。<br />
SQL分类： <br />
DDL&mdash;数据定义语言(CREATE，ALTER，DROP，DECLARE) <br />
DML&mdash;数据*纵语言(SELECT，DELETE，UPDATE，INSERT) <br />
DCL&mdash;数据控制语言(GRANT，REVOKE，COMMIT，ROLLBACK)<br />
首先,简要介绍基础语句：<br />
1、说明：创建数据库<br />
CREATE DATABASE database-name <br />
2、说明：删除数据库<br />
drop database dbname<br />
3、说明：备份sql server<br />
--- 创建 备份数据的 device<br />
USE master<br />
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'<br />
--- 开始 备份<br />
BACKUP DATABASE pubs TO testBack <br />
4、说明：创建新表<br />
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)<br />
根据已有的表创建新表： <br />
A：create table tab_new like tab_old (使用旧表创建新表)<br />
B：create table tab_new as select col1,col2&hellip; from tab_old definition only<br />
5、说明：删除新表drop table tabname <br />
6、说明：增加一个列<br />
Alter table tabname add column col type<br />
注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。<br />
7、说明：添加主键： Alter table tabname add primary key(col) <br />
说明：删除主键： Alter table tabname drop primary key(col) <br />
8、说明：创建索引：create [unique] index idxname on tabname(col&hellip;.) <br />
删除索引：drop index idxname<br />
注：索引是不可更改的，想更改必须删除重新建。<br />
9、说明：创建视图：create view viewname as select statement <br />
删除视图：drop view viewname<br />
10、说明：几个简单的基本的sql语句<br />
选择：select * from table1 where 范围<br />
插入：insert into table1(field1,field2) values(value1,value2)<br />
删除：delete from table1 where 范围<br />
更新：update table1 set field1=value1 where 范围<br />
查找：select * from table1 where field1 like &rsquo;%value1%&rsquo; ---like的语法很精妙，查资料!<br />
排序：select * from table1 order by field1,field2 [desc]<br />
总数：select count as totalcount from table1<br />
求和：select sum(field1) as sumvalue from table1<br />
平均：select avg(field1) as avgvalue from table1<br />
最大：select max(field1) as maxvalue from table1<br />
最小：select min(field1) as minvalue from table1<br />
<br />
全部下载<img src="http://www.waaku.com/bbs/pic/url.gif" align="absMiddle" alt="" /><a href="http://www.waaku.com/bbs/ojbbs/sql.doc" target="_blank">http://www.waaku.com/bbs/ojbbs/sql.doc</a></p>]]></description></item><item><title><![CDATA[常用ASP编程的代码推荐]]></title><pubDate>Thu, 18 Oct 2007 15:14:16 GMT</pubDate><category>ASP技术</category><link>http://www.51yc.cn/html/2007/10/200710181514165643.htm</link><description><![CDATA[<p>1. ASP与Access数据库连接：　<br />
　　dim conn,mdbfile<br />
　　mdbfile=server.mappath("数据库名称.mdb")<br />
　　set conn=server.createobject("adodb.connection")<br />
　　conn.open "driver={microsoft access driver (*.mdb)};uid=admin;pwd=数据库密码;dbq="&amp;mdbfile<br />
　　2. ASP与SQL数据库连接：<br />
　　dim conn<br />
　　set conn=server.createobject("ADODB.connection")<br />
　　con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称<br />
　　建立记录集对象：<br />
　　set rs=server.createobject("adodb.recordset")<br />
　　rs.open SQL语句,conn,3,2<br />
　　3. SQL常用命令使用方法：<br />
　　(1) 数据记录筛选：<br />
　　sql="select * from 数据表 where 字段名=字段值 order by 字段名 "<br />
　　sql="select * from 数据表 where 字段名 like &lsquo;%字段值%&lsquo; order by 字段名 "<br />
　　sql="select top 10 * from 数据表 where 字段名 order by 字段名 "<br />
　　sql="select * from 数据表 where 字段名 in (&lsquo;值1&lsquo;,&lsquo;值2&lsquo;,&lsquo;值3&lsquo;)"<br />
　　sql="select * from 数据表 where 字段名 between 值1 and 值2"<br />
　　(2) 更新数据记录：<br />
　　sql="update 数据表 set 字段名=字段值 where 条件表达式"<br />
　　sql="update 数据表 set 字段1=值1,字段2=值2 &hellip;&hellip; 字段n=值n where 条件表达式"<br />
　　(3) 删除数据记录：<br />
　　sql="delete from 数据表 where 条件表达式"<br />
　　sql="delete from 数据表" (将数据表所有记录删除)<br />
　　(4) 添加数据记录：<br />
　　sql="insert into 数据表 (字段1,字段2,字段3 &hellip;) valuess (值1,值2,值3 &hellip;)"<br />
　　sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)<br />
　　(5) 数据记录统计函数：<br />
　　AVG(字段名) 得出一个表格栏平均值<br />
　　COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计<br />
　　MAX(字段名) 取得一个表格栏最大的值<br />
　　MIN(字段名) 取得一个表格栏最小的值<br />
　　SUM(字段名) 把数据栏的值相加<br />
　　引用以上函数的方法：<br />
　　sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"<br />
　　set rs=conn.excute(sql)<br />
　　用 rs("别名") 获取统的计值，其它函数运用同上。<br />
　　(5) 数据表的建立和删除：<br />
　　CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) &hellip;&hellip; )<br />
　　例：CREATE TABLE tab01(name varchar(50),datetime default now())<br />
　　DROP TABLE 数据表名称 (永久性删除一个数据表)<br />
　　(6) 记录集对象的方法：<br />
　　rs.movenext 将记录指针从当前的位置向下移一行<br />
　　rs.moveprevious 将记录指针从当前的位置向上移一行<br />
　　rs.movefirst 将记录指针移到数据表第一行<br />
　　rs.movelast 将记录指针移到数据表最后一行<br />
　　rs.absoluteposition=N 将记录指针移到数据表第N行<br />
　　rs.absolutepage=N 将记录指针移到第N页的第一行<br />
　　rs.pagesize=N 设置每页为N条记录<br />
　　rs.pagecount 根据 pagesize 的设置返回总页数<br />
　　rs.recordcount 返回记录总数<br />
　　rs.bof 返回记录指针是否超出数据表首端，true表示是，false为否<br />
　　rs.eof 返回记录指针是否超出数据表末端，true表示是，false为否<br />
　　rs.delete 删除当前记录，但记录指针不会向下移动<br />
　　rs.addnew 添加记录到数据表末端<br />
　　rs.update 更新数据表记录<br />
　　判断所填数据是数字型<br />
　　if not isNumeric(request("字段名称")) then<br />
　　response.write "不是数字"<br />
　　else<br />
　　response.write "数字"<br />
　　end if</p>]]></description></item><item><title><![CDATA[发贴文本框特效]]></title><pubDate>Wed, 10 Oct 2007 11:11:16 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/10/200710101111165313.htm</link><description><![CDATA[<p>[html]<html> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> [/n]<title>发帖文本框特效</title> [/n]<style type="text/css"> [/n]<!-- [/n]*{margin:0;padding:0;} [/n]body{font-size:12px;color:#333;text-align:center;font-family:'宋体',arial,verdana,sans-serif} [/n]ul{list-style:none;} [/n].p_abs{position:absolute;} [/n].qhui{color:#9a9a9a;} [/n]#fbcomment{height:152px;text-align:left;width:100%;} [/n]#fbcomment .text{float:left;width:420px;} [/n]#fbcomment .text textarea{width:97%;height:80px;margin-bottom:5px;} [/n]#fbcomment .text .guest{top:5px;left:35px;width:335px;height:72px;background:url(http://img.ku6.com/www/new/img/guest.jpg) no-repeat;} [/n]#fbcomment .text .guest dl{margin:6px 0 5px 40px;line-height:150%;} [/n]--> [/n]</style> [/n]</head> [/n]<body> [/n]<script type="text/javascript" id="KU6_JS_LOADER"> [/n]function loadJS(ts){if(!ts){return;}var _2=document.getElementById("KU6_JS_LOADER");for(var i=0;i<ts.length;i++){var _4=ts[i];var _f=false;for(var j=0;j<_2.length;j++){var _s=_2[j].getAttribute("src");if(_s&amp;&amp;_s==_4){_f=true;break;}}if(!_f){document.write("<scr"+"ipt type=\"text/javascript\" src=\""+_4+"\"></scr"+"ipt>");}}} [/n]CSL = ['http://js.ku6.com/common/prototype.js']; [/n]loadJS(CSL); [/n]</script> [/n]<div id="fbcomment"> [/n]<div class="text"> [/n]<textarea name="comment_txt" id="comment_txt" rows="5" class="b4" onFocus="$('cmt_tipDiv').hide();" title="" ></textarea> [/n]<div class="guest p_abs qhui" id="cmt_tipDiv" onClick="$('cmt_tipDiv').hide();$('comment_txt').focus();"> [/n]<dl> [/n]<dt>蓝旗温馨提醒： [/n]<dd>1、请勿发表违反国家法律评论，评论请文明用语；</dd> [/n]<dd>2、禁止发布广告评论。</dd> [/n]</dl> [/n]</div> [/n]</div> [/n]</div> [/n]</body> [/n]</html>[/html]</p>]]></description></item><item><title><![CDATA[新浪的图片新闻效果]]></title><pubDate>Sun, 07 Oct 2007 18:34:12 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/10/200710071834127940.htm</link><description><![CDATA[<p>[html]<html> [/n]<head> [/n]<title>新浪的图片新闻效果</title> [/n]<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> [/n]</head> [/n]<body bgcolor="#FFFFFF" text="#000000"> [/n]<p> </p> [/n] [/n] <p> [/n] <script language=javascript> [/n]//-------定义图片路径等参数-------------// [/n]//定义大图的路径， [/n]var bigPic0 ="http://image2.sina.com.cn/book/U1503P167T135D1F4549DT20060629223845.jpg"; [/n]var bigPic1 ="http://image2.sina.com.cn/book/U1503P167T135D1F4552DT20060629223845.jpg"; [/n]var bigPic2 ="http://image2.sina.com.cn/book/U1396P167T135D1F4555DT20060629141338.jpg"; [/n]var bigPic3 ="http://image2.sina.com.cn/book/U1396P167T135D1F4558DT20060628170108.jpg"; [/n]//小图路径 [/n]var smallPic0 ="http://image2.sina.com.cn/book/U1503P167T135D1F4548DT20060629223845.jpg"; [/n]var smallPic1 ="http://image2.sina.com.cn/book/U1503P167T135D1F4551DT20060629223845.jpg"; [/n]var smallPic2 ="http://image2.sina.com.cn/book/U1396P167T135D1F4554DT20060629141338.jpg"; [/n]var smallPic3 ="http://image2.sina.com.cn/book/U1396P167T135D1F4557DT20060628170108.jpg"; [/n]//大图的点击后的URL [/n]var PicURL0 ="http://www.yule521.com"; [/n]var PicURL1 ="http://www.yule521.com"; [/n]var PicURL2 ="http://www.yule521.com"; [/n]var PicURL3 ="http://www.yule521.com"; [/n]//标题 [/n]var t0="搞笑节目《玩转世界杯》第9期：情陷解说门"; [/n]var t1="音频：黄健翔激情解说搞笑版大全"; [/n]var t2="Play Girl(网络宝贝)X计划"; [/n]var t3="《Memory》爱情是一个迷"; [/n]//描述 [/n]var describe0="小马派出密探零零发前往德国世界杯现场，调查&ldquo;解说门&rdquo;事件真相&hellip;&hellip;"; [/n]var describe1="黄健翔是公认的中国足球评论员第一人；他，曾骄傲地宣称自己的解说就是行业标准&hellip;&hellip;"; [/n]var describe2="你也能成为聚万千艳羡于一身的游戏MM，PlayGirl X计划，将你打造成游戏巅峰最耀眼的明星。"; [/n]var describe3="怎样的爱情可以真实地握在手中？这样的爱情是真实还是虚幻？"; [/n]// [/n]var t=t0+"[|]"+t1+"[|]"+t2+"[|]"+t3; [/n]var bigPicURL=bigPic0+"[|]"+bigPic1+"[|]"+bigPic2+"[|]"+bigPic3; [/n]var smallPicURL=smallPic0+"[|]"+smallPic1+"[|]"+smallPic2+"[|]"+smallPic3; [/n]var PicURL=PicURL0+"[|]"+PicURL1+"[|]"+PicURL2+"[|]"+PicURL3; [/n]var describe = describe0+"[|]"+describe1+"[|]"+describe2+"[|]"+describe3; [/n]// [/n]document.write("\ [/n]<object classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' codebase='http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0' width='535' height='356' ID=FSCommand NAME='focus_one' align='middle'>\ [/n]<param name='allowScriptAccess' value='sameDomain' />\ [/n]<param name='movie' value='http://yule521.com/tool/bnfocus.swf' />\ [/n]<param name='FlashVars' value='bigPicURL=" + bigPicURL + "&amp;smallPicURL=" + smallPicURL + "&amp;t="+t+"&amp;PicURL="+PicURL+"&amp;describe="+describe+"'/>\ [/n]<param name='quality' value='high' />\ [/n]<param name='bgcolor' value='#ffffff' />\ [/n]<embed src='http://yule521.com/tool/bnfocus.swf' FlashVars='bigPicURL=" + bigPicURL + "&amp;smallPicURL=" + smallPicURL + "&amp;t="+t+"&amp;PicURL="+PicURL+"&amp;describe="+describe+"' quality='high' bgcolor='#ffffff' width='535' height='356' name='focus' swLiveConnect='true' align='middle' allowScriptAccess='sameDomain' type='application/x-shockwave-flash' pluginspage='http://www.macromedia.com/go/getflashplayer' />\ [/n]</object>\ [/n]"); [/n]</script> [/n] </body> [/n]</html>[/html]</p>]]></description></item><item><title><![CDATA[可多次使用的仿126邮箱选项卡的源码]]></title><pubDate>Sun, 07 Oct 2007 18:21:34 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/10/200710071821346915.htm</link><description><![CDATA[<p>[html]<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" > [/n]<!-- [/n]引用时保留下原创作者喽,尊重任何一位原创作者,促进中国互联网进程 [/n]Editor:weasle [/n]http://www.hxcgw.com [/n]Email:weasle@163.com [/n]QQ:112011531 [/n]--> [/n]<html xmlns="http://www.w3.org/1999/xhtml"> [/n]<head> [/n]<meta http-equiv="Content-Type" content="text/html;charset=gb2312" /> [/n]<title>简洁Tab</title> [/n]<style type="text/css"> [/n]<!-- [/n]body,div,ul,li{ [/n] padding:0; [/n] text-align:center; [/n]} [/n]body{ [/n] font:12px "宋体"; [/n] text-align:center; [/n]} [/n]a:link{ [/n] color:#00F; [/n] text-decoration:none; [/n]} [/n]a:visited { [/n] color: #00F; [/n] text-decoration:none; [/n]} [/n]a:hover { [/n] color: #c00; [/n] text-decoration:underline; [/n]} [/n]ul{ list-style:none;} [/n]/*选项卡1*/ [/n]#Tab1{ [/n]width:460px; [/n]margin:0px; [/n]padding:0px; [/n]margin:0 auto;} [/n]/*选项卡2*/ [/n]#Tab2{ [/n]width:576px; [/n]margin:0px; [/n]padding:0px; [/n]margin:0 auto;} [/n]/*菜单class*/ [/n].Menubox { [/n]width:100%; [/n]background:url(http://www.hxcgw.com/bbs/upfile/20079299441652.gif); [/n]height:28px; [/n]line-height:28px; [/n]} [/n].Menubox ul{ [/n]margin:0px; [/n]padding:0px; [/n]} [/n].Menubox li{ [/n] float:left; [/n] display:block; [/n] cursor:pointer; [/n] width:114px; [/n] text-align:center; [/n] color:#949694; [/n] font-weight:bold; [/n] } [/n].Menubox li.hover{ [/n] padding:0px; [/n] background:#fff; [/n] width:116px; [/n] border-left:1px solid #A8C29F; [/n] border-top:1px solid #A8C29F; [/n] border-right:1px solid #A8C29F; [/n]background:url(http://www.hxcgw.com/bbs/upfile/200792994426548.gif); [/n] color:#739242; [/n] font-weight:bold; [/n] height:27px; [/n]line-height:27px; [/n]} [/n].Contentbox{ [/n] clear:both; [/n] margin-top:0px; [/n] border:1px solid #A8C29F; [/n] border-top:none; [/n] height:181px; [/n] text-align:center; [/n] padding-top:8px; [/n]} [/n]--> [/n]</style> [/n]<script> [/n]<!-- [/n]/*第一种形式 第二种形式 更换显示样式*/ [/n]function setTab(name,cursel,n){ [/n] for(i=1;i<=n;i++){ [/n] var menu=document.getElementById(name+i); [/n] var con=document.getElementById("con_"+name+"_"+i); [/n] menu.className=i==cursel?"hover":""; [/n] con.style.display=i==cursel?"block":"none"; [/n] } [/n]} [/n]//--> [/n]</script> [/n]</head> [/n]<body> [/n]<br><br> [/n]<div id="Tab1"> [/n]<div class="Menubox"> [/n]<ul> [/n] <li id="one1" onclick="setTab('one',1,4)" class="hover">新闻1</li> [/n] <li id="one2" onclick="setTab('one',2,4)" >新闻2</li> [/n] <li id="one3" onclick="setTab('one',3,4)">新闻3</li> [/n] <li id="one4" onclick="setTab('one',4,4)">新闻4</li> [/n]</ul> [/n]</div> [/n] <div class="Contentbox"> [/n] <div id="con_one_1" class="hover">新闻列表1</div> [/n] <div id="con_one_2" style="display:none">新闻列表2</div> [/n] <div id="con_one_3" style="display:none">新闻列表3</div> [/n] <div id="con_one_4" style="display:none">新闻列表4</div> [/n] </div> [/n]</div> [/n]<br> [/n]<div id="Tab2"> [/n]<div class="Menubox"> [/n]<ul> [/n] <li id="two1" onclick="setTab('two',1,4)" class="hover">新闻1</li> [/n] <li id="two2" onclick="setTab('two',2,4)" >新闻2</li> [/n] <li id="two3" onclick="setTab('two',3,4)">新闻3</li> [/n] <li id="two4" onclick="setTab('two',4,4)">新闻4</li> [/n]</ul> [/n]</div> [/n] <div class="Contentbox"> [/n] <div id="con_two_1" >新闻列表1</div> [/n] <div id="con_two_2" style="display:none">新闻列表2</div> [/n] <div id="con_two_3" style="display:none">新闻列表3</div> [/n] <div id="con_two_4" style="display:none">新闻列表4</div> [/n] </div> [/n]</div> [/n]</body> [/n]</html>[/html]<br />
<br />
<br />
看到上面的two没有,把上面的这段复制下,把two改成three,或任何一个不同名的id,就完成了.</p>]]></description></item><item><title><![CDATA[【转帖】老公，可不可以给我一点点我自己的空间呢]]></title><pubDate>Sun, 07 Oct 2007 17:56:30 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/10/200710071756307856.htm</link><description><![CDATA[<p> 今天在51发现一篇很实在的文章。转了过来，个人也有这样的感觉，有时候过份的约束，会让人喘不过气来，虽然这是爱，但是爱如果是放在一个笼子里，那么这种爱，会让人窒息．相信你的老公看到这篇文章以后，定会反省一下自己的行为．给爱人一个空间，同时也给自己一个空间．信任才是夫妻幸福生活应有的基础．<br />
<br />
================================================================= <br />
 作者：只要你过得比我好<br />
<br />
　　我和老公的关系我都说不清楚是好还是坏，我和他结婚这么多年,从来没有打过架。也没有大吵过，但我还是觉得不怎么好。<br />
<br />
　　老公，也许在你眼里在你心里,你也已经对我够好了，这是我不可否认的。但你对我的爱可以换一种方式吗？我也知道爱是自私的，但我也要有我自己的个人空间，你说对吗？我的老公。<br />
<br />
　　老公，我知道你不让我离开你的视线，不让我一个人出去逛商场，也不让我去我那些同学和朋友还有同事家玩。其实你并没有明确地说不让我去。但我每次要是一个人出去了回来，你的表情告诉我的，你是很不高兴的，我问你什么，你都很不愿意和我讲话。本来你平时的话就很少，又加上我一个人出去了回来，你几乎没有什么语言了。老公，你用这种方式来爱我，我真的不很适应。<br />
<br />
　　老公，你不爱结交朋友，也不能说我也不能结交朋友你说对吗？老公，你是知道我这个人的性格的，比较外向一点，说话也比较开朗。你叫我成天呆在家里，我不适合这样呀，老公。我并不是说我每天都出去，至少一个月两三次应该不算多吧。我在家里你也不和我谈什么，比如工作还有生活这些都不给我讲。我给你讲，可你又好像没有时间听，我只有上网，一下班就上网和我那些同学朋友们聊天，在51里面看别人的文章。有时候把我想说的在51里面说出来。心里觉得轻松了很多。但是你还是要说我，说我每天都上网，老公那你叫我怎么过呀，我下班该做什么呀？有时候觉得我真的好累好累。好像做什么事都要看你高兴不高兴，为什么你就不能为我想想呀老公？<br />
<br />
　　老公，我是一个很正常的女人，需要你的照顾，也需要你的宠爱，还需要你的关怀，最需要你的理解，更需要你的宽容。老公，你就别把我当什么事都不懂好吗？什么事都是你说了算。有时候你也听听我的意见和建议好吗？老公。<br />
<br />
　　老公，现在日子是越过越好了，可我们的感情是越来越冷淡了。以前我们家还欠着别人的钱的时候，我们的感情是多么的好。我记得你那时候在做一点小生意，一天只能找10元钱。每天到了晚上你还没有回来的话，我就抱着我们的孩子在你回家的路上等你。一直等着你回来，那怕是一个小时还是两个小时，我们都会等你回来。你见到我们母子俩，我也能看出来你心里很高兴，我接过你带的东西，你抱着孩子我们三人一起回家吃晚饭。那个时候我还觉得过得很幸福很快乐。日子虽然清贫，但很充实，每天晚上逗逗孩子聊聊，先还谁的再还谁的钱。哎，可现在呢，没有话题了。<br />
<br />
　　你上班忙你的工作，下班又看你的书或在电脑上画图。很少理我，你做的全是正事，我没有理由说你什么，你对家是很负责，对我的爸妈也很好，你没有什么恶习。这是很多人难以做到的。我觉得你和我勾通的时间太少太了。也许是我的要求太高了，也许是我不够理解你，我知道你的工作压力很大。但我也是说的心理话。<br />
<br />
　　老公，我希望你能给我一些我自己的空间，我想有好多夫妇不在一起工作，还没在一个城市，别人一样过得很好。还有能不能让我做我自己喜欢的工作呢？我有时候觉得我的压力比你的压力更大。你也知道我的工作压力的，老公，是吗？<br />
<br />
　　哎，今天是中秋节，我们都放了假，我约你出去你也不去，你说你要用电脑，我就到我的办公室来写下了我想说的。就当是今天的日记。也许在你心里，我也有很多不好的地方，我只希望你把我的缺点说出来让我改正。你不说出来我还以为我没什么缺点呢。我们有什么不要闷在心里好吗，老公？这样闷在心里迟早要闷出问题来的。我会先做出来让你看。希望我们做到善待对方，尊重对方，理解对方．<br />
<br />
原贴地址：http://qun.51.com/qwe137/qun_bbs_view.php?post_id=38029&amp;page=1&amp;ak47=77cde2feb57ee23659a22ffbc0a2a533</p>]]></description></item><item><title><![CDATA[来自微软官方的效果，我可是分析半天才弄下来的。]]></title><pubDate>Sat, 29 Sep 2007 11:16:06 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/09/200709291116066400.htm</link><description><![CDATA[<p>[html]<html> [/n]<head> [/n]<META http-equiv="Content-Type" content="text/html; charset=gb2312"> [/n]<title>来自微软网站的效果</title> [/n] <script> [/n]var mvqTimeout = 125; [/n]var mvqPContent; [/n]var mvqGTlb; [/n]var mvqPDisplayed = false; [/n]var mvqPDiv, mvqPStyle; [/n]var mvqIsIE; [/n]var mvqPTd; [/n]var mvqXmlHttp = new Object(); [/n]var mvqHost = document.location.hostname; [/n]var mvqProtocol = document.location.protocol; [/n]var msvi_qllc = "zh-cn"; [/n]var msvi_qldir = "LTR"; [/n]//var msvi_qlhost = "http://www.microsoft.com"; [/n]mvqPContent ='<table cellpadding="0" cellspacing="0" border="0" id="msviQL" onmouseover="mvqPClearHide();" onmouseout="mvqPDecideHide(event);" dir="LTR" onfocusout="mvqFOu();"><tr valign="top"><td><div><h5>产品家族</h5><ul><li><a href="http://www.microsoft.com/china/office/">Office</a></li><li><a href="http://www.microsoft.com/china/windows/">Windows</a></li><li><a href="http://www.microsoft.com/china/windowsserversystem/">Windows Server System</a></li><li><a href="http://www.microsoft.com/china/windowsmobile/">Windows Mobile</a></li><li><a href="http://www.microsoft.com/china/msdn/">开发工具</a></li><li><a href="http://www.microsoft.com/china/BusinessSolutions/">商务管理解决方案(MBS)</a></li><li><a href="http://www.msn.com.cn">MSN</a></li></ul></div></td><td><div><h5>产品资源</h5><ul><li><a href="http://update.microsoft.com/">Microsoft Update</a></li><li><a href="http://office.microsoft.com/zh-cn/default.aspx">Office Update</a></li><li><a href="http://www.microsoft.com/china/downloads/">下载中心</a></li><li><a href="http://support.microsoft.com/">客户帮助与支持</a></li><li><a href="http://www.microsoft.com/china/security/">安全性与隐私保护</a></li><li><a href="http://www.microsoft.com/china/community/">微软中文社区</a></li><li><a href="http://www.microsoft.com/china/learning/">教育培训与认证</a></li><li><a href="http://www.microsoft.com/china/events/">活动与培训</a></li></ul><p class="msviqlspacer"></p><h5>关于微软</h5><ul><li><a href="http://www.microsoft.com/china/mscorp/">微软总部</a></li><li><a href="http://www.microsoft.com/china/info/">微软中国</a></li><li><a href="http://www.microsoft.com/china/press/">新闻报道</a></li></ul></div></td><td><div><h5>热门栏目</h5><ul><li><a href="http://www.microsoft.com/china/msdn/">MSDN</a></li><li><a href="http://www.microsoft.com/china/technet/">TechNet</a></li><li><a href="http://www.microsoft.com/china/business/">企业用户</a></li><li><a href="http://www.microsoft.com/china/partner/">合作伙伴</a></li><li><a href="http://www.microsoft.com/china/hardware/">硬件产品</a></li><li><a href="http://www.microsoft.com/products/info/default.aspx?view=2">所有产品</a></li><li><a href="http://www.microsoft.com/library/toolbar/3.0/sitemap/zh-cn.mspx">Microsoft.com 站点地图111</a></li></ul></div></td></tr></table>'; [/n]mvqXmlHttp.url =""; [/n]//mvqXmlHttp.url = "http://www.microsoft.com/library/toolbar/3.0/quicklinks/ql.ashx?lc=zh-cn"; [/n]mvqXmlHttp.initialized = false; [/n]mvqXmlHttp.callback = mvqPanel; [/n]mvqXmlHttp.timer = 25; [/n]if(document.all) [/n] mvqIsIE = true; [/n]else [/n] mvqIsIE = false; [/n]function mvqPanel() [/n]{ [/n] if(typeof mvqPContent == "undefined") [/n] { [/n] if(!mvqXmlHttp.initialized){ mvqGetContent(); } [/n] mvqcb = window.setTimeout(mvqXmlHttp.callback, mvqXmlHttp.timer); [/n] return; [/n] } [/n] if(!mvqIsIE)mvqPClearHide(); [/n] if(mvqPContent != "" &amp;&amp; typeof mvqPContent != "undefined" &amp;&amp; mvqPDisplayed == false) [/n] { [/n] mvqPSetDisplay(true); [/n] mvqPDiv = document.getElementById("panelDiv"); [/n] mvqPStyle = mvqPDiv.style; [/n] mvqGTlb = document.getElementById("msviGlobalToolbar"); [/n] mvqPStyle.top = mvqGTlb.offsetTop + mvqGTlb.offsetHeight - 3 + "px"; [/n] mvqPDir(); [/n] if(document.body.clientWidth &amp;&amp; document.body.clientWidth > 475) [/n] { [/n] var re = /'/g; [/n] mvqPAnimate(true); [/n] if(msvi_qldir == 'RTL') [/n] window.setTimeout("mvqPShow('" + mvqPContent.replace(re, "'") + "', " + "125)", mvqTimeout); [/n] else [/n] window.setTimeout("mvqPShow('" + mvqPContent.replace(re, "'") + "', " + "225)", mvqTimeout); [/n] mvqPHideEle(true); [/n] } [/n] } [/n]} [/n] [/n]function mvqPDir() [/n]{ [/n] if(mvqPDiv &amp;&amp; msvi_qldir == "RTL") [/n] { [/n] mvqPContent = mvqPContent.replace("dir=\"LTR\"", "dir=\"" + msvi_qldir + "\""); [/n] } [/n]} [/n] [/n]function mvqPSetDisplay(value) [/n]{ [/n] mvqPDisplayed = value; [/n]} [/n] [/n]function mvqPAnimate(bOpen) [/n]{ [/n] var animAdj; [/n] [/n] if(msvi_qldir == "RTL") [/n] animAdj = new Array(165, 165, 165); [/n] else [/n] animAdj = new Array(50, 100, 150); [/n] [/n] var animDelay = new Array(50, 75, 100); [/n] var arr = mvqPGetAnimateArr(); [/n] if(bOpen) [/n] { [/n] for(i=0; i<arr.length; i++) [/n] window.setTimeout("mvqPShow('" + arr[i] + "'," + animAdj[i] + ")", animDelay[i]); [/n] } [/n] else [/n] { [/n] animDelay = animDelay.reverse(); [/n] for(i=0; i<arr.length; i++) [/n] window.setTimeout("mvqPShow('" + arr[i] + "'," + animAdj[i] + ")", animDelay[i]); [/n] [/n] window.setTimeout(mvqPReset, mvqTimeout-20); [/n] } [/n]} [/n] [/n]function mvqPReset() [/n]{ [/n] mvqPStyle.visibility = "hidden"; [/n] mvqPStyle.display = "none"; [/n] mvqPSetDisplay(false); [/n]} [/n] [/n]function mvqPGetAnimateArr() [/n]{ [/n] var arr = new Array(3); [/n] arr[0] = '<div style=\"width:125px;height:50px;border:solid 1px #999999\"></div>'; [/n] arr[1] = '<div style=\"width:250px;height:100px;border:solid 1px #999999\"></div>'; [/n] arr[2] = '<div style=\"width:375px;height:200px;border:solid 1px #999999\"></div>'; [/n] return arr; [/n]} [/n] [/n]function mvqPShow(mvqPContent, adj) [/n]{ [/n] if(mvqPContent != "undefined") [/n] { [/n] if(msvi_qldir == "RTL") [/n] mvqPStyle.left = mvqGTlb.offsetLeft + adj + "px"; [/n] else [/n] mvqPStyle.left = mvqGTlb.offsetLeft - adj + "px"; [/n] mvqPDiv.innerHTML = mvqPContent; [/n] if(mvqPStyle) [/n] { [/n] mvqPStyle.visibility = "visible"; [/n] mvqPStyle.display = ""; [/n] } [/n] } [/n]} [/n] [/n]function mvqPHideEle(boolHide) [/n]{ [/n] window.setTimeout("mvqPHideEle1('OBJECT'," + boolHide + ")", mvqTimeout); [/n] window.setTimeout("mvqPHideEle1('SELECT'," + boolHide + ")", mvqTimeout+1); [/n]} [/n] [/n]function mvqPHideEle1(el, boolShowHide) [/n]{ [/n] var objects = document.getElementsByTagName(el); [/n] if(objects.length == 0) return; [/n] for(var i=0; i < objects.length; i++) [/n] { [/n] var obj = objects.item(i); [/n] elm = mvqPDiv.firstChild; [/n] if(elm) [/n] { [/n] if(boolShowHide &amp;&amp; mvqPVerifyOverlap(elm, obj)) [/n] { [/n] obj.style.visibility = "hidden"; [/n] } [/n] else [/n] { [/n] if(obj.style.visibility == "hidden") obj.style.visibility = "visible"; [/n] } [/n] } [/n] } [/n]} [/n] [/n]function mvqPDimension(elm) [/n]{ [/n] var top = 0; [/n] var height = 0; [/n] var width = 0; [/n] var left = 0; [/n] if(elm) [/n] { [/n] this.height = elm.offsetHeight; [/n] this.width = elm.offsetWidth; [/n] while(elm) [/n] { [/n] left += elm.offsetLeft; [/n] top += elm.offsetTop; [/n] elm = elm.offsetParent; [/n] } [/n] this.left = left; [/n] this.top = top; [/n] } [/n]} [/n] [/n]function mvqPVerifyOverlap(tbl, overlapElm) [/n]{ [/n] var p1 = new mvqPDimension(overlapElm); [/n] var p = new mvqPDimension(tbl); [/n] return ( ((p.left + p.width) > p1.left) &amp;&amp; (p.left < (p1.left + p1.width)) &amp;&amp; (p.top < (p1.top - overlapElm.offsetTop + p1.height)) &amp;&amp; ((p.top + p.height) > (p1.top - overlapElm.offsetTop)) ); [/n]} [/n] [/n]function mvqGetContent() [/n]{ [/n] mvqXmlHttp.initialized = true; [/n] [/n] var xmlhttp = mvqGetXmlHttpObj(); [/n] if(xmlhttp) [/n] { [/n] xmlhttp.open("GET", mvqXmlHttp.url, true); [/n] xmlhttp.onreadystatechange = function() [/n] { [/n] if (xmlhttp.readyState == 4) [/n] { [/n] if(xmlhttp.status == 200) [/n] mvqPContent = xmlhttp.responseText; [/n] else [/n] mvqPContent = ""; [/n] } [/n] }; [/n] // xmlhttp.send(null); [/n] [/n] } [/n] else [/n] mvqPContent = ""; [/n]} [/n] [/n]function mvqGetXmlHttpObj() [/n]{ [/n] var x = false; [/n] if(window.XMLHttpRequest) x = new XMLHttpRequest(); [/n] else if(window.ActiveXObject) [/n] { [/n] try { x = new ActiveXObject("Msxml2.XMLHTTP"); } [/n] catch (e) [/n] { [/n] try { x = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} [/n] } [/n] } [/n] if(x) return x; else return null; [/n]} [/n] [/n]function mvqPHide() [/n]{ [/n] if(mvqPStyle) [/n] { [/n] mvqPStyle.visibility = "hidden"; [/n] mvqPStyle.display = "none"; [/n] } [/n] if(mvqPDisplayed) [/n] { [/n] if(document.body.clientWidth &amp;&amp; document.body.clientWidth > 475) [/n] { [/n] mvqPAnimate(false); [/n] mvqPHideEle(false); [/n] } [/n] } [/n]} [/n] [/n]function mvqPClearHide() [/n]{ [/n] if (typeof delayHide != "undefined") [/n] { [/n] clearTimeout(delayHide); [/n] } [/n]} [/n] [/n]function mvqPDecideHide(e) [/n]{ [/n] if(typeof mvqcb != "undefined") clearTimeout(mvqcb); [/n] e = (e) ? e : (window.event ? window.event : ""); [/n] if(e) [/n] { [/n] if (mvqIsIE &amp;&amp; !mvqPTd.contains(e.toElement)) mvqPDelayHide(); [/n] else if (!mvqIsIE &amp;&amp; !mvqPCheckParent(e.currentTarget, e.relatedTarget)) mvqPDelayHide(); [/n] } [/n]} [/n] [/n]function mvqPDelayHide() [/n]{ [/n] delayHide = setTimeout(mvqPHide, mvqTimeout); [/n]} [/n] [/n]function mvqPCheckParent(a, b) [/n]{ [/n] while(b) [/n] { [/n] if (b == a) return true; [/n] b = b.parentNode; [/n] } [/n] return false; [/n]} [/n] [/n]window.onresize = mvqPDelayHide; [/n]mvqAEvt(window, "load", mvqInit); [/n] [/n]function mvqInit() [/n]{ [/n] mvqPTd = document.getElementById("panelTd"); [/n] if(mvqPTd) [/n] { [/n] var aElm = mvqPTd.getElementsByTagName("a"); [/n] if(aElm) aElm[0].href = "javascript:void(0)"; [/n] [/n] mvqAEvt(mvqPTd, "mouseover", mvqMOv); [/n] mvqAEvt(mvqPTd, "mouseout", mvqMOu); [/n] mvqAEvt(mvqPTd, "keypress", mvqKPr); [/n] [/n] if(mvqIsIE) [/n] { [/n] mvqAEvt(aElm[0], "focus", mvqMOv); [/n] mvqAEvt(aElm[0], "focusout", mvqFOu); [/n] } [/n] if(!mvqIsIE) [/n] { [/n] mvqAEvt(mvqPTd, "focus", mvqMOv); [/n] mvqAEvt(mvqPTd, "blur", mvqFOu); [/n] } [/n] } [/n]} [/n] [/n]function mvqAEvt(oName, eName, fName) [/n]{ [/n] if(window.attachEvent) oName.attachEvent("on" + eName, fName); [/n] if(window.addEventListener) oName.addEventListener(eName, fName, false); [/n]} [/n] [/n]function mvqKPr() [/n]{ [/n] var e = (e) ? e : (window.event ? window.event : ""); [/n] if(e) [/n] { [/n] if(e.which == 13 &amp;&amp; !mvqIsIE || e.keyCode == 13 &amp;&amp; mvqIsIE) mvqMOv(); [/n] } [/n]} [/n] [/n]function mvqMOv() [/n]{ [/n] if(mvqPTd) [/n] { [/n] mvqPTd.className = 'gt1'; [/n] mvqPanel(); [/n] } [/n]} [/n] [/n]function mvqMOu() [/n]{ [/n] if(mvqPTd) [/n] { [/n] mvqPTd.className = 'gt0'; [/n] if(mvqIsIE) mvqPDecideHide(); [/n] if(!mvqIsIE) mvqPTd.onmouseout = mvqPDecideHide; [/n] } [/n]} [/n] [/n]function mvqFOu() [/n]{ [/n] if(mvqPTd) [/n] { [/n] mvqPTd.className = 'gt0'; [/n] if(mvqIsIE) mvqPDecideHide(); [/n] if(!mvqIsIE) mvqPTd.onblur = mvqPDecideHide; [/n] } [/n]} [/n] [/n]</script> [/n] [/n] [/n] [/n] <META name="save" content="favorite"> [/n] [/n] <style type="text/css"> [/n]<!-- [/n]#msviQL [/n]{ [/n] font-family: Verdana, Arial, Helvetica, sans-serif; [/n] font-weight: normal; [/n] padding: 0px 2px 0px 9px; [/n] margin: 0px; [/n] width: 463px; [/n] border-style: solid; [/n] border-color: #999999; [/n] border-width: 1px 2px 2px 1px; [/n] background-color: #ffffff; [/n] color:#000000; [/n] filter: progid:DXImageTransform.Microsoft.Shadow(color=#a9a9a9,direction=135, strength=3); [/n]} [/n] [/n]#msviQL h5 [/n]{ [/n] font-size: 9pt; [/n] font-weight: bold; [/n] margin: 8px 0px 2px 0px; [/n] color: #003399; [/n]} [/n] [/n]#msviQL td.msviqlhrtd [/n]{ [/n] padding:0px 0px 0px 6px; [/n]} [/n] [/n]#msviQL tr > td.msviqlhrtd [/n]{ [/n] padding: 3px 0px; [/n]} [/n] [/n]#msviQL td [/n]{ [/n] margin: 0px; [/n] padding: 0px; [/n] font-size: 9pt; [/n]} [/n] [/n]#msviQL td div [/n]{ [/n] width: 143px; [/n] padding: 0px 0px 5px 0px; [/n] margin:0px 0px 0px 7px; [/n]} [/n] [/n]#msviQL p.msviqlspacer [/n]{ [/n] padding:7px 0px 0px 0px; [/n] margin:0px; [/n]} [/n] [/n]#msviQL tr > td > div [/n]{ [/n] width: 143px; [/n] padding: 0px 7px 5px 0px; [/n] margin: 0px; [/n]} [/n] [/n]#msviQL tr > td > hr [/n]{ [/n] color: #d0e0f0; [/n] width: 100%; [/n] margin: 0px; [/n] background-color: #d0e0f0; [/n] height: 1px; [/n]} [/n] [/n]#msviQL tr td hr [/n]{ [/n] color: #d0e0f0; [/n] width: 99%; [/n] margin: -3px; [/n] padding: 0px; [/n] height: 1px; [/n] overflow: hidden; [/n]} [/n] [/n]#msviQL ul [/n]{ [/n] margin: 0px; [/n] padding:0px; [/n] display: block; [/n] list-style-type: none; [/n] font-size:9pt; [/n] background-image:none; [/n] list-style-image:none; [/n]} [/n] [/n]#msviQL li [/n]{ [/n] width: 143px; [/n] display: block; [/n] margin:0px 0px 1px 0px; [/n] list-style-type: none; [/n] font-size:9pt; [/n] background-image:none; [/n] padding:0px; [/n] list-style-image:none; [/n]} [/n] [/n]#msviQL li a [/n]{ [/n] color: #000000; [/n] text-decoration: none; [/n] padding: 1px 0px 1px 3px; [/n] display: block; [/n] vertical-align: middle; [/n] border: solid 1px #ffffff; [/n] height: 11px; [/n] font-size: 9pt; [/n] font-family:Verdana, Arial, Helvetica, sans-serif; [/n] margin:0px; [/n]} [/n] [/n]#msviQL a:hover [/n]{ [/n] border: solid 1px #a2c5eb; [/n] background-color: #f0f7fd; [/n] cursor: pointer; [/n] vertical-align: middle; [/n] display: block; [/n]} [/n] [/n]#msviQL div > ul > li > a:hover, #msviQL div > ul > li > a [/n]{ [/n] height: auto; [/n]} [/n].STYLE2 {font-size: 9pt} [/n]--> [/n] </style> [/n]</head> [/n] <body bgcolor="#FFFFFF" topmargin="0" leftmargin="0" marginwidth="0" marginheight="0"> [/n] <div id="msviMasthead"> [/n] <table cellpadding="0" cellspacing="0" width="100%" border="0"> [/n] <tr> [/n] <TD width=400></TD> [/n] <td id="msviGlobalToolbar" height="22" nowrap="" dir="ltr" align="left"> [/n] <table border="0" cellpadding="3" cellspacing="1" bgcolor="#CCCCCC"> [/n]<tr> [/n] <td nowrap bgcolor="#FFFFFF" class="gt0" id="panelTd"> [/n] <div align="center"><span class="msviqlhrtd STYLE2"><a href="http://www.microsoft.com/library/toolbar/3.0/sitemap/zh-cn.mspx">快速链接</a></span></div> [/n] <div id="panelDiv" style="position:absolute;visibility:hidden;z-index:100;"></div> [/n] </td> [/n] </tr> [/n] </table> [/n] </td> [/n] </tr></table> [/n] </body></html> [/n][/html]</p>]]></description></item><item><title><![CDATA[ghost问我的问题，学习了]]></title><pubDate>Thu, 27 Sep 2007 17:24:03 GMT</pubDate><category>数据库技术</category><link>http://www.51yc.cn/html/2007/09/200709271724039363.htm</link><description><![CDATA[<p>select  sum  from table where sum+1=2<br />
select  sum  from table where sum=2-1<br />
哪个快?理由<br />
============<br />
第一个用不到index,所以每次都要全表扫描，因为是对栏位做了计算<br />
 数据库中：sum在数据库里有索引啊,如果sum+1就利用不到索引的好处了。<br />
C#中：因为sun=2-1 运行C#下的方法`而sun+1=2也是一样~但方法不一样 具体也没怎么在意。</p>]]></description></item><item><title><![CDATA[女人不该让男人太累]]></title><pubDate>Thu, 27 Sep 2007 16:50:03 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/09/200709271650038493.htm</link><description><![CDATA[<p>不是每个男人都是骑着白马的王子，所以，请不要苛求他不够高大和英俊，不要责怪他送给你的只是<br />
一双手套而不是九十九朵玫瑰。宝贝们，要知道，不是王子，你才是他永远的公主，他的爱便是让你变<br />
成公主的水晶鞋。</p>
<p><br />
不是每个男人都能把爱挂在嘴边，所以，请不要在他回答&ldquo;爱不爱你&rdquo;不够^-^脆时心生怀疑，不要让他<br />
把这种回答变成一种无奈的习惯。宝贝们，你要学着体会无言的承诺，请相信，当他静静的看着你微笑<br />
时，当他轻轻的抚摩你的头发时，当他自然的牵着你的手时，他就是爱你的。</p>
<p>不是每个男人都善于反驳，所以，当出现误会而他却沉默不语时，请不要推开他兀自哭红了眼睛。也许<br />
在他看来那只是一个无关的女人或者一件他绝不会做的事，他总相信那是事实，就不需要太多解释。宝<br />
贝们，不要轻易把这份坚持当做一种默认的表示。难道，你没看到他手足无措的样子？</p>
<p>要知道，你的他不是超人或者蝙蝠侠，所以，当他不能在你有困难时第一时间出现，请你不要责难他，<br />
因为在你无助时不能守在你的身边，那份担心已经是他最大的惩罚。宝贝们，请记住，当他事后关心的<br />
询问时，请给予温柔的回答，告诉他已经没事了，不要牵挂。</p>
<p>面子对男子来说比什么都重要。所以，在他的朋友面前，请给他十足的地位。如果他在朋友面前忽略<br />
了你，不要任性的以为那是不重视，也许他只是想显出你的温顺。不要介意在人前当个小女人，宝贝们<br />
，要知道，那可是被宠爱的女子才有的特权哦。</p>
<p>也许男人总搞不懂女人在想什么。所以，当你故意说不而他却真的走开时，请不要发誓一定要好好的惩<br />
罚他，要知道，一头雾水的他此刻心里比你还要郁闷。如果你的他总不能领会你的意思，那么，宝贝们<br />
，就明白的告诉他吧，他会爱的轻松许多，而你也可以得到你真正想要的，为什么不呢？</p>
<p>男人也要有自己的生活。他们也会迷恋游戏，也会想和朋友出去喝酒、打牌。这时，请不要短信电话步<br />
步紧逼，也不要问他为什么不带你一块前往。我们自己不也会有女人们私有的空间吗？宝贝们，给彼此<br />
足够的空间才会有新鲜的空气。</p>
<p>男人也会脆弱，也会突然的莫名情绪低落。所以，当他的脸上写满疲惫，眼中充满厌倦，请不要再去追<br />
问是不是不爱你了。要知道，时刻的讨好，谁也做不到。宝贝们，此刻，不要再去问他怎么了，只要安<br />
静的陪在他身边就好。</p>
<p>总说，男人不懂女人心，可有时候，你们不也常常忽略他们的感受？有义务陪女朋友，又没有权利放弃<br />
工作。在坚强的标志下，他们只能把所有的事情一肩扛。生活本来就很让人疲惫，当他为了你们的未来<br />
打拼的时候，宝贝们，你们不该再让他们太累。<br />
女人不该让男人太累<br />
不是每个男人都是骑着白马的王子，所以，请不要苛求他不够高大和英俊，不要责怪他送给你的只是一<br />
双手套而不是九十九朵玫瑰。宝贝们，要知道，不是王子，你才是他永远的公主，他的爱便是让你变成<br />
公主的水晶鞋。</p>
<p>不是每个男人都能把爱挂在嘴边，所以，请不要在他回答&ldquo;爱不爱你&rdquo;不够^-^脆时心生怀疑，不要让他<br />
把这种回答变成一种无奈的习惯。宝贝们，你要学着体会无言的承诺，请相信，当他静静的看着你微笑<br />
时，当他轻轻的抚摩你的头发时，当他自然的牵着你的手时，他就是爱你的。</p>
<p>不是每个男人都善于反驳，所以，当出现误会而他却沉默不语时，请不要推开他兀自哭红了眼睛。也许<br />
在他看来那只是一个无关的女人或者一件他绝不会做的事，他总相信那是事实，就不需要太多解释。宝<br />
贝们，不要轻易把这份坚持当做一种默认的表示。难道，你没看到他手足无措的样子？</p>
<p>要知道，你的他不是超人或者蝙蝠侠，所以，当他不能在你有困难时第一时间出现，请你不要责难他，<br />
因为在你无助时不能守在你的身边，那份担心已经是他最大的惩罚。宝贝们，请记住，当他事后关心的<br />
询问时，请给予温柔的回答，告诉他已经没事了，不要牵挂。</p>
<p>面子对男子来说比什么都重要。所以，在他的朋友面前，请给他十足的地位。如果他在朋友面前忽略了<br />
你，不要任性的以为那是不重视，也许他只是想显出你的温顺。不要介意在人前当个小女人，宝贝们，<br />
要知道，那可是被宠爱的女子才有的特权哦。</p>
<p>也许男人总搞不懂女人在想什么。所以，当你故意说不而他却真的走开时，请不要发誓一定要好好的惩<br />
罚他，要知道，一头雾水的他此刻心里比你还要郁闷。如果你的他总不能领会你的意思，那么，宝贝们，<br />
就明白的告诉他吧，他会爱的轻松许多，而你也可以得到你真正想要的，为什么不呢？</p>
<p>男人也要有自己的生活。他们也会迷恋游戏，也会想和朋友出去喝酒、打牌。这时，请不要短信电话步<br />
步紧逼，也不要问他为什么不带你一块前往。我们自己不也会有女人们私有的空间吗？宝贝们，给彼此<br />
足够的空间才会有新鲜的空气。</p>
<p>男人也会脆弱，也会突然的莫名情绪低落。所以，当他的脸上写满疲惫，眼中充满厌倦，请不要再去追<br />
问是不是不爱你了。要知道，时刻的讨好，谁也做不到。宝贝们，此刻，不要再去问他怎么了，只要安<br />
静的陪在他身边就好。</p>
<p>总说，男人不懂女人心，可有时候，你们不也常常忽略他们的感受？有义务陪女朋友，又没有权利放弃<br />
工作。在坚强的标志下，他们只能把所有的事情一肩扛。生活本来就很让人疲惫，当他为了你们的未来<br />
打拼的时候，宝贝们，你们不该再让他们太累。</p>]]></description></item><item><title><![CDATA[为你爱人做50件事]]></title><pubDate>Thu, 27 Sep 2007 16:46:38 GMT</pubDate><category>闲言碎语</category><link>http://www.51yc.cn/html/2007/09/200709271646385520.htm</link><description><![CDATA[<p> 1.从后面抱着虾米一样的你睡觉 <br />
2.真诚的说我爱你 <br />
3.在兰色的地毯上坐着篮球抱着吉他为你唱歌 <br />
4.你生病时陪着你照顾你 <br />
5.全身心投入的接吻<br />
6.带你回我出生成长的城市，带你看我的幼儿园我的小学我的初中和高中 <br />
7.让你看我拿到大学篮球联赛的冠军 <br />
8.给你飞翔的翅膀 <br />
9.保护你远离伤害和不好的东西 <br />
10.学会做你最爱吃的 <br />
11.多要求自己少要求你 <br />
12.冬天我用粗壮的大腿温暖你冰棍般的小脚 <br />
13.带你走过细软的沙滩，并把焰火棒插成心形然后一根根点燃 <br />
14.每年的纪念日用我能想到的最浪漫的方式庆祝 <br />
15.有自己的菜园种你最爱吃的蔬菜 <br />
16.晚上接你回家并帮你按摩放松 <br />
17.晚饭后一起出去遛狗 <br />
18.一起骑双人自行车喜欢你的朋友并把他们当作自己的朋友 <br />
19.给你足够的自由空间 <br />
20.开着你喜欢的甲克虫小车去郊游 <br />
21.陪你度过每个生日一起吹灭100岁生日蜡烛 <br />
22.夏天的凌晨起来给你煮绿豆汤，然后放进冰箱确保你喝到时它是冰冰凉的 <br />
23.在你醒来的同时睁开眼，然后深深的吻你 <br />
24.一起逛超市买你爱吃的零食 <br />
25.跟你拍好多贴纸照贴满手机钱包...一切经常看到的地方 <br />
26.努力工作<br />
27.你无聊时陪你打牌打麻将 <br />
28.让你帮我选衣服设计发型 <br />
29.带你去西藏拉萨非洲的埃及 <br />
30.用突发的灵感为你写下小诗 <br />
31.为你弄好早饭再吻醒你 <br />
32.睡觉前给你读故事，哄你入眠 <br />
33.改正自己邋遢的坏习惯 <br />
34.带你乘船一起看日出 <br />
35.你开心时陪你哈哈大笑，你难过时把你抱在怀里轻轻安慰 <br />
36.吻去你脸上的泪 <br />
37.和你一起把新家漆成淡兰色 <br />
38.和你一起洗澡为你擦背 <br />
39.为你剪指甲和手上的倒刺 <br />
40.带你见我的父母，告诉他们你让我知道什么是真爱， 什么是生命的意义 <br />
41.学会送花给你而不是很实际的请你吃烤肉 <br />
42.养你喜欢的小狗和我喜欢的大狗，并象孩子那样爱它们 <br />
43.买那只手感很好的大象给你做生日礼物 <br />
44.一起听你我喜欢的歌伴随着旋律做爱 <br />
45.一起锻炼身体并教会你三步上篮 <br />
46.陪你去王府井吃遍所有小摊 <br />
47.离开你不超过10天以上 <br />
48.买你喜欢的戒指拿着花向你求婚 <br />
49.陪你看电视 <br />
50.答应我，下辈子还嫁给我~~ 看着你终老并在你死后去找你</p>]]></description></item><item><title><![CDATA[中国的每个重要城市都用div+css定位哦]]></title><pubDate>Sat, 15 Sep 2007 08:01:23 GMT</pubDate><category>Script脚本</category><link>http://www.51yc.cn/html/2007/09/200709150801233433.htm</link><description><![CDATA[<p>[html]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"> [/n]<!-- saved from url=(0031)http://www.kijiji.cn/index.html --> [/n]<HTML [/n]xmlns="http://www.w3.org/1999/xhtml"><HEAD><TITLE>51YC地图</TITLE> [/n]<META http-equiv=Content-Type content="text/html; charset=utf-8"> [/n]<META [/n]content=地图。 [/n]name=description> [/n]<META content=地图 name=keywords> [/n]<style type="text/css"> [/n]HTML { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]BODY { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]H1 { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]H2 { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]H3 { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]H4 { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]H5 { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]H6 { [/n] PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 0px; WORD-SPACING: 0px; PADDING-TOP: 0px; LETTER-SPACING: 0px [/n]} [/n]DIV { [/n] PADDING-RIGHT: 0px; PADDING-LEF
