自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 资源 (7)
  • 收藏
  • 关注

原创 C++17值类型 (Value Categories)

什么是值类型值类型是对c++表达式的分类 (不是对值的分类,和变量也没有关系)值类型有哪些lvalue:= 能取地址的表达式变量名,方法名,数组名、数组名[下标]函数返回的左值引用*指针字符串常量xvalue := 有地址但是不能取的表达式(生命周期马上要结束)std::move返回的结果glvalue:= lvalue + xvalue = 有地址的表达式 (不管能不能取)prvalue:= 没有地址的表达式(用于初始化对象)常量(不包含字符串常量)&lval

2022-05-25 17:03:25 654

原创 游戏王抽卡模拟器(概率计算器)

给大家介绍一款功能强大但比较难用的抽卡模拟器,或者叫概率计算器,dl, md, 实卡都适用。使用方法1. 创建一个yaml文件,里面格式如下deck:配置牌组 size: 牌组卡牌总数 cards:定义卡片 卡牌名: 每张卡名字任意 count: 重复次数(默认一张),-1代表根据牌组卡牌总数自动计算(只能有一个-1), attribute: 一个列表,定义赋予该卡的属性(标签) 属性

2022-05-16 20:37:45 7516

转载 ubuntu16修改ip地址

How to set static IP Address in Ubuntu Server 16.04It is really important to know how to configure static IP Address on Ubuntu Server, Because it is almost impossible to run a server without a static IP Address.During the installation, Ubuntu Server by d

2022-04-07 14:30:06 898

原创 ubuntu手动设置ip地址和网关

ubuntu虚拟机以桥接模式连接主机假设网卡名字是ens33主机所在的子网是192.168.31.0/24网关在192.168.31.1(以上可以在主机上用ipconfig查询)如果我想手动给虚拟机分配一个ip地址(192.168.31.201),并设置默认网关则可以在Ubuntu上做如下设置sudo ifconfig ens33 192.168.31.201 netmask 255.255.255.0sudo route add default gw 192.168.31.1 ens33

2022-01-25 10:55:27 6621

原创 3.2.5 c/c++内存泄漏检测

方案1因为malloc是weak symbol,用户可以直接定义一个自己的版本覆盖glibc的采用__libc_malloc和__libc_free这两个别名调用原先的版本用__builtin_return_address得到调用mallloc的地址(注意这个函数只有参数为0时可以保证不seg fault)在每次malloc时以分配的地址为名生成一个文件free时再删除用addr2line -f -e memleak -a 0x4006f7得到具体的行号(编译时需要加-g)方案2使用宏

2021-12-25 09:23:25 94

原创 c/c++linux后台开发学习笔记 3.2.4 死锁

死锁存在的条件如果在一个系统中以下四个条件同时成立,那么就能引起死锁:互斥:至少有一个资源必须处于非共享模式,即一次只有一个进程可使用。如果另一进程申请该资源,那么申请进程应等到该资源释放为止。占有并等待:—个进程应占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有。非抢占:资源不能被抢占,即资源只能被进程在完成任务后自愿释放。循环等待:有一组等待进程 {P0,P1,…,Pn},P0 等待的资源为 P1 占有,P1 等待的资源为 P2 占有,……,Pn-1 等待的资源为 Pn 占有,P

2021-12-25 07:59:48 767

原创 c/c++ linux后台开发学习笔记 3.2.3 定时器

定时器应用心跳检测技能冷却倒计时定时任务超时机制概述服务器定时器两种实现:网络时间和事件时间在一个线程中处理epoll_wait时timeout设成最近一个定时器的时间网络时间和事件时间在不同线程中处理多开一个线程专门处理定时任务,没任务时调用sleep接口设计// 初始化定时器void init_timer();// 添加定时器Node* add_timer(int expire, callback cb);// 删除定时器bool del_time

2021-12-25 07:27:33 278

原创 c/c++ linux后台开发 3.2.2无锁队列

