Flink Table 数据类型 及Stream转Table实战 和 Flink假(模拟、mock)数据生成工具

列举的flink Table API的数据类型。并生成与这些类型匹配的数据。
同时比较了DataType或LoglicalType默认conversionClass与Flink Table API中规定的内部类型的conversionClass的异同。

一、添加maven pom依赖

用于生成假数据。

    <dependency><groupId>net.datafaker</groupId><artifactId>datafaker</artifactId><version>1.6.0</version><scope>test</scope></dependency>

二、生成假数据的工具类

注意:此类生成的数据类型是FlinkTable API规定的内部数据类型。

import lombok.Data;
import net.datafaker.Address;
import net.datafaker.Faker;
import net.datafaker.Internet;
import net.datafaker.Name;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.data.DecimalData;
import org.apache.flink.table.data.StringData;
import org.apache.flink.table.data.TimestampData;
import org.apache.flink.table.types.DataType;import java.math.BigDecimal;
import java.time.*;
import java.util.Locale;
import java.util.Random;
import java.util.function.Supplier;/*** @author: * @create: * @Description: 注意:只能生成Flink Table的内部类型数据!!!*/
public class FlinkInternalDataFakers {private FlinkInternalDataFakers() {}@Datapublic abstract static class FLinkInternalDataFaker<OUT> implements Supplier<OUT>{protected String name;public FLinkInternalDataFaker(String name) {this.name=name;}protected abstract DataType getProducedDataType();}private static abstract class CharFakerBase extends FLinkInternalDataFaker<StringData> {private final Faker faker = new Faker(Locale.CHINA);private final Name name = faker.name();private final Random random = new Random();protected final int len;public final static int INDEX_MIN = 0;public final static int INDEX_MAN = 128;public CharFakerBase(String name,int len) {super(name);this.len = len;}public StringData get() {String nm = name.fullName();String str = nm.substring(0, Math.min(len, nm.length()));return StringData.fromString(str);}}public static class CharFaker extends CharFakerBase {public CharFaker(String name,int len) {super(name,len);}@Overridepublic DataType getProducedDataType() {return DataTypes.CHAR(len).bridgedTo(StringData.class);}}public static class VarCharFaker extends CharFakerBase {public VarCharFaker(String name,int len) {super(name,len);}@Overridepublic DataType getProducedDataType() {return DataTypes.VARCHAR(len).bridgedTo(StringData.class);}}public static class StringDataFaker extends FLinkInternalDataFaker<StringData> {final Faker faker = new Faker(Locale.CHINA);final Name name = faker.name();final Address address = faker.address();final Internet internet = faker.internet();public StringDataFaker(String name) {super(name);}public StringData get() {return StringData.fromString(name.name() + "|" + address.city() + "|" + internet.emailAddress());}@Overridepublic DataType getProducedDataType() {return DataTypes.STRING().bridgedTo(StringData.class);}}public static class BooleanFaker extends FLinkInternalDataFaker<Boolean> {private final Random random = new Random();public BooleanFaker(String name) {super(name);}@Overridepublic Boolean get() {return random.nextBoolean();}@Overridepublic DataType getProducedDataType() {return DataTypes.BOOLEAN();}}private static abstract class BinaryFakerBase extends FLinkInternalDataFaker<byte[]> {private final Faker faker = new Faker(Locale.CHINA);protected final int len;public BinaryFakerBase(String name,int len) {super(name);this.len = len;}@Overridepublic byte[] get() {String s = faker.name().fullName();byte[] bytes = s.getBytes();byte[] output = new byte[len];System.arraycopy(bytes, 0, output, 0, Math.min(len, bytes.length));return output;}}public static class BinaryFaker extends BinaryFakerBase {public BinaryFaker(String name,int len) {super(name,len);}@Overridepublic DataType getProducedDataType() {return DataTypes.BINARY(len);}}public static class VarBinaryFaker extends BinaryFakerBase {public VarBinaryFaker(String name,int len) {super(name,len);}@Overridepublic DataType getProducedDataType() {return DataTypes.VARBINARY(len);}}public static class BytesFaker extends FLinkInternalDataFaker<byte[]> {private final Faker faker = new Faker(Locale.CHINA);private final Name nameFaker = faker.name();public BytesFaker(String name) {super(name);}@Overridepublic byte[] get() {return nameFaker.fullName().getBytes();}@Overridepublic DataType getProducedDataType() {return DataTypes.BYTES();}}public static class DecimalDataFaker extends FLinkInternalDataFaker<DecimalData> {private final Random random = new Random();private final int precision;private final int scale;public DecimalDataFaker(String name,int precision, int scale) {super(name);this.precision = precision;this.scale = scale;}@Overridepublic DecimalData get() {long itg = random.nextInt((int)Math.pow(10,precision-scale));double dbl = random.nextDouble();double dig = dbl % 1;double dcm = itg + dig;String str = String.format("%." + scale + "f", dcm);BigDecimal bigDecimal = new BigDecimal(str);return DecimalData.fromBigDecimal(bigDecimal, precision, scale);}@Overridepublic DataType getProducedDataType() {return DataTypes.DECIMAL(precision,scale).bridgedTo(DecimalData.class);}}public static class TinyIntFaker extends FLinkInternalDataFaker<Byte> {private final Random random = new Random();public TinyIntFaker(String name) {super(name);}@Overridepublic Byte get() {return (byte) random.nextInt(128);}@Overridepublic DataType getProducedDataType() {return DataTypes.TINYINT();}}public static class SmallIntFaker extends FLinkInternalDataFaker<Short> {private final Random random = new Random();public SmallIntFaker(String name) {super(name);}@Overridepublic Short get() {return (short) random.nextInt();}@Overridepublic DataType getProducedDataType() {return DataTypes.SMALLINT();}}public static class IntFaker extends FLinkInternalDataFaker<Integer> {private final Random random = new Random();public IntFaker(String name) {super(name);}@Overridepublic Integer get() {return random.nextInt();}@Overridepublic DataType getProducedDataType() {return DataTypes.INT();}}public static class BigIntFaker extends FLinkInternalDataFaker<Long> {private final Random random = new Random();public BigIntFaker(String name) {super(name);}@Overridepublic Long get() {return random.nextLong();}@Overridepublic DataType getProducedDataType() {return DataTypes.BIGINT();}}public static class FloatFaker extends FLinkInternalDataFaker<Float> {private final Random random = new Random();public FloatFaker(String name) {super(name);}@Overridepublic Float get() {return random.nextFloat()*(float)Math.pow(10,random.nextInt(9));}@Overridepublic DataType getProducedDataType() {return DataTypes.FLOAT();}}public static class DoubleFaker extends FLinkInternalDataFaker<Double> {private final Random random = new Random();public DoubleFaker(String name) {super(name);}@Overridepublic Double get() {return random.nextDouble()*Math.pow(10,random.nextInt(9));}@Overridepublic DataType getProducedDataType() {return DataTypes.DOUBLE();}}public static class DateFaker extends FLinkInternalDataFaker<Integer> {private final Random random = new Random();int MAX_DATE = (int)LocalDate.of(2099, 12, 31).toEpochDay();public DateFaker(String name) {super(name);}@Overridepublic Integer get() {return random.nextInt(MAX_DATE);}@Overridepublic DataType getProducedDataType() {return DataTypes.DATE().bridgedTo(Integer.class);}}public static class TimeFaker extends FLinkInternalDataFaker<Integer> {public static final int SECOND_OF_DAY = 24 * 60 * 60;private final Random random = new Random();private final int scale;public TimeFaker(String name,int scale) {super(name);this.scale = scale;}@Overridepublic Integer get() {int sec = random.nextInt(SECOND_OF_DAY);int milli = random.nextInt(1_000);return sec * 1_000 + milli;}@Overridepublic DataType getProducedDataType() {return DataTypes.TIME(scale).bridgedTo(Integer.class);}}public static class TimestampFaker extends FLinkInternalDataFaker<TimestampData> {private final Random random = new Random();private final int scale;public static final long MAX_SECONDS = LocalDateTime.of(LocalDate.of(2099, 12, 31), LocalTime.MAX).toEpochSecond(ZoneOffset.of("+8"));public static final int MAX_NANO_SECONDS = 999_999_999;public TimestampFaker(String name,int scale) {super((name));this.scale = scale;}@Overridepublic TimestampData get() {long l = Math.abs(random.nextLong());long secs = l % MAX_SECONDS;int nanos = random.nextInt((int) Math.pow(10, scale)) * (int)Math.pow(10,(9 - scale));LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(secs, nanos, ZoneOffset.UTC);return TimestampData.fromLocalDateTime(localDateTime);}@Overridepublic DataType getProducedDataType() {return DataTypes.TIMESTAMP(scale).bridgedTo(TimestampData.class);}}
}

