一个网络隐私安全的故事

Network Security

起因:在一次偶然使用谷歌浏览器浏览自己写的网页时,发现浏览器会额外的加载一些不明所以的js脚本和请求经过考究,发现这些js脚本显然并不是我的网站本身自带的请求。可以通过另外一个浏览器进行验证。

如图所示左边的所有请求都是 谷歌浏览器额外加载的内容
这里面包含了js脚本,以及一些数据请求。看到这里的时候,我的内心突然一紧,这些数据请求会不会提交了我正在浏览的网页信息呢?。查看了一下请求头提交的数据参数,发现都是一些加密数据。有一个请求的提交参数直接是明写了浏览的 网页地址信息 和时间戳。

我用的是本地的服务进行的测试,所以他获取到的仅是我本地的ip数据
然后我尝试百度了一下这些 请求地址的关键字信息,例如第一个js文件的地址是:http://promclickapp.biz/1e6ab715a3a95d4603.js我截取了 promclickapp.biz 进行百度搜索,发现得到的信息仅有3个,然后继续缩短  搜索了 promclickapp , promclick 都没有发现有关于这个域名的相关问题和解答。例如 promclickapp.biz 这是什么东西之类的问题。

然后继续尝试搜索了第二个请求的地址 相关信息:提取他的域名 rasenalong.com

在百度上面搜索也没有发现相关的问题,哪怕是一个都没有。
随后想了想可以去谷歌搜索看看,然后直接输入 promclickapp.biz

第一条便是我想找到的问题,显然别人也和我一样发现了 这个问题。

大概意思就是说在 谷歌浏览器中,浏览某个网页的时候, 它会在左下角闪烁一些有关正在加载的内容的信息。在我所有点击过的网站上,我都看到“正在等待promclickapp.biz …” 我要不要在意这个问题?
大部分的回答都是建议删除 谷歌的扩展程序 (也就是谷歌的插件)有一个评论解决了我的疑惑 (翻译如下)

那么 promclickapp.biz 显然是 扩展应用 VIdeoDownloader 产生的,这个插件本身是用来下载视频流数据,删除后便没有了。那么 rasenalong.com 又是什么呢?我依旧使用了谷歌搜索,也是第一个便是我要找的信息。

他的问题中附带的链接中的图片,跟我的一样:

显然他也是发现了这段 奇怪的额外加载数据内容:机翻一下他的问题:

下面有个说的比较多字的评论,这里简单的机翻一下

结果:根据上面的调查结果,显然是安装的谷歌扩展应用导致的,于是我便卸载了所有的谷歌应用插件,然后浏览其他的网页也没再出现奇怪请求。
那么回归话题,其实从这个事件可以看过,国外对于个人数据以及个人隐私方面比较敏感。例如像这个事件中的参杂在网页的Netword之中,一般人如果不是留意的话,很难会发现这种特殊的额外请求。
其次在国内的搜索引擎当中,百度/搜狗都不能搜索出相关的promclickapp.biz 信息
而必应连接的是国外的搜索,因此可以找到相关的问题显然关于国内的人对于这种隐私安全问题了解并不是很深入,又或者直接忽略。如果不是出于我本身是对于浏览器信息比较敏感的,可能也不会在意这种情况。
而根据国外的描述,通常是将这种可能会泄露个人信息的行为,称为“邪恶的”其实也明显的反映出他们对于 信息采集的厌恶。而且他们对于这种情况,会进行深入的追踪,并且去尝试弄清楚它,究竟有没有再采取自己的信息,并且会在论坛里面 扩散这个脚本的情况。至少我是一搜就搜到了,但是在国内却没有相关的内容。
而国内,哪怕是像我认识的很多从事与 网页开发工作的人员他们甚至都不会注意和留意到 这种可能会导致隐私安全泄露的问题,也有可能是他们本身对于这种事情并不在乎。有时候别人可能会说,反正你的信息估计都已经被人家收集或者贩卖了,我也就不在乎这种了。
但是其实这种意识和观点,本身就是不正确的,像我上面的例子,他可能会提取到你的 提交数据,例如你登录 一些网站时,它记录你的登录数据并且发送到他的服务器上,然后存根。那么你的账号十分的危险。虽然很多人会觉得自身的数据已经泄露了,就没有必要防范了。其实这种观点是错误的,并不是所有的人都会有你的数据信息。正是因为这种观点才回纵容别人随意的获取你的数据,才会导致你的个人信息被泄露。

