尚硅谷大数据项目《在线教育之实时数仓》笔记003

news2024/11/17 21:42:30

视频地址:尚硅谷大数据项目《在线教育之实时数仓》_哔哩哔哩_bilibili

目录

第7章 数仓开发之ODS层

P015

第8章 数仓开发之DIM层

P016

P017

P018

P019

01、node001节点Linux命令

02、KafkaUtil.java

03、DimSinkApp.java

P020

P021

P022

P023


第7章 数仓开发之ODS层

P015

采集到 Kafka 的 topic_log 和 topic_db 主题的数据即为实时数仓的 ODS 层,这一层的作用是对数据做原样展示和备份。

第8章 数仓开发之DIM层

P016

8.1.1 Flink CDC

P017

8.2 主要任务

package com.atguigu.edu.realtime.app.dim;

import com.atguigu.edu.realtime.util.EnvUtil;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class DimSinkApp {
    public static void main(String[] args) {
        //TODO 1 创建flink运行环境以及设置状态后端
        StreamExecutionEnvironment env = EnvUtil.getExecutionEnvironment(1);

        // TODO 2 读取主流kafka数据
        //env.fromSource();

        // TODO 3 对主流数据进行ETL

        // TODO 4 使用flinkCDC读取配置表数据

        // TODO 5 将配置表数据创建为广播流

        // TODO 6 合并主流和广播流

        // TODO 7 对合并流进行分别处理

        // TODO 8 调取维度数据写出到phoenix

        // TODO 9 执行flink任务

    }
}
package com.atguigu.edu.realtime.util;

import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.runtime.state.hashmap.HashMapStateBackend;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.environment.CheckpointConfig;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;

public class EnvUtil {
    /**
     * 环境准备及状态后端设置,获取对应的环境
     *
     * @param parallelism Flink 程序的并行度
     * @return Flink 流处理环境对象
     */
    public static StreamExecutionEnvironment getExecutionEnvironment(Integer parallelism) {
        //TODO 1 环境创建准备
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        //设置并发
        env.setParallelism(parallelism);

        //TODO 2 设置状态后端
        env.enableCheckpointing(3000L, CheckpointingMode.EXACTLY_ONCE);
        //设置超时时间
        env.getCheckpointConfig().setCheckpointTimeout(60 * 1000L);
        //设置最小间隔时间
        env.getCheckpointConfig().setMinPauseBetweenCheckpoints(3000L);
        env.getCheckpointConfig().setExternalizedCheckpointCleanup(
                CheckpointConfig.ExternalizedCheckpointCleanup.RETAIN_ON_CANCELLATION
        );

        env.setRestartStrategy(RestartStrategies.failureRateRestart(
                3, Time.days(1), Time.minutes(1)
        ));
        env.setStateBackend(new HashMapStateBackend());
        env.getCheckpointConfig().setCheckpointStorage("hdfs://node001:8020/edu/ck");
        System.setProperty("HADOOP_USER_NAME", "atguigu");
        return env;
    }
}

P018

package com.atguigu.edu.realtime.util;

import org.apache.flink.api.common.serialization.DeserializationSchema;
import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;

import java.io.IOException;

public class KafkaUtil {
    public static KafkaSource<String> getKafkaConsumer(String topic, String groupId) {
        return KafkaSource.<String>builder()
                // 必要参数
//                .setBootstrapServers(EduConfig.KAFKA_BOOTSTRAPS)//“node001:9092”
                .setTopics(topic)
                .setGroupId(groupId)
                .setValueOnlyDeserializer(new DeserializationSchema<String>() {
                    @Override
                    public String deserialize(byte[] message) throws IOException {
                        if (message != null && message.length != 0) {
                            return new String(message);
                        }
                        return null;
                    }

                    @Override
                    public boolean isEndOfStream(String nextElement) {
                        return false;
                    }

                    @Override
                    public TypeInformation<String> getProducedType() {
                        return BasicTypeInfo.STRING_TYPE_INFO;
                    }
                })
                // 不必要的参数,设置offset重置的时候读取数据的位置
                .setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetStrategy.EARLIEST))
                .build();
    }
}

P019

01、node001节点Linux命令
[atguigu@node001 bin]$ jpsall
================ node001 ================
4803 QuorumPeerMain
5236 Kafka
7941 Maxwell
5350 Application
6726 ConsoleConsumer
4458 NodeManager
8810 Jps
4043 DataNode
3869 NameNode
4654 JobHistoryServer
================ node002 ================
3505 ResourceManager
4066 QuorumPeerMain
4490 Kafka
5179 Jps
3660 NodeManager
3263 DataNode
================ node003 ================
3505 SecondaryNameNode
5777 Jps
4369 Application
4279 Kafka
4569 Application
3354 DataNode
3851 QuorumPeerMain
3659 NodeManager
[atguigu@node001 bin]$ 

