Spring boot中日志文件配置(已废)

问题 因为Spring boot的默认日志配置存在丢失日志的情况,所以导致这里需要手动配置一下日志。 步骤 配置日志文件:logback-spring.xml配置jvm启动参数 logback-spring.xml 具体配置如下: <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false"> <!--日志文件主目录:这里${user.home}为当前服务器用户主目录--> <property name="LOG_HOME" value="${user.home}/log"/> <!--日志文件名称:这里spring.application.name表示工程名称--> <springProperty scope="context" name="APP_NAME" source="spring.application.name"/> <!--默认配置--> <include resource="org/springframework/boot/logging/logback/defaults.xml"/> <!--配置控制台(Console)--> <include resource="org/springframework/boot/logging/logback/console-appender.xml"/> <!--配置日志文件(File)--> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--设置策略--> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志文件路径:这里%d{yyyyMMdd}表示按天分类日志--> <FileNamePattern>${LOG_HOME}/%d{yyyyMMdd}/${APP_NAME}.%i.log</FileNamePattern> <!--日志文件最大的大小--> <maxFileSize>100MB</maxFileSize> <!--日志保留天数--> <MaxHistory>30</MaxHistory> </rollingPolicy> <!--设置格式--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> <!-- 或者使用默认配置 --> <!--<pattern>${FILE_LOG_PATTERN}</pattern>--> <charset>utf8</charset> </encoder> </appender> <!-- 将文件输出设置成异步输出 --> <appender name="ASYNC-FILE" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!

爬虫系列实战:使用json解析天气数据

大家好,爬虫是一项非常抢手的技能,收集、分析和清洗数据是数据科学项目中最重要的部分,本文介绍使用json解析气象局天气数据。 在官网上获取天气数据信息,可以定义当前查询的位置,提取时间、温度、湿度、气压、风速等信息,并导入requests、matplotlib这些需要用到的库。 # 导入以下模块 import requests import matplotlib.pyplot as plt import pylab as pl 1.获取今日天气 调用api接口地址,获取天气数据接口,本文获取57494代表武汉的数据接口,进而获取json数据,并判断json请求是否成功。 def get_weather(): # 调用api接口地址 # 获取57494代表武汉的天气数据接口 url = "https://weather.cma.cn/api/now/57494" # 获取json数据 json_datas = requests.get(url=url).json() #判断json请求是否成功? if json_datas.get("msg") == "success": # 请求成功 json_location = json_datas.get("data").get("location") # 位置信息 print('\n', '当前查询的位置'.center(50, '—')) print("城市代码: " + json_location.get("id") + " 城市名称: " + json_location.get("name") +" 详细地址: " + json_location.get("path")); # 当天天气信息 json_now_data = json_datas.get("data").get("now") # 获取最新发布时间 now_time = "

LangChain库的对话记忆机制

摘要 在人工智能领域,对话记忆是聊天机器人技术的一个重要组成部分。它使得机器人能够记住与用户的历史交互,从而进行连贯的对话。如果没有对话记忆,每个查询都会被当作完全独立的输入来处理,这将大大降低对话的连贯性和实用性。 什么是对话记忆 对话记忆指的是机器人记住与用户之前交互的能力。默认情况下,机器人是无状态的,也就是说,它们处理每个输入时都不会考虑之前的交互。对话记忆的存在,使得机器人能够记住之前的交互,这在聊天机器人等应用中非常重要。 LangChain库和对话记忆 LangChain是一个用于构建语言模型应用的框架,它提供了多种实现对话记忆的方法。在这里,我们将探索LangChain库中对话记忆的不同形式。 安装LangChain pip install -qU langchain openai tiktoken 初始化LangChain 在LangChain中,我们首先需要设置使用的语言模型。例如,使用OpenAI的GPT模型: from langchain import OpenAI from getpass import getpass OPENAI_API_KEY = getpass() llm = OpenAI( temperature=0, openai_api_key=OPENAI_API_KEY, model_name='text-davinci-003' ) 对话记忆的类型 LangChain提供了几种不同的对话记忆类型,每种类型都有其特点和适用场景。 ConversationBufferMemory:这种记忆类型保留对话的原始片段,使得机器人可以回顾整个对话历史。这种机制简单直接,这种方法也存在一些缺点,由于LLM token限制,并不总是能够按预期存储所有内容。并且token的高使用率会导致响应时间变慢和计算成本增加。 ConversationBufferWindowMemory:这种记忆类型只保留最近的几次交互,类似于短期记忆,适用于需要快速响应的场景。 ConversationSummaryMemory:这种记忆类型通过LLM对对话历史进行摘要,有助于减少记忆占用的空间,适用于长对话。 ConversationKGMemory:这种记忆类型基于知识图谱,将对话中的实体和它们的关系存储起来,适用于需要理解和利用复杂关系的场景。 实例:使用对话记忆 在 LangChain 中,链通常用于分解任务,由链接组成。Lang Chain提供了 ConversationChain,它是专门为有一些记忆概念的场景而创建的。创建类的实例时ConversationChain,必须提供三个参数: llm,指定用于生成响应的语言模型;memory,它确定用于存储对话历史记录的内存类型;verbose,控制通话过程中是否打印提示等信息。 ConversationBufferMemory: 示例代码: from langchain.llms import OpenAI from langchain.chains import ConversationChain from langchain.chains.conversation.memory import ConversationBufferMemory # 初始化大型语言模型 api_key = "你的api密钥" api_url = "你的api网址" model_name = "

