首页%鼎点娱乐挂机%首页用游戏服务器,注意事项 游戏为我们和生活带来了更多的趣味和精彩,很多游戏网站的站长在挑选租用游戏服务器时,主要看游戏服务器的什么方面,结合实际生活的各方面,注意游戏服务器提供商的信誉实力售后支持、服务器本身就看稳定性、带宽价格这些事项。
1.游戏服务器的提供商信誉实力 信誉实力在各行各业中都是最重要的,是现实中的保证。看一个游戏服务器服务商的信誉实力,可以从企业上传到网站的信誉之星,服务之星等一些证书进行查询。正规的游戏服务器运营商会形成一定的规模,如果有时间的话,为了以后各方面保障,直接去游戏服务器服务商那些考检他们的公司,从公司的大小,员工数量,工作态度,服务器信息相关交流等这些就可以大概有个了解。
2.游戏服务器稳定性 稳定是游戏服务器的前提,影响到稳定的有游戏服务器配置情况、今后的扩展、安全性能。游戏的质量越来越高,对各方面的要求也变大的。在配置方面,操作系统、应用软件、网卡、硬盘、内存、CPU等都选高一点,但也不要选得太离谱,以自己是什么游戏去定。游戏的更新也是很快的,为了可以适应游戏的变化,扩展性强的游戏服务器先看。至于安全性能,网络上的病毒、木马等种类很多,谁都不想在玩游戏时,经常被影响,所以有没有实时监控防护措施服务这也要注意。
3.游戏服务器所用带宽 无论是游戏服务器是用在大型单机下载,还是网络游戏,为了不造成传输时,带宽堵塞。宽带尽量大点,美国服务器所用一般100M、1G国际带宽可以满足传输要求。
4.游戏服务器租用价格 现在市面上游戏服务器的价格,在配置的不同、服务的不同,价格也完全不同。在游戏服务器价格上的定位,一定要理性对待。先选好提供商,然后根据游戏网站需要游戏服务器怎样的支持,进行服务器间比较,再决定。如
5.游戏服务器售后支持 游戏服务器与其它服务器一样,当工作久了,肯定会偶尔出现故障。因此,随时都有服务技术支持和快速故障解决,这是游戏服务器最基本应该具备的。
软件开发2020-05-18 14:17:00TCP 三次握手和四次挥手客户端–发送带有 SYN 标志的数据包–一次握手–服务端 服务端–发送带有 SYN/ACK 标志的数据包–二次握手–客户端 客户端–发送带有带有 ACK 标志的数据包–三次握手–服务端
三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。
第一次握手:Client 什么都不能确认;Server 确认了对方发送正常
第二次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己接收正常,对方发送正常 第三次握手:Client 确认了:自己发送、接收正常,对方发送、接收正常;Server 确认了:自己发送、接收正常, 对方发送接收正常 所以三次握手就能确认双发收发功能都正常,缺一不可。 为什么要传回SYN
接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。 传了SYN为什么还要传ACK
双方通信无误必须是两者互相发送信息都无误。传了 SYN,证明发送方到接收方的通道没有问题,但是接收方到发送 方的通道还需要 ACK 信号来进行验证。
断开一个 TCP 连接则需要“四次挥手”: 客户端-发送一个 FIN,用来关闭客户端到服务器的数据传送 服务器-收到这个 FIN,它发回一 个 ACK,确认序号为收到的序号加1 。和 SYN 一样,一个 FIN 将占用一个序号 服务器-关闭与客户端的连接,发送一个FIN给客户端 客户端-发回 ACK 报文确认,并将确认序号设置为收到序号加1 为什么要四次挥手
任何一方都可以在数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。 举个例子:A 和 B 打电话,通话即将结束后,A 说“我没啥要说的了”,B回答“我知道了”,但是 B 可能还会有要说的 话,A 不能要求 B 跟着自己的节奏结束通话,于是 B 可能又巴拉巴拉说了一通,后 B 说“我说完了”,A 回答“知道了”,这样通话才算结束软件开发2020-06-03 11:27:00HTTP长连接、短连接在HTTP/1.0中默认使用短连接。 也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。 当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像 文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会线起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码: Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。
实现长连接需要客户端和服务端都支持长连接。HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
软件开发2020-06-03 10:45:00互联网行业数据仓库/数据平台的架构互联网行业数据仓库/数据平台的架构互联网行业数据仓库、数据平台的用途
3) 为网站或 APP 运营提供运营上的数据支持,就是通过数据,让运营及时了解网站和产品的运营效果;
4) 为各个业务提供线上或线下的数据支持,成为公司统一的数据交换与提供平台;
5) 分析用户行为数据,通过数据挖掘来降低投入成本,提高投入效果;比如广告定向精准投放、用户个性化推荐等;
上面列出的内容看上去和传统行业数据仓库用途差不多,并且都要求数据仓库 / 数据平台有很好的稳定性、可靠性;
但在互联网行业,除了数据量大之外,越来越多的业务要求时效性,甚至很多是要求实时的 ,另外,互联网行业的业务变化非常快,不可能像传统行业一样,可以使用自顶向下的方法建立数据仓库,一劳永逸,它要求新的业务很快能融入数据仓库中来,老的下线的业务,能很方便的从现有的数据仓库中下线;其实,互联网行业的数据仓库就是所谓的敏捷数据仓库,不但要求能快速的响应数据,也要求能快速的响应业务;
建设敏捷数据仓库,除了对架构技术上的要求之外,还有一个很重要的方面,就是数据建模,
如果一上来就想着建立一套能兼容所有数据和业务的数据模型,那就又回到传统数据仓库的建设上了,很难满足对业务变化的快速响应。应对这种情况,一般是先将核心的持久化的业务进行深度建模(比如:基于网站日志建立的网站统计分析模型和用户浏览轨迹模型;基于公司核心用户数据建立的用户模型),
逻辑上,一般都有数据采集层、数据存储与分析层、数据共享层、数据应用层。可能叫法有所不同,本质上的角色都大同小异。
数据采集层的任务就是把数据从各种数据源中采集和存储到数据存储上,期间有可能会做一些简单的清洗。
作为互联网行业,网站日志占的份额最大,网站日志存储在多台网站日志服务器上,
一般是在每台网站日志服务器上部署 flume agent ,实时的收集网站日志并存储到 HDFS 上; 业务数据库:
业务数据库的种类也是多种多样,有 Mysql 、 Oracle 、 SqlServer 等,这时候,我们迫切的需要一种能从各种数据库中将数据同步到 HDFS 上的工具, Sqoop 是一种,但是 Sqoop 太过繁重,而且不管数据量大小,都需要启动 MapReduce 来执行,而且需要 Hadoop 集群的每台机器都能访问业务数据库;应对此场景,淘宝开源的 DataX ,是一个很好的解决方案有资源的话,可以基于 DataX 之上做二次开发,就能非常好的解决。
当然, Flume 通过配置与开发,也可以实时的从数据库中同步数据到 HDFS 。 来自于 Ftp/Http 的数据源:
有可能一些合作伙伴提供的数据,需要通过 Ftp/Http 等定时获取, DataX 也可以满足该需求; 其他数据源:
毋庸置疑, HDFS 是大数据环境下数据仓库 / 数据平台最完美的数据存储解决方案。
离线数据分析与计算,也就是对实时性要求不高的部分,在我看来, Hive 还是首当其冲的选择,丰富的数据类型、内置函数;压缩比非常高的 ORC 文件存储格式;非常方便的 SQL 支持,使得 Hive 在基于结构化数据上的统计分析远远比 MapReduce 要高效的多,一句 SQL 可以完成的需求,开发 MR 可能需要上百行代码;
当然,使用 Hadoop 框架自然而然也提供了 MapReduce 接口,如果真的很乐意开发 Java ,或者对 SQL 不熟,那么也可以使用 MapReduce 来做分析与计算; 数据共享
这里的数据共享,其实指的是前面数据分析与计算后的结果存放的地方,其实就是关系型数据库和 NOSQL 数据库;
前面使用 Hive 、 MR 、 Spark 、 SparkSQL 分析和计算的结果,还是在 HDFS 上,但大多业务和应用不可能直接从 HDFS 上获取数据,那么就需要一个数据共享的地方,使得各业务和产品能方便的获取数据;
和数据采集层到 HDFS 刚好相反,这里需要一个从 HDFS 将数据同步至其他目标数据源的工具,同样, Sqoop,DataX 也可以满足。
业务产品所使用的数据,已经存在于数据共享层,他们直接从数据共享层访问即可;
同业务产品,报表所使用的数据,一般也是已经统计汇总好的,存放于数据共享层;
即席查询的用户有很多,有可能是数据开发人员、网站和产品运营人员、数据分析人员、甚至是部门老大,他们都有即席查询数据的需求;
这种即席查询通常是现有的报表和数据共享层的数据并不能满足他们的需求,需要从数据存储层直接查询。
即席查询一般是通过 SQL 完成,最大的难度在于响应速度上,使用 Hive 有点慢,目前解决方案是 SparkSQL, Impala ,它的响应速度较 Hive 快很多,而且能很好的与 Hive 兼容。
目前,很多的 OLAP 工具不能很好的支持从 HDFS 上直接获取数据,都是通过将需要的数据同步到关系型数据库中做 OLAP ,但如果数据量巨大的话,关系型数据库显然不行; 这时候,需要做相应的开发,从 HDFS 或者 HBase 中获取数据,完成 OLAP 的功能;
比如:根据用户在界面上选择的不定的维度和指标,通过开发接口,从 HBase 中获取数据来展示。
这种接口有通用的,有定制的。比如:一个从 Redis 中获取用户属性的接口是通用的,所有的业务都可以调用这个接口来获取用户属性。
现在业务对数据仓库实时性的需求越来越多,比如:实时的了解网站的整体流量;实时的获取一个广告的曝光和点击;在海量数据下,依靠传统数据库和传统实现方法基本完成不了,需要的是一种分布式的、高吞吐量的、延时低的、高可靠的实时计算框架; Storm, JStorm ,Spark Streaming 等实时框架已经非常成熟了。
在数据仓库 / 数据平台中,有各种各样非常多的程序和任务,比如:数据采集任务、数据同步任务、数据分析任务等;
这些任务除了定时调度,还存在非常复杂的任务依赖关系,比如:数据分析任务必须等相应的数据采集任务完成后才能开始;数据同步任务需要等数据分析任务完成后才能开始;
这就需要一个非常完善的任务调度与监控系统,它作为数据仓库 / 数据平台的中枢,负责调度和监控所有任务的分配与运行。
软件开发2020-05-16 10:46:002d游戏开发--DragonBones pro龙骨动画制作用DragonBonesPro制作补间动画、龙骨动画动画补间导入素材整理素材位置并安排时间轴调整关系以及创建补间动画
2020-05-15 19:03:002D游戏开发课程第7次作业——基于DragonBonesPro软件的补间动画、龙骨动画的制作开发软件:DragonBonesPro1、开场动画实例2、小丑盒子实例3、跑步的人实例4、跳跳样实例1、开场动画步骤:
其中UnityCG.cginc是最常用的组件 他里面提供了很多常用的定义和文件
语义其实就是赋给shader的一个输入输出的字符串,这个字符串表达了参数的含义,这些语义可以让shader知道从哪里读取数据,并把数据输出到哪里
他们在CG/HLSL的shader流水线中是不可获取的,需要注意的是 Unity并没有支持所有的语义
通常情况下 这些输入输出的参数并不需要特别有意义,我们可以自行决定这些变量的用途.变量本身存储什么 shader并不关心
UNITY为了方便数据传输,对一些特殊的语义进行了特殊的含义规定,例如TEXCOORD0,在顶点着色器的入参结构体a2v的内部我们用它描述texcoord,UNITY会识别该语义并把第一组纹理坐标填充给texcoord,需要注意即使语义一样出现的位置不同,意义也可能不同,如TEXCOORD0出现在输出结构体内时,这个修饰的变量由我自己定义。
例如上面的SV_POSITION修饰pos,那么就表示pos包含了可以用于光栅化的变换后的顶点坐标,即齐次裁剪空间坐标,这些语义修饰的变量是不可随便赋值的,因为流水线需要靠他们去实现一些特殊的目的,例如渲染引擎会把SV_POSITION的坐标经过光栅化后显示在屏幕上,有的时候我们会看到同样的变量在不同的shader里用不同的语义修饰,例如一些shader会使用POSITION而不是SV_POSITION来修饰顶点的着色器输出,SV_POSITION 和POSITION在大多数平台上是等价的,但在某些平台上必须使用SV_POSITION来修饰输出,同样的情况还会在COLOR0和SV_Target上出现, 所以我们尽量使用SV开头的修饰符。
上面的语义 除了SV_POSITION之外,其他语义对变量没有明确的要求,也就是说我们可以存储任意值到语义描述的变量中,通常我们把一些自定义数据从顶点着色器传递到片元着色器,使用TEXCOORD0修饰。
需要注意 一个语义可以使用的寄存器最多只能使用四个浮点值,因此如果我们想要定义矩阵类型,如float3*4,float4*4等变量就需要使用更多的空间,另一种方法就是把这些变量拆分成多个变量,如float4*4 可以拆分成4个float4,每个变量存储一行矩阵的元素。
2020-05-15 14:37:00影响服务器租用的因素有什么?影响服务器租用的因素有什么 ?什么是好的 服务器租用 商呢 ? 其实对于企业来说性能稳定便是最好的要求 , 但是在选择服务商的时候也需要进行对比 , 因为不同的判断不同的考量会选择不同的服务商 , 影响服务器租用的因素有很多 , 那么应该注意什么呢 ?宽带和防御比如说 ,BGP 多线M 宽半的服务器 , 价格就要比 10M 兆宽带的价格便宜一些 。 宽带与防御因素 , 其实也是某些不良运营商做动手比较容易切入的地方 , 所以如果你真的遇到服务器租用价格比较低的运营商的话 , 那么很可能是商家在这个方面缩减了成本 。 所以一定不要盲目选择这种价格较低的合作伙伴 。
也就是说即便是同一运营商 , 如果机房服务器是在不同的地域 , 那么所产生的价格也是不一样的 。 所以说 , 企业在选择服务器租用合作商的时候 , 一定要考虑一下地域因素 。 尽量选择机房离得近 , 公司比较近 , 同时租用价格还比较低这样的合作商 。
这里所说的配置元素 , 主要包括服务器机房线路 , 服务器处理器以及内存等等要素 , 可以说配置越高的话 , 服务器租用的价格也就越贵 , 这一点大家应该都心知肚明 。
总的来说 , 影响企业服务器租用价格的主要因素就是以上三个要素了 。 一般来讲 , 在选择服务器租用运营商的时候 , 企业工作人员要切记 , 运营商要有相关行业资格证 , 这样才能选出真正适合自己需求的高品质运营商 。
2020-05-14 18:03:00Shader笔记_002简单顶点/片元着色器扩展参考第五章一、如何获取其他模型数据在001里介绍了通过POSITION获取顶点位置坐标,如果想的到更多的模型数据,比如我们想要得到模型上每个顶点的纹理坐标和法线方向PS:我们可以通过纹理坐标来访问纹理 法线坐标一般用来计算光照因此我们需要给顶点着色器定义一个新的参数·这个参数将不是一个简单的数据类型在上面的代码中 声明的结构体a2v 他包含了顶点着色器需要的模型数据
NORMAL 和TEXCOORD0,当他们作为顶点着色器的输入时都是有特定含义的
因为UNITY会根据这些语义来填充这个结构体,对于顶点着色器的输出,UNITY
a表示应用 v表示顶点着色器 a2v的意义就是从应用阶段传递到顶点着色器中
每个三角面片由三个顶点构成,而每个顶点又包含了一些数据,例如顶点位置、发现坐标、顶点颜色等等
我们在实际开发的过程中,往往希望从顶点着色器输出一些数据,例如把模型的法线纹理坐标等传递给片元着色器
v2f中也需要指定每个变量的语义,在本例中我们定义了SV_POSITION和COLOR0,顶点着色器的输出结构中,必须包含SV_POSITION,否则无法获取
裁剪空间的顶点坐标,COLOR0则由用户自己定义,一般是用来存颜色,例如逐顶点的漫反射颜色等,类似语义还有COLOR1
至此我们完成了从顶点着色器往片元着色器传递数据,顶点着色器是逐顶点的,片元着色器是逐片元的,因此片元着色器的输入实际是把顶点着色器的输出进行插值的结果
unityshader和材质密不可分,shader提供了一些可以设置的参数来调试材质的效果,这些参数需要写在properties语义块里面
为了在CG代码里面访问他,我们还需要提前自己定义一个新变量 ,该变量名必须和属性里的变量名一致
uniform fixed4 _Color; 该关键字在CG里是用来修饰变量,仅仅提供该变量初始值的是如何指定和存储的相关信息,UNITY SHADER里该关键字可以省略。
在SubShader语义块中,我们定义了一个Pass, 这个pass里也没有设置任何自定义的渲染和标签
GPU是以四维向量为基本单位来计算的。4个浮点数所组成的float4向量是GPU内置的最基本类型。使用GPU对两个float4向量进行计算,与CPU对两个整数或两个浮点数进行计算一样简单,都是只需要一个指令就可以完成。
HLSH的基本数据类型定义了float、int和bool等非向量类型,但是它们实际上都会被Complier转换成float4的向量, 只要把float4向量的其中3个数值忽略,就可以把float4类型作为标量使用 。
使用贴图坐标时,只需要二维向量,HLSL定义了float2类型作为二维向量使用。
Shader也可以声明数组,4*4矩阵实际上就是一个float4 m[4]的数组。注意,Shader中的所有的变量都使用寄存器,没有其他内存空间可以使用,所以越大的数组会占用越多的寄存器,甚至会超出寄存器的数量限制。
在使用float4向量中的个别数值时,可以用xyzw或rgba,都可以用来表示四维向量中的数值。但不能把它们混用,例如不能用xyba,把它视为颜色时就用rgba,否则就是用xyzw,不能把这二者混合使用。
rgba : 前三个值(红绿蓝)的范围为0到255之间的整数或者0%到100%之间的百分数。这些值描述了红绿蓝三原色在预期色彩中的量。
第四个值,alpha值,制订了色彩的透明度/不透明度,它的范围为0.0到1.0之间,0.5为半透明。
这个就是本例所使用的顶点着色器的代码,他是逐顶点执行的。mul(UNITY_MATRIX_MVP,v)的意思是把顶点坐标从模型空间转换为裁剪空间
vert函数输入的v包含顶点的位置 这个是通过POSITION语义指定的
这些语义将要告诉系统用户需要哪些输入值以及用户输出的是什么 。 简单地说POSITION语意用于顶点着色器,用来指定这些个位置坐标值,是在变换前的顶点的object space坐标。SV_POSITION语意则用于像素着色器,用来标识经过顶点着色器变换之后的顶点坐标
本例中POSITION 将告诉UNITY 把模型的顶点坐标填充到输入参数v中
SV_POSITION将告诉UNITY顶点着色器输出的是裁剪空间中的顶点坐标
上面的代码输出的上一个fixed4类型的变量,并且使用了SV_Target语义进行限定,SV_Target也是一个系统语义,它告诉渲染器,把用户输出的颜色存储到一个渲染目标里,这里将输出到默认的帧缓存中,片元着色器返回的fixed4类型的变量,片元着色器输出的颜色在[0,1]中,其中(0,0,0)是黑色,(1,1,1)是白色.
在处理图形运算,特别是3D图形生成运算时,往往要定义一个Fixed数据类型,我称它为定点数,定点数其时就是一个整形数据类型,他的作用就是把所有数 进行转换,从而得到相应类型的整型表达,然后使用定点数进行整行运算,取到最终值并将其转换回实际的基本数据类型。因此它是通过避免大量的浮点运算来加快 图形处理的一个方式。
比如上例中,Y轴每次都要偏移0.4,而这个数是个浮点,严重影响了运算速度。比如,我们后台有一个数,用来计量Y轴本次的坐标,就叫做变量YY吧。X每 次都加1,也就是XX++,Y每次加0.4,也就是YY+=0.4。为了提高速度,我们将YY升级到Fixed类型,YY每次加Fixed的0.4,也就 是0.4*65536=26214,然后再四舍五入到整数类型,即YY+=26214,Y=(YY+32768)>
16。这样,就得到了每 次的整数Y,并且都是整数的加减和位运算,速度非常快。
SV_Target SV_POSITION 这两个都是 语义绑定 (semantics binding)。什么是语义绑定呢?语义绑定可以理解为关键字,我们都知道图形渲染是按照一步一步地进行的,又叫做渲染管线。那么为什么是要一步一步地进行呢?因为GPU的架构与CPU非常不同,cpu更像是人的大脑,可以同时思考不同的问题,而GPU则相当于计算机,通过有特定的输入,通过计算得到最终的输出。GPU没有像CPU一样的堆栈来存取变量与值,所以通过语义绑定将一个计算好的值放在一个物理存储位置,再用的话就利用语义绑定去特定物理位置取出,这也是GPU不能像CPU一样工作的原因之一吧。
SV_前缀的变量代表system value的意思,在DX10+的语义绑定中被使用代表特殊的意义,SV_POSITION在用法上和POSITION是一样的,区别是 SV_POSTION一旦被作为vertex函数的输出语义,那么这个最终的顶点位置就被固定了,不得改变。
在建模软件比如3D Max中,建模时有个过程俗称展开UV,其实就是指定模型每个顶点的UV。因为纹理可以有不止一张,所以UV也可以有不止一组。
建模软件导出的模型数据自然也包含顶点的UV数据,在引擎中渲染模型之前,创建顶点缓冲时,包含了UV信息的顶点数组被复制到顶点缓冲里用于接下来的渲染。
在渲染过程中,vs阶段的输入就是(当前)顶点数据,包括各组UV。当然你可以选择性使用,比如说你只需要一组UV,就可以只选择绑定一个TEXCOORD0
texcoord0和texcoord1分别表示两层UV,有时候我们模型上的贴图需要多个图片一起贴在一处,那么贴两层就会有两层UV。
2020-05-14 11:50:00什么是服务器日志?服务器日志要怎么看?什么是服务器日志 ? 服务器日志要怎么看 ?什么是服务器日志虽然现在很多站长懂得做搜索排名知识 , 但是懂得 SEO, 并不代表就懂得服务器日志了 , 那么服务器日志是什么呢 ? 其实 , 服务器日志 (server log) 是一个或多个由服务器自动创建和维护的日志文件 , 其中包含其所执行活动的列表 。简而言之 , 服务器日记就是记录网站被访问的全过程 , 通过服务器日志 , 站长就可以知道什么时间到什么时间有哪些人来过 , 并且还知道什么搜索引擎来过 , 有没有收录你的网页 , 从你的网站工作的第一天你的日记就有了 。假如你想做好 SEO, 那么你就要好好的了解下服务器日志了 , 因为它可以让你更了解搜索引擎爬虫 。服务器日志怎么看
1、 开始 —— 管理工具 —— 事件查看器 —— 系统或者控制面板 —— 管理工具 —— 事件查看器 —— 系统 。
2、 在远程客户端 , 运行 IE 浏览器 , 在地址栏中输入 “服务器 IP 地址 :8098”, 如 “”。
在弹出的登录对话框中输入管理员的用户名和密码 , 点击 “ 确定 ” 按钮即可登录 Web 访问接口管理界面 。
接着在 “ 欢迎使用 ” 界面中点击 “ 维护 ” 链接 , 切换到 “ 维护 ” 管理页面 , 然后点击 “ 日志 ” 链接进入 。
到日志管理页面后 , 在日志管理页面中 , 管理员可以查看 、 下载或清除 windows 2003 服务器日志 。
选择系统日志可进行查看 , 并且在日志管理页面中可列出 windows 2003 服务器的所有日志分类 , 如应用程序日志 、 安全日志 、 系统日志 、Web 管理日志等 。
2020-05-13 17:24:00不同配音的创作依据有什么不同?一般来讲,配音分为广义和狭义之分。广义的配音就是指的是音乐、动效、音响、 游戏配音等等的处理。而狭义的配音则指专门为对白、独白、内心独白、解说和旁白等语言的后期配制而进行的一系列创作活动。影视配音和动画配音都是配音艺术,但是,这两种配音类型的创作依据却是不一样的。接下来,我们就一起了解一下影视配音和动画配音创作依据有哪些不同。影视配音,简单来说就是替前面的演员说话,由配音员为已经完成了的电视剧中的某一人物录制台词,通过后期配音的方法准确、生动的塑造出人物形象。影视剧配音以演员的形象为依据,需要对作品有深刻的感悟和体验,是一种再创造的过程。动画配音是配音演员以文字形象和动画设计师绘出的画面形象,也就是视觉形象为依据,通过自身对作品的深刻理解,运用自己的声音展现动画人物造型的个性,把握语言节奏的艺术创造,而不是再创造。但是,动画配音是一种假定的艺术,不受人物形象的限制,不需要模仿生活,所以,动画配音是不会受到任何物质现实的制约。影视剧配音和动画配音的创作依据是不同的,影视剧配音员需要把握表演者的风格,具有很强的约束性,而动画配音员则没有那么多制约。
2020-05-13 12:01:00小游戏开发运营挣钱模型之—游戏调优篇(1)「Creator星球游戏开发社区公众号」有2年半了,一直以游戏开发技术内容为主,对于游戏开发如何挣钱还是一个小孩子。晓衡在不断的探索中成长,计划将游戏开发、运营、挣钱的整个完整流程揉碎,掰开了一点点学习,并与大家分享其中心得!下图是晓衡粗解的小游戏开发运营挣钱模型。长期以来,个人开发者们主要是停留在立项、开发阶段,其中开发又涉及程序、美术、策划以及测试。大多数个人开发者,游戏一旦上线效果不好,很可能快速放弃,又开始了一个新的项目,反复轮回,徘徊在放弃的边缘!最近,有过两款开发经验的开发者跟晓衡沟通,除了微店源码服务外,能否帮忙对接流量服务,满足前期游戏调优和后期游戏运营需要。游戏调优是个怎么样的阶段呢?不要小看这个,他是链接游戏开发与运营的重要环节!调优的内容大概包括: 游戏性能调优 分享裂变调优 用户留存调优 广告收益调优
当我们完成一款游戏的核心主体功能时,就可以发布上线,这时游戏可以被玩家接触到,想当于我们的种子用户,我们需要获得玩家的反馈,对游戏进行从技术到留存,再到广收益等调整。
但是在微信平台上有一个非常残酷的问题:“没有自然流量”!!!很多开发者连最初的1000个用户都需要较长的时间和巨大的精力才能达成。
由于样本量太低,并不能指导开发者对游戏的调整,从而导致很多具有潜力的游戏沦为数字垃圾安静的躺在开发者的电脑里。
经过晓衡的不懈努力终于对接到一家以儿童机器人(类似智能音箱)运营为主的流量资源,有意向寻找合适流量的小游戏主可进行流量合作。欢迎加我微信: z6346289 ,关注我的微信公众号: Creator游戏开发社区 ,晓衡在线等你!
2020-05-12 16:07:00游戏方言配音语调要注意哪些?我国不同的地方有不同的地方语言,俗称“方言”,近些年来,方言配音在游戏中被广泛应用。不同的方言有其独特之处,不同的方言有不同的发音,声调也有不同。对于声调的方言有什么差异?下面 游戏方言配音小编就给大家说说吧!现代汉语方言大致分为七大方言区,根据各方言的声调状况,可把它们归并为两大类。1、北方方言,各地北方话的系统比较一致。大多数地区的声调数目是四个,没有入声调;2、南方方言,声调数目较多,许多方言都有六七个声调,大多数南方方言都有入声调。就全国来说,声调差异很大,虽然大部分地区有阴阳上去四类,但表现的调值是不同的。调类上看,有三类的,也有十类的。而调值的把握不是件很难的事,如果能认清自己方言中的声调,再和普通话的声调做对比。
比如阴平在你的方言里是多少,和普通话有什么区别?普通话中“天”这个阴平是高平调,而天津人发“天”时也是阴平,但调值是低平调,找到规律后就好改了。
方言是我国的语言多样性的特色,我们来自不同的地区,不同地区的人会说不同的地方语言,这是中国方言的一大特色。由于方言的声调具有差异。只有了解这些声调知识,才能让方言配音游刃有余。
2020-05-31 23:35:00ThreadLocal一、ThreadLocal简介多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题,如下图所示二、ThreadLocal简单使用下面的例子中,开启两个线程,在每个线程内部设置了本地变量的值,然后调用print方法打印当前本地变量的值。如果在打印之后调用本地变量的remove方法会删除本地内存中的变量,代码如下所示1 package test; 2 3 public class ThreadLocalTest { 4 5 static ThreadLocal
在上面的代码中,(2)处调用getMap方法获得当前线程对应的threadLocals(参照上面的图示和文字说明),该方法代码如下
如果调用getMap方法返回值不为null,就直接将value值设置到threadLocals中(key为当前线程引用,值为本地变量);如果getMap方法返回null说明是第一次调用set方法(前面说到过,threadLocals默认值为null,只有调用set方法的时候才会创建map),这个时候就需要调用createMap方法创建threadLocals,该方法如下所示
在get方法的实现中,首先获取当前调用者线程,如果当前线程的threadLocals不为null,就直接返回当前线程绑定的本地变量值,否则执行setInitialValue方法初始化threadLocals变量。在setInitialValue方法中,类似于set方法的实现,都是判断当前线程的threadLocals变量是否为null,是则添加本地变量(这个时候由于是初始化,所以添加的值为null),否则创建threadLocals变量,同样添加的值为null。
4、如下图所示:每个线程内部有一个名为threadLocals的成员变量,该变量的类型为ThreadLocal.ThreadLocalMap类型(类似于一个HashMap),其中的key为当前定义的ThreadLocal变量的this引用,value为我们使用set方法设置的值。每个线程的本地变量存放在自己的本地内存变量threadLocals中,如果当前线程一直不消亡,那么这些本地变量就会一直存在(所以可能会导致内存溢出),因此使用完毕需要将其remove掉。
同一个ThreadLocal变量在父线程中被设置值后,在子线程中是获取不到的。(threadLocals中为当前调用线程对应的本地变量,所以二者自然是不能共享的)
在上面说到的ThreadLocal类是不能提供子线程访问父线程的本地变量的,而InheritableThreadLocal类则可以做到这个功能,下面是该类的源码
下面我们看看重写的childValue方法在什么时候执行,怎样让子线程访问父线程的本地变量值。我们首先从Thread类开始说起
六、从ThreadLocalMap看ThreadLocal使用不当的内存泄漏问题首先我们先看看ThreadLocalMap的类图,在前面的介绍中,我们知道ThreadLocal只是一个工具类,他为用户提供get、set、remove接口操作实际存放本地变量的threadLocals(调用线程的成员变量),也知道threadLocals是一个ThreadLocalMap类型的变量,下面我们来看看ThreadLocalMap这个类。在此之前,我们回忆一下Java中的四种引用类型,相关GC只是参考前面系列的文章( JVM相关 )①强引用:Java中默认的引用类型,一个对象如果具有强引用那么只要这种引用还存在就不会被GC。
②软引用:简言之,如果一个对象具有弱引用,在JVM发生OOM之前(即内存充足够使用),是不会GC这个对象的;只有到JVM内存不足的时候才会GC掉这个对象。软引用和一个引用队列联合使用,如果软引用所引用的对象被回收之后,该引用就会加入到与之关联的引用队列中
③弱引用(这里讨论ThreadLocalMap中的Entry类的重点):如果一个对象只具有弱引用,那么这个对象就会被垃圾回收器GC掉(被弱引用所引用的对象只能生存到下一次GC之前,当发生GC时候,无论当前内存是否足够,弱引用所引用的对象都会被回收掉)。弱引用也是和一个引用队列联合使用,如果弱引用的对象被垃圾回收期回收掉,JVM会将这个引用加入到与之关联的引用队列中。若引用的对象可以通过弱引用的get方法得到,当引用的对象呗回收掉之后,再调用get方法就会返回null
④虚引用:虚引用是所有引用中最弱的一种引用,其存在就是为了将关联虚引用的对象在被GC掉之后收到一个通知。(不能通过get方法获得其指向的对象)
上面我们知道ThreadLocalMap内部实际上是一个Entry数组 ,我们先看看Entry的这个内部类
2020-05-31 23:29:00软件测试人常见问题解答,你一定想知道!很多职场转行人员都会遇见这样那样的困惑与问题,今天小编针对同学们的问题作出了有效建议。我是非计算机专业出身,可以学软件测试吗?我年纪太大了,竞争不过年轻人,怎么办?如果学完找不到工作,怎么办?我是非计算机专业出身,可以学软件测试吗?首先我想说下,目前国内基本上没有大学开设软件测试的专业,很多人都有误区,其实计算机专业并不属于软件测试专业。目前这一行要求的主要还是核心技能,测试行业是属于入门容易,但想走远比较难。所以说在转行前一定要确定自己是否真的对这个行业感兴趣,这个可以让自己持续走下去。
(想要超车走捷径可以加入我们Q群(718897738)一起齐头并进加油!)
年龄并不是一个决定因素,重要的还是能力。软件测试岗位更注重的是资历,你的实操经验越多,从业经历越丰富,也就越值钱,所以是“越老越吃香”。
2020-05-31 22:29:06Java四种引用类型引用与对象每种编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”。在 Java 中一切都被视为了对象,但是我们操作的标识符实际上是对象的一个引用(reference)。 //创建一个引用,引用可以独立存在,并不一定需要与一个对象关联 String s;通过将这个叫“引用”的标识符指向某个对象,之后便可以通过这个引用来实现操作对象了。 String str = new String ( abc ); System. out .println(str.toString());在 JDK1.2 之前,Java中的定义很传统:如果 reference 类型的数据中存储的数值代表的是另外一块内存的起始地址,就称为这块内存代表着一个引用。Java 中的垃圾回收机制在判断是否回收某个对象的时候,都需要依据“引用”这个概念。在不同垃圾回收算法中,对引用的判断方式有所不同: 引用计数法:为每个对象添加一个引用计数器,每当有一个引用指向它时,计数器就加1,当引用失效时,计数器就减1,当计数器为0时,则认为该对象可以被回收(目前在Java中已经弃用这种方式了)。 可达性分析算法:从一个被称为 GC Roots 的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。
JDK1.2 之前,一个对象只有“已被引用”和未被引用两种状态,这将无法描述某些特殊情况下的对象,比如,当内存充足时需要保留,而内存紧张时才需要被抛弃的一类对象。
只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了
软引用是用来描述一些非必需但仍有用的对象。 在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常 。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。
在运行下面的Java代码之前,需要先配置参数 -Xms2M -Xmx3M,将 JVM 的初始内存设为2M,最大可用内存为 3M。
接着来看一下软引用会有什么不一样,在下面的示例中连续创建了 10 个大小为 1M 的字节数组,并赋值给了软引用,然后循环遍历将这些对象打印出来。 public class TestOOM { private static List
则 buff 会因为强引用的存在,而无法被垃圾回收,从而抛出OOM的错误。
*/ public T get() { return null ; } public PhantomReference ( T referent, ReferenceQueueq) { super (referent, q); } }那么传入它的构造方法中的 ReferenceQueue 又是如何使用的呢?五,引用队列(ReferenceQueue)引用队列可以与软引用、弱引用以及虚引用一起配合使用,当垃圾回收器准备回收一个对象时,如果发现它还有引用,那么就会在回收对象之前,把这个引用加入到与之关联的引用队列中去。程序可以通过判断引用队列中是否已经加入了引用,来判断被引用的对象是否将要被垃圾回收,这样就可以在对象被回收之前采取一些必要的措施。与软引用、弱引用不同,虚引用必须和引用队列一起使用。
2020-05-31 22:04:00Windows 10 中安装 Anaconda 3首先通过下面链接地址下载 Anaconda 的个人版本。从上面下载的地址中,选择你需要的版本,目前 Windows 应该基本上都是 64 位的了。在你下载的文件中双击运行。欢迎界面在弹出的界面中显示了欢迎界面。
在这里将会显示默认的安装目录,Anaconda 的安装比较消耗空间,你需要确定你的磁盘有足够的空间可以按照。
在安装的时候,不建议设置 PATH,因为可能因为设置 PATH 导致安装的时候出现问题,也有可能会导致 Windows 载入不同的 Python 的版本。
2020-05-31 21:32:00垃圾收集器1.Parallel scavenge+old:年轻代采用复制算法,老年代采用标记-整理算法,是多线程的并行收集器。它注重的是可控制的吞吐量,适合于后台运算而不需要与用户有太多的交互的时候。 吞吐量:是CPU用于运行用户线程的时间和总CPU消耗时间的比值。2.ParNew:其它和Parallel差不多,其区别主要在于ParNew更关注 停顿时间 ,且 可以与CMS收集器组队 工作。是许多工作在Server端的首要选择。3.CMS:采用标记-清除算法,为了 获取最短停顿时间 为目标的多线程并发的收集器。有 初次标记(STW)-并发标记-重新标记(STW)-并发清除 四个过程:初次标记:需要stop the world。仅仅是标记一下GC root能直接可达的对象。并发标记:进行GC root tracing过程,标记所有可达的对象,但由于此时收集器线程和用户线程并发运行,可能会不断更新引用域,所以会对引用更新的地方做跟踪记录让重新标记阶段去处理。
重新标记:需要stop the world 。修正因用户线程运行而导致的标记变动的那一部分的标记记录。
ps:上面只是参考大部分面试答案,具体的还是不太清除,比如看了一篇分析:重新标记是标记存活对象,并发清除只是将对象标为不可达,真正清除是用啥?,整个过程标记的对象是老年代对象和新生代引用的老年代对象?并发标记之后还要预清理和可控制的预清理啥的.... CMS垃圾收集器详解
缺点: 对CPU资源敏感:会占用一部分线程用于垃圾收集而使应用程序变慢,总吞吐量下降。 无法处理浮动垃圾:浮动垃圾是在标记过程之后产生的垃圾。由于用户线程运行不可避免会产生浮动垃圾,而CMS只能等到下一次收集才能去处理。 产生内存碎片:由于采用的标记-清除算法,必然会产生大量内存碎片,可能会出现老年代内存空间足够但没有连续内存无法存放而导致的full GC。
4.G1收集器:是一款面向服务器的处理器,主要针对配备了多核CPU以及大容量内存的机器。
它有以下特点 : 并行与并发:由于使用了多个CPU可以有效减少停顿时间,部分其他收集器需要定下用户线程再执行的GC操作,G1可以通过并发的方式去运行用户线程,提高吞吐量了。 空间整合:从整体上看G1采用的是标记整理算法,而局部上使用的是复制算法。这意味着G1运行期间不会产生内存碎片,收集完成后仍有规整的可用内存,避免了分配大对象时没有连续内存空间来存放而提前触发下一次GC。 可预测的停顿时间:G1相比CMS的一大优势就是他可以建立可预测的时间模型,它能够使使用者明确在M毫秒的时间片段内,G1收集的时间不超过N毫秒。 分代整合:尽管G1不需要其它收集器来分代收集,仍保留了分代的概念,会采用不同的方式收集新创建的对象和存活了一段时间的对象。 而使G1有以上特点的原因是:
1.G1相较于其他收集器有不同的内存布局:它将Java堆划分成多个相同大小的独立区域(region),尽管还是有新生代和老年代的概念,但两者之间不再是物理隔离的了,而是一部分可以不连续的region集合。
2.避免全堆扫描:G1为每个region维护了一个与之对应的记忆集(Remember Set)来记录新生代和老年代之间的引用关系从而避免了全堆扫描。
3.有优先级的区域。G1会跟踪记录每个region中的垃圾价值大小,在后台建立一个优先列表,根据允许的收集时间,优先回收价值最大的region。
这种使用了region划分内存空间以及有优先级的区域回收方式保证了G1能够在有限时间内获得尽可能高的收集效率 。
5.Serial +Serial old:新生代采用复制算法、老年代采用标记整理算法,是需要stw的,单线程的收集器,适合于单CPU下的Client模式。
一篇文章彻底搞定所有GC面试问题 (面试回答思路) 面试官问我G1回收器怎么知道你是什么时候的垃圾?
2020-05-31 20:30:00Windows 10 中安装 Anaconda 3首先通过下面链接地址下载 Anaconda 的个人版本。从上面下载的地址中,选择你需要的版本,目前 Windows 应该基本上都是 64 位的了。在你下载的文件中双击运行。欢迎界面在弹出的界面中显示了欢迎界面。
在这里将会显示默认的安装目录,Anaconda 的安装比较消耗空间,你需要确定你的磁盘有足够的空间可以按照。
在安装的时候,不建议设置 PATH,因为可能因为设置 PATH 导致安装的时候出现问题,也有可能会导致 Windows 载入不同的 Python 的版本。
2020-06-01 08:50:00C# 数据操作系列 - 1. SQL基础操作0.前言前篇介绍了一些数据库的基本概念和以及一些常见的数据库,让我们对数据库有了一个初步的认识。这一篇我们将继续为C#数据操作的基础填上一个空白-SQL语句。SQL(Structured Query Language,结构化查询语言)是一种特定的编程语言,用于管理数据库系统,操作数据甚至编写一些程序。当然,一方面因为时间问题,一方面因为各大数据库的区别(当然了,还有就是个人对SQL研究并不是那么深)所以这一篇就从SQL的基本操作入手,带领大家一起看看SQL的世界。1. SQL的分类在SQL的世界里,被分割为两个部分:DML(Data Manipulation Language 数据操纵语言)、DDL(Database Definition Language 数据定义语言)。当然,也有很多其他的分法,这里参照了机械工业出版社出版的《计算机科学丛书- 数据库系统概念》。1.1 DML
数据操纵语言,用户可以凭此来访问或者操纵那些被结构化存储起来的数据。DML提供了以下功能: 对存储在数据库的数据进行检索(select) 在数据库中添加新的数据(insert) 修改数据库中的数据(update) 删除数据库中的某些数据(delete)
简单的概括起来就是增删改查,对于开发而言这是一项枯燥乏味的工作,当然也是每个程序必不可少的工作。如果你见到这个词:crud,不要诧异,这是开发对增删改查的一种缩写(create,read,update,delete)。
在技术的演变过程中,为了更快更好的增删改查,有一些大牛开发出了一系列的ORM框架,比如C#里最出名的EntityFramework、与Hibernate同源的NHibernate等等。
数据定义语言,用户可以用来创建数据库、修改数据库属性、删除数据库,新建表、视图,修改表、视图,删除表、视图等。与DML不同的是,DDL操作的对象从数据转变成了承载数据的实体或者与操作数据的实体。
还有与DML不同的一点是,DDL更多的会使用 create、alter、drop等关键字(分别用来 创建、修改、销毁)。
如今的城市人们来自五湖四海,有的人用普通话,有的人还是一口流利的家乡话。与之相同的就是在数据库这个江湖里,各大门派都在标准SQL里添加了自己的东西,让SQL成了一个操持着五湖四海的方言的大家族。比如说微软的Transcat-SQL和PL/SQL。
这是一个简单的创建数据库的SQL语句,这是标准SQL的一部分。效果就是创建一个名字为test的数据库,字符集等属性是系统的默认值。
常见配置项: identity 表示该列是个自增列,一般是起始1,增长步长为1 primary key 表示该列是主键列,只能有一个主键 not null 表示该字段非空,如果是空值进来则会报错 unique 表示该字段的值不能出现重复
而数据类型则因为数据库不同会有一些细微的差别,所以这里就不错过多介绍了。2.3 查询一个简单的查询: select * from demo;
注意一下这里的条件里的等值判断用的是一个等号,而不像开发语言里用的是双等号。
这时候发现我们用不了那么多的字段,然后筛选出要显示的字段: select
这里简单介绍一下查询,当然还有很多没有一一介绍,在后续的章节会把这部分补齐的。
2.4 添加数据在查询之前,我们得先保证数据表里有数据,所以我们看看如何插入数据吧。插入单条记录: insert into [表名](,,
在表名后面跟括号,括号内写入要插入值的字段,然后values关键字后面用括号包裹起来的一组值便是要插入的值。插入值要与字段名一一对应。
,,) values(值1,值2,值3),(值1,值2,值3)如果需要插入多条的话,将数据用括号包裹起来,然后依次跟在values后面。
当我们发现插入的数据有问题的时候或者因为业务的进行,数据库表里的数据需要更新,这时候我们可以参照以下方式写自己的sql: update [表名] set=如果需要更新多个字段,可以在更新字段后面添加一个逗号,然后跟在后面,简单实例: update AdditionalService set storeid = 1 , name = 23
删除数据的关键字是delete,所以删除的写法是: delete [表名] where如果不设置where 条件,则删除的是全表数据。
3.总结这一篇大概介绍了SQL的基本用法,开发过程中的SQL基本够用了。后续会随着文章内容逐步填补未介绍的部分。 更多内容烦请关注 我的博客《高先生小屋》
2020-06-01 08:20:00【答疑】软件测试是不是很简单,什么人都可以学?昨天晚上在知乎上看到一个网友问题,我做了一个详细的回答,收到了许多测试人的喜欢与点赞,我把我的回答贴出来分享一下。既然问题问的这么官方,那我来做一个科普?后面再来解答你的问题。软件测试(Software Testing),描述一种用来促进鉴定软件的正确性、完整性、安全性和质量的过程。换句话说,软件测试是一种实际输出与预期输出之间的审核或者比较过程。软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。学习软件测试从哪里入手?我认为分为初级、中级和高级三个阶段,不足之处欢迎朋友们指出,我会及时改正。
鉴于问题的角度,我的观点是实践出真知,当你到了中高级阶段,也许你比我的体会更加深刻,就留一个白。正好昨天在编辑一个软件测试全栈思维导图,有需要的可以私信我。贡献我的微薄之力,做好了也会发出来,记得关注我!
随着互联网IT产业的蓬勃发展,软件测试的行业也日趋火热,软件测试基础入门知识都是固定的那一些,要想成为一个优秀的软件测试工程师要学的并不少。回到你的问题,软件测试是不是很简单?什么人都可以学?我想你心里已经有了答案。
零基础容易从自学到放弃,太多个这样的例子了,一个人的精力有限,还会涉及到每个人自制力,白天上班下班了很多都是只想呆着不动葛优瘫一会,你需要鼓励需要有人给你加油打气!遇到一些自己解决不了的技术难题,容易诱发焦虑迷茫等不利于学习软件测试的情绪,我深有体会,因此建了一个软件测试交流群,有什么问题可以直接在群里问,(718897738)欢迎来学习交流,免费学习资料可供下载)
作为一名软件工程师,需要的能力并不多,但是要成为一名优秀的软件测试工程师,需要的能力就比较多了,自己整理出来8个方面,每个方面都会分成很多细小的方便并进行举例说明。
知乎是一个开放性的平台,有问题上知乎!那我就再为软件测试人或者在路上的测试人说一下优秀的软件测试工程师必备的8个能力。正所谓,做一行爱一行,既然选择了测试,就要把他做好!
了解整个业务里面所需的数据有哪些?哪些是需要用户提供的?哪些是自己提供的?有哪些可以是假数据?有哪些必须是真数据?添加数据的时候可以用哪个库?
明白了整个软件的数据库架构,才能知道哪一个数据是从哪一个表里头带出来的,它的逻辑是什么,有没有连带关系。
用什么语言开发的?用的是什么服务器?测试它的话需要用什么样的环境进行测试?整体的测试环境是什么样的?
如果缺少了,需要进行环境搭建,架构搭建。一般去一家新公司之后,架构是搭建好的,了解它即可,熟悉之前的这些老员工们使用什么样的架构发表去做的。
整个软件有哪些模块,比如说首页面、注册页面、登录页面、会员页面、商品详情页面、优惠券页面等等
比如测一个网站的性能的时候,电脑的配置达不到测试并发5000人的标准,要么升级电脑的硬件配置,要么多机联合,多机联合时需要几台电脑,都需要提前筹划。
我的性能目标是什么样的?我的功能目标是什么样的?我要上线达到的上线标准是什么样的?性能目标,比如我要达到并发5000人的时候,CPU占用率不能高于70%,内存占用率不能高于60%,响应时间不能超过5秒功能目标,比如整体的业务流程都跑通,所有的分支流程都没有问题,所有的接口都能够互相调用,整体的UI界面没有问题,兼容性没有问题等
至少你要满足一般缺陷的发现能力,这个是最基本的,如果要连最简单的一般的缺陷都发现不了的话,别说优秀测试工程师了,你说你是测试我都不信
在软件的测试过程当中有一些缺陷藏的比较深,有的是性能方面的问题,有的是功能方面的问题,它需要有一些设定特定的条件的情况下才会出现这样的问题。
比如说买双鞋必须选择的是什么品牌,必须选择是红颜色,必须选择44号,而且必须选择用特定的支付方式才会出现这样的bug的时候,那么这种就属于特别隐性的bug,对于这样的问题的发现能力一定要比别人更强,要找到一些别人可能发现不了的bug。
当发现了一个缺陷之后,能够想到通过这个缺陷可能会引发其他哪个地方出现问题,这就叫做连带的问题。而不是说发现这一个bug之后提了这一个就算完了,一定要有一个察觉,可能其他地方也存在这样的问题。
凌晨码字不容易哇~点个赞同是对我最大的支持!其实我也就晚上闲下来才有时间来知乎回答一些我认为有价值的问题。帮助到更多想入行或者已经在路上的测试人。软件测试学习群,欢迎来学习交流,免费学习资料可供下载。
如果对python自动化测试、web自动化、接口自动化、移动端自动化、面试经验交流等等感兴趣的测试人,可以关注我。加入我们免费获取更多软件测试进阶资料!
2020-06-03 10:43:00如何快速安全的插入千万条数据?作者:ksfzhaohui 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库。思路1.估算文件大小因为告诉文件有千万条,同时每条记录大概在20个字段左右,所以可以大致估算一下整个订单文件的大小,方法也很简单使用 FileWriter 往文件中插入一千万条数据,查看文件大小,经测试大概在1.5G左右;2.如何批量插入由上可知文件比较大,一次性读取内存肯定不行,方法是每次从当前订单文件中截取一部分数据,然后进行批量插入,如何批次插入可以使用**insert(...)values(...),(...)**的方式,经测试这种方式效率还是挺高的; 怎么快速插入 100 条数据,用时最短 ,这篇看下。
截取数据的时候需要注意,需要保证数据的完整性,每条记录最后都是一个换行符,需要根据这个标识保证每次截取都是整条数,不要出现半条数据这种情况;
因为需要进行批次数据的插入,数据库是否支持大量数据写入,比如这边使用的mysql,可以通过设置 max_allowed_packet 来保证批次提交的数据量;
因为是大文件解析,如果中途出现错误,比如数据刚好插入到900w的时候,数据库连接失败,这种情况不可能重新来插一遍,所有需要记录每次插入数据的位置,并且需要保证和批次插入的数据在同一个事务中,这样恢复之后可以从记录的位置开始继续插入。
使用FileWriter遍历往一个文件里插入1000w条数据即可,这个速度还是很快的,不要忘了在每条数据的后面添加 换行符(\n\r) ;
如上代码在一个事务中同时保存批次订单数据和文件解析位置信息,batchInsert通过使用mybatis的**
<**标签来遍历订单列表,生成values数据;
<总结
以上展示了部分代码,完整的代码可以查看 Github 地址中的batchInsert模块,本地设置每次截取的文件大小为2M。
经测试1000w条数据(大小1.5G左右)插入mysql数据库中,大概花费时间在20分钟左右,当然可以通过设置截取的文件大小,花费的时间也会相应的改变。
2020-06-03 09:30:06从聚合支付业务的设计来聊聊策略模式六月福利2020年6月公众号码农小胖哥原创文章转发第一名将送全新《 Spring Boot实战 》实体书一本,该书是学习热门框架 Spring Boot 的经典之作。 你不再需要依靠运气,而是勤奋 。截止统计日期2020年6月30日,统计数据以官方公众号工具为准,运营人员不参加活动,本次活动图书由掘金社区赞助。1. 前言前几天讲了 设计模式中的命令模式 ,今天来看看另一个模式。移动支付目前在国内已经是非常普及了,连楼下早餐摊的七十多岁大妈也使用支付宝和微信支付卖鸡蛋饼。如果让你做一个App你肯定要考虑多个渠道支付,以保证获客渠道。如果让你来接入多种支付渠道你会怎么设计?2. 通常写法一般下面这种写法很容易被创造出来: public boolean pay(BigDecimal amount){ boolean ret =false; if (alipay){ //todo 支付宝的逻辑 }else if (wechatpay){ //todo 微信支付的逻辑 }else if (ooxx){ // …… } return ret; }如果集成了四五种支付,这个代码就没法看了少说几千行,而且改动某个支付的逻辑很容易改了其它支付的逻辑。因此需要合理的设计来避免这种风险。3. 策略模式
中间的 发起支付前逻辑 和 支付后处理逻辑 是客户端的自定义业务逻辑,向支付服务器发送的请求只会携带对应支付服务器特定要求的参数调用不同的支付 SDK 。所以我们分别建立对应支付方式的策略来隔离区分它们,降低它们的耦合度。当准备支付时我们只需要选择对应的策略就可以了。
结合上面的类图,我们就来结合着需求来聊聊策略模式中的主要几个角色。 Strategy 接口。这个接口用来声明每一种方式的独立执行策略,用来封装具体策略的特有算法逻辑。 ConcreteStrategy 是 Strategy 的实现类。实现了不同策略的算法逻辑。比如每种支付的调用细节等等。 Context 上下文。它通过策略接口来引用了具体的策略并使用具体的策略来执行逻辑,同时所有策略的共性也可以在该类中进行统一处理。在聚合支付需求中我们传入一个策略,先执行支付前的逻辑,然后使用策略,策略执行完毕后,再执行后置的共性逻辑。 Client 客户端。创建策略对象并传递给上下文 Context ,然后由上下文运行具体的策略。
结合业务逻辑是这样的: 请求到达客户端,客户端根据请求中包含的支付渠道来构建对应的策略对象并把它交给上下文对象去执行支付流程。
我们拿到请求中的支付标识,然后初始化对应的支付策略,封装指定的请求参数,交给上下文对象 PayContext 来执行请求。如果你再增加什么 ApplePay 之类的去实现 ApplePayStrategy 就行了。
4.1 优点 我们将算法的实现和算法的使用进行了隔离,算法实现只关心算法逻辑,使用算法只关心什么条件下使用什么算法。 开闭原则,无需修改上下文对象,想扩展只需要引入新的策略。 运行时根据条件动态的去切换算法。 适应个性的同时也可以兼容共性。
策略模式也是很常见而且有着广泛使用场景的设计模式。今天我们从聚合支付来学习了策略模式,对它的优缺点也进行了一个分析。随着 函数式编程 的普及,策略模式开始被逐渐的代替,但是它依然值得我们去学习。感谢你的阅读,多多关注: 码农小胖哥 ,更多编程干货奉上。
2020-06-03 08:56:00JavaFX初探(菜单)JavaFX初探(菜单)本节我们介绍如何创建菜单、菜单栏、增加菜单项、为菜单分类,创建子菜单、设置菜单上下文。你可以使用下面的类来创建菜单。 MenuBar MenuItem Menu CheckMenuItem RadioMenuItem CustomMenuItem SeparatorMenuItem ContextMenu下图是一个典型的菜单的使用:在应用中构建菜单一个菜单就是一系列可操作的项目,可以根据用户的需要来表现。当一个菜单可见的时候,用户可以在某一时刻选中其中一个,在用户选中某一项时,这个菜单变成隐藏模式。通过使用菜单,我们可以节省用户界面的空间,因为有一些功能某些时间并不是总要现实出来的。菜单在菜单栏中被分组,你需要使用下面的菜单项类,当你构建一个菜单的时候。 MenuItem 创建可选项 Menu 创建子菜单 RadioButtonItem 创建一个单选项 CheckMenuItem 这个菜单项可以在选择被无选择之间转换。为了给菜单分类,可以使用SeparatorMenuItem 类。菜单通常在窗口的顶部,并且这些菜单是隐藏的,我们可以通过鼠标点击上下文来打开菜单。
尽管菜单栏可以放在用户界面的任何地方,但是一般情况我们放到窗口的顶部。并且菜单栏可已自动的改变自己的大小。默认情况下,每一个菜单栏中的菜单像一个按钮一样呈现出来。
和其他的UI控件不同,Menu类和其他的扩展MenuItem的类都不是扩展自Node类。所以他们不能直接添加到场景中,需要先添加到MenuBar中然后在添加到场景中。运行如下图所示:
你可以使用键盘的方向键来浏览菜单,然而当你选中一个菜单的时候,什么都没有发生,那是因为我们还没有指定行为。
当用户选择Shuffle菜单的时候,会就调用我们指定的setOnAction方法,显示出植物的名字、图片和简单描述。
CheckMenuItem 是MenuItem类的扩展,他可以选中和非选中,如果被选中了,会显示出一个标记。编译运行如下图所示:
Edit菜单中定义了两个菜单项:图片效果和无效果。图片效果菜单项有子菜单项。