关键程序

2024-11-06

关键程序(精选8篇)

关键程序 篇1

1 引言

制作交互性好,能独立运行的教学课件,人们常用多媒体工具软件Authorware、Director、方正奥思等。而把功能强大的Flash仅当作制作动画的专用工具。其实,只要掌握基本的Action脚本语言,仅用Flash就能制作出交互性好,体积小巧,独立运行的教学课件。而Flash独特的矢量描述,是其它任何一款多媒体工具软件无法比拟的。下面就是运用Flash制作课件的关键程序。

2 制作loading

Loading.英文原意为装载,装填。在Flash里面叫做预载画面。我们在欣赏每一件完整的Flash课件的时候,都会看到loading的出现。这是因为,Flash制作的课件可直接放到网络上,而课件播放是否流畅取决于网络带宽,loading会预先加载一部分或全部以后,再流畅地播放课件。特别是,课件中有配音的情况下,loading的作用就显而易见了。因此,Flash课件一般都要制作loading。

制作loading只需两帧,两个图层。第一图层用于写Action脚本语言。在一层一帧填入下列语句:

语句的作用是,由_root.getBytesLoaded()和_root.getBytesTotal()的比较,算出已载入的字节数占要载入的Flash动画总字节数的百分比率,并按比例设定进度显示棒“bar”的长短。

在一层二帧填入下列代码,以便加载完毕时,从第三帧开始播放动画。

在第二层第一帧合适位置制作一个进度显示棒的影片实例,实例名为bar。在其下方制作一个动态文本框,变量名为loadedpercent。动态文本框右侧输入静态文本“%”,到此,一个简单的Loading完成了。

3 建立主文件

一个完整的课件内容较多,不易作成单个文件。通常是作一个主文件,再通过loadMovieNum()、unloadMovieNum()方法,载入和卸载子文件,从而完成由总目录到各个子内容的自由跳转。

主文件最好由多个场景组成。按Shift F2,调出场景编辑窗口,根据需要设定场景个数,指定场景名称,如从前到后依次称为“主场景”、“第一节”、“第二节”、“第三节”…等等。

“主场景”前两帧当然是Loading,从第三帧开始作一个动态片头,精彩的片头会为课件增色不少。最后一帧填入stop()语句,对应该帧以按钮对象的形式制作出主目录。点击目录中某条内容,将按照相应按钮的指令跳转到相应场景。例如,为目录第一条的按钮填入:

点击该按钮,则跳转到“第一节”场景并从第一帧开始播放。

各节的具体内容不要作在时间轴上了,不然主文件太大。以“第一节“为例,说明各节场景中的基本内容。在“第一节”场景中,第一层用于写Action脚本语言,第二层用于放置导航按钮,第三层放置标题、装饰物等,第四层绘制出该节内容的显示区。

前20帧可制作进入本场景的动态效果,第一层,第21帧填入语句:

用于载入第一节第一部分内容,该内容制作在101.swf的子文件中,第一节的其它内容分别制作在102.swf、103.swf等子文件中。这样第一层,第22、23等帧填入语句与21帧基本相同,只是将要载入的子文件名改一下就可以了。

第二层中的导航按钮一般为三个,即“上一页”、“下一页”、“目录”。它们对应的指令语句是最基本的时间轴跳转语句,这里不再赘述。

之后各场景的设置与“第一节”完全类似,可在制作完“第一节”的场景内容后拷贝到其它场景,将节标题及子文件名改一下就可以了。

4 制作子文件

如上所述,子文件为各节的具体内容,将要以动画文件的形式载入到主文件中。因此,子文件名一定要与主文件loadMovieNum()语句中所填的文件名一致,且放置在同一目录下。另外,为了让子文件恰好出现在主文件的中指定的内容的显示区中,要采用如下技巧。将作好内容的显示区的主文件复制一份,命名为某一子文件,如第一节第一个子文件101.swf。重新打开该文件,只留下“第一节”一个场景,其它场景全部删除。在留下的场景中除第四层的内容的显示区外的所有内容删除,而后以留下的内容显示区为“舞台”,制作该文件所需的全部内容。其他子文件由第一个子文件复制修改而来,这样所有的子文件在被调用时都会准确地出现在主文件指定的内容显示区中。子文件的命名最好以容易理解的数字形式,如第三节的第二部分命名为302.swf。

5 视频的控制

目前Flashcs3支持七种格式的视频导入,导入后的视频可放置到一个影片剪辑对象中,你可以随意设定它的大小和位置。因此,所谓视频控制就是影片剪辑对象的控制。

5.1 使用按钮控制影片剪辑

使用按钮很容易实现影片剪辑对象的播放、暂停等的控制。将影片剪辑对象拖入场景中,调整位置和大小。在属性面板中为影片剪辑对象起个实例名称,如moive_mc。那么播放实现影片剪辑的按钮指令就是:

其它按钮指令类似,不再赘述。

5.2 使用进度条控制影片剪辑

影片控制的最佳效果,应该是能够通过拖动进度条,随意控制影片进度。下面就介绍用进度条来控制影片进度的方法。

我们通过影片剪辑事件来完成影片播放进度的控制。打开flash8.0,如果是flash9.0以上,为了适合非专业编程人员,请用ActionScript2.0(ActionScript3.0,已不能在影片剪辑或按钮上直接写代码了)。

建立一个名为controler(当然也可以是其他名称)的影片剪辑,即MC。在此影片剪辑内,建立只有一帧的两个图层。先在第二层画一长300象素,高度适中的水平长条,为进度条主体。在第一层画一个放置在进度条左端的播放头,将其转化为影片剪辑,并将其在场景中的实例名定为bar_mc。选中bar_mc,在上面点右键,再点右键菜单中的动作,将下列代码填入出现的动作代码窗口:

代码设定在播放头(即bar_mc)上按下鼠标左键开始拖动它,范围水平300象素。放开鼠标停止拖动。变量k的值用来反应鼠标状态,后面的代码会用到。

将刚建好的影片剪辑controler从库面板中拖到场景中,在它上面点右键,再点右键菜单中的动作,将下列代码填入出现的动作代码窗口:

代码设定在播放头上按下鼠标左键(k=1)时,被控制的影片_root.moive_mc停止到播放头确定的当前帧上,从而实现由拖动控制播放。当在播放头上放开鼠标左键(k=0)时,播放头位置由当前播放的帧数确定,从而实现播放头随着播放面从左向右按播放进度移动。