如何注册谷歌开发者账号

1.首先你必须有一个普通的谷歌账号 如果没有去👇注册 https://accounts.google.com/lifecycle/steps/signup/name?continue=https://play.google.com/apps/publish%23&dsh=S118158135:1705479820583283&flowEntry=SignUp&flowName=GlifWebSignIn&service=androiddeveloper&theme=glif&TL=AHNYTIQENFsoCJUhvDlwXr2sP114ceMpyFLwIEIMCvFmZsr9LFlDwPwSZIHQhUYC 2.注册成功之后,进入https://play.google.com/console/about/ 3.登录谷歌账号 4.按照提示,一步一步完成信息的填写,到最后需要支付25美金,需要上传一张信用卡进行支付 5.支付完成之后,首页如果显示需要验证就进行验证 6.验证完成后就是等待啦!

【Java】WGS84转2000国家大地坐标系(CGCS2000)

引用Eclipse在github上的一个开源项目https://github.com/locationtech/proj4j 1. pom.xml引入依赖 <!-- https://mvnrepository.com/artifact/org.locationtech.proj4j/proj4j --> <dependency> <groupId>org.locationtech.proj4j</groupId> <artifactId>proj4j</artifactId> <version>1.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.locationtech.proj4j/proj4j-epsg --> <dependency> <groupId>org.locationtech.proj4j</groupId> <artifactId>proj4j-epsg</artifactId> <version>1.3.0</version> </dependency> 2. 转换工具类定义 // 导包 import org.locationtech.proj4j.*; // 工具类定义 public class CoordinatesUtil { /** * WGS84->2000国家大地坐标系(CGCS2000) * * @param longitude WGS84经度值 * @param latitude WGS84纬度值 * @return x,y CGCS2000经度值,CGCS2000纬度值 */ public static String WGS84ToCGCS2000(double longitude, double latitude) { CRSFactory crsFactory = new CRSFactory(); CoordinateReferenceSystem WGS84 = crsFactory.createFromName("epsg:4326"); // 根据经度范围确定转换标准,具体EPSG定义参考https://epsg.io String degree3EPSG = "

重学Java 8 数组Arr.2

