SpringBoot快速整合canal1.1.5(TCP模式)
SpringBoot快速整合canal1.1.5(TCP模式)
安装并配置MySQL主从⭐
- 1:Docker安装MySQL8.0.28
docker pull mysql:8.0.28
- 2:创建目录:
mkdir -p /usr/local/mysql8/data
mkdir -p /usr/local/mysql8/log
mkdir -p /usr/local/mysql8/my.conf.d
chmod -R 777 /usr/local/mysql8/
- 3:编写my.cnf文件:
vi /usr/local/mysql8/my.conf.d/my.cnf
内容如下:(注意:把binlog-do-db的值修改成你需要canal监听的数据库名称,如果需要监听多个数据库,一定要在下面写多个binlog-do-db,而不是用“,”分隔)
[client]
# 默认字符集
# default_character_set=utf8
[mysqld]
server-id=138
# 开启二进制日志功能
log-bin=mysql-slave-bin
# binlog 记录内容的方式,记录被操作的每一行
binlog_format = ROW
# ------- >>>>指定监听的数据库(防止监听所有数据库)<<<<<----------
binlog-do-db=security-jwt-db
# 忽略大小写
lower_case_table_names=1
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
# 数据库数据存放目录
datadir= /var/lib/mysql
secure-file-priv= NULL
skip-symbolic-links=0
# 最大链接数
max_connections=200
# 最大失败次数
max_connect_errors=10
# 默认时区
default-time_zone='+8:00'
character-set-client-handshake=FALSE
character_set_server=utf8mb4
# default-character-set=utf8
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'
# 默认使用‘mysql_native_password’插件认证
default_authentication_plugin=mysql_native_password
- 4:启动MySQL容器:
docker run \--name mysql8.0.28 \--privileged=true \--restart=always \-it -p 3308:3306 \-v /usr/local/mysql8/data:/var/lib/mysql \-v /usr/local/mysql8/log:/var/log/mysql \-v /usr/local/mysql8/my.conf.d/my.cnf:/etc/mysql/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 \-d mysql:8.0.28
- 5:查看mysql容器是否启动成功:
[root@centos7-sql my.conf.d]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ca41de7447ab mysql:8.0.28 "docker-entrypoint.s…" 12 seconds ago Up 11 seconds 33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp mysql8.0.28
- 6:修改密码连接模式(mysql8.0版本都要进行修改):
docker exec -it mysql /bin/bash
mysql -uroot -p'123456'
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
- 7:在MySQL中创建一个canal用户,专门用作数据同步:
create user 'canal'@'%' IDENTIFIED WITH mysql_native_password BY 'canal';GRANT all privileges ON *.* TO 'canal'@'%';FLUSH PRIVILEGES;
- 8:退出并重启MySQL容器:
docker restart mysql
docker安装canal1.1.5(版本要对应)⭐
- 1:拉取canal1.1.5镜像:
docker pull canal/canal-server:v1.1.5
- 2:运行canal容器:
docker run -p 11111:11111 --name canal \
-e canal.destinations=example \
-e canal.instance.master.address=192.168.184.123:3308 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=canal \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=security-jwt-db\\..* \
-d canal/canal-server:v1.1.5
核心说明:(只有下面的6个参数才需要我们手动根据自己情况配置,其他可以不用变)
-p 11111:11111:这是canal的默认监听端口-e canal.instance.master.address=192.168.184.123:3308:数据库地址和端口(一定要设置成你的MySQL对外暴露的IP和端口号才行)-e canal.instance.dbUsername=canal:数据库中canal用户的用户名(也就是我们之前单独创建的用户)-e canal.instance.dbPassword=canal:数据库中canal用户的密码(也就是我们之前单独创建的用户)-e canal.instance.filter.regex=security-jwt-db\\..*:要监听的表名称(我们这个配置的意思是:监听security-jwt-db数据库下的所有表)--network:输入我们刚刚创建好的自定义网络,让canal也加入到和MySQL同一个网络中去。
表名称监听支持的语法:
mysql 数据解析关注的表,Perl正则表达式.
多个正则之间以逗号(,)分隔,转义符需要双斜杠(\\)
常见例子:
1. 所有表:.* or .*\\..*
2. canal schema下所有表: canal\\..*
3. canal下的以canal打头的表:canal\\.canal.*
4. canal schema下的一张表:canal.test1
5. 多个规则组合使用然后以逗号隔开:canal\\..*,mysql.test1,mysql.test2
整合SpringBoot项目⭐
- 1:导入依赖:(这个依赖并不是alibaba官方的,而是由其他人帮我们整合了SpringBoot项目,我们只需要去导入这个依赖,再做一些简单的配置即可,非常方便!)
- 注意:canal-spring-boot-starter的1.2.1-RELEASE版本匹配的是canal的1.1.5版本(canal的新版本没有去试过,不知道有没有问题)
<!-- springboot整合canal1.1.5(因为canal-spring-boot-starter的1.2.1-RELEASE版本匹配的是canal的1.1.5版本) --><dependency><groupId>top.javatool</groupId><artifactId>canal-spring-boot-starter</artifactId><version>1.2.1-RELEASE</version></dependency>
- 2:配置canal:(application.yml)
- destination:也就是我们安装canal时执行的docker run … canal中配置的
-e canal.destinations的参数内容。 - server:配置canal所在服务器ip+端口号(默认是11111),记得修改成自己的ip地址。
- destination:也就是我们安装canal时执行的docker run … canal中配置的
#配置alibaba-canal
canal:destination: example # canal数据同步的目的地。也就是我们安装canal时配置的exampleserver: 192.168.184.123:11111 # canal的地址(canal所在服务器ip+端口号(默认是11111))
# 解决canal-spring-boot-starter一直输出日志
logging:level:top.javatool.canal.client: warn
- 3:编写实体类(这个类也就是我们要监听操作的实体类)
@TableName(value="sys_oper_log")
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Builder
public class OperationLog implements Serializable {private static final long serialVersionUID = 1L;@TableId("id")@JsonSerialize(using = ToStringSerializer.class) //解决雪花算法生成的id过长导致前端js精度丢失问题(也就是js拿到的数据和后端不一致问题)@ApiModelProperty(name = "id",value = "主键")@ExcelProperty("id")private Long id;@TableField("username")@ApiModelProperty("执行操作的用户名")@ExcelProperty("执行操作的用户名")private String username;@TableField("type")@ApiModelProperty("操作类型")@ExcelProperty("操作类型")private String type;@TableField("uri")@ApiModelProperty("访问的接口uri")@ExcelProperty("访问的接口uri")private String uri;@TableField("time")@ApiModelProperty("访问接口耗时")@ExcelProperty("访问接口耗时")private String time;@TableField("ip")@ApiModelProperty("执行操作的用户的ip")@ExcelProperty("执行操作的用户的ip")private String ip;@TableField("address")@ApiModelProperty("执行操作的用户的ip对应的地址")@ExcelProperty("执行操作的用户的ip对应的地址")private String address;@TableField("browser")@ApiModelProperty("执行操作的用户所使用的浏览器")@ExcelProperty("执行操作的用户所使用的浏览器")private String browser;@TableField("os")@ApiModelProperty("执行操作的用户所使用的操作系统")@ExcelProperty("执行操作的用户所使用的操作系统")private String os;@TableField("oper_time")@ApiModelProperty("操作时间")@ExcelProperty(value = "操作时间",converter = LocalDateTimeConverter.class)private LocalDateTime operTime;@TableLogic//逻辑删除@TableField("del_flag")@ApiModelProperty("删除标志(0代表未删除,1代表已删除)")@ExcelProperty(value = "删除标志",converter = DelFlagConverter.class)private Integer delFlag;}
- 4:创建一个中转类(也就是说我们报错的原因是OperationLog类中的LocalDateTime属性,这个时候我们可以创建一个新的类,其他字段不变,把这个LocalDateTime日期类变成String就可以解决这个bug)
- 原因:(这是由于canal+SpringBoot中的StringConvertUtil类的源码的问题):
- 可以看到下面的源码没有对LocalDateTime转LocalDatetime进行处理,而是把LocalDateTime转为String类型进行返回(问题出在
type.equals(java.sql.Date.class) ? parseDate(columnValue) : columnValue),而columnValue是String类型,所以我们可以用String类型去接收LocalDateTime类型。
- 可以看到下面的源码没有对LocalDateTime转LocalDatetime进行处理,而是把LocalDateTime转为String类型进行返回(问题出在
- 原因:(这是由于canal+SpringBoot中的StringConvertUtil类的源码的问题):
package com.boot.entity;import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.boot.converter.DelFlagConverter;
import com.boot.converter.LocalDateTimeConverter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import javax.persistence.Column;
import java.io.Serializable;
import java.time.LocalDateTime;/*** 操作日志canal中转类。解决OperationLog类中的LocalDatetime类型的字段无法被canal接收导致报错** @author youzhengjie* @date 2022/10/30 21:16:54*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
@Builder
public class OperationLogCanal implements Serializable {private static final long serialVersionUID = 1L;private Long id;private String username;private String type;private String uri;private String time;private String ip;private String address;private String browser;private String os;//canal+springboot当属性名和数据库字段不一致时,要用@Column去指定数据库字段名,否则会接收不到canal数据@Column(name = "oper_time")private String operTime;//canal+springboot当属性名和数据库字段不一致时,要用@Column去指定数据库字段名,否则会接收不到canal数据@Column(name = "del_flag")private Integer delFlag;}
- 5:OperationLogService
package com.boot.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.boot.entity.OperationLog;import java.util.List;/*** 操作日志服务** @author youzhengjie* @date 2022/10/21 23:32:14*/
public interface OperationLogService extends IService<OperationLog> {long selectAllOperationLogCount();/*** 添加操作日志到elasticsearch** @param operationLog 操作日志* @return boolean*/boolean addOperationLogToEs(OperationLog operationLog);/*** 根据id删除elasticsearch中的操作日志** @param id id* @return boolean*/boolean deleteOperationLogToEs(Long id);/*** 更新elasticsearch中的操作日志** @param operationLog 操作日志* @return boolean*/boolean updateOperationLogToEs(OperationLog operationLog);}
- 6:OperationLogServiceImpl
package com.boot.service.impl;import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.boot.entity.OperationLog;
import com.boot.mapper.OperationLogMapper;
import com.boot.service.OperationLogService;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.core.CountRequest;
import org.elasticsearch.client.core.CountResponse;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 操作日志服务impl** @author youzhengjie* @date 2022/10/21 23:42:49*/
@Service
@Slf4j
public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements OperationLogService {@Autowiredprivate OperationLogMapper operationLogMapper;@Autowiredprivate RestHighLevelClient restHighLevelClient;/*** 操作日志的es索引*/private static final String OPER_LOG_INDEX="operation-log-index";@Overridepublic boolean addOperationLogToEs(OperationLog operationLog) {try {IndexRequest indexRequest = new IndexRequest(OPER_LOG_INDEX);indexRequest.id(operationLog.getId().toString());Map<String, Object> sources = new ConcurrentHashMap<>();sources.put("username", operationLog.getUsername());sources.put("type", operationLog.getType());sources.put("uri", operationLog.getUri());sources.put("time", operationLog.getTime());sources.put("ip", operationLog.getIp());sources.put("address",operationLog.getAddress());sources.put("browser", operationLog.getBrowser());sources.put("os", operationLog.getOs());sources.put("operTime", operationLog.getOperTime());sources.put("delFlag", operationLog.getDelFlag());indexRequest.source(sources);restHighLevelClient.index(indexRequest,RequestOptions.DEFAULT);return true;}catch (Exception e){e.printStackTrace();return false;}}@Overridepublic boolean deleteOperationLogToEs(Long id) {try {DeleteRequest deleteRequest = new DeleteRequest(OPER_LOG_INDEX);deleteRequest.id(id.toString());restHighLevelClient.delete(deleteRequest,RequestOptions.DEFAULT);return true;}catch (Exception e) {e.printStackTrace();return false;}}@Overridepublic boolean updateOperationLogToEs(OperationLog operationLog) {try {//将operationLog封装成MapMap<String,Object> operationLogMap=new ConcurrentHashMap<>();//将operationLog拷贝到Map中BeanUtil.copyProperties(operationLog,operationLogMap);//把map中的id去掉operationLogMap.remove("id");String idStr = operationLog.getId().toString();UpdateRequest updateRequest = new UpdateRequest(OPER_LOG_INDEX,idStr);updateRequest.doc(operationLogMap);restHighLevelClient.update(updateRequest,RequestOptions.DEFAULT);return true;}catch (Exception e){e.printStackTrace();return false;}}}
- 7:创建一个canal监听类(非常核心),指定监听一个表(这里我监听的是sys_oper_log表):
package com.boot.canal;import cn.hutool.core.bean.BeanUtil;
import com.boot.entity.OperationLog;
import com.boot.entity.OperationLogCanal;
import com.boot.service.OperationLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;/*** 操作日志canal处理器** @author youzhengjie* @date 2022/10/30 15:19:09*/
@CanalTable("sys_oper_log") //@CanalTable("sys_oper_log"):指定canal监听的表名为sys_oper_log
@Component
@Slf4j
public class OperationLogCanalHandle implements EntryHandler<OperationLogCanal> {@Autowiredprivate OperationLogService operationLogService;@Overridepublic void insert(OperationLogCanal operationLogCanal) {//编写mysql和缓存同步的逻辑(例如JVM本地缓存、Redis分布式缓存、es等)OperationLog operationLog = new OperationLog();//bean拷贝BeanUtil.copyProperties(operationLogCanal,operationLog);//同步到es中operationLogService.addOperationLogToEs(operationLog);log.warn("OperationLogCanalHandle->insert->开始同步->"+operationLog);}/*** 更新** @param before 之前* @param after 之后*/@Overridepublic void update(OperationLogCanal before, OperationLogCanal after) {//编写mysql和缓存同步的逻辑(例如JVM本地缓存、Redis分布式缓存、es等)OperationLog operationLog = new OperationLog();//注意:要拷贝after对象,这个对象是修改之后的对象BeanUtil.copyProperties(after,operationLog);//同步esoperationLogService.updateOperationLogToEs(operationLog);log.warn("OperationLogCanalHandle->update->开始同步->"+operationLog);}@Overridepublic void delete(OperationLogCanal operationLogCanal) {//编写mysql和缓存同步的逻辑(例如JVM本地缓存、Redis分布式缓存、es等)Long id = operationLogCanal.getId();//同步esoperationLogService.deleteOperationLogToEs(id);log.warn("OperationLogCanalHandle->delete->开始同步->"+id);}
}
相关文章:
SpringBoot快速整合canal1.1.5(TCP模式)
SpringBoot快速整合canal1.1.5(TCP模式) 安装并配置MySQL主从⭐ 1:Docker安装MySQL8.0.28 docker pull mysql:8.0.282:创建目录: mkdir -p /usr/local/mysql8/data mkdir -p /usr/local/mysql8/log mkdir -p /usr/…...
docker打包container成image,然后将image上传到docker hub
第一步:停止正在运行的容器 docker stop <container_name> eg: docker stop xuanjie_mlir 第二步:将对应的container打包成image docker commit <container_id> <镜像名:版本> eg:docker commit 005672e6d97a…...
设计模式—创建型模式之原型模式
设计模式—创建型模式之原型模式 原型模式(Prototype Pattern)用于创建重复的对象,同时又能保证性能。 本体给外部提供一个克隆体进行使用。 比如我们做一个SjdwzMybatis,用来操作数据库,从数据库里面查出很多记录&…...
Zygote进程通信为什么用Socket而不是Binder?
Zygote进程是Android系统中的一个特殊进程,它在系统启动时被创建,并负责孵化其他应用进程。它的主要作用是预加载和共享应用进程的资源,以提高应用启动的速度。 在Android系统中,常用的进程通信方式有以下几种: Intent…...
API接口加密,解决自动化中登录问题
一、加密方式 AES:对称加密,快RAS:非对称加密,慢AESRAS:安全高效 加密过程:字符串》字节流》加密的字节流(算法),解密有可能出现乱码,所以不能直接转成字符…...
COCOS2DX3.17.2 Android升级targetSDK30问题解决方案
一、luajit不兼容问题 不兼容版本:【2.1.0-bate2、2.1.0-bate3都存在异常】 出问题系统:Android11;Android10的系统部分机型有问题,部分机型正常 异常点1:c调用lua接口,pushObjiect的时候crash 异常点2…...
HarmonyOS鸿蒙原生应用开发设计- 隐私声明
HarmonyOS设计文档中,为大家提供了独特的隐私声明,开发者可以根据需要直接引用。 开发者直接使用官方提供的隐私声明内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可以防止使用别人的内容产生的侵权意外情况等ÿ…...
【面试精选】00后卷王带你三天刷完软件测试面试八股文
前言 本人普通本科计算机专业,做测试也有3年的时间了,讲下我的经历,我刚毕业就进了一个小自研薪资还不错,有10.5k(个人觉得我很优秀),在里面呆了两年,积累了一些的经验和技能&#…...
k-means算法c++实现
计算数据集中的元素与各个簇的中心的距离,将它赋给最近的簇,然后重新计算每个簇的平均值,再将元素按离平均值点最近的原则重新分配直到没有出现重新分配 该算法要事先给出k的值,即划分为几个簇。 vector<int> datoclu(dat…...
oracle查询哪些用户下有表
oracle查询哪些用户下有表,排除系统用户。 在实际业务中 oracle数据库中创建了很多的用户 但实际都是无表的,利用SQL语句将这些有表的用户查询出来 并显示用户名、表名、创建表的时间等信息。 select * from dba_objects where object_type = TABLE and owner not in ( AN…...
机器人连杆惯量参数辨识(估计)
杆的转动惯量的计算公式是Imr^2。在经典力学中,转动惯量(又称质量惯性矩,简称惯矩)通常以I 或J表示,SI 单位为 kgm。对于一个质点,I mr,其中 m 是其质量,r 是质点和转轴的垂直距离。…...
一座 “数智桥梁”,华为助力“天堑变通途”
《水调歌头游泳》中的一句话,“一桥飞架南北,天堑变通途”,广为人们所熟知,其中展现出的,是中国人对美好出行的无限向往。 天堑变通途从来不易。 中国是当今世界上交通运输最繁忙、最快捷的国家之一,交通行…...
C#知识总结 基础篇(上)
本篇内容参考C#图解教程 本篇内容偏向基础,适合0基础的朋友快速上手,也适合有一定C语言(或其他语言如C,java)基础的人快速上手C#。同时适合unity引擎的初学者,更加详细的了解C#语言。 本文内容基本涵盖C#基础内容&am…...
照片编辑软件Affinity Photo 2 for Mac v2.1.1中文激活版 2024年最新中文版下载
照片编辑软件Affinity Photo 2 for Mac v2.1.1中文激活版是一款功能强大的专业级图像编辑软件,由Serif公司开发。它提供了广泛的工具和功能,适用于摄影师、设计师和艺术家。 照片编辑软件Affinity Photo 2 for Mac v2.1.1中文激活版软件介绍 TIFF&#…...
TPAMI 2023 | Temporal Perceiver:通用时序边界检测方法
本文介绍一下今年我们组被T-PAMI 2023收录的时序边界检测工作 Temporal Perceiver: A General Architecture for Arbitrary Boundary Detection。 论文名称: Temporal Perceiver: A General Architecture for Arbitrary Boundary Detection 论文链接&…...
Unity-UV展开工具
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class unfold : EditorWindow {[MenuItem("Gq_Tools/展开")]public static void ShowWin(){EditorWindow.CreateInstance<unfold>().Show();}priva…...
springboot actuator jvm监控丢失
1、背景 系统接入了监控prometheus和grafana,某天grafana突然发现只有几台机器可以看到指标。 随便点击一个地址http://192.168.0.76:8681/lms/actuator/prometheus访问指标,发现JVM相关指标全部丢失 2、解决方法 从网上查找相关资料,逐一…...
UDP服务端和客户端通信代码开发流程
一、UDP通信 TCP:传输控制协议,面向连接的,稳定的,可靠的,安全的数据集流传递 稳定和可靠:丢包重传 数据有序:序号和确认序号 流量控制:稳定窗口 UDP:用户数据报协议 面向无连接的,不稳定的,不可靠,不安…...
数据库实验:SQL的数据定义与单表查询
目录 实验目的实验内容实验要求实验过程实验步骤实例代码结果示意 数据库的实验,对关系型数据库MySQL进行一些实际的操作 实验目的 (1) 掌握DBMS的数据定义功能 (2) 掌握SQL语言的数据定义语句 (3) 掌握RDBMS的数据单表查询功能 (4) 掌握SQL语言的数据单表查询语句…...
P3398 仓鼠找 sugar
Portal. LCA。 询问树上两条路径是否有交点。 画图发现无非两种情况: 发现一条路径的起点和终点的 LCA 经过另一条路径,是两路径相交的充要条件。 考虑如何判断这个 LCA 在不在路径上。若 d ( s , LCA ) d ( LCA , t ) d ( s , t ) d(s,\text{LCA…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