无锁队列使用场景至少每秒十几万读写才考虑使用,否则没有意义循环数组无锁队列实现这个队列结构简单,有大小上限,可以适用于多写多读的情况接口bool enqueue(const ELEM_T &a_data); // ⼊队列 bool dequeue(ELEM_T &a_data); // 出队列 bool try_dequeue(ELEM_T &a_data); // 尝试⼊队列成员ELEM_T m_thequeue[Q_SIZE]; volatile QUEUE

2021-12-19 13:21:06 1751

原创 c/c++linux后台开发3.2.1锁、原子操作CAS、try/catch、线程私有空间

头文件总之缺什么就包含一下吧#include <stdio.h>#include <string.h>#include <stdlib.h>#define __USE_GNU#include <sched.h>#include <unistd.h>#include <pthread.h>#include <setjmp.h>#include <sys/syscall.h>锁//适

2021-12-19 06:07:55 344

原创 c/c++linux 后台开发 3.1.4 mysql连接池的实现

为什么要连接池如果没次连接数据库都开一个新的连接,则需要没次都1)tcp三次握手,四次挥手。而且内核创建TCB也有资源消耗2)应用层用户验证、关闭连接连接池和长连接的区别长链接是每个线程一个连接,只是连接不断开连接池是线程需要访问了采取获取一个连接,用完之后归还,耦合度更低连接池设计代码很简单,空闲的连接一个链表,使用的连接可以放在一个树里(方便查询)mysql重连机制设置启用(当发现连接断开时的)自动重连my_bool reconnect = true;mysql_option

2021-12-19 05:19:59 202

原创 c/c++ linux后台开发学习笔记 3.1.3 异步请求池的原理与实现

同步请求while(...) { msg = prepare_msg(...); send(msg, ip); res = recv(...); process_res(res);}很明显,这样做效率低异步请求func callback(res) { process_res(res);}while(...) { msg = prepare_msg(...); send_async(msg, ip, callback);}这样就能发送异步请求,在请求返回时通过回调函数处理请

2021-12-16 10:12:40 1819

原创 c/c++linux后台开发学习笔记 3.1.2 内存池原理与实现

内存池的作用减少内存碎片,使服务器能长时间运行而不出现内存不够的情况内存池使用场景1)一个连接一个内存池,连接存在时内存池只分配内存,不释放内存。连接断开时把整个内存池释放。(如果我们手写内存池,只推荐这种场景)2)一个进程一个内存池,进程退出时才释放。这种情况不推荐手写,推荐使用谷歌的tcmalloc内存池原理内存分大块和小块,内存池先分配大块(node),再在大块中分配小块。内存池的一些状态本身也保存在大块之中。如果要分配的内存本来就是大块(large),则另行分配,全都存在一个链表中,内

2021-12-15 05:49:17 1330

原创 深入理解linux内核架构第二章 2.5-2.8

2.5 调度器的实现schedule函数是理解调度操作的起点(实际进行调度的函数)linux完全公平调度器没有时间片概念,只考虑等待时间,等待时间最长的优先运行所有的可运行进程都按时间在一个红黑树中排序,所谓时间即其等待时间。等待CPU时间最长的进程是最左侧的项,调度器下一次会考虑该进程。等待时间稍短的进程在该树上从左至右排序。调度器使用虚拟时钟估测每个进程在完美并发的CPU上应该运行多少时间(虚拟时间流逝的速度是实际时间的1/N, N是当前进程数)红黑树上的节点,使用fair_clock -

2021-12-14 07:32:50 509

原创 linux环境下动态链接库的安装和使用

以libevent为例wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gzmkdir libevent_installtar xzvf libevent-2.1.12-stable.tar.gz -C libevent_installcd进去./configuresudo makesudo make install库被安

2021-12-13 13:47:53 1489

原创 深入理解linux内核架构 第二章 2.1-2.4

