当前位置: 首页 > news >正文

风控系统之普通规则条件,使用LiteFlow实现

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


提要

参考:智能风控筑基手册:全面了解风控决策引擎

前面有可配置输入参数的接口如何设计和风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法两篇文章,分别提出:

1、风控系统服务动态选择,根据配置处理输入参数,转换为系统参数

2、使用Rediszset结构完成简单的指标计算(特征提取)

他们都是一次风控决策流程的一部分,当然完成的风控系统,比较复杂,涉及的功能模块更多,以下仅仅是我的简单梳理。

如上,服务选择和入参处理可配置输入参数的接口如何设计是这篇文章讨论的内容,风控系统指标计算/特征提取分析与实现01,Redis、Zset、模版方法讨论的是规则集内普通指标计算。

本篇文章讨论通过LiteFlow这款规则引擎框架实现风控系统的普通规则条件。

规则条件

规则条件是什么?

我将规则划分如下(未来会逐渐完善),规则条件是规则的一部分。

需要注意的是规则条件应该都是灵活可配置,并不是上面这样并列,可以任意复杂的组合。

为什么只是规则条件灵活可配置呢?操作难道不是吗?

可以,但没必要。

如下,是规则(最近24小时转账次数>=10次)示例。

观察可知,其实右半边可以作为一个新的规则独立出去的,所以说,规则操没必要和规则条件混在一起。

规则引擎LiteFlow

规则引擎是为了解耦,编排而生。

LiteFlow官网:🍤LiteFlow简介 | LiteFlow

LiteFlow官方文档写的已经非常清晰,花费不到一上午的时间就可以了完全了解了,所以我也不多说些什么了。

为什么需要规则引擎

因为独立组件+灵活编排的需求和规则引擎不谋而合。

设计与实现

组件

组件是规则引擎中最重要的一部分,他是所有规则表达式最终业务的实现。

不使用规则引擎时

在不使用规则引擎时,针对前面普通规则条件,可以设计如下的结构。

一条规则关联一组规则条件,规则条件又最多分为两级,一级指明了二级规则条件“与或非”关系,二级是具体的规则条件。具体的规则条件关键字段是:系统字段(property)、字段类型(property_data_type)、操作(operator)、希望的值(value)。

有了如下的结构该怎么使用也很清晰了

1、查规则

2、查规则条件组

3、根据父条件,确定子条件关系

4、代码解析操作类型,返回条件结果

iduuidrule_uuidparent_uuidlogic_operatorpropertyproperty_data_typeoperatorvalue
1270a8dc859a940008539f270ae596ad686cbd8adff914f67b576f0046b5b337d
2bfbe53d6b5ae4895aef1c4c453e3e16e86cbd8adff914f67b576f0046b5b337d270a8dc859a940008539f270ae596ad6&&
3cf46348d533a48db8f027e4db4f6bb7a86cbd8adff914f67b576f0046b5b337dbfbe53d6b5ae4895aef1c4c453e3e16eS_N_EVENTHOURINT>=22
4f759541121664847bbc7d944ad1a553f86cbd8adff914f67b576f0046b5b337dbfbe53d6b5ae4895aef1c4c453e3e16eS_N_EVENTHOURINT<=24
5ec1e79cc18734fa4ab3daa51fe8597c886cbd8adff914f67b576f0046b5b337dbfbe53d6b5ae4895aef1c4c453e3e16eC_S_FINANCIALCLIENTSSTRING==
65a3b35c7d1d04466b16ae2da64383e2186cbd8adff914f67b576f0046b5b337d270a8dc859a940008539f270ae596ad6&&
71bed61e83d7e4ad0a813f2fa3bd7b8a986cbd8adff914f67b576f0046b5b337d5a3b35c7d1d04466b16ae2da64383e21S_N_EVENTHOURINT>=0
89446d7a9ec284c1ab52c600ac1cfad2686cbd8adff914f67b576f0046b5b337d5a3b35c7d1d04466b16ae2da64383e21S_N_EVENTHOURINT<6
9690e668a2e7c445c80b04ef5e30d3fa486cbd8adff914f67b576f0046b5b337d5a3b35c7d1d04466b16ae2da64383e21C_S_FINANCIALCLIENTSSTRING==