启动hadoop、maxwell、kafka。

[atguigu@node001 ~]$ kafka-console-consumer.sh --bootstrap-server node001:9092 --topic topic_db

[atguigu@node001 bin]$ mysql_to_kafka_init.sh all

02、KafkaUtil.java
package com.atguigu.edu.realtime.util;

import org.apache.flink.api.common.serialization.DeserializationSchema;
import org.apache.flink.api.common.typeinfo.BasicTypeInfo;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.connector.kafka.source.KafkaSource;
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer;
import org.apache.kafka.clients.consumer.OffsetResetStrategy;

import java.io.IOException;

public class KafkaUtil {
    public static KafkaSource<String> getKafkaConsumer(String topic, String groupId) {
        return KafkaSource.<String>builder()
                // 必要参数
                .setBootstrapServers("node001:9092")
                .setTopics(topic)
                .setGroupId(groupId)
                .setValueOnlyDeserializer(new DeserializationSchema<String>() {
                    @Override
                    public String deserialize(byte[] message) throws IOException {
                        if (message != null && message.length != 0) {
                            return new String(message);
                        }
                        return null;
                    }

                    @Override
                    public boolean isEndOfStream(String nextElement) {
                        return false;
                    }

                    @Override
                    public TypeInformation<String> getProducedType() {
                        return BasicTypeInfo.STRING_TYPE_INFO;
                    }
                })
                // 不必要的参数,设置offset重置的时候读取数据的位置
                .setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetStrategy.EARLIEST))
                .build();
    }
}
03、DimSinkApp.java
package com.atguigu.edu.realtime.app.dim;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.edu.realtime.util.EnvUtil;
import com.atguigu.edu.realtime.util.KafkaUtil;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
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.util.Collector;

