1.绿盟科技VA+PTaaS+源代码审计项目如何创下五个“第一”佳绩?
2.EasyLogger源码学习笔记(3)
3.能量潮obv指标源码
4.vue.js如何优雅的源码进行formvalidation?
5.Lua5.4 源码剖析——虚拟机2 之 闭包与UpValue
绿盟科技VA+PTaaS+源代码审计项目如何创下五个“第一”佳绩?
国际安全服务的新里程碑:绿盟科技新加坡案例五大创新 绿盟科技近期在与新加坡一家大型金融服务业巨头的合作项目中,以五个前所未有的分析“第一”成就,再次刷新了国际安全服务的源码行业标准。这一标杆案例不仅展现了绿盟科技网络安全出海的分析新篇章,也预示着公司在全球市场上的源码领先地位。 五个创新点绿盟科技在新加坡乃至整个亚太地区的分析秒赞彩虹源码金融服务市场,成功突破性地赢得了首个非中资的源码本地金融行业客户的信任,成为首个长期订阅式安全评估服务的分析提供者,合同长达三年。源码
该项目创新性地将源代码审计纳入服务范围,分析成为VA、源码PTaaS和源代码审计的分析综合安全解决方案的先驱,为金融行业提供全方位保护。源码
此项目标志着绿盟科技在全球范围内实现了直销模式的分析突破,NSFOCUS全权负责了首个直销金融客户,源码彰显了公司的专业实力与客户服务承诺。
该项目的综合安全评估方案不仅适用于金融行业,还具有高度的复用价值,适用于应用程序开发至发布和后期的定期测试,体现了绿盟科技的前瞻性和灵活性。
作为金融行业典范,该项目不仅助力绿盟科技开拓更多海外市场,还积累了宝贵的行业洞见,为其他垂直领域提供了定制化的解决方案。
绿盟科技自年起,积极布局全球市场,先后在硅谷、东京、伦敦、新加坡和圣保罗等地设立了海外机构,致力于打造中国网络安全的全球品牌。未来,绿盟科技将以开放和热情的拍拍赚源码态度,持续创新,为全球客户的网络安全保驾护航。 绿盟科技实力认证 绿盟科技的卓越服务已获得CREST漏洞评估和渗透测试的权威认证,展示了公司在技术实力上的坚实基础。 绿盟科技全面的安全服务绿盟科技VA服务采用自主研发的先进工具,覆盖传统IT设备和新兴资产,提供一站式漏洞管理体验。
PT服务则采用黑盒、白盒和灰盒测试方法,广泛涵盖各类系统,包括云计算、物联网等,确保客户体系的全面防护。
通过绿盟科技的专业团队和创新技术,我们致力于提供最前沿的威胁情报,帮助客户提升安全防护,增强安全意识,确保业务的稳定运营。EasyLogger源码学习笔记(3)
在EasyLogger源码学习中,枚举变量的使用十分直观。定义枚举类型后,可以直接在代码中操作,提升可读性和代码清晰度。
va_list是一个字符指针,用于在可变参数表中导航和取值。首先,你需要定义一个va_list类型的变量ap,然后通过va_start函数初始化,ap指向变参表的第一个参数,后续的参数获取通过va_arg完成,它会根据指定类型从ap中提取并返回值,同时更新ap的欢乐推源码位置。使用完毕后,记得调用va_end来释放ap,以确保程序的健壮性。
对于字符串处理,vsnprintf提供了格式化输出功能,它能在指定长度内限制输出,避免溢出。例如,snprintf函数可以格式化字符串并存储在给定的缓冲区中,确保字符数不超过预设的大小。
在查找字符串时,strstr函数用于在haystack中查找needle首次出现的位置,但不包括结束符。在函数定义中,诸如va_start(args, format)这样的语句用于处理可变参数。
在elog_output函数中,tag_sapce的初始化出现疑问,原因在于需要保证标签对齐,通过memset函数在前面填充空格。这里,用'ELOG_FILTER_TAG_MAX_LEN / 2 - tag_len'的长度来确保足够的空间,而不是'ELOG_FILTER_TAG_MAX_LEN + 1',因为这样可以避免不必要的填充。
在elog_find_tag函数中,返回值的问题在于它实际返回了日志的tag及其后续信息,而不是仅限于tag本身。因此,需要检查并修正这个逻辑,以确保返回正确的内容。
能量潮obv指标源码
OBV指标又称为能量潮,也叫成交量净额指标,是传奇源码界面通过累计每日的需求量和供给量并予以数字化,制成趋势线,然后配合证券价格趋势图,从价格变动与成交量增减的关系上来推测市场气氛的一种技术指标。由于在市场中,投资者对股价未来趋势的分歧会通过成交量的变化反映出来,具体表现为分歧越大,交易量越多。OBV的理论基础是市场价格的变动必须有成交量配合,股价上升时成交量必须增加,但并不一定要求成交量的变化与股价的变化成正比。
obv指标使用
据悉,能量潮obv指标源码是N:=;M:=;
VA:=IF(CLOSE>REF(CLOSE,1),VOL,-VOL);
OBV:SUM(IF(CLOSE=REF(CLOSE,1),0,VA),0);
OBV1:MA(OBV,N);
OBV2:MA(OBV,M);
买点1:CROSS(OBV,OBV2)AND SUM(OBY)<SUM(OBV2,),COLORGREEN,NODRAW;
DRAWICON(买点1,0BV2,);
买点2:CROSS(OBV1,OBV2),COLORMAGENTA,NODRAW;
DRAWICON(买点2,0BV2,);
至于obv指标使用要点,trinitycore源码分析OBV指标的应用原则重点在对OBV线形态的变化上。在操作上,一般是把OBV线与股价线进行印证来分析判断。在证券市场中,价格、成交量、时间、空间是进行技术分析的四大要素,由此,我们应该清楚OBV指标作为成交量的指标,不能单独使用,必须与价格曲线同时使用才能发挥作用。
vue.js如何优雅的进行formvalidation?
在面对Vue.js中的表单验证需求时,许多人可能会遇到插件使用上的困扰。一些现成的验证插件虽然提供了基本的功能,但往往因为过于通用,导致在实际应用中不够灵活,有时还会显得有些冗余。
因此,我开发了va.js插件,旨在为Vue.js项目提供一个轻量且高度定制化的表单验证解决方案。va.js的设计理念是,通过简洁的API,让用户能够轻松地针对不同场景进行表单验证逻辑的编写。
在va.js的开发过程中,我编写了一篇博文,详细记录了从需求分析、设计实现到最终优化的全过程。在这个过程中,我深入探讨了表单验证的本质,并结合Vue.js的特点,设计了一套灵活且高效的验证机制。
个人认为,表单验证是一个高度定制化的功能。市面上的插件虽然丰富,但往往难以完全满足特定项目的个性化需求。因此,我分享了va.js的开发思路和源码,旨在鼓励开发者根据自己的项目需求,借鉴思路自己动手编写插件。这不仅能够更好地适应项目需求,还能在实践中提升对Vue.js和表单验证的理解。
总之,通过va.js插件的开发与分享,希望能够为Vue.js开发者提供一个更为灵活、定制化的表单验证解决方案,帮助大家在项目中更优雅地处理表单验证问题。
Lua5.4 源码剖析——虚拟机2 之 闭包与UpValue
故事将由我们拥有了一段 Lua 代码开始,我们先用 Lua 语言写一段简单的打印一加一计算结果的 Lua 代码,并把代码保存在 luatest.lua 文件中:
可执行的一个 Lua 文件或者一份单独的文本形式 Lua 代码,在 Lua 源码中叫做 "Chunk"。无论我们通过什么形式去执行,或者用什么编辑器去执行,最终为了先载入这段 Lua 的 Chunk 到内存中,无外乎会归结到以下两种方式:1)Lua 文件的载入:require 函数 或 loadfile 函数;2)Lua 文本代码块的载入:load 函数;这两种方式最终都会来到下面源码《lparse.c》luaY_parser 函数。该函数是解析器的入口函数,负责完成代码解析工作,最终会创建并返回一个 Lua 闭包(LClosure),见下图的红框部分:
另外,上图中间有一行代码最终会调用到 statement 函数,statement 函数是 Chunk 解析的核心函数,它会一个一个字符地处理我们编写的 Lua 代码,完成词法分析和语法分析工作,想要了解字符处理整个状态流程的可以自行研读该部分源码,见源码《lparse.c》statement 函数部分代码:
完成了解析工作之后,luaY_parser 函数会把解析的所有成果放到 Lua 闭包(LClosure)对象之中,这些存储的内容能保证后续执行器能正常执行 Lua 闭包对应的代码。
Lua 闭包由 Proto(也叫函数原型)与 UpValue(也叫上值)构成,见源码《lobject.h》LClosure 定义,我们下面将进行详细的讲解:
UpValue 是 Lua 闭包数据相关的,在 Lua 的函数调用中,根据数据的作用范围可以把数据分为两种类型:1)内部数据:函数内部自己定义的数据,或者通过函数参数的形式传入的数据(在 Lua 中通过参数传入的数据本质上也是先赋值给一个局部变量);2)外部数据:在函数的更外层进行定义,脱离了该函数后仍然有效的数据;外部数据在我们的 Lua 闭包中就是 UpValue,也叫上值。
既然 Lua 支持函数嵌套,也知道了 UpValue 本质就是上层函数的内部数据。那么 UpValue 有必要存储于 Lua 闭包(LClosure)结构体当中吗?是为了性能考虑而做的一层指针引用缓存吗?回答:并不是基于性能的考虑,因为在实际的 Lua 运用场景中,函数嵌套的层数通常来说不会太多,个别函数多一层的查询访问判断不会带来过多的性能开销。需要在闭包当中存储 UpValue 主要原因是因为内存。Lua 作为一门精致小巧的脚本语言,设计初衷不希望占用过多的系统内存,它会尽量及时地清理内存中用不到的对象。在嵌套函数中,内层函数如果仍然有被引用处于有效状态,而外层函数已经没有被引用了已经无效了,此时 Lua 支持在保留内层函数的情况下,对外层函数进行清除,从而可以清理掉外层函数引用的非当前函数 UpValue 用途以外的大量数据内存。
尽管外层函数被清除了,Lua 仍然可以保持内层函数用到的 UpValue 值的有效性。UpValue 如何能继续保持有效,我们在之前的基础教程《基本数据类型 之 Function》里面学习过,主要是因为 UpValue 有 open 与 close 两种状态,当外层函数被清除的时候,UpValue 会有一个由 open 状态切换到 close 状态的过程,会对数据进行一定的处理,感兴趣的同学可以回到前面复习一下。
UpValue 有效性例子
接下来我们举一个代码例子与一个图例,表现一下 UpValue 在退出外层函数后仍然生效的情况,看一下可以做什么样的功能需求,加深一下印象,请看代码与注释:
上述代码在执行 OutFunc 函数后,外层的 globalFunc 函数变量完成了赋值,每次对它进行调用,都将可以对它引用的 UpValue 值即 outUpValue 变量进行正常加 1。
函数的内部数据属于函数自身的内容,外部其它函数无法通过直接的方式访问其它函数的内部数据。函数自身的东西会存在于 LClosure 结构体的 Proto*p 字段中。Proto 全称 "Function Prototypes",通常也可以叫做 "函数原型",我们来看一下它的定义,见源码《lobject.h》Proto 结构体:
结构体字段比较多,我们先不细看,后面用到哪个字段会再进行补充说明。函数的内部数据分为常量与变量(即函数局部变量),分别对应上图的如下字段:
1)常量:TValue* k 为指针指向常量数组;int sizek 为函数内部定义的常量个数,也即常量数组 k 的元素个数。
2)局部变量:LocVar* locvars 为指针指向局部变量数组;int sizelocvars 为函数定义的局部变量个数,也即局部变量数组 locvars 的元素个数。
UpValue 的描述信息会存储在 Proto 结构体中的 Upvaldesc* upvalues 字段,解析器解析 Lua 代码的时候会生成这个 UpValue 描述信息,并用于生成指令,而执行器运行的时候可以通过该描述信息方便快速地构建出真正的 UpValue 数组。
至此,我们知道了函数拥有 UpValue,有常量,有局部变量。外部数据 UpValue 也讲完,内部数据也讲完。接下来,我们开始学习函数运行的逻辑指令相关内容。
函数逻辑指令存储于函数原型 Proto 结构体中,这些函数逻辑是由一行行的 Lua 代码构成的,代码会被解析器翻译成 Lua 虚拟机能识别的指令,我们把这些指令称为 "OpCode",也叫 "操作码"。Proto 结构体存储 OpCode 使用的是下图中红框部分字段,见源码《lobject.h》Proto 结构体:
至此,我们可以简单提前说一下 Lua 虚拟机的功能了,本质上来看,Lua 虚拟机的工作,就是为当前函数(或者当前一段 OpCode 数组)准备好数据,然后有序执行 OpCode 指令。
对 OpCode 有了一定的认识了,接下来我们要补充一个 OpCode 相关的 Lua 闭包相关的内容,就是 Lua 闭包的运行环境。
一个 Lua 文件在载入的时候会先创建出一个最顶层(Top level)的 Lua 闭包,该闭包默认带有一个 UpValue,这个 UpValue 的变量名为 "_ENV",它指向 Lua 虚拟机的全局变量表,即_G 表,可以理解为_G 表即为当前 Lua 文件中代码的运行环境 (env)。事实上,每一个 Lua 闭包它们第一个 UpValue 值都是_ENV。
ENV 的定义在我们之前提到的解析器相关函数 mainfunc 中,见源码《lparser.c》:
如果想要设置这个载入后的初始运行环境不使用默认的 _G 表,除了直接在该文件代码中重新赋值_ENV 变量这种粗暴且不推荐的方式以外,通常是通过我们前面提到的加载 Lua 文件函数或加载 Lua 字符串代码函数传入 env 参数(Table 类型),就可以用自定义的 Table 作为当前 Lua 闭包的全局变量环境了,env 参数为上面两个函数的最末尾一个参数,'[' 与 ']' 字符中的内容表示参数可选,函数的定义摘自 Lua5.4 官网文档:
所以我们可以在 Lua 代码通过 _ENV 访问当前环境:
在 Lua 的旧版本中,变量的查询最多会分为 3 步:1)先从函数局部变量中进行查找;2)找不到的话就从 UpValue 中查找;3)还找不到就从全局环境默认 _G 表查找。而在 Lua5.4 中,把 UpValue 与全局 _G 表的查询统一为 UpValue 查询,并把一些操作判断提前到了解析器解析阶段进行,例如函数内部使用的某个 UpVaue 变量在代码解析的时候就可以通过 UpValue 描述信息知道存储于 Lua 闭包 upvals 数组的哪个下标位置,在执行器运行的时候只需要直接在数组拿取对应下标的这个 UpValue 数据即可。
从 OpCode 的层面来看,Lua 除了支持通过一个 UpValue 数组下标访问一个 UpValue 变量,在把 _G 表合并到 UpValue 之后,Lua 为此实现了通过一个字符串 key 值从某个 Table 类型的 UpValue 中查询变量的操作。
至此,我们了解了 Lua 闭包的结构与运行环境,以及 OpCode 的基本概念。接下来,我们将深入学习 OpCode,掌握 OpCode 就掌握了整个 Lua 虚拟机数据与逻辑的流向。