使用规则引擎后

首先我们定义组件可以完成字段的比较并返回true/false

那么上面作为组件的只有id为3、4、5、7、8、9,然后将这些编排成如下表达式即可。

这里简单介绍一些IF表达式,一共三个参数,第一个为条件,后面两个为true执行,false执行,跟三元表达式一样。

IF(OR(AND(3,4,5),AND(7,8,9)),x,y)

是不是很简单,看着确实,但有一个设计必须要搞通,也就是下面我要说的数据上下文。

数据上下文

🍄说明 | LiteFlow

数据上下文这个概念在LiteFlow框架中非常重要,你所有的业务数据都是放在数据上下文中。

要做到可编排,一定是消除每个组件差异性的。如果每个组件出参入参都不一致,那就没法编排了。

LiteFlow对此有独特的设计理念,平时我们写瀑布流的程序时,A调用B,那A一定要把B所需要的参数传递给B,而在LiteFlow框架体系中,每个组件的定义中是不需要接受参数的,也无任何返回的。

每个组件只需要从数据上下文中获取自己关心的数据即可,而不用关心此数据是由谁提供的,同样的,每个组件也只要把自己执行所产生的结果数据放到数据上下文中即可,也不用关心此数据到底是提供给谁用的。这样一来,就从数据层面一定程度的解耦了。从而达到可编排的目的。关于这个理念,也在LiteFlow简介中的设计原则有提到过,给了一个形象的例子,大家可以再去看看。

一旦在数据上下文中放入数据,整个链路中的任一节点都是可以取到的。

我简单说明一下。

如下,表示瀑布流程,从开始到结束,每步调用都需要将数据传递给下一步调用者,完成整个流程。

而对于LiteFlow,更像是下面这样,整个流程存在这样的数据上下文,每个组件只需要去数据上下文中取自己关心的数据,结果也是一样,放进数据上下文即可。

此模式下,要非常注重数据上下文的管理,数据隔离和共享要非常注意。

相同组件数据问题

对于规则条件组件的问题在于:每个规则里的条件非常多,组件该怎么获取当前组件参数(如:appName==Phone)。如IF(OR(AND(3,4,5),AND(7,8,9)),x,y)此表达式转换为我们使用的规则表达式应该是这样的IF(OR(AND(ruleConditionIF,ruleConditionIF,ruleConditionIF),AND(ruleConditionIF,ruleConditionIF,ruleConditionIF)),x,y)ruleConditionIF为规则条件组件。一个表达式中有多个相同的组件意味着他们需要不同的处理,那么数据怎么获取?

LiteFlow提供了三种不同方式:

1、🍉组件参数 | LiteFlow,定义EL表达式时声明数据并传入组件

2、🍍组件标签 | LiteFlow,定义组件tag区别组件

3、🍕私有投递 | LiteFlow,用于私有独有数据传递

下面使用方式二(组件标签)来实现普通条件组件。

表结构与数据

chain

create table de_chain
(id               bigint auto_increment comment '主键'primary key,application_name varchar(32)                 default ''                not null comment '应用名',chain_name       varchar(64)                 default ''                not null comment 'chain名',el_data          text                                                  not null comment 'el数据',enable           bit                         default b'0'              not null comment 'chain状态',description      varchar(64) charset utf8mb4 default ''                null comment '描述',creator          varchar(64) charset utf8mb4 default ''                null comment '创建者',create_time      datetime                    default CURRENT_TIMESTAMP not null comment '创建时间',updater          varchar(64) charset utf8mb4 default ''                null comment '更新者',update_time      datetime                    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',deleted          bit                         default b'0'              not null comment '是否删除',constraint uk_codeunique (chain_name)
)comment 'chain表';INSERT INTO coolGuard.de_chain (id, application_name, chain_name, el_data, enable, description, creator, create_time, updater, update_time, deleted) VALUES (1, 'coolGuard', 'mainChain', 'THEN(chain1);', true, '', '', '2024-04-04 22:35:36', '', '2024-04-04 22:40:30', false);
INSERT INTO coolGuard.de_chain (id, application_name, chain_name, el_data, enable, description, creator, create_time, updater, update_time, deleted) VALUES (2, 'coolGuard', 'chain1', 'IF(OR(AND(ruleConditionIf.tag("1"),ruleConditionIf.tag("2")),ruleConditionIf.tag("3")),orderMode,worstMode);', true, '', '', '2024-04-04 22:31:16', '', '2024-04-05 13:25:49', false);

