PS消除一些痕迹

目录 一.目的: 1.如图所示,想消除黑色、红色痕迹 二.实操(成功) 一.目的: 1.如图所示,想消除黑色、红色痕迹 二.实操(成功) 如视频所示,先点击拾色器点击需要修改地方边上的颜色,然后进行涂改; 其中技巧 alt快速出现拾色器右键出现画笔的大小ctrl加上“+”“-”进行图片放大缩小 最终,如图所示,改掉了最左边的红色线条

【王道数据结构】二叉树创建、遍历及线索化

一、二叉树层次建树及遍历(先序中序后序及层序遍历) function.h文件 / // Created by 斋心 on 2023/5/22. // #ifndef TREE_FUNCTION_H #define TREE_FUNCTION_H #include<stdio.h> #include<stdlib.h> typedef char BiElemType; //二叉树结构体类型申明 typedef struct BiTNode{ BiElemType c;//结点数据 struct BiTNode *lchild;//结点左孩子指针 struct BiTNode *rchild;//结点右孩子指针 }BiTNode,*BiTree; //创建二叉树辅助队列结构体类型申明 typedef struct tag{ BiTree p; //辅助队列的结点数据是二叉树结点地址(指针) struct tag *pnext; }tag_t,*ptag_t; //队列(链式队列)结点的结构体类型申明 typedef BiTree ElemType; //存储树节点的指针 typedef struct LinkNode{ ElemType data; struct LinkNode *next; }LinkNode; //链表结点结构类型申明 //层次遍历二叉树辅助队列结构体类型申明 typedef struct{ LinkNode *front,*rear; //链表头,链表尾 }LinkQueue; //先进先出,从队尾入队,队头出队 //申明要在main.cpp中使用的queue函数 void InitQueue(LinkQueue &Q); void EnQueue(LinkQueue &Q,ElemType x); bool DeQueue(LinkQueue &Q,ElemType &m); bool IsEmpty(LinkQueue Q); #endif //TREE_FUNCTION_H queue.

ARM架构(嵌入式概念)

文章目录 前言一、MCU和MPU介绍和区别二、嵌入式硬件结构与启动三、RAM和ROM总结 前言 本篇文章开始带大家深入学习ARM架构,深入的学习ARM架构可以帮助我们深入的了解到最核心的内容,并且增强我们的底层思维能力。 一、MCU和MPU介绍和区别 MCU(Microcontroller Unit,微控制器单元)和MPU(Microprocessor Unit,微处理器单元)是嵌入式系统中常见的两种处理器类型,它们有一些相似之处,但也存在一些区别。 MCU(Microcontroller Unit): MCU是一种完整的计算机系统集成在一颗芯片上,包括处理器核心(通常是微处理器)、存储器(如闪存和RAM)、输入/输出接口(如GPIO、UART、SPI等)、定时器、模拟电路(如ADC、DAC等)和其他外设。它主要用于嵌入式系统,如家电、汽车电子、智能设备等,通常有较低的功耗和较小的体积。MCU往往具有较低的成本,可裸片运行,且通常能够自带固件(如引导加载程序)。 MPU(Microprocessor Unit): MPU是计算机系统中的主处理器单元,通常是一颗独立的芯片,它执行所有计算、控制和处理任务。MPU通常配备与它一起工作的外部存储器(如RAM、ROM、闪存)和外部设备(如输入/输出接口、硬盘、网络接口等)。MPU的处理能力较强,适用于需要大量数据处理和高性能计算的应用,如个人电脑、服务器、嵌入式Linux系统等。 区别: 1.集成度和外设:MCU是在单个芯片上集成了处理器核心、存储器和外设,而MPU通常需要外部芯片来提供存储器和外设。MCU在集成度方面更高。 2.功耗和成本:由于MCU通常用于功耗敏感的嵌入式系统,它们通常具有较低的功耗,并且成本相对较低。MPU则更适用于需要高性能和较高功耗的应用。 3.处理能力:MPU拥有更强大的处理能力,适用于需要复杂计算和大量数据处理的任务。MCU的处理能力相对较弱,适用于较简单的嵌入式应用。 总的来说,MCU和MPU都是用于嵌入式系统的处理器,但其设计目标、特点和适用范围有所不同。在选择时,需要根据具体应用的需求,考虑功耗、成本、性能要求等因素来选择适合的处理器类型。 二、嵌入式硬件结构与启动 在ARM架构中,ROM(Read-Only Memory,只读存储器)通常包含用于启动设备的固件程序,例如引导加载程序(Bootloader)。ROM中的程序负责在系统电源打开或复位时进行初始化,并选择设备的启动方式。 下面是ARM从ROM中读取程序进行选择设备启动方式的基本过程: 1.上电/复位:当系统上电或者复位时,处理器开始执行从ROM的起始地址处开始的指令。 2.ROM载入:处理器从ROM中读取初始的引导加载程序代码。 3.引导加载程序执行:引导加载程序是一个小型的固件程序,负责初始化系统硬件,包括外设和内存控制器。它还负责加载并运行操作系统或其他应用程序。 4.设备启动方式选择:引导加载程序的一个重要功能是决定设备的启动方式。根据具体的实现和设备的配置,引导加载程序可以通过不同的方式选择启动方式。这些启动方式可以包括从不同的存储设备(如闪存、SD卡、网络等)加载操作系统镜像,或者从其他引导设备(如串口、USB等)接收启动命令。 5.加载操作系统:引导加载程序根据选择的启动方式,从适当的存储设备中加载操作系统镜像到内存中。 6.跳转到操作系统:引导加载程序将控制权转移到已经加载的操作系统的入口点,操作系统接管处理器,并开始执行其自己的初始化和启动过程。 三、RAM和ROM 在ARM架构中,RAM(Random Access Memory,随机访问存储器)和ROM(Read-Only Memory,只读存储器)是常见的存储器类型,用于存储和处理数据、指令和程序。 RAM(随机访问存储器): RAM是一种易于写入和读取数据的临时存储器。在ARM系统中,RAM通常用于存储正在执行的程序、变量、堆栈和其他临时数据。RAM是易失性存储器,意味着在断电或复位后数据将丢失。它具有较快的读写速度和随机访问的能力,适用于需要快速读写和频繁访问的数据和指令。RAM在ARM系统中通常分为不同的级别,如L1缓存、L2缓存和系统内存。 ROM(只读存储器): ROM是一种只读的存储器,其中存储的数据在制造过程中被写入,并且在正常使用情况下不能被修改。在ARM系统中,ROM通常包含固化的引导加载程序(Bootloader)或其他不变的固件程序。ROM被用于存储启动代码、初始化程序和设备固件等不易改变的数据和指令。ROM可以提供始终可靠和可用的引导代码,即使在系统断电或异常情况下也能正常运行。 需要注意的是,随着技术的进步,现在的ROM已经演变为可以被修改的存储介质,例如闪存(Flash Memory)。闪存既可以作为只读存储器(例如存储固件程序),又可以作为可写存储器(用于存储数据和应用程序)。闪存具有较大的容量、较高的存储密度和非易失性的特点,广泛用于嵌入式系统中。 总结: RAM和ROM在ARM架构中扮演着不同的角色。RAM用于存储临时数据、程序和堆栈,具有较快的读写速度。ROM用于存储引导加载程序和其他固件程序,其内容在制造过程中被写入,很难修改。闪存则是一种可读可写的存储介质,适用于存储固件、数据和应用程序。这些存储器类型在ARM系统中协同工作,为设备的运行和存储提供必要的支持。 总结 本篇文章就讲解到这里,下篇文章开始我们讲解使用寄存器点亮一个LED灯。

FOC-滑膜控制器SMC/滑膜观测器SMO

目录 前面 滑膜速度控制器 控制器所处位置 理论设计 模型搭建 滑膜观测器 基本原理 反正切函数 锁相环 滑膜观测器模型(反正切) 滑膜观测器C代码实现 SMO.c SMO.h 前面 滑膜常见用处有两个: 1、作为滑膜控制器SMC,对速度进行直接控制 2、作为滑膜观测器SMO,获取电机角度与转速信息 滑膜速度控制器 SMC叫滑膜控制(Sliding Mode Contral) 三相PMSM是一个非线性、强耦合的多变量控制系统,对于外界的扰动或者电机自身的参数发生变化时,传统的PI控制并不能满足实际的要求。因此可以引入滑模控制SMC,它对扰动和参数不敏感,响应速度也够快。 控制器所处位置 该模型在整个控制系统中的位置: 输入是:参考转速与实际转速的误差。 输出是:Iq轴PI调节的输入。 理论设计 滑模控制其设计如下: 重点关注最后一个公式就可以。 模型搭建 公式可以转换为模型: 其中这三个属于滑模控制器关键参数: 转速:0.2秒时加载,可快速恢复到参考转速值1000。 电磁转矩 滑膜观测器 SMO叫滑膜观测器(Sliding Mode Observer),用于获取转子位置信息与转速信息。 在整个控制系统中所处的位置: 基本原理 该方法基于给定电流与反馈电流之间的误差来设计滑膜观测器,并通过该误差重构电机的反电动势,估算转子位置。 简单来说就是,滑膜观测器就是通过采样与坐标变换得到的Ualpha,Ubeta,Ialpha,Ibeta四个参数值,获取扩展反电动势Ealpha、Ebeta的值。 之后则是需要想办法通过反电动势值,来获取转子的位置角θ:常见办法有反正切函数、PLL锁相环。同理也可同时获得转速估计值。 反正切函数 转子的位置角: 转速估计值: 锁相环 滑膜观测器模型(反正切) 整体模型: 滑膜观测器总模型: 滑膜观测器获取反电动势模型: 反正切函数模型获取转子位置与速度信息: 转子位置 实际值与估计值: 转子速度 实际值与估计值: 滑膜观测器C代码实现 SMO.c #include "Sensorless_SMO.h" #include "IQ_math.h" #define PI 3.14159265358979 extern Angle_SMO Angle_SMOPare ; extern Speed_est Speed_estPare ; extern SMO_Motor SMO_MotorPare ; extern IQAtan IQAtan_Pare; //这段代码实现了角度估计的计算过程,其中包括滑模位置观测器的更新、电流误差的计算、滑动控制量的计算和反电势的估计 void Angle_Cale(p_Angle_SMO pV) { /* Sliding mode current observer */ pV->EstIalpha = _IQmpy(pV->Fsmopos,pV->EstIalpha) + _IQmpy(pV->Gsmopos,(pV->Valpha-pV->Ealpha-pV->Zalpha)); pV->EstIbeta = _IQmpy(pV->Fsmopos,pV->EstIbeta) + _IQmpy(pV->Gsmopos,(pV->Vbeta -pV->Ebeta -pV->Zbeta )); /* Current errors */ pV->IalphaError = pV->EstIalpha - pV->Ialpha; pV->IbetaError = pV->EstIbeta - pV->Ibeta; /* Sliding control calculator */ /* pV->Zalpha=pV->IalphaError*pV->Kslide/pV->E0) where E0=0.