可现实中,幸福永远缺货 ——24.1.17 一、内存图 1.内存:可以理解为“内存条”,所有的软件,程序运行起来都会进入到内存中,占用内存,在java的世界中,将内容划分成了5块 2.分为哪五块呢: ①栈(Stack)* 主要运行方法,方法的运行都会进栈内存运行,运行完毕之后,需要“弹栈”,为了向空间释放内存 ②堆(Heap)* 保存的是对象,数组,每new依次,都会在堆内存中开辟空间,并为这个空间分配一个地址值,堆内存中的数据都是有默认值的 整数:0 小数:0.0 字符:'\u0000' 布尔:false 引用:null ③方法区 (Method Area)* 找到的“预备区”,记录了类和方法的信息 方法区中主要保存class文件以及其中的信息 代码运行之前,需要先进内存(方法区) ④本地方法栈(Native Method Stack):专门运行native方法(本地方法) 本地方法可以理解为堆对java功能的扩充 有很多功能,java语言实现不了,所以就需要依靠本地方法完成(C语言编写) ⑤寄存器(pc register):和CPU有关 1.堆、栈、方法区的配合示意图 2.一个数组的内存图 public static void main(String[] args) { int[] arr1 = new int[3]; System.out.println(arr1); System.out.println(arr1[1]); arr1[1] =100; System.out.println(arr1[1]); } 3.两个数组的内存图 我们创建了两个数组,在堆内存中开辟了两个不同的空间,此时修改一个空间中的数据不会影响到另外一个空间的数据 public static void main(String[] args) { int[] arr1 = new int[3]; System.out.println(arr1); System.out.println(arr1[1]); arr[1] =100; System.out.println(arr1[1]); int[] arr2 = new int[3]; System.

【大厂-靠谱程序员】通用能力模型

最近几年面过很多人,普遍认识技术是硬实力,但是一些意识、软实力方面对职场发展至关重要。 提炼了一些关键点跟大家分享。希望某些点可以引起共鸣。欢迎刚开始或者马上工作的年轻人主动找我交流,私信或者邮件。dizuo#126.com 目录 基础篇 1)价值输出, 2)关注细节 3)善于总结,提炼,演绎 4)工具集输出,提效 高阶篇 1)主动意识 2)产品思维 3)冷静思考 4)提炼积累方法论 5)持续学习能力 基础篇 1)价值输出, 工程师价值输出的方式。搞定问题很重要, 低级的知道怎么解, 中级的知道什么是最优解, 高级的不知道怎么解 但是找对的人去解。 价值输出的最大化,产出专利。专利关键点:解决什么问题,行业类似方案,该方案是否可以被放大化 2)关注细节 代码质量,用户体验、用户体验、用户体验 3)善于总结,提炼,演绎 善于用图表化,数据化 展示, 对比展示出冲突点,同时结论要自洽。 4)工具集输出,提效 对固化的事情,持续观察数据和提效,跟过去对比 高阶篇 1)主动意识 向前一步,问题跟到底,跟透了 2)产品思维 关注线上运营思路,多体验产品 3)冷静思考 不人云亦云,寻求最优解, 4)提炼积累方法论 多复盘 沉淀一些东西出来, 5)持续学习能力 保持输入,提升技术视野,了解周边,培养多元化视角, 最后也欢迎优秀的年轻人自荐!

【RPC】网络通信:哪种网络IO模型最适合RPC框架?

一、背景 RPC是解决进程间通信的一种方式。一次RPC调用,本质就是服务消费者与服务提供者间的一次网络信息交换的过程。服务调用者通过网络IO发送一条请求消息,服务提供者接收并解析,处理完相关的业务逻辑之后,再发送一条响应消息给服务调用者,服务调用者接收并解析响应消息,处理完相关的响应逻辑,一次RPC调用便结束了。可以说,网络通信是整个RPC调用流程的基础。 二、常见的网络IO模型 那说到网络通信,就不得不提一下网络IO模型。为什么要讲网络IO模型呢?因为所谓的两台PC机之间的网络通信,实际上就是两台PC机对网络IO的操作。 常见的网络IO模型分为四种:同步阻塞IO(BIO)、同步非阻塞IO(NIO)、IO多路复用和异步非阻塞IO(AIO)。在这四种IO模型中,只有AIO为异步IO,其他都是同步IO。 其中,最常用的就是同步阻塞IO和IO多路复用。 2.1、阻塞IO(blocking IO) 同步阻塞IO是最简单、最常见的IO模型,在Linux中,默认情况下所有的socket都是blocking的,先看下操作流程。 首先,应用进程发起IO系统调用后,应用进程被阻塞,转到内核空间处理。之后,内核开始等待数据,等待到数据之后,再将内核中的数据拷贝到用户内存中,整个IO处理完毕后返回进程。最后应用的进程解除阻塞状态,运行业务逻辑。 这里我们可以看到,系统内核处理IO操作分为两个阶段——等待数据和拷贝数据。而在这两个阶段中,应用进程中IO操作的线程会一直都处于阻塞状态,如果是基于Java多线程开发,那么每一个IO操作都要占用线程,直至IO操作结束。 这个流程就好比我们去餐厅吃饭,我们到达餐厅,向服务员点餐,之后要一直在餐厅等待后厨将菜做好,然后服务员会将菜端给我们,我们才能享用。 2.2、IO多路复用(IO multiplexing) 多路复用IO是在高并发场景中使用最为广泛的一种IO模型,如Java的NIO、Redis、Nginx的底层实现就是此类IO模型的应用,经典的Reactor模式也是基于此类IO模型。 那么什么是IO多路复用呢?通过字面上的理解,多路就是指多个通道,也就是多个网络连接的IO,而复用就是指多个通道复用在一个复用器上。 多个网络连接的IO可以注册到一个复用器(select)上,当用户进程调用了select,那么整个进程会被阻塞。同时,内核会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从内核中拷贝到用户进程。 在多路复用模型中,内核仅有一条线程负责处理所有连接,所有网络请求/连接(Socket)都会利用通道Channel注册到选择器上,然后监听器负责监听所有的连接,过程如下: 阶段一: 用户进程调用select,指定要监听的FD集合 核监听FD对应的多个socket 任意一个或多个socket数据就绪则返回readable 此过程中用户进程阻塞 阶段二: 用户进程找到就绪的socket 依次调用recvfrom读取数据 内核将数据拷贝到用户空间 用户进程处理数据 当用户去读取数据的时候,不再去直接调用recvfrom了,而是调用select的函数,select函数会将需要监听的数据交给内核,由内核去检查这些数据是否就绪了,如果说这个数据就绪了,就会通知应用程序数据就绪,然后来读取数据,再从内核中把数据拷贝给用户态,完成数据处理,如果N多个FD一个都没处理完,此时就进行等待。 同样好比我们去餐厅吃饭,这次我们是几个人一起去的,我们专门留了一个人在餐厅排号等位,其他人就去逛街了,等排号的朋友通知我们可以吃饭了,我们就直接去享用了。 2.3、为什么说阻塞lO和lO多路复用最为常用? 了解完二者的机制,我们就可以回到起初的问题了——我为什么说阻塞IO和IO多路复用最为常用。对比这四种网络IO模型:阻塞IO、非阻塞IO、IO多路复用、异步IO。实际在网络IO的应用上,需要的是系统内核的支持以及编程语言的支持。 在系统内核的支持上,现在大多数系统内核都会支持阻塞IO、非阻塞IO和IO多路复用,但像信号驱动IO、异步IO,只有高版本的Linux系统内核才会支持。 在编程语言上,无论C++还是Java,在高性能的网络编程框架的编写上,大多数都是基于Reactor模式,其中最为典型的便是Java的Netty框架,而Reactor模式是基于IO多路复用的。当然,在非高并发场景下,同步阻塞IO是最为常见的。 综合来讲,在这四种常用的IO模型中,应用最多的、系统内核与编程语言支持最为完善的,便是阻塞IO和IO多路复用。这两种IO模型,已经可以满足绝大多数网络IO的应用场景。 2.4、RPC框架在网络通信上倾向选择哪种网络IO模型? IO多路复用更适合高并发的场景,可以用较少的进程(线程)处理较多的socket的IO请求,但使用难度比较高。当然高级的编程语言支持得还是比较好的,比如Java语言有很多的开源框架对Java原生API做了封装,如Netty框架,使用非常简便;而GO语言,语言本身对IO多路复用的封装就已经很简洁了。 而阻塞IO与IO多路复用相比,阻塞IO每处理一个socket的IO请求都会阻塞进程(线程),但使用难度较低。在并发量较低、业务逻辑只需要同步进行IO操作的场景下,阻塞IO已经满足了需求,并且不需要发起select调用,开销上还要比IO多路复用低。 RPC调用在大多数的情况下,是一个高并发调用的场景,考虑到系统内核的支持、编程语言的支持以及IO模型本身的特点,在RPC框架的实现中,在网络通信的处理上,我们会选择IO多路复用的方式。开发语言的网络通信框架的选型上,我们最优的选择是基于Reactor模式实现的框架,如Java语言,首选的框架便是Netty框架(Java还有很多其他NIO框架,但目前Netty应用得最为广泛),并且在Linux环境下,也要开启epoll来提升系统性能(Windows环境下是无法开启epoll的,因为系统内核不支持)。 了解完以上内容,我们可以继续看这样一个关键问题——零拷贝。在我们应用的过程中,他是非常重要的。 三、什么是零拷贝? 系统内核处理IO操作分为两个阶段——等待数据和拷贝数据。等待数据,就是系统内核在等待网卡接收到数据后,把数据写到内核中;而拷贝数据,就是系统内核在获取到数据后,将数据拷贝到用户进程的空间中。以下是具体流程: 应用进程的每一次写操作,都会把数据写到用户空间的缓冲区中,再由CPU将数据拷贝到系统内核的缓冲区中,之后再由DMA将这份数据拷贝到网卡中,最后由网卡发送出去。这里我们可以看到,一次写操作数据要拷贝两次才能通过网卡发送出去,而用户进程的读操作则是将整个流程反过来,数据同样会拷贝两次才能让应用程序读取到数据。 应用进程的一次完整的读写操作,都需要在用户空间与内核空间中来回拷贝,并且每一次拷贝,都需要CPU进行一次上下文切换(由用户进程切换到系统内核,或由系统内核切换到用户进程),这样是不是很浪费CPU和性能呢?那有没有什么方式,可以减少进程间的数据拷贝,提高数据传输的效率呢? 这时我们就需要零拷贝(Zero-copy)技术。 所谓的零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,都可以通过一种方式,让应用进程向用户空间写入或者读取数据,就如同直接向内核空间写入或者读取数据一样,再通过DMA将内核中的数据拷贝到网卡,或将网卡中的数据copy到内核。 那怎么做到零拷贝?你想一下是不是用户空间与内核空间都将数据写到一个地方,就不需要拷贝了?此时你有没有想到虚拟内存? 零拷贝有两种解决方式,分别是 mmap+write 方式和 sendfile 方式,mmap+write方式的核心原理就是通过虚拟内存来解决的。 参考:【操作系统】一文带你深入浅出零拷贝技术 四、Netty中的零拷贝 我刚才讲到,RPC框架在网络通信框架的选型上,我们最优的选择是基于Reactor模式实现的框架,如Java语言,首选的便是Netty框架。那么Netty框架是否也有零拷贝机制呢?Netty框架中的零拷贝和我之前讲的零拷贝又有什么不同呢? 刚才我讲的零拷贝是操作系统层面上的零拷贝,主要目标是避免用户空间与内核空间之间的数据拷贝操作,可以提升CPU的利用率。 而Netty的零拷贝则不大一样,他完全站在了用户空间上,也就是JVM上,它的零拷贝主要是偏向于数据操作的优化上。 在传输过程中,RPC并不会把请求参数的所有二进制数据整体一下子发送到对端机器上,中间可能会拆分成好几个数据包,也可能会合并其他请求的数据包,所以消息都需要有边界。那么一端的机器收到消息之后,就需要对数据包进行处理,根据边界对数据包进行分割和合并,最终获得一条完整的消息。 那收到消息后,对数据包的分割和合并,是在用户空间完成,还是在内核空间完成的呢? 当然是在用户空间,因为对数据包的处理工作都是由应用程序来处理的,那么这里有没有可能存在数据的拷贝操作?可能会存在,当然不是在用户空间与内核空间之间的拷贝,是用户空间内部内存中的拷贝处理操作。Netty的零拷贝就是为了解决这个问题,在用户空间对数据操作进行优化。 那么Netty是怎么对数据操作进行优化的呢? Netty 提供了 CompositeByteBuf 类,它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf,避免了各个 ByteBuf 之间的拷贝。

python简单小游戏代码200行,python超简单小游戏代码

大家好,给大家分享一下python简单小游戏代码200行,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 来源丨网络 经常听到有朋友说,学习编程是一件非常枯燥无味的事情。其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天我想跟大家分享几个Python小游戏,教你如何通过边打游戏边学编程! 1、吃金币 源码分享: import os import cfg import sys import pygame import random from modules import * '''游戏初始化''' def initGame(): # 初始化pygame, 设置展示窗口 pygame.init() screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption('catch coins —— 九歌') # 加载必要的游戏素材 game_images = {} for key, value in cfg.IMAGE_PATHS.items(): if isinstance(value, list): images = [] for item in value: images.append(pygame.image.load(item)) game_images[key] = images else: game_images[key] = pygame.image.load(value) game_sounds = {} for key, value in cfg.

fedavg学习(个人学习笔记)

运行代码 一、环境配置 1. 首先确保你已经在项目目录下激活了虚拟环境,不然会下载到默认路径! 在终端进入项目目录,并运行以下命令: <python路径>\Scripts\activate 激活后会显示自己的需要你环境名,如下: 2. 去pytorch官网下载对应电脑配置的pytorch,选好cuda版本 不清楚如何选择版本的可以先进入命令行窗口,执行命令nvidia-smi查看驱动版本号 如图,表格右上角就是我的版本号 : 因为我的版本比较高,所以我在官网上选择的是这个: 3. 复制刚刚官网下面的coomand,直接在自己的python虚拟环境中执行即可一键安装,非常快捷,如果安装配置成功就可以运行代码了。 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 注意这段指令是我所安装的版本,大家安装时应该根据自己电脑的配置在官网进行选择 4. 检查安装:可以在终端运行如下指令检查pytorch、cuda是否成功安装 python import torch print(torch.cuda.device_count()) torch.cuda.is_available() 如果成功,终端会显示: 1 True 到这里就配置好了,当然过程中可能没有这么顺利,会出现很多报错,需要一个一个检查修复。 我之前第一次就是出了很多报错,自己一个一个研究了很久,网上搜了很多博客,还和同学讨论,最后也是解决了,比较艰辛 二、运行测试 1. 在pycharm终端输入下面指令 测试一下 python main_fed.py --dataset cifar --epoch 10 --num_channel 3 --gpu 0 --model cnn --iid 如果cuda没有配置成功,这一步会报错!!! 该指令选择了 CIFAR 数据集,卷积神经网络 (CNN),在使用独立同分布 (IID) 的数据进行训练,轮次为10轮,结果如下图: 2. 修改一下参数继续测试,这次选择了 MNIST数据集跑50轮 python main_fed.py --dataset mnist --iid --num_channels 1 --model cnn --epochs 50 --gpu 0 运行结果如下

mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly

终端输入mvn -version报错: The JAVA_HOME environment variable is not defined correctly, this environment variable is needed to run this program. Java环境变量的问题,打开bash_profile查看 open ~/.bash_profile export JAVA_8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk/Contents/Home alias jdk8='export JAVA_HOME=$JAVA_8_HOME' #java17 export JAVA_17_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home alias jdk17='export JAVA_HOME=$JAVA_17_HOME' JAVA_HOME=$JAVA_8_HOME export PATH=$PATH:/usr/local/mysql/bin export PATH="/opt/homebrew/opt/mysql@5.7/bin:$PATH" # export PATH=${PATH}:/Users/gorwaywong/Library/Python/3.9/bin export PATH="/Users/gorwaywong/anaconda3/bin:$PATH" # >>> conda initialize >>> # !! Contents within this block are managed by 'conda init' !! __conda_setup="$('/Users/gorwaywong/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" if [ $? -eq 0 ]; then eval "

iTMSTransporter上传ipa文件

背景 uni-app云打包之后生成的ipa包需要上传到app store上,applicationloader和香蕉云编都收费,转用iTMSTransporter上传 环境:mac 第1步 选择安装目录 xcode-select --switch /Applications/Xcode.app/Contents/Developer 第2步 下载 xcrun iTMSTransporter 安装目录在 /Applications/Xcode.app/Contents/Developer/usr/bin/iTMSTransporter 第3步 添加环境变量 vi ~/.zshrc // 添加如下配置 #iTMSTransporter begin export TRANSPORTER_HOME=/Applications/Xcode.app/Contents/Developer/usr export PATH=${PATH}:${TRANSPORTER_HOME}/bin# #iTMSTransporter end // 配置更新 source ~/.zshrc 第4步 测试 iTMSTransporter -version 第5步 上传 iTMSTransporter -m upload -assetFile <ipa路径> -u <username> -p <appId管理中创建的App 专用密码> -asc_provider <团队id> -v informational -asc_provider <团队id> 可不加,如果自己的账号加入了多个团队需要加,否则会报错 Error Messages: could not find a provider public id: actorsGetCollection call failed with: 401 - { "

Android.bp详解+入门必备

Android.bp详解+入门必备 文章目录 Android.bp详解+入门必备一、前言二、Android.bp 文件模版1、编译.jar包2、编译apk(1)以apk编译apk?(2)以java源码编译apk 3、编译动态库.so4、编译静态库.a5、Android.mk 编译文件小结编译类型的BuildType总结:Android系统源码编译Android.bp文件方式: 三、Android.bp 具体示例四、Android.bp 主要属性五、总结1、Android.bp 的简单使用总结2、Android.bp 详解3、Android.bp的其他知识(1)Android所有bp属性和mk属性的对照关系完整文件:(2)Android.bp文件编译的模块类型和属性定义字符串都是大写的(3)其他 一、前言 Android.bp 就是为了用来替换 Android.mk 一个脚本语言文件。 如果学习过Android.mk,在学习一下Android.bp应该是很easy的,如果不是很熟悉可以学习了解一下。 Android.bp和Android.mk作用都是一样的,在系统源码中用来编译出类库.jar,应用文件.apk,动态库.so,静态库.a作用。其中关键的就是模块类型定义和不同的属性定义。 Android.bp文件用类似json的简洁声明来描述需要构建的模块。 Android.bp文件是Android 7.0及更高版本中引入的一种构建脚本文件,用于描述和管理项目的编译过程。 Android.bp文件是使用Starlark语法编写的,它是一种基于Python的轻量级脚本语言。 Android.bp文件用于定义模块和构建规则,与之前的Android.mk文件相比,更加灵活和易于维护。 对Android.mk-入门必备的详细介绍: https://blog.csdn.net/wenzhi20102321/article/details/135631544 二、Android.bp 文件模版 1、编译.jar包 java_library { name: "mylibrary", srcs: ["src/**/*.java"], static_libs: ["lib1", "lib2"], javac_flags: ["-source 1.8", "-target 1.8"], aaptflags: ["--auto-add-overlay"], manifest: "AndroidManifest.xml", resource_dirs: ["res"], dex_preopt: { enabled: true, }, dex_preopt_config: "dexpreopt.config", dex_preopt_uses_art: true, dex_preopt_omit_shared_libs: true, optional: true, } 2、编译apk (1)以apk编译apk? 就是给普通apk加上系统签名变成系统apk的作用。 从最新的Android13 源码看bp文件未看到与mk文件对应的编译类型。 具体可以查看:Android.mk 与 Android.

CentOS增加虚拟内存

CentOS增加虚拟内存 目的是解决一些CPU1核内存2G甚至1G的云服务器内存不足的情况。 方法来自https://www.moguit.cn/ 查看磁盘使用情况 free -h 添加Swap分区 dd if=/dev/zero of=/var/swapfile bs=1024 count=4194304 添加4G虚拟内存。(CentOS7会自带1G的Swap分区,添加完成后使用free -h会看到有5G的虚拟内存。) 格式化交换文件 转换为Swap分区 mkswap /var/swapfile 挂载并激活分区 swapon /var/swapfile 对于0644警告: chmod -R 0600 /var/swapfile 设置开机自动挂载该分区 echo "/var/swapfile swap swap defaults 0 0" >> /etc/fstab 查看分区是否成功 top 看到有KiB Mem 和KiB Swap,且空间大小与设置的对应就成功。 更改Swap配置 这一部分是设置系统,在原本的物理内存用到什么程度,才开始使用虚拟内存。 查看当前swappiness数值(wappiness表示系统对Swap分区的依赖程度) cat /proc/sys/vm/swappiness 修改swappiness值为10 sysctl vm.swappiness=10 设置永久有效 echo "vm.swappiness = 10" >> /etc/sysctl.conf 删除Swap分区 停止正在使用的swap分区 swapoff /var/swapfile 删除swap分区文件 rm -rf /var/swapfile 删除或注释掉之前在fstab文件里追加的开机自动挂载配置内容 vim /etc/fstab #把下面内容删除 /var/swapfile swap swap defaults 0 0

error: cannot spawn .husky/pre-commit: No such file or directory

遇到的问题 在使用husky为项目添加自动格式化后再提交的时候,出现了这样的问题。检查了一圈,文件也在,就是每次提交都出现这个问题,我还以为是husky的版本问题,原来是我在文件里面写了多余的注释 有些配置文件不能写多余的注释 解决办法: 将多余的注释给删了,需要在前面留一段注释 我是这样写的: pre-commit:文件: #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npm run format commit-msg文件代码块 #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" npm run commitlint 前面留下这一段注释就行 pnpm 就不需要run了 大佬也是这么说的 地址:Cannot spawn .husky/pre-commit: No such file or directory 后续:我这样提交了之后又出现新的问题: 检查之后发现,忘记在package.json的script的标签加上一个命令行: "format": "prettier --write \"./**/*.{html,vue,ts,js,json,md}\"", 注意: 每次修改在提交的时候需要重新git add一下,并且git commit -m “xxx:提交的内容”,其中xxx为你设置提交需要携带的文字要求我的是这样的 'feat',//新特性、新功能 'fix',//修改bug 'docs',//文档修改 'style',//代码格式修改, 注意不是 css 修改 'refactor',//代码重构 'perf',//优化相关,比如提升性能、体验 'test',//测试用例修改 'chore',//其他修改, 比如改变构建流程、或者增加依赖库、工具等 'revert',//回滚到上一个版本 'build',//编译相关的修改,例如发布版本、对项目构建或者依赖的改动 配置husky 要做到这件事情,就需要利用husky在代码提交之前触发git hook(git在客户端的钩子),然后执行`pnpm run format`来自动的格式化我们的代码。 1.

SIwave仿真手册——信号完整性仿真之背钻、模型添加、HFSS求解区域的划分(三)

目录 二、信号完整性仿真2.2 背钻、模型添加、HFSS求解区域的划分2.2.2 背钻设置2.2.3 HFSS区域划分(HFSS Region in SIwave)附:1、如何查看差分S参数?(前提:一定要去定义差分对)2、如何查看mesh划分情况?3、对于差分S参数而言:==如果有学习建议、意见、欢迎评论区见哦,如果觉得写的还行,点个赞吧:)== 上一篇简单了讲述了 S参数的提取,本次博客更新关于 背钻、模型添加、HFSS求解区域的划分的仿真,因为第二章完整的内容比较多,所以分成好几篇博客进行分享。 二、信号完整性仿真 2.2 背钻、模型添加、HFSS求解区域的划分 模型大致可以分成2种:Spice模型和S参数模型 点击Tools →SPICE/S-para vendor model assignment →弹出对话框SPICE/S-para Vendor Component Management → 选择manufacturer、size、series等,点击filter → 选择对应的模型 →点击OK 再回到SPICE/S-para Vendor Component Management界面,刚才添加的电容模型就出现了。 2.2.2 背钻设置 1、选中过孔所在的网络 2、点击Advanced → Backdrill settings → 弹出“Backdrill settings”对话框 3、如下:(这里作为演示,只点击了一个网络,所以只显示了一个网络) 2.2.3 HFSS区域划分(HFSS Region in SIwave) 因为SIWAVE是2.5D的求解器,对于一些需要更高精度的仿真,可以将部分调入HFSS进行仿真。 划重点:这个功能特别有用,ANSYS的官网还专门为此出了一个白皮书,对比了仅使用SIwave、 SIwave+HFSS、 仅使用HFSS三种情况下的仿真结果差异(精度对比、占用资源对比、仿真时长对比)。 见下面的链接 HFSS Regions in SIwave – Best of Both Worlds:https://www.ansys.com/resource-center/white-paper/hfss-regions-siwave 1、圈出需要HFSS仿真的区域:点击home → 点击draw geometry → 点击下列图标,确定求解区域。

