自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

柚子树's Blog

但行好事,莫问前程

  • 博客(128)
  • 收藏
  • 关注

原创 什么是RPC框架?

RPC(Remote Procedure Call)即远程过程调用,不同于本地调用,RPC是指调用远端机器的函数或方法,且不需要关心底层的调用细节,如网络协议和传输协议等,对于调用者来说,和调用本地方法没有什么区别。

2022-10-30 22:31:21 18961 1

原创 多模式字符串匹配 - AC自动机原理及实现

给一个字符串,找出字符串中指定的单词,如果是单个词,我们可以通过暴力解法,从头开始遍历字符串,判断是否存在指定的单词,当然还有一种更优的解法,那就是KMP算法,通过构造next数组,保存匹配的中间状态,在查找单词失败时,不用退回到字符串开头重新进行匹配,实现了O(m+n)的时间复杂度。这种在一个字符串中找一个单词的匹配成为单模式匹配,如果要在一个字符串中寻找多个子串了,那就是将要谈到的多模式匹配,如何实现呢?对每个子串进行KMP匹配,当然也可以。但是有一种更为优秀的多模式匹配算法,那就是AC自动机算法。

2022-05-22 18:50:19 842 1

转载 Python日志处理- logging

一、日志相关概念日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可包含可选变量数据的消息来描述。此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level)。1.日志的作用通过log的分析,可以方便用户了解系统或软件、应用的运行情况;如果你的应用log足够丰富,也可以分析以往用户的操作行为、类型喜好、地域分布或其他更多信息;如果一个应用的log同时也分了多个级别,那么可以很轻易地分析得到该应用

2022-04-17 11:51:12 2535 1

原创 什么是监控、链路追踪和日志?

Metrics、Tracing和LoggingOpenTelemetry基本定义了一个好的观察系统最后要做到的形态:终态就是实现Metrics、Tracing、Logging的融合,作为CNCF可观察性的终极解决方案。Tracing:提供了一个请求从接收到处理完毕整个生命周期的跟踪路径,通常请求都是在分布式的系统中处理,所以也叫分布式链路追踪Metrics:提供量化的系统内部和外部各个维度的指标,一般包括Counter、Gauge、Histoream等Logging:提供系统/进程最精细化的信息,

2022-04-16 23:25:22 2210

原创 Mac开发基础配置

一、安装HomeBrewHomeBrew是Mac下的一个包管理器,方便安装一些工具软件,类似于Ubuntu下的apt工具。打开Mac终端,输入如下命令安装:安装ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"推荐使用国内镜像安装: Homebrew国内源更换HomeBrew镜像源1. 替换默认源:替换brew.gitcd "$(brew --repo)"git remote set-url origin ht

2021-11-11 15:43:21 467

原创 memmove函数的实现

memcpy和memmove在C语言中,对于字符串之间的拷贝经常使用的函数有strcpy, strncpy以及memcpy, memmove这几个,其中str系列只可用于字符串间的拷贝,而mem系列为按字节内存拷贝,可用于任何类型数据间的拷贝。为什么有了memcpy还需要有memmove呢?这是Mac平台下的memmove函数,与其它平台不同,不好直接看到源码:#if __has_builtin(__builtin___memmove_chk) || defined(__GNUC__)#undef m

2021-10-31 15:36:27 1251

原创 C++中do...while(false)妙用

C++中do…while(false)妙用C++中,循环逻辑有三种格式:for,while以及do...while();,前两种是比较常用的,循环逻辑也很直观,但是do...while()循环一般比较少见,它其实更多地是用在宏函数定义和代码结构优化中,具体看下面代码:用在宏函数中加入需要定义一个释放内存的宏函数,如下:#define SAFE_DELETE(ptr)

2021-08-11 20:41:53 1067 1

原创 C++中的std::bind和std::function