额外的内容:关于 promclickapp.biz 这个域名的注册地址是在 : 荷兰 北荷兰省阿姆斯特丹servers.com数据中心

这里就不过多的讨论了,因为我们并没有充分的证据证明对方就是采集你的个人信息。

Linux在线安装启动redis

一、Linux在线安装redis
1、因为redis是c语言开发的,所以需要安装gcc(在根目录下执行):

yum install gcc-c++
2、因为是在线安装,需要使用wget命令,如果linux中没有,就用如下命令安装(在根目录下执行):

yum -y install wget
3、下载redis最新的稳定版本,也可以下载其他版本压缩包:

wget http://download.redis.io/redis-stable.tar.gz
4、解压redis压缩包:

tar xzf redis-stable.tar.gz
5、进入到redis的解压文件中,编译redis:
make
6、安装redis:

make install PREFIX=/usr/local/redis
PREFIX参数指定文件的安装目录,一般安装在/usr目录下
/usr/local/目录下已经生成redis目录

7、启动redis,进入redis到安装目录中,即/usr/local/redis/bin:

./redis-server
启动成功,如下图:

redis的默认端口是6379,也可以对其进行修改。

二、redis的启动
redis分两种启动:

1、前端启动:
在usr/local/redis/bin/  中执行命令:

./redis-server
前端启动以后,我们不能再继续操作redis,所以一般不用。启动成功后如上图所示。
2、后台启动:
1、把redis解压文件中的redis.conf文件复制到redis的安装目录下,即/usr/local/redis/bin。

进入到redis的解压文件中,执行命令:

cp redis.conf /usr/local/redis/bin/
复制成功以后,redis安装目录中会多出一个redis.conf文件。

2、修改一下这个配置文件的内容:将daemonize的值由原来的no修改为yes,保存退出。

3、在redis的安装文件的bin目录下输入命令,则redis便会后台启动:

./redis-server redis.conf
4、通过进程查看命令,查看redis有没有启动:

ps aux | grep redis
5、停止redis:

./redis-cli shutdown

int和Integer的区别

相信每一个写java的人难免会对这个问题有疑惑,在java中存在有两个整型类,他们究竟有什么区别呢

https://www.cnblogs.com/guodongdidi/p/6953217.html

int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型 
2、Integer变量必须实例化后才能使用,而int变量不需要 
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 
4、Integer的默认值是null,int的默认值是0

延伸: 
关于Integer和int的比较 
1、由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。

Integer i = new Integer(100);Integer j = new Integer(100);System.out.print(i == j); //false