Jmeter接口测试实战篇:10分钟学会Jmeter的用法

一提到接口测试,通常大家会有这样的疑问:前端测试不是已经覆盖到各种业务逻辑了吗?为什么还要做接口测试,接口测试和前端测试是不是重复了?对于这个问题,可以从下面几个方面来解释: 什么是接口测试? 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 为什么要做接口测试? 现在很多系统前后端架构是分离的,从安全层面来说,只依赖前端进行限制已经完全不能满足系统的安全要求,需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。 如今系统越来越复杂,传统的靠前端测试已经大大降低了效率,而且现在我们都推崇测试前移,希望测试能更早的介入测试,那接口测试就是一种及早介入的方式。例如传统测试,你是不是得等前后端都完成你才能进行测试,才能进行自动化代码编写。 而如果是接口测试,只需要前后端定义好接口,那这时自动化就可以介入编写接口自动化测试代码,手工测试只需要后端代码完成就可以介入测试后端逻辑而不用等待前端工作完成。 接口测试实战案例分享 一、测试需求描述 1、 本次测试的接口为http服务端接口 2、 这里我们举例2个保存数据的接口,因为这两个接口有关联性,比较有代表性; 保存信用卡账户信息接口: 保存信用卡账单接口: 注:这个保存逻辑在接口开发设计文档中可能没有写或写的不详细,这时要与开发接口人员或产品人员多多沟通去熟悉接口逻辑 二、使用工具测试 为什么选择Jmeter进行http接口测试? 在进行网页或应用程序后台接口开发时,一般要及时测试开发的接口能否正确接收和返回数据,对于单次测试,Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求,而对于模拟多用户并发等性能测试,就必须借助其他的工具了,这里推荐功能强大的JMeter自动化测试工具,Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库, FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。 下面我就简单的介绍下使用Jmeter进行接口测试的方法。 如何使用Jmeter进行接口测试? 1、首先邮件添加一个线程组,这里我们重命名InterfaceTest 2、在线程组上添加一个Http默认请求,并配置服务器的IP地址和传输编码 在线程组中添加一个HTTP请求,这里我们重命名“增加 信用卡账户信息接口 ” 配置接口请求信息,这配置示例如下: 在保存信用卡账单接口请求,示例如下: 注:由于Jmeter请求线程组内的请求时从第一个开始执行,所以我们将需要最先执行的请求放在前面 6、在线程组上添加监听器,察看结果树和聚合报告 点击启动,运行结束后查看,结果树和聚合报告 8、去数据库中核对数据 9、大批量数据制造 思路: 1、可参数化的参数,保存信用卡账户信息接口( clientNo,cardNo ),保存信用卡账单接口( clientNo,cardNo, billMonth,paymentDate) 2、两个接口的依赖关系,保存信用卡账单接口( clientNo,cardNo)要和信用卡账户信息接口( clientNo,cardNo )的两个相同,也就是说这两个要用一个参数,且还不能重复。 根据上面两个接口的特点,( clientNo,cardNo) 我们选取使用计数器,每循环一次计数器加1,那么我们将线程组设置循环执行1万次; billMonth,paymentDate,这两个日期我们是使用随机函数${__Random(1,9,)},将月份参数化; 在线程组上创建计数器,配置如下: 4、引用计数器和随机函数 信用卡账户接口传入参数 args={ "clientNo":"${add}434343556", "alias": "**信用卡2", "cardName": "长城*****卡2", "cardNo": "${add}25622356788251", }

