- 博客(37)
- 问答 (1)
- 收藏
- 关注
原创 开发中如何在运行/调试时将项目热部署到Tomcat
正常情况下,我们将web项目打包成war包后,需要放到tomcat的webapps路径下,然后启动tomcat,才能正常访问。但是这在开发阶段是极为不便的。因此可以使用两种方式进行热部署。
2024-08-27 17:21:56
738
2
原创 Spring 05:Spring AOP
面向切面的编程(AOP)是一种编程思想,旨在将跨越多个类型的关注点进行模块化,来实现对业务中共同关注点功能的解耦。本篇将介绍Spring中AOP的核心概念以及配置方法。
2024-08-24 17:06:03
1159
原创 Spring 03: 依赖注入
依赖注入(DI) 是 IoC 的一种实现方式,它允许 Spring 容器将所需的依赖自动注入到 Bean 中,而不是让 Bean 自行创建或查找依赖。这种方式减少了组件之间的硬编码依赖,使得应用程序更加灵活和可维护。
2024-08-16 17:27:33
1105
原创 Spring 02: Bean概览
在 Spring 中,Bean 是一个由 Spring IoC(控制反转)容器管理的对象。Bean 通常通过在 XML 配置文件、Java 配置类或基于注解的方式定义,并由容器负责创建和配置。Spring 容器负责管理 Bean 的整个生命周期,从创建、配置到销毁。这种管理包括依赖注入、生命周期回调等。
2024-08-16 17:25:12
665
原创 【算法】一文搞懂归并排序
归并排序利用了分治思想,将待排序的数组范围层层划分,每次划分会得到两个大小相近的区间。当无法划分时,递归结束,自下而上进行区间合并merge操作,合并操作依次比较两个区间的元素,进而使合并后的区间有序。当进行到最后一次合并区间时,我们将会得到目标范围的有序序列。这个过程如图所示。由于归并排序并不是基于交换的排序算法,因此没办法做到原地in-place排序,而是需要借助一个辅助数组,以便在合并时,可以暂时存放左侧区间的元素,这样可以将经过比较得到的元素直接放入原数组的正确位置。
2024-06-03 19:32:20
905
1
原创 【算法】在?复习一下快速排序?
快速排序是一种基于交换的排序算法,该算法利用了分治的思想。整个算法分为若干轮次进行。在当前轮次中,对于选定的数组范围,首先选取一个标志元素pivot,将所有小于pivot的元素移至其左侧,大于pivot的则移动至其右侧,记录下最终pivot所处的位置pivot_pos。然后再利用递归,分别对左侧区间和右侧区间执行相同操作,依次类推,最终对整个数组完成排序。以数组为例,在递归实现中,其排序过程中交换策略如下图所示。当pivot_pos与i相等时,不需要交换,之所以先将再交换的原因是,此时i指向的是小于。
2024-06-02 18:25:33
829
原创 [cpp primer随笔] 17. 类中名字的查找机制
名字查找(name lookup)指的是解析一个程序中出现的名字,并且寻找到与之相匹配的声明,这是在程序的编译阶段完成的。对于一个类外的普通名字,例如一个类型名或一个变量名,其名字查找过程比较直接。编译器会先在当前作用域内、该名字使用之前的部分查找有无该名字的声明,若无,则会去外层作用域寻找依次类推。如果最终没有找到该名字的有效声明,则判定为这是一个未定义的名字。然而,类中名字的查找方式与方才所描述的有所不同。因为一个类定义的代码是分为两部分来编译的。编译器会先编译类成员声明,再编译类内成员函数的代码块(无
2023-11-16 21:24:15
239
原创 [cpp primer随笔] 14. 类的构造函数
C++中类构造函数相关知识点,主要包括:基本特性、类成员初始化、类内初始值、构造函数初始值列表、默认构造、委托构造等,其中还特别分享了一些默认构造不适用的场景。感兴趣的朋友可以阅读一下。
2023-10-29 00:38:29
292
原创 [cpp primer随笔] 13. 类的常量成员函数
本篇分享了C++中类的常量成员函数的知识点。为了讲清楚其作用原理,首先需要介绍this指针的概念,接着会阐述const成员函数的使用方法与效果,最后介绍了可变数据成员这种即便在常量成员函数中依旧能够改变值的方法。
2023-10-24 22:22:09
194
原创 [cpp primer随笔] 11. 内联函数与constexpr函数
调用函数一般比对等价表达式求值要慢。因为调用函数除了对表达式求值外,还包含一系列过程,包括堆栈建立、拷贝实参、跳转执行等等。而在程序之中,通常存在一些优化规模较小、流程直接、却调用频率很高的函数,我们可以通过在函数声明前添加inline关键字将这些函数来定义为。内联函数将于编译时,在调用处完整展开,进而消除函数调用开销。需要注意的是,inline关键字通常只是向编译器提出一个建议,函数并不一定会被内联展开。(比如,需要内联的函数逻辑复杂且行数众多)
2023-10-15 21:15:09
226
原创 [cpp primer随笔] 08. 类型转换
在C++中,如果两种类型的对象可以通过某种方式进行转换(conversion),则称这两种对象是有关联的。如果程序需要一种类型的变量进行运算,那么此时就可以用与之相关联的其他类型进行替代。在上述的转换中,一部分无需程序员主动操作,由编译器以自动的方式进行,称之为隐式转换(而剩下的,则需要程序员以某种方式主动将变量转换为另一种类型,则称之为显式转换,又叫做强制类型转换(cast。
2023-10-04 23:29:00
114
原创 [cpp primer随笔] 07. 运算符细则
C++的赋值运算符返回被赋值对象的引用。返回:如果将运算符视作函数,则称作返回值;如果将运算符结合运算对象视作表达式,则称作表达式的运算结果。这种特性和Python的海象运算符:=类似,且十分有用。普通的Python赋值语句仅执行赋值功能,而海象运算符的执行结果为对象本身,这可以极大简化语句的书写模式,下面是一个例子。C++中的效果与之相近,例如我们要在每次循环中改变一个变量的值,并根据该值判断是否符合循环终止条件。可以看出,后者可读性更强。
2023-10-04 17:19:39
234
原创 [cpp primer随笔] 06. 字符串
string是C++内置库中的字符串类型,表示一个可变长度的字符序列。其位于std命名空间中,使用时需要包含<string>头文件。erase更多操作可以参考。
2023-10-02 16:31:26
104
原创 [cpp primer随笔] 05. 内置数组理解
遵循遵循”自内向外,先右后左“的顺序。如果需要声明一个指向数组的指针或者绑定数组的引用,需要添加括号,否则变量名均会先向右绑定数组维度,使前面的指针符号用于组成数组元素的类型。int *a[10];// 存有10个int指针的数组// 指向一个长度为10的数组指针int &c[10];// error, 不存在引用的数组// 一个长度为10的数组的引用。
2023-09-25 20:19:02
193
原创 Go Module模块名理解
有小伙伴可能有这样的疑问:这个模块路径需要我们和文件系统里的路径进行对应吗?模块路径实际上就是一个标识符,用于在一个项目中唯一的标识、跟踪一个模块。联系起来,可以将之理解为包的命名空间。即当我们需要在当前文件中导入一个包时,必须连带着指定该包所属模块。,看起来像是Github的仓库地址。可能还会这样的疑问:为什么我在使用第三方模块的时候,经常看到模块路径是这样的形式。main.go的包名是。假设该项目的模块路径是。
2023-09-16 22:30:47
416
原创 [cpp primer随笔] 02.复合类型
引用在定义后无法绑定其他对象,因为一切对引用的操作无法直接作用在该内存空间上,而是会将该内存空间存储的对象地址读到寄存器中,再对该地址指向的对象进行进一步读写操作。不同的是,程序无法通过该指针知晓那块内存空间的数据类型,继而无法做出有效的读写操作。解引用符时,指向元素的地址才会被拿到寄存器上操作(即操作该指针指向的对象)。指针指向对象的类型,可以用将该指针进行类型转换,进而可以操纵这个对象。在声明指针的时候,将指针符号与基本数据类型或变量名连着写的人都有。而对指针的操作都是直接对该内存空间本身进行操作。
2023-09-16 16:24:05
124
原创 [cpp primer随笔] 01.变量
声明用于让程序知晓一个变量的存在,而本身不会分配内存空间。而定义的目的在于创建一个变量,是要分配空间的。在C++中,我们在使用另一个文件定义的变量前,必须先在本文件中使用extern关键字对其进行声明。int i;// 定义// 声明此外,任何包含显式初始化的声明均视作定义。这也就是说,我们可以对extern关键字声明的变量赋初始值,这会抵消掉extern的作用,使该语句变为定义语句。// 定义。
2023-09-15 22:52:25
88
原创 Fabric 2.4.7 -- BCCSP源码分析
区块链密码服务提供商(BlockChain Cryptographic Service Provider)作为Fabric的核心组件之一,为其他组件提供了密码服务。其实现有三种,分别为SWBCCSP、PKCS11BCCSP、IDEMIXBCCSP。其中,SWBCCSP是基于软密码算法实现的CSP,其主要使用了Golang现有的密码库和哈希等算法编写而成。而PKCS11BCCSP则支持PKCS11标准,主要为基于硬件的密码组件而设计。至于IDEMIX,则是Fabric的另一大特色,支持使用基于零知识证明体系的
2023-03-14 16:43:33
835
3
原创 Hyperledger Fabric Java Gateway配置解析
Hyperledger Fabric 2.x之后逐步减少Java SDK API的使用频率,并希望大家的客户端开发集中使用Gateway来完成。本篇博客将从具体实现的角度带大家串一遍使用Gateway进行链码调用的流程。如果大家只是想直接开发的话,其实不用在意每个接口是如何实现的,直接查API文档看接口即可,我这篇里面结合了一些具体实现去讲解,有兴趣的可以看看。
2022-11-29 22:02:44
2902
6
原创 Python多线程详解
现代计算机CPU物理核心普遍比较多,我们在编写程序时经常会用到多线程技术来提高程序运行的效率。作为python萌新,我在掌握基本语法后就很想摆弄一下python的多线程,使用起来确实很有python的特点,代码量少、操作方便。之后断断续续写了一些多线程程序,直到今天下午逛论坛,看到很多人说python多线程机制的一些内情,我才意识到自己有多愚蠢哈哈。我把自己学到的内容系统的整理一下,以备后忘,也帮帮后来者。
2022-10-30 16:00:07
55962
17
原创 Python终端打印彩色字符
我们在编写python程序时,有时会遇到一些在终端打印彩色字符的需求,特别是针对一些标识日志条目类别的单词,例如“OK”、“ERROR”、“INFO”之类的。有和我一样需求的朋友可以参考下面的做法。
2022-10-23 14:51:35
3626
原创 改进的作业排序--2021WMC上机系列
改进的作业排序一、问题引出要了解改进的作业排序是如何实现的,必须对作业排序本身的机制有着透彻的理解。 所以一开始,先给各位复习一遍周一上课讲过的作业排序。假设:现在有一台计算机,它要处理n个作业,每一个作业只需要花单位时间就可以完成。但是,每一个作业都只有在它自己的截至日期前完成,才可以取得相应的收益。现在我们给定:假设第i个作业,它的完成期限是di ,而在期限di之前完成它而获得的收益为pi 。现在的问题是,计算机如何安排这些作业的运行,从而保证所获得的收益值最大?二、原始的带有期限的作业排
2021-03-29 00:20:55
598
3
原创 QT:绘制一个简易时钟(显示系统当前时间)
一、效果展示效果说明:①通过对话框显示系统当前时间 ②秒针所指的刻度会变化为红色,当指到十二时,所有时刻都会变红二、案例实现方法1.案例实现的主要步骤概括首先,设置视窗与窗口大小,配置坐标系;然后,绘制表盘与指针;最后,编写指针的旋转及变色方法;2.头文件配置(头文件部分的注释我写的很清楚)#ifndef DIALOG_H#define DIALOG_H#include <QDialog>#include <QTimer>#include <QPen
2020-05-29 20:01:14
2401
2
原创 QT:利用计时器连续播放图片组成动图效果
一、效果展示(该动图完全由jpg图片连续播放构成)二、步骤(代码解释+注意问题)1. 配置头文件头文件我就直接上代码了#ifndef DIALOG_H#define DIALOG_H#include <QDialog>namespace Ui {class Dialog;}class Dialog : public QDialog{ Q_OBJECTpublic: explicit Dialog(QWidget *parent = 0);
2020-05-29 16:57:12
2474
3
VggFace2人脸识别数据集
2022-08-27
Linux父进程exit(0),没能成功退出,提示被挂起
2021-06-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人