- 博客(64)
- 收藏
- 关注
原创 日常随笔——如何把excel题库转换为word打印格式
将Excel题库转换为Word可以通过编程的方式实现。以下是一个使用Python的示例代码,该代码使用openpyxl库读取Excel文件,并使用python-docx库创建和保存Word文档。首先,请确保已经安装了 openpyxl 和 python-docx 库。
2023-08-07 08:54:29
1574
原创 日常随笔——Excel中的time函数,excel time函数。
在处理数据的过程中,可能会遇到“time;excel time;”这样的目录栏,实际上是对time进行了TIME函数处理。把时间换算到0~1之间,但是在Excel中展示的是。
2023-03-23 15:35:56
415
原创 多个ipv4地址,求掩码长度
输入一组IPv4地址,返回子网掩码的最大子网掩码长度(二进制中表示的掩码中“1” 的个数)输入:“192.168.129.7”,“192.168.206.155”
2022-08-17 20:35:14
1304
原创 日常随笔——Mysql、Redis等的第三方api库 SOCI 的 CMakeLists使用,以及CMakeLists.txt的一点使用
SOCI第三方库的使用
2022-07-13 17:52:37
622
原创 日常随笔——基于spdlog开源日志库的封装日志库
为了方便使用,对spdlog作了封装,单独写了一个头文件和类,并且用单例模式来进行调用,提供控制台、文件模式,五种打印级别
2022-06-27 16:57:22
1290
原创 C++—— 编译时链接相关问题
下面就来捋一捋这些关系对于一个C++程序而言,从代码到可执行程序一共有四个过程:将源代码的.c 、.cpp 、.h 等文件包含到一个文件中。在这个过程中会使用一些预处理指令要求编译器使用什么样的方式包含这些文件。预处理结束之后对于c语言编译器会生成一个.i 文件。C++会生成.ii文件。编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件.不同的优化等级:汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,
2022-06-20 20:19:46
909
1
原创 日常随笔——如何判断字符是汉字、字母、还是拼音? 在C++中又该如何判断?
最近遇到一个问题,需要判断一个字符串中是否包含汉字、拼音、普通字符,于是就简单记录下来。首先,如何判断这些,绕不开操作系统中的编码,常见的有三种:ASCII、Unicode、UTF-8这是最早的一种编码方式,因此只将英文字符编码进去了,也就是一些大小写字母和一些符号。但是,由于后续计算机扩展到各个国家,各国的语音也需要编码,因此ASCII编码(00000000 - 01111111)127位就不够用了,于是就制定了其他编码方式。各国都有各自的一套编码方式,比如中国制定了GB2312编码,日本把日文编入了S
2022-06-16 11:24:23
2880
原创 日常随笔——ARM架构的M1芯片上,安装x86环境的ubuntu
描述:最近在学习,在云服务器上安装环境的时候,服务器卡死了几次(就很抽象,编译也能卡死T_T…),于是决定在我的M1芯片macbook上配置x86环境,遇到了很多问题,最后还是解决了。
2022-06-07 10:21:17
3494
原创 数据结构——Redis中的bitmap
文章目录1. bitmap原理2. BITPOS的使用3. bitmap的优势以及应用优势限制应用1. bitmap原理8bit = 1byte = 0.001kb通过最小的单位bit来进行0或1的设置,表示某个元素对应的值或状态。Redis中提供的函数接口有:SETBIT key offset 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 >= 2.2.0 O(1)GETBIT key offset 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
2022-05-22 10:01:27
2012
原创 Golang学习笔记6——Gin入门
文章目录1. 第一个Gin程序go.sumgo.mod测试1. 第一个Gin程序Gin简介:Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance – up to 40 times faster. If you need smashing performance, get yourself some Gin.安装:go get
2022-05-14 23:13:06
376
原创 Golang学习笔记5——反射
文章目录1. 反射是什么1.1 概念1.2 功能2. 反射的实现2.1 interface 和 反射2.2 Golang的反射reflect2.2.1 reflect的基本功能TypeOf和ValueOf2.3 获取接口的属性和方法2.3.1 从relfect.Value中获取接口interface的信息2.3.2 已知原有类型2.3.3 未知原有类型【遍历探测其Filed】2.4 通过reflect.Value设置实际变量的值2.5 通过reflect.ValueOf来进行方法的调用3. Golang的反
2022-05-12 11:36:56
779
原创 Golang学习笔记4——并发编程
1. 并发基础1.1 概念并发与并行的区别:并发:逻辑上具有处理多个同时性任务的能力。即看起来是多个任务同时执行,但并不一定是同一时刻,例如单核并发,通过多线程共享单核CPU利用时间片切换串行执行(并发非并行)。并行:物理上同一时刻执行多个并发任务。一般依赖多核CPU达到多个任务在同一个时刻执行(并发且并行)。二者概念的区别是是否同时执行,比如吃饭时,电话来了,需要停止吃饭去接电话,接完电话继续吃饭,这是并发执行,但是吃饭时电话来了,边吃边接是并行。并发的主流实现模型:实现模型说
2022-05-11 22:24:57
573
原创 Golang学习笔记3——面向对象编程
1 自定义类型1.1 如何自定义类型go 支持使用 type 关键词来定义自己的类型,比如我们来定义一个 Enum 类型,go 默认没有提供 enum 类型,我们可以通过 type 自己定义一个枚举类型(在业务代码中经常用到枚举):package mainimport "fmt"// 自定义一个 Enum类型type Enum intconst ( // 这里如果是自增用 iota 更好 Init Enum = 0 Success Enum = 1
2022-05-08 22:46:11
907
原创 golang学习笔记2——函数
文章目录1. go函数1.1 如何定义一个函数1.2 函数的参数1.3 匿名函数与闭包1.4 函数类型2. 错误处理2.1 defer语句2.2 go 的 error 类型2.3 错误处理2.4 go 的异常处理 panic/recover1. go函数1.1 如何定义一个函数go 定义一个函数比较简单,由关键字、函数名、参数类型、返回类型 组成,语法如下:// optionalParameters 是 (param1 type1, param2 type2 ...) 这种形式func funct
2022-05-08 20:04:41
535
原创 Golang学习笔记1——基础
文章目录1. 初识GO1.1 Go语言优势1.2 Go适合做什么?1.3 Go标准命令概述1.4 HelloWorld2. 基础类型2.1 变量2.1.1 变量声明2.1.2 变量初始化2.1.3 变量赋值2.1.4 匿名变量2.2 常量2.2.1 常量定义2.2.2 预定义常量,枚举类型2.3 基础数据类型2.4 输入输入1. 初识GO1.1 Go语言优势可直接编译成机器码,不依赖其他库,glibc 的版本有一定要求,部署就是扔一个文件 上去就完成了。静态类型语言,但是有动态语言的感觉,静态类型
2022-05-08 18:38:29
434
原创 数据结构——最小连通图
参考文章图解:什么是最小生成树? vector<int> parents; int count; void init(int n){ count = n+1; parents = vector<int>(n+1, 0); for(int i=0; i<=n; ++i){ parents[i] = i; } } int find(int x){
2022-04-26 17:06:11
4159
原创 计算机图形学——向量间的关系
向量点积(内积)假设向量 a 为 (x, y), 向量 b 为 (x2, y2),则 a · b 为 x * x2 + y * y2 。用来计算两个向量之间的夹角,但是无法区分向量的位置关系,因为反余弦函数arccos的范围是[0, 180]向量叉乘二维叉乘设两个向量分别为(x1,y1),(x2,y2)(x_{1},y_{1}),(x_{2},y_{2})(x1,y1),(x2,y2),那么它们的叉乘就为(x1∗y2−x2∗y1)(x_{1}*y_{2}-x_{2}*y_{1})(x1
2022-04-23 13:04:22
6839
转载 数据结构——跳表skip list
转载:Skip List–跳表理解跳表,从单链表开始说起下图是一个简单的有序单链表,单链表的特性就是每个元素存放下一个元素的引用。即:通过第一个元素可以找到第二个元素,通过第二个元素可以找到第三个元素,依次类推,直到找到最后一个元素。什么是跳表?跳表的查找、插入、删除元素的流程跳表查找、插入、删除元素的时间复杂度跳表插入元素时,如何动态维护索引?为什么Redis选择使用跳表而不是红黑树来实现有序集合?工业上其他使用跳表的场景友情提示:下文在跳表插入数据时,会讲述如何动态维护索引,实现比
2022-04-22 21:28:25
1458
原创 二维码扫码登录是什么原理? (转载)
原文链接:二维码扫码登录是什么原理互联网的认证机制为了安全,手机端它是不会存储你的登录密码的。 但是在日常使用过程中,我们应该会注意到,只有在你的应用下载下来后,第一次登录的时候,才需要进行一个账号密码的登录, 那之后呢 即使这个应用进程被杀掉,或者手机重启,都是不需要再次输入账号密码的,它可以自动登录。其实这背后就是一套基于token的认证机制,我们来看一下这套机制是怎么运行的,账号密码登录时,客户端会将设备信息一起传递给服务端,如果账号密码校验通过,服务端会把账号与设备进行一个绑定,存在一
2022-04-11 11:45:07
398
原创 力扣随笔——KMP算法模板
代码: vector<int> nxt(goal.size(), 0); int i=1, j=0; // 求next数组 for(; i<goal.size(); ++i){ while(j>0 && goal[i] != goal[j]){ j = nxt[j-1]; } if(goal[i] == goal
2022-04-07 23:05:59
107
原创 Linux进程管理——fork()和写时复制
文章目录写时复制产生的原因写时复制的过程小结写时复制产生的原因写时复制技术最初产生于Unix系统,用于实现一种傻瓜式的进程创建:当发出fork( )系统调用时,内核原样复制父进程的整个地址空间并把复制的那一份分配给子进程。这种行为是非常耗时的,因为它需要:为子进程的页表分配页面为子进程的页分配页面初始化子进程的页表把父进程的页复制到子进程相应的页中创建一个地址空间的这种方法涉及许多内存访问,消耗许多CPU周期,并且完全破坏了高速缓存中的内容。在大多数情况下,这样做常常是毫无意义的,因为许
2022-03-27 23:53:14
364
原创 LeetCode——KMP算法
KMP算法的作用:给定字符串s1,字符串s2,判断s1中是否包含字符串s2。具体实现,可以观看卡神的视频:KMP算法原理前缀表next前缀表的作用,就是在匹配字符串的过程中,如果遇到不相匹配的,需要改变的偏移量,其计算过程是利用了最长相同前后缀。为什么是最长相同前后缀?如下图,当我们匹配到f的时候,如果不相等,最好的做法是与b来进行匹配,为什么呢? 因为这里有一个f的后缀aaf(实际上不带f),和一个前缀aa,这两是相同的,因此要找最长相同前后缀。求next数组的代码:vector<i
2022-03-26 23:04:23
1170
原创 设计模式C++
装饰者模式装饰者模式,类比生活中的例子:人感觉到冷的时候,会穿衣服,觉得热的时候,就会脱掉衣服。所以可以拥有多件衣服达到一个组合的效果,装饰者就是类似参考:装饰器模式(Decorator) C++装饰器模式的优点:1、可以轻松对已存在的对象进行修改和包装,在被装饰者的前面或者后面添加自己的行为,而无需修改原对象。2、可以动态、不限量地进行装饰,可以更灵活地扩展功能。相对地,装饰器模式有很明显的缺点:1、会加入大量的小类,即使只添加一个功能,也要额外创建一个类,使得程序更复杂。2、增加代码复杂
2022-03-23 22:17:33
128
原创 LeetCode——线段树
线段树的定义:首先,线段树是一棵完全二叉树。它的特点是:每个结点表示的是一个线段,或者说是一个区间。事实上,一棵线段树的根结点表示的是“整体”区间,而它的左右子树也是一棵线段树,分别表示区间的左半边和右半边。树中的每个结点表示一个区间[a,b]。每一个叶子结点表示一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左孩子表示的区间为[a,(a+b)/2],右孩子表示的区间为[(a+b)/2,b]。 用T(a, b)表示一棵线段树,参数a,b表示区间[a,b],其中b-a称为区间的长度,记为L。如下图
2022-03-20 20:09:48
1781
原创 日常随笔——C++单例模式
应该何时使用单例模式?你需要系统中只有唯一一个实例存在的类的全局变量的时候才使用单例。单例模式应具有的特点越小越好,越简单越好,线程安全,内存不泄露参考C++ 单例模式总结与剖析,C++实现单例模式(包括采用C++11中的智能指针)常遇到的错误示例class CSingleton{private: CSingleton(){ cout << "单例对象创建!" << endl; }; CSingleton(const CSingleton &
2022-03-01 16:09:45
324
原创 在C++中使用MySQL
环境ubuntu18.04,MySQL 14.0正文:头文件#include <mysql/mysql.h>初始化以及连接MySQLMYSQL* conn = mysql_init(NULL);conn = mysql_real_connect(conn, HOST, USER, PASSWORD, DATABASE, PORT, NULL, 0);参数依次为连接的ip(一般为localhost或者127.0.0.1),登录MySQL的账户,账户密码,使用的数据库名称
2022-02-28 21:08:19
1229
原创 日常随笔——CLion使用过程中遇到的问题
问题描述在使用CLion的过程中,新建一个新的C++类,产生对应的.h文件和.cpp文件,但是此时代码框顶端会显示"不属于任何项目目标,代码洞察功能可能无法正常工作" 。即使在Cmakelist.txt文件中已经明确加入了该文件,但依旧解决不了。解决办法右键文件夹,将其标记为项目源或头...
2022-02-28 17:27:31
2072
2
原创 日常随笔——m1 macbook安装和配置qt
先用brew安装qt。参考Apple M1 开发 Qt 6.2 踩坑但是并没有解决实际问题,在安装完之后,会报错显示编译器与qt版本不匹配,此时需要安装Xcode,直接在Apple Store中进行安装即可,安装完之后就能够自动检测到Apple Clang(arm64)。参考:MacBook Air m1怎么安装Qt,必须要先下载xcode吗? - QueenFan的回答 - 知乎...
2022-01-22 17:06:24
3389
原创 随笔——unique_lock锁与condition信号量
看到一个帖子介绍锁与信号量的使用:std::condition_variable与std::unique_lock的结合使用void runthread(int index){ std::unique_lock<std::mutex> lck(mtx); fprintf(stderr, "thread:%d is waiting.\n", index); cv.wait(lck); fprintf(stderr, "thread:%d is wakeup.\n
2022-01-15 01:01:12
522
原创 日常随笔——C++中获取当前线程ID
一般有四种参考链接:Linux下获取线程ID#include <pthread.h>#include <thread>#include <iostream>#include <unistd.h>#include <stdio.h>#include <sys/syscall.h> #define gettid() syscall(__NR_gettid)#define NUM_THREADS 5using nam
2022-01-12 00:23:18
6850
原创 随笔——WebServer相关
梳理一下程序的大概流程,主要是为了熟悉网络编程。1. 非阻塞的套接字与epoll又对epoll有了一定的了解,参考连接 。ET(边缘触发模式),也就是对套接字的可读可写这些事件,只会相应一次,相应结束之后,需要再次重新注册事件,才会触发。所以代码里会频繁的对套接字进行mod修改操作:并且,对于非阻塞的 socket,此时 send 函数返回 -1,错误码为 EAGAIN 或 EWOULDBLOCK,你一定要继续注册检测可写事件,否则你剩余的数据就再也没有机会发送了,因为 ET 模式的可写事件再也不
2022-01-09 21:59:19
215
原创 随笔——虚函数、虚表剖析
虚函数在之前已经记录过:C++复习——虚函数与多态今天面试遇到了一个关于虚函数表的问题,因此特地钻研一下,参考文章:C++ 虚函数表剖析话不多说,直接上代码show me your code1. 简单示例class A{class A{public: virtual void vfunA(){ std::cout<<"class A::vfunA"<<std::endl;} virtual void vfunB(){ std::cout <<
2021-12-23 20:25:08
387
原创 C++的花括号、unique_lock与condition_variable
多线程并发中,会使用到锁和信号量,此处介绍常用的操作std::unique_lock的使用std::unique_lock为锁管理模板类,是对通用mutex的封装。std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即在unique_lock对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而unique_lock的生命周期结束之后,它所管理的锁对象会被解锁。 其具体实现方式是采用RAII思想,即在构造函数中执行lock,析构函
2021-12-06 11:26:53
1117
原创 lambda函数与多线程thread
Lambda表达式,可以方便的定义和创建匿名函数。此帖介绍一下lambda与多线程之间的关系。创建一个多线程用例#include <chrono> // std::chrono::seconds#include <iostream> // std::cout#include <thread> // std::thread, std::this_thread::sleep_forvoid thread_task(int n) { std:
2021-12-05 21:21:50
1228
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人