到此,控制播放的进度条作完了,将任何一个影片剪辑拖到场景中,并将实例名设为moive_mc,这个MC就接受进度条的控制了。

6 声音的控制

Flash中声音方法很多,这里介绍一最简单有效的方法,双按钮法。建立两个按钮,一个是打开声音的一个是关闭声音的,其中代码分别是。

再在时间轴第一帧填入:mysong=new Sound(),声名声音对象即可。场景中任何一个声音对象都将受到按钮的控制,随间开关。

有了以上几段程序,相信作一个完整的flash课件不再是难事了吧。

关键程序 篇2

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改。

用volatile关键字声明的变量i每一次被访问时,执行部件都会从i相应的内存单元中取出i的值。

没有用volatile关键字声明的变量i在被访问的时候可能直接从cpu的寄存器中取值(因为之前i被访问过,也就是说之前就从内存中取出i的值保存到某个寄存器中),之所以直接从寄存器中取值,而不去内存中取值,是因为编译器优化代码的结果(访问cpu寄存器比访问ram快的多)。

以上两种情况的区别在于被编译成汇编代码之后,两者是不一样的。之所以这样做是因为变量i可能会经常变化,保证对特殊地址的稳定访问。

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

使用该关键字的例子如下:

int volatile nVint;

当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

例如:

volatile int i=10;

int a = i;

...//其他代码,并未明确告诉编译器,对i进行过操作

int b = i;

volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。

注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:

首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的代码:

#i nclude

void main()

{

int i=10;

int a = i;

printf(“i= %dn”,a);

//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道

__asm {

mov dword ptr [ebp-4], 20h

}

int b = i;

printf(“i= %dn”,b);

}

然后,在调试版本模式运行程序,输出结果如下:

i = 10

i = 32

然后,在release版本模式运行程序,输出结果如下:

i = 10

i = 10

输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。

下面,我们把 i的声明加上volatile关键字,看看有什么变化:

#i nclude

void main()

{

volatile int i=10;

int a = i;

printf(“i= %dn”,a);

__asm {

mov dword ptr [ebp-4], 20h

}

int b = i;

printf(“i= %dn”,b);

}

分别在调试版本和release版本运行程序,输出都是:

i = 10

i = 32

这说明这个关键字发挥了它的作用!

文章一:

讲讲volatile的作用

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1).并行设备的硬件寄存器(如:状态寄存器)

2).一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3).多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。

假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

1).一个参数既可以是const还可以是volatile吗?解释为什么。2).一个指针可以是volatile 吗?解释为什么。3).下面的函数有什么错误:

int square(volatile int *ptr){ return *ptr * *ptr;} 下面是答案:

1).是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

2).是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个buffer的指针时。

3).这段代码的有个恶作剧。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*ptr指向一个volatile型参数,编译器将产生类似下面的代码: int square(volatile int *ptr){ int a,b;a = *ptr;b = *ptr;return a * b;} 由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下: long square(volatile int *ptr){ int a;a = *ptr;return a * a;} 讲讲我的理解:(欢迎打板子...~~!)

关键在于两个地方:

1.编译器的优化(请高手帮我看看下面的理解)

在本次线程内, 当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后,再取变量值时,就直接从寄存器中取值;

当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致

当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致

当该寄存器在因别的线程等而改变了值,原变量的值不会改变,从而造成应用程序读取的值和实际的变量值不一致

举一个不太准确的例子:

发薪资时,会计每次都把员工叫来登记他们的银行卡号;一次会计为了省事,没有即时登记,用了以前登记的银行卡号;刚好一个员工的银行卡丢了,已挂失该银行卡号;从而造成该员工领不到工资

员工 -- 原始变量地址

银行卡号 -- 原始变量在寄存器的备份

2.在什么情况下会出现(如1楼所说)

1).并行设备的硬件寄存器(如:状态寄存器)

2).一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)3).多线程应用中被几个任务共享的变量

补充: volatile应该解释为“直接存取原始内存地址”比较合适,“易变的”这种解释简直有点误导人;

“易变”是因为外在因素引起的,象多线程,中断等,并不是因为用volatile修饰了的变量就是“易变”了,假如没有外因,即使用volatile定义,它也不会变化;

而用volatile定义之后,其实这个变量就不会因外因而变化了,可以放心使用了; 大家看看前面那种解释(易变的)是不是在误导人

------------简明示例如下:------------------

volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。使用该关键字的例子如下: int volatile nVint;>>>>当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。例如:

volatile int i=10;int a = i;...//其他代码,并未明确告诉编译器,对i进行过操作 int b = i;>>>>volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。

>>>>注意,在vc6中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。下面通过插入汇编代码,测试有无volatile关键字,对程序最终代码的影响:

>>>>首先,用classwizard建一个win32 console工程,插入一个voltest.cpp文件,输入下面的代码: >> #i nclude void main(){ int i=10;int a = i;printf(“i= %d”,a);//下面汇编语句的作用就是改变内存中i的值,但是又不让编译器知道 __asm { mov dword ptr [ebp-4], 20h } int b = i;printf(“i= %d”,b);} 然后,在调试版本模式运行程序,输出结果如下: i = 10 i = 32 然后,在release版本模式运行程序,输出结果如下: i = 10 i = 10 输出的结果明显表明,release模式下,编译器对代码进行了优化,第二次没有输出正确的i值。下面,我们把 i的声明加上volatile关键字,看看有什么变化: #i nclude void main(){ volatile int i=10;int a = i;printf(“i= %d”,a);__asm { mov dword ptr [ebp-4], 20h } int b = i;printf(“i= %d”,b);} 分别在调试版本和release版本运行程序,输出都是: i = 10 i = 32 这说明这个关键字发挥了它的作用!

------------------------------------

volatile对应的变量可能在你的程序本身不知道的情况下发生改变

比如多线程的程序,共同访问的内存当中,多个程序都可以操纵这个变量 你自己的程序,是无法判定合适这个变量会发生变化

还比如,他和一个外部设备的某个状态对应,当外部设备发生操作的时候,通过驱动程序和中断事件,系统改变了这个变量的数值,而你的程序并不知道。

对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

------------------

典型的例子

for(int i=0;i<100000;i++);这个语句用来测试空循环的速度的

但是编译器肯定要把它优化掉,根本就不执行 如果你写成