规则条件表

create table de_rule_condition
(id           bigint auto_increment comment '主键'primary key,chain_name   varchar(64)                 default ''                not null comment 'chain名',field_name   varchar(32)                 default ''                not null comment '字段名',operate_type int                         default 0                 not null comment '操作类型',expect_value varchar(32)                 default ''                not null comment '期望值',description  varchar(64) charset utf8mb4 default ''                null comment '描述',creator      varchar(64) charset utf8mb4 default ''                null comment '创建者',create_time  datetime                    default CURRENT_TIMESTAMP not null comment '创建时间',updater      varchar(64) charset utf8mb4 default ''                null comment '更新者',update_time  datetime                    default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',deleted      bit                         default b'0'              not null comment '是否删除'
)comment '规则条件表';INSERT INTO coolGuard.de_rule_condition (id, chain_name, field_name, operate_type, expect_value, description, creator, create_time, updater, update_time, deleted) VALUES (1, 'chain3', 'appName', 2, 'Phone', '', '', '2024-04-04 22:32:25', '', '2024-04-05 12:24:03', false);
INSERT INTO coolGuard.de_rule_condition (id, chain_name, field_name, operate_type, expect_value, description, creator, create_time, updater, update_time, deleted) VALUES (2, 'chain4', 'customerId', 2, '123456', '', '', '2024-04-05 12:24:03', '', '2024-04-05 12:24:03', false);
INSERT INTO coolGuard.de_rule_condition (id, chain_name, field_name, operate_type, expect_value, description, creator, create_time, updater, update_time, deleted) VALUES (3, 'chain5', 'money', 5, '15', '', '', '2024-04-05 12:24:03', '', '2024-04-05 12:24:03', false);

依赖

<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>${liteflow.version}</version>
</dependency>
<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-rule-sql</artifactId><version>${liteflow.version}</version>
</dependency>
<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-script-groovy</artifactId><version>${liteflow.version}</version>
</dependency>

配置

liteflow:rule-source-ext-data-map:url: jdbc:mysql://localhost:3306/coolGuard?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=truedriverClassName: com.mysql.cj.jdbc.Driverusername: wnhyangpassword: 123456applicationName: ${spring.application.name}#是否开启SQL日志sqlLogEnabled: true#是否开启SQL数据轮询自动刷新机制 默认不开启pollingEnabled: truepollingIntervalSeconds: 60pollingStartSeconds: 60#以下是chain表的配置,这个一定得有chainTableName: de_chainchainApplicationNameField: application_namechainNameField: chain_nameelDataField: el_datachainEnableField: enable#以下是script表的配置,如果你没使用到脚本,下面可以不配置#    scriptTableName: script
#    scriptApplicationNameField: application_name
#    scriptIdField: script_id
#    scriptNameField: script_name
#    scriptDataField: script_data
#    scriptTypeField: script_type
#    scriptLanguageField: script_language
#    scriptEnableField: enable

自定义数据上下文

可以改善,先这样贴出来。

FieldContext表示经过入参处理后的所有字段集合,后面的规则/指标都会用到的。

/*** @author wnhyang* @date 2024/4/3**/
public class FieldContext {private final Map<String, String> stringFields = new ConcurrentHashMap<>();private final Map<String, Integer> numberFields = new ConcurrentHashMap<>();private final Map<String, Boolean> booleanFields = new ConcurrentHashMap<>();private final Map<String, String> enumFields = new ConcurrentHashMap<>();private final Map<String, LocalDateTime> dateFields = new ConcurrentHashMap<>();private final Map<String, BigDecimal> floatFields = new ConcurrentHashMap<>();public void setStringData(String key, String value) {stringFields.put(key, value);}public String getStringData(String key) {return stringFields.get(key);}public boolean hasStringData(String key) {return stringFields.containsKey(key);}}

普通规则条件组件

当前还不是很完善,TODO已有说明。

对了,我使用的jdk17,所有switch表达式是下面这样,与jdk8有点区别。

