自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 【云原生】玩转docker实战(二):单机环境的容器编排工具docker-compose

docker-compose是一种容器编排技术,也使用YAML,但它的基因与 Kubernetes 完全不同,走的是 Docker 的技术路线,所以在设计理念和使用方法上有差异就不足为怪了。docker-compose 自身的定位是管理和运行多个 Docker 容器的工具,很显然,它没有 Kubernetes 那么“宏伟”的目标,只是用来方便用户使用 Docker 而已,所以学习难度比较低,上手容易,很多概念都是与 Docker 命令一一对应的。

2022-11-18 21:00:00 1478 2

原创 【云原生】玩转Kubernetes实战(一):Pod、ConfigMap的使用

本文主要是利用Kubernetes 集群搭建出一个 WordPress 网站,用了三个镜像:WordPress、MariaDB、Nginx。下面是其简单的架构图,用于直观的展示这个系统的内部逻辑关系:简单来说,就是要通过本地地址直接访问到WordPress网站。

2022-11-18 16:31:47 1144

原创 【云原生】玩转docker实战(一):多个docker的网站搭建

本文主要介绍如何利用docker命令搭建出一个 WordPress 网站,网站需要用到三个镜像:WordPress、MariaDB、Nginx。默认都是拉取latest的下面是其简单的架构图,用于直观的展示这个系统的内部逻辑关系:这个系统可以说是比较典型的网站了。MariaDB 作为后面的关系型数据库,端口号是 3306;WordPress 是中间的应用服务器,使用 MariaDB 来存储数据,它的端口是 80;Nginx 是前面的反向代理,它对外暴露 80 端口,然后把请求转发给 WordPress。

2022-11-18 11:12:28 1453

原创 在Ubuntu上使用protobuf(C++)

protobuf 使用教程;protobuf 入门; protoc 编译;运行可执行文件testread,读出addressbook.data中的信息,也就是反序列化。生成的文件主要包含了结构体成员设置和格式转换的接口,下面展示一下如何使用。可以看到最后面,电话本(AddressBook)里面定义了。执行完后,会生成一个.cc和一个.h文件。,可以从里面下载指定语言的压缩包。源文件的写法及更多介绍,可以参考。在上面解压的文件夹下,是有一个。这个文件主要的作用是定义了。代表了电话本可以包含多个。

2022-09-30 16:59:55 2765 2

原创 基于mmcls的车辆属性识别

本研究主要针对车辆属性识别课题。研究能够识别车辆多种外观属性的智能算法,这些属性包含颜色、 类型、副驾驶是否有人、是否系安全带、遮阳板是否放下、车辆朝向、是否有车顶架等。该数据集来自于论文(A Deep Learning-Based Approach to Progressive Vehicle Re-identification for Urban Surveillance),其中提到为了促进车辆重识别(Re-Id)的研究,我们在现实世界城市监控场景中建立了一个名为VeRi的车辆重识别的大规模基准数据集。

2022-09-29 11:15:25 1712 9

原创 curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused

Failed to connect to xxx.com port 443: Connection refused。-bash: /etc/resolv.conf: Permission denied

2022-09-11 20:02:31 1804

原创 【C++】11新特性:异步操作std::async

std::async是更高层次上的异步操作,它的存在可以使开发者不用关注线程创建内部细节,就能方便的获取异步执行状态和结果,还可以指定线程创建策略,应该用std::async替代线程的创建,让它成为做异步操作的首选。其主要涉及std::future、std::packaged_task、std::promise等

2022-09-03 20:42:49 4090

原创 【C++】11新特性:std::atomic、std::call_once和std::condition_variable

c++11提供了原子类型`std::atomic`,理论上这个T可以是任意类型,但是平时只存放整形,别的还真的没用过,整形有这种原子变量已经足够方便,就不需要使用`std::mutex`来保护该变量啦。c++11提供了`std::call_once`来保证某一函数在多线程环境中只调用一次,它需要配合`std::once_flag`使用。在C++中,引入了更加方便的一种同步机制`std::condition_variable`,它可以阻塞一个线程或者个线程,直到有线程通知或者超时才会唤醒正在阻塞的线程,条件变