for(volatile int i=0;i<100000;i++);它就会执行了

volatile的本意是“易变的” 由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:

static int i=0;

int main(void){...while(1){ if(i)dosomething();} }

/* Interrupt service routine.*/ void ISR_2(void){ i=1;}

程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此

可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被

调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化(肯定执行)。此例中i也应该如此说明。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;

另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实

算法优化是实现程序优化的关键 篇3

解决一个问题, 算法不必是唯一的。对表示问题的数据的不同组织方式 (数据结构) , 解决问题的不同策略 (算法思想) 将导致不同的算法。解决同一问题的不同算法, 消耗的时间和空间资源量有所不同。算法运行所需要的计算机资源的量称为算法的复杂性。一般来说, 解决同一问题的算法, 需要的资源量越少, 我们认为越优秀。计算算法运行所需资源量的过程称为算法复杂性分析, 简称为算法分析。所以一个优秀的算法要考虑正确性分析、时空效率分析、时空特征分析。

正确性分析:一个算法必须正确才有存在的意义。但什么样的算法是正确的呢?正确的第一要素是能够终结, 能够终结意味着如果输入或输出有限, 则算法将在有限步骤内终结;如果输入或输出无限, 则算法也就无需终结。比如计算圆周率π的算法在正常情况下就不应该终结, 除非我们告诉这个算法仅就按到小数点后的某特定位。算法正确的第二个要素是能够得出合理的结果, 即这个结果能够与实际世界相符合, 或者至少不相矛盾。在一般情况下, 一个算法运行的结果是否正确比较容易判断。例如, 排序算法是否正确, 可以通过检查排好序后的数据是否真是按照非递增或非递减排列来判断。但也存在某些情况, 正确性的判断并不直接。还是用π作例子, 计算π的有效位的算法是否正确就不是一件简单的事情。因为π的正确值由无限位构成, 任何计算出有限位的算法都不正确, 但计算无限位的算法则无法终结, 也就不可能计算出最后的结果。

时空效率分析:一个算法只有正确性并无太多意义。一个让人等上几百年的算法。就是在正确, 也不会令我们满意。因此, 算法的速度是非常重要的, 甚至在广义上可以判为正确性的一部分。当然, 这里的速度是一个抽象概念, 指的是算法计算所需要的的步骤, 而不是具体的多少小时、多少分钟等。除了速度外, 一个算法在实现的时候需要占用的空间也是一个考虑的问题。这里的空间指的是内存, 可以是物理内存, 也可以是虚拟内存, 但不包括磁盘。空间的节省可能转换为时间的节省。在其他因素相同的情况下, 节省空间的算法更优。

可读性分析:时空特性分析也是我们要考虑的, 例如稳定性、健壮性、实现难易性等, 一个算法在实现主要目的的同时, 还能实现一些附加目的, 那么这种算法就比只实现主要目的的算法更优例如, 在排序时, 有的算法是稳定的, 即值相等的数据其相对位置保持不变;有的是不稳定的, 即相等数据的相对位置在排序的过程中有可能发生变化。那么稳定的属性就是一个附件属性。另外, 算法还应该考虑到现实的难易性问题。有的算法在抽象上非常精妙, 但在具体实现起来则可能存在诸如难以理解、难以在计算机上表示、编程困难等问题。这样的算法就不如那种容易理解、容易表示、容易编程的算法好。

前面我们讨论了算法分析的重要性及算法分析的三个方面, 那如何进行算法设计呢?在设计上必须注重下面几个问题:

正确性:通过设计算法的运算, 最后能得到正确的结果。要考察一个算法的正确性, 最简单的方法就是设置各种条件的测试数据去测试。

步骤尽可能少:对于解决同一问题的多种算法, 执行时间短的算法效率高。要考察一个算法的执行效率, 通常关注算法进行的基本操作次数。例如, 对于嵌套循环, 若能减少一层嵌套, 其内循环执行的次数经显著减少, 效率将提高。

实现尽可能简单:最简单的算法往往不是最高效的, 其执行时间可能较长。但算法的简单性使程序的可读性增强, 易于调试和维护。考察算法的简单性时, 应考虑大多数程序员都能很好地理解程序。

空间占用尽可能少:在运算空间极其稀缺的情况下, 一个算法如果占用太大的空间是不经济的。比如, 我们用计算机计算1到100的加法, 如果用常规算法, 以此累加结果为5050, 比较耗时资源和占用空间资源。当然了, 我们从感觉上体会不出来。而用一简单算法, 1+100=101, 2+99=101, 判断一下一共50个101, 用101*50=5050, 就得出正确结果。从空间和时间上都是经济的。

关键程序 篇4

Asp.net提供了完善而简单的开发环境, 非常有利于搭建公共网站, 简化了开发流程。由于网站配置信息是存储为纯文本的, 因此可以在没有本地管理工具的帮助下应用新的设置。在网站部署时, 开发人员只需要将发布好的文件拷贝到服务器, 简单配置web.config文件即可。同时Asp.net应用程序还有良好的兼容性, 可以在不同的系统和移动终端运行。

2 Asp.net应用程序系统架构

常规的Asp.net应用程序大多数采用三成体系架构。系统分为用户界面层 (简称UI层) 、功能层和数据层[1]。UI层的设计需要用到的技术有HTML、CSS以及Java Script等, 表现方式即为一个个用户界面, 是网站用户与系统交互的主要途径。功能层是UI层与数据层的桥梁, 用户向服务器发出数据请求, 功能层从数据层提取数据并返回给用户。数据层是本系统的最底层, 主要包括数据的查询、更新、删除及备份等操作。采用三层结构体系使系统结构清晰, 各个功能模块分开管理, 提高了开发效率。

3 关键技术

3.1 网站安全

网站面临很多互联网用户, 可能受到非法分子的攻击, 最主要的是防范SQL注入式攻击 (SQL Injection) 。所谓SQL注入式攻击是指非法用户通过表单提交或插入一些SQL语句, 来绕过系统验证, 根据程序返回的结果获取数据库中内容的过程。Asp.net应用程序中用户主要通过文本框等表单或URL向服务器传送数据[2], 黑客可能会利用这些接口来进行非法操作。解决SQL注入式攻击的主要采用过滤带表单中的内容, 不允许用户在关键表单中输入引号、SQL关键字等特殊字符, 拒绝有明显特征的攻击字符串。另外增强数据的保密性, 对敏感字段进行加密存储。通常情况下我们采用MD5加密算法对用户密码进行加密存储, 防止用户信息的泄漏。

