02、SECS-II 通信协议介绍

这里我们先学习 SECS-II 协议,给我的感受是先学完 SECS-II 协议,再去学习 SECS-I 和 HSMS 协议更加容易理解,所以这里我先介绍 SECS-II 协议。

文章的内容基本上来自参考资料和自己看的文档,若有侵权,请联系删除,谢谢。

1、SECS-II 概述

消息协议用于在主机和设备( Host and Equipment)之间发送 SECS-II 消息。每个SECS-II消息都包含一条主消息( primary message )和一个可选的次回复消息( optional secondary reply message)。这也被称为一个事务(transaction)

  • Primary: 是由主机或设备发送的SECS-II消息。这里要注意,既可以是 HOST 发送,也可以是 EQUIPMENT 发送,谁先发送就认定为 Primary
  • Secondary: 是一个可选的SECS-II消息是作为对 Primary 的响应而发送的。也就是说,在SECS-II通信中,当接收到主要消息时,可以选择发送一个可选的响应消息。

SECS-II 标准定义了使用如SECS-I、HSMS等传输协议在设备和主机之间交换的消息的形式和含义。

定义了以消息的形式在设备和主机之间传递信息,消息按其流分类,称为Stream。有很多不同流的Stream,每个Stream又包括具体的消息,称为Function

标准还定义了消息的结构,消息由数据项和数据项列表 ( items and lists of items ) 构成。该结构允许自描述数据格式,以保证对消息的正确解释。

SECS-II还规定了事务协议,用于管理消息的交换、分块等,对SECS-II实现提出了一些最低要求。

2、Streams and Functions

2.1 Streams and Functions 基础介绍

SECS-II消息被称为行为和函数(Streams and Functions)每条消息都有一个流值(Sx)和一个函数值(Fy)。比如:Stream 1 Function 1,写作:S1F1,并被称为“S1F1”。流是消息的类别,而函数是该类别中的特定消息。

注意:

Stream和Function按照数字进行编号。所有的Primary Message的Function编号为奇数,其对应的Secondary Message(即 Reply Message)的Function编号为偶数且为其Primary Message的Function编号加1。

如果Primary Message不需要应答,则其对应的偶数编号(Primary Message Function 编号加1)的Function不使用,保留。

我们来看一个例子:

接下来我们一起看看哪些 Streams and Functions 是保留的,那些是我们可以自定义的。

Stream **Function ** Availability
0 0 to 255 系统保留的
1 to 63 0 to 63 系统保留的
64 to 127 0 系统保留的
1 to 63 64 to 255 用户可自定义使用的
64 to 127 1 to 255 用户可自定义使用的

注意:

All function 0’s have a special meaning. They are sent as a reply to an aborted primary message.

上面这句话的意思是:所有Stream中Function编号为0的Message保留,用于中止事务。

2.2 Stream 的分类

上面我们了解了 Streams and Functions 的基础介绍,接下来一起学习下 Stream 的分类。

Stream Catagory 含义
1 Equipment Status 设备状态
2 Equipment Control and Diagnostics 设备控制和诊断
3 Material Status 原料状态
4 Material Control 原料控制
5 Alarm Handling 异常处理
6 Data Collection 数据采集
7 Recipe Management 工艺程序管理
8 Control Program Transfer 控制程序传输
9 System Errors 系统错误
10 Terminal Services 终端服务
11 Host File Services (Deleted) 主机文件服务(已删除)
12 Wafer Mapping 晶片图形布置
13 Data Set Transfers 数据集传输
14 Object Services:对象服务; 对象服务
15 Recipe Management 配方管理
16 Processing Management 工艺进程管理
17 Equipment Control and Diagnostics 设备控制和诊断
18 Subsystem Control and Data 子系统控制和数据

3、事务和会话协议

3.1 事务

事务:是信息交换的基础一个事务由不需要Reply的Primary Message或需要Reply的Primary Message及其Reply Message组成。这里我理解的事务指的是:一次完整的请求或者一次完整的请求响应。

下列是SECS-II在事务层面所规定的要求:

  • 使用S1F2来响应S1F1;
  • 对于接收到的任何设备无法处理的消息,使用Stream 9发送相应的错误消息;
  • 格式化任何其他受支持的消息;
  • 在检测到设备上的事务超时后,向主机发送S9F9;
  • 在收到Function 0的Message作为对Primary Message的回复后,终止相关事务。该设备不应向主机发送任何错误消息。

3.2 会话

会话是用于完成特定任务的一系列的一个或多个相关事务。会话应包括完成任务所需的所有事务,会话结束时,会话双方应释放相关资源。

会话超时表示会话在规定时间内未完成会话超时时间和检测由用户应用程序自定义