三、编写 SourceFunction 生成数据。

内含启动main函数入口。
DataStream<RowData> --> DataStream<Row> --> Table 的流程。最终打印模拟数据。
其中的 RowUtils 工具类,请参考Flink RowData 与 Row 相互转化工具类

import com.h3c.it_bigdata.module.transfer.util.RowUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.ParallelSourceFunction;
import org.apache.flink.table.api.DataTypes;
import org.apache.flink.table.api.Schema;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.table.data.*;
import org.apache.flink.table.runtime.typeutils.InternalTypeInfo;
import org.apache.flink.table.types.DataType;
import org.apache.flink.table.types.logical.RowType;
import org.apache.flink.table.types.utils.DataTypeUtils;
import org.apache.flink.types.Row;
import org.apache.flink.types.RowKind;import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Supplier;public class FlinkFakeTypeSourceFunc implements ParallelSourceFunction<RowData> {private final int interval;public FlinkFakeTypeSourceFunc(int interval) {this.interval = interval;}public static final FlinkInternalDataFakers.FLinkInternalDataFaker<?>[] typeFakerArr;public final static DataType rowDataType;public final RowKind[] ROW_KINDS = new RowKind[]{RowKind.INSERT, RowKind.UPDATE_AFTER, RowKind.UPDATE_BEFORE, RowKind.DELETE};static {List<FlinkInternalDataFakers.FLinkInternalDataFaker<?>> fakers = new ArrayList<>();FlinkInternalDataFakers.CharFaker char10Faker = new FlinkInternalDataFakers.CharFaker("char10",10);fakers.add(char10Faker);FlinkInternalDataFakers.VarCharFaker varChar10Faker = new FlinkInternalDataFakers.VarCharFaker("varchar10", 10);fakers.add(varChar10Faker);FlinkInternalDataFakers.StringDataFaker stringDataFaker = new FlinkInternalDataFakers.StringDataFaker("string");fakers.add(stringDataFaker);FlinkInternalDataFakers.BooleanFaker booleanFaker = new FlinkInternalDataFakers.BooleanFaker("boolean");fakers.add(booleanFaker);FlinkInternalDataFakers.DecimalDataFaker decimalData103Faker = new FlinkInternalDataFakers.DecimalDataFaker("decimal103",10, 3);fakers.add(decimalData103Faker);FlinkInternalDataFakers.TinyIntFaker tinyIntFaker = new FlinkInternalDataFakers.TinyIntFaker("tinyint");fakers.add(tinyIntFaker);FlinkInternalDataFakers.SmallIntFaker smallIntFaker = new FlinkInternalDataFakers.SmallIntFaker("smallint");fakers.add(smallIntFaker);FlinkInternalDataFakers.IntFaker intFaker = new FlinkInternalDataFakers.IntFaker("integer");fakers.add(intFaker);FlinkInternalDataFakers.BigIntFaker bigIntFaker = new FlinkInternalDataFakers.BigIntFaker("bigint");fakers.add(bigIntFaker);FlinkInternalDataFakers.FloatFaker floatFaker = new FlinkInternalDataFakers.FloatFaker("float");fakers.add(floatFaker);FlinkInternalDataFakers.DoubleFaker doubleFaker = new FlinkInternalDataFakers.DoubleFaker("double");fakers.add(doubleFaker);FlinkInternalDataFakers.DateFaker dateFaker = new FlinkInternalDataFakers.DateFaker("date");fakers.add(dateFaker);FlinkInternalDataFakers.TimeFaker time0Faker = new FlinkInternalDataFakers.TimeFaker("time0",0);fakers.add(time0Faker);FlinkInternalDataFakers.TimeFaker time3Faker = new FlinkInternalDataFakers.TimeFaker("time3",3);fakers.add(time3Faker);FlinkInternalDataFakers.TimestampFaker timestamp0Faker = new FlinkInternalDataFakers.TimestampFaker("timestamp0",0);fakers.add(timestamp0Faker);FlinkInternalDataFakers.TimestampFaker timestamp3Faker = new FlinkInternalDataFakers.TimestampFaker("timestamp3",3);fakers.add(timestamp3Faker);FlinkInternalDataFakers.TimestampFaker timestamp6Faker = new FlinkInternalDataFakers.TimestampFaker("timestamp6", 6);fakers.add(timestamp6Faker);FlinkInternalDataFakers.BinaryFaker binary5Faker = new FlinkInternalDataFakers.BinaryFaker("binary5",5);fakers.add(binary5Faker);FlinkInternalDataFakers.VarBinaryFaker varBinary5Faker = new FlinkInternalDataFakers.VarBinaryFaker("varbinary5", 5);fakers.add(varBinary5Faker);FlinkInternalDataFakers.BytesFaker bytesFaker = new FlinkInternalDataFakers.BytesFaker("bytes");fakers.add(bytesFaker);rowDataType = DataTypes.ROW(fakers.stream().map(f->DataTypes.FIELD(f.getName(),f.getProducedDataType())).toArray(DataTypes.Field[]::new));typeFakerArr = fakers.toArray(new FlinkInternalDataFakers.FLinkInternalDataFaker<?>[0]);}public DataType getRowDataType() {return rowDataType;}public void printFLinkInternalType(){System.out.println("------------------------------------------------------");for (int i = 0; i < typeFakerArr.length; i++) {String fieldName = typeFakerArr[i].getName();DataType dataType = typeFakerArr[i].getProducedDataType();// 因为typeFakerArr已经将所有的类型BridgeTo Flink内不类型了。这里再次 toInternalDataType 意在告知Flink Table API Internal Type的来源。// DataType internalDataType = DataTypeUtils.toInternalDataType(dataType);System.out.printf("FieldName: %s --> TypeName: %s --> DefaultConversionClass: %s --> TypeConversionClass: %s%n",fieldName,dataType.toString(),dataType.getLogicalType().getDefaultConversion().getSimpleName(),dataType.getConversionClass().getSimpleName());}System.out.println("------------------------------------------------------");}@Overridepublic void run(SourceContext<RowData> sourceContext) throws Exception {Random random = new Random();while (true) {GenericRowData rowData = new GenericRowData(ROW_KINDS[random.nextInt(ROW_KINDS.length)], typeFakerArr.length);for (int i = 0; i < typeFakerArr.length; i++) {rowData.setField(i, typeFakerArr[i].get());}sourceContext.collect(rowData);Thread.sleep(interval * 1000L);}}@Overridepublic void cancel() {}public static void main(String[] args) throws Exception {// FlinkEnvProvider provider = new FlinkEnvProvider();// StreamExecutionEnvironment senv = provider.getSenv();// StreamTableEnvironment tenv = provider.getTenv();StreamExecutionEnvironment senv = StreamExecutionEnvironment.getExecutionEnvironment();StreamTableEnvironment tenv = StreamTableEnvironment.create(senv);FlinkFakeTypeSourceFunc fakeSourceFunc = new FlinkFakeTypeSourceFunc(3);fakeSourceFunc.printFLinkInternalType();DataType dataType = fakeSourceFunc.getRowDataType();InternalTypeInfo<RowData> typeInfo = InternalTypeInfo.of((RowType) dataType.getLogicalType());DataStreamSource<RowData> rowDataDs = senv.addSource(fakeSourceFunc, "flinkTypeFakeSource", typeInfo);// rowDataDs.print();RowUtils.TypedMapFunc<RowData, Row> mapFunc = RowUtils.getRowDataToRowMapFunc(dataType);SingleOutputStreamOperator<Row> rowDs = rowDataDs.map(mapFunc).returns(mapFunc.getProducedType());DataType producedDataType = mapFunc.getProducedDataType();Schema schema = Schema.newBuilder().fromRowDataType(producedDataType).build();Table tbl = tenv.fromChangelogStream(rowDs, schema);DataType dt = tbl.getResolvedSchema().toPhysicalRowDataType();tbl.execute().print();senv.execute();}
}

三、LoglicalType默认承载类型和Fink Table 内部类型比较

printFLinkInternalType 方法将数据类型打印出来。
注意有些DataType没有使用LogicalType的DefaultConversionClass

FieldName: char10 --> TypeName: CHAR(10) --> DefaultConversionClass: String --> TypeConversionClass: StringData
FieldName: varchar10 --> TypeName: VARCHAR(10) --> DefaultConversionClass: String --> TypeConversionClass: StringData
FieldName: string --> TypeName: STRING --> DefaultConversionClass: String --> TypeConversionClass: StringData
FieldName: boolean --> TypeName: BOOLEAN --> DefaultConversionClass: Boolean --> TypeConversionClass: Boolean
FieldName: decimal103 --> TypeName: DECIMAL(10, 3) --> DefaultConversionClass: BigDecimal --> TypeConversionClass: DecimalData
FieldName: tinyint --> TypeName: TINYINT --> DefaultConversionClass: Byte --> TypeConversionClass: Byte
FieldName: smallint --> TypeName: SMALLINT --> DefaultConversionClass: Short --> TypeConversionClass: Short
FieldName: integer --> TypeName: INT --> DefaultConversionClass: Integer --> TypeConversionClass: Integer
FieldName: bigint --> TypeName: BIGINT --> DefaultConversionClass: Long --> TypeConversionClass: Long
FieldName: float --> TypeName: FLOAT --> DefaultConversionClass: Float --> TypeConversionClass: Float
FieldName: double --> TypeName: DOUBLE --> DefaultConversionClass: Double --> TypeConversionClass: Double
FieldName: date --> TypeName: DATE --> DefaultConversionClass: LocalDate --> TypeConversionClass: Integer
FieldName: time0 --> TypeName: TIME(0) --> DefaultConversionClass: LocalTime --> TypeConversionClass: Integer
FieldName: time3 --> TypeName: TIME(3) --> DefaultConversionClass: LocalTime --> TypeConversionClass: Integer
FieldName: timestamp0 --> TypeName: TIMESTAMP(0) --> DefaultConversionClass: LocalDateTime --> TypeConversionClass: TimestampData
FieldName: timestamp3 --> TypeName: TIMESTAMP(3) --> DefaultConversionClass: LocalDateTime --> TypeConversionClass: TimestampData
FieldName: timestamp6 --> TypeName: TIMESTAMP(6) --> DefaultConversionClass: LocalDateTime --> TypeConversionClass: TimestampData
FieldName: binary5 --> TypeName: BINARY(5) --> DefaultConversionClass: byte[] --> TypeConversionClass: byte[]
FieldName: varbinary5 --> TypeName: VARBINARY(5) --> DefaultConversionClass: byte[] --> TypeConversionClass: byte[]
FieldName: bytes --> TypeName: BYTES --> DefaultConversionClass: byte[] --> TypeConversionClass: byte[]

四、样例数据

+----+--------------------------------+--------------------------------+--------------------------------+---------+--------------+---------+----------+-------------+----------------------+--------------------------------+--------------------------------+------------+----------+--------------+---------------------+-------------------------+----------------------------+--------------------------------+--------------------------------+--------------------------------+
| op |                         char10 |                      varchar10 |                         string | boolean |   decimal103 | tinyint | smallint |     integer |               bigint |                          float |                         double |       date |    time0 |        time3 |          timestamp0 |              timestamp3 |                 timestamp6 |                        binary5 |                     varbinary5 |                          bytes |
+----+--------------------------------+--------------------------------+--------------------------------+---------+--------------+---------+----------+-------------+----------------------+--------------------------------+--------------------------------+------------+----------+--------------+---------------------+-------------------------+----------------------------+--------------------------------+--------------------------------+--------------------------------+
| -D |                         林远航 |                         吕建辉 |  莫炫明|中山|擎宇.魏@yahoo.com |   false |  3050752.529 |     113 |    -9916 |  -642000144 |  4156969259139129690 |                      1673004.6 |              5.866031031768757 | 1988-07-13 | 19:17:05 |     05:02:40 | 2017-02-24 08:49:28 | 1980-03-02 11:28:27.601 | 2007-10-24 19:41:31.074622 |    [-26, -78, -120, -25, -125] |     [-24, -75, -75, -26, -103] | [-24, -82, -72, -26, -104, ... |
| -D |                         沈伟祺 |                         段浩然 | 阎擎宇|阳江|越彬.范@hotmail... |    true |  1353447.631 |      84 |     3766 | -1944128024 |  5163149151613555000 |                      294841.06 |              404.7775779582528 | 2038-11-15 | 22:25:22 |     12:45:26 | 2055-04-12 12:48:41 | 2012-07-20 19:19:59.805 | 1989-05-24 16:32:30.562509 |    [-24, -117, -113, -27, -83] |    [-25, -122, -118, -23, -72] | [-26, -101, -66, -23, -71, ... |
| +I |                         谭弘文 |                         丁弘文 |  苏睿渊|韶关|擎苍.陈@yahoo.com |   false |  8423218.732 |       9 |    10515 |   524074331 | -2197205037599287672 |                      27.323235 |              9053.888002920687 | 2066-11-04 | 12:05:57 |     03:09:11 | 1978-11-22 23:30:41 | 1975-07-05 12:16:57.301 | 2001-10-28 06:15:39.835157 |    [-23, -126, -79, -25, -125] |    [-25, -88, -117, -27, -121] | [-28, -67, -107, -27, -83, ... |

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/83044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA(2023)解决运行乱码问题

&#x1f607;作者介绍&#xff1a;一个有梦想、有理想、有目标的&#xff0c;且渴望能够学有所成的追梦人。 &#x1f386;学习格言&#xff1a;不读书的人,思想就会停止。——狄德罗 ⛪️个人主页&#xff1a;进入博主主页 &#x1f5fc;专栏系列&#xff1a;无 &#x1f33c…

【计算机组成原理】读书笔记第三期:内存和磁盘的关系

目录 写在开头 内存与磁盘的关系 基本关系 磁盘缓存 虚拟内存 节约内存的编程方法 通过DLL文件实现函数共有 通过调用_stdcall来降低文件程序的大小 磁盘的物理结构 结尾 写在开头 本文继续阅读总结《程序是怎样跑起来的》这本书&#xff08;作者&#xff1a;矢泽…

操作系统(5-7分)

内容概述 进程管理 进程的状态 前驱图 同步和互斥 PV操作&#xff08;难点&#xff09; PV操作由P操作原语和V操作原语组成&#xff08;原语是不可中断的过程&#xff09;&#xff0c;对信号量进行操作&#xff0c;具体定义如下&#xff1a; P&#xff08;S&#xff09;&#…

【Java】安装多个jdk版本

需求描述 win10系统上已经安装过jdk8&#xff0c;但因为要做某些实验&#xff0c;需要安装个jdk7 解决方法 安装过程 下载地址 https://www.oracle.com/java/technologies/downloads/archive/ 安装步骤 .exe文件安装步骤安装即可 遇到问题 问题1&#xff1a;配置环境变…

【计算机网络】——传输层

//图片取自王道&#xff0c;仅做交流学习 一、传输层提供的服务 物理层、数据链路层、网络层是通信子网。 传输层&#xff1a;它属于面向通信部分的最高层&#xff0c;同时也是用户功能的最低层 为应用层提供通信服务使用网络层的服务 网络层提供主机之间的逻辑通信。 1、传输…

SpringMVC之JSR303与拦截器

目录 一.JSR303 1.什么是JSR303 2.为什么使用JSR303 3.JSR303常用注解 4.快速入门 4.1导入Maven依赖 4.2 配置校验规则 4.3 对服务端数据添加进行校验 4.4 结果测试 二.拦截器 1.什么是拦截器 2.拦截器与过滤器 3.应用场景 4.基本拦截器配置 5 案例演示&#xff0…

区块链实验室(23) - FISCO中PBFT耗时与流量特征

前面的实验(区块链实验室(11) - PBFT耗时与流量特征)用仿真的PBFT观察耗时。现在用真实的Fisco网络再次观察其特征。同样地&#xff0c;用相同的网络&#xff0c;即100个节点构成的无标度网络。在每个节点上发起10次交易&#xff0c;记录每次交易的耗时。结果见下图所示。 前半…

Android12.0 系统限制上网系列之iptables用IOemNetd实现app上网黑名单的实现

1.前言 在12.0的系统rom定制化开发中,对于系统限制网络的使用,在system中netd网络这块的产品需要中,会要求设置屏蔽某个app上网的功能, liunx中iptables命令也是比较重要的,接下来就来在IOemNetd这块实现app上网黑名单的的相关功能,就是在 系统中只能不允许某个app上网,…

UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 题目其实不难&#xff0c;但是耗费了我较多时间。 这种题关键就是在于找到约束条件&#xff0c;我在DFS的基础上&#xff0c;试了很多种策略&#xff1a; 1. 对3种数字&#xff0c;每种数字…

VSCode『SSH』连接服务器『GUI界面』传输

前言 最近需要使用实验室的服务器训练带有 GUI 画面的 AI 算法模型&#xff08;pygame&#xff09;&#xff0c;但是我是使用 SSH 连接的&#xff0c;不能很好的显示模型训练的效果画面&#xff0c;所以下面将会讲解如何实现 SSH 连接传输 Linux GUI 画面的 注&#xff1a;我们…

Postman —— HTTP请求基础组成部分

一般来说&#xff0c;所有的HTTP Request都有最基础的4个部分组成&#xff1a;URL、 Method、 Headers和body。 &#xff08;1&#xff09;Method 要选择Request的Method是很简单的&#xff0c;Postman支持所有的请求方式。 &#xff08;2&#xff09;URL 要组装一条Request…

华为HCIA(五)

Vlan id 在802.1Q中 高级ACL不能匹配用户名和源MAC 2.4G频段被分为14个交叠的&#xff0c;错列的20MHz信道&#xff0c;信道编码从1到14&#xff0c;邻近的信道之间存在一定的重叠范围 STA通过Probe获取SSID信息 Snmp报文 网络管理设备异常发生时会发送trap报文 D类地址是…

基于Java网络书店商城设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

亚马逊云科技 Amazon Lightsail :一种在云服务器上运行容器的简单方法

当向开发人员介绍亚马逊云科技云服务时&#xff0c;通常会花一点时间来介绍并演示 Amazon Lightsail 。它是迄今为止开始使用亚马逊云科技的最简单方法。使用它&#xff0c;您在几分钟内即可在自己的虚拟服务器上运行您的应用程序。而后增加了在 Amazon Lightsail 上部署基于容…

C语言字符函数和字符串函数(1)

大家好&#xff0c;我们又见面了&#xff0c;让大家久等了&#xff0c;我们今天就来学习字符函数和字符串函数。 在开启今天的学习之前呢&#xff0c;我来解决一下一些小伙伴平时找不到库函数使用的烦恼&#xff0c;因为我们cplusplus.com最新版本不能够查询函数&#xff0c;我…

【面试题精讲】Mysql如何实现乐观锁

❝ 有的时候博客内容会有变动&#xff0c;首发博客是最新的&#xff0c;其他博客地址可能会未同步,认准https://blog.zysicyj.top ❞ 首发博客地址 文章更新计划 系列文章地址 在 MySQL 中&#xff0c;可以通过使用乐观锁来实现并发控制&#xff0c;以避免数据冲突和并发更新问…

排查disabled问题之谷歌新版本特性

问题复现 最近我突然接手一个后台的bug&#xff0c;这个后台很久没有迭代更新了&#xff0c;我也不熟悉业务&#xff0c;所以只能看一下源码&#xff0c;问题很快就复现&#xff0c;测试的修复操作也很正确&#xff0c;就是因为渲染的input标签中存在disableddisabled’属性导…

单片机论文参考:1、基于单片机的电子琴

摘要 随着社会的发展进步&#xff0c;音乐逐渐成为我们生活中很重要的一部分&#xff0c;有人曾说喜欢音乐的人不会向恶。我们都会抽空欣赏世界名曲&#xff0c;作为对精神的洗礼。本论文设计一个基于单片机的简易电子琴。电子琴是现代电子科技与音乐结合的产物&#xff0c;是一…

英国留学生务必谨慎使用ChatGPT!!!

ChatGPT&#xff08;全名&#xff1a;Chat Generative Pre-trained Transformer&#xff09;&#xff0c;是OpenAI研发的聊天机器人程序&#xff0c;于2022年11月30日发布。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够基于在预训练阶段所见的模式和统计规律…

1.IAR-8051安装

新版安装教程&#xff1a;IAR EW for 8051 简介与安装 新版软件zhuce&#xff1a;IAR EW for 8051 软件注册 - 知乎 这个新版的我也放到网盘里面了&#xff0c;自己自行选择安装 一、下载IAR-8051 链接&#xff1a;https://pan.baidu.com/s/1mYwSQvSjAiSzltrEbK3yAw?pwd43cd …