3.2 成员角色管理

Asp.net提供了很完善的角色管理机制, 主要是通过Membership和一些登录控件来完成。然而Create User Wizard控件在用户注册时并不能为用户指定角色, 另外在默认的数据库中也不能存储个性化的用户信息。系统在设计时, 可以通过修改asp_User用户表等, 来实现个性化信息的存储。在用户登录时, 获取用户角色等信息并存入Session和Cookie, 在不同页面的Page_load事件中检查Session变量给不同角色的用户分配不同权限。

3.3 Ajax技术的应用

传统的Form表单每次提交到服务器都会刷新整个页面, 浪费了许多网络资源。Ajax是一种创建交互式网页应用的网页开发技术, 能够快速创建动态网页, 避免了系统完全刷新页面、用户交互不畅和服务器负担过重等问题[3]。当浏览器向服务器发出请求时系统与客户端进行少量的数据交换, 实现网页的异步更新。这样在不重新加载整个网页的情况下就可以对网页的某一部分或多个部分局部更新。开发者可以使用Asp.net自带的Ajax Extensions基础控件和Ajax Control Toolkit等控件。Ajax技术的应用极大提高了网页的灵活性, 改善了用户体验。

3.4 CSS兼容性设置

CSS即级联样式表, 由W3C组织推荐用来描述HTML等文件样式的语言。它的优势在于将网页样式与内容分开管理, 支持所有的字体字号设置, 排版设置并且可以完成一些交互设计。然而由于不同浏览器对CSS的解析不同, 导致同一段样式文件在不同浏览器却有着不同的显示效果, 有的甚至会造成排版混乱。针对这一客观事实, 我们可以对不同的浏览器使用不同的CSS文件来解决, 即CSS Hack[4]。

4 结语

本文总结了开发Asp.net应用程序时的角色的管理、网站安全以CSS兼容性设置等多方面的要点, 概略描述了Asp.net应用程序的结构及技术细节, 能够为Asp.net应用程序的开发者提供有效的参考。Web开发技术日新月异, 新技术层出不穷, 开发人员应该很灵活地将新技术融合进来, 这样才能跟上时代的潮流。

摘要:分析了搭建Asp.net Web应用程序的主要流程及关键技术, 并针对一些网站开发中的常见问题提出一些见解。着重介绍了Asp.net网站开发技术在网站中的应用, 涉及网站的安全、角色的管理、Ajax技术的应用等多个方面。

关键词:Asp.net,Ajax,Membership,CSS

参考文献

[1]范振钧.基于ASP.net的三层结构实现方法研究[J].计算机科学, 2007, 34 (4)

[2]褚龙现.ASP.NET应用SQL注入攻击的分析与防范[J].计算机与现代化, 2014 (3)

[3]怀艾芹.AJAX技术在Web系统开发中的研究及应用[J].计算机时代, 2010 (9)

论工程项目成本控制的程序和关键 篇5

1、分解预算成本

工程项目中标, 以审定的施工图预算为依据, 确定预算成本。预算成本是对施工图预算所列价值、按照成本项目的核算内容进行分析归类而得的, 其中直接成本的人工费、材料费、机械使用费根据分部分项工程量和预算单价 (定额) 计算求得, 直接成本的其他直接费、间接成本的施工管理费, 按工程类别、计费基础和取费系数计算求得。属于有专门用途的费用, 如间接费、利润、税金、概预算定额编制费和劳动定额测定费等, 不包括在预算成本内, 但为便于对比计算, 也作为独立的项目反映。

2、确定计划成本

计划成本的确定要从两个方面考虑, 一是按预算成本, 二是按可能支出。在按预算成本确定计划成本前, 一定要先计算税金、利润、概预算定编费和定额测定费够不够缴纳, 如果向业主收取的此四项费用超出应向税务局、公司和有关部门缴纳的数额, 超出部分可作为暂实现的收入;如果可取的此四项费用小于应向税务局、公司和有关部门缴纳的数额, 差额部分从直接费或间接费中弥补。按预算成本确定计划成本, 主要的一点是把不可控费用剔除, 然后按照各成本项目的预算成本折算成各成本项目的计划成本。在按预算成本确定了初步的计划成本后, 还须按预算工程量、材料用量、机械设备需用量和实际人工单价、材料采购价、机械设备使用、租赁单价等因素确定可能支出的计划成本。人工费支出计划成本, 要根据预算总工日数、内部职工平均实际工日工资计算, 还可以按照分部分项的工程量和单项工程人工费单价计算人工费支出的计划成本。材料费支出计划成本, 可根据预算材料费减去材料计划降低额求得。材料计划降低额的计算, 分两个方面进行, 一是价差, 即根据材料预算价和市场采购价的差额计算综合材料采购降低率, 然后乘以预算材料费即可, 也可以几种用量大的主要材料的材料采购降低率代替综合材料采购降低率, 计算材料价差的计划降低额;二是量差, 即根据以往的经验、采用的工艺、方法先推算出可节约的主要材料用量比例, 再乘以主要材料的用量, 便可计算出主要材料量差的计划降低额。机械使用费支出计划成本的测算, 一部分是使用自有机械的折旧大修费、经常修理费、操作人员的工资及奖金、燃油及电费等, 根据使用台数、有关资料及经验测算;另一部分是使用租赁机械, 根据需要租赁台数及租赁单价分类计算。按预算成本确定的计划成本和按可能支出确定的计划成本对照比较, 互相修正。在计划成本确定的同时, 必须制定降低成本的措施与方法, 使成本的降低建立在可能与积极的基础上。

3、实施成本控制

成本控制包括制度控制、定额或指标控制、合同控制等。制度控制指在成本支出过程中, 必须执行国家、公司的有关制度, 如财经制度、工资含量包干制度等。定额或指标控制指为了控制项目成本, 要求成本支出必须按定额执行, 没有定额的, 要根据同类工程耗用情况, 结合本工程的具体情况和节约要求, 制定各项指标, 据以执行。如材料用量的控制, 应以消耗定额为依据, 实行限额领料, 没有消耗定额的材料, 要制定领用材料指标。材料购置实际单价超过预算单价, 可能的话, 要报经营部门找业主签证或直接找业主签证, 以便在合同外另结算工程款。合同控制即项目部为了达到降低成本的目的, 根据已确定各成本子项的计划成本, 与各专业管理人员、施工队长等签订成本承包合同, 即按照费用归口管理的要求, 确立各部门、各有关人员的成本管理责任制。