会话超时将终止会话的进一步操作,并将允许清除任何已提交的资源。在设备上检测到会话超时后,应发送S9F13给主机。

SECS-II中定义了7种类型的会话:

1、一个无需回复的Primary Message是最简单的会话。此消息必须是一个单块的SECS-II消息。

2、如果响应端有发起端想要的数据,则会使用Primary Message请求这些数据,响应端将这些数据作为Reply Message回复给发起端。这是一个 request / data conversation(请求/数据对话)。

3、如果发起端将单块消息中的数据发送给响应端,并期望从响应端回复确认。这是一个 send / acknowledge conversation(发送/确认会话)。

4、如果发起端有一个要为特定的交互发送的多块消息,则发起端必须在发送数据之前获得响应端的许可。

​ 会话中的第1个事务请求发送权限,响应端授予或拒绝发送权限。如果授予权限,发起端发送数据,响应端进行相应地回复。

​ 这是一个 inquire / grant / send / acknowledge conversation(询问/授予/发送/确认对话)。

5、一个关于在设备和主机之间传输未格式化的数据集的对话,这个会话在 Stream 13 中有详细描述。

6、 一个关于设备之间原料处理的会话。这个会话在 Stream 4中详细描述。

7、发起端可以向响应端请求需要一段时间才能获取的信息(例如,操作员的输入)。

​ 会话中的第一个事务请求信息,并且响应端以三种方式之一响应:(1)返回信息,(2)响应端表示不能或不会获得信息,(3)响应端表示将在随后的事务中获得并返回信息。

  对于方式(3),响应端将在信息可用时启动后续事务返回信息。方式(3)是一个 request / acknowledge / send / acknowledge conversation(请求/确认/发送/确认对话)。

4、消息的数据结构

所有根据SECS-II标准的消息使用两种数据结构,即 Item (项目) 和 List(列表)。消息数据结构定义了消息的逻辑划分,与消息传输协议的物理划分不同。

消息的数据结构旨在为在设备和主机之间传递的消息提供一个自描述的内部结构。

4.1 Item

一个Item是一个具有长度和格式的信息包。由Item Header 和 Item Body 组成。

Item的前2个、前3个或前4个字节称为 Item Header,用以描述Item的长度和格式。Item Header后的字节称为 Item Body,Item Body是Item的实际数据。

下图是 Item Header 的结构图:

这个图看着是不是挺复杂的,不用急,我们一步一步的捋清楚后,就会发现并不难。

LSB和MSB的含义:

  • MSB(Most Significant Bit):最高有效位,二进制中代表最高值的比特位,这一位对数值的影响最大。

  • LSB(Least Significant Bit):最低有效位,二进制中代表最低值的比特位

例如,在二进制的1001(十进制的9)中,最左边的“1”即是MSB对数值影响最大,从1到9的变化幅度。而最右边的1是LSB因为仅会让数值产生8到9的变化。