2022-09-03 17:27:35 557

原创 【C++】11新特性:std::thread、std::mutex和两种RAII方式的锁封装

c++11引入了`std::thread`来创建线程,支持对线程`join`或者`detach`。`std::mutex`是一种线程同步的手段,用于保存多线程同时操作的共享数据。相比于以往的`pthread_mutex_t`方便了许多。c++11主要有`std::lock_guard`和`std::unique_lock`两种锁封装的方式,可以动态的释放锁资源,防止线程由于编码失误导致一直持有锁。

2022-09-03 16:17:25 1459

原创 【C++】11新特性:左右值引用、移动语义move、完美转发forward

C++11新增了右值引用,C++11引入了右值引用的概念,使得我们把引用与右值进行绑定。使用两个“取地址符号”。移动语义std::move可以理解为转移所有权,之前的拷贝是对于别人的资源,自己重新分配一块内存存储复制过来的资源。右值引用作为是C++11中最重要的新特性之一,解决了C++中大量的历史遗留问题,使C++标准库的实现在多种场景下消除了不必要的额外开销(如std::vector, std::string),也使得另外一些标准库(如std::unique_ptr, std::function)成为可能

2022-09-02 21:52:03 698

原创 【C++】11新特性:列表初始化std::initializer_list

列表初始化是C++11新增的特性。

2022-09-02 19:15:28 690 7

原创 【C++】11新特性:关键字auto和decltype

之前一开始学STL容器的时候,每次要用迭代器遍历容器的时候,都在for循环中写出了好长的式子,而且主要是类型部分比较长。当时还是比较懊恼的,每次码这么多,后来发现了auto,解放了双手。在编程的时候,我们常常需要把表达式的值赋值给一个新的变量,这时候就要求我们清楚地知道表达式的类型。很多时候,知道表达式的类型其实挺难的,也正是因为这个问题,C++11标准引入了auto关键字,用它能让编译器替我们去分析表达式所属的类型,方便开发者编码的同时也简化了代码。auto。

2022-09-02 17:19:11 181

原创 【C++】11新特性:关键字override和final

在C++11之前,一直没有***继承控制***关键字。禁用一个类的进一步衍生是可能的但也很棘手。为避免用户在派生类中重载一个虚函数,你不得不向后考虑。## **虚函数重载的两个常见错误**一个派生类可以重载在基类中声明的成员函数,这是面向对象设计的基础。然而像重载一个函数这么简单的操作也会出错。关于重载虚函数的两个常见错误如下: - 无意中重载- 签名不匹配

2022-09-02 15:52:12 201

原创 【C++】11新特性:可调用对象封装std::function

类模版`std::function`是一种通用、多态的函数封装。`std::function`的实例可以对任何可以调用的目标实体进行存储、复制、和调用操作,这些目标实体包括:- 普通函数- 函数指针- `Lambda`表达式- `bind`对象- 函数对象

2022-09-02 13:21:30 405

原创 【C++】11新特性:函数适配器std::bind

对于std::bind函数中的参数列表,可以通过来占用位置,在实际调用的地方再进行指定。预先绑定的参数是通过值传递的,而占位符所在位置,跟函数具体参数传递类型有关在实际工作中,经常会用到bind绑定类成员函数,这时候第一个参数表示对象的成员函数的指针,第二个参数表示对象的地址,这是因为对象的成员函数需要有this指针。并且编译器不会将对象的成员函数隐式转换成函数指针,需要通过&手动转换;

2022-09-02 13:12:27 260

转载 【C++】头文件的作用以及用法

头文件的作用:加强类型检查,提高类型安全性;减少公用代码的重复书写,提高编程效率;提供保密和代码重用的手段。

2022-08-31 21:31:30 2348

转载 【C++】关键字restrict的作用

restrict用于限定和约束,表示这个指针只访问这块内存的唯一方式,也就是告诉编译器,这块内存中的内容的操作都只会通过这个指针,而不会通过其他变量或者指针。

2022-08-31 11:06:08 718