public class DimSinkApp {
    public static void main(String[] args) throws Exception {
        //TODO 1 创建flink运行环境以及设置状态后端
        StreamExecutionEnvironment env = EnvUtil.getExecutionEnvironment(1);

        // TODO 2 读取主流kafka数据
        DataStreamSource<String> eduDS = env.fromSource(KafkaUtil.getKafkaConsumer("topic_db", "dim_sink_app"),
                WatermarkStrategy.noWatermarks(),
                "kafka_source");

        // TODO 3 对主流数据进行ETL
//        eduDS.map(new MapFunction<String, JSONObject>() {
//            @Override
//            public JSONObject map(String value) throws Exception {
//                return JSONObject.parseObject(value);
//            }
//        }).filter(new FilterFunction<JSONObject>() {
//            @Override
//            public boolean filter(JSONObject jsonObject) throws Exception {
//                String type = jsonObject.getString("type");
//                if (type.equals("bootstrap-complete") || type.equals("bootstrap-start")) {
//                    return false;
//                }
//                return true;
//            }
//        });
        SingleOutputStreamOperator<JSONObject> jsonDS = eduDS.flatMap(new FlatMapFunction<String, JSONObject>() {
            @Override
            public void flatMap(String value, Collector<JSONObject> out) throws Exception {
                try {
                    JSONObject jsonObject = JSON.parseObject(value);
                    String type = jsonObject.getString("type");
                    if (!(type.equals("bootstrap-complete") || type.equals("bootstrap-start"))) {
                        // 需要的数据
                        out.collect(jsonObject);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("数据转换json错误...");
                }
            }
        });
        jsonDS.print();

        // TODO 4 使用flinkCDC读取配置表数据


        // TODO 5 将配置表数据创建为广播流


        // TODO 6 合并主流和广播流


        // TODO 7 对合并流进行分别处理


        // TODO 8 调取维度数据写出到phoenix


        // TODO 9 执行flink任务
        env.execute();
    }
}

P020

flinkCDC监控mysql中的binlog。

{"before":null,"after":{"source_table":"base_category_info","sink_table":"dim_base_category_info","sink_columns":"id,category_name,create_time,update_time,deleted","sink_pk":"id","sink_extend":null},"source":{"version":"1.6.4.Final","connector":"mysql","name":"mysql_binlog_source","ts_ms":0,"snapshot":"false","db":"edu_config","sequence":null,"table":"table_process","server_id":0,"gtid":null,"file":"","pos":0,"row":0,"thread":null,"query":null},"op":"r","ts_ms":1695262804254,"transaction":null}
{
    "before":null,
    "after":{
        "source_table":"base_category_info",
        "sink_table":"dim_base_category_info",
        "sink_columns":"id,category_name,create_time,update_time,deleted",
        "sink_pk":"id",
        "sink_extend":null
    },
    "source":{
        "version":"1.6.4.Final",
        "connector":"mysql",
        "name":"mysql_binlog_source",
        "ts_ms":0,
        "snapshot":"false",
        "db":"edu_config",
        "sequence":null,
        "table":"table_process",
        "server_id":0,
        "gtid":null,
        "file":"",
        "pos":0,
        "row":0,
        "thread":null,
        "query":null
    },
    "op":"r",
    "ts_ms":1695262804254,
    "transaction":null
}
package com.atguigu.edu.realtime.app.dim;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.edu.realtime.bean.DimTableProcess;
import com.atguigu.edu.realtime.util.EnvUtil;
import com.atguigu.edu.realtime.util.KafkaUtil;
import com.ververica.cdc.connectors.mysql.source.MySqlSource;
import com.ververica.cdc.connectors.mysql.table.StartupOptions;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.MapStateDescriptor;
import org.apache.flink.streaming.api.datastream.BroadcastConnectedStream;
import org.apache.flink.streaming.api.datastream.BroadcastStream;
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.util.Collector;

public class DimSinkApp {
    public static void main(String[] args) throws Exception {
        //TODO 1 创建flink运行环境以及设置状态后端
        StreamExecutionEnvironment env = EnvUtil.getExecutionEnvironment(1);

        // TODO 2 读取主流kafka数据
        DataStreamSource<String> eduDS = env.fromSource(KafkaUtil.getKafkaConsumer("topic_db", "dim_sink_app"),
                WatermarkStrategy.noWatermarks(),
                "kafka_source");

        // TODO 3 对主流数据进行ETL
//        eduDS.map(new MapFunction<String, JSONObject>() {
//            @Override
//            public JSONObject map(String value) throws Exception {
//                return JSONObject.parseObject(value);
//            }
//        }).filter(new FilterFunction<JSONObject>() {
//            @Override
//            public boolean filter(JSONObject jsonObject) throws Exception {
//                String type = jsonObject.getString("type");
//                if (type.equals("bootstrap-complete") || type.equals("bootstrap-start")) {
//                    return false;
//                }
//                return true;
//            }
//        });
        SingleOutputStreamOperator<JSONObject> jsonDS = eduDS.flatMap(new FlatMapFunction<String, JSONObject>() {
            @Override
            public void flatMap(String value, Collector<JSONObject> out) throws Exception {
                try {
                    JSONObject jsonObject = JSON.parseObject(value);
                    String type = jsonObject.getString("type");
                    if (!(type.equals("bootstrap-complete") || type.equals("bootstrap-start"))) {
                        // 需要的数据
                        out.collect(jsonObject);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("数据转换json错误...");
                }
            }
        });
        // jsonDS.print();

        // TODO 4 使用flinkCDC读取配置表数据
        // 4.1 FlinkCDC 读取配置表信息
        MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
                .hostname("node001")
                .port(3306)
                .databaseList("edu_config") // set captured database
                .tableList("edu_config.table_process") // set captured table
                .username("root")
                .password("123456")
                //定义读取数据的格式
                .deserializer(new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
                //设置读取数据的模式
                .startupOptions(StartupOptions.initial())
                .build();

        // 4.2 封装为流
        DataStreamSource<String> configDS = env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "mysql_source");
        configDS.print();

        // TODO 5 将配置表数据创建为广播流

        // TODO 6 连接流,合并主流和广播流

        // TODO 7 对合并流进行分别处理

        // TODO 8 调取维度数据写出到phoenix

        // TODO 9 执行flink任务
        env.execute();
    }
}

P021

package com.atguigu.edu.realtime.app.dim;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.edu.realtime.bean.DimTableProcess;
import com.atguigu.edu.realtime.util.EnvUtil;
import com.atguigu.edu.realtime.util.KafkaUtil;
import com.ververica.cdc.connectors.mysql.source.MySqlSource;
import com.ververica.cdc.connectors.mysql.table.StartupOptions;
import com.ververica.cdc.debezium.JsonDebeziumDeserializationSchema;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.MapStateDescriptor;
import org.apache.flink.streaming.api.datastream.BroadcastConnectedStream;
import org.apache.flink.streaming.api.datastream.BroadcastStream;
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.co.BroadcastProcessFunction;
import org.apache.flink.util.Collector;

public class DimSinkApp {
    public static void main(String[] args) throws Exception {
        //TODO 1 创建flink运行环境以及设置状态后端
        StreamExecutionEnvironment env = EnvUtil.getExecutionEnvironment(1);

        // TODO 2 读取主流kafka数据
        DataStreamSource<String> eduDS = env.fromSource(KafkaUtil.getKafkaConsumer("topic_db", "dim_sink_app"),
                WatermarkStrategy.noWatermarks(),
                "kafka_source");

        // TODO 3 对主流数据进行ETL
//        eduDS.map(new MapFunction<String, JSONObject>() {
//            @Override
//            public JSONObject map(String value) throws Exception {
//                return JSONObject.parseObject(value);
//            }
//        }).filter(new FilterFunction<JSONObject>() {
//            @Override
//            public boolean filter(JSONObject jsonObject) throws Exception {
//                String type = jsonObject.getString("type");
//                if (type.equals("bootstrap-complete") || type.equals("bootstrap-start")) {
//                    return false;
//                }
//                return true;
//            }
//        });
        SingleOutputStreamOperator<JSONObject> jsonDS = eduDS.flatMap(new FlatMapFunction<String, JSONObject>() {
            @Override
            public void flatMap(String value, Collector<JSONObject> out) throws Exception {
                try {
                    JSONObject jsonObject = JSON.parseObject(value);
                    String type = jsonObject.getString("type");
                    if (!(type.equals("bootstrap-complete") || type.equals("bootstrap-start"))) {
                        // 需要的数据
                        out.collect(jsonObject);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    System.out.println("数据转换json错误...");
                }
            }
        });
        // jsonDS.print();

        // TODO 4 使用flinkCDC读取配置表数据
        // 4.1 FlinkCDC 读取配置表信息
        MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
                .hostname("node001")
                .port(3306)
                .databaseList("edu_config") // set captured database
                .tableList("edu_config.table_process") // set captured table
                .username("root")
                .password("123456")
                //定义读取数据的格式
                .deserializer(new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
                //设置读取数据的模式
                .startupOptions(StartupOptions.initial())
                .build();

        // 4.2 封装为流
        DataStreamSource<String> configDS = env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "mysql_source");
        configDS.print();

        // TODO 5 将配置表数据创建为广播流
        // key-> 维度表名称,value-> mysql单行数据 使用javaBean
        MapStateDescriptor<String, DimTableProcess> tableProcessState = new MapStateDescriptor<>("table_process_state", String.class, DimTableProcess.class);
        BroadcastStream<String> broadcastStream = configDS.broadcast(tableProcessState);

        // TODO 6 连接流,合并主流和广播流
        BroadcastConnectedStream<JSONObject, String> connectCS = jsonDS.connect(broadcastStream);

        // TODO 7 对合并流进行分别处理
        connectCS.process(new BroadcastProcessFunction<JSONObject, String, Object>() {
            //处理主流
            @Override
            public void processElement(JSONObject jsonObject, BroadcastProcessFunction<JSONObject, String, Object>.ReadOnlyContext readOnlyContext, Collector<Object> collector) throws Exception {
            }

            //处理广播流
            @Override
            public void processBroadcastElement(String s, BroadcastProcessFunction<JSONObject, String, Object>.Context context, Collector<Object> collector) throws Exception {
            }
        });

        // TODO 8 调取维度数据写出到phoenix

        // TODO 9 执行flink任务
        env.execute();
    }
}

P022

package com.atguigu.edu.realtime.app.func;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidPooledConnection;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.atguigu.edu.realtime.bean.DimTableProcess;
import com.atguigu.edu.realtime.common.EduConfig;
import com.atguigu.edu.realtime.util.DruidDSUtil;
import com.atguigu.edu.realtime.util.PhoenixUtil;
import org.apache.flink.api.common.state.BroadcastState;
import org.apache.flink.api.common.state.MapStateDescriptor;
import org.apache.flink.api.common.state.ReadOnlyBroadcastState;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.co.BroadcastProcessFunction;
import org.apache.flink.util.Collector;

import java.sql.*;
import java.util.*;

public class DimBroadcastProcessFunction extends BroadcastProcessFunction<JSONObject, String, JSONObject> {
    private MapStateDescriptor<String, DimTableProcess> tableProcessState;