std::bindstd::bind可以将可调用对象和一组参数绑定,并且可以自定义参数绑定顺序,绑定后的结果可以直接作为可调用对象进行调用,也可以继续绑定到std::function,作为回调函数使用。示例代码如下:/** * @file bind.cpp * @brief * @author DuYong * @date 2021-08-05 */#include <iostream>void foo(int param1, int param2, i

2021-08-11 00:17:06 392

原创 C++20新特性总结

一、The Big Four1.1 ConceptsC++中模板编程极大地简化了代码的编写,但同时也会带来一些使用上的疑惑,例如一下代码片段,判断两个数是否相等,只要是重载了==运算符,自定义类型也可以使用该模板实例化对应的比较函数:/** * @file comcept.cpp * @brief * @author YongDu * @date 2021-07-20 */template <typename T>auto isEqual(T .

2021-07-22 21:13:24 2373 6

原创 C++17新特性总结

参考链接:C++17一、语言特性1.1 折叠表达式C++17中引入了折叠表达式,主要是方便模板编程,分为左右折叠,下图为其解包形式:template <typename... Args> auto sub_right(Args... args) { return (args - ...);}template <typename... Args> auto sub_left(Args... args) { return (... - args); }templa

2021-07-20 20:13:07 3351 2

原创 C++14新特性总结

一、语言特性1.1 函数返回类型推导如下,声明一个返回类型为auto的函数,让它依据函数调用时传入的参数进行推导,指定C++11标准进行编译,我用的是clang编译器,编译命令为:clang++ -std=c++11 1.1.cpp,发现会有编译错误,并且报告说这是C++14的新特性,如下:/** * @file 1.1.cpp * @brief * @author YongDu * @date 2021-07-18 */#include <iostream&gt

2021-07-19 00:08:03 6202 2

原创 《深入理解C++11》阅读笔记

1、新标准的诞生C++11 是 C++ 的第二个主要版本(前一个是 C++98 而后一个是 C++17 ),并且是从 C++98 起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。在它最终由 ISO 在 2011 年 8 月 12 日承认前,人们曾使用名称 ‘C++0x’ ,因为它曾被期待在 2010 年之前发布。 C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起, C++ 规则地每 3 年更新一次。C++11相对于C+

2021-07-18 19:58:01 855 10

原创 静态分析C程序的内存模型

代码静态分析必须可以准确地追踪不同内存对象的值,这篇论文描述了一种适用于C程序静态分析的内存模型。此模型特别适合于那些精确地路径敏感分析,例如:符号执行技术。它可以处理各种类型的C程序表达式,包括多级指针解引用,指针算数运算,复合数组和结构体类型,各种类型转换以及动态内存分配等等。它将各种左值表达式映射为不需要额外分析别名的相同对象,在 Clang static analyzer 中已经实现了这个模型,并且大大增强了精确追踪的能力。1. 引言在符号执行技术中,追踪单一路径中不同内存对象的值是一通用要.

2021-07-15 16:05:50 507

转载 CMake 入门实战

什么是CMakeAll problems in computer science can be solved by another level of indirection.David Wheeler你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要

2021-06-27 12:27:18 830

转载 C++中的POD类型

POD类型是英文中Plain Old Data的缩写。POD在C++中是一个非常重要的概念,通常用于说明一个类型的属性,尤其是用户自定义类型的属性。POD属性在C++11中往往又是构建其它C++概念的基础,事实上,在C++11标准中,POD出现的概率相当高。因此学习C++,尤其是在C++11中,了解POD的类型是非常必要的。POD意如其名。Plain,表示了POD类型是个普通的类型,在C++中常见的类型都有这样的属性,而不像一些存在着虚函数虚继承的类型那么特别。而Old类型则体现了其与C的兼容性,比如可以

2021-06-27 12:09:40 4126

原创 make,Makefile简易教程

一、概述make是一个类UNIX系统下的编译命令,也可以理解为一个项目管理工具,通过make可以按照自己指定的编译命令编译整个项目,相当于将在命令行的编译命令按序执行,省去了反复键入编译命令的麻烦。除此之外,如果手动执行编译命令,不仅费时难以记忆,最重要的是每执行一次编译命令,项目中的整个文件都要重新编译,即使是未修改过的文件,这在大型项目中是难以忍受的。而make就提供了一种完美的解决方案,它将要执行的编译命令通过特定的语法组织到Makefile文件中,每次只要执行make命令,就可以完成整个项目的构建

2021-06-27 02:04:58 821 1

原创 二分查找边界问题总结

这篇总结主要是针对刷题过程中的遇到的各种二分的边界问题及常见二分类型,主要是参考了别人的博客思想,自己只是记录下来固定自己的二分模板,几点声明:以下代码均采用闭区间,即[left, right]取中间值采用了位运算,如果边界不能保证不含负奇数,则位操作会有问题,具体可参考:计算机中右移一位和除以二的区别以下的二分算法后面四种类型都是前三种的变形,所以主要理解前三种的思想和边界控制文章目录一、基础版查找 target 是否存在查找大于等于 target 的第一个数查找大于 target 的第一个数二

2021-03-13 12:34:00 618

原创 计算机中右移一位和除以二的区别

二分查找中的中位数在二分查找算法中,我们经常会写类似int mid = (left + right) / 2的操作,考虑周全一点的会写成int mid = left + (right - left) / 2形式,更加极客的则会写为int mid = left + ((right - left) >> 1),逐渐优秀。我们也认为右移的结果就是除以二,没有什么区别,今天刷题的过程中,遇到了问题,因为二分中左边界不是以0开始的,用了右移操作,一直报错,后来换成除法操作才解决问题。顺便就总结下右移和除

2021-03-12 17:19:06 5072 2

原创 TCP的连接建立与释放

2021-03-11 18:50:13 112

原创 Typora,PicGo和Gitee搭建免费图床

最近因为要将一些整理的面试资料托管到github上面,方面以后实习秋招用到,本地笔记是用Typora写的,是个很方便的markdown写作工具,然后推送到github仓库,笔记中会含有一些图片文件,本来是用相对路径引入的,也在仓库中,按理说应该可以通过页面加载出来,但是很奇怪,这个github偶尔能加载出来,时常是加载不出来的,如下:想着有没有免费的图床,将图片上传到图床,生成链接,再引入文档中,这样就可以通过网页正常访问了,刚开始想到的图床是CSDN的免费图床,它会修改一些图片的信息,所以还是不太喜.

2021-03-11 16:17:56 174

转载 [C++] 中的trivial destructor

如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。如果某个类中只有基本类型的话是没有必要调用析构函数的,delelte p的时候基本不会产生析构代码,在C++的类中如果只有基本的数据类型,也就不需要写显式的析构函数,即用默认析构函数就够用了,但是如果类中有个指向其他类的指针,并且在构造时候分配

2021-03-10 13:06:57 1065

原创 二叉树的递归和迭代遍历-C++版

文章目录1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历5. 测试函数// binary_tree.h// 结点struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}};/********************** 二叉树增加结点**********************/

2021-03-04 02:00:58 98 1

原创 10种排序算法C++版

文章目录1. 冒泡排序2. 选择排序3. 插入排序4. 快速排序5. 堆排序6. 归并排序7. 希尔排序8. 计数排序9. 桶排序10. 基数排序测试的main函数各种排序算法复杂度1. 冒泡排序/*(无序区,有序区)。从无序区通过交换找出最大元素放到有序区前端。冒泡排序思路:1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。3. 针对所有的元素重复以上的步骤,除了最后一个。4.

2021-03-02 22:30:09 231

转载 [系统编程] 进程,线程问题总结

一、什么是进程?什么是线程​ 进程是表示资源分配的基本单位,又是调度运行的基本单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。所以,进程是系统中的并发执行的单位。​ 在Mac、Windows NT等采用微内核结构的操作系统中,进程的功能发生了变化:它只是资源分配的单位,而不再是调度运行的单位。在微内核系统中,真正调度运行的基本单位

2021-03-01 12:47:33 224 1

原创 [C++] 打印从1到最大的n位数(string处理最大数)

/*------------------------------------*//** * @file 剑指offer * @brief 输出从1到n的整数 * * @author DuYong * @date 2020-9-19**//*------------------------------------*/#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#incl

2020-09-19 14:34:50 265

原创 [TensorBoard] OSError: [Errno 22] Invalid argument处理

在学习Tensorflow时,遇到tensorboard无法可视化问题,执行tensorboard --logdir=log,发现报错,具体如下:解决办法:找到并打开错误错误最后一行所提示的文件,我的是C:\FastSoftware\Python\Lib\site-packages\tensorboard\manager.py(修改时改成你们自己的路径)将图中所示代码修改:修改为:保存退出重新运行tensorboard --logdir=log,发现启动成功:在浏览器输入localho

2020-08-20 11:14:25 287

原创 [正则表达式] 匹配分组

1. 匹配分组相关正则表达式代码功能|匹配左右任意一个表达式(ab)将括号中字符作为一个分组\num引用分组num匹配到的字符串(?P)分组起别名(?P=name)引用别名为name分组匹配到的字符串示例1:|需求:在列表中[“apple”, “banana”, “orange”, “pear”],匹配apple和pearimport re# 水果列表fruit_list = ["apple", "banana", "orange",

2020-08-18 19:57:07 4226

原创 [正则表达式] 匹配开头和结尾

1. 匹配开头和结尾代码功能^匹配字符串开头$匹配字符串结尾示例1:^需求:匹配以数字开头的数据import re# 匹配以数字开头的数据match_obj = re.match("^\d.*", "3hello")if match_obj: # 获取匹配结果 print(match_obj.group())else: print("匹配失败")运行结果:3hello示例2:$需求: 匹配以数字结尾的数据import

2020-08-18 19:56:14 67300

原创 [正则表达式] 匹配多个字符

1. 匹配多个字符代码功能*匹配前一个字符出现0次或者无限次,即可有可无+匹配前一个字符出现1次或者无限次,即至少有1次?匹配前一个字符出现1次或者0次,即要么有1次,要么没有{m}匹配前一个字符出现m次{m,n}匹配前一个字符出现从m到n次示例1:*需求:匹配出一个字符串第一个字母为大小字符,后面都是小写字母并且这些小写字母可 有可无import reret = re.match("[A-Z][a-z]*","M")print(ret

2020-08-18 19:54:57 6272

原创 [正则表达式] 单个字符匹配

1. 匹配单个字符通过re模块能够完成使用正则表达式来匹配字符串代码功能.匹配任意1个字符(除了\n)[ ]匹配[ ]中列举的字符\d匹配数字,即0-9\D匹配非数字,即不是数字\s匹配空白,即 空格,tab键\S匹配非空白\w匹配非特殊字符,即a-z、A-Z、0-9、_、汉字\W匹配特殊字符,即非字母、非数字、非汉字示例1: .import reret = re.match(".","M")print(ret.

2020-08-18 19:54:05 739

原创 [正则表达式] python中的使用

1. 正则表达式的介绍在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要,比如:邮箱、图片地址、手机号码等,这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了。2. 正则表达式概念正则表达式就是记录文本规则的代码3. 正则表达式的样子0\d{2}-\d{8} 这个就是一个正则表达式,表达的意思是匹配的是座机号码4. 正则表达式的特点正则表达式的语法很令人头疼,可读性差正则表达式通用行很强,能够适用于很多编程语言5. re模块的介绍在Python中需要通过正则表达式

2020-08-18 19:53:07 126

原创 [Python] 深拷贝和浅拷贝

1. 浅拷贝copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。不可变类型的浅拷贝示例代码:import copy # 使用浅拷贝需要导入copy模块# 不可变类型有: 数字、字符串、元组a1 = 123123b1 = copy.copy(a1) # 使用copy模块里的copy()函数就是浅拷贝了# 查看内存地址print(id(a1))print(id(b1))print("-" * 10)a2 = "a

2020-08-18 19:11:31 186

原创 [Python] 生成器的创建方式

1. 生成器的介绍根据程序员制定的规则循环生成数据,当条件不成立时则生成数据结束。数据不是一次性全部生成处理,而是使用一个,再生成一个,可以节约大量的内存。2. 创建生成器的方式生成器推导式yield 关键字生成器推导式:与列表推导式类似,只不过生成器推导式使用小括号# 创建生成器my_generator = (i * 2 for i in range(5))print(my_generator)# next获取生成器下一个值# value = next(my_generat

2020-08-18 19:10:32 203

原创 [Python] with语句和上下文管理器

1. with语句的使用向文件中写入数据的示例代码: # 1、以写的方式打开文件 f = open("1.txt", "w") # 2、写入文件内容 f.write("hello world") # 3、关闭文件 f.close()代码说明:文件使用完后必须关闭,因为文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的这种写法可能出现一定的安全隐患,错误代码如下: # 1、以读的方式打开文件 f = open("1.txt", "r") # 2、读取文

2020-08-18 19:09:29 190

原创 [Python] property属性

1. property属性的介绍property属性就是负责把一个方法当做属性进行使用,这样做可以简化代码使用。定义property属性有两种方式装饰器方式类属性方式2. 装饰器方式class Person(object): def __init__(self): self.__age = 0 # 装饰器方式的property, 把age方法当做属性使用, 表示当获取属性时会执行下面修饰的方法 @property def age(self)

2020-08-18 19:08:30 134

原创 [C++] 运算符重载总结及复数类实现

C++ 预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。运算符重载的实质就是函数重载或函数多态。运算符重载是一种形式的 C++ 多态。目的在于让人能够用同名的函数来完成不同的基本操作。要重载运算符,需要使用被称为运算符函数的特殊函数形式,运算符函数形式:operator p(argument-list)//operator后

2020-08-18 14:59:22 692

原创 [Python] 装饰器介绍及使用

一、装饰器介绍1. 装饰器的定义就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。装饰器的功能特点:不修改已有函数的源代码不修改已有函数的调用方式给已有函数增加额外的功能2. 装饰器的示例代码# 添加一个登录验证的功能def check(fn): def inner(): print("请先登录....") fn() return innerdef comment(): print("发表评论")# 使用装饰器

2020-08-16 23:42:20 163

原创 [Python] 闭包介绍及使用

一、闭包简介1. 闭包的介绍闭包的定义:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。2. 闭包的构成条件通过闭包的定义,我们可以得知闭包的形成条件:在函数嵌套(函数里面再定义函数)的前提下内部函数使用了外部函数的变量(还包括外部函数的参数)外部函数返回了内部函数3. 简单闭包的示例代码# 定义一个外部函数def func_out(num1): # 定义一个内部函数 def func_in

2020-08-16 23:31:44 156

原创 [jQuery-6] ajax

1. ajax的介绍ajax 是 Asynchronous JavaScript and XML的简写,ajax一个前后台配合的技术,它可以让 javascript 发送异步的 http 请求,与后台通信进行数据的获取,ajax 最大的优点是实现局部刷新,ajax可以发送http请求,当获取到后台数据的时候更新页面显示数据实现局部刷新,在这里大家只需要记住,当前端页面想和后台服务器进行数据交互就可以使用ajax了。这里提示一下大家, 在html页面使用ajax需要在web服务器环境下运行, 一般向自己的

2020-08-12 10:17:10 83

原创 [jQuery-5] JavaScript对象和json

十、JavaScript对象1. JavaScript对象的介绍JavaScript 中的所有事物都是对象:字符串、数值、数组、函数等都可以认为是对象,此外,JavaScript 允许自定义对象,对象可以拥有属性和方法。2. JavaScript创建对象操作创建自定义javascript对象有两种方式:通过顶级Object类型来实例化一个对象通过对象字面量创建一个对象Object类创建对象的示例代码:<script> var person = new Object()

2020-08-12 10:16:57 89

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除