4、进行成本核算

成本核算, 要严格遵守成本开支范围, 划清成本费用支出与非成本费用支出的界限, 划清工程项目成本和期间费用的界限。实际成本中耗用材料的数量, 必须以计算期内工程施工中实际耗用量为准, 不得以领代耗。已领未耗用的材料, 应及时办理退料手续;需留下期继续使用的, 应办理假退料手续。实际成本中按预算价 (计划价) 核算耗用材料的价格时, 其材料成本差异应按月随同实际耗用材料计入工程成本中, 不得在季 (年) 末一次计算分配。

5、组织成本分析

项目部每月按成本费用项目进行成本分析, 提出截止本月项目累计成本实现水平, 并逐项分析成本项目节约或超支情况, 寻找原因, 之后, 根据成本分析报告, 定期或不定期召开项目成本分析会, 总结成本节约的经验, 吸取成本超支的教训, 为下月成本控制提供对策。

6、严格成本考核

项目竣工, 工程结算收入与各成本项目的支出数额最终确定, 项目部整理汇总有关的成本核算资料, 报公司审核。根据公司的审核意见及项目部与各部门、各有关人员签订的成本承包合同, 项目部对责任人予以奖罚。如果成本核算和信息反馈及时, 在工程施工过程中, 分次进行成本考核并奖罚兑现, 效果会更好。

二、成本控制的关键

1、核算口径一致

预算成本、计划成本和实际成本的核算范围、项目设置和计算口径, 不仅应与财经制度规定、施工图预算、施工预算一致, 而且应相互一致。每一工程开工前, 统一确定工程项目目录, 据此确定成本核算对象, 成本核算对象确定后, 各种原始资料的记录、核算、上报口径统一、明晰, 预算成本、计划成本和实际成本才有相互对比、考核、分析的基础。

2、最终目标明确

关键程序 篇6

1 热缩接头的安装制作

热缩中间接头广泛用于35 kV及以下电压等级的交联电缆中间连接部位。所用材料一般为以聚乙烯、乙烯—醋酸乙烯 (EVA) 及乙丙橡胶等多种材料组分的混合物。该类产品主要采用应力管来处理电应力集中问题, 即采用参数控制法缓解电场应力集中状况。与其他绕包式、瓷套式、浇注式、预制式等电缆附件接头相比, 具有体积小、质量小、安全可靠、安装方便、价格便宜等特点。接头附件长期使用温度范围为-55~105 ℃, 老化寿命长达20 a, 径向收缩率≥50%, 纵向收缩率<5%, 收缩温度为110~140 ℃。

附件安装的主要工序:附件设备点件检查→剥除电缆护层→剥除铜屏蔽层及半导体导电层→固定应力管→压接连接铜管→包绕半导体带及填充胶→固定绝缘管→安装屏蔽网及地线→固定护套→试压→送电运行验收。

2 热缩接头的关键控制点分析

在井下高压电缆的安装过程中, 井下环境的特殊性对施工造成了较大影响, 同时也对施工的质量提出了考验。在多次对井下热缩接头施工观察中发现, 环境是影响施工的最大因素。井下环境多潮湿、多尘, 而对高压电缆进行中间热缩的地点存在风大、多尘、潮湿的情况, 且人为因素影响也较大。热缩接头施工质量如果控制不好, 将对电缆接头的使用寿命和安全性造成很大影响, 继而埋下安全隐患。因而, 对井下热缩中间接头施工工艺的控制显得尤为重要。现对施工中的几个关键点进行分析。

2.1 环境控制与保护

热缩中间接头要求作业场所环境温度在0 ℃以上, 相对湿度在70%以下, 在雨、雾、风天气中必须采取有效措施方可施工。热缩接头从开始剥切到制作完毕必须连续进行, 一次完成, 以免受潮。井下施工现场多尘、潮湿, 环境相对湿度有时超过90%, 且施工地点往往会出现不可避免的淋水, 此时就需要采取必要的措施改善施工环境, 否则施工质量就无法保证[1]。影响附件质量的主要因素有以下几个方面:电气绝缘性能、热性能 (抗老化性能、散热性能) 、附件结构、安装工艺与环境。这就要求相对室外一般环境, 在井下进行热缩接头制作时尽量避开风流量大、粉尘含量相对较大的环境, 防止粉尘的快速积聚影响施工质量;在有淋水的情况下应提前采取防水措施, 防止淋水直接淋在接头上导致线路受潮, 在施工结束后也应该对接头采取一些必要的防护措施, 防止长期使用出现问题。可在施工地点临时搭起防雨油布, 在上风向制作挡风板, 如果夏天空气湿度过大, 可在做接头前将电缆用喷灯进行烘烤, 在不超过70 ℃的情况下烘烤10 min祛潮, 保证施工质量;热缩接头的使用地点应尽量避开顶板不稳定的巷道, 因热缩中间接头位置已经将铠装切除且内部填充物经二次装设已不均匀, 故电缆抗冲击力、挤压力大为下降, 一旦受到撞击将会损坏电缆。

2.2 应力管原理和铅笔头的制作

应力管是一种体积电阻率适中 (1 010~1 012 Ω·cm) 、相对介电常数较大 (20~25) 的特殊电性参数的热收缩管, 它利用电气参数强迫电缆绝缘屏蔽断口处的电应力沿应力管疏散, 呈较均匀的分布, 如图1所示。

高压电缆每一相线芯外均有一接地的 (铜) 屏蔽层, 导电线芯与屏蔽层之间形成径向分布的电场。也就是说, 正常电缆的电场只有从 (铜) 导线沿半径向 (铜) 屏蔽层的电力线, 没有芯线轴向的电场 (电力线) , 电场分布是均匀的。

在制作电缆头时, 由于剥掉了屏蔽层, 改变了电缆原有的电场分布, 将会产生对绝缘极为不利的切向电场 (沿导线轴向的电力线) , 并且剥去屏蔽层的芯线的电力线向屏蔽层断口处集中, 屏蔽层断口处即成为电缆最容易击穿的部位 (图2) 。