    // 初始化配置表数据
    private HashMap<String, DimTableProcess> configMap = new HashMap<>();

    public DimBroadcastProcessFunction(MapStateDescriptor<String, DimTableProcess> tableProcessState) {
        this.tableProcessState = tableProcessState;
    }

    /**
     * @param value flinkCDC直接输入的json
     * @param ctx
     * @param out
     * @throws Exception
     */
    @Override
    public void processBroadcastElement(String value, Context ctx, Collector<JSONObject> out) throws Exception {
        //TODO 1 获取配置表数据解析格式

        //TODO 2 检查phoenix中是否存在表 不存在创建

        //TODO 3 将数据写入到状态 广播出去
    }

    /**
     * @param value kafka中maxwell生成的json数据
     * @param ctx
     * @param out
     * @throws Exception
     */
    @Override
    public void processElement(JSONObject value, ReadOnlyContext ctx, Collector<JSONObject> out) throws Exception {
        //TODO 1 获取广播的配置数据

        //TODO 2 过滤出需要的维度字段

        //TODO 3 补充输出字段
    }
}

P023

    //package com.atguigu.edu.realtime.app.func;DimBroadcastProcessFunction
    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);

        Connection connection = DriverManager.getConnection("jdbc:mysql://node001:3306/edu_config?" +
                "user=root&password=123456&useUnicode=true&" +
                "characterEncoding=utf8&serverTimeZone=Asia/Shanghai&useSSL=false"
        );