/*** @author wnhyang* @date 2024/4/4**/
@Slf4j
@LiteflowComponent
@RequiredArgsConstructor
public class RuleConditionIf extends NodeIfComponent {private final RuleConditionMapper ruleConditionMapper;@Overridepublic boolean processIf() throws Exception {// 获取当前chainNameString tag = this.getTag();log.info("当前tag:{}", tag);// 获取当前chainName对应的条件RuleCondition ruleCondition = ruleConditionMapper.selectById(tag);log.info("当前chainName对应的条件:{}", ruleCondition);// 获取上下文FieldContext fieldContext = this.getContextBean(FieldContext.class);// 获取条件字段String fieldName = ruleCondition.getFieldName();log.info("条件字段:{}", fieldName);// 获取字段值// TODO 支持String、Integer、BigDecimal、Boolean等String stringData = fieldContext.getStringData(fieldName);log.info("字段值:{}", stringData);OperateType byType = OperateType.getByType(ruleCondition.getOperateType());log.info("操作类型:{}", byType);// TODO 当前是常量,之后要考虑变量String expectValue = ruleCondition.getExpectValue();log.info("期望值值:{}", expectValue);return switch (Objects.requireNonNull(byType)) {case NULL:yield StrUtil.isBlank(stringData);case NOT_NULL:yield !StrUtil.isBlank(stringData);case EQ:yield stringData.equals(expectValue);case NOT_EQ:yield !stringData.equals(expectValue);case CONTAINS:yield stringData.contains(expectValue);case NOT_CONTAINS:yield !stringData.contains(expectValue);case GT:yield Integer.parseInt(stringData) > Integer.parseInt(expectValue);case GTE:yield Integer.parseInt(stringData) >= Integer.parseInt(expectValue);case LT, LTE:yield false;case IN:String[] split1 = expectValue.split(",");for (String s : split1) {if (stringData.equals(s)) {yield true;}}case NOT_IN:String[] split2 = expectValue.split(",");for (String s : split2) {if (stringData.equals(s)) {yield false;}}case PREFIX:yield stringData.startsWith(expectValue);case NOT_PREFIX:yield !stringData.startsWith(expectValue);case SUFFIX:yield stringData.endsWith(expectValue);case NOT_SUFFIX:yield !stringData.endsWith(expectValue);};}
}

操作类型枚举

/*** @author wnhyang* @date 2024/4/3**/
@AllArgsConstructor
@Getter
public enum OperateType {NULL(0),NOT_NULL(1),EQ(2),NOT_EQ(3),GT(4),GTE(5),LT(6),LTE(7),IN(8),NOT_IN(9),CONTAINS(10),NOT_CONTAINS(11),PREFIX(12),NOT_PREFIX(13),SUFFIX(14),NOT_SUFFIX(15);private final Integer type;public static OperateType getByType(Integer type) {for (OperateType operateType : OperateType.values()) {if (operateType.getType().equals(type)) {return operateType;}}return null;}
}

测试

@Slf4j
@RestController
@RequestMapping("/field")
@RequiredArgsConstructor
public class FieldController {private final FieldService fieldService;private final FlowExecutor flowExecutor;@GetMapping("/test")public CommonResult<String> test(@RequestParam("appName") String appName, @RequestParam("customerId") String customerId, @RequestParam("money") String money) {FieldContext fieldContext = new FieldContext();fieldContext.setStringData("appName", appName);fieldContext.setStringData("customerId", customerId);fieldContext.setStringData("money", money);LiteflowResponse main1 = flowExecutor.execute2Resp("mainChain", null, fieldContext);log.info(String.valueOf(main1));return success("test");}
}

结果

mainChainEL表达式为THEN(chain1);chain1为子流程

IF(OR(AND(ruleConditionIf.tag("1"),ruleConditionIf.tag("2")),ruleConditionIf.tag("3")),orderMode,worstMode);ruleConditionIf为上面的规则条件组件。

最终应该是这样的:THEN(IF(OR(AND(ruleConditionIf.tag("1"),ruleConditionIf.tag("2")),ruleConditionIf.tag("3")),orderMode,worstMode));

参数为:appName:Phone,customerId:235246,money:35

此时执行流程为:ruleConditionIf<17>==>ruleConditionIf<2>==>ruleConditionIf<2>==>orderMode<0>

参数为:appName:Phone,customerId:235246,money:3

此时执行流程为:ruleConditionIf<42>==>ruleConditionIf<2>==>ruleConditionIf<1>==>worstMode<0>

总结

LiteFlow可玩性还是很强的,未来我还会继续完善打造自己设计并实现的风控系统。冲冲冲!!!

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

相关文章:

风控系统之普通规则条件,使用LiteFlow实现

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 提要 参考&#xff1a;智能风控筑基手册&#xff1a;全面了解风控决策引擎 前面有可配置输入参数的接…...

在一套Dockerfile中完成编译和运行环境部署

大纲 解释型语言编译环境解释环境编译型语言编译环境运行环境 方法编译环境安装系统安装编译依赖下载代码特殊处理&#xff08;可以忽略&#xff09;编译准备&#xff08;可以忽略&#xff09;编译打包依赖&#xff08;编译结果&#xff09; 运行环境安装操作系统安装运行时依赖…...

ubuntu系统里克隆github代码到本地,提示fatal: unable to connect to github.com的解决方案

打开命令行终端生成一个新的SSH密钥对。如果你还没有SSH密钥或者想创建一个新的&#xff0c;可以使用以下命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com"当系统提示你“Enter a file in which to save the key”&#xff0c;时&#xff0c;…...

常见docker使用命令

#搭建镜像 “”" sudo docker build -t es_refresh:V1.20230303 . “”" #启动容器 “”" docker run -d --namepara_classify -v /etc/localtime:/etc/localtime -v /data/chenhw/multi_label_classification:/edb2vec -p 8066:8066 --gpus ‘“device0”’…...

Ubuntu系统中设置中文输入法的教程

1、Ubuntu介绍&#xff1a; &#xff08;https://cn.ubuntu.com/&#xff09; &#xff08;Ubuntu | 全球领先的用于个人电脑、平板及手机的操作系统&#xff09; Ubuntu是一款基于Debian的开源Linux操作系统&#xff0c;由英国Canonical公司赞助支持的全球性社区共同开发。U…...

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过&#xff0c;burp修改content-type绕过&#xff0c;常见的文件上传存放目录名 题目就叫upload&#xff0c;打开靶机 直接上传一个图片格式的一句话木马&#xff0c;返回如下&#xff1a; 提交练习5和9中的两种可以执行图片格式php代码的文件&#xff0c;修改con…...

3.6k star, 免费开源跨平台的数据库管理工具 dbgate

3.6k star, 免费开源跨平台的数据库管理工具 dbgate 分类 开源分享 项目名: dbgate -- 免费开源跨平台的数据库管理工具 Github 开源地址&#xff1a; GitHub - dbgate/dbgate: Database manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under…...

2024.3.2力扣每日一题——受限条件下可到达节点的数目

2024.3.2 题目来源我的题解方法一 深度优先搜索方法二 并查集 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2368 我的题解 方法一 深度优先搜索 使用深度优先搜索实现&#xff0c;在搜索过程中根据restricted进行截停。 时间复杂度&#xff1a;O(n) 空间复杂度&#…...

在云端遇见雨云:一位服务器寻觅者的指南

引言&#xff1a;寻觅一座云端归宿 当我踏入数字世界的边缘&#xff0c;带着对网络的探索与期待&#xff0c;我迫切需要一座安全可靠的数字栖息地。云计算技术正如一场魔法般的变革&#xff0c;而在这片广袤的云端中&#xff0c;雨云就像是一位友善的向导&#xff0c;引领我穿越…...

Pygame基础10-物理模拟

PyMunk PyMunk是一个模拟物理的库。 注意&#xff0c;PyMunk只是进行物理模拟&#xff0c;不包含可视化的功能。如果需要可视化&#xff0c;可使用pygame等库。 可用pip安装pymunk pip install pymunk pymunk中的概念&#xff1a; space&#xff1a; 物理空间。 包含gravity 模…...

蓝桥杯 --- 日期问题模板

目录 1.如何判断闰年 2.如何遍历当前年份的每一天 3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。 4.精确到具体周几到周几的问题分析 5.如何直接通过一层for循环枚举年月日 习题&#xff1a; 蓝桥杯竞赛特别喜欢考日期问题&#xff0c;今天给大家分享一下…...

Java 处理Mysql获取树形的数据

Mysql数据&#xff1a; 代码如下&#xff1a; Entity&#xff1a; Data Accessors(chain true) public class Region {private BigInteger id;//名称private String name;//父idprivate BigInteger parentId;private List<Region> children;private Integer createTim…...

前端三剑客 —— CSS ( 坐标问题 、定位问题和图片居中 )

前期内容回顾&#xff1a; 1.常见样式 text-shadow x轴 y轴 阴影的模糊程度 阴影的颜色 box-shadow border-radio 实现圆角 margin 内边距 padding 外边距 background 2.特殊样式 媒体查询&#xff1a;media 自定义字体&#xff1a;font-face { font-family:自定义名称&#…...

向量数据库 | AI时代的航道灯塔

向量数据库 | AI时代的航道灯塔 什么是向量检索服务拍照搜商品 你使用过向量数据库吗&#xff1f;使用体验&#xff1f;为什么向量数据库能借由大模型引起众多关注向量数据库在当前AI热潮中是昙花一现&#xff0c;还是未来AI时代的航道灯塔&#xff1f; 今天的话题主要是讨论向…...

Linux中的conntrack命令深入解析

在Linux网络管理和监控领域&#xff0c;conntrack命令是一个强大的工具&#xff0c;它提供了对netfilter连接跟踪系统的直接访问&#x1f50d;。这篇文章将深入探讨conntrack的由来、底层原理、参数意义&#xff0c;以及其常见用法&#xff0c;并对返回结果的每个字段进行详细解…...

反截屏控制技术如何防止信息通过手机拍照泄漏?

反截屏控制技术为企业数据安全提供了重要的防护措施。通过以下几点&#xff0c;有效阻止了信息通过拍照等方式的泄漏&#xff1a; 反截屏控制开启&#xff0c;用户启动截屏操作时&#xff0c;允许非涉密内容截屏操作&#xff0c;但所有涉密内容窗口会自动隐藏&#xff0c;防止涉…...

0.k8s简介

目录 k8s是什么 k8s不是什么 云原生 微服务 整体式架构与微服务架构 微服务的特性 微服务的优势 k8s是什么 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快…...

VScode 集成终端设置默认打开当前文件夹 mac系统

一.快捷键设置 搜索 openInIntegratedTerminal 如图&#xff1a; 二.设置cmd 默认打开位置 点击设置 搜索 ntegrated:cwd 如下图&#xff1a; 三.查看ip 快捷指令&#xff1a; ipconfig getifaddr en0...

HDLbits 刷题 -- Alwaysblock2

学习&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*)Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but…...