此种电缆屏蔽层断口的处理方法一般是, 用可将集中的电力线 (电应力) 进行分散的材料制成的电应力控制管 (简称应力管) 套在屏蔽层断口处, 以分散断口处的电场应力, 保证电缆能可靠运行[2]。交联电缆因内应力处理不良, 会在运行中发生较大收缩, 因而在安装附件时应严格控制应力管与绝缘屏蔽搭盖的距离, 应不少于20 mm (20~25 mm为宜) , 防止收缩时应力管与绝缘屏蔽脱离, 保证应力管的效果。相对于室外一般场所, 在井下照明不佳、潮湿以及多尘的环境下, 必须注意对应力管的保护, 不得污损、破坏应力管。必要时可多带几盏矿灯增加照明强度, 制作过程中应设置防水油布、挡风板或墙来保护应力管, 这点尤为重要。

在热缩电缆中间接头的制作过程中, 将聚氯乙烯绝缘制作成铅笔头的形状, “铅笔头”也是用来分散电场分布应力的有效办法。电缆绝缘端部与接线铜管之间需包绕密封带时, 应将绝缘端部削成锥体, 即制成反应力锥, 同时必须将锥面用砂纸抛光, 因为锥面的长度远大于绝缘端部直角边的长度, 故而沿着锥面的切向场强远小于绝缘直角边的切向场强, 沿锥面击穿的可能性大大降低, 从而极大提高了接头的安全性。

因此, 电缆断头的处理必须严格遵守“将其制作成铅笔头形状”的原则, 并使用锉刀、砂纸等进行打磨处理直至为近似圆锥, 才能保证电缆的性能。在制作“铅笔头”时, 切不可盲目求快而制成垂直头, 那样将使放电击穿的概率大为提高。

2.3 热缩火焰控制

喷灯自身是火源, 所以在使用前必须采取相关安全措施并经相关部门会审批准方可使用。热缩电缆最为关键的步骤即热缩, 热缩质量的好坏直接关系到接头的安全性能和使用寿命。

热收缩附件因弹性较小, 运行中热胀冷缩时可能使界面产生气隙, 因此使用密封技术很重要, 以防止潮气侵入。而加热的程序也并非对准附件直接烘烤, 具体应注意:

(1) 热缩材料的加热收缩温度为110~120 ℃为宜。此时要求调节喷灯火焰呈黄色柔和火焰, 禁止使用高温蓝色火焰, 以免烧伤热收缩材料。

(2) 刚开始加热材料时火焰要慢慢接近热缩材料, 在其周围来回移动, 均匀加热, 并使火焰的余温向收缩方向预热材料。

(3) 火焰应呈螺旋状前进, 保证绝缘管受热均匀并沿周围方向充分均匀收缩。

(4) 相对普通环境, 在矿井风力较大的情况下也应采取必要的挡风措施, 防止喷灯加热时火焰偏向一个方向造成热集中导致热缩件局部过热而老化, 破坏绝缘性能。

2.4 试压

热缩件的出厂标准耐压达到了1 min工频105 kV耐压试压。矿井生产中为了加快施工的进度, 可能会忽略电缆试耐压的情况, 这绝不可取。电缆接头在制作完成后的检测是电缆接头制作成功与否的唯一检验办法, 也是电缆安全送电的可靠保障。送电前的检测应包括遥测绝缘电阻和1 min工频耐压试验, 确保电缆接头的安全可靠。在井下试压时应注意防潮, 以免影响试验结果。

3 结语

经过对井下热缩接头的长期施工观察发现, 上述的关键施工程序制作过程中不符合标准的情况时常存在, 而热缩接头在例行的安全检查中并不作为检查项目, 而仅仅是在计划的耐压检查中进行检测。在某矿已发生的高压供电事故中, 热缩接头事故占到20%左右, 其中有中间接头被击穿、长时间淋水不采取措施导致漏电和正常使用发热等。经查全部为施工工艺把握不当所致, 而上述4点的工艺控制为主要原因, 因而很有必要对施工人员进行热缩接头的技能培训, 并对关键程序进行分析控制, 以保证施工质量。

热缩接头作为安装便捷、价格低廉的电缆接头解决方案, 在供电中得到广泛应用。在使用过程中对安装质量的控制是保证安全生产的关键, 必须合理、有效地控制电缆接头工艺质量, 方能为保障矿井的安全高效奠定基础。

参考文献

[1]国家冶金工业局.YB/T 182—2000冶金企业热缩型电缆头制作工艺标准[S].北京:中国标准出版社, 2001.

关键程序 篇7

随着信息技术的快速发展,越来越多的应用开始通过Web形式对外提供,方便快捷的Web应用在政府、企业、军队等都得到了广泛应用。然而,不安全的Web应用使得我国金融、医疗、国防、能源和其他重要网络架构面临严峻的安全威胁。随着数字化架构变得越来越复杂 并相互关联, 实现Web应用程序安全的难度也呈指数级增加。Web应用程序越来越复杂,导致固有的漏洞和缺陷越来越多,因此也正面临着来自网络的越来越多的攻击。目前,Web应用程序安全问题已经成为我国信息技术发展重要的技术挑战, 需要有针对性的防护Web应用攻击, 即针对不同的攻击行为采用不同的防护技术。因此,研究设计Web应用程序综合测试平台进行安全检测, 及时发现Web应用程序漏洞, 对于防范各类Web应用攻击意义重大。

2研究现状及存在不足

在Web应用软件分析和测试研究方面,Ricca和Tonella在中提出了一个基于UML的模型。Kung等人将Web应用软件或者Web网站用一张图来表示, 根据页面浏览的导航顺序,构建测试树,从而生成测试用例以检测状态行为错误的方法。Kallepalli等人提出了一个基于统 计使用数 据信息建 立统一的 马尔可夫 模型 (Unified Markov Model)方法用于应用测试、性能评估及可靠性分析。

在Web应用脆弱性的自动探测技术方面, 微软将安全漏洞分为十个大类, 并在此基础上明确了Web应用程序安全框架的需求。OWASP按照若干漏洞是否紧密相关、是否使用类似的反制措施和是否经常出现在Web应用体系结构的标准,给出了十大应用程序漏洞列表。文献[6,7]针对来自不可信的来源的危险数据,利用动态追踪技术(Dynamic Tainting Technique),高效探测进入敏感区的危险数据。