原创 【Redis】如何保证主从库的数据一致?

本文主要是研究了Redis 的主从库同步的基本原理,关于全量复制、基于长连接的命令传播,以及增量复制。全量复制虽然耗时,但是对于从库来说,如果是第一次同步,全量复制是无法避免的小建议:一个 Redis 实例的数据库不要太大,一个实例大小在几 GB 级别比较合适,这样可以减少 RDB 文件生成、传输和重新加载的开销。另外,为了避免多个从库同时和主库进行全量复制,给主库过大的同步压力,我们也可以采用“主 - 从 - 从”这一级联模式,来缓解主库的压力。长连接复制是主从库正常运行后的常规同步阶段。...

2022-08-14 15:37:05 3481

原创 【Redis】底层数据结构:压缩列表(ziplist)

压缩列表(ziplist)是Redis的一种底层数据结构,这是一种非常节省内存的结构,是列表(List)、Hash(哈希)和 Sorted Set(有序集合)的底层实现之一。压缩列表之所以能节省内存,就在于它是用一系列连续的 entry 保存数据。这里之前有个疑惑,在压缩列表中,如果我们要查找定位第一个元素和最后一个元素,可以通过表头三个字段的长度直接定位,复杂度是 O(1)。而查找其他元素时,就没有这么高效了,只能逐个查找,此时的复杂度就是 O(N) 了。.........

2022-08-12 20:38:17 1045

原创 【网络编程】更强的IO复用模型:epoll

epoll可以说是和poll非常相似的一种I/O多路复用技术,epoll通过监控注册的多个描述字,来进行I/O事件的分发处理。不同于poll的是,epoll不仅提供了默认的level-triggered(条件触发)机制,还提供了性能更为强劲的edge-triggered(边缘触发)机制,在后面小结会展开分析。使用epoll进行网络程序的编写,需要三个步骤,分别是epoll_ctlepoll_wait下面将逐一分析一下。默认采用的模式但是只支持非阻塞模式https。.........

2022-07-19 21:02:29 271

原创 【网络编程】IO多路复用的搭档:非阻塞IO

本文主要是针对非阻塞IO的相关知识进行了学习总结。

2022-07-19 19:39:50 908

原创 【网络编程】IO多路复用:poll函数

相比于select,poll函数和内核交互的数据结构也有所改变。fds监听的文件描述符数组intfd;//待监听的文件描述符//待监听的文件描述符对应的监听事件,取值为//传入时,给0。如果满足对应事件的话,返回非0-->POLLIN、POLLOUT、POLLERR};nfds描述的是数组fds的大小,简单说,就是向poll申请的事件检测的个数。timeout描述了poll的行为。大于0超时时长。单位毫秒;-1阻塞等待,有事件之前,永远等待;0不阻塞,立即返回。...

2022-07-19 16:41:44 1416

原创 【网络编程】IO多路复用:select函数

nfds监听的所有文件描述符中,最大文件描述符+1,表待监听文件符的数量,文件描述符下标从0开始。*readset读文件描述符监听集合,传入、传出参数writeset写文件描述符监听集合,传入、传出参数exceptset异常文件描述符监听集合,传入、传出参数timeout定时器大于0设置监听超时时长NULL阻塞监听0非阻塞监听,轮询那么如何设置这些描述符集合呢?以下的宏可以帮助到我们。//清空一个文件描述符集合//将待监听的文件描述符,添加进监听集合中。......

2022-07-19 15:42:57 1393

原创 【C++】如何用好异常?

异常是针对错误码的缺陷而设计的,它不能被忽略,而且可以“穿透”调用栈,逐层传播到其他地方去处理;使用try-catch机制处理异常,能够分离正常流程与错误处理流程,让代码更清晰;throw可以抛出任何类型作为异常,但最好使用标准库里定义的exception类;完全用或不用异常处理错误都不可取,而是应该合理分析,适度使用,降低异常的成本;关键字noexcept标记函数不抛出异常,可以让编译器做更好的优化。当然,想真的用好异常,还得在实际开发中多多积累经验,多多尝试>_...

2022-07-17 21:15:12 431