一、Docker部署GitLab(详细步骤)

Docker部署GitLab&#xff08;详细步骤&#xff09; 一、拉取镜像二、启动容器三、修改配置四、修改密码五、浏览器访问 一、拉取镜像 docker安装教程&#xff1a;https://qingsi.blog.csdn.net/article/details/131270071 docker pull gitlab/gitlab-ce:latest二、启动容器 …...

Vue3 Ajax(axios)

Vue 版本推荐使用 axios 来完成 ajax 请求。 安装方法 使用 cdn: <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 使用 npm: $ npm install axios GET 方法 我们可以简单的读取 JSON 数据&#xff1a; const app {data() {r…...

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…...

eBay买家号注册下单容易死号?是什么原因导致?

随着电子商务的迅猛发展&#xff0c;跨境电商平台eBay日益成为众多消费者和商家的首选。然而&#xff0c;自去年下半年以来&#xff0c;eBay推出的新规则给买家号的注册带来了前所未有的挑战。许多新用户反映&#xff0c;在注册eBay买家号后&#xff0c;往往遭遇刚注册就被冻结…...

【Linux】-进程知识铺垫①计算机硬件的组织:冯诺依曼体系结构详细解读②关于操作系统对软硬件及用户的意义

目录 ​编辑 1.关于计算机的体系结构 1.1 冯诺依曼体系结构的诞生 2.冯诺依曼体系结构 2.1 cpu:运算器&#xff1a;更多的是让cpu具有特殊的数据计算功能&#xff1a; 2.2 控制器 2.3输入设备 2.4输出设备 3.计算机各个硬件设备之间的关系 4.内存与计算机效率 5.关于为什么总说…...