vue3+ts 节流防抖全局使用

1.在utils下创建一个ts文件夹 随便你叫什么 。 import { ref, watchEffect } from 'vue'; export const useThrottleDebounce = () => { const throttleTimer = ref<any>(null); const debounceTimer = ref<any>(null); const throttle = (fn: Function, delay = 500) => { if (throttleTimer.value) { return; } throttleTimer.value = setTimeout(() => { fn(); throttleTimer.value = null; }, delay); }; const debounce = (fn: Function, delay = 500) => { clearTimeout(debounceTimer.value); debounceTimer.value = setTimeout(() => { fn(); }, delay); }; const clearThrottle = () => { clearTimeout(throttleTimer.

vue路由配置公共布局layout

本篇实现三段式界面 公共布局文件 首先在src下新建layoutPc文件夹,再给layoutPc新建组件 header 、bottm、main三个文件基本确定了一个页面的基本架子,然后再新建一个index.vue文件 comment/AppMain.vue <template> <section class="app-main"> <transition name="fade-transform" mode="out-in"> <keep-alive > <router-view v-if="!$route.meta.link" :key="key" /> </keep-alive> </transition> <iframe-toggle /> </section> </template> <script> export default { name: 'AppMain', components: { }, computed: { key() { return this.$route.path } } } </script> bootom/index.vue <template> <div class="bottom-wrapper"> <el-row> <el-col :span="8"> <div> 友情链接 </div> </el-col> <el-col :span="8"> <p>© {{ new Date().getFullYear() }} </p> <div> <div class="web-title"> <svg-icon icon-class="web" size="1.1875rem"></svg-icon> 网站资讯 </div> </div> </el-col> <el-col :span="

SpringBoot学习笔记

文章目录 SpringBoot一、SpringBoot简介1.1 SpringBoot的概述 二、SpringBoot快速入门2.1 快速入门案例2.2 SpringBoot工程热部署2.3 使用idea快速创建SpringBoot项目 三、SpringBoot原理分析3.1 起步依赖原理分析3.2 自动配置原理解析3.2.1 原web.xml的中配置3.2.2 @SpringBootApplication注解3.2.3 举例自动配置 四、SpringBoot的配置文件4.1 SpringBoot配置文件类型4.2 application\*.yml配置文件4.3 配置文件与配置类的属性映射方式4.3.1 @ConfigurationProperties注解4.3.2 使用注解@Value映射 五、SpringBoot与整合其他技术5.1 SpringBoot整合Mybatis5.2 SpringBoot整合Junit5.3 SpringBoot整合Spring Data JPA5.3.1 Spring Data JPA 简介5.3.2 Spring Data JPA 的使用 5.4 SpringBoot整合Redis5.5 SpringBoot整合定时任务5.5.1 SpringBoot整合定时任务5.5.2 corn表达式 5.6 SpringBoot整合Thymeleaf SpringBoot 以前学习SpringBoot时所做的笔记,发在这里是为了方便自己翻阅,不喜勿喷。 一、SpringBoot简介 1.1 SpringBoot的概述 什么是Spring Boot Spring Boot 是所有基于 Spring Framework 5.0 开发的项目。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序,并且尽可能减少你的配置文件。设计目的: 用来简化 Spring 应用的初始搭建以及开发过程。 从最根本上来讲,Spring Boot 就是一些库的集合,它能够被任意项目所使用,它使用 “习惯优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置)的理念让你的项目快速运行起来。spring boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 maven 整合了所有的 jar 包,spring boot 整合了所有的框架,总结一下及几点: 为所有 Spring 开发提供一个更快更广泛的入门体验。零配置,无冗余代码生成和XML 强制配置,遵循“约定大于配置” 。集成了大量常用的第三方库的配置, Spring Boot 应用为这些第三方库提供了几乎可以零配置的开箱即用的能力。提供一系列大型项目常用的非功能性特征,如嵌入服务器等。 SpringBoot的特点

C#异常总结

C#异常总结 定义Try语句异常类创建用户自定义异常搜索调用栈的示例异常抛出 定义 程序中的运行时错误,它违反一个系统约束或应用程序约束,或出现了在正常操作时未预料的情形。 Try语句 指明被异常保护的代码块,并提供代码以处理异常。try由三部分组成:try…catch finally. try:包含正被异常保护的代码 catch:含有一个或多个catch子句,这些是处理异常的代码块,也叫做异常处理程序 finally:含有在所有情况下都要被执行的代码,无论有没有异常发生 异常类 BCL定义了许多类,每一个类代表一个指定的异常类型,当一个异常发生时,CLR: 创建该类型的异常对象寻找适当的catch子句以处理 它 所有异常类都从根本上派生自system.exception类,异常继承层次如下 异常类类型包括:基类:System.Exception;系统级异常:System.SystemException;应用程序级异常:System.ApplicationException。 (1).由System.SystemException派生的异常类型: System.AccessViolationException在试图读写受保护内存时引发的异常。System.ArgumentException在向方法提供的其中一个参数无效时引发的异常。System.Collections.Generic.KeyNotFoundException指定用于访问集合中元素的键与集合中的任何键都不匹配时所引发的异常。System.IndexOutOfRangeException访问数组时,因元素索引超出数组边界而引发的异常。System.InvalidCastException因无效类型转换或显示转换引发的异常。System.InvalidOperationException当方法调用对于对象的当前状态无效时引发的异常。System.InvalidProgramException当程序包含无效Microsoft中间语言(MSIL)或元数据时引发的异常,这通常表示生成程序的编译器中有bug。System.IO.IOException发生I/O错误时引发的异常。System.NotImplementedException在无法实现请求的方法或操作时引发的异常。System.NullReferenceException尝试对空对象引用进行操作时引发的异常。System.OutOfMemoryException没有足够的内存继续执行程序时引发的异常。System.StackOverflowException挂起的方法调用过多而导致执行堆栈溢出时引发的异常。 (2).由System.ArgumentException派生的异常类型: System.ArgumentNullException当将空引用传递给不接受它作为有效参数的方法时引发的异常。System.ArgumentOutOfRangeException当参数值超出调用的方法所定义的允许取值范围时引发的异常。 (3).由System.ArithmeticException派生的异常类型: System.DivideByZeroException试图用零除整数值或十进制数值时引发的异常。System.NotFiniteNumberException当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常。System.OverflowException在选中的上下文中所进行的算数运算、类型转换或转换操作导致溢出时引发的异常。 (4).由System.IOException派生的异常类型: System.IO.DirectoryNotFoundException当找不到文件或目录的一部分时所引发的异常。System.IO.DriveNotFoundException当尝试访问的驱动器或共享不可用时引发的异常。System.IO.EndOfStreamException读操作试图超出流的末尾时引发的异常。System.IO.FileLoadException当找到托管程序却不能加载它时引发的异常。System.IO.FileNotFoundException试图访问磁盘上不存在的文件失败时引发的异常。System.IO.PathTooLongException当路径名或文件名超过系统定义的最大长度时引发的异常。 (5).其他常用异常类型: ArrayTypeMismatchException试图在数组中存储错误类型的对象。BadImageFormatException图形的格式错误。DivideByZeroException除零异常。DllNotFoundException找不到引用的dll。FormatException参数格式错误。MethodAccessException试图访问私有或者受保护的方法。MissingMemberException访问一个无效版本的dll。NotSupportedException调用的方法在类中没有实现。PlatformNotSupportedException平台不支持某个特定属性时抛出该错误。 创建用户自定义异常 自定义的异常类派生自ApplicationException类 class Program { static void Main(string[] args) { //用户自定义的异常类是派生自ApplicationException类 Temperture temp = new Temperture(); try { temp.showTemp(); } catch(TempIsZeroException e) { Console.WriteLine("TempIsZeroException:{0}", e.Message); } Console.ReadKey(); } } //创建自定义异常 public class TempIsZeroException:ApplicationException { public TempIsZeroException(string message):base(message) { } } public class Temperture { int temperature = 0; public void showTemp() { if(temperature==0) { throw (new TempIsZeroException("

高性能linux服务构建 2网络安全运维

1 网络实时流量监测工具iftop 1.1 功能 检测网卡流量,端口信息,精确检测网络中各主机情况,反向解析ip 流量异常检测也很ok 1.2 安装 (1)下载包 需解压然后编译 yum install libpcap libpcap-devel ncurses ncurses-devel yum install fl ex byacc (2)下载源码 wget https://... 解压 tar zxcf ... cd /iftop-0.17; cd ./configure 编译 make; make install 还要装各epel-release就ok了 1.3 使用 iftop -P -i ens33 2 ntopng 用途 相比于iftop,可以不仅查看本主机端口流量发收情况,还可以看到主机和其他主机网络通信信息 2.1 安装 apt install ntopng 安装完chown nobody -R /var/log/ntopng,否则ntopng服务无法在此路径创日志 2.2 使用 登录http://127.0.0.1:3000查看网络信息 3 网络性能评估工具iperf 3.1 用途 可以评估网络性能,比如如果哪里带宽或其他性能没设计好,可通过此工具看出问题 3.2 安装 apt install iferf

信号与系统复习笔记——通讯系统

信号与系统复习笔记——通讯系统 复指数与正弦幅度调制 y ( t ) = x ( t ) c ( t ) y(t) = x(t)c(t) y(t)=x(t)c(t) 上式称为调制,其中 x ( t ) x(t) x(t) 称为 调制信号 ,而 c ( t ) c(t) c(t) 称为 载波信号 , y ( t ) y(t) y(t) 称为 已调信号 。 调制 的目的就是将低频信号搬运到高频信号中进行传输。 复指数载波的幅度调制 幅度调制通常有两种形式,一种是复指数的: c ( t ) = e j ( ω c t + θ c ) c(t) = e^{j(\omega_c t+\theta_c)} c(t)=ej(ωc​t+θc​)

Hackbar插件安装

一:hackbar插件简介 Hackbar是一款基于浏览器的简单的安全审计或者说是渗透测试工具,能够帮助测试人员测试sql注入,XSS漏洞和站点安全性,帮助开发人员对其代码进行安全审计。 功能介绍: 二:安装(以Chrome浏览器为例) 方式1:下载安装包进行安装 下载安装包之后,打开浏览器 —> 自定义及控制(最右边三个点) —> 更多工具 —> 扩展程序 打开开发者模式,将安装包直接拖拽到浏览器的扩展程序中。 这里需要注意的是所下载的hackbar的版本,目前网上大多数下载的是2.1.3版本(解压安装时显示为2.2.6版本)。 注意:不能直接将安装包拖拽至浏览器,否则出现: 出现这个问题的原因主要是没有解压内部的.crx文件,需将.crx文件的后缀改为.rar或.zip,再进行解压。(若安装包内有一个和.crx文件一样的.rar或.zip文件,则直接解压即可) 将安装包拖拽到浏览器的扩展程序之后,查看浏览器右上角是否出现图标,出现则表示插件安装成功,但并未激活。 激活方式 方式1: 点击详细信息,然后自动跳转,点击来源下的链接。 既进入到hackbar插件的安装文件目录中,在解压出来的文件中(原.crx文件-2.1.3版本)找到theme/js,打开js文件之后找到hackbar-panel.js文件。 打开hackbar-panel.js文件,将文件中的三处disable_hackbar( )函数替换为 init( ), 保存。 方式2: 同样点击来源,进入到hackbar插件的安装文件目录中,在解压出来的文件中(原.crx文件-2.1.3版本)找到theme/js,打开js文件之后找到hackbar-panel.js文件。将文件中代码: “license_ok = false” 改成 “license_ok = true”。 使用页面: 注意:若在安装之前将安装文件内容按上述方式更改,在安装之后且将安装文件删除,则需在插件内找到ID,同时在主机上根据目录:C:\Users\用户名\AppData\Local\Google\Chrome\User Data\Default\code cache\js中,找到与Id号一致的文件进行更改。 方式2:在浏览器自带的应用商店下载 直接进入浏览器自带的应用商店下载即可。 二:注意事项 1:必须关闭hack.bar自动更新功能(因为hack.bar自动升级到定版本之后需要收费) 2:安装后出现如图现象:Please enter your license to use hackbar。 解决方案:下载较低版本的hack.bar(2.1.3版本),并关闭自动更新功能。 下载安装过程: 第一步:前往github下载2.1.3版本,(下载地址:https://github.com/Mr-xn/hackbar2.1.3) 第二步:将文件解压,得到hackbar2.1.3-master文件。 第三步:打开浏览器(Firefox),进入“扩展与主题”,点击寻“找更多附加组件”搜索框下方的按钮,选择“从文件安装附加组件”。 第四步:找到已经解压的hackbar文件,选择下图框中文件,即可安装成功。 第五步:关闭自动更新功能。在扩展管理模块点击已经安装的hackbar插件,找到“允许自动更新”模块,选择“关”。

【Flask】SQLAlchemy

文章目录 SQLAlchemy是什么为什么使用orm定义安装组成部分SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件 SQLAlchemy的使用原生sql使用orm映射数据表 外键关系一对多(ForeignKey)多对多 使用orm操作记录简单表操作基于scoped_session实现线程安全 CRUD基础操作进阶操作 Flask集成sqlalchemy构建模型类常用的字段类型常用的字段选项增查改先查询, 再更新基于过滤条件的更新 (推荐方案) 删先查询, 再删除基于过滤条件的删除 (推荐方案) SQLAlchemy是什么 为什么使用orm 优点 有语法提示, 省去自己拼写SQL,保证SQL语法的正确性orm提供方言功能(dialect, 可以转换为多种数据库的语法), 减少学习成本防止sql注入攻击搭配数据迁移, 更新数据库方便面向对象, 可读性强, 开发效率高 缺点 需要语法转换, 效率比原生sql低复杂的查询往往语法比较复杂 (可以使用原生sql替换) 定义 SQLAlchemy是一个基于Python实现的ORM框架。该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数据API执行SQL并获取执行结果。 安装 pip3 install sqlalchemy 组成部分 Engine,框架的引擎Connection Pooling ,数据库连接池Dialect,选择连接数据库的DB API种类Schema/Types,架构和类型SQL Exprression Language,SQL表达式语言 SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件 MySQL-Python mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname> pymysql mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>] MySQL-Connector mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname> cx_Oracle oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 更多:http://docs.sqlalchemy.org/en/latest/dialects/index.html SQLAlchemy的使用 原生sql from sqlalchemy import create_engine from sqlalchemy.engine.base import Engine from urllib import parse import threading user = "

【Java】Java中的泛型

文章目录 一、泛型1.1 泛型的概念1.2 为什么要有泛型 二、泛型类2.1 基本语法2.2 使用示例2.3 类型推导2.4 裸类型 三、泛型的编译机制3.1 擦除机制3.2 为什么不能实例化泛型类型数组 四、泛型的上界五、泛型方法六、通配符通配符的作用通配符的上界和下界 七、包装类7.1 基本数据类型和对应的包装类7.2 装箱和拆箱7.3 自动装箱和自动拆箱 一、泛型 1.1 泛型的概念 在Java中,泛型是一种在编译时期类型检查的机制,它使得我们能够创建具有通用行为的类、接口和方法,以适应不同类型的数据。通过使用泛型,可以提高代码的复用性、类型安全性以及可读性。 泛型是在JDK 1.5 引入的新语法,通俗来讲,泛型就是适应多种类型。从代码上来看,就是对类型实现了参数化,即从传入的类型参数来确定数据的具体类型。 1.2 为什么要有泛型 首先通过一个案例来说明:实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个元素的值。 实现思路:在Java中,因为所有类的父类都是Object类,因此可以将数组的类型定义为Object[]类型,这样就能存放任何类型的元素了。 实现代码如下: class MyArray { public Object[] array = new Object[10]; public Object getPos(int pos) { return this.array[pos]; } public void setVal(int pos, int val) { this.array[pos] = val; } } public class Test { public static void main(String[] args) { MyArray myArray = new MyArray(); myArray.

入门小白,使用ubuntu,使用docker或者docker-compose搭建家庭个人网盘nextcloud,外网通过IPV6域名访问。第四篇--挂载硬盘,优化配置

主要内容 nextcloud挂载外部磁盘优化nextcloud配置ubuntu自动挂载磁盘 配置 nextcloud 挂载外部磁盘 注意: 这里的挂载外部磁盘是指: 把一个移动硬盘 挂载到 nextcloud 参考: https://cloud.tencent.com/developer/article/2067451 先找到你的磁盘对应的设备 fdisk -l 比如 下面的截图,我的磁盘路径就是 /dev/sdb 接下来挂载磁盘到系统中 如此, 硬盘对应的 路径就变成了 /mnt/testmount , 这个路径就是我们待会要用到的 mount /dev/sdb /mnt/testmount 确认 nextcloud的 docker-compose.yml配置文件 # 这段表示 把主机的路径映射到docker的路径中 volumes: - /mnt/testmount:/mnt/testmount2 # 这表示让nextcloud 拥有root权限。 由于这具有一定的风险,各位自己考虑 # 采用devices 来挂载的话,我没有实验成功。官方文档上的例子也试了,还是不行。 privileged: true 在nextcloud页面 配置外部存储 详细步骤看参考文档就行, 我就懒得贴了,O(∩_∩)O将刚才在docker-compose 配置文件中 映射的路径配置上去, /mnt/testmount2 验证 这个时候,那么你在 nextcloud管理页面上,就能看到相应的外部磁盘了 在 nextcloud app上也可以看到了 优化 nextcloud 配置 此处 可以参考其他大佬写的优化配置,b站或者知乎啥的都有 我感觉 我优化了前后,似乎也不是太明显的样子。。。 参考: https://zhuanlan.zhihu.com/p/50322342 ubuntu自动挂载磁盘 由于 使用的是笔记本挂载磁盘,那么重启后 磁盘挂载路径可能会变化,因此需要自动挂载。

入门小白,使用ubuntu,使用docker或者docker-compose搭建家庭个人网盘nextcloud,外网通过IPV6域名访问。第一篇

搭建网络的第一篇 本文的需求背景技能要求或者工具使用到的软件第一步,docker第二步,安装nextclouddocker 方式docker compose方式启动nextcloud 本文的需求背景 如果你有多余的机械硬盘,想要备份 照片如果你有多余的老旧笔记本 当服务器,或者其他机器也可以如果你还想 外网能够访问 家庭网络你不考虑NAS的情况下既不想买 腾讯或者阿里云服务器,又不想买域名的 而且我的意图是,我的硬盘里有资料了,只是想把硬盘作为挂载的工具放到nextcloud 如果不想折腾的,嗯,到了这一步,你和我说你不想折腾 如果不想麻烦的,嗯,还是上NAS。 虽然我没用过 技能要求或者工具 需要对linux 有一定的操作水平,文章中使用 ubuntu桌面版。就是有图形界面的哈能够基础使用docker,docker-compose能够关闭ipv6防火墙功能的 路由器 使用到的软件 个人网盘: nextcloud容器: docker免费域名解析: ddns-go动态dns: dynv6 ,官网: https://dynv6.com 由于 这几款软件都是 开源软件,所以并不需要收费哈 第一步,docker 针对自己的操作系统,安装 docker ,以及 docker-compose 这一步 可以百度解决 第二步,安装nextcloud docker 方式 参考文档: https://www.cnblogs.com/xwgli/p/16512462.html 内容分为几步: 安装redis,用于缓存 (参考上面文档的安装命令) 安装mysql,用于存储数据(参考上面文档的安装命令) 下面的mysql配置项,填入的是安装mysql时的内容 对不住,照片用的其他兄弟的哈 安装nextcloud docker run -d -p 8080:80 \ --restart=always \ -v /home/nextcloud/html:/var/www/html \ --link nextcloud-mysql:mysql \ --link nextcloud-redis:redis \ --name nextcloud nextcloud:latest 解释下命令:

入门小白,使用ubuntu,使用docker或者docker-compose搭建家庭个人网盘nextcloud,外网通过IPV6域名访问。第三篇--配置 ddns-go 以及 dynv6

第三篇。ipv6配置 由于在第一篇中说过,放弃使用ipv4 连接 优点,家里设备都可以拥有一个 ipv6公网地址 缺点,地址会变。。。 缺点,公司网络网络下,可能访问不到。。。 所以采用ddns-go 配置 dynv6的方案 即使设备的ipv6地址变化了,也不用你做额外的事,一切交给系统就行。 不用写代码,不用手动更改绑定 要求 光猫要 桥接模式,也就是采用 路由器拨号的方式路由器要可以关闭防火墙,或者说 可以配置ipv6的 防火墙规则(在第二篇中已经说明)tplink的路由器 放弃吧。因为 目前家用的路由器不支持关闭内置的防火墙,所以外网访问时,会被拒绝 参考: https://zhuanlan.zhihu.com/p/560931869 到dynv6创建一个域名 访问官网: https://dynv6.com/ 注册后 ,创建一个自己喜欢的域名 进入my zones, 选择instructions, 这个下面,记录下 Update-URL 和 Benutzername, Domainname, 待会配置时要用到 安装 ddns-go docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root jeessy/ddns-go 注意:–net=host ,请不要修改,修改了 可能就获取不到 你网卡的ipv6了。 如果这个参数不填,应该默认是 bridge 模式 验证: 打开浏览器 ,输入 你的ip地址:9876 配置ipv6解析 参考 : https://www.bilibili.com/read/cv22106032/ DNS服务商 选 Callback url 填写http://dynv6.com/api/update?hostname=#{domain}&token=Benutzername手动修改&ipv6=#{ip} 解释: #{domain} 变量, ddns-go会自动输出 Domains配置的域名,在下面的 ipv6 设置中填写Benutzername 改为上一步dynv6官网你的 Benutzername 秘钥令牌#{ip} 变量 ,不用改,会自动变

Prettier - Code formatter配置(vscode)

1.安装Prettier 2.设置-->搜索format on save 并打勾 3.搜索default format 并选择Prettier - Code formatter 4.点击右上角打开setting.json 5.看最后一行是否存在如下配置,有就说明配置成功,没有重新前面步骤重新设置一下 6.根目录是否存在.prettierrc.json,没有创建一下 7.把以下代码复制到.prettierrc.json文件中 { "$schema": "https://json.schemastore.org/prettierrc", "semi": false, "tabWidth": 2, "singleQuote": true, "printWidth": 100, "trailingComma": "none", "useTabs": false } 8.配置完成,按Ctrl+S即可代码格式化 格式化前: 格式化后:

【IOS】Firebase(Google、Facebook、Apple、Guest)登录,FCM,Apple In-App,Kakao

写在开头 记录自己接入SDK的过程。请各位指正。 最好提前做的工作 工欲善其事,必先利其器。 1.Mac电脑因Xcode而内存越来越大 弄到一半突然提示我内存不足,而且xcode还越来越卡。也是醉了。 2.Xcode卡顿解决方案 一.xcode项目处理 1.Cocoapods Mac 下 安装Cocoapods CocoaPods 换源 git 安装 与 使用 mac 安装homebrew 报错 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused 1).ruby Mac OS 新系统安装Cocoapods[不要直接使用系统默认ruby] IOS 解决安装POD报You don’t have write permissions for the /usr/bin directory的错误 是的,我们得用自己的ruby,mac自带的不让写入了,连升级都不行,干!!! a.如何让shell里优先用自己下的ruby https://www.shuzhiduo.com/A/qVdeEK1gdP/ 我使用了方法二 b.更换ruby源 更换 Ruby 源 // 查看现有的源 gem source -l // 移除 gem sources --remove https://rubygems.org/ // 添加 ruby-china 的源 gem sources -a https://gems.

CentOS 安装及基本配置

文章目录 1、root 免密码输入自动登录2、设置 Terminal 计算机终端背景颜色3、关闭关闭锁屏4、You need to be root to perform this command. 1、root 免密码输入自动登录 注:设置免密登录需要使用超级用户权限,即 root 权限 (1)、启动 CentOS 系统,进入桌面,鼠标右键,点击 Open Terminal (2)、使用 vi 修改 /etc/gdm/custom.conf 文件 vi /etc/gdm/custom.conf (3)、输入 i 进行插入,插入完成后,按 ESC,输入 :wq,保存并退出 # 在[daemon]下增加 AutomaticLoginEnable=True AutomaticLogin=root (4)、输入 reboot 重启 注:重启后,需要重新配置 CentOS 2、设置 Terminal 计算机终端背景颜色 (1)、启动 CentOS 系统,进入桌面,鼠标右键,点击 Open Terminal (2)、点击终端里菜单中的 Edit,点击 Preferences (3)、点击 Unnamed,点击 Colors,取消勾选 Use colors from system theme (4)、点击 Built-in schemes 下拉框,选择自己喜欢的主题即可,我选择的是 “Green on black” 主题

基于STM32的户外环境监测系统的设计

目录 1 引言 1.1 本课题的研究意义 1.2 本课题的研究现状 1.3本课题的发展趋势和研究可行性 1.4本课题主要研究工作 2 系统的概述和相关原理 2.1 系统的概述 2.1.1 总体设计的方案 2.1.2 总体框图 2.2 相关理论 2.2.1 STM32平台 2.2.2 WIFI模块 3 硬件电路设计 8 3.1 主控电路 3.2 WIFI通信模块 3.3报警模块 3.4温湿度模块 3.5 光照强度模块 3.6 PM2.5模块 3.7液晶模块 3.8电源模块 4 软件设计 4.1 总体程序流程图 4.2 WIFI模块 4.3 LCD5110模块 4.5 DHT11模块 4.7 ADC-DMA模块 5 Android系统 30 5.1 Android系统简述 31 5.2 Android开发环境的搭建 36 6 运行与调试 37 6.1 测试 38 结论 参考文献 基于STM32的户外环境监测系统的设计 摘 要:随 着 无 线 局 域 网 技 术 的 快 速 发 展 , 无 线 终 端 已 经 融 入 了 我 们 的 生 活 , 无 论 是 智 能 手 机 还 是 笔 记 本 , WiFi 功 能 几 乎 是 必 不 可 少 的 。 伴随着电子产品的快速发展,电子测量的应用也越来越广泛,不再局限于军事,转向民用发展。更加使得电子测量技术的到极大的发展。数字信号有着良好的抗材料本身干扰和环境干扰的能力,所以,现在市面上的模拟信号产品逐渐被数字信号产品代替,并且使得测量产品越来越方便。根据市场调查,虽然市场上有很多关于环境监测系统测试仪,但大多数是应用于空气,湖泊,海洋,河流等大型检测系统,关于检测环境的小型简单方便使用的检测系统。本文开发并实现基于一种嵌入式开发平台的 STM32 的 WiFi 模块,结合以上物联网新型概念,实现用户通过网络对环境的实时监控。该系统可以使用户能够对想要知道的情况进行实时的掌握以及控制。通过各种传感器获取家庭内信息(温湿度信息、光照信息、PM2.

java:求数组中的最大值、最小值

eclipse使用Java求数组中的最大值、最小值 文章目录 前言代码实现 前言 声明一个整型数组,包含10个元素,给数组中的每个元素赋0~99的随机整数,求出数组中的最大值、最小值 代码实现 具体代码如下: package day05; import java.util.Arrays; public class MaxOfArray { public static void main(String[] args) { // 求数组中的最大、最小值 int[] arr = new int[10]; for(int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random()*100); //生成0~99的随机整数 System.out.println(arr[i]); } int max = arr[0]; //假设数组的第一个元素为最大值 for(int i = 0; i < arr.length; i++) { if(max < arr[i]) { //如果第i个数组元素大于max,则将第i个元素值赋给max max = arr[i]; } } System.out.println("数组中最大值为:"+max); int min = arr[0]; //假设数组的第一个元素为最小值 for(int i = 0; i < arr.

使用python和js调用wasm文件

1.使用python调用wasm文件 使用pywasm模块. 1.安装(使用清华源):pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pywasm 2.导入:import pywasm 3.代码: import pywasm vm = pywasm.load("./example.wasm") # 加载wasm文件 result = vm.exec("method", *args) # 调用文件的方法 2.将wasm文件转为js文件 利用wasm2js包. 1.安装:npm install wasm2js 2.导入:const wasm2js = require('wasm2js');,const fs = require('fs') 3.代码: const wasmBuffer = fs.readFileSync("example.wasm"); //加载你的wasm文件 const js = wasm2js(wasmBuffer); // 转为js代码 fs.writeFile("result.js", js, (err) => {}); //写入文件 参考文章: js和wasm 对wasm的两种解法 WebAssembly

在vue项目中使用高德地图

1.安装高德地图插件 npm install vue-amap --save 2.申请高德地图账号和key 官网地址:高德开放平台 | 高德地图API 3.在main.js中引入 // 引入vue-amap import VueAMap from 'vue-amap'; // 初始化vue-amap Vue.use(VueAMap); VueAMap.initAMapApiLoader({ key: 'c8b20507506bf9ec5e63f9b7a6e0eb53', plugin: [ "AMap.Autocomplete", //输入提示插件 "AMap.PlaceSearch", //POI搜索插件 "AMap.Scale", //右下角缩略图插件 比例尺 "AMap.OverView", //地图鹰眼插件 "AMap.ToolBar", //地图工具条 "AMap.MapType", //类别切换控件,实现默认图层与卫星图、实施交通图层之间切换的控制 "AMap.PolyEditor", //编辑 折线多,边形 "AMap.CircleEditor", //圆形编辑器插件 "AMap.Geolocation" //定位控件,用来获取和展示用户主机所在的经纬度位置 ], v: '1.4.4' }); 4.创建存放地图的容器 <div class="box"> <div class="mapBox" id="myMap"></div> <div class="btn" @click="screenFull">放大</div> </div> 5.初始化地图 //初始化地图容器 initMap(){ // console.log("初始化地图容器") this.myMap = new AMap.Map('myMap',{ zoom: 10, //设置地图显示的缩放级别 // center: [116.

sqlmap新手教程

sqlmap常用命令 --technique=B/E/U/S/T 指定sql注入的类型 B:布尔盲注 E:报错型注入 U:联合查询注入 S:多语句查询注入 T:时间盲注 --dbms 指定数据 如Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, Percona, PostgreSQ -D 指定数据库 -T 选择表 -C 选择字段 --dbs 列出全部数据库名字 --dump列出字段内容 --current-db 查询当前数据库名 --current-user 检测当前用户 --is-dba检测当前用户是否为管理员 -v 共有0-6级 0:只显示Python的回溯,错误和关键消息。 1:显示信息和警告消息。 2:显示调试消息。 3:有效载荷注入。 4:显示HTTP请求。 5:显示HTTP响应头。 6:显示HTTP响应页面的内容 --tables获取表名 --columns获取字段名 --users列数据库所有用户 --batch 永远不要要求用户输入,使用默认行为 --threads 采用多线程 --risk:风险等级,共有4个,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。 level:共有五个等级,默认为1,在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。 当使用第5级时,处于测试最高级别,包含的payload最多,测试参数更复杂,会自动破解出cookie、XFF等头部注入,相对应他的速度也比较慢。这里说的速度是完成任务的速度,而非网站的访问速度。 sqlmap使用流程 进入sqlmap的文件夹,按住Ctrl键,然后按住右键,打开终端,输入python sqlmap.py运行sqlmap 输入 python sqlmap.py -u "http://localhost/Less-1/?id=1" 进行扫描 查询出有布尔盲注,报错型注入,时间盲注,联合查询注入 使用报错型注入查询当前连接数据库 查询出数据库名为"security" 指定security数据库查询全部表 指定users表,查询全部字段 接下来查询password字段的全部内容

【PCL】(三)读写PCD文件

文章目录 (三)读写PCD文件写读 (三)读写PCD文件 写 首先,创建一个名为pcd_write.cpp的文件,并在其中写入以下代码: #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> int main () { pcl::PointCloud<pcl::PointXYZ> cloud; // Fill in the cloud data cloud.width = 5; cloud.height = 1; cloud.is_dense = false; cloud.resize (cloud.width * cloud.height); for (auto& point: cloud) { point.x = 1024 * rand () / (RAND_MAX + 1.0f); point.y = 1024 * rand () / (RAND_MAX + 1.0f); point.z = 1024 * rand () / (RAND_MAX + 1.

idea端口号被占用

idea端口号被占用如何解决 idea经常会报错显示端口号被占用,此时有解决方法无需重启电脑 打开cmd输入netstat -ano查找所有端口 通过netstat -ano|findstr "端口号"命令直接查找具体端口号被占用程序: 用taskkill /pid 加查出来的端口号 -f 命令终止进程

【PCL】(一)PCL基本数据结构PointCloud与原生文件格式PCD

文章目录 PCL基本数据结构PCD文件PCD版本文件格式标头数据存储类型PCD文件示例 PCL基本数据结构 PCL 1.x 的基本数据结构是PointCloud。PointCloud是一个C++类,它主要包含以下数据字段: width (int) 指定点云数据集的宽度(以点数为单位)。宽度有两个含义: 它可以为无组织的点云指定其总点数; 它可以指定一个有组织的点云的宽度(一行的点数)。 有组织的点云类似于有组织的图像(或矩阵,其中的数据被分成行和列。对于这种点云,可以利用其相邻点之间的关系(类似于图像像素之间的关系)进行高效率的最近邻操作,从而加快了计算速度,降低了PCL中某些算法的成本。 例子:每行有640个点的点云 cloud.width = 640; height (int) 指定点云数据集的高度(以点数为单位)。高度有两层含义: 它可以指定组织点云数据集的高度(总行数); 例子:有组织的480行640列的点云,总共640*480=307200个点 cloud.width = 640; cloud.height = 480; 对于无组织的数据集,它被设置为1(因此height 也可用于检查点云是否是有组织的)。 例子:307200 个点的无组织的点云 cloud.width = 307200; cloud.height = 1; points (std::vector) 包含存储PointT类型的所有点的数据数组。例如,对于用XYZ值表示点的点云,points为包含多个pcl::PointXYZ元素的向量: // 定义一个点云 pcl::PointCloud<pcl::PointXYZ> cloud; // 将其points 赋予数组data std::vector<pcl::PointXYZ> data = cloud.points; PointT类型是主要的点数据类型,它描述了点的每个单独元素所包含的内容。PCL提供了多种不同的点类型,还允许我们自定义PointT类型: https://pcl.readthedocs.io/projects/tutorials/en/master/adding_custom_ptype.html#adding-custom-ptype is_dense (bool) points 中的所有数据是否是有限的(true),或者某些点的XYZ值是否可能包含Inf/NaN值(false)。 sensor_origin_ (Eigen::Vector4f) 传感器采集姿态(原点/平移)。这个成员通常是可选的,PCL中的大多数算法都不使用它。 sensor_orientation_ (Eigen::Quaternionf) 说明传感器采集姿态(方向)。这个成员通常是可选的,PCL中的大多数算法y也都不使用它。 为了简化开发,PointCloud类包含许多助手成员函数。例如,用户不必在代码中检查height 是否等于1,以查看数据集是否是有组织的,而是使用isOrganized : if (!cloud.isOrganized ()) .

基于Web的停车场管理系统(Java)

目录 一、系统介绍 1.开发的环境 2.本系统实现的功能 3.数据库用到的表 4.工程截图 二、系统展示 1、登录页面 2、首页 3、系统信息管理模块 4、车位信息管理模块 5、IC卡信息管理模块 ​编辑6、固定车主停车管理模块 7、临时车主停车管理模块 8、系统功能操作模块 三、部分代码展示 1、Index.jsp 2、Login.jsp 3、Login.java 4、User.java 五、申明 如有侵权请联系我删除!!! 六、源码获取 一、系统介绍 1.开发的环境 开发工具:IntelliJ IDEA 2022 JDK版本:1.8 数据库:MySQL 8.0 数据库管理软件:Navicat 15.0.27 服务器:apach-tomcat-9.0.68 2.本系统实现的功能 基于Web停车场管理系统主要用于实现停车场相关信息管理,基本功能包括:系统信息管理模块、车位信息管理模块、IC卡信息管理模块、固定车主停车管理模块、临时车辆信息管理模块、系统功能操模块等。本系统结构如下: (1)系统信息管理模块:角色的增加、删除、修改和查询;用户的增加、删除、修改和查询。 (2)车位信息管理模块:车位信息的增加、删除、修改和查询。 (3)IC卡信息管理模块:IC卡信息的增加、删除、修改和查询。 (4)固定车主停车管理模块:对固定车主的停车信息进行增加、删除、修改和查询 (5)临时车辆信息管理模块:对临时车辆的停车信息进行增加、删除、修改、查询和打印 (6)系统功能操模块:退出登陆、修改密码。 3.数据库用到的表 card, fixed, role, seat, temp, user 4.工程截图 二、系统展示 1、登录页面 2、首页 3、系统信息管理模块 4、车位信息管理模块 5、IC卡信息管理模块 6、固定车主停车管理模块 7、临时车主停车管理模块 8、系统功能操作模块 三、部分代码展示 1、Index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" errorPage="_Error.jsp"%> <% String path = request.

Android firebase google登录配置流程和app内测发布流程

googlePlay使用OAuth2.0保护账号安全,且与firebase相关。如果配置错误,会出现error code比如: 10: auth,如clientId不对; 7: 网络或墙的问题; 12500:签名问题。 正确配置流程 Release 请按照如下步骤操作,顺序错误则可能会导致json文件不同。 创建firebase项目,相当于创建了一个google cloud激活了firebase功能的项目; 证书指纹 登录play.google.com/console/ 上传密钥证书,指的是本地打包上来的,jks签名上传。 应用签名密钥证书, google play会将aab二次签名。后面步骤,使用的都是应用签名密钥证书。 firebase console配置app fireBase信息: https://console.firebase.google.com/ 下载google-services.json,核对本地代码中,app/src/release/google-services.json是否一致。 不要随意下载,会重置信息,又得配置后面2个步骤。 配置Android Key https://console.cloud.google.com/apis/credentials 一般情况,Android Key能够自动生成,就是firebase点击一次download json就会触发更新出来一个新的。所以前面一个步骤不要随意点击下载。下载后,需要等待一会儿,这边刷新自动创建。 点击进入Android Key: 选成android应用。Add包名+指纹。 OAuth2.0客户端ID OAuth,AndroidClient如果能自动创建,就使用自动创建的,如果没有自动创建,则手动创建一个OAuth客户端。配置包名+指纹。 类似的,OAuth,还需要创建WebClient(如果没有自动创建。) https://developers.google.com/identity/one-tap/android/get-saved-credentials?hl=zh-cn 这个WebClient的ID才是用来登录使用的,坑的不要不要的。 使用这个webClient ID,传入代码的请求登录处: 总结 第一步,play确认二次签名; 第二步,firebase添加签名并下载json; 第三步,配置Cloud androidKey,一般等待自动生成,要一会儿; 第四步,配置Cloud OAuth androidClient,webClient。如果没有自动创建则手动创建; 第五步,将WebClientID配置到请求登录代码中,否则可能会报code:10 error,因为webId不对。 Debug 对于Debug版,我们不会上googlePlay的,故而不会二次签名。只做发布蒲公英。 如下: 第1步,firebase切换到app的debug项目,使用本地debug签名并下载json; 第2步,配置Cloud androidKey,使用本地debug签名来配置。一般等待自动生成,要一会儿; 第3步,配置Cloud OAuth androidClient,webClient。如果没有自动创建则手动创建; 第4步,将WebClientID配置到请求登录代码中,否则可能会报code:10 error,因为webId不对。 另外,上架google app注意,不要直接发布内测。 先通过资源管理器上架。然后,手动下载通用签名apk,自测。有问题可以删除aab。 没问题再发布,否则,又得追加versionCode重新发。

语音识别模型whisper的参数说明

一、whisper简介: Whisper是一种通用的语音识别模型。它是在各种音频的大型数据集上训练的,也是一个多任务模型,可以执行多语言语音识别、语音翻译和语言识别。 二、whisper的参数 1、-h, --help 查看whisper的参数 2、--model {tiny.en,tiny,base.en,base,small.en,small,medium.en,medium,large-v1,large-v2,large} 选择使用的模型,默认值:small 3、--model_dir MODEL_DIR 模型文件的保存路径,默认值:~/.cache/whisper 4、--device DEVICE PyTorch接口使用的设备,默认值:CPU 5、--output_dir OUTPUT_DIR, -o OUTPUT_DIR 输出结果保存的目录,默认值:当前目录 6、--output_format {txt,vtt,srt,tsv,json,all}, -f {txt,vtt,srt,tsv,json,all} 输出文件的格式,默认值:all 7、--verbose VERBOSE 是否打印进展和debug信息,默认值:true 8、--task {transcribe,translate} transcribe:语音转文字 translate:语音转英语 默认值:transcribe 9、--language {af,am,ar,as,az,ba,be,bg,bn,bo,br,bs,ca,cs,cy,da,de,el,en,es,et,eu,fa,fi,fo,fr,gl,gu,ha,haw,he,hi,hr,ht,hu,hy,id,is,it,ja,jw,ka,kk,km,kn,ko,la,lb,ln,lo,lt,lv,mg,mi,mk,ml,mn,mr,ms,mt,my,ne,nl,nn,no,oc,pa,pl,ps,pt,ro,ru,sa,sd,si,sk,sl,sn,so,sq,sr,su,sv,sw,ta,te,tg,th,tk,tl,tr,tt,uk,ur,uz,vi,yi,yo,zh,Afrikaans,Albanian,Amharic,Arabic,Armenian,Assamese,Azerbaijani,Bashkir,Basque,Belarusian,Bengali,Bosnian,Breton,Bulgarian,Burmese,Castilian,Catalan,Chinese,Croatian,Czech,Danish,Dutch,English,Estonian,Faroese,Finnish,Flemish,French,Galician,Georgian,German,Greek,Gujarati,Haitian,Haitian Creole,Hausa,Hawaiian,Hebrew,Hindi,Hungarian,Icelandic,Indonesian,Italian,Japanese,Javanese,Kannada,Kazakh,Khmer,Korean,Lao,Latin,Latvian,Letzeburgesch,Lingala,Lithuanian,Luxembourgish,Macedonian,Malagasy,Malay,Malayalam,Maltese,Maori,Marathi,Moldavian,Moldovan,Mongolian,Myanmar,Nepali,Norwegian,Nynorsk,Occitan,Panjabi,Pashto,Persian,Polish,Portuguese,Punjabi,Pushto,Romanian,Russian,Sanskrit,Serbian,Shona,Sindhi,Sinhala,Sinhalese,Slovak,Slovenian,Somali,Spanish,Sundanese,Swahili,Swedish,Tagalog,Tajik,Tamil,Tatar,Telugu,Thai,Tibetan,Turkish,Turkmen,Ukrainian,Urdu,Uzbek,Valencian,Vietnamese,Welsh,Yiddish,Yoruba} 音频文件的语言设置,设置为无则会进行语言检测 默认值:无 10、--temperature TEMPERATURE 用于取样的温度 默认值:0 11、--best_of BEST_OF 在非零温度下采样时的候选数量 默认值:5 12、--beam_size BEAM_SIZE beam search 算法中beams的数量,只适用于temperature为0的情况 默认值:5 13、--patience PATIENCE 选项patience值用在beam解码,参考https://arxiv.org/abs/2204.05424, 默认情况下(1.0)相当于传统beam搜索 默认值:无 14、--length_penalty LENGTH_PENALTY 可选令牌长度惩罚系数(alpha)参考https://arxiv.org/abs/1609.08144,默认情况下使用简单长度规格化 默认值:无 15、--suppress_tokens SUPPRESS_TOKENS 要在采样期间抑制的以逗号分隔的令牌ID列表;'-1'将抑制除常见标点符号以外的大多数特殊字符默认值:-1 16、--initial_prompt INITIAL_PROMPT 可选的文本作为第一个窗口的提示词 默认值:无 17、--condition_on_previous_text CONDITION_ON_PREVIOUS_TEXT

vite项目开发npm包时调用其它依赖报错

我们在封装npm包时有时候会在npm包中添加外部依赖,在webpack模式下是没有问题的,但在vite模式下当我们在项目中使用封装的npm包时,启动会报外部依赖的相关错误,此时我们需要在项目 vite.config.ts 文件中的 defineConfig 添加 optimizeDeps ,并将报错的外部的依赖添加进去。 例如,我们在npm包里使用了qs依赖,那么,在项目上就可以按下图方式添加: export default ({ mode }) => { return defineConfig({ optimizeDeps: { include: ['qs'] } }); };

超炫酷项目来袭!DragGAN 正式开源了!

之前树先生给大家介绍过一个项目 DragGAN,现在正式开源了! 超炫酷项目来袭!DragGAN 火爆开源社区! 那还等什么,盘它! DragGAN 是什么? 不同于 Stable Diffusion 与 Midjourney 使用的扩散模型,DragGAN 是一款基于生成对抗网络(GANs)技术的图片编辑项目。追根溯源,其实还是 NVIDIA 的 StyleGAN 的衍生项目。 DragGAN 由两个主要部分组成: 第一部分是基于特征的运动监督,通过控制起始点向目标点运动,实现图像的变形; 第二部分是新的点跟踪方法,即最近邻检索,通过在相同的特征空间上进行点跟踪,提高了效率,并避免了累计误差损失。 简单来说,它能够让你轻松掌控图片中的人物和动物,通过拖拽控制点和目标点来调整他们的位置、形状、姿势等等。目前这个项目在 Github 上已经斩获了 20K star 了,趋势榜第一,足见其火爆程度! 部署要求 支持 Linux 和 Windows,建议使用 Linux内存 12 GB 以上1–8 NVIDIA 高端 GPUPython >= 3.8,PyTorch >= 1.9.0CUDA toolkit >= 11.1 安装部署 安装过程,真是一把鼻涕一把泪,到处都是坑,先是在阿里 PAI 平台栽跟头,折腾好久才发现是基础环境问题,后来又在安装方法上翻了车,官方的安装指导也是各种报错。 一路艰难摸索过来,现在将实测可行的一套部署方法带给大家。 这里我们选择 AutoDL 云平台,使用 Python 3.8,CUDA 11.8 的镜像,这个镜像的环境就已经满足项目要求了。 下载源码 git clone https://github.com/XingangPan/DragGAN.git 安装依赖 cd DragGAN pip install -r requirements.

关于Xshell7无法连接虚拟机的解决方案

当我们在使用Xshell时,无法连接虚拟机 解决方法1: 1、打开网络和Internet设置 2、点击更改适配器设置 3、如果发现是禁用则右键启动 解决方法二: 1、如果都启动仍然连接不上 我们双击打开后 点击详细信息 发现是自动配置IPv4地址,那就是因为VMware NAT service和VMware DHCP service两个服务没有启动。 2、win+r在弹出的窗口中点击输入“services.msc”,回车确定 3、然后在弹出来的窗口中点找到VMware NAT service和VMware DHCP service两个服务,启动即可。 最后连接成功。。 注意:当我们刚刚开启服务时,xshell仍然连接不上,则将这两个重新禁用在启动! 解决方法三: 检查虚拟机能否ping通外网 打开虚拟网络编辑器 选择nat模式 更改设置 vi /etc/sysconfig/network-scripts/ifcfg-ens32 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens32 HWADDR=00:0c:29:56:bf:df IPADDR=192.168.152.173 NETMASK=255.255.255.0 GATEWAY=192.168.152.110 ##网关必须与VMWare设置的网关一致才行 DNS1=114.114.114.114 UUID=86f468b0-1625-499f-9a13-4cd4f7c46f3a DEVICE=ens32 ONBOOT=yes

js如何判断dom元素关系

当前元素是否是某元素的子元素 // 事件A var target; function(e) { // target事件绑定的dom target = e.target; } // 事件B var currentTarget; function(e) { // currentTarget事件触发的dom currentTarget = e.currentTarget; } // 元素target是否包含了元素currentTarget,如果是则返回true否则返回false target.contains(currentTarget)

ViewPager2自定义Adapter解决Fragment动态增加和删除,不刷新等问题

一般的,我们使用ViewPager2是不太会整体地动态更新ViewPager的Fragment或者删除。我们一般只是固定了ViewPager,然后内部的每一个独立的Fragment自行处理各种逻辑。 而现在有个需求需要动态增加,删除,改变Fragment。 为了达到动态更新,并且希望是尽量复用Fragment。而不是每次都notifyDataSetChange。而且即使notifyDataSetChange也不一定能生效。 主要原因是默认的FragmentStateAdapter的实现中有如下描述: /** * Default implementation works for collections that don't add, move, remove items. * TODO(b/122670460): add lint rule * When overriding, also override {@link #containsItem(long)}. */ @Override public long getItemId(int position) { return position; } 可以看出,他就是不希望你去改变。如果要改变,todo。你就需要自行实现。 网上帖子也一大堆,主要原因是FragmentStateAdapter的实现中,用position来标记Fragment作为不变的理由。虽然数据更新了,但是position不变则不会创建新的。 也就是因为getItemId和containsItem进行了处理解决问题。 这里我也编写了自己的框架。 抄过去,自行修改即可。 其中ReflectUtils获取父类的私有对象的反射,网上一大堆,找不到,请回复。 asOrNull则是强转。 特点 使用简单 让你的Fragment实现我的接口IFragmentNeedUpdate,回调函数会在onStart的时候或者动态更新的时候都会回调。因此,你不需要费力找地方保存每一个bean,然后在onCreateView等初始化,统统不需要。只需要在onNeedUpdate回调函数中里面编写UI更新代码即可。使用本Adapter设置给ViewPager2,当然你也可以继承,干别的事情。不再主动调用notifyXXXChange,调用submitData(list)初始化或者更新数据。在submitData之前,新建Adapter的时候,设置fragmentCreator和differComparator。 一般fragmentCreator,直接调用你的XXXFragment()新建对象即可。而differComparator用于判断2个数据bean对象是否相同。只要有数据有变化,则返回true即可。 参考:val ada = NeedUpdateFragmentStateAdapter<XXXBean>(this) ada.differComparator = { a, b-> var ret = false if (a.deviceId != b.deviceId) { ret = true } else if (a.

Flink消费kafka出现空指针异常

文章目录 出现场景:表现:问题:解决: tombstone : Kafka中提供了一个墓碑消息(tombstone)的概念,如果一条消息的key不为null,但是其value为null,那么此消息就是墓碑消息. 出现场景: 双流join时,采用的是left join的方式,众所周知该方式会产生回撤流,下游kafka连接器使用的是upsert-kafka,在产生回撤流时,kafka会删除未join上的消息,填充join后的消息进去。 表现: 问题: 此时消费该topic的flink程序会出现,空指针异常 DataStream Api会出现,Table Api 未发现 解决: 自定义kafka反序列化器过滤Null值,flink1.14.4 代码: public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); KafkaSource<String> kafkaSource = KafkaSource.<String>builder() .setBootstrapServers("") .setTopics("test") .setGroupId("gid") .setStartingOffsets(OffsetsInitializer.earliest()) .setValueOnlyDeserializer(new MySimpleStringSchema()) .setProperty("auto.offset.commit", "false") .build(); DataStreamSource<String> kfkDs = env.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "kfk"); kfkDs.print(); env.execute(); } // 自定义反序列化器 static class MySimpleStringSchema implements DeserializationSchema<String>, SerializationSchema<String>{ @Override public String deserialize(byte[] message) { if (message != null) return new String(message, StandardCharsets.

Linux下的Telnet指令详解

简介: Telnet指令是一种常用的远程登录工具,可用于与远程主机建立连接并执行命令。本篇博客将以通俗易懂的方式,详细解析Telnet指令的前世今生、功能、用法和应用场景,帮助读者全面了解Telnet指令,并掌握其在远程管理和问题排查方面的应用。 文章目录 一、Telnet指令的前世今生二、Telnet指令的功能和用法三、Telnet指令的应用场景四、Telnet指令示例五、进一步了解Telnet指令 一、Telnet指令的前世今生 在早期计算机网络发展的阶段,Telnet是一种用于远程登录的协议。然而,由于其传输数据是明文的,存在安全性问题,因此逐渐被更安全的协议(如SSH)所取代。尽管如此,Telnet指令仍然有其特殊的应用场景,并被广泛使用于网络设备配置和问题排查等领域。 二、Telnet指令的功能和用法 Telnet指令主要用于与远程主机建立连接并进行远程登录。下面是Telnet指令的常用用法: 连接到远程主机: telnet [远程主机IP地址] [端口号] 该指令将尝试与指定的远程主机建立连接,并使用默认的Telnet端口(通常为23)进行通信。 执行远程命令: 一旦成功连接到远程主机,可以在Telnet会话中执行命令。例如,在远程主机上执行命令"ls": ls 退出Telnet会话: logout 该命令将断开与远程主机的连接并退出Telnet会话。 Telnet会话参数设置: 可以使用一些特殊的命令来设置Telnet会话的参数,如窗口大小、字符集等。具体的设置方法可以参考Telnet的帮助文档或相关指南。 三、Telnet指令的应用场景 Telnet指令在以下场景中发挥重要作用: 远程设备管理: Telnet常用于网络设备(如交换机、路由器)的远程管理。通过Telnet指令,管理员可以远程登录设备,进行配置、监控和故障排查等操作。 问题排查: Telnet指令可以用来排查网络和服务问题。通过Telnet连接目标主机的指定端口,可以检查该端口是否可达,是否能够建立连接,以及是否能够正常通信。 协议测试: Telnet可以用于测试各种基于文本的协议,如SMTP(Simple Mail Transfer Protocol)、POP3(Post Office Protocol 3)等。 通过Telnet连接目标主机的相应端口,可以模拟客户端与服务器之间的通信过程,方便调试和验证。 四、Telnet指令示例 以下是一些常见的Telnet指令示例: 连接到远程主机的Telnet服务: telnet 192.168.0.100 23 该指令将尝试与IP地址为192.168.0.100的远程主机建立Telnet连接。 检查Web服务器端口的连通性: telnet example.com 80 该指令将尝试与example.com域名关联的Web服务器建立Telnet连接,并使用80端口进行通信。 测试SMTP服务器的响应: telnet mail.example.com 25 该指令将尝试与mail.example.com关联的SMTP服务器建立Telnet连接,并使用25端口进行通信。 五、进一步了解Telnet指令 想要深入了解Telnet指令的更多功能和用法,可以参考以下参考链接: Telnet指令的官方文档Telnet详细教程 通过参考链接,我们可以进一步学习和了解Telnet指令的更多特性和用法,以及在网络管理和问题排查中的更多应用。 结论: 本篇博客详细介绍了Linux下的Telnet指令,包括其前世今生、功能、用法和应用场景。Telnet指令虽然在安全性方面存在一些局限,但在特定的环境和需求下仍然是一种实用的工具。通过Telnet指令,我们可以远程登录到其他主机、执行命令和排查问题。同时,了解Telnet的发展历史和应用场景,能够帮助我们更好地理解其重要性和使用方式。掌握Telnet指令将为您在远程管理和问题排查方面提供便利和技术支持。

jmeter性能测试及生成性能测试报告

JMeter执⾏原理 JMerer通过线程组来驱动多个(也可以理解为LR⼯具⾥⾯的虚拟⽤户)运⾏测试脚本对⽬标服务器发起⼤量的⽹络请求,在每个客户端上可以运⾏多个线程组,也就是说⼀个测试计划⾥⾯可以包含N个线程组。 线程属性 1.线程数 ⼀个线程可以理解为对应模拟⼀个⽤户,所以线程数越多,那么也就认为可以模拟的⽤户数越多。 2.Ramp-Up时间(秒) 该属性指的是所有线程从启动到开始运⾏的时间间隔,单位是秒,也就是说所有线程在多⻓时间内开始执⾏,如线程数设置50,设置的时间为5秒,那么计算的公式为: 每秒执⾏线程数=线程数/Ramp-Up 具体如: 如设置的线程数为50,Ramp-up的时间为10,那么也就是说开启执⾏后,每秒会启动5个线程,如果Ramp-Up设置为 0,那么开始执⾏后,50个线程会⽴刻启动。 每秒一百个用户: 3.循环次数 每个线程发送请求的次数。如果线程数为10,循环次数为100,那么每个线程发送100次请求。总请求数为10*100=1000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。 4.调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远) 持续时间(秒):测试持续时间,会覆盖结束时间启动延迟(秒):测试延迟启动时间,会覆盖启动时间。从当前时间延迟多长时间开始运行测试,也就是说惦记执行后,仅仅是初始化的场景,不会执行测试,等待延迟,到达后开始运行测试,执行的时间为持续时间设置的时间 Jmeter聚合报告参数 Label----每个请求的名称,比如HTTP请求等 #Samples----发给服务器的请求数量 Average----单个请求的平均响应时间 Median----50%请求的响应时间 90%Line----90%请求响应时间 95%Line----95%请求响应时间 99%Line----99%请求的响应时间 Min----最小的响应时间 Max----最大的响应时间 Error%----错误率=错误的请求的数量/请求的总数 Throughput----吞吐量即表示每秒完成的请求数 Received KB/sec----每秒从服务器端接收到的数据量 Sent KB/sec----每秒从客户端发送的请求的数量 性能测试报告 配置修改: 环境变量配置: 把jmeter添加到path的环境变量 JMETER_HOME后面跟的是jmeter的路径 mac配置jmeter环境变量 #JMETER环境变量配置 export JMETER_HOME=/Applications/tools/apache-jmeter-5.4.1 export PATH=$JMETER_HOME/bin:$PATH jmeter生成测试报告的命令:(进入到tests目录下再执行命令) 1 2 3 jmeter -n -t script/1212.jmx -l api.jtl -e -o performanceReport/ #-n -t 后面跟的是要执行的脚本 -l 后面跟的是一个后缀为jtl的文件 -e -o后面的跟的是生成的测试报告的文件名 打开测试报告的路径: 最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】 软件测试面试文档

QT编译MySQL驱动和操纵MySQL

一、编译MySQL驱动 1.软件版本 QT:5.12.12 MySQL:8.0.17 2.用Ot Creator打开Qt安装目录下 D:\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql\mysql.pro的MySQL源码,如果安装目录下没有这个文件夹,就重装Qt,安装时记得勾选安装源码。 TARGET = qsqlmysql HEADERS += $$PWD/qsql_mysql_p.h SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp #第一步,注释掉qmake #QMAKE_USE += mysql OTHER_FILES += mysql.json PLUGIN_CLASS_NAME = QMYSQLDriverPlugin include(../qsqldriverbase.pri) #第二步,添加.h依赖文件,找到自己安装的mysql对应路径 INCLUDEPATH += "C:/Program Files/MySQL/MySQL Server 8.0/include" DEPENDPATH += "C:/Program Files/MySQL/MySQL Server 8.0/include" #第三步,添加依赖的.lib文件 LIBS += "C:/Program Files/MySQL/MySQL Server 8.0/lib/libmysql.lib" #第四步生成你所需要的dll存放目录 DESTDIR = ../mysql/mylib 3.编译生成需要的文件,在工程同级目录下的mylib文件夹中。 4.将编译生成的文件放到对应目录,选择自己对应的编译器版本。 5. 在mysql安装路径找到mysql的libmysql.dll和libmysql.lib拷贝到相应的编译套件的bin目录下 二、测试增删改查操作 1.在项目.pro文件中添加 QT += sql 2.引入数据库相应头文件 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QSqlRecord> #include<QDebug> #include<QMessageBox> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); //输出可用数据库 // qDebug()<<"

Android 自定义手写签字板,签署姓名,签名

各位大佬好又来记笔记了~ 今天要做的是签字板,实现客户签名功能,直接看效果: 逐个进行签字,可以避免连笔导致识别不清问题。就是想要客户一个一个写,认真写~~。 下面方框显示的“王某才” 其实是三张图片,在最后点击“保存”的时候还需要把上面的多种图片进行拼接成一张图片。 拓展: 还可以把本demo改成一个全屏或者大区域的签字板,可以一次签署多个字,只要把布局放大就可以了。注意一下下面这个函数: viewSignature.save(filePath, false, 10); 第一个参数:保存的图片地址 第二个参数:是否裁剪白边。如果是单个字签署的话(如本文效果图的),这里要传false,不需要裁剪,原因是裁剪后图片大小会不一致导致拼接图片时会出现黑块。如果是整块的签字版(同时签署多个字的),就要传true,这样就可以得到只有名字部分的图片,减少图片大小。 第三个参数:空白区域留空距离,就是每张图片留白边的距离,单位px 本文地址,详见Demo

matlab绘制栅格地图

学习了一下栅格地图在matlib中的表示方法,其实和很多都是差不多的。 参考 清除命令 % clc:清除命令窗口的内容,对工作环境中的全部变量无任何影响 % close all:关闭所有的Figure窗口 % clear all:清除工作空间的所有变量,函数,和MEX文件 clc clear close all %% 构建颜色MAP图 cmap = [1 1 1; ... % 1-白色-空地 0 0 0; ... % 2-黑色-静态障碍 1 0 0; ... % 3-红色-动态障碍 1 1 0;... % 4-黄色-起始点 1 0 1;... % 5-品红-目标点 0 1 0; ... % 6-绿色-到目标点的规划路径 0 1 1]; % 7-青色-动态规划的路径 % 构建颜色MAP图 colormap(cmap); color map函数: 将上面的分类创建成颜色,对于矩阵cmap来说,矩阵是通过从1开始的序列进行编号的: cmap(1,2)表示第一行第二列。colormap将cmap存成了7种颜色。每一个颜色对应一个数值 %% 构建栅格地图场景 % 栅格界面大小:行数和列数 rows = 10; cols = 10; % 定义栅格地图全域,并初始化空白区域 field = ones(rows, cols); 这个什么好说的,就是field是一个10*10的矩阵

报错SyntaxError: Unexpected token ‘??=‘通过nvm替换node版本

最近打包碰见一个问题,搜索后发现可能是node版本不兼容(应该是14以上版本),一直使用的是nvm,然后使用nvm去安装高版本的node一直下载很慢,最后就是超时报错 mac终端执行切换淘宝源去下载 NVM_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node NVM_IOJS_ORG_MIRROR=http://npm.taobao.org/mirrors/iojs nvm install stable 执行完就可以正常下载了 nvm ls // 查看当前的版本列表 最后就是执行替换版本去打包了 nvm use 18.16.0 npm run build yarn build

ASCII对照表

十进制代码 十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 0 0 NUL 空字符 1 1 SOH 标题起始 (Ctrl/A) 2 2 STX 文本起始 (Ctrl/B) 3 3 ETX 文本结束 (Ctrl/C) 4 4 EOT 传输结束 (Ctrl/D) 5 5 ENQ 询问 (Ctrl/E) 6 6 ACK 认可 (Ctrl/F) 7 7 BEL 铃 (Ctrl/G) 8 8 BS 退格 (Ctrl/H) 9 9 HT 水平制表栏 (Ctrl/I) 10 0A LF 换行 (Ctrl/J) 11 0B VT 垂直制表栏 (Ctrl/K) 12

GitHub下载文件时就访问失败

在使用 GitHub 下载文件或访问网站时遇到了问题,可能是由以下原因造成的: 网络连接问题:可能是您的网络连接出现了问题,可以尝试重新启动您的路由器、电脑或者更换网络连接方式,例如使用移动网络连接。 GitHub 服务器问题:GitHub 服务器可能正在进行维护或者出现了故障,您可以访问 www.githubstatus.com/ 来查看是否有服务中断的情况。 访问限制:如果您尝试访问的文件或者网站被限制了,可能需要您进行一些操作才能绕过限制。例如,您可能需要登录到您的 GitHub 账户,或者通过 VPN 来访问。 如果您确定了问题的原因,可以根据具体情况采取以下措施: 如果是网络连接问题,请尝试重新启动网络连接设备,或者更换网络连接方式。 如果是 GitHub 服务器问题,请等待一段时间后再尝试访问,或者您可以尝试通过 www.githubstatus.com/ 查看是否有服务中断的情况。 如果是访问限制问题,请尝试登录您的 GitHub 账户或者通过 VPN 来访问。

java实现大文件上传代码详解

java实现大文件上传代码详解 1.包括核对是否已有文件,拆分文件,合并文件 2.使用流解决 package com.cty.demo; import com.cty.domain.MultipartFileParam; import com.cty.util.JsonResult; import org.apache.commons.io.FileUtils; import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.channels.FileChannel; import java.util.*; import java.util.stream.Collectors; @RestController @RequestMapping("/bigFile") public class BigFileTest { private Logger logger = LoggerFactory.getLogger(BigFileTest.class); private String fileStorePath = "/Users/chentingyi/cty/java/project/demo/test/temp"; /** * @param fileMd5 * @Title: 判断文件是否上传过,是否存在分片,断点续传 * @MethodName: checkBigFile * @Exception * @Description: 文件已存在,1 * 文件没有上传过,0 * 文件上传中断过,2 以及现在有的数组分片索引 */ @RequestMapping(value = "

ChatGPT协助中 英文-论文写作技巧

一、查重 输入以下句子,然后在输入需要 降重的语句即可。 Reduce the repetition rate of the following paragraphs by changing the word order, substituting synonyms, etc: 2、优化句子 输入以下句子,然后在输入需要 降重的语句即可。 I want you to act as an expert in scientific writing, i will provide you with some paragraphs in English or Chinese and your task is to rewriten the paragraph in the original language. You should use artificial intelligence tools, such as natural language processing, and rhetorical knowledeg and your expertise in effective scientific writing techniques to reply.

jdk8切换jdk17失败问题处理

切记当jdk8切换jdk17不好用时,记得查看环境变量path里面的JAVA_HOME/bin的位置,如果配置在了path的下面很有可能不好使,此时将path里面的JAVA_HOME\bin上移到最上面就好用了

pip常用命令

基本的命令解释,如下图: 安装 sudo easy_install pip 列出已安装的包 pip freeze or pip list 导出requirements.txt pip freeze > <目录>/requirements.txt 安装包 在线安装 pip install <包名> 或 pip install -r requirements.txt 通过使用== >= <= > <来指定版本,不写则安装最新版 requirements.txt内容格式为: APScheduler==2.1.2 Django==1.5.4 MySQL-Connector-Python==2.0.1 MySQL-python==1.2.3 PIL==1.1.7 South==1.0.2 django-grappelli==2.6.3 django-pagination==1.0.7 安装本地安装包 pip install <目录>/<文件名> 或 pip install --use-wheel --no-index --find-links=wheelhouse/ <包名> <包名>前有空格 可简写为 pip install --no-index -f=<目录>/ <包名> 卸载包 pip uninstall <包名> 或 pip uninstall -r requirements.txt 升级包 pip install -U <包名>