2、Integer变量和int变量比较时,只要两个变量的值是向等的,则结果为true(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

Integer i = new Integer(100);int j = 100;System.out.print(i == j); //true

3、非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

Integer i = new Integer(100);Integer j = 100;System.out.print(i == j); //false

4、对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;Integer j = 100;System.out.print(i == j); //true
Integer i = 128;Integer j = 128;System.out.print(i == j); //false

对于第4条的原因: 
java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:

public static Integer valueOf(int i){    
assert IntegerCache.high >= 127;    
if (i >= IntegerCache.low && i <= IntegerCache.high){        return IntegerCache.cache[i + (-IntegerCache.low)];    
}    
return new Integer(i);
}

java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了

如果有错误的地方,还请指正。

参考: 
http://blog.csdn.net/you23hai45/article/details/50734274 
http://www.cnblogs.com/liuling/archive/2013/05/05/intAndInteger.html

Javascript写入txt和读取txt文件示例

1. 写入 

FileSystemObject可以将文件翻译成文件流。 

var fso=new ActiveXObject(Scripting.FileSystemObject); 

创建一个可以将文件翻译成文件流的对象。 

第二步:用于创建一个textStream 对象 

括号里边有三个属性 

1. 文件的绝对路径 

2. 文件的常数 只读=1,只写=2 ,追加=8 等权限。(ForReading 、 ForWriting 或 ForAppending 。); 

3. 一个布尔值 允许新建则为true 相反为false; 

var f=fso.createtextfile(“C:\a.txt”,2,true); 

第三步:调用textStream的方法 

1. Write(不在写入数据末尾添加新换行符) 

2. WriteLine(要在最后添加一个新换行符) 

3. WriteBlankLines(增加一个或者多个空行) 

f.writeLine(“wo shi di yi hang”); 

第四步: 

关闭textStream 对象: 

例:f.close(); 

2. 读取 

var fso=new ActiveXObject(Scripting.FileSystemObject); 

创建一个可以将文件翻译成文件流的对象。 

第二步:用于创建一个textStream 对象 

括号里边有三个属性 

4. 文件的绝对路径 

5. 文件的常数 只读=1,只写=2 ,追加=8 等权限。(ForReading 、 ForWriting 或 ForAppending 。); 

6. 一个布尔值 允许新建则为true 相反为false; 

var f=fso.opentextfile(“C:\a.txt”,1,true); 

第三步:调用读取方法 

1. Read(用于读取文件中指定数量的字符) 

2. ReadLine(读取一整行,但不包括换行符) 

3. ReadAll(则读取文本文件的整个内容); 

判断是否读取到最后一行 

while (!f.AtEndOfStream) 
{ 
f.Readline(); 
} 

第四步: 

关闭textStream 对象: 

例:f.close(); 

下面是一个html打开txt文件的例子。 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>你好</title> 
</head> 

<body> 
<div id="aa"></div> 

<script language="javascript"> 
var fso, ts, s ; 
var ForReading = 1; 

fso = new ActiveXObject("Scripting.FileSystemObject"); 
ts = fso.OpenTextFile("d:\\testfile.txt", ForReading); 
s = ts.ReadLine(); 
document.getElementById("aa").innerHTML=s; 
</script> 

</body> 
</html> 

当年的大数据都遭遇了什么?为什么有段时间全体寂灭?大数据的前世今生

对于此次洗牌大潮,大多从业者表示,并非坏事。 劣币被驱逐,良币才能沐浴阳光,茁壮生长。 去芜存菁,正本清源,大数据行业的野蛮时代终于结束。

文 | 戈森 零和

6月1日,《网络安全法》落地实施已过去三个月,大数据行业结束野蛮时代,进入洗牌期。

此前有15家数据公司被调查,此后,名单扩大到30家;

多家公司的业务负责人被约谈,他们甚至相互打招呼的方式,都变成了“今天,你被抓了吗”;

大量数据接口关停,数据产品停售,导致部分公司开始裁员,一家被调查的公司,甚至将大数据业务完全下架,退出市场。

一些公司黯然退场,一些却高调入局——一些有独家数据源的公司,在最近宣布成立。

数据行业,正处于二八分流,冰火两重天。

01“你被抓了吗?”

2017年5月末,数据行业的清理行动开始。

据多位知情人透露,“数据堂”多人被警方调查,导致部分数据业务线停摆。

此后,数据堂发表声明称,因公司某一客户存在被公安机关调查的情形,公安机关为进一步了解具体情况,向公司个别业务人员及财务人员进行情况了解,不存在“公司高管被抓”的情形;公司业务运作正常。

目前,数据堂的官网可正常打开,但“数据定制—数据堂”的网站页面,却无法打开。

今年8月,数据堂发布股票停牌公告,称因存在“预计应披露的重大信息在披露前已难以保密或已经泄露,或公共媒体出现与公司有关传司,可能或已经对股票转让价格产生较大影响的”事项,2017年8月14日起暂停转让,预计股票恢复转让日期不晚于2017年11月13日。

“公司走了很多人,还有一些人准备拿完年终奖就走”,数据堂离职员工杨青称,“目前,精准营销线和大数据线基本暂停,现在仅靠人工智能一条业务线支撑”。

但杨青同时指出:“公司的海外客户,暂时没有受到影响。”

这只是大数据行业进入冰封时代的一个缩影。

一本财经曾独家报道,15家数据公司被调查,名单中不乏估值几十亿的大公司。据知情人透露,此后,调查范围则进一步扩大,“名单已有30家”。

行业一度风声鹤唳,传闻满天飞。

头部的大数据公司,都曾传出过CEO或高层被调查的“小道消息”。

网传聚信立的高管也被带去问话,业务呈收缩状态。

聚信立CEO罗皓不得不站出来辟谣,紧急接受媒体采访:“我敢否认,说明我们没有被约谈。”

“实际上,确实很多公司的业务负责人被约谈”,行业资深从业者罗锦江称,为了取证,通常电脑等存储设备也会被拿走。

一位大数据行业的CEO听到传闻,另外一家公司的创始人被调查,他急忙在微信上询问:“你没事吧?”

对方回复没事,说是谣言。

结果第二天,CEO又听到消息,接着再问:“今天你被抓了吗?”

“今天你被抓了吗”,这句话一度成为大数据行业高层从业者的问候语。

02接口切断

几乎行业所有的人都明白,这次数据整顿,是为了6月1日新推出的《网络安全法》预热。

“这次是动真格了,毫无容情”,罗锦江称,5月底,很多公司主动将一些敏感业务线停掉。

“数据供应商突然间通知我们,业务暂停,但会支付违约金”,某信贷公司的商务负责人陈希称,最先被停掉的接口,就是“三要素”查询。

“所谓三要素,就是手机、姓名、身份证”,罗锦江称,以前的价格,“购买一条仅7毛、8毛”。

多位行业从业者称,三要素停了之后,大部分公司只提供两要素(身份证和姓名)的“验证”。

“把两个信息提供给数据方,对方只会反馈一个是与否的答案”,陈希称,如果符合,反馈“是”,如果不符合,反馈“否”。

陈希紧急修改了风控规则,让业务线可以勉强推进,但紧接着,更多的接口被切断。

以前一次查询2元的学历数据接口停掉,随后,车辆、住房、公积金等数据接口都全面切断。

“我们只能再次修改风控,让用户自己填写用户名和密码,授权我们去相应的页面爬取数据”,陈希称,如此操作大大提高了风控的成本和用户体验,“但合规了”。

紧接着,各项“特色”的数据产品也悄然撤下,或开始变得不稳定。

而某平台的风控总监郭飞透露发现:“今年年初,百融金服的产品收支等级,查询突然变得不太稳定,缺失率很高”。

所谓的收支等级,就是一个人信用卡和储蓄卡的入账和出账记录,并按照等级给出分数,数字远大,金额越大。

△ 收支等级产品说明

郭飞称,这项数据,是信贷中很有价值的数据,查询一次的价格是2-3元。

但至于如此隐秘的金融数据,百融金服是如何拿到的,在业内一直是一个谜团。

华道征信的业务员称:“自6月份后,不良信息的查询、资产类,目前我们是暂停服务”。

媒体报道,为了规避政策风险,在《网络安全法》实施前,同盾停掉了“失联人修复”服务;中国移动下属全资子公司中移在线,也停掉了“移动三要素”的查询。

一边是主动停止合作,一边是客户直接跑单。

贷后邦的商务负责人称:“部分客户已与我们达成合作意向,规定一出来他们很害怕,所有关于数据的业务都暂时不接,我手上有一两例违约客户。”

大量接口断了后,行业开始了裁员潮。

头部的大数据公司,都曾传出过裁员消息。

“主要裁掉的,是销售和一些敏感业务线的人”,罗锦江称,大量的乙方公司业务人员被裁掉后,就进入了甲方公司。

03艰难求生

2012年,马云在网商大会上震耳发聩地喊出:我们将进入大数据时代。

那一年,阿里巴巴集团设立了“首席数据官”一职,并推出大型数据分享平台“聚石塔”——这是中国大数据行业开始爆发的信号弹。

而大数据行业黄金年代的来临,是在2013年互联网金融崛起之后。

大数据和在线信贷相结合,激发了强烈的化学反应。

在黄金浪潮中,崛起了上万家的大数据供应商,他们采集数据,进行清洗加工,针对不同的应用场景,再输出不同的产品。

“早期,部分大数据公司的商业模式,极为简单,很多都是黑市采买数据后,简单打包,直接销售给客户”,罗锦江将其称为大数据的野蛮时代。

“在这里,就是大数据的天堂”,从美国回国创业的某CRO称,刚回国的时候,发现国内数据流通尺度之大,完全超乎想象。

在美国,很多并不敏感的数据,都无法用在信贷领域,比如,性别、人种颜色、年龄段,都不可随意参考,不然,就可能涉及“歧视女性、黑人或老人”。

滥用的用户数据,让大家就如裸泳一般,毫无隐私可言。

持续数年的数据之乱,终于在“徐玉玉”案之后,将行业推到了众矢之的的深渊。

这似乎成了诸多行业宿命,总是在鼎盛狂欢中,在利益催化之下,出现浮华泡沫。随后,巨大行业负面爆发,监管如期而至,洗牌来临。

校园贷和大数据行业,都是同样的轨迹。

行业正在挣扎中自救。

曾经很多大力宣传自己是专注大数据的公司,如今,对外的传播口径完全变动。

“行业污名化,不想和大数据扯上关系,外面现在都称自己是人工智能公司”,一位从业者称。

南京一家大数据公司也在被调查的30家名单中,目前,公司已将大数据业务全部关停,正在谋求转型。

“连我们业务员都需要加班加点看项目”,一家数据公司的商务称,公司甚至让他们去找项目,寻找出路。

大部分的数据提供商,正在寻找第一条自救之路:数据的脱敏、加密。

最常见的方式,就是查询结果的输出上,采取打分制,比如,如果完全匹配,就是100分,如果只有一半匹配,就是50分。

而查询不良则是用信息比对,输入名字身份证,输出命中与否。

还有一些公司,尝试用技术,保护用户隐私。如拨打催收电话,直接进行加密,只能看到一个加密号码拨出。

行业想到第二条自救之路:联合建模。

双方开发一套系统,直接放在客户公司的内部,双方共享数据,系统最终输出一个分数或结果。

“联合建模,确实解决了合规问题,能够使双方共享数据”,小赢科技首席风控官成少勇指出,从长远角度来说,这肯定是未来趋势,但目前,推进的过程依然困难重重。

今年8月,郭飞的公司和一家数据公司合作,对方提出了联合建模,但公司内部引发了争论。

“对于我们来说,增加了很大的工作量,我们不可能针对每家数据源都要去做建模,且联合建模的费用是十万”,郭飞称。

“实际上,现在大部分的联合建模,数据公司只是沦为一个技术提供商,这个模式太重,”大数据公司CEO林欣称,如果一家数据公司有20个客户,就得有20个建模师。

对于双方来说,这个模式重,成本高,为了合规都要付出代价。

04行业洗牌

《网络安全法》出台后,要获取、使用用户的数据,都需要用户授权。

而第三方的数据公司,很难再用这种方式获取数据。

林欣认为,这样的公司,无非只有两个命运:要么在原有的老数据基础上,挖掘建模,但这样的产品,很快就会过时;

要么就变成技术提供商和咨询商,比如联合建模。但这个命运,也不能让人愉悦。

如果变成技术提供商,很难和大的公司合作。因为,大的公司数据和风控,都视为核心部门,很少外包;其次,大的公司对数据提供商也百般挑剔。

因此,数据公司几乎只能给小的公司提供技术服务。

“大的公司,从6月之后,都要求数据提供商签一个承诺书,确保使用的数据,都是经过用户授权的”,罗锦江称,基本没几家公司敢签字。

行业的最终命运如何?

“行业90%的公司将被淘汰”,多位行业从业者都下了如此的判断。

有意思的是,一边是死亡,一边又是生长。

就在9月25日,联通大数据公司成立。

“未来,有一类大数据公司能活得不错,就是拥有稀缺数据源的公司”,林欣称。

而成少勇也是同样的观点,只有独家、且不断更新的数据公司,才有竞争力,“二八格局已非常明显”。

对于此次洗牌大潮,大多从业者表示,并非坏事。

劣币被驱逐,良币才能沐浴阳光,茁壮生长。

去芜存菁,正本清源,大数据行业的野蛮时代终于结束。

(应受访者要求,文中部分人名为化名)

xssee

XSSEE是一个专门用于解析解密的一个网站,因为该网站提供了多种常用的解密转换形式。因此使用起来非常的方便,此外还提供了编写js处理的方式,可以让开发人员,快速的处理编码字符。

因为XSSEE是基于前端的一种解析方式,因此可以快速方便的进行转换。目前已经有较多人移植至自己服务器中使用,从而避免去别人的网站使用

常用: https://web2hack.org/xssee/

[数据结构][C++]使用线性表实现一个通讯录

使用线性表实现一个通讯录,通讯录内容包含学号、姓名、电话三项数据。完成通讯录数据的建立,纪录插入和删除功能。

#include <iostream.h>
#include <conio.h>
#include <iomanip.h>
#include <string.h>
//--------------------------------------------------------------------
struct ElemType              // 数据元素的类型
{ 
        int numb;
        char name[20];
        int tel;
};
 
const int MAXSIZE=100;     // 数组的容量
 
class Sqlist
{
private:
        ElemType  elem[MAXSIZE];
        int length;
    public:
                Sqlist( void);
                ~Sqlist(){ };
                void  SetData();
                void  Insert( int i, ElemType e);
                ElemType Delet(int i);
                void PrintOut();
};
//-------------------------------------------------------------
Sqlist::Sqlist( ) { length=0;}
void  Sqlist::SetData( )     //初步建立一个通讯录 
{
        cout<<"\n 输入人数length="<<endl;
        cin>>length;
        for(int i=0;i<length;i++)
        { 
                cout<<"\n 输入学号:";  
                cin>>elem[i].numb;
                cout<<"\n 输入姓名:"; 
                cin>> elem[i].name;
                cout<<"\n 输入电话号:="; 
                cin>>elem[i].tel;
        }
}
void  Sqlist::Insert( int i, ElemType e) //请完成此函数
{
        if(length==MAXSIZE)
                cout<<"FLOW!"<<endl;
        else
                if(i<1||i>length+1)
                        cout<<"Insert ERROR!"<<endl;
                else
                        for(int j=length;j>=i;j--)
                                elem[j]=elem[j-1];
                        elem[i-1]=e;
                        length++;
                        cout<<"Insert success!"<<endl;
 
}
ElemType Sqlist::Delet(int i)
{
  ElemType x;
        if(i<1||i>length)
                cout<<"RANGE ERROR!"<<endl;
        else
        {
                x=elem[i-1];
                for(int j=i;j<length;j++)
                        elem[j-1]=elem[j];
                length--;
                cout<<"success"<<endl;
        }
   return x;
}
void Sqlist::PrintOut()  //输出
{ 
        cout<<"\n 通讯录总人数:"<<length;
        cout<<"\n PrintOut Data:\n";
        cout<<setw(16)<<"学号"<<setw(20)<<"姓名"<<setw(20)<<"电话号"<<endl;
        for(int k=0; k<length;k++)      
        { 
                cout<<setw(16)<<elem[k].numb<<setw(20)<<elem[k].name<<setw(20)<<elem[k].tel<<endl;
        }
}
//--------------------------------------------------
int main( )
{ int i,k;  ElemType e,x;
  Sqlist  as;
  cout<<"\n               通讯录演示";
  do{
      cout<<"\n\n";
      cout<<"\n\n    1. 初步建立一个通讯录(线性表) ";
      cout<<"\n\n    2. 插入一个数据元素 ";
      cout<<"\n\n    3. 删除一个元素,返回其值";
      cout<<"\n\n    4. 结束程序";
      cout<<"\n******************************** ";
      cout<<"\n    请输入你的选择(1,2,3,4)";  cin>>k;
          switch(k)
          { 
          case 1:
                  {  as.SetData(); as.PrintOut();  }break;
          case 2:{ cout<<"\n 插入的位置, i=?"; cin>>i;
                   cout<<"\n 插入的数据 编号=?"; cin>>e.numb;
                   cout<<"\n 插入的数据 姓名=?"; cin>>e.name;
                   cout<<"\n 插入的数据 电话号=?"; cin>>e.tel;
                   as.Insert(i,e);  as.PrintOut();
                 }break;
          case 3:{ cout<<"\n 删除第几个元i=?";  cin>>i;
                  x=as.Delet(i);
                  cout<<"\n  被删除的元素数值= "<<setw(10)<<x.numb<<
                  setw(10)<<x.name<<setw(10)<<x.tel;
                  as.PrintOut();
                 }break;
          default:break;
          } //switch
  }while(k>=1&&k<4);
  cout<<"\n          再见!";  cout<<"\n     按任意键,返回。";
  _getch(); return 0;
}