2.1 进程优先级硬实时进程软实时进程普通进程抢占式多任务处理(preemptive multitasking):被抢占进程的运行时环境,即所有CPU寄存器的内容和页表,都会保存起来,因此其执行结果不会丢失。在该进程恢复执行时,其进程环境可以完全恢复。linux调度器:O(1)调度器,2.5开发的调度器,已不用完全公平调度器(CFS)2.6.23开始,可以首先在不同用户之间分配(或命名空间等),接下来在各个进程之间分配2.2 进程生命周期运行等待睡眠僵尸进程:说这些进程死

2021-12-12 12:45:09 514

原创 深入linux内核架构 学习笔记 第1章 简介和概述

1.1 内核的任务增强的计算机资源管理程序库1.2 实现策略微内核:其他功能在独立进程中实现,通过通信接口与中心内核通信。开销大,实用性低。宏内核:构建系统内核的传统方法。通过模块可以实现热拔插,兼顾效率和模块化。1.3 内核组成部分1.3.1 进程、进程切换、调度传统上,UNIX操作系统下运行的应用程序、服务器及其他程序都称为进程。每个进程都在CPU的虚拟内存中分配地址空间。各个进程的地址空间是完全独立的,因此进程并不会意识到彼此的存在内核要做两件事:进程切换,调度(为每个进

2021-12-09 07:56:16 187

原创 c/c++后台开发学习笔记 3.1.1线程池

线程池的使用场景减少线程创建于销毁的开销异步解耦线程池的组成任务任务队列线程执行队列(线程队列,即所有线程)定义//封装一个线程struct worker { pthread_t id; int terminate_flag; struct worker *prev; struct worker *next;};//相当于c++ std::packaged_taskstruct job { void (*job_func)(void *arg); void *fu

2021-12-09 04:27:02 82

原创 c/c++后台开发学习笔记 1.1.3 海量数据去重的Hash,BloomFilter,bitmap

背景判断单词拼写是否正确判断垃圾邮件url去重缓存穿透问题(访问不存在的元素会穿透redis缓存而始终访问mysql,造成mysql压力过大)需求海量数据中查询某个字符串是否存在平衡二叉树红黑树、AVL,b/b+树, 跳表时间复杂度是O(log2(n))10亿节点最多比较30次散列表(哈希表)根据key计算在表中存储的位置hash函数Hash(key)–>addr; 两个key被隐射到一个地址称为冲突负载因子:数据储存元素个数/数据长度 (越小冲突越小)冲突处理

2021-12-06 07:36:23 942

原创 c/c++后台开发学习笔记POSIX API与网络协议栈

网络编程常用接口int socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);int listen(int sockfd, int backlog);int accept(int sockfd, struct sockaddr *restrict addr, socklen_t *restrict addrlen);int con

2021-12-06 05:41:14 177

原创 c/c++linux后台开发学习笔记 2.2.2 reactor在网络组件中的应用

网络编程关注的问题连接的建立分为两种:服务端处理接收客户端的连接,服务端作为客户端连接第三方服务;int clientfd = accept(listenfd, addr, sz);int connectfd = socket(AF_INET, SOCK_STREAM, 0); connect(connectfd, (struct sockaddr *)&addr, sizeof(addr));连接的断开分为两种:主动断开和被动断开;// 主动关闭 close(fd); sh

2021-11-28 05:12:22 1273

原创 c/c++ 后台开发学习笔记 2.1.4 websocket协议与服务器实现

websocket 协议websocket是对tcp的简单封装,没有http那么长的文件头,提高了数据传输的效率。多用于服务器主动与客户端通信websocket有三个状态handshake --回应握手请求-> transmission --接受到FIN-> closedwebsocket包格式官方文档 0 1 2 3 0 1 2 3 4 5 6 7 8

2021-11-26 09:45:46 365

原创 c/c++后台开发学习笔记 2.1.3 http服务器实现