相对于国外, 国内对Web应用安全测试的研究还比较薄弱。比较有代表性的研究有武汉大学的卢虹等人从状态测试的角度对Web应用的测试问题进行了讨论, 清华大学的武海平等人则开发了一个Web服务器性能测试系统,合肥工业大学的吴蕾等人应用环境错误注入的方法进行了安全性测试的研究,国防科技大学的郑理华等人正在研究基于网络的Web应用安全测试评估系统, 解放军理工大学的Zhanwei Hui等人在基于软件安全缺陷(SSD)的Web应用安全测试方法上面进行了有益的探索。

通过上述国内外现状分析不难发现,我国现有Web应用安全性测试技术还不能满足信息系统建设的迫切需求,具体差距表现在几个方面。

(1) 缺乏集成统一的Web应用安全性测试框架。当前主流的Web应用测试框架和工具通常只针对某些特定Web应用安全漏洞, 无法对安全缺陷展开全面的测试,难以满足Web应用安全性测试的要求。

(2) 缺乏有效的Web应用未知漏洞的自动扫描和发现技术。当前的Web应用安全性测试主要利用渗透攻击检测已有的安全漏洞,对未知安全漏洞的检测缺乏可行的方法。

针对Web应用程序安全性测试的切实需求, 本文针对上述不足, 深入研究Web应用的安全性测试技术体系,建立一个插件式、可扩展、重动态交互的Web应用安全性测试工具。以确保安全测试准确性和高效性为出发点,突破未知漏洞智能发掘方法和支持自定义的测试工具集成方法等关键技术, 最终为Web应用安全测试提供一整套健壮的、智能化的综合测试工具奠定基础,从而在Web应用运行前和运行时,对其进行安全扫描和风险发现,确保Web应用的安全可靠运行。

3Web 应用程序安全

Web应用是一个客户机 / 服务器软件应用系统,其中的客户程序和服务器程序通过HTTP/HTTPS协议进行交互,通常包括五个组成部分,即客户端(浏览器)、Web服务器、应用服务器、Web应用程序、数据源,它们彼此之间通过一定的机制来进行通信, 典型的Web应用架构模型如图1所示。

由于组成Web应用的软件系统相对复杂, 涉及网络、操作系统、服务器等多个方法,目前国内外对Web应用安全并没有一个统一的、标准的定义。严格意义上来讲,Web应用安全应该包括其体系结构中涉及的所有安全问题,如网络安全、操作系统安全、浏览器安全、Web服务器安全、应用服务器安全等。企业、政府、军事单位多采用防火墙、SSL、杀毒软件、入侵检测系统等措施来保护Web应用安全,但据Gartner调查,当前大多数Web攻击都直接针对Web应用程序本身。攻击者通过构造表面合法的HTML、XML、SOAP和Web Services等数据流, 传送恶意代码直接针对Web应用程序的安全漏洞 进行攻击 。OWASP (Open Web Application Security Project)组织发布的Web应用程序安全风险报告显示,跨站脚本、SQL注入等已成为Web应用程序安全的重大威胁,如图2所示,传统的边界防护、病毒查杀等安全手段对此心有余而力不足。

Web应用程序是开发和组成Web应用的核心组成部分,要保护Web应用程序安全,需要针对不同的攻击行为采用不同的防护技术。这就要求在真实攻击发生前,及时的发现Web应用程序存在的各种安全漏洞,并采取相应的防范措施进行加固。WhiteHat调查报告指出,漏洞发现得越早、弥补得越及时,攻击者利用漏洞进行攻击的机会就越小。因此,深入研究Web应用程序的安全性检测技术, 开发测评工具对Web应用程序进行安全性测试,及时发现Web应用程序所存在的漏洞,对于防范Web应用攻击意义重大。

4Web应用安全综合测试平台关键技术研究

4.1 基于插件的 Web 应用安全测试集成框架

Web应用安全漏洞成为应用系统安全风险的重灾区,而且呈现逐年上升的趋势。当前的Web应用安全测试工具虽然种类繁多,但是无一例外存在一些缺陷,运行效率相对较低。为克服这些缺陷,本文设计了图3所示的基于插件的Web应用安全测试集成框架,主要由三大部分构成:插件管理部件、扫描管理部件和全局管理部件。

插件管理部件主要负责对漏洞扫描插件的管理与维护,主要包含以下模块:插件接口层,为扩展层提供插件接插的标准接口和规范;插件管理模块,维护插件库的完整性和时效性,保证框架自身的安全性;插件调度模块,根据Web应用系统的业务逻辑属性,自主智能地调度最优的测试插件进行测试,保证系统运行效率和漏洞检出率。在这三个模块之上,是插件库及插件库维护模块,插件库用于存储各种插件,包括本地库和在线库两个部分,以方便系统快速检索并加载插件,其中包括标准的CVE漏洞扫描插件、第三方基准测试插件(包含接口合规性测试等插件), 以及用户根据系统特定属性定义的漏洞扫描插件等。插件库维护模块主要负责本地库与在线库之间的插件传输、插件审核以及插件库的完 整性维护等功能。

扫描管理部件负责调用各种扫描插件,利用插件基于各种先验知识库、基准漏洞库对Web应用展开漏洞扫描。其中主要包括几种模块:知识库 / 基准漏洞库,用于存放各种已知的或习得的先验知识和基准漏洞,作为扫描以及启发式学习的基础;Web应用信息收集模块, 主要用于截获测试框架与Web应用间的消息, 以提供给扫描插件作为分析的资料;插件调用代理模块,作为具体插件在扫描部件中的抽象,通过该模块,扫描部件可以调用相应的插件,并保持扫描部件与插件管理部件的松散耦合;测试报告生成模块,根据测试结果生成相应的测试报告并反馈给测试人员。

全局管理部件,负责对整个框架的运行进行监控与支持。主要包括以下模块:系统配置模块,对全系统各个部件进行配置, 保证系统按照测试人员的预期运行;虚拟用户生成与管理模块,产生并维护具有不同权限的不同角色的虚拟用户, 利用虚拟用户可以对Web应用展开近似于实际环境的测试;用户交互模块,使用测试报告生成模块生成的测试报告产生友好的供测试员阅读的测试分析结果;错误处理模块,对系统运行中出现的错误进行及时的响应和处理。

4.2 支持未知漏洞发现的漏洞智能挖掘技术

为了最大可能的发掘新型安全漏洞、检测与具体Web应用紧密相关的安全缺陷,本文提出并设计了基于智能挖掘的未知漏洞检测方法,流程如图4所示。

