自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

博客

学习笔记

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

原创 C++实现多级时间轮定时器

最近实现了一个多级时间轮定时器,经过了简单的测试,如果将时钟步长设置为10ms以内误差会比较大。最新代码地址TimeWheel Github。特性C++11实现可自定义时间轮层级可自定义时间轮刻度可设置时钟步长误差基本在时钟步长以内推荐时钟步长50ms类介绍代码由三个类组成:Timer,TimeWheel,TimeWheelScheduler。Timer:定时器类,封装了定时器任务std::function<void()>。TimeWheel:时间轮类,每个时间.

2020-10-05 11:52:19 2659

原创 使用VSCODE生成调试Linux下C++的CMake项目

以epoll-server项目为例,通过VSCODE编译并调试。该形目由CMake构建,目标在该目录下生成build目录,通过CMake生成Makefile工程到build目录下,然后在build目录下执行make命令进行编译,最后通过VSCODE进行调试。Build代码目录用VSCODE WSL模式打开该目录。在.vscode文件夹下面创建task.json。task.json{ "version": "2.0.0", "tasks": [ {..

2020-09-16 17:10:32 1552

原创 Ubuntu20.04安装MySQL8.0

文章目录安装MySQL远程连接配置安装MySQL$ sudo apt update$ sudo apt install mysql-server进行初始化配置$ sudo mysql_secure_installation查看MySQL版本$ mysql --version查看MySQL运行状态systemctl status mysql.service进行连接$ sudo mysql -u root -p远程连接配置$ sudo vim /etc/mysql/mysql.c

2020-06-25 22:38:00 12259 2

原创 golang网络编程例程

文章目录1. TCP Server2. TCP Client3. UDP Server4. UDP Client1. TCP Serverfunc startTcpServer() { listener, err := net.Listen("tcp", "127.0.0.1:9003") if err != nil { panic(err) } defer listener.Close() for { conn,

2020-06-07 13:06:46 335

原创 golang基础知识例程

文章目录1. struct2. map3. slice传值4. 字符串遍历5. 多返回值6. 函数类型7. Goroutine8. slice9. Defer,panic10. MD511. Http12. Interface13. Json14. Channel15. Channel16. select17. iota18. math19. random20. 不定长参数21. closure22. nil23. strings24. flag25. 继承26. 多态27. File IO28. OS29

2020-06-04 01:47:14 482

原创 MYSQL实现排名函数RANK,DENSE_RANK和ROW_NUMBER

文章目录1. 排名分类1.1 区别RANK,DENSE_RANK和ROW_NUMBER1.2 分组排名2. 准备数据3. 不分组排名3.1 连续排名3.2 并列跳跃排名3.3 并列连续排名4. 分组排名4.1 分组连续排名4.2 分组并列跳跃排名4.3 分组并列连续排名在MYSQL的最新版本MYSQL8已经支持了排名函数RANK,DENSE_RANK和ROW_NUMBER。但是在就得版本中还...

2019-07-04 09:28:42 56309 22

原创 50道经典SQL练习题 MYSQL8.0实现

使用MYSQL8.0完成了“50道经典SQL练习题”,答案可能有误,欢迎指正。参考了多位网友的答案超经典SQL练习题,做完这些你的SQL就过关了50道SQL练习题50道SQL练习题及答案与详细分析准备数据CREATE TABLE student( id VARCHAR(10), name VARCHAR(10), age DATETIME, sex VARCHAR(10...

2019-07-03 20:18:30 4610 3

原创 《程序员的自我修养---链接、装载与库》读书笔记(三)目标文件的格式

文章目录@[TOC]第三章 目标文件里面有什么1. 可执行文件格式2. 段3. 链接的接口---符号4. 符号修饰与函数签名5. extern "C"第三章 目标文件里面有什么1. 可执行文件格式目标文件:源代码编译后但未进行链接的中间文件。例如Windows的.obj和Linux的.o。目标文件的内容和结构和可执行文件几乎是一样的。静态链接库(Static Linking Li...

2019-06-27 23:56:23 362

原创 《程序员的自我修养---链接、装载与库》读书笔记(二)编译与链接

文章目录@[toc]第二章 编译和链接1. 构建2. 编译器3. 链接第二章 编译和链接1. 构建构建(Build):将编译和链接合并到一起执行。例如使用GCC构建出一个程序时可分解为四个步骤:预处理(Preprocessing),编译(Compilation),汇编(Assembly)和链接(Linking)。$ gcc hello.c预处理(Preprocessing):...

2019-06-22 02:33:19 327

原创 《程序员的自我修养---链接、装载与库》读书笔记(一)计算机组成原理与操作系统

第一章 温故而知新1. 计算机硬件结构早期计算机硬件结构:所有I/O设备(显示设备,键盘,硬盘等),CPU和内存都直接连接在同一条总线(Bus)。I/O设备速度慢,需要连接一个I/O控制器才能连到总线上,这样才能与速度快的CPU进行通信。现代计算机硬件结构:用北桥芯片连接高速设备,使CPU、内存和高速的图形设备等能够高速地交换数据。南桥芯片连接所有的低速设备然后将它们汇总到系统总线...

2019-06-21 02:08:15 472

原创 如何去掉WIX安装包中的License Agreement页面

Wixtoolkit定义了一些安装包模板,有的模板中会有LicenseAgreement这个页面。官方文档中描述了如何去掉这个页面。实际上起作用的是第三和第四步。第三步的意思是在“WelcomeDlg”这个页面中,点击了“Next”之后,响应“NewDialog”这个事件,响应的值指定为显示“InstallDirDlg”这个页面。而默认“WelcomeDlg”这个页面之后应该是“Lic...

2019-05-15 00:49:43 789

原创 C++刷新托盘程序

项目中需要重启一个托盘程序。但是重启之后,任务栏的托盘程序图标增加了一个,原来的图标并没有消失。原来任务栏的托盘程序图标,当鼠标在上面移动过之后才会刷新。所以一个解决办法就是模拟鼠标事件,模拟鼠标在上面的所有图标都移动过。但是这种办法对于图标在隐藏任务栏中则不起作用。#include &lt;windows.h&gt;#include &lt;iostream&gt;int main()...

2019-02-28 20:59:36 1574 1

原创 使用相对路径的问题

问题引入项目中需要集成其他团队做的一个带有界面的工具。使用该工具时碰到了如下问题:直接双击这个工具的exe,可以正常启动。通过程序调用,或者用Everything打开这个工具,工具可以启动,但是界面上的图标全部消失了。问题分析打开命令行,执行目录切换到该exe目录下,然后调用该exe,正常启动。将执行目录切换到上上级目录,然后调用该exe,工具不能正常启动,图标全部消失。通过分析,...

2019-02-25 21:47:40 1214

原创 GitFlow总结

集中式工作流集中式工作流所有开发功能都在一个分支上进行。弊端:feature代码缺乏隔离,每个人开发的功能混合在一起,互相牵制。 功能分支工作流功能分支工作流以集中式工作流为基础,不同的是为各个新功能分配一个专门的分支来开发。弊端: 分支爆炸,难以管理,没人知道每个分支的状态。 GitFlow为不同的分支分配一个很明确的角色,并定义分支之间如何和什么时候进行交互...

2019-02-19 21:18:35 920

原创 HTTPS原理简述

对称加密双方可以用密钥对信息进行加密解密。如果client和server之间通信采用对称加密,那么双方需要有同一个密钥。如何让双方都有该密钥?               假设1:client在请求时将密钥发送给server:第三方可以拦截这个信息从而获得该密钥。如果使用该方法,必须将该密钥加密后, 然后发送给server,并且只能server进行解密。       假设2...

2019-02-18 19:10:35 3445

原创 C++实现线程安全的队列

&nbsp;&nbsp;C++标准库已经提供了std::queue这一队列容器,但不是线程安全的。std::queue这个容器已经提供了pop(),push(),empty()等这些读写操作容器的函数,只要在这些函数上面加个锁,就可以使其线程安全。 &nbsp;&nbsp;在C++原有容器上面进行简单封装即可实现一个线程安全的队列,实现代码如下:#include &lt;iostream...

2018-09-13 00:11:53 20440 10

原创 C++快速排序的简单实现

&nbsp;&nbsp;快速排序的基本算法思想十分简单,不断地取一个数,通过交换位置,将比这个数大的数放到右边,将比这个数小的数放到左边。&nbsp;&nbsp;如果一个数左边的数全部比它小,且右边的数全部比它大,那么它当前的位置,就是排序后的位置。而快速排序就是每次取一个数,然后通过交换位置找到它的排序后位置,最终所有的数都找到了自己的位置,从而实现排序完成。 图片摘自《C++并发...

2018-09-10 22:54:09 1011

原创 C++11实现线程安全的单例模式(使用std::call_once)

1. 饿汉模式使用饿汉模式实现单例是十分简单的,并且有效避免了线程安全问题,因为将该单例对象定义为static变量,程序启动即将其构造完成了。代码实现:#include &amp;amp;lt;iostream&amp;amp;gt;class Singleton {public: static Singleton&amp;amp;amp; GetInstance() { static Singleton intanc...

2018-09-03 23:09:31 17927 11

原创 C++ placement new 操作符

placement new 操作符可以在一块内存上面调用构造函数去构造一个对象。operator new 操作符可以申请一块内存,返回该内存的指针void*。&amp;amp;nbsp;&amp;amp;nbsp;通过这两个操作符的结合使用,可以延迟对象的构造,也可以避免重复的申请释放内存,而在一块内存上面不断地进行对象的构造析构,从而提高效率,并且减少了内存碎片的产生。 &amp;amp;nbsp;&amp;amp;nbsp;接下来举个例子,...

2018-09-03 22:07:26 271

原创 C++在头文件中定义const变量或static变量

问题引入&amp;nbsp;&amp;nbsp;代码中总能看到有的人喜欢在头文件中定义const变量,或者在头文件中定义const变量。最常见的就是在头文件中定义字符串,例如在头文件def.h中定义变量:// defs.hstatic std::string s_str = &quot;Static&quot;; const std::string kStr = &quot;Const&quot;;这样写就可以在需要用到该字符串的地方引...

2018-08-16 00:09:04 21669 1

原创 C++11的移动语义

问题一:当给函数传递对象当做函数参数时,可以使用引用类型来减少拷贝对象的代价,尤其是避免容器的拷贝等。 但是当把函数内的局部对象当做返回值时,我们无法返回该局部对象的引用,导致每次返回局部对象都会进行拷贝。 因为返回局部对象的引用是无意义的,当函数调用完成,局部对象就被析构,所以其引用指向了一块析构的内存。解决方案一: 将输出作为函数参数,例如:void GetStudents(std::vect...

2018-04-09 23:38:22 4046 1

原创 使用VS调试Dump文件

(一) 调试Dump文件步骤1. 准备调试所需要的文件放到一个文件夹:dump文件,程序编译生成的pdb文件(版本必须是产生崩溃的那个版本的编译信息),可执行文件(发生崩溃的版本)。如下图:2. 使用visual studio打开上图中的dump文件。然后配置该程序的代码路径(代码会滚到该程序所处的版本),如下图,3. 点击调试,如图,

2017-11-08 23:28:09 29823

原创 使用pugixml创建并解析XML

创建并读取如下xml文件: MaZhe 18 Miki 19 Maki 20 代码实现:#include #include #include #include #include "pugixml.hpp"static const char* kFileName = "students2.xml";struct

2017-11-02 22:14:17 5442

原创 使用tinyxml创建及解析XML文件

创建并读取如下xml文件: MaZhe 18 MaZhe 18 MaZhe 18 代码实现:#include #include #include #include #include #include "tinyxml.h"using namespace std;static c

2017-10-25 23:26:48 2456

原创 Apache Http Server2.4的常用命令及安装步骤

软件: httpd-2.4.25-x86-vc11-r1.zip常用命令:1.httpd.exe -h  查看帮助2.httpd.exe -k install (-n ServiceName)  注册安装该服务,取名为ServiceName,如果不加-n则默认命名3.httpd.exe -k uninstall (-n ServiceName)  卸载删除该服务4.sc d

2017-10-24 23:01:25 1886

原创 C++重载类型

#include #include #include #include using namespace std;class Date {public: Date(int x, int y) : x_(x) , y_(y) { } void Print() { cout << x_ << " : " << y_ << endl; }pri

2017-10-20 23:34:40 1398

原创 C++可变长参数va_list的使用

#include #include #include #include #include templatestatic void Test(int va_list_len, ...) { va_list arguments; va_start(arguments, va_list_len); for (int i = 0; i < va_list_len; ++i) {

2017-10-20 23:33:41 1236

原创 Git基本命令

Git基本命令0.本地新建一个git仓库Git --bare init// 创建仓库1.配置全局名字邮箱git config --global user.name "zhe.ma"git config --blobal user.email "zhe.ma@outlook.com"2.创建文件夹mkdir TestGit3.进入目录cd TestGi

2017-10-20 23:31:07 247

原创 C++实现String类

头文件: my_string.h#ifndef MY_STRING_H_#define MY_STRING_H_#pragma once#include class MyString {public: MyString(); MyString(const char* c_str); MyString(size_t n, char ch); MyString(con

2017-10-20 23:27:19 378

原创 条款23:宁以non-member、non-friend替换member函数

// 条款23: 宁以non-member、non-friend替换member函数。// 1.宁可拿non-member non-friend函数替换member函数。这样做可以增加封装性、// 包裹弹性和机能扩充性。class WebBrowser23 {public: void ClearCache(); void ClearHistory(); void RemoveCoo

2017-10-19 22:09:40 557

原创 条款22:将成员变量声明为private

// 条款22: 将成员变量声明为private// 1. 切记将成员变量声明为private。这可赋予客户访问数据的一致性、可细微划分// 访问控制、允诺约束条件保证,并提供class坐着以充分的实现弹性。// 2.protected并不比public更具封装性。// 3.首先是语法的一致性,当客户访问成员变量时,不用考虑直接访问变量,还是通过函数来访问,// 在java中就有这样的

2017-10-19 22:09:13 326

原创 条款21:必须返回对象时,别妄想返回其reference

// 条款21: 必须返回对象时,别妄想返回其reference// 绝不要返回pointer或reference指向一个local stack对象,会返回reference指向// 一个heap-allocated对象,或返回pointer或reference指向一个local static对象// 而有可能同时需要多个这样的对象。条款4已经为“在单线程环境中合理返回reference/

2017-10-19 22:08:08 264

原创 条款20:宁以pass-by-reference-to-const替换pass-by-value

// 条款20: 宁以pass-by-reference-to-const替换pass-by-value// 1.尽量以pass-by-reference-to-const替换pass-by-value。前者通常比较高效,可避免切割问题。// 2.以上规则并不适用于内置类型,以及STL的迭代器和函数对象。对它们而言,pass-by-value往往比较恰当。#include #includ

2017-10-18 21:49:40 466

原创 条款19:设计class犹如设计type

// 条款19: 设计class犹如设计type// 1.新type的对象应该如何被创建和销毁?// 2.对象的初始化和对象的赋值应该有什么样的长别?// 3.新type的对象如果被passed by value,意味这什么?// 4.什么是新type的“合法值”?// 5.你的新type需要配合某个继承图系吗?// 6.你的新type需要什么样的转换?// 7.什么样的操作符和函

2017-10-18 21:48:44 238

原创 条款18:让接口容易被正确使用,不易被误用

// 条款18: 让接口容易被正确使用,不易被误用// 1.好的接口很容易被使用,不容易被误用。应该在所有的接口中努力达成这些性质。// 2.“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。// 3.“阻止误用”的办法包括建立新类型、限制类型上的操作,数据对象值,以及消除客户的资源管理责任。// 4.tr1::shared_ptr支持定制型删除器。这可防范DLL问题,可被

2017-10-18 21:47:13 284

原创 条款17:以独立语句将newed对象置入智能指针

// 条款17: 以独立的语句将newed对象置入智能指针。// 1.以独立语句将newed对象存储于智能指针内。如果不这样做,一旦异常被抛出,// 有可能导致难以察觉的资源泄漏。// 2.智慧名言:以对象管理资源。所以用智能指针管理Widget#include #include int GetPriority() { return 1;}class Widget17 {

2017-10-18 21:46:19 260

原创 条款16:成对使用new和delete时要采取相同形式

// 条款16: 成对使用new和delete时要采用相同的形式// 1.如果在new表达式中使用[],必须在相应的delete表达式中使用[]。如果// 在new表达式中不使用[],一定不要再相应的delete表达式中使用[]。// 2.new一个对象会有两个行为,第一个是内存被分配出来,第二是针对此内存会有一个// 或多个构造函数被调用。// 3.delete一个对象也会有两个行为,

2017-10-18 21:45:31 288

原创 条款15:在资源管理类中提供对原始资源的访问

// 条款15: 在资源管理类中提供对原始资源的访问// 这一条款的作用在于,前面的条款提到使用RAII管理类来管理对象,// 使得对象自动的释放内存,或者自动的加锁解锁等自动操作行为。// 但是原来的对象都被封装到管理类了,所以管理类需要提供对原始资源的访问渠道。// 1.APIs往往要求访问原始资源,所以每一个RAII class应该提供一个“取得其所管理之资源”的办法。// 2.

2017-10-18 21:44:22 262

原创 条款14:在资源管理类中小心copying行为

// 条款14: 在资源管理类中小心copy行为// 1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为。// 2.普遍而常见的RAII class copying行为是:抑制copying、施行引用计数法(reference counting)。// 不过其他行为也都可能被实现。#include #include cl

2017-10-18 21:43:23 313

原创 条款13:以对象管理资源

// 条款13: 以对象管理资源// 1.为防止资源泄漏,请使用RAII对象,它们在构造函数中获得资源并在析构函数中释放资源.// 2.两个常被使用的RAII classes 分别是tr1::shared_ptr和auto_ptr。前者通常是较佳选择,// 因为其copy行为比较直观。若选择auto_ptr,复制动作会使它(被复制物)指向null.// 3.TR1(Technical R

2017-10-18 21:42:34 263

空空如也

空空如也

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

TA关注的人

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