原创 【C++】初识智能指针:智能在哪?

在说智能指针之前,先来看看“不智能指针”,也就是“裸指针”,这里直接简称指针。指针是源自C语言的概念,本质上是一个内存地址索引,代表了一小片内存区域(也可能会很大),能够直接读写内存。因为它完全映射了计算机硬件,所以操作效率高,是C/C++高效的根源。当然,这也是引起无数麻烦的根源。访问无效数据、指针越界,或者内存分配后没有及时释放,就会导致运行错误、内存泄漏、资源丢失等一系列严重的问题。它完全实践了RAII,包装了裸指针,而且因为重载了*和->操作符,用起来和原始指针一模一样。和。...

2022-07-17 20:01:33 360

原创 【网络编程】检查数据的有效性:缓冲区处理

在网络编程中,需要多注意异常边界的检测问题,因为这些问题决定了程序运行的稳定性,不要动不动就崩了。要时刻提醒自己做好应对各种复杂情况的准备,这里的异常情况包括缓冲区溢出、指针错误、连接超时检测等。问题一在读数据的时候,一般都需要给应用程序最终缓冲区分配大小,这个大小咋确定?最终缓冲区的大小应该比预计接收的数据大小大一些,预防缓冲区溢出。问题二这里的缓冲区是否可以换成动态分配?可以的,但是要记得在return前释放缓冲区。...

2022-07-17 16:47:45 487

原创 【网络编程】地址已经被使用:”Address already in use“

在所有TCP服务器程序中,调用bind之前请设置SO_REUSEADDR套接字选项。这不会产生危害,相反,它会帮助我们在很快时间内重启服务端程序,而这一点恰恰是很多场景所需要的。问题一关于tcp_tw_reuse和SO_REUSEADDR的区别tcp_tw_reuse是为了缩短time_wait的时间,避免出现大量的time_wait链接而占用系统资源,解决的是accept后的问题;https。.........

2022-07-17 15:06:51 5651 1

原创 【网络编程】如何检测无效连接?keep-alive?心跳?

虽然TCP没有提供系统的保活能力,让应用程序可以方便地感知连接的存活,但是,我们可以在应用程序里灵活地建立这种机制。一般来说,这种机制的建立依赖于系统定时器,以及恰当的应用层报文协议。比如,使用心跳包就是这样一种保持KeepAlive的机制。...

2022-07-17 13:08:35 1009

原创 【网络编程】双向的TCP如何关闭?close ?shutdown?

close函数只是把套接字引用计数减1,未必会立即关闭连接;close函数如果在套接字引用计数达到0时,立即终止读和写两个方向的数据传送。基于这两点,在期望关闭连接其中一个方向时,应该使用shutdown函数。...

2022-07-17 10:44:54 1112

原创 【C++】编译阶段技巧:属性和静态断言

先来研究一下编译阶段究竟能做什么事情。编译是预处理之后的阶段,它的输入是(经过预处理的)C++ 源码,输出是二进制可执行文件(也可能是汇编文件、动态库或者静态库)。这个处理动作就是由编译器来执行的。和预处理阶段一样,在这里你也可以“面向编译器编程”,用一些指令或者关键字让编译器按照你的想法去做一些事情。只不过,这时你要面对的是庞大的 C++ 语法,而不是简单的文本替换,难度可以说是高了好几个数量级。编译阶段的特殊性在于,它看到的都是 C++ 语法实体,比如 typedef、using、template、st

2022-07-14 13:40:38 554

原创 【网络编程】对套接字读写的理解(2):writev和readv的使用场景

在前面一篇文章里面说到了write和read的简单读写,讨论了一下发送缓冲区的问题。在介绍writev和readv的具体用法之前,先从TCP角度来理解一下数据流的发送和接收,这能让我们进一步理解套接字读写的内涵。通过前面的内容知道,调用这些接口并不意味着数据被真正发送到网络上,其实,这些数据只是从应用程序中被拷贝到了系统内核的套接字缓冲区中,或者说是发送缓冲区中,等待协议栈的处理。至于这些数据是什么时候被发送出去的,对应用程序来说,是无法预知的。对这件事情真正负责的,是运行于操作系统内核的 TCP 协议栈实