让ECC升级S/4HANA一步到位的“全面升级方案包”

SAP最新一代商务套件S/4HANA比ECC系统拥有更高性能的存储数据库HANA、更个性化的Fiori用户界面设计系统&#xff0c;能够大大提升系统效率&#xff0c;带来便捷、高效、良好的用户体验。但企业原先使用的ECC系统里面保存了积累多年的关键流程和数据&#xff0c;让企业面对系统升…...

AutoGluon

官网 amazon (base) PS C:\Users\gg葱> conda env list # conda environments: # pytorch1 C:\Users\gg葱\.conda\envs\pytorch1 base * D:\ANCDD:\Documents\LMm\env\pytorch2(base) PS C:\Users\gg葱> conda create --prefixD:/Doc…...

【网站项目】少儿编程管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

基于C语言的数据结构--顺序表讲解及代码函数实现展示

本篇文章是数据结构的开篇&#xff0c;所以我们先来了解一下什么是数据结构。 什么是数据结构 数据结构是由“数据”和“结构”两个词组合而来&#xff0c;自然要以两个词分别去阐述。 首先&#xff0c;什么是数据&#xff1f;数据(data)是事实或观察的结果&#xff0c;是对客…...

(学习日记)2024.03.31:UCOSIII第二十八节:消息队列常用函数

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…...

