教学源代码

2024-05-05

教学源代码(精选十篇)

教学源代码 篇1

关键词:Linux内核,TCP/IP,源代码,教学

1 学习Linux内核中TCP/IP协议栈源代码的先修课程

学生学习Linux内核中TCP/IP协议栈源代码之前,必须修完下述课程:

TCP/IP协议。该课程主要从整体上讲述了TCP/IP协议族的工作原理和电信标准。

C程序设计。在Linux内核TCP/IP协议栈中,绝大部分的源代码都是用标准C语言写的(除了极少数是用汇编语言写的)。TCP/IP协议栈源代码包含了非常多的函数,它们之间的调用关系也极其复杂,而且很多函数都很长。

操作系统。在Linux操作系统中,TCP/IP协议栈本身就是操作系统的一个有机组成部分,TCP/IP协议栈与操作系统的其他部分联系紧密。

微机原理。在TCP/IP协议的最底层是网络接口层,这个层的源代码与具体的网络接口硬件有着千丝万缕的联系,这就涉及到微机原理课程里的很多知识。

TCP/IP socket网络编程。这部分不作为必需课程,但是学生若对socket编程有一个初步的了解或者有一定的编程经验,那么学习TCP/IP协议栈源代码可能会更容易一些。

2 学习TCP/IP协议栈源代码对学生能力的培养

TCP/IP协议栈源代码是一项庞大而复杂的体系,绝非一门课程所能讲授,而且既不可能,也没有必要。我们只需要选择TCP/IP协议栈中一些典型的部分进行学习和探讨,学生可以挑选自己感兴趣的部分。

2.1 理解TCP/IP协议的实现机制

在TCP/IP协议课程中,学生重点学习了TCP/IP协议族中最重要的概念和标准,了解了TCP/IP协议族的基本工作原理,知道怎样去利用TCP/IP协议进行通信和网络互联。但是TCP/IP协议很抽象,学生很难真正理解掌握,即便理解了,也会产生“TCP/IP协议族是如何实现的?TCP/IP协议族为什么要这样实现?”的困惑。

TCP协议在TCP/IP协议族中的地位,非常重要也非常不好掌握。在TCP/IP课程中,重点讲解了TCP连接的建立和关闭、状态图以及流量控制、拥塞控制等。强调了TCP在无连接的网络上实现可靠的面向连接服务。在TCP的源代码中,学生发现TCP有一个结构struct tcpcb邀…妖,即TCP传输控制块TCB,这个结构记录了TCP实例每个连接的各种属性,比如缓存区大小、定时器值、本地与远程的邀IP:PORT妖对等,通过对这个结构的分析,学生对TCP的连接管理、滑动窗口、各种计时器有了更深层次的认识,而且对于远程主机崩溃/重启、网络出现故障对本地TCP带来的信息反馈等没有学过的知识也有了了解。

2.2 对C程序设计能力的培养

Linux内核TCP/IP协议栈源代码是一个真实的、运行在成千上万台Linux服务器、主机上的大型软件。全部采用C语言编写,在学习TCP/IP源代码过程中,不要求学生面面俱到,但是必须对某个方面有所精通。学生必须下功夫搞清楚他所阅读的函数的功能以及每条语句的作用,然后,对其中的一些语句作出修改,指出其作用以及修改前后的函数功能的差异(由于条件所限,修改代码只局限于讨论和书面的解释,并没有实际编译)。

在学习TCP/IP协议栈源代码的过程中,很多学生遇到了以前在《C程序设计》课程中学习过,但是很少实践的C语言技能,由于Linux支持多种网络协议,从中可以深刻体会到C语言实现代码重用的技术。

对某些学生,在学习了ICMP协议的原理和源代码后,启发他们采用socket编程开发出自己的Ping程序和Traceroute程序,这又促进了他们学习TCP/IP源代码。

2.3 加深对操作系统、微机原理等课程的融会贯通

对于操作系统来说,学生都会画转换图,但是却没有见过真正的进程阻塞、唤醒、创建子进程、僵尸进程、父子进程竞争等代码,面的小程序演示了如何创建子进程以及父子进程之间如何竞争的情况[2]。

其结果如下,是不确定的。

(1)coutput from child utput from parent(2)coutput from child utput from parent(3)output from child output form par-ent

学生可学习父进程派生子进程以后两者的竞争关系等知识点。而在TCP/IP协议栈源代码中,这种形式的代码非常多,通过学习可提高学生对操作系统诸多知识点的理解。

在TCP/IP协议栈源代码的网络接口设备部分,有很大一部分是关于如何初始化网卡、网卡收发数据、查找MAC地址等和硬件联系紧密的C代码。特别是网卡接收数据部分,会涉及到硬件中断和软件中断。

3 结束语

通过学习,学生更加深刻地理解了TCP/IP工作原理和实现机制,在C程序设计、软件工程、操作系统和微机原理等取得了可观的效果。

参考文献

[1]Wehrle K,Ritter H,Daniel.Linux网络体系结构[M].北京:清华大学出版社,2006.

java教学计划编制的全部代码 篇2

//非连通图的深度优先搜索遍历和广度优先搜索遍历

import linearList.Queue.SeqQueue;

//顺序循环队列类

public abstract class AbstractGraph implements GGraph//抽象图类

{

public abstract int vertexCount();

//返回顶点数,方法由子类实现

public abstract E get(int i);

//返回顶点vi的数据域

public abstract int getFirstNeighbor(int i);

//返回顶点vi的第一个邻接顶点的序号

public abstract int getNextNeighbor(int i, int j);

//返回vi在vj后的下一个邻接顶点的序号

//

public abstract AbstractGraph prim();

public void DFSTraverse(int v)

//从顶点v出发对非连通图的一次深度优先搜索遍历

{

boolean[] visited = new boolean[vertexCount()];

//访问标记数组,元素初值为false,表示未被访问

int i=v;

do

{

if(!visited[i])

点vi未被访问

{

System.out.print(“{ ”);

depthfs(i, visited);

点vi出发的一次深度优先搜索遍历

System.out.print(“} ”);

}

i =(i+1)% vertexCount();

他连通分量中寻找未被访问顶点

} while(i!=v);

System.out.println();

}

private void depthfs(int v, boolean[] visited)

//若顶

//从顶

//在其//从顶点v开

始发的一次深度优先搜索遍历

{

//遍历一个连通分量

System.out.print(this.get(v)+“ ”);

//访问该顶点

visited[v] = true;

已访问标记

int w = getFirstNeighbor(v);

第一个邻接顶点

while(w!=-1)

若存在邻接顶点

{

if(!visited[w])

邻接顶点w未被访问

depthfs(w, visited);

w出发的深度优先搜索遍历,递归调用

w = getNextNeighbor(v, w);

回v在w后的下一个邻接顶点的序号

}

}

//置

//获得

//

//若

//从

//返

public void BFSTraverse(int v)

//从顶点v出发对非连通图进行一次广度优先搜索遍历

{

boolean[] visited = new boolean[vertexCount()];

//访问标记数组

int i=v;

do

{

if(!visited[i])

点vi未被访问

{

System.out.print(“{ ”);

breadthfs(i, visited);

点vi出发的广度优先搜索遍历

System.out.print(“} ”);

}

i =(i+1)% vertexCount();

他连通分量中寻找未被访问顶点

} while(i!=v);

System.out.println();

}

//若顶//从顶//在其

private void breadthfs(int v, boolean[] visited)

//从顶点v出发的广度优先搜索遍历

{

//遍历一个连通分量

System.out.print(this.get(v)+“ ”);

visited[v] = true;

SeqQueue

que

= SeqQueue(vertexCount());

//创建顺序队列

que.enqueue(new Integer(v));

问过的顶点v的序号入队

while(!que.isEmpty())

队列不空时循环

{

v = que.dequeue().intValue();

int w = getFirstNeighbor(v);

顶点v的第一个邻接顶点序号

while(w!=-1)

当邻接顶点存在时循环

{

if(!visited[w])

该顶点未访问过

new

//访

//当//出队 //获得

//

//若

{

System.out.print(this.get(w)+“ ”);

//访问顶点

visited[w] = true;

que.enqueue(new Integer(w));

//访问过的顶点w的序号入队

}

w = getNextNeighbor(v, w);

回v在w后的下一个邻接顶点的序号

}

}

}

}

//返 package curriculumProject;

//图的邻接表

import dataStructure.linearList.SeqList;

//顺序表类 import linearList.linkedList.SortedHSLinkedList;

//排序的带头结点的单链表类

//public class AdjListGraph implements GGraph

//邻接表表示的图类

public class AdjListGraph extends AbstractGraph implements GGraph //邻接表表示的图类