接上一节2.1.2http在ntyevent结构体中增加http相关变量,用于recv和send之间的数据传递struct ntyevent { int fd; int events; void *arg; int (*callback)(int fd, int events, void *arg); int status; char buffer[BUFFER_LENGTH]; int length; long last_active; // http param int

2021-11-26 09:21:08 346

原创 c/c++后台开发学习笔记 2.1.2 reactor原理与实现,实现百万级并发

reactor把epoll返回的fd读写事件进行封装,并为每种事件设置回调函数,把所有关注的fd以及对应的事件存储在一个数据结构里,与epoll内部的红黑树的节点形成一一对应的关系。epoll返回时使用data.ptr得到我们数据结构中对应的entry,再进行处理对fd的封装如下typedef int (*NCALLBACK)(int fd, int events, void *arg);struct ntyevent { int fd; int events;

2021-11-26 07:11:08 693

原创 c/c++后台开发学习笔记 2.1.1 网络io与select,poll,epoll

五种IO模型阻塞IO非阻塞IO在系统未准备好时立即返回需要轮询在从内核读取数据到用户空间(或写入内核)时任然会阻塞fcntl(fd, F_SETFL, O_NONBLOCK)多路复用IOselect,poll,epoll事件驱动异步IO告诉系统要IO,系统完成IO后通过信号告诉用户在数据IO的期间是非阻塞的信号驱动IO用sigaction注册SIGIO的回调函数在等待数据到达的期间是非阻塞的数据就绪时,系统用SIGIO通知用户,触发回调函数回调函数调用

2021-11-24 04:40:47 93

原创 c/c++linux后台开发学习笔记 1.1.2 b树/b+树

b/b+树的特点有序平衡(到任意叶子节点的距离相等)高度低,减少磁盘IO,B+用于数据库存储,B树只用于学术研究b树与b+树的区别b树在中间节点和叶子节点上都存储数据b+树只在叶子节点上存数据,并且将叶子节点连起来形成链表,方便范围查询b树定义一个t阶b树,每个节点(除了根节点)至少有t-1个key,最多有2t-1个可以,子节点的个数是key数+1根节点至少有一个keyb树插入总是从叶子插入,增高是因为叶子分裂def btree_insert(root, k): if

2021-11-23 05:32:28 230

原创 c/c++Linux后台开发课程笔记 - 1.1.1红黑树

红黑树的应用场景进程调度cfsepollnginx timerstd::map红黑树的性质节点是红色或者黑色根节点是黑色叶节点(NIL)是黑色红色节点的子节点只能是黑色从根节点到任意叶节点的路径的黑色节点数(黑高)相等红黑树定义typedef int KEY_TYPE;typedef struct _rbtree_node { unsigned char color; struct _rbtree_node *left; struct _rbtree_node *r

2021-11-22 09:25:17 71

原创 Java实现生产者-消费者模式

Java实现生产者-消费者模式1. 什么是生产者-消费者模式生产者-消费者模式主要三种对象:生产者、消费者、队列。有一些生产者,每个生产者会生产一些产品,将它们放到队列中。这些产品会被消费者从队列中取出使用。队列存在最大长度,当队列满时,生产者需要等待消费者消费后才能继续将生产的产品放入队列中,当队列为空时,消费者需要等待生产者将新的产品放入队列才能继续消费产品。2. 准备工作我们可以把每个生产者和消费者看成一个线程,并且假设队列实现了如下的接口队列接口public interface IBlo

2020-12-14 08:51:22 460

原创 使用MisakaPatcher制作Galgame外挂汉化补丁

简介这两天我看见一个galgame机翻工具 MisakaTranslator,它类似VNR,使用C#编写并且支持Hook和OCR(图像识别)两种方法提取文本。我在MisakaTranslator的基础上进行了一些改动,去除了所有的机翻的功能,转而支持了加载本地汉化补丁的功能,并把它重命名为MisakaPatcher。通过这个工具,即使我们在解包封包上遇到困难,理论上我们还是可以用外挂的方法(手工)汉化任意一款文字游戏。本项目Github主页主要功能Hook + OCR提取文本智能模糊匹配。匹配

2020-05-26 15:34:34 9412 3

原创 python写代码实现list的deepcopy

python有copy.copy()和copy.deepcopy()这两个函数分别提供浅拷贝和深拷贝的功能。今天突然想自己写代码实现list深拷贝的功能,于是写完了在这里分享一下(本文不涉及list之外的对象的深拷贝)。首先,给出一个套叠了好几层的list,比如 [1, [2, [3, 4], 5]]。这里如果只复制第一层的值肯定是不行的,那样对于较深的几层来说就变成浅拷贝了,于是就自然地想到递归:

2017-03-21 11:14:49 3171

原创 c语言结构体模拟c++对象的方法,并实现this指针

先说一下结构体模拟对象的基本思路。 1. 在结构体里定义好函数指针。 2. 在结构体外面定义好对象的方法。 3. 在结构体初始化的时候把这些方法的地址赋值给对应的函数指针。 4. 通过函数指针调用函数,并把结构体自身的地址传给函数。这个思路容易想到,但不是很完美。毕竟定义函数的时候必须多写一个参数指向结构体(即this指针必须通过参数显式传递),不方便。调用的时候也要多写一次对象的名字:ob

2016-12-16 14:17:44 6272 4

原创 c语言用宏模拟泛型容器

这两天用c数组的时候觉得每次数组传入函数的时候都要传长度,不方便,所以试了一下在一个结构体里面保存数组和长度然后一起传到函数里面。后来又觉得每换一种数据类型就要重新写一种struct,也麻烦,于是想到用宏来自动生成定义结构体的代码。先来看一下main.c://---------------main.c------------------#include<stdio.h>#include<stdlib

2015-12-22 12:52:58 1370

原创 科学计算器(源代码,c#)

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;name

2014-11-11 12:15:51 8496 1

原创 配平助手

本人初学C#,这两个礼拜写了一个配平化学

2014-04-23 00:18:44 1079 1

【化学方程式配平工具】配平助手v2022

配平助手用于配平化学方程式、离子方程式、计算反应物和生成物的式量、质量、摩尔数。 更详细的介绍和使用说明请参照软件的“使用说明”窗口。 v2022基于.Net4.8,兼容win10、win11

2022-11-10

protobuf 3.8.0 头文件与windows动态库

使用VS2022编译的protobuf 3.8.0,包含了c++中使用protobuf需要的头文件、以及libprotobuf.dll,libprotobuf.lib, protoc.exe 等。里面有x86和x64版,后缀带d的是debug版,不带d的是release版,一共四个版本。

2021-12-21

c++单机版五子棋

c++单机版五子棋,只写了控制台,实现了a-b剪枝以及电脑和玩家双方的VCF和VCT算法,可以准确判断棋盘上双方分别有多少连五,冲四,活四,活三,眠三,和活二。附有较详细的注释。有需要的可以参考下。(原创资源请勿转载)

2016-01-12

uno游戏 c语言代码

c语言写的uno游戏(不知道是什么的请自行百度)人机对战,可以自行选择玩家数量,支持2-8个玩家。经过测试基本没问题,不敢保证,仅供学习交流使用。

2015-01-16

c how to program 第四版 答案

《c how to prgram》第四版课后练习答案。好像这个网上不太好找,于是发上来共享。

2015-01-08

c语言井字棋

用c语言写的井字棋游戏,程序保证电脑不会输,附有详细的注释,不过是英文的。

2014-12-29

配平化学方程式 C# 源代码

这个工具可以配平元素数>=项数-2情况下的所有化学方程式(当然是要正确的化学方程式)、以及离子方程式。可以在配平前先设定某一项的系数,这个功能在配平元素数=项数-2时很有用。最长配平过H2 + Ca(CN)2 + NaAlF4 + FeSO4 + MgSiO3 + KI + H3PO4 + PbCrO4 + BrCl + CF2Cl2 + SO2 = PbBr2 + CrCl3 + MgCO3 + KAl(OH)4 + Fe(SCN)3 + PI3 + Na2SiO3 + CaF + H2O。。可见功能还是不错的。由于解方程组的算法是我自己设计的,所以可能有漏洞,不过目前用下来没发现问题

2014-04-22

C#分数的四则运算,源代码

以函数的形式完成了对分数的四则运算,并且附有一个打印出分数的函数

2014-03-31

空空如也

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

TA关注的人

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