DLC原理解析及其优化思考

1. 引言 Discreet Log Contract (DLC) 是由麻省理工学院的Tadge Dryja在2018年提出的一套基于预言机的合约执行方案。DLC 允许两方根据预定义的条件进行有条件付款。各方确定可能的结果并进行预签名&#xff0c;并在预言机签署结果时使用这些预签名来执行支付。 因此&#xff…...

银川做网站公司/网络销售挣钱吗

ECHO服务: ECHO服务器仅返回它从客户处收集到的所有数据。是网络管理员测试可达性、调试协议软件及识别选路问题的重要工具&#xff0c;周知端口位于7 与此类似&#xff0c;Time服务的知名端口是37&#xff0c;记录了从1900年1月1日午夜起所经历的秒数&#xff1b;DATETIME服务…...

游戏自助充值网站怎么做/互联网整合营销推广

微信公众号开发weui使用心得&#xff0c;避免少犯错&#xff01;特别注意&#xff1a;如果使用 jquery&#xff0c;则 jquery.js 一定要放在 的最后面&#xff0c;否则 weui 不起作用。引用部分 weui只需要加载 weui.css 即可{% load staticfiles %}引用 weui 整个例子框架hea…...

制作网页的网站fa/360网站安全检测

嘛&#xff0c;废话也不说了 总之很多人按照MSDN文档上的顺序来声明IDeskband2的方法&#xff0c;结果总是出错…… 前天我试了一晚上都不成功&#xff0c;最后找了h文件一看才发现&#xff0c;其实正确的顺序是Set在Can和Get中间…… 顺便推荐个网站&#xff0c;如果Interop出…...

网站客服怎么做的/今日世界杯比分预测最新

前言 很多次小伙伴问到学习方法&#xff0c;我也很想写这样的一篇文章来跟大家讨论下关于学习方法这件事情。 其实学习方法这个事情&#xff0c;我没啥发言权&#xff0c;因为我自己本身都是没啥方法可言的&#xff0c;就瞎折腾那种&#xff0c;但是大家想看这样的一篇文章&a…...

丝袜怎么做的视频网站/网页模板免费html

动态添加布局,下面直接看例子代码: 第一步:这里写了一个空的布局,待会就会把另外的布局添加到这个上面,注意这个布局里的LinearLayout的 id:view_weather_data <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://s…...

制作网站一般要多少钱/赛雷猴是什么意思

先看代码&#xff1a;$a8;$b~$a; //按位取反echo "\$a".$a."";echo "\$b".$b;输出结果&#xff1a;$a8$b-9结果跟我所想的不一样啊&#xff0c;因为在PHP中文手册中说&#xff1a; ~ $a Not(按位非) 将 $a 中为 0 的位设为 1&#xff0c;反之亦然…...