        PreparedStatement preparedStatement = connection.prepareStatement("select * from edu_config.table_process");
        ResultSet resultSet = preparedStatement.executeQuery();
        ResultSetMetaData metaData = resultSet.getMetaData();
        while (resultSet.next()) {
            JSONObject jsonObject = new JSONObject();
            for (int i = 1; i <= metaData.getColumnCount(); i++) {
                String columnName = metaData.getColumnName(i);
                String columnValue = resultSet.getString(i);
                jsonObject.put(columnName, columnValue);
            }
            DimTableProcess dimTableProcess = jsonObject.toJavaObject(DimTableProcess.class);
            configMap.put(dimTableProcess.getSourceTable(), dimTableProcess);
        }
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
😘

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

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

相关文章

GNSS全球卫星导航系统相关技术

一、参考资料 映核物联网&#xff5c;什么是GNSS&#xff1f; 二、GNSS相关介绍 GNSS&#xff08;Global Navigation Statellite System&#xff09;&#xff0c;即全球导航卫星系统&#xff0c;GNSS的作用是定位和导航。至少4颗卫星&#xff0c;实现准确定位。 1. 全球导航…

vue3使用flv播放视频监控

第一种方法使用安装的 npm install --save flv.js&#xff0c;会出现报错的情况&#xff0c;如flv.js播放视频时出现Failed to execute ‘appendBuffer’ on ‘SourceBuffer’ 解决方法[https://www.cnblogs.com/melancholys/p/14085804.html](https://www.cnblogs.com/melanch…

1024版烟花--2的10次方 快乐

效果&#xff1a; import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;public class App extends Frame {//背景int b1x[] {0, 666, 666, 0};int b1y[] {00, 0, 666, 666};Thread thread;int count 8;//个数App() {setLayout(new …

Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境

文章目录 1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav4 内网穿透&#xff0c;映射至公网5 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内容让人一言难尽&#xff0c;就算是购买了国外的优秀作品&#xff0c;也总是在关键剧情上删删…

apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】

往期教程 apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 上期演示了下如何修改apk的名称。相信只要用心的友友都会操作了。这次讲解下如何修改软件的版本号与版本名字的操作 名词浅释&#xff1a; 在apk反编译中的VersionCode---是版本号的意思.是一…

【Linux学习】—Linux常用指令(一)

【Linux学习】—Linux常用指令&#xff08;一&#xff09; 一、组管理和权限管理 在Linux中的每个用户必须属于一个组&#xff0c;不能独立于组外。 1️⃣所有者 一般为文件的创建者&#xff0c;谁创建了该文件&#xff0c;就自然的成为该文件的所有者。 查看文件的所有者…

马尔科夫链、PCV及贝叶斯动图详解

马尔科夫链、主成分分析以及条件概率等概念&#xff0c;是计算机学生必学的知识点&#xff0c;然而理论的抽象性往往让学生很难深入地去体会和理解。而本文&#xff0c;将这些抽象的理论概念&#xff0c;用可视化的方式来解释&#xff0c;还可调节相应参数来改变结果&#xff0…

1997-2021年世界各国GDP数据

1997-2021年世界各国GDP数据 1、时间&#xff1a;1997-2021年 2、来源&#xff1a;世界银行 3、范围&#xff1a;世界各国 4、指标&#xff1a;国内生产总值&#xff08;固定LCU&#xff09;、国内生产总值&#xff08;当前LCU&#xff09;、国内生产总值&#xff08;现值美…

2023年或者每一年值得最被关注的技术趋势是什么?

2023年或者近几年中&#xff0c;值得关注的技术趋势有很多&#xff0c;其中一些主要的包括&#xff1a; 人工智能与机器学习: 人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;继续在各个行业中引起变革&#xff0c;从医疗保健到金融服务&#xff0c;再…

快速入门Elasticsearch:安装、基本概念、分词器和文档基本操作详解

本文主要介绍快速入门 Elasticsearch&#xff0c;从 安装 、 基本概念 、 分词器 、*** 文档基本操作 *** 这 4 个方面快速入门。 Elasticsearch 是一款近实时的搜索引擎&#xff0c;底层是基于 Lucene 做搜索&#xff0c;再此基础上加入了分布式的特性&#xff0c;以便支持海…

QListWidget 类使用教程

文章目录 1、简介2、属性3、functions3.1、访问属性相关 function3.2、公共槽3.3、Signal3.4、其他方法 QT 官方文档参考地址&#xff1a;https://doc.qt.io/qt-5/qlistwidget.html 1、简介 moudleclass说明PyQt5.QtWidgets包含了一整套UI元素控件&#xff0c;用于建立符合系统…

Hugging face下载的离线模型不会用?没关系,看这里

可能遇到的问题&#xff1a; 不知道大家有没有碰到这样的问题&#xff0c;想从hugging face 加载模型&#xff0c;使用其提供的接口做一个简单的demo,但是由于网络的原因没办法正常访问&#xff1a; (MaxRetryError("HTTPSConnectionPool(hosthuggingface.co, port443):…

【封装--限定符private--包】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 封装访问限定符 private快捷键实现get和set 封装扩展之包如何导包怎么找包 自定义包方法: 总结 封装 访问限定符 private 什么是封装&#xff1f; 就像电脑&…

DC-8 靶机

DC_8 信息搜集 存活检测 详细扫描 后台网页扫描 网站信息搜集 访问不同的页面的时候 url 随之变化 尝试 sql 注入 在 url 后输入 验证 直接报数据库语法错误 漏洞利用 使用 sqlmap 工具 爆破数据库 sqlmap -u 10.4.7.153/?nid2 --dbs --batch成功爆破出两个数据库 d7db…

【数据结构】数组和字符串(一):矩阵的数组表示

文章目录 4.1 数组4.1.1 数组的存储和寻址4.1.2 一维数组的基本操作 4.2 矩阵4.2.1 矩阵的数组表示a. 矩阵的二维数组存储及其乘法运算b. 一维数组存储 4.1 数组 4.1.1 数组的存储和寻址 数组是一种用于存储多个相同类型元素的数据结构。在内存中&#xff0c;数组的元素是连续…

视频上的水印文字如何去掉?

嘿&#xff0c;大家好&#xff01;作为一个自媒体从业者&#xff0c;我相信大家都想知道如何去掉视频上的水印文字&#xff0c;想必大家和我一样每天都会在互联网寻找素材&#xff0c;而大部分图片或者视频都带有各种各样的水印&#xff0c;这给我的创作带来了不小的麻烦&#…

SQL Delete 语句(删除表中的记录)

SQL DELETE 语句 DELETE语句用于删除表中现有记录。 SQL DELETE 语法 DELETE FROM table_name WHERE condition; 请注意删除表格中的记录时要小心&#xff01;注意SQL DELETE 语句中的 WHERE 子句&#xff01; WHERE子句指定需要删除哪些记录。如果省略了WHERE子句&#xff…

【题解 单调队列优化dp】 简单的加法乘法计算题

题目描述&#xff1a; 分析&#xff1a; 由于对于每一步而言&#xff0c;我们都需要的是最小步数 所以我们很显然的可以写出一个dp方程&#xff1a; 设 f [ i ] f[i] f[i]表示达到i时的最小步数 我们有两种操作&#xff0c;也就是说我们可以通过一下两种方式转移过来&#xff…

前端开发实践:vue中用qrcode库将超链接生成二维码图片

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…

VBA_MF系列技术资料1-212

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…