友元函数和友元类

友元函数: 定义在类外的普通函数,不属于任何类,可以访问其他类的私有成员。但是需要在类的定义中声明友元函数友元类: 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。在另一个类里面也要相应的进行声明 class A { public: friend void set_show(int x, A &a); //该函数是友元函数的声明 private: }; void set_show(int x, A &a){} //友元函数定义,为了访问类A中的成员 ------------------------------------友元类 class A { public: friend class C; //这是友元类的声明 private: int data; }; class C //友元类定义,为了访问类A中的成员 { public: void set_show(int x, A &a) { a.data = x; cout<<a.data<<endl;} }; int main(void) { class A a; class C c; c.set_show(1, a); return 0; } 注意: 1. 友元关系不能被继承。 2. 友元关系是单向的,不具有交换性。

Java四种引用

每一种语言都有着自己操作内存元素的方式,C语言通过指针,而java就是通过引用。作为一门面向对象的语言,在java中世事万物皆对象。但是我们操作的标识符实际上是对象的一个引用(reference)。今天我们来分析一下java中的四种引用。 java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括 1.强引用(StronglyReference),2.软引用(SoftReference),3.弱引用(Weak Reference),4.虚引用(Phantom Reference) 这4中引用强度依次逐渐减弱 Java中提供这四种引用类型主要有两个目的: 1.第一是可以让程序员通过代码的方式决定某些对象的生命周期; 2.第二是有利于JVM进行垃圾回收。 1.强引用 强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回 收掉被引用的对象。 强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。 private static void testStrongReference() { Object object = new Object(); Object[] objects = new Object[1000]; } 2.软引用(SoftReference) 如果一个对象具有软引用,内存空间足够,垃圾回收器就不会回收它; 如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。 软引用可用来实现内存敏感的高速缓存,比如网页缓存、图片缓存等。使用软引用能防止内存泄露,增强程序的健壮性。 SoftReference的特点是它的一个实例保存对一个Java对象的软引用, 该软引用的存在不妨碍垃圾收集线程对该Java对象的回收。 软引用声明格式: public class SoftRefence { public static void main(String[] args) { SoftReference<String> pen = new SoftReference<String>(new String("penguin")); System.out.println(pen.get()); //通知JVM进行内存回收 System.gc(); System.out.println(pen.get()); } } 输出: 可以看得出来,此时JVM内存充足,暂时还没有回收被软引用关联的对象。 软引用适合做缓存,在内存足够时,直接通过软引用取值,无需从真实来源中查询数据,可以显著地提升网站性能。当内存不足时,能让JVM进行内存回收,从而删除缓存,这时候只能从真实来源查询数据。 3.弱引用 (WeakReference) 弱引用也是用来描述那些非必须对象,但是它的强度比软引用更弱一些,被弱引用关联的对象只 能生存到下一次垃圾收集发生为止。当垃圾收集器开始工作,无论当前内存是否足够,都会回收掉只 被弱引用关联的对象。在JDK 1.

git使用【提交、回退、链接、公匙链接、分支操作、忽视文件】和 指令大全(一)

提示:有助于我们加深对git操作的使用 git详细的使用方法 前言(多人开发如何合并,点击👇🔗)链接如下👇(git合并分支的两种方法🔗)一、常用指令如下二、Git常用命令1.进入项目目录2.初始化本地git仓库3.查看版本库的状态4.把工作区的文件添加到暂存区5.把缓存区的文件提交到本地仓库6.查看版本库的历史操作记录 三、版本回退的git指令拉取分支的方法 四、本地仓库和远程仓库的连接五、添加公钥 sshkey1.ssh-keygen -t rsa -C "842166299@qq.com" #生成公钥(邮箱:注册码云的邮箱)2.cat ~/.ssh/id_rsa.pub #查看公钥3.ssh -T git@gitee.com #验证公钥是否添加成功,出现以下提示“successfully” 表示成功 六、分支操作七、.gitignore文件 前言(多人开发如何合并,点击👇🔗) 链接如下👇(git合并分支的两种方法🔗) git合并分支的两种方法🔗 一、常用指令如下 以下是一些常用的 Git 指令,它们可以帮助你在版本控制中管理代码和仓库: 1. `git init`: 在当前目录中初始化一个新的 Git 仓库。 2. `git clone <仓库URL>`: 克隆一个远程 Git 仓库到本地。 3. `git add <文件>`: 将文件添加到暂存区,准备提交。 4. `git commit -m "提交消息"`: 提交更改并附上一条提交消息。 5. `git status`: 显示工作区和暂存区的状态。 6. `git log`: 查看提交日志。 7. `git pull`: 从远程仓库拉取并合并最新的更改。 8. `git push`: 推送本地更改到远程仓库。 9. `git branch`: 列出本地分支。 10.

Android通过BluetoothDevice获取蓝牙地址

在Android中提供了BluetoothAdapter和BluetoothDevice两个类来实现对蓝牙设备的操作。那么我们要想获取蓝牙地址,可以通过以下步骤来实现 目录 1.获取BluetoothAdapter的实例 2.检查设备是否支持蓝牙 3.打开蓝牙 4.获取已配对的蓝牙设备列表 5.查找特定的蓝牙设备 6.获取蓝牙设备的地址 1.获取BluetoothAdapter的实例 首先,需要获取BluetoothAdapter的实例,以下代码会返回一个BluetoothAdapter的实例,可以通过这个实例来进行蓝牙设备的操作。 BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 2.检查设备是否支持蓝牙 在进行任何蓝牙设备操作之前,都需要先检查设备是否支持蓝牙。可以通过以下代码判断BluetoothAdapter实例是否为null,如果为null则表示设备不支持蓝牙。 if (bluetoothAdapter == null) { // 设备不支持蓝牙 return; } 3.打开蓝牙 在进行蓝牙设备操作之前,需要先打开蓝牙。我们可以通过以下代码会判断蓝牙是否已经打开,如果未打开则会弹出一个对话框提示用户打开蓝牙。 if (!bluetoothAdapter.isEnabled()) { Intent enableBluetoothIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBluetoothIntent, REQUEST_ENABLE_BLUETOOTH); } 4.获取已配对的蓝牙设备列表 接着,我们需要获取已配对的蓝牙设备列表。下面代码会返回一个Set集合,其中包含了所有已配对的蓝牙设备。 Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices(); 5.查找特定的蓝牙设备 如果我们知道设备的名称或其他条件,我们可以通过其名称来查找特定的蓝牙设备,比如我的蓝牙设备是“HC-05”,那么下面这段代码会遍历已配对的蓝牙设备列表,判断设备的名称是否与目标设备名称相同,如果相同则将目标设备赋值给targetDevice。 BluetoothDevice targetDevice = null; for (BluetoothDevice device : pairedDevices) { if (device.getName().equals("HC-05")) { targetDevice = device; break; } } 6.获取蓝牙设备的地址 最后,我们来获取蓝牙设备的地址,下面代码会判断targetDevice是否为null,如果不为null则获取蓝牙设备的地址,并进行相应的处理。 if (targetDevice !

云原生技术知识点

1. 请解释什么是云原生技术? 云原生技术是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。云原生计算基金会对云原生的定义:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中构建和运行可弹性扩展的应用。 云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API 。 这些技术的发展,一定是思想先行,它们是在云计算环境中构建、部署和管理现代应用程序的软件方法。现代企业希望构建高度可扩展、灵活且具有弹性的应用程序,可以快速更新以满足客户需求。为此,他们使用现代工具和技术,这些工具和技术本质上支持云基础设施上的应用程序 。 2. 请列举一些常见的云原生技术,并简要介绍它们的作用。 云原生技术的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API 。 容器是一种轻量级的虚拟化技术,它可以将应用程序及其依赖项打包到一个可移植的容器中,以便在不同的环境中运行。容器提供了一种简单的方法来打包、分发和运行应用程序,同时保证了应用程序在不同环境中的一致性 。 服务网格是一种基础设施层,它提供了一种透明的方式来管理微服务之间的通信。服务网格可以处理服务发现、负载均衡、故障恢复等问题,同时还支持自动化和可观察性 。 微服务是一种分布式架构设计理念,它将应用程序拆分成多个独立运行的进程或服务,每个进程或服务都可以独立地访问数据库。微服务可以提高应用程序的可伸缩性和弹性,同时降低了维护成本 。 不可变基础设施是指在部署过程中不会发生变化的基础架构。这种基础架构可以提供更高的可靠性和安全性,同时减少了人为错误和配置问题 。 声明式API是指一种描述系统状态和行为的接口,它使用声明式语言(如YAML或JSON)来描述系统状态和行为。声明式API可以使系统更加易于理解和维护,并提高了系统的可扩展性和弹性 。 3. 请解释什么是Kubernetes(K8s)?它在云原生架构中扮演什么角色? Kubernetes(K8s)是一个开源的容器编排平台,它可以自动完成在部署、管理和扩展容器化应用过程中涉及的许多手动操作。K8s 本质上就是用来简化微服务的开发和部署的,关注点包括自愈和自动伸缩、调度和发布、调用链监控、配置管理、Metrics 监控、日志监控、弹性和容错、API 管理、服务安全等,K8s 将这些微服务的公共关注点以组件形式封装打包到 K8s 这个大平台中,让开发人员在开发微服务时专注于业务逻辑的实现,而不需要去特别关系微服务底层的这些公共关注点,大大简化了微服务应用的开发和部署,提高了开发效率 。 在云原生架构中,K8s 扮演着非常重要的角色。它可以自动化地管理容器化应用程序的生命周期,包括部署、扩展和维护。K8s 还可以提供高可用性和容错性,以确保应用程序始终可用。此外,K8s 还可以提供安全性和监控功能,以确保应用程序始终保持安全和稳定 。 4. 请解释什么是Docker容器,以及它与虚拟机有什么区别? Docker 容器是一种轻量级的虚拟化技术,它可以将应用程序及其依赖项打包到一个可移植的容器中,以便在不同的环境中运行。Docker 容器与虚拟机有很多区别。以下是一些主要区别: 启动速度:启动虚拟机需要先启动虚拟机的操作系统,再启动应用,这个过程非常慢;而启动 Docker 相当于启动宿主操作系统上的一个进程。 占用资源:虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和 CPU 资源,一台普通的电脑就可以运行多个虚拟机;而 Docker 容器只需要占用少量的资源,甚至可以在一台手机上运行。 隔离性:虚拟机使用虚拟化技术将物理硬件抽象成多个虚拟硬件,每个虚拟机都运行在一个独立的操作系统中,之间相互隔离;而 Docker 容器也使用了 Linux 内核的隔离技术,但是由于它们共享同一个宿主机内核,所以相对来说隔离性不如虚拟机。 可扩展性:虚拟机可以很容易地扩展到多个物理服务器上;而 Docker 容器虽然也可以轻易地扩展到多个服务器上,但是由于它们共享同一个宿主机内核,所以相对来说可扩展性不如虚拟机。 5. 请解释什么是Istio服务网格?它的主要功能是什么? Istio是一个服务网格,它是一种应用程序感知的基础结构层,用于促进服务到服务的通信。它提供了负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码。Istio强大的控制平面带来了重要的特点,包括:使用TLS加密、强身份认证和授权的集群内服务到服务的安全通信 。 Istio的主要功能包括: 流量管理:Istio可以管理和控制进出应用程序的流量,包括负载均衡、故障恢复、指标和监控等。安全通信:Istio可以提供基于TLS/SSL的加密通信,以及MFAA(多因素认证)等安全机制。服务发现:Istio可以自动发现服务实例,并提供服务间通信的支持。故障注入:Istio可以模拟故障情况,以测试应用程序的弹性和容错能力。 6. 请解释什么是Prometheus监控和Grafana可视化?它们在云原生架构中的作用是什么? Prometheus是一个开源的系统监控和报警系统,它可以收集各种指标并存储在时间序列数据库中。Grafana是一个开源的度量分析和可视化工具,它可以将Prometheus中的数据可视化展示,并提供警报功能 。 在云原生架构中,Prometheus监控和Grafana可视化的作用是: Prometheus可以监控应用程序的运行状态,包括CPU、内存、网络等指标,帮助开发人员及时发现和解决问题。Grafana可以将Prometheus中的数据可视化展示,帮助用户更好地理解应用程序的运行状态和性能瓶颈。Grafana还可以提供警报功能,当应用程序出现异常时,可以及时通知相关人员进行处理。 7.

国际电离层参考模型IRI在python中的使用

IRI国际电离层参考模型:一个基于实测数据的模型,测量60~2000km处的电子密度、电子温度、离子密度、离子组成等参数的月平均值 International Reference Ionosphere https://blog.csdn.net/novanova2009/article/details/122023990 首先建立一个新的环境来使用模型 conda create -n iri python=3.8 安装iri2016 pip install iri2016 报错,没有安装scipy包,于是 pip install scipy 然后下载一个fortran sudo apt-get install gfortarn 然后就可以执行了 import iri2016 iono = iri2016.IRI("2003-11-21T12",(80,1000,10),100,100)#年月日时分秒字符串,高度列表(起始高度、终点高度、步长),经度和纬度。 print(iono) 也可以直接在终端执行命令输出图形,例如随高度的分布、随时间的变化、随纬度的变化等。 python -m iri2016.altitude 2003-11-21T12 -11.95 -76.77 python -m iri2016.latitude 2004-11-21T17 -76.77 python -m iri2016.time 2014-11-21 2014-11-22 1 -11.95 -76.77

(php毕业设计源码)基于php学生投票管理系统

基于php学生投票管理系统 项目获取请看文章最底下官网 学生投票管理系统,是基于php编程语言,mysql数据库进行开发,本系统分为学生和管理员两个角色,其中学生可以注册登陆系统,查看问卷调查表,可以填写调查表,自己创建调查表,查看调查表的调查数据;管理员对用户信息,调查表分类信息,调查表信息等进行管理。本系统页面简洁,功能完善,适合作为php毕业设计和php课程设计进行参考学习。 一.技术环境 php版本: 5.3以上 开发工具: notepad++,sublime,phpstorm都可 数据库: mysql 服务器: apache 集成环境: phpstudy,小皮面板,wamp都可以 详细技术:HTML+CSS+JS+PHP+MYSQL+PhpStudy 二.项目文件(项目获取请看文末官网) 系统源码+安装视频教程+数据库+安装环境+项目报告 三.系统功能 四.代码示例 <?php // +---------------------------------------------------------------------- // | 登录功能 // | 设计思路,获取到用户输入的账号和密码,验证用户输入的数据,验证通过, // | 保存用户的登录信息到数据库,并且生成cookie,提示用户登录成功 // +---------------------------------------------------------------------- //引用常用的函数 require_once('../../../config/config.php'); //获取登录的用户名 $name = $_POST['name']; //获取用户的登录密码 $password = $_POST['password']; //获取登录的角色 $role = $_POST['role']; //判断用户输入的用户名是否为空 if (!$name) { //如果为空,返回提示信息 ajaxReturn(0, '请输入用户名'); } //判断用户输入的密码是否为空 if (!$password) { ajaxReturn(0,'请输入密码'); } //sql语句 $sql = "SELECT * FROM users WHERE name='$name' AND password='$password'"

使用EasyExcel实现Excel表格的导入导出

使用EasyExcel实现Excel表格的导入导出 文章目录 使用EasyExcel实现Excel表格的导入导出1.集成easyExcel2.简单导出示例实体与excel列的映射导出excel的代码 3.Excel复杂表头导出与实体的映射导出代码 3.Excel导入 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便 16M内存23秒读取75M(46W行25列)的Excel(3.2.1+版本) 1.集成easyExcel <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </dependency> 2.简单导出示例 实体与excel列的映射 创建实体类使用 @ExcelProperty、@ExcelIgnore 等注解标识导出列; @ExcelIgnore 表示忽略此字段 @ExcelProperty 用于标识列 value属性设置列的名称,index属性设置设置列的序号 从 0 开始 更多注解说明在:前往 @Data @NoArgsConstructor @AllArgsConstructor public class GamesExcelVO { /** * @description: 使用@ExcelIgnore注解忽略此字段 **/ @ExcelIgnore private String id; /** * @description: 使用@ExcelProperty标识列 * value属性设置列的名称,index属性设置设置列的序号 从 0 开始 **/ @ExcelProperty(value = "名称",index = 0) private String name; @ExcelProperty(value = "类型",index = 1) private String type; @ExcelProperty(value = "

【小程序教程】零基础微信小程序开发及实例详解

本篇文章给大家带来了关于微信小程序的相关知识,主要介绍了微信小程序的开发步骤以及主要的过程详解,希望对大家有帮助。 一、微信小程序开发必备技术 一、HTML语言 HTML就是超文本标记语言的简写,HTML主要负责网页的骨架,就如同动物的骨架一样,HTML语言就是支撑网页布局的骨架。 二、CSS CSS,是层叠样式表的简写,主要负责网页样式,网页内容如何分布,板块背景,颜色等外观问题可以有CSS控制。 三、JavaScript 简称js,是一种动态的脚本语言。在以前js仅仅是用于网页交互的脚本语言,随着Google v8引擎、angular、react等前端框架使得前后端分离的趋势愈加明显以及node、js等技术的开发使得js在服务器端也迸发出非凡的活力,成为当前非常活跃的语言之一。 四、服务器语言 如果不是专业的后端开发者,可能后端有一定的难度其学习曲线较陡。但是,仍然建议开发者学习一下后端语言,至少需要了解大致的原因框架,能够看懂其代码逻辑,这样不仅可以很好的实现前后端的配合,也能够在小程序出现bug的时候扯皮用。服务器的语言有很多比较常用的是PHP、Java、Python、ASP等技术,建议初学者根据具体需求挑选进行学习。 五、数据库语言 如果你开发的小程序数据量不大,架构不复杂的话数据库语言相对来说是比较简单的,一般学会一些常用的命令以及常出现的问题就能够应付使用。常用的数据库有免费的MySQL、msSQL、MongoDB、Oracle等数据库。若数据量非常庞大,很容易导致小程序首屏白页,这时就要考虑优化。 注:具体落实到开发软件上,大同小异,每款软件都有他们的特点,语言标准规则有些不同,常见的开发工具有:微信开发者工具、字节跳动开发者工具、Sublime Text 3。这里我们使用微信开发者工具。 二、微信开发者工具 一、下载安装 微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html 推荐安装64位稳定版 二、新建项目 在启动页填写项目名称、目录、AppID(选择测试号) 这是基础框架 三、程序框架 根目录下两个文件夹 pages是用于存放页面文件的文件夹; utils是用于存放公共js的文件夹; 小程序大致分两块,首页和分页。首页即登录后展示的第一个页面,首页和分页分别占一个文件夹,且都包含在pages文件夹下,很显然,初始化的小程序只有两个页面(首页index和日志页logs) index下又包含首页界面设计所需要的文件(index.js、index.json、index.wxss、index.wxml) index.js即首页面的逻辑文件,类似于js文档; index.json即首页面的配置文件,比如标题字,背景之类; index.wxss即首页面的样式表文件,类似于CSS文档; index.wxml即首页面的结构文件,类似于HTML文档。 同样,日志文件logs与index基本类似(若添加新的页面,需在pages文件下新增文件夹) 而根目录下的app.js、app.json、app.wxss、project.config.json、sitemap.json即小程序的全局设置。 app.js即项目的入口文件,用于创建应用程序对象,启动小程序时首先调用; app.json即当前小程序的全局变量,包括了小程序的页面路径、界面表现、底部tab等; app.wxss即小程序的公共样式表,开发者可在页面组件的class属性上直接使用app.wxss中声明的样式规则; project.config.json即项目配置文件,通俗来说就是最开始开发项目时的个性化配置,其中会包括编辑器的颜色、代码上传时自动压缩等等一系列选项。 sitemap.json用于配置小程序及其页面是否允许被微信索引,文件内容为一个JSON对象,如果没有sitemap.json,则默认为所有页面都允许被索引; 开发者工具在创建项目后自动将一些公共的代码抽离成为一个单独的 js (utils.js)文件,作为一个模块;也就是utils文件夹,用来放自己封装的工具类函数,是一个共享的方法。 四、程序调试区 在程序调试区有几种常用的调试模式 1.Console Console就是控制台,可以显示错误信息和打印变量的信息等 2.Wxml Wxml相当于HTML+CSS,左侧的区域是HTML语言+CSS的一些标签属性。右侧可以便捷的设置CSS的属性 3.Sources Sources显示了当前项目的所有脚本文件,微信小程序框架会对这些脚本文件进行编译 4.Network Network用来显示与网络相关的信息,此处暂无网络请求 5.AppData AppData显示当前项目显示的具体数据,可以在这里编译,并且会在页面实时显示 三、项目实战(附核心代码) 一、项目介绍 利用微信开发者工具制作了一个最基础的小程序“演示的示例”仅为展示。 首页效果图如下 二、项目主要代码 1.index 1)index.js // index.js // 获取应用实例 const app = getApp() Page({ }) 2)index.

SpringBoot配置文件的加载顺序

SpringBoot配置文件的加载顺序 1、项目内配置文件的加载顺序2、外部配置文件的加载顺序 1、项目内配置文件的加载顺序 Spring Boot 启动会扫描以下位置的application.properties或者application.yml 文件作为Spring Boot 的默认配置文件。 路径描述优先级file:…/config/项目根目录config文件夹下优先级最高file:…/项目根目录下优先级第二classpath:/configresources目录中config文件夹下优先级第三classpath:/resources目录下优先级最低 以上是按照 优先级从高到低 的顺序 ,所有位置的文件都会被加载(互补配置),高优先级配置内容会覆盖低优先级配置内容。 也可以通过spring.config.location来改变默认配置 示例: java -jar config-test.jar --spring.config.location=C:/application.properties 2、外部配置文件的加载顺序 Spring Boot 也可以从以下位置加载配置: (优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置) 命令行参数 可以在命令行使用命令行参数修改配置文件的信息(多个参数可以用空格隔开 —配置项=值 ),例如修改端口为8081 java -jar config-test.jar --server.port=8081 来自java:comp/env的NDI属性java系统属性 ( System.getProperties() )操作系统环境变量RandomValuePropertySource配置的randm.*属性值jar包 外部 / 内部 的application-{profile}.properties或application.yml(带spring.profile)配置文件(由Jar包外向Jar包内进行寻找) 优先加载带profile jar包 外部 / 内部 的application.properties 或 application.yml (带spring.profile)配置文件(由Jar包外向Jar包内进行寻找) 加载完带profile后再加载不带profile @Configuration注解类上的@PropertySource通过SpringApplication.setDefaultProperties指定的默认属性所有支持的配置加载来源:参考官方文档

人工智能组合数学第一章

主要内容:导数+偏导数+方向梯度+梯度下降法+极限(python) 1.导数 import sympy from sympy.abc import x,y y=sympy.asin(sympy.sqrt(sympy.sin(x))) result=sympy.diff(y) print(result) 2.偏导数 方式一: import sympy from sympy.abc import x,y f=x**2+3*x*y+y**2 fx=sympy.diff(f,x) fy=sympy.diff(f,y) print(fx.evalf(subs={x:1,y:2})) print(fy.evalf(subs={x:1,y:2})) 方式二: import sympy from sympy.abc import x,y f=x**2+3*x*y+y**2 fx=sympy.diff(f,x) fy=sympy.diff(f,y) print(fx.subs({x:1,y:2})) print(fy.subs({x:1,y:2})) 3.方向导数 方式一: import sympy from sympy.abc import x,y,z z=x*sympy.exp(2*y) zx=sympy.diff(z,x) zy=sympy.diff(z,y) result=zx.evalf(subs={x:1,y:0})*sympy.cos(-sympy.pi/4)+zy.evalf(subs={x:1,y:0})*sympy.sin(-sympy.pi/4) print(result) 方式二: import sympy from sympy.abc import x,y,z z=x*sympy.exp(2*y) zx=sympy.diff(z,x) zy=sympy.diff(z,y) result=zx.subs({x:1,y:0})*sympy.cos(-sympy.pi/4)+zy.subs({x:1,y:0})*sympy.sin(-sympy.pi/4) print(result) 4.梯度 方式一:(梯度类型一般选择方式一) import sympy from sympy.abc import x,y,z,u u=x*y*z+z**2+5 ux=sympy.

Java - 发送 HTTP 请求的及其简单的方法模块 - hutool

目录 一、POST 传递简单的字符串内容 .body(params)二、POST 传递 Json 数据,以表单类型传递 .form(params)二、POST 传递 Json 数据,以表单类型传递 .form(params) 和 .body(params) 方法效果等效的思路四、传统接口带 token 验证的代码模板参考链接 一、POST 传递简单的字符串内容 .body(params) 演示代码 import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import cn.hutool.http.HttpRequest; /** * cf */ public class TqOdpServiceClient { private static String url="url";; public static String execute(String http,String params) { JSONObject response = JSONObject.parseObject( HttpRequest.post(http + url) .body(params) .execute() .body() ); return response; } } 二、POST 传递 Json 数据,以表单类型传递 .form(params) 演示代码 import com.alibaba.fastjson2.JSON; import com.

延时任务的几种创建方式

val TAG: String = "MyActivity" class MainActivity : AppCompatActivity() { private var btn1: Button? = null private var btn2: Button? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) btn1 = findViewById(R.id.btn1) btn2 = findViewById(R.id.btn2) // if (!Settings.canDrawOverlays(this)) { // val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION) // intent.data = Uri.parse("package:$packageName") // startActivityForResult(intent, 0) // } } @RequiresApi(Build.VERSION_CODES.P) fun btn1(view: View?) { /* // demo1 使用handler处理延时任务 Log.e(TAG, "demo1: handler outer") // 创建Handler对象 val handler = Handler(Looper.

PTrade获取当日n个季度前的日期所处季度的最后一天——时间相关函数4

本文介绍的函数用于获取当日n个季度前的日期所处季度的最后一天(有点绕,看后面例子就好理解了)。 源码 def last_day_of_quarter_before_n_quarters(n): """ 获取当日n个季度前的日期所处季度的最后一天 :return: 当日n个季度前的日期所处季度的最后一天,格式为字符串 """ # 当前日期 current_date = get_trading_day() # 当前季度 current_quarter = (current_date.month - 1) // 3 + 1 # 目标日期总季度数,用于计算目标日期 total_quarters = current_date.year * 4 + current_quarter - 1 - (n - 1) # 当前季度的n-1个季度前的日期季度 quarter = total_quarters % 4 + 1 # 当前季度的n-1个季度前的日期年份 year = total_quarters // 4 # 当前季度的n-1个季度前的季度的第一个月的月份 month = (quarter - 1) * 3 + 1 # 当前季度的n-1个季度前的第一个月份减去一天,得到n个季度前的日期所处季度的最后一天,并转换为字符串格式 return (dt.

CentOS下 rpm软件包的安装与卸载

在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装、卸载及管理等操作。RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下软件包的软件。Linux 安装时,除了几个核心模块以外,其余几乎所有的模块均通过RPM 完成安装。RPM 有五种操作模式,分别为:安装、卸载、升级、查询和验证。 RPM 安装操作 命令: rpm -i 需要安装的包文件名 举例如下: rpm -i example.rpm 安装 example.rpm 包; rpm -iv example.rpm 安装 example.rpm 包并在安装过程中显示正在安装的文件信息; rpm -ivh example.rpm 安装 example.rpm 包并在安装过程中显示正在安装的文件信息及安装进度; RPM 查询操作 命令: rpm -q … 附加查询命令: a 查询所有已经安装的包以下两个附加命令用于查询安装包的信息; i 显示安装包的信息; l 显示安装包中的所有文件被安装到哪些目录下; s 显示安装版中的所有文件状态及被安装到哪些目录下;以下两个附加命令用于指定需要查询的是安装包还是已安装后的文件; p 查询的是安装包的信息; f 查询的是已安装的某文件信息; 举例如下: rpm -qa | grep tomcat4 查看 tomcat4 是否被安装; rpm -qip example.rpm 查看 example.

Java读取并转换字符串中的浮点数

在写Android接收蓝牙数据的时候,由于传过来的蓝牙数据转换后都为字符串格式,但是需要从其中提取出来浮点数,所以通过查阅资料写出了从字符串中提取并转换为浮点数的方法,特记录下来以供参考。 目录 原始数据内容 提取字符串中的相关数值部分 分割出单个数值并转换为float/double类型 通过空格分割出单个的字符串 单个字符串String转换为浮点数float/double 原始数据内容 均为String字符串类型,数据是浮点数类型并有可能出现负数 Acceleration X: 9.84, Y: -2.54, Z: -1.84 m/s Rotation X: -0.08, Y: -0.07, Z: 0.01 rad/s^2 提取字符串中的相关数值部分 使用Java中的Character类中的isDigit()方法来判断当前字符是否为数字,并在字符串中进行遍历。还要利用StringBuilder对象来构建目标字符串。 从上面的数据中可以分析得我们不应该只保留数字,遇到小数点和负号也要保留,并且这里我还把空格保留了下来,方便之后提取一个一个的数字 String str = "xxxxxxx";//待提取的字符串 StringBuilder sb = new StringBuilder(); for (char c : str.toCharArray()) { if (Character.isDigit(c)||c=='.'||c==' '||c=='-') { sb.append(c); } } String result = sb.toString(); 通过这一步的操作提取出来的结果仍然是字符串String类型,但内容变成了 9.84 -2.54 -1.84 -0.08 -0.07 0.01 分割出单个数值并转换为float/double类型 由于上一步得出来的结果仍然是字符串类型,并且一个字符串当中有多个数值,通过空格分割出来,所以我们还要单个提取其中的每一个数值 通过空格分割出单个的字符串 首先利用字符串中的每个数值之间是通过空格分隔的,所以可以分割出来一个一个的数值字符串。通过split()方法可以分成一个字符串数组,遍历数组便会得到一个一个的数值 String [] arr = str.

2. Windows 10 - Nvm - node版本管理工具的安装、配置/全局配置(自动切换)、卸载方法 - 安装cnpm报错与解决方法 - 已安装 Node不卸载的方法

目录 关联链接测试环境一、安装 Nvm1. 新建一个 Nvm 目录,用来放置 nvm 和 Node 软件的安装文件。2. 目录记得加上 `nodejs` (有一点要知道,指定了这个路径那么 nodejs 不会自动安装一个本地的 node 环境)3. 自定义路径安装 `nodejs`,在点击 **finish** 完成 `nvm` 安装后的目录情况,一开始是没有 `nodejs` 目录的,但如果是默认安装 C 盘的,会在 C 盘有一个 `nodejs` 目录,还有`nvm install` 下载了一个`Node`,然后使用 `nvm use` 命令后,就会自动在自定义目录内创建一个 `nodejs`目录,要注意这一点。4. 安装 node 16.18.15. 初次使用 nvm 时,本地 node.js 路径配置6. 查看 nvm 安装目录下的 `setting.txt` 配置文件:7. 镜像配置,此时可以再增加两条镜像源配置,配置国内源,可以使得包的下载速度更快8. 查看 nvm 版本9. 如果此时使用 npm 是没有该命令的,将会报错 **'npm' 不是内部或外部命令,也不是可运行的程序或批处理文件。** 二、卸载 Nvm三、Nvm 安装指定版本 Node 配置理解1. 输入命令查看可安装的 `Node` 版本列表,2. 安装3. 查看4. 切换为指定的 `Node` 版本(有时候没办法切换,那就使用==管理员权限==重新打开终端)5.

UE5 C++ 编程指南

UE5 C++ 编程指南 一、引言 UE5 C++ 是使用 C++ 语言编写 Unreall Engine 5 引擎的主要方式。作为一个开发工程师,熟练掌握 UE5 C++ 编程对于开发高性能、高质量游戏至关重要。 本文将从多个方面对 UE5 C++ 做详细的阐述,帮助新手熟悉 C++ 语言以及在 UE5 中进行编程的最佳实践。 二、C++ 语言基础 作为一门强类型语言,C++ 具备高效、灵活的特点,同时也拥有非常丰富的代码库。在 UE5 中使用 C++ 进行编程,需要对 C++ 语言至少有基础的了解。 下面的代码示例展示了一个简单的 C++ 类: #include <iostream> class MyClass { public: void MyMethod() { std::cout << "Hello World!\n"; } }; int main() { MyClass myObject; myObject.MyMethod(); return 0; } 这段代码中,我们定义了一个类 MyClass,该类具有一个公共方法 MyMethod。在 main 函数中,我们创建了一个 MyClass 的实例 myObject,并调用了 MyMethod 方法。

rpm打包新手入门

rpm介绍 RPM(Red Hat Package Manager)是一种软件包管理工具,主要用于Red Hat及其衍生发行版如Fedora、CentOS等。RPM可以帮助用户方便地安装、升级、删除软件包。RPM包主要由以下几部分组成: 包名:软件包的名称,如httpd。版本:软件的版本号,如2.4.6。发行号:针对特定版本的软件制作的RPM包的版本,如1.el7。架构:软件包适用的硬件架构,如x86_64、i386等。 一个完整的RPM包名示例:httpd-2.4.6-1.el7.x86_64.rpm 通过学习rpm包的相关知识,我们可以将自己的软件打包成rpm包,以便于在基于Red Hat的Linux发行版(如Fedora、CentOS等)上进行分发和安装。将软件打包成RPM包有以下优点: 管理依赖关系:RPM包可以包含构建和运行时所需的依赖信息,这有助于确保在安装过程中自动满足所有必要的依赖关系。一致性和可重复性:RPM包提供了一种标准化的方法来构建和安装软件,从而确保在不同的系统上具有一致性和可重复性。方便的安装和升级:用户可以通过rpm命令或者包管理工具(如yum或dnf)轻松地安装、升级或删除RPM包,而无需手动下载和解压源代码或二进制文件。软件包的元数据和文档:RPM包包含了软件的元数据(如名称、版本、许可证等)以及描述、变更日志等信息,这有助于用户了解软件包的内容和历史。 rpm打包 为了将我们的软件打包成rpm包,我们需要使用rpm-build工具: sudo yum install rpm-build 在使用rpm-build工具构建RPM包时,需要按照一定的目录结构组织软件。这些目录通常位于~/rpmbuild(用户的主目录下的rpmbuild文件夹),包含BUILD,RPMS,SOURCES,SPECS,SRPMS子目录。 SPECS:这个目录用于存储.spec(SPECifications)文件,即RPM包的规范文件。.spec文件包含了软件包的元数据、描述、变更日志以及在各个构建阶段需要执行的命令。rpmbuild命令会读取这个目录中的.spec文件以执行构建过程。一个.spec文件主要包括以下两部分内容: a. 软件包的元信息:这部分包括软件包的名称、版本、发行号、许可证等元数据,以及构建和运行时所需的依赖。这些信息用于描述软件包的基本属性,以及在安装和构建过程中需要满足的依赖关系。 b.详细信息和构建命令:这部分通过不同的标签(如%description、%changelog、%prep、%build、%install 和 %files)记录了软件包的详细描述、变更日志以及在各个构建阶段需要执行的操作。这些标签定义了软件包的构建过程,并提供了有关软件包内容和历史的详细信息。通过组合这两部分内容,.spec文件为RPM包提供了完整的描述和构建指南。这使得RPM包可以在不同的系统上进行一致的构建和安装。 %description:这个标签用于提供软件包的详细描述。在这个标签下的文本会被视为软件包的描述信息,通常用于向用户介绍软件包的功能、用途等。这部分信息会在查询软件包信息时显示,例如使用 rpm -qi 命令。%changelog:这个标签用于记录软件包的变更历史。在这个标签下,你需要按照特定的格式添加每个版本的变更记录,包括日期、维护者的姓名和电子邮件地址、软件包的版本和发行号以及变更描述。这部分信息对于跟踪软件包的发展和了解各个版本之间的差异非常有用。%prep:准备阶段,通常用于解压源代码文件并应用任何补丁。在这个阶段可以执行一些准备工作,例如清理目录、检查环境等。%build:构建阶段,用于编译源代码并生成可执行文件、库文件等。在这个阶段可以执行编译命令,如make,以及其他与构建过程相关的命令。%install:安装阶段,用于将编译好的文件安装到构建根目录(%{buildroot})下的相应位置。在这个阶段可以执行安装命令,如make install,以及其他与安装过程相关的命令。%files:文件列表阶段,用于指定RPM包中包含的文件。在这个阶段需要列出所有要包含在最终RPM包中的文件和目录。 SOURCES:这个目录用于存储软件包的源代码文件,例如源代码的压缩文件(如hello-rpm-1.0.tar.gz)、补丁文件等。在构建过程中,%prep阶段会从这个目录中提取源代码文件。 BUILD:这个目录用于存储在构建过程中产生的临时文件。当执行%prep和%build阶段时,源代码会被解压并编译在这个目录下。完成构建过程后,这个目录下的文件通常会被丢弃,因为它们不会包含在最终的RPM包中。 RPMS:这个目录用于存储构建完成后的二进制RPM包。在%install和%files阶段完成后,生成的RPM包会被放入这个目录。RPMS目录下通常还会根据不同的硬件架构分成子目录,例如x86_64、i386等。 SRPMS:这个目录用于存储源代码RPM包(Source RPM)。源代码RPM包包含了软件的源代码以及构建该软件所需的.spec文件。与二进制RPM包相比,源代码RPM包允许用户在本地环境中自行构建和安装软件,有时这对于定制软件或解决特定问题是很有帮助的。 在打包完成得到rpm包后,用户可以通过rpm命令或者包管理工具(如yum或dnf)轻松地安装、升级或删除RPM包 打包示例 下面将会用一个简单的示例向大家具体地展示如何进行rpm打包。 假定我们有一个C++程序,使用cmake进行构建: hello-rpm-1.0 ├── CMakeLists.txt └── hello-rpm.cpp hello-rpm.cpp #include <iostream> using namespace std; int main() { cout << "Hello RPM!" << endl; return 0; } CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(hello-rpm) set(CMAKE_CXX_STANDARD 11) add_executable(hello-rpm hello-rpm.cpp) install(TARGETS hello-rpm DESTINATION /usr/bin) 将程序源码进行压缩:

C++面经汇总

技术面试过程中,回答问题应该注意的事项 当面试官提出问题后,不要着急作答,应该适当停一下,整理一下逻辑思路。 对于简单问题的回答,尽量不要照本宣科,找准问题回答的角度/层次,争取简单问题回答的比较有亮点。 对于相对复杂的问题,比较难以阐述的问题,思考上要花一些时间,整理好逻辑思路,以及问题大致描述的顺序。 如果是现场面试(视频面试),最好用纸笔边画边讲;如果是电话面试,回答问题的过程中,需要和面试官经常沟通,不要自顾自的滔滔不绝。 对于面试中,被提问到自己不知道的内容,尽量把自己知道的相关知识都说一说,回答得饱满一些,让面试官了解我们。 你还有什么问题? 我将来在公司可能接触到的技术有哪些? 我在公司会用到什么技术,我现在掌握的C和C++去公司需不需要转型? 请面试官能不能对我的技术面试进行点评,给我提出一些宝贵的经验? 1. C++this指针是干什么用的? 每个非静态成员函数只会产生一份函数实例,也就是说多个同类型的对象共用一块代码,C++通过提供this指针来解决如何区分哪个对象调用了这个非静态的成员方法。this指针指向的就是被调用的成员函数所属的对象。当形参和成员变量同名时,可用this指针来区分。在类的非静态成员函数中返回对象本身,可使用return *this;。 2. C++的new和delete,什么时候用new[]申请,可以用delete释放? 如果说自定义类型,而且提供了析构函数,那么使用new []申请内存时,就一定需要用delete[]释放内存,除此之外,在用new[]申请内存时,可以用delete释放。 3. C++的static关键字的作用?(我从elf结构,链接过程来回答) 从面向过程的角度来说,static修饰全局变量或者函数时,被static修饰以后,在符号表中,符号的作用域就从g变成l;static修饰局部变量时,静态局部变量存储在.data或.bss段,局部变量本身不产生符号的,通过ebp-偏移量来进行访问,而此时会产生符号,符号的作用域是l。从面向对象的角度来说,static可以修饰成员变量,也可以修饰成员方法,不再产生this指针。既可以通过对象,也可以通过类名直接访问静态成员变量。 4. C++的继承有什么好处? 代码的复用,通过继承可以把基类的成员直接复用到派生类中。通过继承,可以在基类里面给所有派生类保留统一的纯虚函数接口,等待派生类进行重写,使用多态,可以通过基类的指针访问不同派生类对象的同名覆盖方法。 5. C++的继承多态、空间配置器、vector和list的区别、map、多重map? 继承的好处:1. 代码的复用,通过继承可以把基类的成员直接复用到派生类中。2. 通过继承,可以在基类里面给所有派生类保留统一的纯虚函数接口,等待派生类进行重写,使用多态,可以通过基类的指针访问不同派生类对象的同名覆盖方法。多态分为静态多态和动态:1. 静态(编译时期)多态:函数重载、运算符重载和模版。2. 动态(运行时期)多态:在基类中定义虚函数,通过基类的指针或引用指向派生类对象。空间配置器allocator:给容器使用的,主要作用是把对象的内存开辟和对象构造分开,把对象析构和内存释放分开。这样做的目的在于:当初始化容器时,只需要给容器底层开辟空间,并不需要在空间上构造无效的对象,所以不能使用new;当从容器删除对象时,只需要把对象析构掉,并不需要释放对象的内存;当容器出作用域时,只需要把容器中有效的对象析构再释放内存,而如果使用delete,则会把容器底层所有的空间都当做对象析构掉再释放内存。vector和list的区别参考基础课程。map和multi_map是一个映射表,存储的元素是键值对key-value,底层的实现是红黑树。map不允许key重复,而multi_map允许key重复。红黑树的5个性质:1. 节点是红色或者是黑色;2. 根结点必须是黑色;3. 每个叶子结点必须是黑色;4. 每个红色节点的两个子节点都是黑色的(也就是说从根节点到每个叶子结点的路径上,不允许出现连续的红色节点);5. 从任一节点到其每个叶子结点的所有路径都包含相同数目的黑色节点。红黑树插入的3种情况红黑树删除的4种情况 6. C++如何防止内存泄漏?智能指针详述? 由于堆内存没有名字,只能用指针来指向。当分配的堆内存没有释放时,如果程序抛出异常、提前返回、指针重定向,那么也就再也没有机会释放对应的堆空间,产生内存泄漏,通过在程序中使用智能指针来指向堆上的空间,可以有效的防止内存泄漏。 7. C++如何调用C语言函数接口? C 和 C++生成符号的方式不同,C 和 C++语言之间的API接口是无法直接调用的,C 语言的函数声明必须括在extern "C"{}里面。 8. C++中类的初始化列表? 可以指定当前对象成员变量的初始化方式。自定义了一个构造函数,编译器就不会再产生默认构造了。a类中包含成员对象时,如果成员对象的类型b中自定义了构造函数,也就没有默认构造函数,那么需要通过a类的构造函数的初始化列表来对成员对象进行初始化,会调用成员对象的自定义构造函数。成员变量的初始化和它们定义的顺序有关,和构造函数初始化列表中出现的先后顺序无关。 9. C 和 C++ 的区别? C++中引入了引用、函数重载、运算符重载、new\delete、const、inline、带默认值参数的函数、模版、类和对象、STL、异常、智能指针等。 10. malloc 和 new 的区别? malloc 称作C的库函数,而 new 被称作运算符。 new 不仅可以开辟内存空间,还可以对内存做初始化操作;而 malloc 只负责开辟内存,不负责初始化。