总结:MSB指二进制中表示的最高有效位,LSB指数据的最低有效位,1(MSB)001(LSB

从上图中我们知道,Header的第1个字节为Format byte,其后的字节为Length byte。

注意这里的其后的字节为 Length byte,这里的 字节数不是固定的。

Format byte 被各位了两部分,前面两位表示:Item Body的长度,后面的表示:数据的格式,即ItemBody中的字节数据类型

  • Format byte的第1位和第2位:

    定义Format byte后面有几个字节来表述Item Body的长度。取值只能1、2、3。如果值为2,则表示有2个字节表述Item Body的长度,即第2个和第3个字节。值为0是非法的,会产生错误。

    这里就解释了上面为什么说:其后的字节为 Length byte,这里的 字节数不是固定的。因为Format byte的第1位和第2位一共有意义的值有1、2、3,即 Item Header 的 字节可能为 :前2个、前3个或前4个字节。

    这里有一个需要特别注意的点,图中的 No. of length bytes 为 0 时,说的是错误的数据格式。但是我看其他的文档,说的是 0 代表 无Item 。这里暂不清楚谁对谁错,也可能是不同的设备厂商有不同的定义。这里大家一定要注意!!!

  • Format byte的第3位至第8位:

    定义数据的格式,即ItemBody中的字节数据类型。下图为数据类型定义表:

4.2 List

List是一组有序的元素,其中元素可以是Item或List

List 的Header与数据类型为0的Item的Header形式相同。不过List的Header中的长度表示List中元素的个数,Item的Header中的长度表示数据字节的个数。

这里我页不太明白,清楚的朋友,请不吝赐教。

4.3 Localized Character String Items

本地化字符串项是一个用于表示由多字节字符组成的字符串的Item。其Header中的Format Code为22(Octal)。它由string header和string组成。

因为字符有许多不同的编码方案,所以有一个附加的string header来表述字符集。

string header 是一个2字节16位的数字,它在 Item Header 之后,在string之前。

string header 是 Item 的 实际数据的一部分,所以它的长度计算包含在Item Header 的 Length byte 中。

下图为string header的编码集对应。

4.4 不同Item的数据实例

上面看了这么多理论,接下来一起看看几个 Item 的数据实例,来帮助我们进行理解。

1、包含一个二进制数据 10101010 的 Item。

  00100001  Item, binary, 1 length byte
  00000001  1 byte length
  10101010  data byte

理解了上面这张图代表的含义,上面说的内容基本上就理解了。

2、 包含三个ASCII字符ABC的Item。

  01000001  Item ASCII, 1 length byte
  00000011  Three bytes long
  01000001  ASCII A
  01000010  ASCII B
  01000011  ASCII C

3、包含三个2字节有符号整型数字的Item。

  01101001  Item, 2-byte integers
  00000110  6 bytes total (6/2=3 integers)
  xxxxxxxx   MSByte number x
  xxxxxxxx   LSByte number x
  yyyyyyyy  MSByte number y
  yyyyyyyy  LSByte number y
  zzzzzzzz  MSByte number z
  zzzzzzzz  LSByte number z

4、 包含一个4字节浮点数的Item。

  10010001  Item, 4-byte floating point  
   00000100  4 bytes (4/4=1 number)
  ffffffff
  ffffffff  Floating point number
  ffffffff 
  ffffffff

5、Message Layout(消息布局)

SECS-II 消息包含一个 structure or layout (结构或布局)。该布局定义了SECS-II消息的所有数据项。布局是消息中遵循Stream and Function notation (流和函数符号)的一部分。

上面中 L、A 这种是什么意思呢,还记得我们在 4.1 Item 中介绍的 Format byte 中 第3位到第8位 的作用吗?这里就是的 L、A 就是表示 Item Body 中的数据类型。我们称之为Data Item。接下来一起看看有哪些 Data Item吧。

数据项由 format codes(格式代码)定义。下表中列出了所有可能的数据项及其格式代码。格式代码仅由6位来定义。

需要注意的是,List 类型的数据项可以包含 其他数据项,当然了,也可以包含 List 数据项。

Type 缩写 Type 含义 Format Code
L List 列表 000000
A ASCII ASCII字符 010000
B Binary 二进制数 001000
Boolean Boolean 布尔值 001001
I1 1-byte Singed Integer 1字节有符号整数 011001
I2 2-byte Singed Integer 2字节有符号整数 011010
I4 4-byte Singed Integer 4字节有符号整数 011100
I8 8-byte Singed Integer 8字节有符号整数 011000
U1 1-byte UnSinged Integer 1字节无符号整数 101001
U2 2-byte UnSinged Integer 2字节无符号整数 101010
U4 4-byte UnSinged Integer 4字节无符号整数 101100
U8 8-byte UnSinged Integer 8字节无符号整数 101000
F4 4-byte Floating-Point 4 字节浮点数 100100
F8 8-byte Floating-Point 8字节浮点数 100000
JIS-8 网上的资料说是:JIS-8是一种
半导体器件的防水等级标准,
表示该器件能够在水深超过1米
的水下保持正常工作。
不知道对不对哈
010001

SECS-II消息可以使用几个约定进行注释。下面显示了两个更常见的惯例:

  • SEMI Standard

  • SML(SECS Message Language) Format

按照我的理解,这里的A[6] 是不对的,第一个 A[6]应该是A[4]。第二个 A[6]应该是A[7]。

6、Layout Encoding(布局编码)

这里我放出来我看的文档的英文原版,大家自行理解。

Before a SECS-II message can be sent, the layout must be encoded. Each data item in the message layout is encoded and becomes part of the Data Structure. This is repeated until all the data items in the layout are encoded. The Data Structure is subsequently sent via the SECS-I protocol.

说说我的理解:

在发送SECS-II消息之前,我们要对数据进行编码,这里的数据指的是 5、Message Layout 中的完整数据。消息布局中的每个数据项都被编码,并成为数据结构的一部分。将重复此操作,直到布局中的所有数据项都被编码为止。数据结构随后通过 SECS-I 协议发送。(这里其实还可以通过 HSMS协议发送)

6.1 Data Item 如何编码

接下来我们要重点理解了,我们将一起来看看如何将 Data Item 编码:

这里我们先对 Item 有一个整体的认知,方便后面的叙述:

image-20230522173425187

Encoded Data Item的第一个字节包含数据项的 format code(格式代码),并定义了接下来的将用几个字节来表示数据项的长度。format code用第2位到第7位表示, the number of length bytes用第0位和第1位表示,那可以知道,数据项的长度的取值范围是:0字节、1字节、2字节、3字节。

接下来的0、1、2或3个字节定义了数据的长度。例如,如果数据的大小为1000字节,那么将需要2个长度的字节来表示1000(03 E8十六进制 或 00000011 11100100二进制)

下表显示了可以用长度字节数表示的最大数据字节数。

Number of length bytes Max data size
0 Empty item
1 256 bytes
2 64 Kbytes
3 7.99 Mbytes

接下来的n个字节包含了该数据项的数据。

下面显示了如何对ASCII数据项进行编码。根据它所包含的数据字节数,它可能需要0、1、2或3个长度的字节来表示数据字节的总数。

010000 -> 表示 ASCII 。

下面显示了一个示例SECS-II消息布局是如何编码的。请注意,在本例中,只有消息布局被编码,流和函数没有被编码。所有数值均以十六进制为单位,(例如: 52 = 01010010)

这里的 01、02 共同组成了 Item Header。

其中 01 中的 Format code 是:000000,表示 List 类型。长度是: 01,表示接下的一个字节表示数据的长度。

02 则表示 有2个元素。

6.2 Multi-Block Messages

由于SECS-I协议中的数据大小限制,编码的SECS-II消息(数据结构)可能不适合于一个SECS-I事务。因此,编码的SECS-II消息被划分为更小的块,一次发送一个块。这被称为多块消息传递。

每个SECS-I消息块被限制为244个已编码的SECS-II消息字节。消息块的最大数量为32,767,因此SECS-II编码的最大消息大小为 244 x 32,767 字节长。

6.3 SECS-II Parameters

SECS-II Parameters : 用于在实现消息协议时定义一些边界。下表显示了SECS-II控制系统中的参数:

SECS-II Parameters 描述
T3 Reply Timeout
T4 Inter-Block Timeout
  • T3: 从发送端发送 Primary Message 到接收到响应端回复的 Secondary Message之间的时间间隔。

  • T4: 多块传输中,接收到相邻块之间的时间间隔。

6.4 Interleaving Messages

这是指一次要处理不止一个事务。事务是发送主消息和可选的接收辅助应答。一个事务在等待回复时被“打开”。交错是指有多个“打开”事务的能力。这允许发送多个主消息,而无需首先等待辅助回复。支持此特性并不是SECS-II的要求。

7、常见的 SECS-II Messages

这里我们列出了更常用的SECS-II消息。

1、第一组消息通常在初始化时使用。

SECS-II Description
S1F1 Say hello to the equipment
S1F13 Establish communications with the equipment
S2F15 Set equipment constants
S2F43 Turn off spooling
S2F33 Create / Delete reports
S2F35 Link reports to events
S2F37 Enable / Disable events
S5F3 Enable / Disable alarms

2、这些信息可用于配方选择、远程启动、晶圆片选择等

SECS-II Description
S2F41 Remote equipment control
3、这些消息可用于数据收集。
SECS-II Description
S6F3 Older version of Event Reports
S6F9 Older version of Event Reports
S6F11 Event Reports

4、S5F1用于处理设备报警

5、S9 这一类用于当设备检测到之前的消息错误时,由设备发送。

特别感谢 SECS半导体设备通讯-3 SECS-II通信标准 这边文章,让我对 SECS协议有一个入门的了解。

参考资料:

SECS半导体设备通讯-3 SECS-II通信标准

清晰讲解LSB、MSB和大小端模式及网络字节序

本文转载于网络 如有侵权请联系删除

相关文章

  • ThinkPHP6之EasyWeChat使用Redis储存access_token

    在实际的项目开发过程中,总会遇到多套程序使用一个公众号的情况。而共用一个公众号,首先会遇到的应该是access_token问题了,两个程序互相的去获取access_token,导致被“挤下线”。 这次我遇到的情况比较简单,两套程序都是自己负责开发的,所以比较好处理,只需要修改代码,让它们共用access_token即可。什么是access_token?access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。为什么会被“挤下线”呢?access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效怎么解决被“挤下线”呢?建议公众号开发者使用中控服务器统一获取和刷新access_token,其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则容易造成冲突,导致access_token覆盖而影响业务详细想法微信那边建议的是,使用中控服务器统一获取和刷新access_toke

  • 记一次“本以为简简单单但发现有一丁点复杂”的安全分析事件

    在我们使用态势感知等安全设备从事安全分析工作时间较长后总会产生思维惯性,从而会忘记了如何人工进行安全分析。有时给到客户的建议却解决不了实际问题,所以如何结合人工分析并掌握从而达成一次较为高效并且能解决实际问题的技能就显得尤为重要。情况简介2021年某日某时,正吃完午饭的我,揉着眼睛打开态势感知平台准备日常划水,突然一个告警引起了我的注意,于是我“啪”的一下,很快啊,赶紧把相关告警进行溯源排查,一个小时后就生成了一份像模像样的安全分析告警溯源报告,立即联系相关单位做下发,同样的在我正慢慢悠悠吃晚饭的时候,突然被拉进了一个微信群,主机管理员告诉我病毒查杀不出来需要我的协助,我就纳闷了,杀个毒有那么难吗?还得我亲自出马,后来我才发现事情没有我想象的那么简单……安全分析1.2021年某月某日下午,态势感知平台告警情况如下,某单位主机疑似感染LifeCalendarWorm挖矿蠕虫2.进行溯源分析发现源IP:10.x.x.x每隔10分钟连接一次恶意域名,恶意域名已在微步威胁情报库进行查询威胁有效,以下为举个“栗子”:3.分析完毕基本确认该主机感染挖矿病毒,迅速出具安全事件溯源报告,下发给对应单位

  • Flutter基础widgets教程-cupertinoActivityIndicator篇

    ​1 CupertinoActivityIndicator一个iOS风格的loading指示器。显示一个圆形的转圈菊花2 构造函数 CupertinoActivityIndicator({ Keykey, this.animating=true, this.radius=_kDefaultIndicatorRadius, this.iOSVersionStyle=CupertinoActivityIndicatorIOSVersionStyle.iOS13, })复制3 常用属性 3.1animating:是否播放动画animating:true,复制3.2radius:加载框半径radius:20.0,复制

  • Redis 到底是单线程还是多线程?我要吊打面试官!

    最近发布的文章,其中有一道题:Redis是多线程还是单线程?(回答单线程的请回吧,为什么请回,请往下看)好些粉丝在后台问我:为什么请回,Redis不是单线程吗?大家注意审题:Redis是多线程还是单线程?这个问题你要从多个方面回答,如果你仅仅只回答"单线程"肯定是说不过去的,为什么呢?所以今天,栈长利用工作时间紧急把这个问题紧急梳理了下,希望对大家有帮助。1、Redis单线程到底指什么?没错,大家所熟知的Redis确实是单线程模型,指的是执行Redis命令的核心模块是单线程的,而不是整个Redis实例就一个线程,Redis其他模块还有各自模块的线程的。下面这个解释比较好:Redis基于Reactor模式开发了网络事件处理器,这个处理器被称为文件事件处理器。它的组成结构为4部分:多个套接字、IO多路复用程序、文件事件分派器、事件处理器。 因为文件事件分派器队列的消费是单线程的,所以Redis才叫单线程模型。 参考:https://www.jianshu.com/p/6264fa82ac332、Redis不仅仅是单线程一般来说Redis的瓶颈并不在CPU,而在内存和网络

  • 如何在跨浏览器测试中提高效率

    Web端应用测试主要障碍之一就是在不同的浏览器上“测试他们的网站/应用程序”,也称为“跨浏览器测试”或者“兼容性测试”。浏览器和浏览器版本很多(GoogleChrome,MozillaFirefox,InternetExplorer,MicrosoftEdge,Opera,Yandex等),可以通过多种设备(通过台式机,笔记本,智能手机,平板电脑等)访问网站/应用。)以及可能用于访问网站的多种操作系统(Windows,MacOS,Linux,Android,iOS等)。要确保网站的UI/UX及其功能正常运行,并且在“浏览器+浏览器版本+操作系统+设备配置”的组合上没有任何BUG,则将需要大量的开发,测试和维护工作。手动跨浏览器测试的主要痛点是,测试人员可能需要花费大量时间来测试不同的网页,跨浏览器跨越来越多的“复杂”组合中的不同断点测试Web应用程序。测试人员要确保在不影响迭代周期的情况下,保持测试流程覆盖到位以提高执行测试的速度。下面是改善手动跨浏览器测试(兼容测试)的一些方法和技巧。并行测试不管测试策略是否涉及自动化测试,众所周知的事实是,与串行开发/串行测试相比,并行模块开发/并

  • Zookeeper怎么实现分布式锁?

    作者:coolbloghttps://segmentfault.com/a/11900000108958691.背景最近在学习Zookeeper,在刚开始接触Zookeeper的时候,完全不知道Zookeeper有什么用。且很多资料都是将Zookeeper描述成一个“类Unix/Linux文件系统”的中间件,导致我很难将类Unix/Linux文件系统的Zookeeper和分布式应用联系在一起。后来在粗读了《ZooKeeper分布式过程协同技术详解》和《从Paxos到Zookeeper分布式一致性原理与实践》两本书,并动手写了一些CURDdemo后,初步对Zookeeper有了一定的了解。不过比较肤浅,为了进一步加深对Zookeeper的认识,我利用空闲时间编写了本篇文章对应的demo–基于Zookeeper的分布式锁实现。通过编写这个分布式锁demo,使我对Zookeeper的watcher机制、Zookeeper的用途等有了更进一步的认识。不过我所编写的分布式锁还是比较简陋的,实现的也不够优美,仅仅是个练习,仅供参考使用。好了,题外话就说到这里,接下来我们就来聊聊基于Zookeepe

  • 乐享体验环境上线了!

    本文预计阅读3分钟有些事我都已忘记 但我现在还记得在一个晚上我的母亲问我今天怎么不开心! 我说在我的想象中有一个乐享与众不同最时尚管理一级棒整个城市找遍所有的街……IT小姐姐哟乐乐!你这是在唱你们乐享的主题曲吗!爱玛!是IT小姐姐!好久没碰到她了!赶紧摆个更酷的pose!毕竟我今天是穿着滑板鞋的酷bro!(得意脸)当然是因为乐享又有大事情啦!乐乐是的!乐享又要搞事情啦~~~今天要讲点在乐享,你不知道的事!在你的想象中,乐享大概是这样的:而实际上!乐享就只能做到这些吗???今天,来让你们认识一下不一样的乐享!首页原来我们可以这么做乐享的首页自定义发挥的空间非常大,我们不仅可以改变各种应用的图标,还可以根据自己公司的需求来进行排版,使用吸引力足的图片放在首页。除此之外,我们也可以将各个场景配到工作台上,进入更方便啦!智慧党建更直观建立一个智慧党建的K吧,无论是时政要闻、学习园地、党员模范等,按照这样的页面呈现出来更加直观可见,也能够让员工们更系统化的学习。员工关怀有抓手做公司内部的月刊对于员工了解公司大事非常有益,而做一个员工自助平台,让大家能够查到自己的各种福利、差旅、五险一金等等情况,

  • REST API面临的7大安全威胁

    近年来,互联网上安全漏洞显著增多。互联网安全的话题也被技术博客和论坛讨论得越来越频繁:安全性非常重要,尤其是在RESTAPI的世界中。根据Jitterbit公司2018年API集成状态报告:APIs正在改变商业人印象深刻的是,现在有64%的组织机构正在创建用于内部或外部用例的APIs。虽然现在有四分之一的受访者根本没有创建APIs,但是有40%的受访者正在使用内部和外部用例中的APIs。API的创建和管理落到了开发人员的肩上如今,大多数利用APIs的组织都依赖开发人员来编写和管理这些api。33%的受访者使用专门的技术来管理APIs,而90%的受访者则依赖开发团队或外部资源从头开始编写APIs。由于在越来越多的新的云应用程序之间编写集成代码,组织已经不堪重负,因此要求开发人员为业务创建和管理APIs。RESTAPI安全在设计、测试和部署RESTAPI时,安全性问题必须是需要考虑的重要方面。随着RESTAPI的惊人发展,安全级别,大部分时间,在API的设计和开发中被低估了。敏感数据的安全性,无论是组织的还是个人的信息,都是当今困扰开发人员的一个重要因素。RESTapi也不例外,它是需要针

  • 【LeetCode 122】关关刷题日记25-Best Time to Buy and Sell Stock II

    关关的刷题日记25–Leetcode122.BestTimetoBuyandSellStockII题目Sayyouhaveanarrayforwhichtheithelementisthepriceofagivenstockondayi.Designanalgorithmtofindthemaximumprofit.Youmaycompleteasmanytransactionsasyoulike(ie,buyoneandselloneshareofthestockmultipletimes).However,youmaynotengageinmultipletransactionsatthesametime(ie,youmustsellthestockbeforeyoubuyagain).这题目与121题的区别是,不限制买卖次数,可以进行多次交易。但是要求同一时间只能有一只股票在手里,下一次买股票之前必须把手里的股票卖掉。思路思路:和炒股的思想一样,最低点买入,最高点卖出,所以我们需要求单调递增区间的收益的累加和,时间复杂度O(n)。classSolution{public: int

  • 想尝试搭建图像识别系统?这里有一份TensorFlow速成教程

    李林编译整理 量子位出品|公众号QbitAI从我们见到的各种图像识别软件来看,机器似乎能认出人脸、猫、狗、花草、各种汽车等等日常生活中出现的物体,但实际上,这有一个前提:你要用这些类别的图像,对它进行过训练。确切地说,该叫它“图像分类”。建立一个图像分类器并不复杂,技术博客SourceDexter上最近发表的一篇文章,介绍了该如何快速用TensorFlow实现图像分类。以下是量子位节选自这篇文章的内容:在进入正题之前,我们先讲一些基本概念。图像分类是怎样实现的?向一个训练过的系统输入图像,我们会得到一组概率值:每个训练过的类别都有一个,然后,系统会将图像归到概率最高的类。比如说你训练了一个系统,来识别猫和狗。当你输入一张图像时,系统会输出这张图像属于猫的概率和属于狗的概率。不过,这种分类器也有一个缺陷:如果你输入一张蛇的图片,它也只能判断这张图片包含猫的概率高,还是包含狗的概率高一点。神经网络和深度神经网络概括地说,神经网络是计算单元的连接,能够从提供给它的一组数据中进行学习。把多层神经网络堆叠在一起,我们就得到了深度神经网络。建立、训练和运行深度神经网络的过程,称为深度学习。量子位之

  • Deprecated: getEntityManager is deprecated since Symfony 2.1

    PHP5.3应用中,登陆后台管理时提示错误: Deprecated: getEntityManager is deprecated since Symfony 2.1. Use getManager instead in vendor\doctrine\doctrine-bundle\Doctrine\Bundle\DoctrineBundle\Registry.php on line 71   此问题可以通过php.ini的报错级别来处理,把 error_reporting = ALL 改为 error_reporting = E_ERROR 即可! huidaoli版权所有:转载请注明出处,谢谢合作!

  • Invalid argument supplied for foreach() in wp-include/script-loader.php如何解决

      今天小美眉说网站头部多了一行错误提示:Warning:Invalidargumentsuppliedforforeach()in/wp-includes/script-loader.phponline2652,这是什么情况呢?查了相关资料,提示可能主题function文件定义错误,随ytkah一起来调试一下   打开function文件,发现多了一行 remove_action('wp_head','wp_enqueue_scripts',1); 复制   把这一行代码屏蔽,网站显示正常了 请已赞赏了的朋友加我微信

  • m3u8到底是什么格式?一篇文章搞定m3u8下载

    谷歌浏览器猫爪插件   m3u8视频在线提取工具   m3u8到底是什么格式?一篇文章搞定m3u8下载   注入代码 //注入html let$section=document.createElement('section') $section.innerHTML=`<!doctypehtml> <htmllang="en"> <head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0"> <metahttp-equiv="X-UA-Compatible"content="ie=edge"> <metaname="author"content="毛静文,Momo"> <metaname="keywords"content="m3u8

  • 2019年长安杯电子数据取证比赛 个人总结

    一、回忆经历 赛前: ZYL突然过来问我,这里有个比赛要不要一起去玩一玩,反正不收费,地点就在学校。我看了看题目类型,感觉有点慌。 “这些题目都好鬼畜啊,登陆历史、操作记录之类的东西该去哪里找。。。” “我怎么知道他邮件和微信发了什么消息啊。。” TT在旁边一笑:”到时候你直接把镜像丢进软件里去分析就可以啦~“ 于是比赛前一天晚上,我们俩在电脑上装好了分析软件,甚至根本不知道怎么操作使用。 赛时: 人还挺多。 虽说是超级小的小比赛,但来的人着实不少,E楼那种大型的讨论实验室,坐的满满当当。看了一下场地分配图,我俩坐在了墙角的位置。 对面是甘肃政法大学的团队,两位小姐姐+一位大哥,提着行李箱就进场了,随后从里面掏出三台看起来超级厉害的微星笔记本(或者说是移动工作站)。我俩低头看看自己的装备:一台华为轻薄本、一台联想Thinkpad,瞬时感觉获奖希望渺茫。 ”凉了“ 题目发下来之后,我们才摸清楚电子取证比赛的基本套路:假定一个案件,分析犯罪嫌疑人、受害人的电子设备,摸清案件起因经过结果、分析嫌疑人犯罪动机、搜索嫌疑人犯罪证据。涉及的题目类型有:Windows、Linux的基本知识,系统属性

  • hyperf json-rpc剖析

    hyperf在启动阶段BootApplication会初始化JsonRpc中的TcpServer文件构造函数,而TcpServer文件继承了RpcServer的Server文件。 通过这两个文件的构造函数,将自动注入ContainerInterface、DispatcherInterface、ExceptionHandlerDispatcher、LoggerInterface 然后初始化initServerConfig、initProtocol及RpcServer的Server文件的initCoreMiddleware方法。 RpcServer的Server文件下有个createCoreMiddleware抽象方法,它的实现是在JsonRpc中的TcpServer文件中。 createCoreMiddleware方法下new了一个JsonRpc下的CoreMiddleware文件 CoreMiddleware文件继承了RpcServer下的CoreMiddleware文件,它又继承了HttpServer下的CoreMiddleware文件 在HttpServer下的CoreMiddle

  • 如何下载火狐浏览器历史版本

    http://ftp.mozilla.org/pub/firefox/releases/ http://t.zoukankan.com/yczcc-p-9032860.html

  • LintCode 38. Search a 2D Matrix II

    Writeanefficientalgorithmthatsearchesforavalueinanmxnmatrix,returntheoccurrenceofit. Thismatrixhasthefollowingproperties: Integersineachrowaresortedfromlefttoright. Integersineachcolumnaresortedfromuptobottom. Noduplicateintegersineachroworcolumn. Haveyoumetthisquestioninarealinterview?  Yes Example Considerthefollowingmatrix: [ [1,3,5,7], [2,4,7,8], [3,5,9,10] ] 复制 Giventarget= 3,return 2. Challenge O(m+n)timeandO(1)extraspace 解题思路: 从左下角往右上角找,若是小于target就往右找,若是大于target

  • 字节-LeetCode【24. 两两交换链表中的节点】

    //给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。////你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。////////示例1://////输入:head=[1,2,3,4]//输出:[2,1,4,3]//////示例2://////输入:head=[]//输出:[]//////示例3://////输入:head=[1]//输出:[1]//////////提示://////链表中节点的数目在范围[0,100]内//0<=Node.val<=100//////////进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)//RelatedTopics递归链表//?834?0复制 classSolution{ publicListNodeswapPairs(ListNodehead){ if(head==null){ returnnull; } List<ListNode>list=newArrayList<>(); while(head!=null){ list.add(head); head

  • 算法和数据结构 1 单调栈

    单调栈 扯淡 计算机科学和主流数学的区别在哪里? 计算机科学研究的对象是可数集合,是图灵机。他能够存取数据,每次进行有限步操作。图灵机的一个重要子集是下推自动机,下推自动机相较于有限状态机,区别在于多了一个栈,用来记录状态。 为什么用栈?我们知道,两个栈能模拟一个队列,两个队列也能模拟一个栈,这似乎说明两者有着某种相同的性质,单单从表面看,都不过是一种操作受限的线性表。 事实上,栈会把进入的数据反序,反两次就会变成顺序,因而两个栈模拟一个队列几乎没有任何性能损失;相反来看队列,为了做到先进后出,队列不得不以O(n)的复杂度来得到最先进入的元素。 这似乎说明栈有着比队列更为基础的性质。 单调栈和单调队列是进一步限定表内元素序关系的的线性表,跟逆序对一样,我几乎没见过哪本书详细剖析他们的性质。 反过来说,如果有哪本书详细讲到了,那么它名声却小到我都没有听说过,这实在是遗憾。 模板题 洛谷:P5788【模板】单调栈 这里记录一下简单的思路: 倒着遍历数组a: 循环,若a[i]>=stack.top()则出栈。 上一步停止时,若: stack.empty(),那么a[i]右边没有

  • 关于数据库操作参数过多的异常

    今天遇到一个略坑的异常: com.microsoft.sqlserver.jdbc.SQLServerException:传入的请求具有过多的参数。该服务器支持最多2100个参数。请减少参数的数目,然后重新发送该请求。 看到这个异常第一个反应就是改MyBatis或SqlServer的配置,后经百度,只找到了原因: https://blog.csdn.net/syy_c_j/article/details/52151402 SqlServer 对语句的条数和参数的数量都有限制,分别是1000和2100。 Mysql 对语句的长度有限制,默认是4M。 Mybatis 对动态语句没有数量上的限制   无果,只能自己debug看看是哪句sql的参数过多:因为session是openSession(ExecutorType.BATCH)的批处理执行,所以先将openSession的参数改为true(自动提交) 在一句批量插入的操作中抛出这个异常,查看sql发现用了foreach 1<!--批量插入问题件--> 2<sqlid="s

  • minlo 开源对象存储系统

    一、概念   Minio是GlusterFS创始人之一:AnandBabuPeriasamy发布新的开源项目,MinIo是一个基于Go语言的对象存储服务。它实现了大部分亚马逊S3云存储服务接口,可以看做是是S3的开源版本,客户端支持 Java,Python,Javacript,Golang语言。非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一 个对象文件可以是任意大小,从几kb到最大5T不等。区别于分布式存储系统,minio的特色在于简单、轻量级,对开发者友好,认为存储应该是一个开发问题而不是一个运维问题。 MinIo主要是在微服务系统中使用,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等。 Minio提供对象存储服务,兼容了AWSS3存储协议,用于非结构化的数据存。非结构化对象,比如图像,音、视频,日志文件,备份镜像…等等管理不方便,不定长,大小变化大、类型多,云端的访问复杂,minio就是来解决这 种场景的。非结构化的文件从数KB到5TB都能很好的支持。开源并且用Go语言开发,有web操作

相关推荐

推荐阅读