在基于智能挖掘的未知漏洞检测中,智能漏洞挖掘模块在常规漏洞检测中,通过自学习服务不断学习并获取具体的业务逻辑和应用特征。然后基于已知的漏洞库,在启发模板的指导下,采取类似“基因变异”的思想, 通过未知漏洞服务生成特定的针对具体Web应用的新攻击向量,检测应用是否存在已知漏洞库之外的未知漏洞。针对各种Web应用新型漏洞和与具体应用紧密相关的漏洞层出不穷的问题,论文提出的基于智能挖掘的未知漏洞检测技术,能够采用启发式学习机制和自学习机制来检测可能存在的未知漏洞, 增强了对Web应用未知漏洞的检测能力,提高了工具自动化、智能化检测能力,能够更加有效的测试应用安全。智能漏洞挖掘建立在常规漏洞检测基础之上, 并不能取代常规漏洞检测。智能漏洞挖掘需要通过常规漏洞测试,获取Web应用输入和输出信息以及数据流、控制流信息,取得具体的应用特征后,才能扩大测试覆盖面并生成新的攻击去检测新的安全漏洞。

4.3 Web 应用安全性测试工具实现技术

根据上述理论和技术, 最后实现一个针对Web应用的可用的安全性综合测试工具。该工具将集成上述安全测试技术,对Web应用的已知漏洞、接口合规性、业务动态安全性以及未知漏洞展开全面的测试, 确保在Web应用上线前发现大部分潜在的安全漏洞,保证基于Web应用的新型信息系统的安全可靠运行。一个利用该工具的典型Web应用安全测试场景如图5所示。

测试人员使用控制台对测试工具进行配置并启动测试过程,测试框架根据测试人员的配置调用相应的插件构造测试代理(即一个经定制的测试工具的实例),该代理生成若干具有不同身份、不同角色的虚拟角色,虚拟角色通过网络向带测试的Web应用发起测试请求, 测试工具截获请求与服务返回的响应,之后使用配置好的插件对Web应用的安全漏洞进行智能的发现与挖掘,高效地发现大部分Web应用安全漏洞。

5结束语

关键程序 篇8

关键词:Hash技术,C源程序,关键字,频度

1.引言

Hash技术是一种利用Hash函数进行查找的技术,在计算机软件应用中起着重要的作用。利用Hash技术统计C源程序中关键字出现的频度的方法可以引申到统计任何文本文件中任何字符串个数的方法,在很多领域都有应用的可能。

2. 问题分析

2.1 Hash函数

Hash函数就是把任意长度的输入通过散列算法,变换成固定长度的输出的一种转换。该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一地确定输入值。

Hash函数主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的编码里。因此也可以说,Hash函数就是一种数据内容和数据存放地址之间的映射关系。

2.2 关键技术

统计C源程序中关键字出现的频度,主要分为这样几个关键技术:

一是选择合适的Hash函数。常用的Hash函数有直接定址法、除留余数法、数字分析法、平方取余法等众多种类,分别适合不同的问题要求。Hash函数选择的好坏对发生冲突的概率有着很大影响,因而在很大程度上影响程序运行的效率。

二是如何将所有关键字使用Hash函数存入比较数组中。

三是字符串模式匹配技术。即如何在众多程序代码中选择出C语言的关键字。

四是文件输入输出技术。这是整个方法的前提,即需要统计关键字个数的C源程序必须从文件中读入,才能进行处理。处理后的结果还需要写入文件中进行保存。

3. 利用Hash函数统计C源程序中关键字出现频度的设计思想

使用Hash技术必须首先选择Hash函数。基于对问题的分析,在此我们选用除留取余法建立Hash函数。因为直接定址法虽然简单但会造成内存单元的大量浪费,而数字分析法、平方取中法等方法过于复杂,本身对时间资源的消耗过大,在本问题中使用并不值得。我们建立的Hash函数为:

Hash(key)=[(key的第一个字母序号)*100+(key的最后一个字母序号)]%41

其中key为关键字,在本问题中为C源程序的关键字。解决Hash冲突的方法。处理冲突的方法一般有开放定址法、线性探测法、二次探测法、链地址法等。为了简单起见,我们选择了线性探测法,即当发生冲突时,从冲突发生位置的下一个位置起,依次寻找空的Hash地址,

选好了Hash函数和处理冲突的方法,下面就需要根据Hash函数将C语言关键字存入比较数组中,这一步骤比较简单,只需要将所有关键字带入Hash函数,求出该关键字应该存入的数字下标就可以了,如果该数组单元已经存入了关键字,就根据线性探测法处理冲突,选择新的数组单元存入。

最核心的一个步骤就是在C源程序中找出C语言关键字的过程。从C源文件中按字符读入C源程序,每读入一个字符就检查一下它是否在ASCII码字符a与z之间。如果在它们之间就将其写入一个数组中,继续读下一个字符。如果不在就读出该数组中所有字符组成的字符串,在前面建立好的比较数组中查找,如果查找到与某关键字相同就在该关键字的个数上加1,并清空储存字符的数组,继续读入字符。

4. 具体实现方法

4.1 建立查找数组

使用num数组存储每个关键字出现的个数,首先对其进行初始化操作,将num数组各元素全部赋初值0。用t变量存储查找数组中的下标数。遍历所有的C语言关键字,对所有的关键字使用Hash函数运算得到在查找数组中的地址,在查找数组的该地址单元中填入该关键字。

使用c++语言实现的程序代码如下:

4.2 统计个数

将字符逐个读入数组c中,检查字符是否是小写字母,如果是小写字母,就读入b数组中存储。如果不是小写字母,说明肯定不是关键字的一部分。将b数组中的字符串读出,带入Hash函数中算出在Hash表中的位置。如果该位置存放的关键字与该字符串不同,向后查找,若查找到,将num数组中此关键字个数加1。若没找到则不对num数组作任何修改。

使用c++语言实现的程序代码如下:

5. 结束语

针对统计C源程序中关键字出现频度的问题,着重介绍了使用Hash技术统计关键字的方法。详细介绍了Hash函数及其使用,以及使用Hash函数统计C源程序中关键字的全过程。

参考文献

[1]吉根林,陈波,王琼等.数据结构教程(C++版).北京:电子工业出版社,2009.

[2]严蔚敏,吴伟民.数据结构(C语言版).北京:清华大学出版社,2002.

上一篇:鉴定方法下一篇:检校技术