{

protected SeqList> vertexlist;

//顶点表

public AdjListGraph(int n)

//构造方法,n指定顶点数

{

this.vertexlist = new SeqList>(n);

}

public AdjListGraph(E[] vertices, Edge[] edges)

//以顶点集合和边集合构造一个图

{

this(vertices.length);

for(int i=0;i

insertVertex(vertices[i]);

//插入一个顶点

for(int j=0;j

insertEdge(edges[j]);

}

public int vertexCount()

{

return this.vertexlist.length();

}

public E get(int i)

vi的数据元素

{

return this.vertexlist.get(i).data;

}

//插入一条

//返回顶点

//返回顶点

public boolean insertVertex(E vertex)

//插入一个顶点,若插入成功,返回true

{

return this.vertexlist.add(new Vertex(vertex));//在顺序表最后插入一个元素

}

public boolean insertEdge(int i, int j)

//插入一条权值为weight的边〈vi,vj〉

{

if(i>=0 && i=0 && j

{

//SortedHSLinkedList SortedHSLinkedList();

SortedHSLinkedList slink = this.vertexlist.get(i).adjlink;//

slink = this.vertexlist.get(i).adjlink;//

System.out.println(this.vertexlist.get(i));

return slink.add(new Edge(i,j));//在第i条单链表最后增加边结点

}

slink

=

new

return false;

}

public boolean insertEdge(Edge edge)

//插入一条边

{

if(edge!=null)

return insertEdge(edge.start, edge.dest);

return false;

}

public String toString()

//获得图的顶点集合和邻接表

{

String str= “顶点集合:”+vertexlist.toString()+“n”;

str += “出边表:n ”;

//+edgeCount+“条边 n”;

for(int i=0;i

str += this.vertexlist.get(i).adjlink.toString()+“n”;

//遍历第i条单链表

return str;

}

public boolean removeEdge(int i, int j)

//删除边〈vi,vj〉,i、j指定顶点序号

{

if(i>=0 && i=0 && j

{

SortedHSLinkedList slink = this.vertexlist.get(i).adjlink;//获得第i条边单链表

return slink.remove(new Edge(i,j));

}

return false;

}

public boolean removeVertex(int v)

//删除序号为v的顶点及其关联的边

{

//若删除成功,返回true

int n=vertexCount();

//删除之前的顶点数

if(v>=0 && v

{

SortedHSLinkedList

slink

= this.vertexlist.get(v).adjlink;//获得欲删除的第v条边单链表

int i=0;

Edge edge = slink.get(i);

while(edge!=null)

{

this.removeEdge(edge.dest, edge.start);

//删除对称的边

i++;

edge = slink.get(i);

}

this.vertexlist.remove(v);

//删除顺序表的第i个元素,顶点数已减一

for(i=0;i

//未删除的边结点更改某些顶点序号

{

slink = this.vertexlist.get(i).adjlink;

//获得第i条边单链表

int j=0;

edge = slink.get(j);

while(edge!=null)

{

if(edge.start>v)

edge.start--;

//顶点序号减一

if(edge.dest>v)

edge.dest--;

j++;

edge = slink.get(j);

}

}

return true;

}

return false;

}

public int getFirstNeighbor(int v)

第一个邻接顶点的序号

{

存在第一个邻接顶点,则返回-1

return getNextNeighbor(v,-1);

}

//返回顶点v的 //若不

public int getNextNeighbor(int v, int w)

//返回v在w后的下一个邻接顶点的序号

{

//若不存在下一个邻接顶点,则返回-1

if(v>=0 && v=-1 && w

{

SortedHSLinkedList

slink

= this.vertexlist.get(v).adjlink;//获得第v条边单链表

Edge edge = slink.get(0);

//返回单链表的第一个结点表示的边

int i=0;

while(edge!=null)

//寻找下一个邻接顶点

{

if(edge.dest>w)

return edge.dest;

//返回下一个邻接顶点的序号

i++;

edge = slink.get(i);

//返回单链表的第一个结点表示的边

}

}

return-1;

} }

package curriculumProject;

//带权图的边类

public class Edge implements Comparable {

//带权值的边类

public int start;

//边的起点序号

public int dest;

//边的终点序号

//public int weight;

//边的权值

public Edge(int start, int dest)

{

this.start = start;

this.dest = dest;

//this.weight = weight;

}

public String toString()

{

return “(”+start+“,”+dest+“)”;

}

public int compareTo(Edge e)

较大小的规则

{

if(this.start!=e.start)

return this.starte.dest;

}

}

package curriculumProject;//图接口

public interface GGraph

//图接口

{

int vertexCount();

//返回顶点数

E get(int i);

//返回顶点vi的数据元素

boolean insertVertex(E vertex);顶点

boolean insertEdge(int i, int j);

〈vi,vj〉

boolean removeVertex(int v);

为v的顶点及其关联的边

boolean removeEdge(int i, int j);

int getFirstNeighbor(int v);

的第一个邻接顶点的序号

int getNextNeighbor(int v, int w);后的下一个邻接顶点的序号

}

//插入一个//插入一条权值为weight的边

//删除序号

//删除边〈vi,vj〉

//返回顶点v

//返回v在w

package curriculumProject;

import java.util.*;

import linearList.Queue.SeqQueue;;

public class Graph_Main2 {

/** * @param args */ int bian;// 定义边数

HashSet array = new HashSet();// 定义一个集合保存顶点的值 ArrayList list2 = new ArrayList();// 保存优先关系顶点的值 ArrayList listrudu = new ArrayList();// 保存顶点的入度 ArrayList result = new ArrayList();// 保存拓扑排序的结果 ArrayList credit2 = new ArrayList();// 保存学分信息 ArrayList credit3 = new ArrayList();// 保存学分信息 int[][] relation;// 保存输入优先关系的所有值 int[][] c_relation;Scanner scanner = new Scanner(System.in);

public void input(){

System.out.println(“请输入课程总数,按回车确认”);Scanner reader=new Scanner(System.in);int Input=reader.nextInt();System.out.println(“请依次输入各个课程的学分:”);int[] credit = new int[Input];for(int i = 0;i < Input;i++){

}

String[] vertices = new String[Input];for(int n = 0;n < Input;n++){

}

Scanner reader2=new Scanner(System.in);System.out.println(“请输入课程之间的关系总和,即有多少条if(n < 9){ vertices[n] = ”C0“ +(n + 1);credit[i] = reader.nextInt();credit2.add(credit[i]);} else { } vertices[n] = ”C“ +(n + 1);边?,按回车确认”);

bian = reader2.nextInt();relation = new int[bian][2];List list = new ArrayList();System.out.println(“比如:C01是C02的先修课,则输入 01 02”);for(int i = 0;i < bian;i++){

}

Edge[] edges = list.toArray(new Edge[0]);

AdjListGraph

graph

=

new System.out.print(“请输入第” +(i + 1)+ “条边的优先关系”);for(int j = 0;j < 2;j++){ } list.add(new Edge(relation[i][0],relation[i][1]));relation[i][j] = reader.nextInt();AdjListGraph(vertices,edges);

System.out.println(“带权有向图,”+graph.toString());System.out.println(“深度优先搜索遍历”);for(int i=0;i

System.out.println(“广度优先搜索遍历”);

for(int i=0;i

graph.BFSTraverse(i);

} }

public void sort(){

for(int i = 0;i < bian;i++){

for(int j = 0;j < 2;j++){

array.add(relation[i][j]);

} }

Iterator iter = array.iterator();

while(iter.hasNext()){

Object s = iter.next();list2.add(s);// 将各顶点的值保存在list里,方便后面查找入度时使用

}

int count = 0;// 定义一个记入度的计数器

for(int i = 0;i < list2.size();i++){

} for(int j = 0;j < bian;j++){

} listrudu.add(list2.get(i));listrudu.add(count);count = 0;if(list2.get(i).equals(relation[j][1])){ } count++;System.out.println();boolean flag = true;while(flag){

int check = 0;// 检查有没有入度为0 for(int i = 0;i < listrudu.size();i = i + 2){

if(listrudu.get((i + 1)).equals(0)){

result.add(listrudu.get(i));

for(int j=0;j

credit3.add(credit2.get(j));// // //

//credit3.add(credit2.get(i));for(int j = 0;j < list2.size();j++){

if(listrudu.get(i).equals(list2.get(j))){

for(int j2 = 0;j2 < bian;j2++){

if(list2.get(j).equals(relation[j2][0])){

relation[j2][1] =-9999;// 如果这个前驱是要被删除的话,那么把他的后继改值

“);

} flag = false;

} if(check == listrudu.size()/2){ System.out.println(”课程关系输入错误,有环,无法排序

}

} }

list2.remove(j);} } else { } check++;

int count1 = 0;// 定义一个记入度的计数器 for(int i = 0;i < list2.size();i++){

} if(list2.size()== 0){

} System.out.println(“存在拓扑排序”);flag = false;for(int j = 0;j < bian;j++){

} listrudu.add(list2.get(i));listrudu.add(count1);count1 = 0;if(list2.get(i).equals(relation[j][1])){ }

count1++;}// while循环结束

}

public void print(){ /* * 这个for循环的作用是:因为我上面做的是根据listrudu来找的,* 所以它每进行一次循环就把前面的入度为0的值再保存了一遍,其实最后的结果是最后一次循环所得的值,打印的时候要把前面重复的去掉

*/ for(int i = result.size()-1;i >= 0;i--){

} for(int i = 0;i < result.size();i++){ for(int j = 0;j < i;j++){

} if(result.get(j).equals(result.get(i))){ } result.remove(j);

System.out.print(result.get(i)+ “-->”);

}

System.out.println();System.out.println();System.out.println(“请输入你的总学期数”);Scanner reader3=new Scanner(System.in);

为:“);

int term = reader3.nextInt();System.out.println(”请输入学期学分上线“);int sum_credit = reader3.nextInt();System.out.println(”如果要使课程均匀分布在各个学期,则int sum=0;int sum2=0;for(int i = 0;i < result.size();i++){ for(int j=0;j

Object res2 = result.get(j);

Integer r2 = Integer.parseInt(res2.toString());

Object obj = credit2.get(r2-1);Integer a = Integer.parseInt(obj.toString());sum += a;j=j+2;break;} double value =(double)credit2.size()/(double)term;int value2=0;if(value<=1.0)

value=1.0;

if((int)value==value)value2=(int)value;else

value2 =(int)value+1;if((i+1)%(value2)==0){ System.out.print(result.get(i)+ “-->”);System.out.println();}else{

if(sum<=sum_credit){

for(int j3=0;j3

Integer r = Integer.parseInt(res.toString());Object obj2 = credit2.get(r-1);

Integer a2 = Integer.parseInt(obj2.toString());sum += a2;break;}

if(sum<=sum_credit)

System.out.print(result.get(i)+ “-->”);//System.out.print(result.get(i)+ “-->”);else{

sum = 0;

“);

}

}

}

System.out.print(result.get(i)+ ”-->“);}else{

}

System.out.println();sum = 0;

System.out.print(result.get(i)+ ”-->“);System.out.println();System.out.println();System.out.println(”如果要使课程分布在前几个学期,则为:

int j_=0;int j=0;

for(int i = 0;i < result.size();i++){

//for(int j=0;j

Object res4 = result.get(j);Integer r4 = Integer.parseInt(res4.toString());

//

//

Object obj4 = credit2.get(r4-1);Integer a4 = Integer.parseInt(obj4.toString());sum += a4;j=j+1;//break;//} if(sum<=sum_credit){ //for(int j=0;j

System.out.print(result.get(i)+ “-->”);if(sum<=sum_credit&&)

System.out.print(result.get(i)+ “-->”);else{

sum = 0;

System.out.print(result.get(i)+ “-->”);

}

} }else{

}

if(sum<=sum_credit){

System.out.print(result.get(i)+ “-->”);System.out.print(result.get(i)+ “-->”);System.out.println();sum = 0;// // // // // // //

} }else{

}

System.out.println();sum = 0;

System.out.print(result.get(i)+ “-->”);public static void main(String[] args){

// TODO Auto-generated method stub

Graph_Main2 s = new Graph_Main2();s.input();

s.sort();s.print();

} }

package curriculumProject;

import linearList.linkedList.SortedHSLinkedList;单链表类

public class Vertex

//排序的带头结点的//顶点表

元素 {

public E data;

//顶点数据域

public SortedHSLinkedList adjlink;

//该顶点的边单链表

public Vertex(E data, SortedHSLinkedList adjlink)

{

this.data = data;

this.adjlink = adjlink;

}

public Vertex(E data)

{

this(data, new SortedHSLinkedList());

//构造结点时创建空单链表

}

public String toString()

{

return this.data.toString();

破译源代码 篇3

当你听到“数据分析师”这个词的时候,脑海中第一时间出现的画面会是什么?会是乔纳·希尔在电影《点球成金》中所演的那个分析师彼得·布兰德的形象吗?

你知道研究数字的人都是书呆子型的,那种人整天坐在电脑面前,吃着外卖快餐,并且没有时间更没有意愿来打点自己的仪容。那种人也许会剪个头发,但是不会花费超过10块钱去剪掉它们。那种人从来不会穿一条合身的裤子,也不会穿上一件得体的衬衫。好吧,你说的那种人只是《点球成金》中的彼得·布兰德,那可不是真正的汤米·贝尔塞提斯。

掘金队1.95米的数据分析师可以用ZZtop的一句歌词来形容:他是一个穿着讲究的男人。从他的精干整洁的头发,到他的卷着袖口量身定制的礼服衬衫,闪闪发光的银色手表,黑色的腰带,木炭色的熨烫裤子,甚至是带有设计图案的靴子,都会让你感觉到——他会把自己的想法放到每一件事情当中,尤其是他的工作。

“运用分析你可以做很多事情。”贝尔塞提斯说,“那纯粹取决于分析资源、分析时间和所分析的人物。这就是我的工作:指出我们要做的主要任务。”

有汤米做指导的时候,大家很容易进入到他的思想当中。但是不要进去太久了,当他允许大家用洞察力去探索他的世界时,他的任何秘密也许就会泄露出来。

“当有的人阅读我的思想的时候,我并不想泄露我们的战术或者一些类似的相关事情,”贝尔塞提斯说,“但是同时,我们希望我们的球迷能了解我的想法。我们有一个积极的管理层,这是我非常高兴的事情。我们知道数据分析只是成功的一块拼图。我们所做的决定就像是一棵大树,而数据分析只是一个小分支。我们需要用很多的视角去观察比赛,球探的视角、退役球员的视角、蒂姆·康奈利(2013年掘金队新上任的篮球运营部副总裁)的视角——要知道,他来NBA并不久,所以我们会有很多不同的视角,而我能给的就是数字的视角。”

“当我接到蒂姆给我打的电话时,我说‘给我一天的考虑时间。’”贝尔塞提斯说,“但是很快的我就知道自己想要来这里(掘金队)。”汤米是土生土长的立陶宛人,他从7岁开始打篮球。“我不认为在立陶宛有比篮球更重要的事情。”汤米说。“有一部电影叫做《另一支梦之队》,我们的助理总经理阿特拉斯·卡尼瑟瓦斯在那部片子里出演。立陶宛的篮球已经相当强大了,我们真的不需要美国的梦之队在电影里出演。”篮球在上世纪30年代扎根于立陶宛,当然也扎根于汤米的心中。

尽管贝尔塞提斯在掘金队只有一个工作,但他总是在组织中扮演不同的角色,让自己保持忙碌状态。

“我所做的最重要的事情就是把赛前和赛后的报告交给教练。”贝尔塞提斯说,“这就是一些在惯有的基础上,用数据来指导球队的东西,而且他们做的非常好。”

赛前和赛后报告

“我给教练做的赛前报告,是从本质上描绘出我们要交手的球队的大体情况,而不是给出最基本的数据。”汤米说,“事实上我根本不会提交最基本的数据,因为那些东西在网上就能查到。我的报告是关于对手愿意在哪里投篮,他们五个人中哪个位置不太擅长防守,他们是否喜欢投底角三分球,在中距离处他们是否善于防守等等。所有的这些东西都是非常有用的,所以我会把它们总结一下。”

“之后我会指出一些关键球员。看球员的比赛录像是非常有用的,有些时候能从数据中看到一些很明显的事情,但是大家可能并不注意到它。”贝尔塞提斯说,“所以,我会根据分析做出一份报告。我们怎么去防德里克·罗斯?怎么去防凯文·杜兰特?有时候你会对他们束手无策,但是至少能从某种程度上知道他们不太擅长什么。差之毫厘,谬以千里,如果我们能在这激烈的竞争中得到额外的一点点优势的话,那么我们就会有更大的几率去赢得比赛。这就是我要做的事情。”

“我去过马修利奥尼斯篮球学院,是前NBA著名立陶宛球员萨鲁纳斯·马修利奥尼斯在美国开办的。”贝尔塞提斯说,“10年前我在他的学院学习,在那里和一些国家青年队队员打球。”是的,汤米在18岁的时候离开了立陶宛,来到美国追求自己的篮球梦想。他在马修利奥尼斯篮球学院打得非常出色。随着他的高中篮球生涯结束,他意识到自己需要做出一个决定。“我总是要确定一下,自己应该有一个备用的计划,如果我以后不打篮球干什么?我知道这是个非常好的机会,所以我就选择了做数据分析。”

汤米会把赛前报告交给布莱恩·肖,之后肖会根据这些报告上的信息来安排比赛战术。“汤米每天都会给我提供一份报告,他会告诉我在球场上哪个位置我们的进攻最有效,对手在哪个位置上最有效,在“热区”我们应该得到多少分,对手的两分球、底角三分球的出手几率是多少……”掘金主教练布莱恩·肖说道;“这样就做到了知己知彼,也就相当于我们可以预测到比赛的走向,有了这些似乎一个外行人也可以安排战术了。”

“汤米有他的工作,统计数据并且分析数据。而我也有工作要做,投篮并且帮助球队取得胜利。”掘金队的进攻后卫兰迪·弗耶说,“数据绝对不会说谎,但是我并不会注意那个,因为打比赛是要用心去打的。”

也许弗耶不会注意数据,但是事实上,他和他的队友们都从贝尔塞提斯提供的数据中获益。这就是“比赛计划”。

“我每天都是跟着直觉打比赛,也按照教练给大家安排的比赛计划去打球。”掘金前锋威尔森·钱德勒说道:“教练们会给大家安排一个相当棒的比赛计划,他们指出每个队员身上的优势和劣势,而且这会让自己更好地去审视自己。好的球员在球场上能把每件事都做得很好,所以你得试着让他们做一些不太擅长的事情,但是对于他们来说,还是能进球。因此你要想方法让他们用最难的方式进球。就像杜兰特,他是一个很强的对手,总能进好多高难度进球。有的时候你已经防到位了,但他还是可以得分,所以你得一次又一次地尝试去防住他。”

钱德勒在讨论“尝试着把球员限制在他理论上较弱的位置上”的时候,说到了关键的东西。有时候,即使是最好的信息也不会帮助你指出应该在球场上做什么。

“你会告诉我们,如果你能把詹姆斯和韦德限制在油漆区外的话,你就有很大的机会去打败热火……好吧,那是信息里提供的东西,假如你在场上真的那么做的话,后果可想而知。”肖说,“能把理论信息结合到在球场上你要防守的实际球员身上,就像现在社会的婚姻问题一样。”

当比赛结束后,看着比赛结果回想刚刚发生的事情,教练组是否真的运用到这些所提供的信息,才是关键。

“关于把理论的数据结合在实际球员身上,这个事情我确实做了不少,”贝尔塞提斯说,“不过有些球员真的让人很苦恼。例如杜兰特,如果我们按照理论数据去限制他的话,在事实上那根本就不起到作用……我只能说,数据分析只是一种版本的事实,它也许并不会100%正确,但是我敢肯定,它不会100%错误。”

“赛后报告是用来总结赛前报告和我们的比赛的。”贝尔赛提斯说道:“球队的有些目标可以通过教练组安排战术来完成,我们需要确定从进攻和防守两端都达成目标。”

开明的教练给了他机会

贝尔塞提斯毕业于哈佛大学,有经济学和物理学双学位。“在哈佛,每个人都很坚强,因为那里的压力很大,尤其是进入那些更成熟的行业,如银行业和咨询业。”贝尔塞提斯说。“从哈佛毕业的人从来没有把目标行业定为体育行业的,至少我不这么认为。”不过,他却很想去体育界工作。因此在大三的暑假,贝尔塞提斯去了纽约参加了一份在NBA实习的工作。但是毕业后贝尔塞提斯接受了一份咨询行业的工作,而不是他想从事的NBA相关的事情。不过在工作中他学会了不少统计和分析的技巧和经验。可是,他希望能够从事篮球行业的梦想,始终在他心里像火一样地燃烧着。

“我喜欢数据。”布莱恩·肖说道:“对我来讲,学会如何去理解你所得到的信息才是关键。在那之前,包括我在内,许多传统学校的教练们不把它当回事,是因为他们没有在电脑时代长大。我相信,数据分析已经是篮球比赛的一部分,而且永远都是。”

“从传统篮球角度来讲。”肖说:“在防守的时候我们不用出油漆区,我们会让对手随便投底角三分球,我们在防守的时候不能去犯规……不过数据分析会告诉我们,这些事情都是错误的。”

有人认为,NBA教练不会去听从一个27岁的数据分析师来改变自己的战术,指出自己球队的优缺点的。

“我觉得让他们相信我,这并不难。因为我打过篮球。”贝尔塞提斯说,“这不像我来自一个完全陌生的统计学校,给他们扔一大堆数字烟幕弹。我知道篮球比赛是怎么打的,而且我并不会完全干涉他们的战术,因为他们是教练,他们做出大的规划,不过同时,我只做一点点小的改动,因为我比他们更了解数据。所以,如果你愿意,这就像是一个完美的配合。”

“教练组已经很出色了,我不会过多的强调他们有多开明。”贝尔塞提斯说,“我希望他们能用到我总结的东西,我也被告知他们的确在用,这是非常棒的。不过与此同时,我知道数据并不代表着一切。有的时候,我给出的数据是这样的,但是他们却安排了完全不同的战术,所以我从来不会很任性。因为我知道,在我的报告中总会有某些东西能帮助到他们……这就是我的工作,能给球队带来额外的几率去赢得比赛。”

在一个82场常规赛的赛季中,总结赛前和赛后报告会占据贝尔塞提斯的大部分时间。不过当休赛期的时候,他会把时间用到球队办公室项目中。

在两年的咨询工作后,汤米觉得自己的经验已近足够了,他决定继续追寻自己的梦想:篮球。所以,他做出了一些必要的牺牲,放弃了轻松的工作,来到伦敦为NBA工作——向国际市场卖NBA转播权。刚刚工作两周之后,大概在2012年八月,他出差到莫斯科,这次偶然的机会改变了他的职业生涯规划。“我在那认识了蒂姆·康奈利。”贝尔塞提斯说,“我们谈了很多关于篮球的东西,他说:‘为什么你在做销售工作?为什么你不从事一份和篮球更相关的工作呢?’我说:‘呃,我有经济学背景,我觉得这就是适合我的工作。’他说道:‘你应该考虑一下离篮球更近一些。’之后我们一直保持联系,当他为掘金工作后,他给我打电话,看看我是否想要加入他们。”

给掘金队的总结

“我们尝试去追踪球员们的成长。”贝尔塞提斯说,“我们想要知道他们去年打得怎么样,今年打得又是什么样,差距在哪,进步在哪。这就是纯粹的数据分析透视法。教练们每天都和球员一同奋战在战壕里,他们知道球员是怎么想的,他们一心为着球员。而我做什么呢?我要盯着数据。例如,是否有某人不像去年投篮那么准了,为什么会出现这种情况?他们是在自己不擅长的区域出手太多了吗?我就是要看着这些东西,有的时候数据是非常真实的。我会和教练分享这些数据,之后教练会根据数据做出自己的计划。”

正如汤米之前提过的那样,教练们的决定就像是一个大树,而他的工作只是树上的一个分支。他能为球队做出更有用的决定提供支持。他在工作中也需要观察联盟中的其他球员,看看哪些球员更适合掘金队的体系,以至于在未来能和掘金队签约。

“数据分析可以被用在很多方面,因为它是一个广泛的工作。”贝尔塞提斯说,“我做了一系列的项目——例如统计和分析球队能打进季后赛的百分比。有些东西已经在网上可以找到了,但是我们要有自己的观点。我们会把自己的预测和最终的实际情况作出比较,我们也会注意观察联盟中的其他球员,而且我们也关注选秀。只要在NBA中可以去分析的东西我们都会去做。当然,也会去分析其他队伍的球员。要不断地去尝试让我们的队伍变得更强大,之所以运用分析就是为了这个。”

“在数据分析中,有一些对球队的分析:我们的速度是否足够快,我们的进攻节奏是否合理,”贝尔塞提斯说,“现在我们已经打出相当快节奏的比赛了,我们是要继续这么高速打球吗?还是我们需要改一改?在过去的10年里是否有一支高速打球的球队赢下了比赛取得了成功?他们的速度有我们快吗?”

丹佛掘金队年轻的数据分析师还兴奋的告诉我们:“在我九岁开始,阿特拉斯·卡尼索瓦斯(前立陶宛著名篮球运动员)成了我的偶像。我总是穿12号球衣,因为他就是12号。我们也打相同的位置,有些人真的会拿我和他进行比较。我的教练总说:‘像他一样打球。’我会说:‘我会努力做到的。’然后,在我大一的时候,我见到了他,那太美妙了!我们一直保持联系,而且还变得很亲密。这是一个很有趣的故事,我在阿特拉斯来掘金之前得到了这份工作。蒂姆给我提供了这份工作,我接受了。两天之后,蒂姆又给我打电话:‘我们有了一个新的助力总经理,是阿特拉斯。’太不可思议了!能和自己的偶像一起工作太酷了!那种感觉是无法用语言来形容的。在训练的时候,我们总是进行投篮比赛,不幸的是,我从来都没赢过他。我希望有一天我能打败他,哪怕一次也行。他总是那个我一直要去学习的人。”

SportVU技术——运动追踪摄像机

随着SportVU技术——运动追踪摄像机的出现,越来越多的数据可以被贝尔塞提斯所利用了。球队就能知道哪些球员善于接球投篮,当被双人包夹时进攻球员会怎么做,球员把球控在手中的时间有多少,等等。棘手的问题是,如何利用这些数据来帮助你的球队。

“在篮球场上,每一个动作都会受到另外九个人的影响,而不是教练的决定。”NBA著名评论员克里斯·布拉德说。掘金队怎样才能确定哪个球员会更适合他们的体系?你敢说那些“从数据上看很适合”的球员,来到掘金后一定会打得很好吗?

“拥有这项技术的确是非常好的事情。”贝尔塞提斯说,“这项技术的优势越来越明显了。不过,数据专家和球迷们很容易被各种数据弄混头脑。你需要在繁多的数据中找到你想要的,然后从中做出总结。这当然比没有数据要好。同时,我们从这项技术中得到的数据太多了,不能只用到某些单独的数据,这是非常复杂的。所以现在的所有人都在这项技术中不断探索,希望能找到更好的方法来帮助大家,我们也不例外,始终在不停地摸索。现在我们已经有一些成就了。”

毫无疑问,每个球队都想能更好地运用这些数据,这种竞争肯定存在。但是现在还没有一个组织可以把每支球队里的数据专家召集在一起来互相讨论,不过贝尔塞提斯认为如果可以有这样的一个组织,那会很有意思。

“确实没有一个组织,但是我觉得应该有一个才好。我认识一些人在为别的球队做数据分析。要知道,每个人都想找到最好的方法来帮助球队,所以就会有很多机密的事情,因此我们并不能把自己的方法和大家分享。不过我们互相都很友善,很明显我们在某种方面讲是同事,但同时我们也在相互竞争,同行是冤家啊。”

教学源代码 篇4

封装、继承、多态等特点为面向对象程序设计语言提供了强大的能力和无与伦比的灵活性。鉴于上述优点,大学计算机专业普遍开设《面向对象程序设计》这门课程,以C++或Java为范例语言讲述面向对象思想、面向对象分析与设计以及面向对象编程。但在实际教学中,面向对象的思想理解较困难,且容易被语言细节湮没,抽象思想和实际应用很难结合起来,造成理论和实际之间的脱节[1]。

该文结合在《面向对象程序设计》教学中的体会,以Java语言教学为例,提出在实验教学中设计案例,应用代码重构工具对程序进行重构和改进,提高学生对代码复用以及软件重构等的认识。

1软件重构和重构工具

1.1软件重构的概念和作用

由于需求改变等原因,软件也在不断变化。有时这些改变并不影响软件的行为,而仅仅改变了软件的内部结构。例如,一个程序员可能会改变函数名称,用一个函数来封装重复的代码,改变函数形式参数使函数更容易复用等。在面向对象程序设计中,保持行为的代码修改通常被统称为重构。重构(Refactoring)是指在保留类(方法)外部行为的同时对代码重新组织的过程和技术。重构的定义,比较权威的是Martin Fowler给出的定义:重构是在不改变软件可观察行为的前提下,对软件内部结构的一种改变[2]。在此过程中会应用一系列的重构技术,这种改变的目标是使软件更容易理解,更容易修改。

重构的主要作用是:保持设计的简单性、可扩展性和可维护性;增强代码的可理解性。在下列情况下需要进行重构:

1)软件复用。可复用的软件通常需要大量的迭代设计。对已有的代码与设计进行重构,抽取可复用单元,将使软件结构易于变化,使迭代设计更加简单,从而使软件得到更好的复用性[3]。

2)需求发生改变,需要增加软件功能。当需求发生变化的时候,就要求对原有的代码与设计进行改变,此时需要对原有的代码与设计进行重构,以使其容易被扩展[3]。

3)修正软件中的错误。因为程序代码凌乱,代码结构不清晰,错误往往很难发现。重构可以让代码结构更加清晰,使得错误容易被发现[3]。

1.2软件重构工具

目前主要的几种Java集成开发环境均提供软件重构功能,如Eclipse、Net Beans、Intelli J IDEA等。Eclipse和Net Beans还可通过安装CDT插件支持C/C++开发,并提供重构功能。Intelli J的系列产品PHPStorm、Py Clarm、Web Storm等也支持对PHP、Python甚至其他语言的重构功能。

以Eclipse为例,其在Refactor菜单下提供了很多重构功能,其中部分常用的重构功能如表1所示。

表1 Eclipse提供的部分重构功能

本文针对其中的若干重构功能,设计了一个教学案例进行演示。其他的重构功能可以通过设计另外的案例来向学生演示和讲解。

2教学案例分析

本文中设计的案例是日期类My Date的编写。My Date类的初始状态包含的方法并不足以满足实际要求,且其中的部分方法只提供了声明而没有加以实现。My Date类的初始UML类图如图1所示。案例的任务是在此基础上对My Date类进行重构,对未实现的方法加以实现。

考虑到日期有效性判断在类中是一个常用操作,已经将其封装为一个方法is Valid Day()。清单1列出了已经实现的私有方法is Valid Day()的代码。

清单1 is Valid Day()方法代码

2.1基础方法的实现

类中的to String()方法、构造方法和getter可以通过Eclipse的代码自动生成功能(source菜单中的Generate to String(),Generate constructor和Generate getters and setters)自动产生方法框架并加以修改。其中的getter和setter也可以通过重构功能Encapsulate Field加以实现。

构造方法My Date()调用is Valid Day()判断日期的有效性,如果有效则初始化属性,否则抛出异常。

2.2 order()、tomorrow()和diff()方法

order()方法的作用是计算当前My Date对象的日期在当年是第几天,其伪代码如清单2:2 order()

清单2 order()方法伪代码for i=1 to month-1

清单3 tomorrow()方法伪代码

清单4 diff()方法伪代码

综合考虑上述三个方法的伪代码,发现有一个共性问题:需要判断是否闰年,从而获取该年的天数或2月份的天数。

2.3对案例进行重构

在类的原有设计中,每个月包含的天数、对于闰年的判断代码均包含在is Valid Day()方法中,order()、tomorrow()和diff()方法无法使用这些代码,必须对代码进行重构,实现代码复用,改善代码结构,使类可以方便地扩展。

首先,选取is ValidDay()方法中的闰年判断部分代码(11-13行),使用Extract Method功能将其提取为方法,将方法命名为isLeap Year。原代码被替换为方法调用,重构生成的方法签名为:

public int is LeapYear(int year,int leap);

其参数在这里属于多余,可使用Change method signature功能对参数进行重构。移除参数leap,并修正代码错误,相应的调用代码也会自动更改,重构后的方法签名为:

public int is Leap Year(int year);

在My Date类中,还可对is Leap Year()方法进行重载,添加一个无参方法对本对象是否闰年进行判断,增加其灵活性。

其次,对于每月天数的判断,可将is Valid Day()方法中的代码3-4行使用convert local variable to field功能提取为类的属性,并修改其属性为static final,方便其他方法使用。

在对类进行上述重构后,其UML类图如图2所示。

3结束语

通过重构,可以看到原有的is Valid Day()方法进行了拆分,类中方法的粒度更加细化,有利于代码的重用。同时,类的结构经过重构之后趋于合理,方便了以后的扩展。在重构过程中,还根据实际需要增加了若干方法,使类的使用更加灵活。

重构是改善既有代码设计,提高代码质量,改进代码结构的方法。代码在开发最初很难有一个比较好的设计,重构可对代码不断进行改进。在面向对象程序设计教学中。引进重构思想,通过使用自动化重构工具,可使学生通过对比重构前后的代码对面向对象思想得到充分认识,将抽象思想和实际应用结合起来,有助于面向对象思想的掌握。同时,还对学生和企业实际软件开发接轨起到了一定辅助作用。

摘要:针对面向对象程序教学,提出在实验教学中通过设计案例,应用代码重构工具对程序进行重构和改进,提高学生对代码复用以及软件重构等的认识,有助于面向对象思想的掌握,也有利于学生编程能力的提高。

关键词:面向对象,软件重构,代码复用

参考文献

[1]刘继承,孔维华,陈娟.在《面向对象程序设计》教学中引人敏捷软件开发思想[J].科技信息:科学.教研,2007(31):100-101.

[2]付友涛,许林英.软件工程新方法——软件重构[J].微型机与应用,2003(10):4-6.

教学源代码 篇5

小学语文教学论试题

课程代码:00410

一、单项选择题(本大题共15小题,每小题1分,共15分)

在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。1.下列不属于...听说教学目标的是()A.听说普通话方面 B.理解和表达方面 C.态度、习惯方面

D.读写能力方面

2.说话能力的构成要素主要有组织语言能力、应变能力和()A.辨析能力 B.记忆能力 C.表情达意能力

D.理解能力

3.构成听话能力的前提是()A.观察力 B.理解力 C.记忆力

D.注意力 4.日本语言教育学家西尾实把语言发展的 9.阅读能力的基础是()A.一定的阅读速度 C.认读书面语言的能力

B.记忆书面语言的能力 D.理解书面语言的能力

10.“国文”科的名称正式见诸法令始于______年。()A.1907 C.1912

B.1906 D.1920 11.我国模仿美国六三三制而颁布的学制是()A.壬寅学制 C.壬子·癸丑学制

12.我国现存最早的识字课本是()A.《千字文》 C.《三字经》

B.《百家姓》 D.《急就篇》 B.壬戌学制 D.癸卯学制

13.将课程定义为是儿童在走向社会的过程中所经历的全部经验的学者是()A.杜威 C.凯洛夫

B.斯宾塞 D.赫尔巴特

14.对小学生语文成绩的评估提倡采用的方法是()A.记分 C.评语

B.等级

D.等级+激励性评语

15.在__________中识字,是形、音、义紧密结合的有效途径。()A.写字 C.训练

B.作文 D.语言环境

二、多项选择题(本大题共15小题,每小题1分,共15分)

在每小题列出的五个备选项中至少有两个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选、少选或未选均无分。16.听说教学与发展思维之间的关系是()A.思维是听话、说话的基础 C.听说训练能促进思维发展 E.听说训练不能促进思维发展

17.小学语文教学中,学习语文与认识事物相统一的原则是指()A.二者是辨证统一关系

B.语文教学要加强与客观事物的联系 B.思维对听话、说话起组织调控作用 D.思维与听说没有明显关系

浙00410# 小学语文教学论试卷 C.在认识事物的训练中要密切联系语言文字 D.自觉地进行思想教育 E.采用启发式教学

18.小学语文教学基本原则提出的依据是()A.小学语文的学科性质 B.小学语文学科的任务 C.小学语文的教学实际 D.家长的要求

E.学生的要求

19.听力的构成要素主要包括()A.注意力 B.记忆力 C.理解力 D.联想力

E.辨析力

20.对于处理评估信息的方法正确的说法是()A.应有定性分析

B.应有定量分析

C.定性定量分析应有机结合 D.语文学科应以定性分析为主 E.语文学科应以定量分析为主

21.课外阅读的意义主要有()A.是课内阅读的延伸 B.有利于学生开阔视野增长知识 C.有利于完成作业

D.有利于学生提高认识陶冶情操 E.有利于发挥学生的自觉能动性

22.1992年《九年义务教育全日制小学语文教学大纲(试用)》的特点主要有()A.调整了大纲结构

B.体现了素质教育的思想 C.面向全体学生,适当降低了语文教学要求 D.各年级教学要求目的明确、具体 E.首次提出素质教育

23.识字的质量标准是()A.会读 B.会写 C.会讲 D.会用

E.识字能力

24.1907年公布的《奏定女子小学堂章程》的意义主要表现在()A.学堂所教授的科目中设有了国文科 B.科目中设有了读经科

C.动摇了儒家经典在学校课程中的统治地位

浙00410# 小学语文教学论试卷 D.标志着学科意义上的语文教学开始进入课程 E.学校科目里取消了读经科

25.国语运动提出的主要主张是()A.提倡白话文 B.提倡言文一致 C.提倡学习语文 D.提倡国语统一

E.提倡学习古典文言文

26.1963年《全日制十二年制学校小学课本语文》的主要特点有()A.把识字教学作为主要任务 B.重视多读 C.重视多背

D.加强练习E.增强应用文的比例

27.一篇课文的教学目标应当从_______方面来拟定。()A.语言文字训练 B.思想教育 C.非智力因素 D.一般发展 E.智力因素

28.“

三、千、百”是我国古代识字课本的统称,包括()A.《幼学琼林》 B.《三字经》 C.《百家姓》 D.《千字文》 E.《弟子规》

29.以下属于教学结构“变式”的例子是()A.导读——扶读——自读 B.讲——练——讲 C.变序阅读

D.常序阅读 E.看图作文的教学结构

30.对作文要写真实的生活的认识,可以从_______方面进行。()A.有助于很好地生活 B.有助于丰富生活积累 C.有助于打好作文的基本功 D.培养学生做人的品德 E.有助于阅读能力的形成

三、填空题(本大题共6小题,每小题1分,共6分)

请在每小题的空格中填上正确答案。错填、不填均无分。31.我国古代对儿童进行启蒙教育的机构称为________。32.《中华人民共和国义务教育法》颁布于________年。

浙00410# 小学语文教学论试卷 33.实验时间较长,影响较大且取得可喜成果的主要形式有集中识字、随课文分散识字和 “________”。

34.________是智力的核心,是形成各种语文能力的关键。

35.为了帮助刚走上教学岗位的教师和教学有困难的教师掌握教学的基本规律和方法的听课形式叫做________。

36.在观察图画的基础上进行听说训练的方式叫做________。

四、名词解释题(本大题共3小题,每小题3分,共9分)37.审定制 38.教学大纲 39.阅读能力

五、简答题(本大题共4小题,每小题5分,共20分)40.小学语文教师应如何提高政治思想水平? 41.如何联系生活实际培养学生的听说能力? 42.如何克服阅读教学的种种弊端?

43.如何才能使小学语文教学评估具有较强的科学性?

六、论述题(本大题共2小题,每小题10分,共20分)44.如何指导学生在作文中表达自己的意思? 45.优化阅读教学结构应注意哪些问题?

七、材料分析题(本大题共l小题,共15分)

46.阅读下面《桂林山水》的教学片断,分析该片段体现了小学语文教学的什么原则?是如何体现的? ……

师:假如我们现在到了桂林,登上拔地而起的奇峰,看到这儿山清水秀,我们想说一句什么话?

生:这儿的山水真美呀!

生:人说桂林山水甲天下,果真是这样。生:桂林山水甲天下。

师:这时你们只想到桂林的山水吗?我们的祖国很大,像桂林这样的山水各地都有。我们 看到桂林山水,就会想到祖国的山山水水。“山水”又可以怎样说? 生:山河。

浙00410# 小学语文教学论试卷 生:河山。生:江山。

师:谁能从中选一个词组,说一句话表示祖国山河的美? 生:祖国的河山多壮美。……

师:改成感叹句会吗? 生:祖国河山多壮丽啊!

师:再加重语气,改成反问句,会吗? 生:祖国的河山这么美,我能不爱吗?

师:学习了桂林山水,我们知道祖国山河秀丽,更加深了我们对伟大祖国的热爱。……

女明星们的 “源代码” 篇6

话至此,读者的下一句肯定要问:“这人是谁啊?” ——你想知道吧?你想知道我就偏不告诉你!周刊只以字母代替,称之“K姓女星”。

同类事件有艳照门。当初的爆料者也是故意只发几个字母、几张相片的剪影,让事情不断发酵,致使全民陷入“我猜、我猜、我猜猜猜”的疯狂游戏中。闲极无聊的网民们,绞尽脑汁都想争在其他人前面翻出艳照的“真相”。

再有就是去年台湾警方捣毁的卖淫集团中发现有三名分别姓L、S、K的知名女艺人参与卖淫——同样是一石激起千层浪,台湾人民又玩了一回“猜字母”,把所有与这三个字母有关联的女星全拉出来筛选了一遍。再再有就是大嘴吴君如曝出的“集邮女”、台湾综艺节目“王牌鉴定团”曝出的“集邮男”……这些,玩的都是猜谜的游戏。

用猜谜的方式,可以免掉些许可能发生的官司——当事人肯定是不敢跳出来告你侵犯隐私的,因为她一跳出来就变成不打自招了,只能是哑巴吃黄连,噤声,再噤声。就算她跳出来,周刊还有耍赖的余地,可以说:“我说的不是你,你自己心虚对号入座罢了!”

事实证明,与直书全名相比,用字母代替不仅免去官司的烦恼,更能达到炒作的效果。如果直书全名,你看完,估计也就“哦”一声,然后发几句谴责,明天一醒事情就翻篇了。可使用了“字母”之后,民众的好奇心就被吊起来了,会在脑海里按着新闻“提供”的“线索”挨个对号入座,然后挑出几个可能的对象,明天上网和别人交流下信息,求证一下自己猜对了没,没有的话集大众“智慧”再继续猜下去——瞧吧!这本来一天就过时的娱乐新闻,如此一来可以炒上十天半月甚至更长。

“卫道士”们也不必骂围观者无聊,想那些年,我们谁没有猜过这些“字母”呢?

教学源代码 篇7

关键词:代码生成,SSH,模板引擎,教学

近年来,随着软件工程的逐步成熟,面向对象分析设计工具和手段的发展,实现了对某些类似的软件功能模块实现重用以节省开发时间和成本[1]。与此同时,代码生成器的概念迅速流行。根据系统模块抽象出一般性可复用的功能模块,并通过代码生成器来自动生成此模块,这不仅为软件公司节约了软件开发成本和时间,还保证了代码开发质量,为系统的后续开发打下了坚实基础[2]。高效,灵活,快速构建可重用系统模块的代码生成器已成为当今世界热点[3]。代码生成器可以帮助解决重复性的工作,降低软件开发成本,特别是对中小型软件企业来说,能减少公司有限资源的浪费。

为了更好的与信息行业接轨,提高学生实践动手能力,在目前部分高校的计算机相关学科专业中,嵌入了多个项目开发的集中实训环节,这些项目均来自于真实企业,代码量达到了一定规模。教师需要充分利用这些项目,在锻炼学生程序编写与软件开发能力的同时,强化面向对象的思想,培养敏捷开发和极限编程的意识。本文结合软件开发行业发展现状和高校计算机应用人才培养的需求,设计和实现了基于Spring框架优化敏捷模式的代码生成器。在实际教学过程中,对于已经完成了Struts、Hibernate和Spring框架学习的学生,在项目集中实训中引入代码生成器,达到在有效范围内减少重复代码编写,强化SSH三大框架理念和模拟真实企业软件开发环境的目的。

1 代码生成器发展现状

目前市面上存在各种各样的代码生成器及应用,如基于SSH框架的代码生成工具的设计与实现[4],利用JAVA和XML构建代码自动生成器加速企业级应用开发[5],基于Java的代码生成器的设计与实现等等。代码生成器及相关的应用发展较快,为相应的软件提供商软件开发能力带来了实质性的提升。但是,如何更好的提升代码生成器的代码产出效率和模式,是其面临的主要问题,还存在着很大的改进空间[6]。例如,生成持久层模板代码后,是否可在此基础上行进扩展,如果可扩展,那么以何种方式才能使得代码扩展的更灵活。另外,有些代码生成器只是简单的基于开源框架(如Spring),或者是基于某一Java EE组件(如EJB)等进行重复性代码生成,而没有考虑到怎么生成优质源码或文件来摒弃框架或组件的缺点,由此造成系统开发的速度并没有实质性的提升[7]。开源框架或者某一组件在一些用途上确实有着其独特优势,但是往往功能越强大,其配置文件也将逐渐变得复杂起来,大多数软件提供商并没有用到或用好这些功能点,这将使得代码生成器自定义规则文件也随之变得庞杂,进而没有达到快速构建或优化系统的目的。些代码生成器产生代码所依赖的规则或模板文件翻译成源代码不够简洁,使得生成代码缺乏灵活度和快捷等等[8]。基于这些问题,研究一种能快速、便捷、灵活、优化构建系统可重用模块的代码生成器逐渐成为一种必然趋势。实际上,国内已有前人在该应用给出基于敏捷方式的部分研究结果,可以从中看到高效、快捷代码生成器产生的可能性。

2 基于Spring框架优化敏捷模式的代码生成器设计

为了SSH框架教学的深入拓展,让学生在实际项目开发过程中了解到代码生成器的优势,本研究从代码生成器的基本原理出发,以利用现有SSH框架知识和DOM技术提高项目开发效率为原则,对其功能和内容开展了细致的分析,进行了详细的设计。

为达到设计目标,结合系统软件设计与实现所需要涉及的技术和所依赖的工具及平台,确立设计目标如下:

(1)基于SSH三大框架搭建JAVA平台,建立整个系统框架。

(2)使用DOM技术把所需要录入的基本数据信息,按照一定的编码规则,生成出SSH框架中使用的XML配置文件。

(3)实现根据外来客户需求修改XML配置文件的目的,以达到修改现有代码和生成目标代码的功能。

(4)运用Eclipse插件技术,在Eclipse开发环境中集成代码生成器,方便用户可以随时使用或修改代码需求查看配置信息界面。

确立了设计目标后,本代码生成器依功能划分为四大模块:

(1)基本信息录入模块:这一模块主要是让系统人员可以根据客户的具体需求通过UI界面,用较为快捷和方便的方式录入信息,获取系统所需的信息内容、路径和模板保存信息。

(2)规则文件XML生成模块:这一模块主要在三大框架中生成所需要保存信息的规则文件XML,选择DOM技术解析XML文件。

(3)界面模板解析模块:这一模块主要是针对导入的XML文件信息来设计的,确认所导入的信息是否与客户所要的需求一致,XML规则文件是否编写正确。同时,可以提取到标签,并将其中的信息予以转化。

(4)代码自动生成模块:这一模块主要是根据之前三个步骤中导入并确定无误的客户信息(需求)通过一定的规则从XML中解析出来,并予以自动生成目标需求的代码。

整个代码生成器系统有两个入口:软件基本信息录入模块和UI用户界面模块。通过一定的依赖技术转化成特定的需求信息,最终生成目标代码。最关键的是代码自动生成器的程序,根据客户的需求录入相关信息,通过UI用户界面修改及确认信息,获取得到标签信息,方便生成特定的XML规则文件(即符合客户需求但方便后期修改),分析所录入的信息后生成并保存在实例化对象中,并将信息转化成标签的JSP页面,其中可以采用DOM技术解析XML文件。

3 系统实现

系统实现主要包括基本信息录入、XML配置文件生成、代码自动生成和插件生成这四个模块的实现。

3.1 基本信息录入模块的实现

基本信息录入模块的设计目标主要是给软件人员及客户提供一个GUI,便于其能够方便的录入,修改,删除系统的基本数据信息。可以在该基本信息录入模块中录入类名,属性类型,属性名,来生成一个具体的类代码,代码中包含构造器及每个属性所对应的set和get方法。这部分代码要求显示在一个文本区中,这部分代码要求有复制,粘贴功能。CodeCreate类,生成代码的JFame;MousePopMenu类,弹出菜单;rCode类的属性封装类。

3.2 XML配置文件生成模块实现

XML配置文件生成模块主要是生成SSH三大框架中的XML配置文件。这部分主要是应用了DOM技术来解析XML配置文件,主要的类结构如下:

(1)XMl配置操作类Model。

(2)在添加一个配置项的操作类ModelConfig。

(3)事件方法btnsave_click,在前台调用生成xml配置文件。

(4)事件方法btnread_click,获取xml配置信息。

3.3 代码自动生成模块的实现

代码自动生成模块是整个功能软件的核心所在,该模块将其余的模块通过接口全部串联起来,使之功能一体化,真正实现代码的自动生成,达到预期的目标。在实现代码自动生成模块的实现过程,最重要的是选择一个适合的代码自动生成技术。本研究选用Velocity模板生成技术。Velocity是一个基于java的模板引擎(template engine),允许任何人使用简单的模板语言(template language)来引用由java代码定义的对象。

模板引擎的工作分为三步:

(1)取得模板文件并确认其中的模板语言符合规范,把模板文件解析成一颗节点树,其中包含模板文件的静态内容节点和模板引擎所定义的特殊节点。

(2)取得数据对象。该数据对象一般通过程序传递引用实现。本研究采用推技术,controller调用set方法把动态数据注入,模板引擎通过get方法获得。

(3)合并模板文件(静态内容)和数据对象(动态内容),生成最终页面。合并机制为:模板引擎遍历这颗节点树的每一个节点,并render该节点,遇到静态内容节点按正常输入,遇到特殊节点就从数据对象中去得对应值,并执行其表达式语句。

在具体实现上,实现了一个工厂类TemplateFactory,用来得到模板引擎,一个模板引擎类VelocityTemplateEngine。

3.4 插件的实现

插件是对平台或者说是软件功能的补充和拓展,主要对相应的功能建立拓展点,创建插件清单文件来申明这些拓展点。清单文件为plugin.xml,声明一些常规的信息和必须的插件,

设计结果如图1所示。

本研究需要使用工作台插件,扩展它的两个扩展点,通过extension标记拥有点属性。操作集合分组了基值,这样用户可以更方便地管理它们。插件的实现主要通过继承自AbstractUIPlugin的Hello Plugin类实现。整个代码生成器运行效果如图2所示。

4 工作展望和教学启示

本研究根据目前高校Java类软件人才培养的需求,以SSH框架学习为出发点,对目前软件开发过程中的重复编码,项目开发效率低和客户需求个性化等切实存在的问题分析入手,阐明了代码自动生成工具的重要性、必要性以及社会和经济效益,分析了目前国内外的发展现状,对适用于软件开发和SSH教学的代码生成器进行了分析研究与系统设计实现。具体来说,主要成果如下:

(1)合理利用了最新进的敏捷模式设计代码生成器,抽象出一个相对通用的系统模型,然后将这个模型进行整合和提高,并多次测试和修改。

(2)基于SSH三大框架建立模型,在Java语言的基础上,运用了DOM技术、Velocity模板引擎技术及Eclipse插件技术等。

(3)设计和实现了基于SSH框架优化敏捷模式的代码生成器。本代码生成器分析了目标系统所需要哪些基本数据信息,并且为了获得目标系统的基本数据信息。

随着系统的研究和使用,也逐渐暴露了系统存在的一些不足之处,同时这些不足也帮助了系统的不断完善,使之走向成熟与稳定。对于系统今后发展,主要考虑以下两个方面:

第一,在对己生成的旧代码文件进行更新时,如何保留用户手工添加的代码。

第二,目前代码生成工具只能生成对数据库的操作功能,包括增加、删除、修改以及查询等,还不能提供可视化的定制复杂业务处理逻辑以及生成相应代码的功能。

在教学过程中,学生分组进行系统分析、设计和实现。从实际情况来看,一些项目小组对这部分工作有抵触心理,认为是在完成项目之外的额外负担,没能很好的完成代码生成器的设计和实现。在今后的教学工作中,一方面会通过强制考核的方式,将这部分工作完成情况纳入项目考核中;另一方面将通过讲解部分学生已完成的代码生成器功能和实现,目前在IT行业内其应用现状,进一步激发学生对代码生成器及相关技术的学习和开发热情,巩固SSH框架的理论学习,更好地为SSH项目开发服务。

参考文献

[1]任佳丽,曹海燕.嵌入式软件自动代码生成和代码整合方法研究[J].太原理工大学学报,2013,44(4):518-521.

[2]朱敏.一种基于SSH框架的MIS代码生成系统的设计与实现[J].南京师范大学学报(工程技术版),2012,12(3):49-53.

[3]魏颖.基于Maven的J2EE后台管理系统代码生成器[J].计算机与现代化,2014(2):46-50.

[4]高洪岩.至简SSH精通Java Web实用开发技术[M].电子工业出版社,2009.

[5]Eckel B.Java编程思想(第4版)[M].机械工业出版社,2007.

[6]张森,邓磊,吴健,等.一种基于MDA的分布式对象模型框架代码生成方法[J].西北工业大学学报,2014,32(1):49-54.

[7]卫红春,贾笑蕊.特定领域建模方法和代码生成的研究[J].微电子学与计算机,2013(9):153-156.

源代码 篇8

穿越穿越是穿越时间和空间的简称。它是指某人因为某种原因,经过某个过程(也可以无原因无过程),从所在时空(A时空)穿越到另一时空(B时空)的事件。

剧情简介

在阿富汗执行任务的美国空军飞行员科特,史蒂文斯上尉(杰克.吉伦哈尔JakeGyllenhaal饰)突然惊醒,发生自己在一辆高速行驶的列车上,而他的身边坐着一个素不相识的女子克里斯蒂安(米歇尔·莫娜汉MichelleMonaghan饰)正在与自己讲话。科特不知自己为什么会在这辆车上,而且他发现自己居然是以另一个人的身份存在,正当他迷惑不解的时候,列车上忽然发生爆炸……

任务的美国空

开放源代码软件成熟度评估(下) 篇9

3.6开放源代码软件成熟度评分与结果计算

3.6.1评估结果计算算法

在采用评分制的成熟度评估过程中, 评分规范的定义也非常重要, 它决定了评估属性的评测结果是否能正确地转化为量化的、可比对的分值, 从而真实地反映该属性在软件中的实际发展情况。评分规范要遵循准确无异议、可量化、基于角色需求等准则进行编制。

我们特别说明一下角色需求在评分规范中的意义。在实际的评分过程中, 我们可能遇到这样一种情况:同一个评估属性对于不同的用户需求可能评估结果好坏标准不一样。如, 这个属性对于一般使用用户和软件系统集成商来看含义不一样, 或重要程度也不一样, 所以在不同的需求下, 评分的标准也要不同, 这就是基于角色的评分标准。

以上, 我们非常简单地概述了成熟度评估中的评分规范的制定原则, 具体的规范内容我们不再讨论, 读者可以查找相关资料进行实际操作。

如何对评分进行计算获得符合实际情况的成熟度量值是成熟度评估的重要环节。开放源代码软件成熟度评估计算模型是在评估标准与属性标准的共同指导下发展而来的。考虑到评估结果的公平性和准确性, 我们将计算过程分两部分设计:

第一阶段将每个属性评分和其相关的权重值代入公式取得该属性类的评分值。计算结果取平均值公式 (1) 。属性类评分值计算:

其中, Ui为某属性类i的一个采样属性评分值, Wi为该属性在这一属性类中的权重。各属性取样值与权相乘再取平均值得到属性类的评分值A。

第二阶段计算软件成熟度结果值。开源软件的成熟度由前面计算得到的属性类评分值乘以相应权重后相加得出。

公式 (2) 中, 我们用M表示开源软件的成熟度;Ai表示第i项评估属性类的计算得分;Wi表示第i项质量属性类在整个评估体系中所占权重。

通过两阶段计算, 我们可以减弱由于属性选取当中的某些不合理因素带给评测结论的偏差, 也可以充分体现软件中不同评估方面的权重比例。

3.6.2 评估取值与评分约定

我们实行成熟度属性的分级定义、分级运算, 每一级都有自己的权重体系, 通过从下向上计算最终得出软件的量化质量评估值。属性取值按照评估规范的取值定义和标准评测、填写。而属性的评分分6个等级, 0分表示该属性没有取值。数值越大说明该属性成熟度越好。本文没有讨论属性取值规范 (属性如何取值) 和权重体系定义规范 (如何确立属性权重) , 请查阅其他资料。

我们规定属性评估结果的评分见表10。

属性和属性类都拥有自己的权重定义, 属性的权重定义更细致, 这样可以充分反映属性的差别。注意属性类中的属性权重指的是该属性在这个属性类中的重要程度, 只和同类中的其他属性比较。见表11和表12。

我们可以定义如下属性类, 见表13。

各属性类的属性定义的格式见表14。

3.7 评估的实施

建立了评估流程和属性定义后就进入了评估的实施环节。通过各种检测手段或从各种途径搜集相关统计信息, 甚至可以和相关开源项目进行直接沟通, 获取第一手数据, 得出各评估属性的取值。

然后, 按照我们开放源代码软件评估体系计算模型的公式进行计算, 最终给出该软件的最终评估值和相关中间结果。需要注意的是, 根据用户需求的不同, 可以计算最终结果值, 也可以只计算各属性及属性类的结果。因为对于普通的开源软件选型而言, 我们只关注最终结果的高低就可, 但对于一些更加复杂的需求, 评估人员需要更多关注某些属性和属性类的评估结果, 这样, 最终结果可能反而对他们就并不那么重要。

计算结果后, 评估人员需要依据最终用户的需求对相关成果进行分析, 最终给出用户一个准确、实用的评估结论, 以供用户参考。

3.8 评估报告内容

所有评估、计算和分析工作结束后, 我们应根据用户的需求撰写成熟度评估报告 (或选型报告) 。以下列举一些通用的报告内容供评估者参考。

●软件介绍

介绍软件的历史、功能、使用的平台等软件的基本信息。

●技术架构分析

分析软件的架构、模块划分、技术路线等软件设计问题。评估软件的灵活性、可扩展性、可移植性等技术特性。

●软件代码质量评测

通过对开源软件代码的直接分析, 评估代码的书写质量和可信度, 从内部了解程序开发的质量。评估的结果生成一个代码评测报告供成熟度评估参考。

代码监测工具的主要功能有:软件缺陷检测、安全漏洞检测、软件架构分析、软件度量分析、可定制的代码分析、开发人员IDE集成等。

●软件可测试性

对软件的可测试性进行评估。软件项目是否有自己的独立测试组, 是否提供了专门的测试环境、测试工具, 是否提供相关的测试用例。

●易用性研究

一种重要的软件质量黑箱测试方法。对普通用户提供软件使用能力重要参考。

●可用性评测

另一个用户参考的重要指标。软件的可用性评测就是要对软件的可靠性、安全性及软件性能进行测试和评估, 给用户进行软件选择提供参考。

●社区及项目组织

该领域包含了项目的组织形式、运作方式和社区的参与模式等组织特性。通过对软件项目运作模式的分析可以帮助我们从侧面了解软件的发展。

●社区及项目组织

社区是否向开发的参与者和用户提供基于网络的支撑及交流机制。该项目是否成立有相应的商业机构负责提供商业应用支撑及客户服务。

●法律风险

分析开放源代码软件采用的版权协议, 分析软件可能或有潜在的可能涉及其他版权协议或技术专利等问题的法律风险, 评估他们是否会对软件的发展形成正面的或负面的影响。

●软件选型方案

评估者可以通过为评估软件建立一个应用方案以实例说明软件的功能和使用领域, 使用户能够直观的审视软件的各项特点。

●相关资料附录

包括代码监测报告、黑箱测试报告、相关软件或模块涉及的许可协议文本、软件所有者的免责声明, 以及其他能够对用户进行软件评估或选型有帮助的信息。

4结论

主要针对开源软件成熟度模型及其涉及到的成熟度属性定义、取值计算方法等论题展开讨论, 并基于传统的软件质量评估模型, 结合开源软件在开发、测试、使用等诸多环节的特殊性提出了我们开源软件成熟度评估模型和计算方法。通过对该评价体系、评估方法进行的尝试, 初步证明了该评估模型的实用性, 为我们今后进一步完善开源软件成熟度评估技术, 改进评估方法奠定了基础。

参考文献

[1]郑人杰, 殷人昆, 陶永雷.实用软件工程[M].北京:清华大学出版社, 1997.

[2]中华人民共和国科学技术部.软件业ISO 9000质量体系的建立和认证[M].北京:清华大学出版社, 1999.

[3]Karin van den Berg.Finding Open options An Open Source software evaluation model with a case study on Course Management Systems[D].USA:Tilburg University, 2005.

[4]杨加, 潘勇.软件质量与软件测试[J].电子产品可靠性与环境试验, 1998 (6) :7-9.

[5]徐仁佐.软件可靠性模型及应用[M].北京:清华大学出版社, 1994:143-147.

[6]冯玉琳, 赵保华.软件工程:方法.工具.实践[M].第二版.合肥:中国科技大学出版社, 1992.

[7]国家质量监督检验检疫总局.GB/T 16260-1996信息技术软件产品评价质量特性及其使用指南[S].北京:中国标准出版社, 1991.

[8]何国伟.软件可靠性[M].北京:国防工业出版社, 1998.

大数据下源代码同源性安全分析 篇10

随着大数据时代的到来,数据安全、数据分析等成了人们关注的焦点。而数据增加的速度极快,增长量更是巨大的。因而, 对于数据的分析不仅仅是掌握大量的数据,而是对其进行针对性的处理。

1源代码同源性分析简介

对软件进行同源性鉴别就是分析比较两个软件从源代码到软件功能之间的差别,找出它们之间的相似之处或者相同之处。 在进行比较鉴别的时候,主要是查看软件形成基础的程序源代码。在软件系统的源代码中,存在很多相同或者相似的代码片段, 我们把它们称作克隆代码,克隆代码之间是具有同源性的。目前, 国内外的学者对源代码同源性检测的研究有很多,研究比较多的就是源代码抄袭技术的检测,也就是对克隆代码的检测。经常使用的检测源代码同源性的方法包括文本相似和功能相似这两种。 其中,文本相似的检测主要集中于对源代码中声明、标识符、文字、变量类型等的检测;而功能相似检测注重的是程序段之间结构和语义的不同,而不关注程序段之间格式或者变量名的改变。 在使用功能相似检测的时候,如果两个软件的代码段是由不同的句法或者变量编程实现的,但是它们实现的功能是相同的,就能够通过该检测识别出来。

最早研究检测代码中的克隆代码是在20世纪90年代,是随着软件维护的问题出现的,而逐渐受到人们的关注。在90年代中期之后,对克隆代码检测工具的研究日益增多,并且在软件研究领域变得很兴盛。到目前为止,对于源代码同源性的检测技术主要包括四大类,分别是基于文本的鉴别技术、基于编程风格的鉴别技术、基于抽象语法树的鉴别技术以及基于语义的鉴别技术。

1.1基于文本相似性的鉴别技术

基于文本相似性的鉴别技术有很多种,比较典型的包括基于子串匹配的方法、基于参数化的匹配方法,除此以外,应用比较多的还包括词频统计法,它也经常用于同源性的鉴别。该方法主要是对文本层次的检测,而没有考虑代码本身的语义特征,这样就使得该技术的局限性较大,在检测的时候,很容易出现漏检的现象,这样就让代码抄袭者很轻松的逃过检测。但是,该方法在检测的时候,主要考虑的是文本序列和文本组合,因此,它的误检率较低,在网络安全中的应用还是比较多的。

1.2基于编程风格的同源性鉴别技术

基于编程风格的同源性鉴别技术在检测的时候是根据编程人员的编写风格来判断软件的同源性。采用该方法鉴别同源性的时候,主要分为两个阶段。第一阶段要对了解文件的主要编码风格特征,第二阶段再对检测代码进行检测,检测时主要使用的是三种不同的模块。这样就能够确定被克隆的位置。该方法在实现的时候需要耗费大量的人力和物力,很难实现自动化,可实施性也不强,因此,应用的比较少。

1.3基于抽象语法树的鉴别技术

基于抽象语法树的鉴别技术最早是由Baxter等人提出的。抽象语法树是一种类似于树的存储结构,它是经过代码段的语法分析后形成的,它保留了很多树节点的信息。运用该技术对代码段进行检测的时候,主要是对比分析代码段的语法结构,并对节点的值进行比较,根据节点的值判断代码文件是不是具有同源性。 该方法的实现过程是一个相当复杂的过程,而且在检测的时候也很容易出现误检的现象,因此,应用该方法进行检测的比较少。

目前有很多工具可以对源代码进行语法分析,比如javacc, 它是对java的一种优化。另外,Lex和Yacc是两种基于词法分析和语法分析的软件,它们能够对结构化的程序源代码进行转换,该工具在使用的时候效率较高。

1.4基于语义的鉴别技术

基于语义的鉴别技术突破的传统的思维,不再只关注代码抄袭的形式,而是通过语义方面的判断,来识别代码段的同源性。 该方法在进行检测的时候,主要是运用程序依赖图的方式,它将源代码转换成图形的pdg格式,并使用子图的同构性来检测代码段之间的相似性。例如,有如下代码:

我们得到的对应的流程图如下:

通过这个图就能看出数据之间的依赖关系,而这些依赖关系中包含了所有的语义信息,然后就可以利用等价的方式进行同源性的匹配分析。

2大数据下的安全分析

在分析大数据环境下的代码同源性的时候,主要是分析它们之间的相关关系,并不是注重因果关系。对于大数据来说,它主要具有四个特征,即规模很大,多样性,速度极快,且真伪难辨。大数据的起始计量单位是至少1000T,并且它的种类很多,包括网络日志、图片、地理位置信息等。除此之外,它的商业价值很高,并且处理速度极快。这就是大数据传统数据挖掘本质的不同。

目前,随着互联网的不断发展,一些网站和应用系统出现了漏洞,导致一系列的安全事故发生。在一些大数据的行业中,使用第三方数据库和中间件的频率很高,而这些系统存在的漏洞比较多,在进行修复的时候也很不及时。因此,我们需要对大数据进行分析,从中挖掘出新网站攻击的特征以及一些网络漏洞,从而分析同源的木马病毒。通过大数据的分析,可以发现一些潜在的安全事件,通过各个事件之间的关联性,就能够找出完整的威胁。此外,通过对大数据的分析,可以将分散的信息整合在一起, 这样就能够主动的采取安全防御措施,从而识别出更多的危险并阻止它。利用大数据进行分析的主要框架包括以下几个部分:

2.1数据的收集

我们需要在网络中收集各类信息,包括来自浏览器拓展的信息、查毒网站的一些信息,还有从事数据收集的安全供应商那里的信息,通过对这些数据以及一些网络攻击实例的研究,可以得到一个可用的数据库,帮助我们进行鉴别和检测。

2.2数据的存储

对存储的数据库进行研究分析,并获得它的提取码。对关键主机存在的同源性漏洞进行分析,建立一个漏洞的知识库,并对知识库中的各种性能指标以及该网络环境下的拓扑结构进行分析研究,获得一个网络环境的知识库。

2.3及时响应

获得同源性漏洞知识库之后,就能够对安全事件的有效性进行确认,可以通过多个渠道收集威胁网络安全的信息以及数据, 包括恶意软件的哈希值,恶意链接等,然后将它们存储起来。当威胁源被数据化之后,就可以通过同源性分析判断该威胁是新出现的,还是一直存在的,并且能够识别出它的基本特征,然后自动的将这些值返回给系统,以及时采取相应的措施。

除此之外,通过对大数据的同源性安全分析,还能了解一些钓鱼网站的信息并且判断这些威胁的发展趋势。这样就可以对一些企图攻击网站的恶意软件提前发出警告,以提高系统的防御性。

3大数据安全的应对对策

针对目前大数据的应用现状,在安全储存时采用的是虚拟化海量存储技术,它能够实现对信息资源的存储、传输、隔离、恢复等。在解决大数据的安全存储问题时,首先可以考虑对数据进行加密处理。无论是在大数据的安全设计服务中,还是在信息的传递过程中,加密技术都可以实现对数据流的有效保护。目前, 经常使用的加密技术包括PGP和True Crypt等程序。另外,可以使用分离密钥和加密数据对大数据进行保管分离,从而实施保护,同时,能够实现对密钥管理生命周期的定义。除此之外,过滤器和数据备份都是有效的进行大数据安全储存的方式。过滤器具有很强的监控作用,当数据离开用户的网络时,它能够实现对数据的阻止,防止它再次传出。数据备份则能够保证在大数据被破坏之后,有备无患,实现对大数据的安全管控。

4总结

通过对大数据同源性的安全分析,可以有效的确认对网站进行威胁的事件,对数据以及网络的安全起到了保护的作用。通过对软件漏洞的快速定位,为网络开发提供了技术性的支持,在大数据时代具有积极的现实意义。

参考文献

[1]陈慧.大数据下源代码同源性安全分析探讨[J].科技视界,2015.

[2]路梅,赵向军.程序源代码同源性度量技术研究[J].徐州建筑职业技术学院学报,2007.

上一篇:自然资源使用权下一篇:整形小波变换