rocky linux 8.8 安装 fail2ban 提示 No module named ‘fail2ban‘

环境 系统:rocky linux 8.8Python版本:Python 3.6.8 安装 安装过程大概如下: # 下载 fail2ban 1.0.2版本 wget https://github.com/fail2ban/fail2ban/archive/refs/tags/1.0.2.tar.gz tar xzf 1.0.2.tar.gz && cd fail2ban-1.0.2 # 执行fail2ban自带的fail2ban-2to3工具进行转换 ./fail2ban-2to3 # 无意外最后会提示Success! # 进行单元测试 ./fail2ban-testcases-all-python3 # 测试完成后,进行最后一步安装 python3 setup.py install cp build/fail2ban.service /lib/systemd/system/ 在执行systemctl start fail2ban.service后提示: ● fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; disabled; vendor preset: disabled) Active: failed (Result: exit-code) since Thu 2023-10-26 21:39:57 CST; 3s ago Docs: man:fail2ban(1) Process: 2610466 ExecStart=/usr/local/bin/fail2ban-server -xf start (code=exited, status=1/FAILURE) Process: 2610464 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, status=0/SUCCESS) Main PID: 2610466 (code=exited, status=1/FAILURE) Oct 26 21:39:57 iZwz952biq4t3vffese51wZ systemd[1]: fail2ban.