控制代码(精选十篇)
控制代码 篇1
今天信息化已经深入到生活中的方方面面。而计算机程序是由人所设计和编写测试的, 人的工作本身存在风险和不确定性, 这样就产生了软件缺陷。由于编码问题造成的软件缺陷[2], 是缺陷产生原因之一。有统计证明[1], 在整个软件开发生命周期中, 30%到70%的代码逻辑错误和编码缺陷是可以通过静态代码分析[4]来发现和修正的。应用软件源代码静态分析, 其特点是拥有程序源代码 (分已知源码和未知源码) , 但是并不实际执行源码, 对程序静态特征进行提取和分析, 发现潜在的缺陷错误。过程蓝图[3]是一种可视化建模语言, 其具有三层外部视图和统一结构的可视化行为过程分析、详细设计和构造。其本质是一颗抽象语法树, 它包括了概念层 (ACSD) [3]、逻辑层 (ALSD) [3]、实现层 (AISD) [3]三层描述和控制流与数据流二级映射。本文的目的在于对软件程序代码进行静态分析, 通过切片算法对程序切片后, 利用过程蓝图产生抽象逻辑结构图和抽象实现结构图即抽象语法树[3]。利用抽象逻辑结构图消除与控制流和数据流无关的冗余代码, 提取程序控制流特征进行分析, 发现潜在的错误或漏洞。
2 静态代码分析概述
软件开发过程中, 对代码的分析有两种形式。动态分析是指检测代码被全面执行的情况下, 发现的是运行时错误。这种方式一般在软件开发后期, 代码被整合成可运行代码时才能使用。然而系统的软件测试和bug修复很耗时间, 成本昂贵。相应的软件的检查在程序完成之前就应该进行。
静态分析[4], 是指不运行目标代码, 对描述软件在代码中的结构, 对程序的静态信息进行提取, 仅通过分析源代码的结构、语法、过程、接口等来检验程序的正确性, 找出代码的隐藏错误和缺陷, 例如空指针引用, 递归错误等等。针对执行对象的不同分两种, 一种是通过代码同行或者白盒测试人员进行code review, 依赖于代码评审人员的个人经验。另一种是通过自动化错误模式匹配, 使用静态代码检查工具进行检测。逻辑错误是由于程序开发者没有按照程序设计者的思路来实现程序, 这样导致程序可正常运行, 不提示出错, 但结果与要求的不一致。较难以发现。因此, 我们应该在自动化工具的基础上, 更加发挥好人的逻辑思维方式, 对代码进行人工走查。当然这是一个费时和费力的工作。而自动化工具Findbugs[4], Jtest等, 对代码进行编码规范的检查及编程风格检查, 或者使用预定义的缺陷模式和源代码进行比对, 迅速匹配发现与缺陷模式匹配的代码错误或者软件缺陷。但由于由于程序的机械性, 可能存在虚警和漏警的情景。不论是人工对代码进行静态走查, 亦或是通过自动化工具进行错误模式匹配来发现缺陷, 所有的分析工作都是在対源程序进行词法语法分析, 生成语法分析树的基础上进行的。
3过程蓝图抽象语法树概述
过程蓝图[3], 是一种可视化过程建模语言, 它可用于分析阶段、设计阶段和实现阶段对行为过程进行描述, 实现无缝对接, 形成可视化的过程制品文档。如抽象概念结构图, 抽象逻辑结构图和抽象实现结构图。
过程蓝图一些相关基本概念介绍如下:
1.动作域, 行为的基本单位, 由三部分组成:
动作执行存在时序关系, 类型多样, 有可能会改变系统状态。
2. 数据流, 两个动作间的数据流动, 能有效控制动作的有序,
由此看出数据流其实是一个控制依赖, 是一种隐式的控制流。
3.控制流, 在同一个过程中, 表示两个动作之间的关系, 前驱动作和后继动作。
4. 过程, 以一个单元为单位执行的一系列动作集合, 相对于一个类而言的某个方法体。过程的行为, 由多个相关动作来决定。
5.基本概念关系模型, 采用树形结构, 对行为过程进行静态建模[3]。
控制类型标识符, 用来描述动作的类型, 循环, 顺序, 亦或是选择。
下面给出本文实验用过程蓝图示例, 折半查找算法以及对应的抽象语法树:
由上述蓝图示例, 可知, 过程蓝图从本质上来说, 就是程序过程的抽象语法树[6], 是对程序的一种中间表示形式, 在程序分析和程序模式识别领域有广泛应用。
4 过程蓝图生成控制流图的应用
4.1 程序切片
程序切片, 就是程序内部的相互之间的关联, 来将程序进行分解, 只针对分解过后的程序切片进行研究。最影响项目上线的模块是最需要关注和测试的, 优先级是最高的。已经上线的项目, 只要对遗留问题和线上新发现的严重问题, 或者缺陷库中搜集到的问题, 进行代码静态分析, 来定位问题所在。不论是新项目还是老项目, 第一步, 需要缩小分析的程序范围, 对程序进行切片处理, 去除无关代码和噪音代码, 提高静态代码分析的效率。
那么如何对程序进行切片, 这里我采用的是M.Weiser切片[5]是最早提出来的静态切片。
切片 (slice) 准则:S=<X, V>表示, X指程序中的某个检测点, V表示与检测点相关的变量集子集。
切片的获取:通过在程序Pro中删除0条或者多条无关语句获得与检查点X相关的程序片段。
采用程序切片, 不但可以针对某个测试点进行静态分析, 减轻工作量, 减少无关代码干扰。而且在程序调试过后, 回归测试只需要针对对被修改的切片代码所影响代码的进行。减轻测试工作量, 缩短测试周期。
将程序进行切片以后需要进行结构化, 生成抽象语法树, 便于理解和进行模式匹配。
4.2 构造抽象语法树
程序代码是一种非结构化的文本类数据, 不利于对大规模程序的理解和分析。所以, 在进行静态分析前, 需要对代码进行预处理。为了对程序行为进行理解, 首先需要构造程序行为模型, 将程序行为可视化。
程序可视化即将无结构文本类型代码抽象成图形的形式, 即本文的抽象语法树。
本文所用基于过程蓝图的抽象语法树定义如下:
Tree= (Ns, M) .
Tree表示抽象语法树, Ns为树的节点集合, 坌n∈N Ns= (Tree, n) , M为树的节点及其子节点的映射集.
抽象语法树Tree必须满足如下树条件定义:
1) Tree有且仅有一个根结点, 根结点无父结点。
T1:埚ROOT∈Nsget Parent (Ns, ROOT) ={} ( (U-nique (Ns, ROOT) ) .
2) 根结点以外, 其他结点有且仅有一个父结点。
|get Parent (Tree, n) |=1.
3) 任何结点都不是自己的祖先。
相关函数定义如下:
get Parent (Tree, x) :获取x节点的父节点集
get Ancestor (Tree, x) :获取x节点的祖先节点集
get Child Nodes Num (Tree, x) :获取x节点子节点数
Unique (Tree, x) :树上最多仅有一个n结点
Sequence (S) :S集内元素次序
抽象语法树控制节点构造见如下表所示:
由图2和表1, 我们知道抽象语法树的由节点组成, 不同节点分别代表了不同的控制流结构。+表示顺序, *表示循环, o表示选择, ?表示双项选择或者多项选择, &表示并发, e表示异常处理分支。由此, 我们便对程序进行了可视化, 通过抽象语法树了解了程序意图。
了解了程序意图后, 可根据程序特征, 自动生成控制流图, 为静态代码控制流乃至数据流做可视化分析。
4.3 遍历语法树生成控制流图
4.3.1 控制流图的定义
控制流图[8], 是一个有向图, 是程序执行路径的展现, 该图满足如下条件:
1) 包含唯一的入口 (Entry) 模块和出口 (Exit) 模块
2) 控制流的流动, 从模块1到模块2, 采用一个四元组来表示:C12= (Entry, Ns, Es, Exit) ;
入口模块Entry, 出口模块Exit, 途径节点集Ns={n0, n1, n2, ..., ni} (i∈N) , 途径节点的边集合Es={<ni, nj>, <nj, ny>, ...} (ni∈Ns, nj∈Ns, ny∈Ns) 。
从Entry到Exit的节点序列, 就是一条执行路径的描述, 即控制流图。
4.3.2 抽象语法树遍历算法
控制流图生成, 首先需要遍历抽象语法树, 获取语法树中各个节点及其之间相互关系。遍历算法描述如下:
4.3.3 控制流图的生成
抽象语法树的节点分顺序节点 (SEQ) , 循环节点 (WHILE, FOR, DOW) , 单项选择节点 (IFT) , 多项选择节点 (IFE, SWICH, CASE) , 并发节点 (SYN) , 异常处理节点 (TRY, CAH) , 基本节点 (类型声明等DCL, OPE, LAB等) , 跳转节点 (BRK, CON) 等。控制流的生成, 在有了抽象语法树之后变得异常简单。根据抽象语法树的节点类型, 自动生成控制流[8]。
控制流生成算法描述如下:
每一个节点用一个二元组表示N= (A, P, S) ;
A表示节点属性, 如节点类型, 节点包含的条件, 节点所执行的操作等;
P表示与父节点关系, 继承父节点所传递数据, 顺序执行, 还是属于父节点的某个选择分支, 或者需要返回父节点继续执行。
S表示与子节点关系, 根据顺序执行子节点内容, 传递数据, 或是据控制条件跳转到某个子节点等。
部分节点处理方式描述如下:
顺序节点控制流:
SEQ--前置条件A
--语句B
--语句C
选择节点控制流:
IFE--选择条件O
--语句A
--语句B
ELS--语句C
循环节点控制流:
WHL--循环条件A
--语句B
--语句C
4.3.4 控制流分析
获取了静态程序代码的控制流图后, 我们需要对其进行分析。通常控制流分析方法[9]在过程内主要有三种。
1) 循环优化。在程序中, 程序循环优化是值得改进的点。所以通过遍历语法树, 找出所有图中循环进行标记, 分析, 作出优化方案。
2) 控制树优化。在抽象语法树, 生成控制流后。我们分析的是子程序的整体结构, 找出其中可嵌套的结构分解出来, 即区间, 此区间包含的控制流图就是一棵控制树。
3) 结构分析优化。结构分析也是建立在区间分析上的一种精细分析。目的在于对基于抽象语法树的程序数据流进行分析。处理程序的不规则区域, 识别控制模式结构。
通过抽象语法树得到的控制流图后, 我们可以验证代码的结构是否正确。在控制流图中代入测试数据, 可以分析程序执行路径中, 任一特定时刻数据对象的状态。我们通过基于区间的控制树, 可很快地得到数据流信息进行分析, 也就是人们常说的路径分析[10]。对识别因程序导致的数据流变化信息更容易, 有利于执行控制流变换。
5 控制流程图自动生成效果验证
为了评估本文提出的根据抽象语法树, 自动生成控制流图进行代码静态分析是否可行。本文设计了控制流图自动生成工具CFGtool。并用此工具对折半查找算法进行抽象语法树转化后的PBD文件进行控制流图自动生成, 效果图如下所示:
6 结论
本文详述了在过程蓝图的基础上, 由静态源码生成抽象语法树, 经过程序切片, 将部分需要优化的代码进行抽象语法树分析, 同时详述了如何通过抽象语法树生成可靠, 直观, 易分析的控制流图。基于过程蓝图的抽象语法树, 生成程序控制流图, 将非结构化代码程序进行了可视化, 结合代码分析技术, 大大提高了测试效率和质量, 为在软件开发前期发掘更多程序漏洞打下良好基础。控制流图和抽象语法树的存在, 为验证代码结构的正确性提供了捷径, 降低了代码理解难度。在控制流中带入数据进行数据流分析, 能更容易识别程序导致的数据变化, 对于解决程序逻辑问题, 发掘深层次内存泄露, 越界, 以及发现程序嵌套混乱等问题提供便利。方便了人工对代码进行静态审查, 显著保证软件质量。
摘要:对非结构化的程序代码进行理解分析对代码理解能力不强的测试人员存在一定难度。为了减轻静态代码分析的难度, 本文首先采用程序切片算法将程序进行预处理, 利用过程蓝图对代码进行可视化操作形成程序的中间表示形式抽象语法树。然后对其构造和特点进行研究, 提出抽象语法树的遍历算法。通过该算法得到程序的控制流图。最后, 利用控制流图和控制树, 对静态代码进行高效的控制流分析, 监测这些代码是否满足安全性、可靠性等方面的指标, 为检测和处理软件缺陷降低成本。
关键词:过程蓝图,静态代码分析,抽象语法树,控制流,控制树
参考文献
[1]张云岗, 刘养茂.软件测试技术浅析[J].技术与市场, 2011, (02) :21-22.
[2]软件缺陷[EB/OL].http://baike.baidu.com/view/107502.htm?fr=aladdin, 2013-11-12.
[3]刘建宾.过程蓝图设计方法学[M].北京:科学出版社, 2005:21-69.
[4]赵博, 张淼, 牛少彰.基于静态代码分析的JSP安全漏洞检测系统的研究与设计[A];2011年通信与信息技术新进展——第八届中国通信学会学术年会论文集[C], 2011年.
[5]李必信, 郑国梁, 王云峰, 李宣东. (进一格) 一种分析和理解程序的方法—程序切片[J].计算机研究与发展.2000, 3:284-286.
[6]基于Java语言的抽象语法树的创建与遍历[J].长沙大学学报, 2004, 12:50-53
[7]Juvekar, S., Burnim, J., Sen, K.:Path Slicing per Object for Better Testing, Debugging, and Usage Discovery.Technical R eport N o.UCB/EECS-2009-132 (2009) .
[8]C程序控制流程模型的提取技术与实现[J].计算机科学, 2014.5:208-213.
[9]刘磊.程序分析方法[M].北京:机械工业出版社, 2013:33-40.
控制代码 篇2
关键词:Flash;课件制作;动画播放;多媒体课件
中图分类号:G433 文献标识码:B 文章编号:1673-8454(2009)18-0063-01
一、“通用”的含义
标题中的“通用”是指:无论何种类型(逐帧动画、形状渐变动画、运动渐变动画以及混合型动画)的Flash动画播放控制的制作方法相同,使用的代码相同。
二、掌握通用制作方法与通用代码的意义
目前,相当数量的教师采用Flash制作课件,并将做好的SWF格式的课件插入到PPT演示文稿或网页中进行教学。然而,在进行教学时SWF格式的课件不能在PPT演示文稿和网页中得到有效的控制,因而造成教学中SWF格式的课件中一些细节难以让学生观察清楚,从而降低了花费很大工夫制作SWF格式课件的意义。当然,利用PowerPoint中的VBA或在网页中添加VBScript脚本的方法也能对SWF格式的课件播放进行有效控制,但对很多未接触过VBA和VBScript的一线教师来说都是无法实现的。
三、制作方法与步骤
本文通过一个实例介绍将Flash动画播放控制嵌入到Flash课件中的通用方法与通用代码。
图1是豹子奔跑动作的8张分解图片。
1.首先完成动画的制作
完成豹子奔跑动画的时间轴如图2所示。
2.控制动画的播放
(1)在时间轴上添加一个层,并命名为“控制”。时间轴如图3。
(2)选中“控制”层上的8个帧,并从Flash的“公用库”的“按钮”类元件中选出分别表示“播放、暂停、前一帧、后一帧、返回到动画开始帧”的5个按钮实例(用何种按钮是不受约束,由自己的意愿决定)。将5个按钮实例放置到舞台的合适位置。此时,舞台如图4。
(3)为每个“按钮实例”添加代码。舞台上从左至右的5个“按钮实例”,在控制动画播放时所起的作用是:播放、暂停、下一帧、前一帧、返回到开始帧。因此,分别选中每个按钮实例,并在动作面板(图5)为5个按钮实例添加代码分别如表1所示。
控制代码 篇3
关键词:车身控制器,模型及自动代码生成
1 面临的挑战
车身控制器通常具有以下特性, 诸如中控门锁控制, 遥控无钥匙进入, 轮胎压力监测, 防盗报警, 内部/外部灯光控制, 前/后的雨刮和洗涤控制, 电池低电压保护, 低功耗模式功能, 后除霜及整车网络和网关功能。但不同的汽车主机厂, 不同的汽车平台要求截然不同。我们开发汽车产品软件, 必须要确保软件质量。但是过去工程师们的工作主要依赖于消耗大量的时间和对手写代码的完善来保证质量。由于项目很多, 每个工程师都不得不同时开发几个项目, 作为项目负责人, 我决定寻找新的开发手段。
2 解决方案
2.1 软件架构分析
我们设计的车身控制器是面向全球汽车厂家, 所以我们的软件架构要符合AUTOSAR标准。AUTOSAR标准 (汽车开放系统架构) 是一个开放和标准化的汽车软件架构, 是由汽车制造商, 供应商和工具开发商共同开发的。根据对不同层的标准化接口, 将实现以下技术目标:模块化, 可扩展性, 可移植性和功能重用。在我们的设计中, 软件在框架上总体可分为3层。最上层是应用层, 然后是运行时环境接口 (RTE) 层, 接下来是软件基本层。一般情况下, 软件的底层变动不是很大, 不同的客户功能需求都体现在应用层上。如果用手写代码, 每次客户更改, 都需要更改软件设计, 代码, 然后再验证, 这样既浪费人力物力, 又增加了潜在错误的机会。基于模型的设计由于具有可重复的快速设计, 通过缩短设计时间而节约了成本, 最后的设计更接近于预先设计所期望的系统性能, 功能, 特点以及开发进度。这就使我想到把模型及代码自动生成技术应用到产品的应用层上。
2.2 基于模型的软件开发工具和流程
在产品软件开发过程中采用建模和自动代码生成技术的成功与否依赖于开发流程。这包括需求管理, 建模和仿真, 自动编码, 验证等流程规范。这一过程的效率取决于选择和使用合适的工具链。
2.3 基于模型设计的软件开发步骤
2.3.1 模型设计
模型作为初步设计, 基本包括需求分析, 决定输入和输出和实现算法。在模型设计过程中, 要遵循两点原则:沟通明确和设计模块化。
2.3.1.1 沟通明确
基于模型的设计, 它的前提是一个可执行文件, 以图形化模型作为设计资料库。在设计和实施中使用图形图表而不是文本代码, 从而提高了团队及内部之间的沟通。
2.3.1.2 设计模块化
软件开发者知道, 通过建立明确和简单的模块可以减少软件的复杂度。最新的软件开发技术的设计告诉我们, 在支持所需的功能的同时, 设计应尽可能简单。标准的软件度量, 如“圈复杂度”就是基路径, 通过软件模块设计以减少路径数量。
2.3.2 自动代码生成
一旦模型建立和经过完整测试后, 准确的实时的嵌入式代码软件就可自动生成。与传统的手工编码相比既节省了时间又降低了成本。嵌入式代码自动生成是从根本上改变了我们工程师的工作。我们不再手写数千行的代码, 而是自动生成。
2.3.3 测试与验证
检验和验证技术适用于整个开发过程, 依据产品需求来创建设计和测试用例。通过验证模型测试结果, 以确定产品需求被正确地实现。基于模型的设计在软件开发周期的早期进行验证, 暴露设计缺陷, 需求的不充分, 测试的不完整和不必要的设计构造, 以减少后期错误检测的风险。图1显示了如何一起使用测试案例和设计模型, 以便在开发过程中不断进行验证。
3 结束语
本文以车身控制产品为例, 详细地阐述了基于模型设计的软件开发流程, 包括模型建立, 代码自动生成和测试等, 从中我们可以看到基于模型设计使用的开发工具及四种关键技术。基于模型的设计, 可在开发阶段早期对模型进行校验, 有需求问题及早发现, 避免了常规开发到代码集成测试才能发现错误。同时采用自动代码生成, 避免了由于手写代码所引入编程错误的风险, 从而最终提高了产品质量和降低了开发成本。
参考文献
[1]张晓华.系统建模与仿真[M].北京:清华大学出版社, 2006.
[2]张亮.MATLAB7.x系统建模与仿真[M].北京:人民邮电出版社, 2006.
控制代码 篇4
见截图先:
点击这里下载原文件
大家好,,,,第一次写这个东东~~心理好紧张挖````
大家了很多的FLASH飞机游戏,,,但是真正象“灵动碰射”那样完整的少之又少,大部分都是没
有BOSS的,,,只是在一个画面内循环出现敌机,趣味自然降低了不少...
近来FLASH8游戏版块新教程太少,我也写个教程,,算是对FLASH8游戏版块的一个回报:-)
在这里我只谈做BOSS的制作思想,其他的主角啊,,敌人(小兵)就不包括其内了,,,FLASH8关于这方面的教程应该有很多,大家可以去找一下
好了,废话不多说了,,,总而言之,,,我的方法不是最好的,,,但希望可以给菜鸟一些鼓励和信心(包括我),,做出自己的象“灵动碰射”一样的游戏来:-)
点击下载源文件
大家好,,,,第一次写这个东东~~心理好紧张挖````
大家了很多的FLASH飞机游戏,,,但是真正象“灵动碰射”那样完整的少之又少,大部分都是没有BOSS的,,,只是在一个画面内循环出现敌机,趣味自然降低了不少...
近来FLASH8游戏版块新教程太少,我也写个教程,,算是对FLASH8游戏版块的一个回报:-)
在这里我只谈做BOSS的制作思想,其他的主角啊,,敌人(小兵)就不包括其内了,,,FLASH8关于这方面的教程应该有很多,大家可以去找一下
好了,废话不多说了,,,总而言之,,,我的方法不是最好的,,,但希望可以给菜鸟一些鼓励和信
心(包括我),,做出自己的象“灵动碰射”一样的游戏来:-)
原理其实很简单:
BOSS是独立的,,,他自己是一个单独的MC,,,这个MC里面有很多桢,,,每一桢都是它的一个“行为”,,,比如: 向主角移动拉,,,,狂发子弹拉....发超必杀攻击拉....自己死亡的动画拉,,,,然后这个MC的第一祯,,,是一个随机函数,,,随机转到BOSS的MC里面的一祯,,,那么BOSS就会响应的做出行为,,,怎么样??是不是很简单呢?那么开启你的FLASH ,开始正式的制作吧,呵呵
1:舞台上MC的布置:
主场景一共就两个MC,,,,一个是BOSS的子弹,,,在场景里面名字叫做bosszd,,,另外一个就是BOSS拉,,,理所当然,,,,它在场景里面的名字就叫它BOSS吧!
2:BOSS最外层的事件处理器:代码如下:
onClipEvent (load) {
this._alpha = 0;//刚出来的透明度是为0的,,,目的是让它出场有个平滑的效果
}
}
onClipEvent (enterFrame) {
if (this._alpha<100) {//也就是上面所说的拉,,,初始化的时候BOSS的ALPHA为0,,,当它小于100的时候,让他从最右边(场景外)飞进来,,,直到ALPHA为100的时候就暂时停止下来了
this._x -= 9;
this._alpha += 5;
}
if (this._x<=354) {
this._x++;
}
if (this._x>=495) {
this._x--;
}///这两句是让BOSS限制在场景右方运动,,,如果跑到最左边了那么游戏者就表活了噢:-)
}
3.随机运动起来吧!!!BOSS!!!
双击进入BOSS的MC,第一祯代码:
onClipEvent (load) {
this._alpha = 0;//刚出来的透明度是为0的,,,目的是让它出场有个平滑的效果
}
}
onClipEvent (enterFrame) {
if (this._alpha<100) {//也就是上面所说的拉,,,初始化的时候BOSS的ALPHA为0,,,当它小于100的时候,让他从最右边(场景外)飞进来,,,直到ALPHA为100的时候就暂时停止下来了
this._x -= 9;
this._alpha += 5;
}
if (this._x<=354) {
this._x++;
}
if (this._x>=495) {
this._x--;
}///这两句是让BOSS限制在场景右方运动,,,如果跑到最左边了那么游戏者就表活了噢:-)
}
3.随机运动起来吧!!!BOSS!!!
双击进入BOSS的MC,第一祯代码:
onClipEvent (load) {
this._alpha = 0;//刚出来的透明度是为0的,,,目的是让它出场有个平滑的效果
}
}
onClipEvent (enterFrame) {
if (this._alpha<100) {//也就是上面所说的拉,,,初始化的时候BOSS的ALPHA为0,,,当它小于100的时候,让他从最右边(场景外)飞进来,,,直到ALPHA为100的时候就暂时停止下来了
this._x -= 9;
this._alpha += 5;
}
if (this._x<=354) {
this._x++;
}
if (this._x>=495) {
this._x--;
}///这两句是让BOSS限制在场景右方运动,,,如果跑到最左边了那么游戏者就表活了噢:-)
}
3.随机运动起来吧!!!BOSS!!!
双击进入BOSS的MC,第一祯代码:
onClipEvent (load) {
this._alpha = 0;//刚出来的透明度是为0的,,,目的是让它出场有个平滑的效果
}
}
onClipEvent (enterFrame) {
if (this._alpha<100) {//也就是上面所说的拉,,,初始化的时候BOSS的ALPHA为0,,,当它小于100的时候,让他从最右边(场景外)飞进来,,,直到ALPHA为100的时候就暂时停止下来了
this._x -= 9;
this._alpha += 5;
}
if (this._x<=354) {
this._x++;
}
if (this._x>=495) {
this._x--;
}///这两句是让BOSS限制在场景右方运动,,,如果跑到最左边了那么游戏者就表活了噢:-)
}
3.随机运动起来吧!!!BOSS!!!
双击进入BOSS的MC,第一祯代码:
stop;
a = random(8)+2;
gotoAndStop(a);
//主要是取得一个随机数,,然后跳转到这个祯,,从而可以随机出BOSS的不同行为
终于开始发射子弹拉!!!第2祯代码:
为了形象,,,在这一祯,BOSS已经不是一个静止的图片了,,为什么?它在发射子弹!!!
我用了一个很简单的循环小动画MC来表示他在发子弹
这个发射子弹的MC事件处理函数如下:
onClipEvent (load) {
count = 0;//初始化一个行为持续计时器,,,我们叫用来控制当前这个动作(发射子弹动作)的持续时间
time = 0;//初始化子弹间隔计时器,,,
}
onClipEvent (enterFrame) {
if (_root.plane._y<=110) {
_root.boss._y += 3;
}//让BOSS在发射子弹的同时,,,进行一个Y方向上的移动,,,这样不至于让它太呆板
time++;
count++;//既然是计时器,,,他当然是不断的自增拉...模拟时间的流逝
if (time>=5) {
duplicateMovieClip(_root.bosszd, “bosszd”+count, count+11100);
time = 0;//当子弹间隔计时器到了5,马上让他清0,,,达到子弹的循环复制
}
if (count>=25) {
_root.boss.gotoAndPlay(1);
}//行为持续计时器大于25的时候,,,让他到第一祯,,,进行下一次的随机调用行为
}
关于子弹,,它是和BOSS完全独立的,,,也就是他有自己的方法,,,他是固定的,,,代码如下:
onClipEvent (load) {
if (String(_name) != “bosszd”) {
this._x = _parent.boss._x-104;
this._y = _parent.boss._y+160;
}
//这两句就是初始化子弹刚出现的位置,,,对他的位置进行调整,,我这是从BOSS的枪口出来,,如果你喜欢也可以把X,Y再设大点,,让它从BOSS屁股出来都可以
}
onClipEvent (enterFrame) {
if (String(_name) != “bosszd”) {
//如果这个实例的名字不为BOSSZD,,就执行里面的函数其实这个MC本身是不会执行代码的,,,说白了它只是一个摸版,,让BOSS来复制用的,,复制出来的名字是BOSSZD+“子弹记数器”,,,
this._x -= 10;//BOSS子弹的运动路径,,既:从右向左运动
if (this._x<=0) {
removeMovieClip(this);//如果子弹超出屏幕,,,删除掉...
}
}
}
好了,,,这只是一个其中的行为,,,其他的只要是发射子弹的行为,,,制作思路都是一样的,,,把其他的发射子弹行为放在其他的祯上面就能实现随机的发射不同类型的子弹,,,比如,,发散弹拉,,,发开棉花子弹拉````发超大拉,,,恩?发超大??那么下面我再叙述下这个行为吧
4.快点发超必杀吧!!!否则你不配叫BOSS这个名字!
这个看起来很深奥,,其实如果你看懂了上面的东东,,应该不用我说你都能想到该怎么做了...
这里我不再罗嗦,,,否则又要给人拍砖,,,,简单的讲解下思路我做的这个BOSS发超大的时候会全身一亮,,,画面一闪,,,然后一道激光射出,,,这一切其实只是一个MC,,,我相信大家都知道这个动画该怎么做,,,何况大家都能设计出自己喜欢的BOSS发超大时候的动作,,,我不在这般门弄斧拉:-)
要注意一点的地方就是:激光在射出的过程中是用一个形变动画做的,,,激光也算是一种子弹
所以他也要检测与主角的碰撞,,,所以,,要在这个激光上加上
if(this.hitTest(_root.主角){_root.主角.endlife()}//如果射中了主角,,主角就挂了
5,举一反三,,,设计属于你自己的BOSS吧!!
这里我虽然只讲了BOSS的两个动作,,但是要延伸动作,,并不难,,,无非就是在多些帧,,,在这些新加的祯上再去阐述BOSS的行为,,,,比如,,,第3帧发散弹拉....第4帧发开花弹....第5帧BOSS突然向主角做自杀试的碰撞拉,,,,多参考参考彩京系列吧....
一般在最后一帧再加上BOSS死亡的动画,,,到它的HP=0就跳到这一祯,,..
6.尾声...
到这里为止,,,差不多关键的地方都叙述完了,,,也花了我将近两个小时的时间,,,汗....
总之,,希望大家看了这个后有所收获,,,创造出自己喜欢的BOSS来!!!
一行代码改变营销 篇5
这个故事中有两个重点,“一行代码”和“焕然一新”。
从HTML5梦工厂开始计划移动版到最后上线,只花了一个星期。而梦工厂的工程师惟一的工作就是在模板里引入了一行云适配提供的JS代码。工程师们惊喜地发现,虽然手机性能比电脑要差很多,但用手机打开加载了云适配代码的网站,却比原先没有加载额外代码的网站速度快了很多;同时,网站导航更清晰,还加强了互动内容。最重要的是,无论在iOS还是Android设备,无论屏幕的尺寸如何,移动网站都完全同步于PC网内容。
今年6月,中国手机网民数量已经飙涨到4.64亿。随着互联网的发展,人们的生活习惯、消费习惯都发生了巨大变化。对于企业来说,当互联网在大众生活中的影响力不断上升,一片全新的营销战场也正在开启。
网站移动化
智能移动设备的普及,越来越多的人使用手机、平板设备浏览网站、查阅资料、在线购物等,当互联网全面进入移动化的时候,网页似乎慢了一步。
在移动开发技术最初经历的WAP阶段,手机操作系统没有统一的平台和技术标准,网页通过WAP技术来简单浏览图片和文字。如今,林林总总的移动设备尺寸不一,网站在做移动版时,需要针对不同设备不停调试;HTML5让网页有更多特效和交互,例如GPS和摄像头等功能,这都成为手机浏览网页的新挑战。
移动网页的体验越来越差,社交媒体、搜索引擎等工具逐渐取代了网页,成为营销的主要工具。有数据显示,当用户用手机打开PC版网站时,打开字太小、速度慢、导航复杂等糟糕的手机浏览体验可能导致79%的用户会流失,这对企业来说是巨大的损失。所以,网站移动化迫切需要CMO们重新考量,如何通过一种新的方式,使PC网页在手机上达到最佳的显示效果,也使用户在不同的设备上体验超越PC的阅读体验。
针对这样的需求,一种新技术应运而生,提供这一技术的是美通云动(北京)科技有限公司,业内人更愿意以其技术来称呼它:云适配。
“云适配可以让企业花最少的成本,做最大化的营销,快速登录移动市场,打一场漂亮仗。”云适配创始人兼CEO陈本峰曾在互联网标准组织(W3C)香港实验室从事互联网标准研究,并发明了一项手机浏览技术的国际专利。云适配就是基于这一技术并结合最前沿的HTML5技术,可以帮助企业快速将桌面版网站适配到iPhone、安卓、Windows Phone、黑莓、塞班等各种移动设备终端的屏幕上。不仅显著地提高了企业网站的用户体验以及销售转化率,而且大幅度地节省了企业开发和维护移动网站的费用。
陈本峰介绍,首先,云适配专利技术一次性打包解决屏幕尺寸碎片化、屏幕分辨率不统一、浏览器分化三大移动终端适配问题;其次,移动网站网址不变,可实现一份费用双渠道推广,不用多花一分推广费就能快速拥有新用户;第三,移动网站将完全同步于PC网内容,自动实时更新。更为惊艳的是:网站还支持多渠道营销推广,无论搜索引擎、微博、微信还是App均能读取。
目前,微软亚太研发集团、联想、浪潮、高露洁等知名企业和美国Bellevue政府、中关村管委会、西安交警等政府机构,都已悄然通过云适配的“一行代码”开启了全新的移动之旅。
一行代码的神奇之处
用手机打开联想中国的网页,你会发现,页面延续了PC版的风格,但比PC版更清新、分类更明确、导航更直接。在点开一个产品的时候,产品图、价格和细节一览无遗,效果可以跟App界面媲美。而在使用云适配前,在手机上打开网页和PC版一模一样,文字和图像非常小,看不清楚。
这也是云适配的核心优势,“一行代码”。
很多人刚听到云适配技术时都觉得不可思议,只用一行代码就可以实现各种屏幕?其实,云适配并非只是一行固定的代码,一行代码只针对一个界面。这行代码背后是很复杂的设计,使用了很多云端技术和浏览器渲染技术。通过云适配服务将网页匹配到相应的设备上。
“作为一个服务业务,一行代码只是产品的表现形式,如果这一行代码脱离开它背后的云服务,代码就一点价值都没有了。”陈本峰表示。
对于曾在微软美国技术总部任职,并参与了IE8和IE9研究和发布的陈本峰来说,网页渲染机制是他的看家本事,因此在云适配研发时应用了很多浏览器渲染机制,并结合强大的云计算的能力,让网页能够有能力自己收缩、适配不同的移动终端。
经过云适配技术创建的移动网站,网址不变、打开迅速,在实时同步PC网站内容更新的同时,可以实现动态页面的功能,如注册、登录、搜索、电商支付等。而这些都源于公司的自主核心技术,是目前市场上其他网站移动化服务无法完成的。
对云适配来说,高端客户对网站设计以及用户体验的要求相对较高,对网站服务的稳定性、可靠性需求也比较强烈。例如联想就很重视在手机网站上如何同步实现高端的品牌形象和良好的用户体验,政府和大学则对安全稳定性要求较高。目前,云适配服务都依托在微软的Windows Azure平台上,对他们来说,微软云平台在安全性和稳定性上十分有保证;而中小企业更多希望能够快速创建同步于PC端的手机网站,如果自行开发需要好几个月时间,这时云适配就是最佳的解决方案,只需要一两周就解决了问题。
当可口可乐推出时,没有人知道“可乐”是什么,是可口可乐开创了“可乐”的概念。而陈本峰的愿望,是希望将“适配”的概念植入人们脑中。“在互联网大爆炸的年代,人人都想拥有一个高效的移动网站。云适配的目标是让云适配成为网站开发者的一个必备工具。也就是希望网站开发者能把自己的精力放在自己的核心业务上,而不用考虑网站适配的问题。”
对比
传统手机建站云适配
不利推广:传统手机网站使用新的网址,输入原网址不能自动适配,需要单独推广新网址,使推广成本加倍。便于推广:云适配使用原网址,通过搜索引擎、微博、微信等平台打开原网址会自动根据访客使用机型进行适配,非常有利于网络推广。
开发成本高:需要开发新的数据库接口,需要开发手机网页,需要开发手机网站的管理后台;开发成本低、周期短:云适配直接在原来PC网站基础上做适配,只需插入一行云适配代码,您就可以快速便捷地拥有手机网站;
兼容难度高:目前市面上已有3000多种智能手机,需要调试对各种不同机型屏幕、分辨率、浏览器的兼容性;兼容性好:云适配已经调试了针对市面上所有主流机型的兼容性,覆盖4亿手机网民、3000多种智能手机;
维护成本高:长期同时需要维护PC网站和手机网站的更新以及后台,需要维护对新手机机型屏幕的适配性;维护成本低:无需另外维护。PC 网页更新时,手机网页自动适配,云适配会定期增加对新手机机型的适配支持;
风险高:开发新的数据库接口和管理后台可能要对数据库做修改,可能导致目前PC网站无法正常工作;风险低:插入云适配代码不会对PC网站造成任何影响,若停止云适配服务,输入原网址会显示原PC网页;
扩展性差:将来支持平板、智能电视等更多设备,需要重新开发多个网站,需要庞大的支出。扩展性好:只需要云适配升级插入的代码,就可以立即支持更多设备屏幕, 简单快捷扩展。
源代码 篇6
穿越穿越是穿越时间和空间的简称。它是指某人因为某种原因,经过某个过程(也可以无原因无过程),从所在时空(A时空)穿越到另一时空(B时空)的事件。
剧情简介
在阿富汗执行任务的美国空军飞行员科特,史蒂文斯上尉(杰克.吉伦哈尔JakeGyllenhaal饰)突然惊醒,发生自己在一辆高速行驶的列车上,而他的身边坐着一个素不相识的女子克里斯蒂安(米歇尔·莫娜汉MichelleMonaghan饰)正在与自己讲话。科特不知自己为什么会在这辆车上,而且他发现自己居然是以另一个人的身份存在,正当他迷惑不解的时候,列车上忽然发生爆炸……
任务的美国空
恶意代码攻击原理剖析 篇7
随着计算机技术的发展, 恶意代码开发技术和网络防范技术也在不断升级。研究恶意代码的设计技术, 掌握恶意代码的行为模式, 成为网络安全防范的基础工作, 也是网络安全防范重要工作之一。恶意代码技术和网络防范技术的研究是相辅相成的两项工作, 通过掌握恶意代码的关键技术, 熟悉恶意代码的工作原理和工作流程, 可以提高对恶意代码分析工作的效率, 进而可以更快更全面对系统进行维护, 对恶意代码进行查杀。
1 恶意代码概述
恶意代码是一种可以中断或破坏计算机及网络的程序或代码。一些恶意代码可以将自己附在宿主程序或文件中, 而另外一些恶意代码则是独立的。虽然一些恶意代码破坏力很小, 但大多数恶意代码可能造成主机系统崩溃, 敏感信息泄露, 消耗主机资源造成系统性能下降, 也可能阻塞网络影响正常工作, 或为攻击者创造条件, 使其绕过系统的安全程序。根据这一定义, 恶意代码可分为病毒、特洛伊木马、蠕虫、逻辑炸弹、恶作剧程序和流氓软件等, 相关描述如表1。
恶意代码行为表现各异, 破坏程度千差万别, 但基本作用机制大体相同, 攻击过程不相同, 如表2所示。
随着恶意代码技术的发展, 各种恶意代码之间的界线已不那么明显。一个恶意代码程序可以具有双重或多重特征, 有些恶意代码可能既是蠕虫又是木马或既是病毒又是木马, 或者同时是病毒、蠕虫和木马的特点。比如CodeRedn就是一个蠕虫木马双特征恶意代码, 它首先采用蠕虫技术, 利用微软IIS的漏洞感染目标计算机, 然后把一个木马程序下载并植入到目标计算机中。多种恶意代码技术相互结合是恶意代码发展的趋势, 这类恶意代码往往具有更大的破坏性, 防范难度也更大。
2 恶意代码实现入侵的相关技术
随着计算机技术的发展, 恶意代码的实现技术也在不断更新和升级, 防护和查杀难度也变得越来越大。其技术主要集中在尽量的隐蔽, 这样才能达到不断的实现预定的破环行为的目的, 归纳起来主要涉及渗透技术, 自启动技术, 自我保护技术, 隐蔽通信, 攻击技术等。
2.1 渗透技术
渗透技术的任务是保证恶意代码能够植入到目标主机中, 可以通过如下方式:感染可执行程序、分区表和数据文件 (如:宏) ;通过移动介质;通过人、社会工程方式;借助于系统和软件漏洞;通过电子邮件、Web网站和网页、P2P文件共享、即时通信工具和ARP欺骗方式等。
2.2 自启动技术
自启动技术的任务是保证恶意代码在受害主机下一次开机启动后也被激活。自启动的方法有很多, 归纳起来主要有:通过服务启动、通过添加注册表启动项启动、通过文件关联启动、通过修改系统配置文件启动、作为其他程序插件启动、通过文件绑定方式启动六种。
2.3 自我保护技术
自我保护技术是使常用的检测工具无法检测到恶意代码的存在, 或者即使检测到存在也无法对代码进行分析和清除。通过自我保护技术可以延长恶意代码的生命周期, 使其入侵的范围和破坏程度增大, 自我保护技术可分为三大类:
2.3.1 反静态分析
(1) 自身隐藏在注册表、重要文件或系统文件夹等隐蔽性很强的位置, 躲避反恶意代码软件的检测。
(2) 加壳/多态技术:是通过一系列数学运算, 将病毒代码或动态链接库进行压缩或加密, 以达到体积变小和加密的目的, 有的恶意代码甚至使用不同的加壳软件进行多次加壳或使用随机密码进行加密, 使加壳前后的恶意代码各不相同, 使反恶意代码软件无法通过特征码识别, 从而加大恶意代码分析的难度。
(3) 变形:恶意代码传播到目标后, 其代码本身或结构在空间上、时间上具有不同的变化, 使同一种恶意代码不同个体各不相同。恶意代码变形发展有四个阶段, 在这四个阶段当中加密病毒阶段、单变形和准变形阶段都是恶意代码在结构或相对位置进行变换基础上使用了加密技术, 而全变形阶段实现了恶意代码真正意义上的变形, 无论代码本身还是代码结构都有变化, 使它的变体之间都各不相同。
2.3.2 反动态跟踪
(1) 进程隐蔽技术
(1) 线程插入:是将要实现的功能程序做成一个线程, 并将此线程插入到合法进程中, 使之作为此进程的一个线程来运行。
(2) 写入动态连接库:把任务代码写入动态连接库文件中, 并把这个动态连接库装载进合法的目标进程当中, 当目标进程执行时, 会调用该动态连接库执行恶意代码设定的任务。
(3) 操作系统是由内核 (kernel) 和外壳 (shell) 两部分组成的, Windows操作系统内核运行于ring 0级, 通常被称为核心级, 拥有最完全最底层的管理功能, 负责一切实际的工作, 包括cpu任务调度、内存分配管理、设备管理、文件操作等;外壳运行于ring 3级, 通常被称为用户级, 是基于内核提供的交互功能而存在的界面, 它负责指令传递和解释。
用户级Rootkit:API函数是WINDOWS提供给应用程序与操作系统的接口, 运行于ring3级, 为了实现系统服务钩挂, 可以修改API导出的函数, 插入跳转指令, 使之执行某个特定函数后转回, 也可以禁止原函数的调用。
核心级Rootkit:代码控制权限达到和内核一样的运行级别, 甚至进入内核空间, 拥有了和内核一样的访问权限, 因而可以对内核指令进行修改, 甚至篡改API, 这样用户级检测无法发现内核操作被拦截。
(4) 阻止或监控系统对进程的检测, 以此来避开检测。
(2) 动态端口:目前, 大多数杀毒软件通过在系统中搜索被打开的端口号, 并与已知的恶意代码的特征端口号加以比较来判断是否有恶意代码正在活动。这种方法对付使用静态端口号的恶意代码十分有效, 但是新出现的一些恶意代码为了躲避反恶意代码软件的检测, 使用了一种动态端口号技术, 这种技术允许恶意代码的使用者自行指定工作端口号, 这就使静态检测端口号的方法无法有效检测出。
2.3.2 反制
为了对抗反恶意代码软件, 有的恶意代码首先对反恶意代码软件系统进行攻击, 使反恶意代码软件无法正常运行或使特征库无法更新。
2.4 隐蔽通信
很多恶意代码都是在控制者的远程控制下执行指定的在特定的时间和环境下的命令, 其远程控制的实质是被控主机 (服务器端) 和控制端 (客户端) 之间传送控制命令和命令执行结果, 为了实现远程控制, 最关键的问题是隐蔽通信, 即怎么通过隐蔽的方式接受命令和发送执行结果, 其实现可以通过以下几种方式:
(1) 直接使用套接字 (socket) 进行通讯控制。一种方式是服务器端侦听, 客户端连接, 这种通讯方式不但容易被发现某一端口被一可执行文件侦听, 并且当客户端连接到服务器端时, 很容易引起防火墙报警。但这种通讯方式要求服务器端必须具有合法的全局IP地址, 这也在很大程度上限制了恶意代码的活动范围。另一种方式是客户端侦听, 服务器端连接, 当服务器端去连接客户端还是要引起防火墙报警, 可以通过线程注入的方式解决。
(2) 隐蔽通道是为了和恶意软件进行通讯, 攻击者必须建立一条非常隐蔽的通信通道。为此, 攻击者常常将通讯端口建立在一些非常常用的通信协议端口上, 像HTTPS或者SSH。
(3) ICMP隧道, 利用ICMP_ECHO和ICMP_ECHOREPLY两种报文, 因为这两种报文中数据段很少被检查, 而且ICMP协议不涉及到端口的概念。从而使得木马在不开端口的情况下就可以进行通行, 加强了木马的隐蔽性。
(4) 使用第三方交互服务进行通讯, 所谓第三方交互通讯服务是指能够提供信息收发和临时存储的服务, 常用的有email和即时通讯服务, 比如IRC等, 这种方式和协议隧道技术非常相近, 不同的是, 它不需要控制者自己提供控制服务, 而是直接使用其他服务提供商提供的服务, 因此这技术能够从更大程度上保护控制者。
(5) 通过ARP欺骗或DHCP欺骗等网络代理木马欺骗方式。
2.5 攻击技术
攻击技术是指一切试图跨越系统安全边界危害受害主机的可用性、可靠性、数据完整性、或者消耗受害主机的系统资源以及利用受害主机危害他人的所有行为。归纳起来, 主要包括拒绝服务攻击、信息窃取、数据破坏、修改系统配置等四个方面。
3 冰河的入侵和攻击过程
冰河木马是国内比较有名的一个木马, 从1999年开发到现在已经被不同的开发者不断改进, 因此出现很多版本, 无论哪个版本, 其执行的主要任务是远程访问和控制, 随着版本的增高功能不断增多, 入侵行为如下:
记录各种口令信息:包括开机口令、屏保口令、共享资源口令等, 随着版本的升高, 它所能够记录的口令信息会增加;
获取系统信息:主要包括计算机名、当前用户、系统路径、操作系统版本、物理及逻辑磁盘信息等多项系统数据;
远程文件操作:可以创建、上传、下载、复制、删除文件;文件压缩、远程打开文件等多种文件操作功能;
限制系统功能:远程关机、远程重启机器、锁定鼠标、热键等功能;
发送信息:向被控端发送短信息;
注册表操作:包括对主键的浏览、增删、复制等操作;点到点通讯:以聊天室的形式同被控制端进行在线交谈。冰河3.0之前通信方式是通过服务端在宿主机器上开一个T C P端口 (默认端口是7 6 2 6, 可以另设置, 一般范围在1024~32768之间) , 然后等待客户端的连接, 在通过对客户端的认证后, 客户端就可以控制服务端的方式, 在3.0版本之后多数是采用替代系统功能的方法 (改写驱动程序或动态链接库) 。一旦木马的控制端向被控端发出特定的信息, 隐藏的程序就立即开始执行。
冰河会更改注册表, 使服务器端程序启动与exe文件或txt文件相关联——无论运行什么exe文件或打开txt文件, 冰河就开始加载, 启动后执行入侵操作, 当服务器接入Internet, 会自动向事先设定好的邮箱发送执行结果。
为了增强自身的隐蔽性, 有很多版本是通过对服务器端代码进行修改并重新加壳后制作出来的, 并且现行的加壳软件有很多种 (ASPack、ASProtect、UPXShell、Petite等) , 甚至使用不同的加壳软件进行多次加壳, 这样增强了反恶意代码软件甄别的难度。
4 结论
恶意代码技术飞速的发展, 恶意代码变化多端, 层出不穷, 由于恶意代码技术发展的不可预见性, 所以只有紧跟恶意代码技术发展的步伐, 才能及时的采取相应的应对措施, 使传播范围限制在最小, 损失降到最低。
摘要:本文介绍了恶意代码的渗透、自启动、自我保护、隐蔽通信、攻击等相关技术, 通过这些技术可以对恶意代码入侵有更深刻的认识, 并以冰河为例简单介绍了实现入侵的整个过程。
关键词:恶意代码,反静态分析,反动态跟踪,隐蔽通讯,冰河
参考文献
[1]石志国, 薛为民, 尹浩.计算机网络安全教程.清华大学出版社.2007.
[2]米佳, 侯丽波, 黄波.公共信息网络安全管理教程.大连理工出版社.2008.
[3]潘勉, 薛质, 李建华, 李生红.基于DLL技术的特洛伊木马植入新方案.计算机工程.2004.
[4]张勐, 杨大全, 辛义忠, 赵德平.计算机病毒变形技术研究沈阳工业大学学报.2004.
代码复查的要点探讨 篇8
代码复查 (Code Review) , 又叫“代码审查”, 其基本思想是:在开发人员编写完自己的代码后, 由其他人来复查他写的代码, 从而有效地发现代码中存在的缺陷。
2软件项目普遍存在的问题
2.1 人员变动
一个维护时间稍长一点儿的软件项目, 人员变动是在所难免的。老员工被调动到其他项目去了, 由新员工来接替他们的工作。新员工在接替老员工进行代码维护, 甚至继续进行新的开发时, 由于对原有代码以及设计思路理解有偏差, 也会出现大量的低劣代码。
2.2 不规范的代码编写
在项目开发之初, 往往会制定一个代码编写的规范, 但在项目开发过程中, 许多成员往往会忽视这些代码规范而进行随意地编写。随意地代码编写会降低代码的可读性、可维护性和易变更性。为了保证代码的规范, 提高代码的质量, 解决之道, 就是“代码复查”。
3代码复查的关键点
代码复查的一个基本理论就是, 当我们越早发现代码存在的缺陷, 解决缺陷的代价就越低。代码复查按照以下方法进行审查。
3.1 代码风格
代码规范包含了整个项目组的代码风格。由于软件开发人员的设计习惯不同, 如果不统一代码风格, 一个项目中的代码将五花八门, 如变量和常量的命名、接口与实现类的注释、何时回车、怎样缩进等等。代码设计不规范, 必将为日后的维护与改进带来困难。我们通过代码复查, 一方面督促开发人员按照规范编写代码;另一方面也使开发人员自身形成良好的编程习惯。代码风格的审查, 由于内容比较单一, 我们常常可以通过一些代码复查的工具来自动完成, 提高复查的效率。
3.2 重大缺陷
在一些关于代码复查的文章中, 列出的单子上, 描述了代码复查应当着重注意的重大缺陷, 它包括:存在SQL注入、易受跨站点脚本攻击、缓存区溢出、托管代码等。重大缺陷审查是一个繁琐而细致的工作, 如果能编写或使用一些审查软件, 可以大大提高审查效率。
3.3 设计逻辑与思路的审查
这部分的审查是代码复查中最核心、最有价值的部分。代码风格与重大缺陷的审查, 虽然重要但简单而机械, 可以通过软件自动检查;而设计逻辑与思路的审查, 却是复杂而有深度的审查, 需要有一定理论深度和编码经验的人才能完成, 而且对经验不足的人尤其重要。对于这个问题, 较好的解决办法是, 通过代码复查, 让经验丰富者去指导经验缺乏者, 让团队整体素质得到提高。具体办法是:在缺乏经验者完成编码以后, 让经验丰富者去进行代码复查, 指出问题, 同时对其设计进行指导。这样的过程最初可能需要重构, 甚至重新编码。但经过这样的过程, 经验缺乏者将逐渐熟练, 迅速成长, 使整体团队素质提高。
4代码复查策略
4.1 专人进行代码复查
严格的代码复查策略, 一种方式是由专人进行代码复查。这种方式, 在人员组织形式上, 从软件开发人员中单独提出一些经验丰富的人, 组成一个代码复查小组, 专职对其他软件开发小组进行代码复查。这种方式, 代码复查小组以第三方的身份去复查各个项目组的代码, 可以保证复查的公平、公正, 但压力无疑是巨大的。
4.2 以一个项目开发小组为单元进行代码互查
以一个项目开发小组为单元进行代码互查, 即一个人的代码, 要被小组所有成员审查。这种方式付出的代价太大了。对这种方式的一种变通办法是将XP中的结对编程进行结合, 结对编程中的两个人相互进行代码互查。采用结对编程的项目组可以尝试这种方式, 目前国内采用结对编程的项目组实在太少了。上述两种代码复查的最大弊病就是, 审查者没有太多的责任去发现被审查者的问题, 发现了问题对审查者没有任何好处, 反倒与被审查者结怨;相反, 审查者没有发现问题也不会担负任何责任。这样的结果就导致了代码复查流于形式, 审查者草草审查, 问题依然存在。虽然代码复查优势明显, 但以上几种形式都不能为普通的软件开发团队所接受。
4.3 以小组为单位, 组长责任制的代码复查形式
代码复查是有代价的, 甚至有时的代价是巨大的。因此, 代码复查不宜频繁, 最好一份代码只审查一次。同时, 代码复查者应当对所审查的代码负有责任, 即能够大胆地审查并指出被审查者的问题, 并要求被审查者限期整改。与此同时, 被审查后的代码如果还出现缺陷, 审查者应当负有责任。只有满足了以上3个条件, 代码复查才能为我们所接受。毫无疑问, 项目开发小组的组长来担当此责任是最合适的。
一个项目开发组, 根据其功能的划分, 可以划分为多个小组, 每个小组负责一个子模块。在这样一个小组中, 小组长无疑是最有经验的开发人员, 由他去负责组织和指导其他成员是合适的。小组成员不宜太多, 往往是3~5人。小组长不要分配太多的开发任务, 他的主要工作是指导和监督小组其他成员进行开发, 将他从繁重的开发任务中解脱出来。他可以有更多的精力去指导其他成员的设计, 并且复查他们的代码。最终, 他要对小组所有成员的代码质量负责, 由项目经理或质量管理员进行抽查, 检验其整体情况。
参考文献
医学装备的代码管理 篇9
药品、医疗器械等医疗卫生产品的质量关系到人民的生命安全, 受到政府部门与人民的高度重视。如何对药品、医疗器械等医疗卫生产品进行标志及信息的传递与共享, 是当今医疗卫生领域所关注的重要问题。建立统一的医学装备代码管理, 对于提高医学装备生产、流通、管理具有重要意义, 《医疗器械分类规则》与《医疗器械分类目录》[1,2]的制定确立了医疗器械的编码基础, 为医疗装备代码化管理提供了依据。
1 医疗机构物资分类的基本概述
卫生部2011年颁布的《医疗卫生机构医学装备管理办法》 (以下简称《管理办法》) 第三十条明确要求医疗机构要依据中华人民共和国卫生行业标准《WS/T 118—1999全国卫生系统医疗器械、仪器设备分类与代码》[3] (以下简称《WS/T 118—1999标准》) 建立本机构医学装备分类、分户电子账目, 实行信息化管理。《WS/T 118—1999标准》要求卫生行业对医疗器械、仪器设备的上报材料以及财务、供应、统计和会计等管理资料均采用本标准, 各部门、各单位在使用本标准的过程中, 允许适当细化和补充, 但必须与本标准兼容, 各部门、各单位补充、细化和延拓的代码, 必须按规定表格要求统一上报卫生部规划财务司备案, 在未被批准前, 其分类代码只能在本部门和本单位使用, 不能作为信息交换使用。本标准共分23大类, 其中医疗器械仅为其中的一类, 其一级分类代码为“68”。国家食品药品监督管理局《医疗器械分类规则》用于指导《医疗器械分类目录》[2] (以下简称《目录》) 的制定和确定新的产品注册类别, 规定我国实行的医疗器械分类方法是分类规则指导下的目录分类制, 分类规则和分类目录并存, 一旦实施分类目录, 应执行分类目录。2005版《医疗器械分类目录》只有一、二级分类信息, 没有三、四分类信息。《管理办法》要求按《WS/T 118—1999标准》对医学装备进行分类, 但《目录》对《WS/T 118—1999标准》中医疗器械二级分类做了较大调整, 例如胸腔镜按《目录》一、二级分类分别为“68”、“22”, 而按《WS/T 118—1999标准》一、二级分类分别为“68”、“25”。《管理办法》所称的医学装备有的属医疗器械“68”类, 有的不属医疗器械, 如病房用的壁挂空调一级分类代码“78”就属家用电器类, 所以医疗机构物资代码管理是一项系统性的技术工作, 《医疗器械分类目录》是目前医疗机构对医疗器械二级分类编码的主要依据。
2 物资分类的基本原则
由于《目录》中的数据是一动态数据, 与医疗器械注册证的产品品种编码一致———随时间的变化而变化, 而《WS/T118—1999标准》的编码是给定的, 不能改变, 并且1999年后新增的设备没有进行补录, 仅依靠《WS/T 118—1999标准》对物资进行编码会造成管理上的困难。例如, 《WS/T 118—1999标准》对于分体式壁挂空调分类编码为78031003 (二级代码为“03”) , 胸腔镜的分类代码为68251018 (二级代码为“25”) , 但是《目录》对胸腔镜的二级分类代码调整为“22”, 在目录中“25”为医用高频仪器设备。倘若依旧按照《WS/T 118—1999标准》进行编码就会与厂方注册证产生冲突使装备混乱。根据多年物资代码管理经验, 物资分类代码要兼顾《WS/T 118—1999标准》及《目录》要求, 物资代码仍按《WS/T 118—1999标准》执行, 其中医疗器械的二级分类代码与《WS/T 118—1999标准》不同的以《目录》二级代码为准, 一级、三级、四级分类代码仍按《WS/T 118—1999标准》确定, 所以胸腔镜的分类代码应为68221018。医疗器械注册证号已包含了医疗器械分类管理代码及二级分类代码信息, 注册证的二级分类信息与《目录》二级分类信息相同, 医疗器械注册证号的二级分类代码信息是医疗器械二级分类编码的依据, 所有医疗器械代码管理中的二级分类必须以此为基础。医疗器械注册号的编排方式为:× (×) 1 (食) 药监械 (×2) 字××××3第×4××5××××6号, 其中××5为医疗器械的二级分类代码。例如, 奥林巴斯电子胸腔内窥镜注册号:国食药监械 (进) 2006第3221543号, ×为“3”是三类医疗器械;××为“22”是医疗器械的二级分类代码, 表示“医用光学器具、仪器及内窥镜设备”。医疗机构物资分类代码的基本标准是《WS/T 118—1999标准》, 医疗器械二级分类标准以《目录》或医疗器械注册证为准, 这样就能建立起医疗器械编码与厂商注册证产品品种编码之间的对应关系。
3 医学装备的代码管理
3.1 分类编码
《WS/T 118—1999标准》用层次代码结构进行分类, 为线性分类法, 代码结构是4层8位数字码, 采用平均分配代码的方法, 每层2位码, 分别是一级分类、二级分类、三级分类、四级分类, 四级分类表示具体仪器设备的名称, 各层次“99”代码为收容类目, 我们称4层8位编码为“分类编码”。例如, 普通手术剪的编码应为一级分类代码2位 (68———医疗器械行业) +二级分类代码2位 (01———基础外科手术器械) +三级分类代码2位 (03———基础外科用剪) +四级分类代码2位 (01———普通手术剪) , 分类编码为68010301。对于《WS/T 118—1999标准》中没有的新装备, 应按其物理属性及结构特征参照《WS/T 118—1999标准》进行一级、二级、三级、四级分类, 确实无法进行分类的新物资8位代码应为“99000000”, 没有二级分类的物资后6位代码应为“990000”, 没有三级分类的物资后4位代码应为“9900”, 没有四级分类的后2位代码为“99”, 总之8位编码要到具体名称。对新物资按上述分类法分类编码会产生重码, 在物流编码中按规格型号及品牌进行增码时要避免重码, 做到一物一码。新的医疗器械注册证已列出二级分类编码, 要按注册证执行。分类编码是国家的标准规范, 也是国家权威部门信息统计的基础, 要力求一致。相关技术人员一定要掌握《WS/T 118—1999标准》, 方能对本单位医学装备实行规范化、标准化、信息化管理。
3.2 物流编码
8位分类编码只能描述商品的通用名称, 无法满足商品流通的需要。在医学装备库房管理中同名称不同型号或同名称同型号不同厂商的商品有很多, 价格相差甚远, 因此要对物资分类代码增加2位规格型号及品牌代码, 规格型号及品牌代码应从01开始至99结束, 各层均有99个扩展空间。12位编码能满足流通环节中一物一码的基本要求, 因此我们称12位编码为“物流编码”。物流编码是做好单位供应链管理 (supply chain management, SCM) 的基本要求, 可根据规模适当增加规格型号及品牌的位数。例如, 一次性注射器分类编码为68151021, 5 m L规格型号可编为05, 威高品牌可编为01, 名称为一次性注射器, 规格型号及品牌为5 m L威高牌, 对应的物流编码应为:68151021+05+01;医疗器械产品注册号为国食药监械 (进) 2006第3221543号的奥林巴斯电子胸腔内窥镜规范的物流编码应为:一级分类代码2位 (68———医疗器械行业) +二级分类代码2位 (22———医疗器械注册证二级分类代码) +三级分类代码2位 (《WS/T 118—1999标准》胸腔镜三级分类代码为10) +四级分类代码2位 (18———《WS/T 118—1999标准》胸腔镜四级分类代码) +规格型号代码2位 (无规格用00) +品牌代码2位 (01———奥林巴斯) , 分类代码为68221018 (8位) , 物流编码为682210180001 (12位) 。
3.3 资产编码
医学装备的固定资产管理、经济核算及售后维修要求一台 (套) 一码。医疗机构在同一部门或不同部门可能有多台同样的设备, 要做到固定资产及档案管理中一台 (套) 一码, 显然12位物流编码无法满足具体要求, 因此必须有科室及每台仪器的序号信息才能满足固定资产及档案信息化管理的需要。物资编码还要各增加2位科室及仪器序号信息, 用16位编码才能确定每台仪器的具体信息, 我们称16位以上编码为“资产编码”。例如, 奥林巴斯电子胸腔内窥镜规范的资产编码应为:物流编码 (682210180001) +科室代码2位 (32———消化科) +产品的序号2位 (02———第2台) ;资产编码为6822101800013202 (16位) 。随着单位精细化经济核算的要求, 2位科室代码显然已不能满足大型医疗机构的核算需求, 所以科室代码要根据单位规模大小设定为2~4位, 没有做到16位以上分类编码的医院不能满足档案规范化管理要求。
3.4 档案编码
医学装备档案管理要求医学装备档案按台 (套) 立卷, 不同台 (套) 设备档案资料不能混淆, 档案要按类别、科室及购置年份实行归档管理。要做到档案管理中一台 (套) 一卷的基本要求, 每宗档案必须有唯一的档案号才能方便档案的信息化管理。档案号是做好医学装备分户电子及文书账目管理的基础, 16位资产编码是单位每台 (套) 仪器设备的唯一编码, 我们认为, 按购置年份+资产编码顺序归档方便管理, 档案号应由4位年份代码+16位资产编码组成, 做到文书档案号与电子档案的对应管理, 做到一卷一码。我们称购置年份+资产编码组成的档案号为“档案编码”。例如:2010年购置的奥林巴斯电子胸腔内窥镜档案号应为20106822023300013202。
4 结语
虽然上述各种分类代码十分繁琐, 掌握起来也有一定困难, 但信息化管理是现代科学管理的基本要求, 尤其是各医院现在都在建设各自的信息管理系统。规范的分类编码应该是8位, 物流编码应该是12位, 资产编码应该是16位以上, 目前绝大多数医院未按此标准代码管理, 造成医学装备统计信息不准确, 给医院决策及全国性统计工作带来诸多不便。各单位一定要认识到信息化也是数字化的过程, 分类编码、物流编码、资产编码、档案编码4个编码相互关联、逐步延伸, 是医疗装备信息化管理中各个环节中的不同要求。行业标准也是全国范围内统一技术要求的标准, 规范代码管理是医院标准化建设的重要组成部分, 医学装备代码管理不仅有《WS/T 118—1999标准》、《目录》及医疗器械注册证的相应技术规范, 同时有《管理办法》的法规要求, 所以做好医学装备代码管理是一项落实行业标准及国家法律法规的技术性工作, 各单位应在人员配备及制度上确保医学装备代码管理的落实, 确保医学装备信息化管理做好、做精。
参考文献
[1]李向东, 崔亮.医学装备管理规范[M].西安:第四军医大学出版社, 2013:200-206.
[2]谢松城, 徐伟伟.医疗设备管理与技术规范[M].杭州:浙江大学出版社, 2004.
写代码的程序“媛” 篇10
问:有什么借口让自己写出低质量的代码?
答:我是个女程序员,我是来活跃气氛的。
这个段子折射出了程序员这个行业的现状,即写代码这个圈子绝对是雄性的天下。
初入职场的王一娇,对段子里的调侃是口服而心不甘:“这么调侃挺好的,刚进公司是真怂啊,什么都不懂,总不能还牛哄哄的吧。但是也不能真成调节气氛的啦。等姐以后成了高级工程师就不用调侃了,还可以说——你以为我是靠着卖萌才走到今天的吗?”
冰冷的现实总是可以轻而易举地击碎一个新人的骄傲。入职之初,王一娇因为连基本的操作都不懂,常常拽着师傅问这问那。问得多了,就有点心灰意冷了,总感觉自己“每天存在的意义就是浪费师傅的时间”似的。
这份工作与王一娇想象中的情形出入很大。应聘时,她被告知的是当“高大上”的数據挖掘师,是“做模型”“做算法”的。但是,她的实际工作却是做一些无关痛痒而又枯燥无味的细枝末节,简单来说就是打标签,即把一个长长的地名切成好几段,分出哪个是核心词,再归类。人工一个个标注太慢了,写个程序一趟跑下来,上万个地名都能标注好,准确率还特别高。就这样,她的大部分工作都在不停地优化策略,在程序里改改这、改改那,然后再试一遍,看看准确率会不会有所提高。
虽然,单调而枯燥的“码农”生活,对于提高自身的业务能力不无裨益,但是,让王一娇焦虑的是,这些工作无益于自己学术能力的提升。但是,她又放不下这份工作。看看未来,也不是暗无天日:想想自己,总有一天,能靠实力,成为资深的构架师或者工程师。顿时,她就会热血沸腾,动力十足。
晚上9点,北京市西二旗,外围是钢化玻璃的互联网企业大厦透m白炽灯光,像穿越于夜色的巨大航船,部门里所有的人都还没有离开各自的格子间,当然也包括王一娇。过去,她每周给爷爷打两三个电话,现在一个月都难得打一个,每天面对着发不完的邮件、跑不完的程序。
繁重的工作,让王一娇的世界变得很小。书、电影、逛街让位给了对着电脑无穷无尽地编程。每天午饭的1小时和晚饭的1小时,是王一娇“出来放风的大型活动”。其实,吃饭花不了多长时间,但王一娇和同事特意挑选路远的菜馆,有时会走上两个街区,花上40分钟遛弯、聊天、讲段子、吐槽自己干的活儿不够“高大上”。说完就忘了,只记得那点短暂的时光很快乐。
时间长了,王一娇喜欢上了这份看似辛苦、实则单纯的工作。那些“IT男”大都不解风情,但却都简单而可爱,经常穿着拖鞋、大裤衩,上着T恤、格子衫来上班。而作为男人国里的异性,王一娇喜欢把鞋子脱掉,光着脚在办公室里“走两步”。
慢慢地,她的工作开始得到上司的认可,部门又招了两个实习生和她一起做,形成了一个三人项目小组,王一娇成了项目的负责人。
作为一名程序世界里的女“码农”,王一娇开始慢慢懂得:人生与编程一样,只要你的方法是对的,所有的问题都能找到解决的办法,而决定你成功与否的因素不是你的性别,而是你的用心程度。