2022-07-13 21:32:49 726 1

原创 【网络编程】对套接字读写的理解(1):write、send 和read

在封装TCP读写的时候,遇到了读写函数的选择问题,进而研究了一下,在此记录。常用的三个函数分别为write、send 和 sendmsg。函数原型如下:每个函数可以单独使用,但使用的场景有所不同:上面这些可能查下资料,大家基本都可以知道,然后觉得套接字读写和普通文件的读写没有什么区别,其实里面暗含了很多内在的区别。对于普通文件描述符而言,一个文件描述符代表了打开的一个文件句柄,通过调用 write 函数,操作系统内核帮我们不断地往文件系统中写入字节流。注意,写入的字节流大小通常和输入参数 size 的值是

2022-07-13 19:45:04 2989

原创 【C++】预处理阶段技巧:宏定义和条件编译

宏定义和条件编译都是在预处理阶段做的事情。只要是写C/C++程序,都会用到预处理,最常见的是“#include”,或者利用“#define”定义一些常数。但这些功能太简单了,没有真正发挥出预处理器的本领。相信不少看过优秀的C++源码的程序员,都会被作者在某个文件中的预处理指令搞得云里雾里,看得头晕。他们到底用这里指令干嘛呢首先要记住的是,预处理阶段编程的操作目标是“源码”,用各种指令控制预处理器,把源码改造成另一种形式,就像是捏橡皮泥一样。预处理指令都是以“#”符号开头,其关键字只有十来个,常见的有#inc

2022-07-13 12:23:49 2030

原创 【C++】VS Code中配置C/C++环境的记录

以前一直在linux上进行cpp的开发,没有在wins下编译过。最近有个wins客户端的项目,所以打算配一下wins下的编译环境。MinGW-w64的官网:https://www.mingw-w64.org/下载上面那个压缩包之后,解压到合适的目录下,复制其下的bin目录的绝对路径将复制好的路径加入到环境变量的系统变量path中。按win+R输入cmd,在命令提示符中输入gcc -v,能显示出版本信息即为安装成功。上面写了vscode在windows下编写C++的简单配置,本人没有用vscode的直接运

2022-07-03 13:20:40 205

原创 【C++】11新特性:函数式编程lambda

lambda 不仅仅是对旧有函数对象的简单升级,而是更高级的“闭包”,给 C++ 带来了新的编程理念:函数式编程范式。函数在 C 语言中其实就是一个“静止”的代码块,只能被动地接受输入然后输出。而 lambda 的出现则让函数“活”了起来,极大地提升了函数的地位和灵活性。虽然目前在 C++ 里,纯函数式编程还比较少见,但“轻度”使用 lambda 表达式也能够改善代码,比如用“map+lambda”的方式来替换难以维护的 if/else/switch,可读性要比大量的分支语句好得多。

2022-06-09 10:49:12 1215

转载 腾讯云部署LAMP_建站心得

本人最近正在捣鼓微信开发,这期间有微信开发的服务器配置,既然要服务器配置,就少不了LAMP平台的搭建(期间参考了阿里云的建站教程,但照搬肯定在腾讯云搭载不起来)。于是我就把配置的心得写了下来,希望可以帮到刚开始在腾讯云建站的小萌新们。#项目配置(以下是我的配置,操作时,以实际的软件版本为准)操作系统:CentOS 7.2 64位Apache:2.4.37MySQL:5.6.24PHP:...

2019-05-31 13:34:55 524

原创 微信公众号服务器配置时的token验证程序index.php

微信公众号服务器配置时的token验证程序index.php我搞的时候,用过很多个别人写的,可是就是token验证错误,可能跟这个编码格式有关,建议先将代码复制到notepad++上,再复制到服务器的index.php上。这代码其实不需要看懂,以后微信开发是直接删掉的。代码如下:<?phptraceHttp();define("TOKEN", "weixin");$wechat...

2019-05-31 13:07:30 864

空空如也

空空如也

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

TA关注的人

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