- 博客(90)
- 收藏
- 关注
原创 docker中挂桶什么意思
挂桶”是指在 Docker 容器中挂载一个存储桶(通常指的是云存储桶,如 AWS S3、阿里云 OSS 等)或本地存储目录的操作。通过挂载,Docker 容器可以直接访问存储桶中的文件,就像访问本地文件系统一样。
2024-08-15 16:31:20
495
原创 如何获取OpenAI API Key
注册并登录账号(略) 打开网址:https://platform.openai.com/docs/overview 点击下图(屏幕右上角)的api reference: 点击API KEYS: 然后点击create new secret key,输入密钥名字即可:
2024-08-01 09:31:56
677
原创 .\venv\Scripts\activate : 无法加载文件 E:\,因为在此系统上禁止运行脚本。
这意味着无论是本地创建的还是从网络获取的脚本,都必须具有有效的数字签名才能执行。这种策略提供了很高的安全性,但可能会对一些自编写的未签名脚本的运行造成限制。从网络(如 Internet)下载的脚本必须由受信任的发布者进行数字签名,才能运行。在保证一定安全性的同时,给本地开发和使用脚本提供了一定的灵活性。:不允许运行任何脚本,包括本地创建的脚本。Windows PowerShell 的执行策略用于控制脚本的运行权限和安全性。:允许运行所有脚本,不进行任何限制,但可能存在较高的安全风险。
2024-08-01 08:56:05
533
1
原创 从零开始C++服务器开发
代码编辑:visual studio code操作系统:Windows10专业版的;Ubuntu20.04LTS(使用VM 创建虚拟机);
2024-05-24 13:18:12
350
原创 strncpy_s复制字符串到数组中
我试图将字符串"helloworld"复制到结构体pd的arr中, arr是一个64大小的字符数组,然而测试时发现只复制了hell。
2024-05-12 20:10:52
404
原创 MT4目录结构
该文件夹包含用户编写的EA程序代码文件。可以自动将用户编写的交易策略应用到行情中,其中后缀名为mq4的是源代码,后缀名为ex4的是可执行文件。EA:Expert Advisors,译为专家顾问,通俗的来说,就是用机器代替人监听行情,并针对行情应用交易策略,自动执行做多、做空的操作。由程序员借助一门计算机编程语言(mq4),编写交易指令,预设好某个情境下的操作,实现机器自动进行交易。
2024-05-11 21:33:12
1087
原创 C++写数据到文件中报错:Error: Unable to open log file.
再次测试控制台打印:Fatal I/O error occurred.经过查询是致命的输入/输出错误,搜索后发现是路径不存在、文件被其他程序占用、程序没有足够权限读写。检查后发现E盘下没有Log文件夹,找到问题原因。std::ios::app 会将数据追加到文件上,每次并不清空文件的内容。若文件不存在则创建文件,但是并不会创建路径。2. 修改代码,判断路径是否存在,如果不存在则创建。1. 最开始以为是权限问题,路径在E:\\Log盘,检查后并没有问题;当我测试这个函数时,一直报错无法打开文件。
2024-05-11 15:39:54
269
原创 sqlite3报错:database is locked
那么此时回看之前的问题,由于sqlite expert会时不时自动刷新数据,因此,当sqlite expert没有对数据进行刷新时,数据可以正常的插入数据库文件中,但是当sqlite expert刷新数据时,就会导致database is locked,因为只要有一个连接持有共享锁,都无法写入数据。这也是为什么偶尔该错误的原因。
2024-05-11 09:29:07
2559
原创 C++协程库封装
协程可以看作轻量级线程,相比于线程,协程的调度完全由用户控制。可以理解为程序员可以暂停执行或恢复执行的函数。将每个线程看作是一个子程序,或者说一个函数,首先main函数启动后产生了main线程,在main函数中调用了function函数后会产生另一个线程执行function函数。在这个过程中,可以发现线程的执行并不受程序员的控制,从入口进入到执行完毕给出返回值,程序员无法控制。而协程则允许程序员在其执行到某个步骤时停止执行,去执行别的任务,当某个条件满足后继续执行被暂停的任务。
2024-04-30 15:45:38
868
3
原创 C++线程类的封装
操作系统:ubuntu20.04LTS使用头文件:pthread.h在之前的文章中已经实现了C++不可复制基类和线程同步类的封装,本文章内容实现对线程的封装。
2024-04-24 21:51:47
898
2
原创 以太坊源码笔记-blockchain
log.Info("加载最新的本地区块", "高度", headBlock.Number(), "哈希", headBlock.Hash(), "总难度", blockTd, "时间", common.PrettyAge(time.Unix(int64(headBlock.Time()), 0))) // 输出日志,加载最新的本地区块。log.Info("链处于无状态,请等待状态同步", "number", newHeadBlock.Number, "hash", newHeadBlock.Hash())
2024-04-23 13:41:59
702
原创 锁的封装和RAII实现
RAII(Resource Acquisition Is Initialization)是一种 C++ 中的编程技术,它利用了对象的生命周期和析构函数的特性来管理资源的获取和释放。在 RAII 中,资源的获取和释放都与对象的生命周期相关联,资源在对象构造时被获取,而在对象析构时被释放,从而确保资源的正确管理,避免资源泄漏和内存泄漏等问题。RAII 的基本原则是:资源的获取应该在对象的构造函数中进行,而资源的释放应该在对象的析构函数中进行。下面是对读写锁的封装,和上面类似,只是调用的加锁函数有所不同。
2024-04-22 16:58:45
827
原创 C++实现不可复制基类
例如对象B是用对象A来初始化的,对象B有一个new出来的数组,在明确知道之后不需要使用到对象A后,可以直接将A对象中new出来的数组的所有权转移给B,避免了B对象调用new操作符。有时候,我们可能希望某些类在设计上是不可复制的,因为复制行为可能导致不可预测的行为。此外,如果类对象包含指向动态分配内存的指针,复制可能导致资源管理问题,例如内存泄漏或二次释放。上面的右值引用中取消了const的使用,这是由于右值引用是为了转移资源的所有权,而const限制了对象的可修改性,因此无法使用const关键字。
2024-04-22 10:47:19
222
原创 Linux操作系统配置git的ssh
git config --global user.name "用户名"git config --global user.email "邮箱"ssh-keygen -t rsa -b 4096 -C "邮箱"再次执行添加到ssh代理指令,输出added后面加邮箱地址表示成功。执行上面的命令后按三次Enter键,选择默认即可。系统:Ubuntu20.04LTS。# 添加全局git用户和邮箱。# 查看用户名和邮箱是否有误。
2024-04-18 17:05:04
1448
原创 以太坊源码阅读01
在工作量证明中,用户打包交易后生成Merck树,然后将其根哈希值保存到区块头中,对整个区块头取哈希的到一个值,这个值需要满足足够小的条件,由于哈希正向容易反向难的特点,矿工很难反向计算得到Nonce值,因此会一个一个数字去尝试,由于不同的矿工打包的交易可能不一样,因此矿工需要找到的Nonce值也可能不一样。我之前主要使用C++语言,可以看出来上面的代码和C++语言还是有一定的差异的,C++结构体中先声明变量的类型,然后给出变量的名称,而上面的代码则是反过来了,先给出了成员变量的名称,然后给出了类型。
2024-04-12 13:42:42
924
原创 布隆过滤器
布隆过滤器(Bloom Filter)是一种用于快速检索某个元素是否存在于集合中的概率型数据结构。它基于一系列哈希函数和一个比特数组实现。
2024-04-12 13:25:29
1131
原创 前台向后台传递参数时,特殊字符丢失(+,-)
前端使用encodeURIComponent将特殊字符编码后传递到后端,后端接收到数据后利用decodeURIComponent进行解码,问题解决。网页前台向nodejs中express后台传递参数,传递的参数为C++,传递到后台后变成C。通过查询资料,发现+被解释为空格(%20)。
2024-04-10 12:49:23
700
原创 区块链面试题总结
区块链是不间断的经济交易数字分类账,可以进行编程,以记录不止金融交易,还可以记录其他有价值的东西,简单来说,区块链是一个不可变记录的分布式数据库,该数据库由计算机集群来管理,基于共识来运行,不属于任何单个实体。区块链存储为数据库或平面文件。区块链中,一个区块是数据的集合,通常包括一组交易记录,时间戳以及前一个区块相关的引用(哈希值),区块链是由一个个连接在一起的区块组成的,每个区块都包含了之前区块的哈希值,形成一个不断增长的链条。
2024-04-02 18:45:53
2356
1
原创 结构体和联合体嵌套访问
问题到这里就解决了,后来想到vscode写代码的时候,每次提示都只显示一个type,别的显示不出来,这不就是在告诉我,你TM这个结构体里面根本没有这个成员变量!将代码修改成如下,加入了m_data和m_union,意味着默认有这两个实例,有了实例之后一切的访问都可以了(struct和union默认访问权限是public)。在JSON项目中,使用了联合体和结构体之间的嵌套,但是在访问内部的联合体和结构体的时候出现了问题,这篇文章作为记录,也希望能帮助遇到相同问题的好伙伴。
2023-10-30 23:01:35
1036
原创 code编译时报错undefined reference to ...
我是在Windows10平台使用vscode编译代码时出现的这个问题,一共有三个文件,json.h、json.cpp,example.cpp。json.h负责函数的声明,json.cpp负责函数的实现,example.cpp负责测试代码的正确性。但是在编译时报错undefined reference to...。
2023-10-28 11:08:29
2347
1
原创 C++实现线程池
进程是一个独立的执行单位,每个进程都有自己的独立内存空间,包括代码、数据、堆栈等。进程之间彼此独立,不共享内存,通常通过进程间通信来交换数据。
2023-10-26 23:30:48
2888
1
原创 C++使用regex报错“expected parameter declarator“
在使用regex正则表达式解析HTTP请求行时报错:“expected parameter declarator“。这句话解释就是代码具有二义性,编译器不知道这是一个成员函数还是一个成员变量。解决的方法就是消除二义性。2、看作函数:一个返回值为regex类型的名为request_line_regex的成员函数;1、看作变量:一个regex类型的名为request_line_regex的成员变量;上面的代码明显属于函数的模型,编译器知道这是一个成员变量。1、使用C11提供的用{}初始化。这样也可以解决问题。
2023-10-20 09:45:38
551
原创 C11线程池详解
std::function是一个函数包装器,该函数包装器模板能包装任何类型的可调用实体,如普通函数,函数对象,lamda表达式等。用了while(true)循环不断询问任务队列有没有任务,由于初始状态没有任务,因此会被阻塞在wait()函数,直到有任务,如果还在运行并且任务队列不为空,那么就将空闲的线程数目-1,将队列的头部线程取出来交给task来执行,并将这个任务从任务队列中删除。这段代码定义:如果当前有空闲的线程,并且当前线程数量大于初始设置的数量,那么就执行return返回,终止这个进程的执行。
2023-10-04 20:30:29
335
原创 TinyWebServer学习笔记-threadpool
从任务队列头部取出任务,释放锁,如果取出的任务对象是有效指针,如果是Proactor并发模型代表有数据要读,调用函数读取客户端数据,标记请求已被处理,获得数据库连接执行数据库操作。采用Proactor并发模型,主线程负责监听文件描述符,接受socket连接,若当前监听的socket发生了读写事件,就把任务插入到请求队列中,工作线程从请求队列中取出任务,完成读写数据的处理。如果读取失败,表示需要进行定时器的处理,如果m_stat=1,那么表示要写入数据,写入成功标记请求已经被处理,否则设置定时器。
2023-10-03 20:48:33
301
原创 TinyWebServer学习笔记-log
在服务器运行期间,可能会发生各种问题和故障,例如程序崩溃、性能下降、异常请求等。日志记录了服务器的运行状态、错误信息和各种操作,这些日志可以用来快速定位和排查问题,帮助开发人员更容易地找到问题的根本原因,从而更快地修复bug和提高服务器稳定性。通过日志系统可以记录服务器的性能数据,包括请求处理时间、吞吐量、内存使用情况、CPU利用率等等。这些数据有助于监控服务器的性能,发现潜在的性能瓶颈,以便进行性能优化。日志可以记录系统的安全事件,如登录失败尝试、异常访问等。
2023-10-03 19:44:39
290
原创 TinyWebServer学习笔记-MySQL数据库连接
我们的网站允许用户注册,在没有池的情况下,假设只有一个人,那么流程就是,用户点击注册,通过socket将用户的账号和密码发送到服务器,然后就需要创建MySQL数据库连接,然后插入数据,插入完毕后销毁该连接;然而当用户很多时,这个设计就会花费大量的时间在数据库连接的创建和释放上。为了避免这种情况,引入池的概念,在程序初始化的时候,集中建立多个数据库连接,并集中管理,供程序使用,更见安全和可靠。池是一组资源的机会,这组资源在服务器启动之初就被完全创建好并初始化,池是资源的容器,实现对资源的复用。
2023-10-03 16:32:42
266
原创 TinyWebServer学习笔记-互斥锁、信号量、条件变量
网站不可能是单线程的,否则网站的性能和响应都会收到严重的影响。因此,这个项目一定是运行在多线程条件下的。而在多线程条件下,对共享资源的互斥访问就极其重要。
2023-10-03 15:55:56
321
原创 TinyWebServer学习笔记-Config
对于边缘模式,socket上每新来一次数据就会触发一次,如果上一次触发后,没有将socket上的数据读完,也不会再次触发,除非再来新的数据。对于socket写事件,如果socket的TCP窗口一致不饱和,会一直出发EPOLLOUT事件,对于边缘模式,只会触发一次,除非TCP窗口从不饱和变成饱和再一次变成不饱和才会触发。在LT模式下,不需要写事件一定要移除,避免不必要的触发,浪费CPU资源,ET模式下,写事件触发后,如果还要下一次的写事件触发来驱动任务,需要继续注册检测可写事件。argc:命令行参数的数量;
2023-10-03 15:21:31
182
原创 TinyWebServer学习笔记-让程序跑起来
之后我们在浏览器输入ip:9006即可访问。目标:通过这个HTTP项目熟悉网络编程。现在我们就已经将程序跑起来了。系统:Ubuntu20.04。
2023-10-03 13:11:42
416
原创 剑指 Offer 14- I. 剪绳子
给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为。请问可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
2023-09-21 09:52:48
103
原创 剑指 Offer 13. 机器人的运动范围
地上有一个m行n列的方格,从坐标[0,0]到坐标[m-1,n-1]。一个机器人从坐标[0, 0]的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?
2023-09-20 10:05:42
502
原创 代码命名规范(C++)
2.结构体内部成员按照普通变量命名,小写字母+下划线。2.类内成员小写字母+下划线,此外结尾加下划线。1.结构体定义每个单词首字母大写,不使用下划线。1.枚举定义每个单词首字母大写,不使用下划线。2.枚举内部成员采用大写字母+下划线的形式。1.类名每个单词首字母大写,不使用下划线。1.以`k`开头,每个单词首字母大写,不使用下划线。1.小写字母+下划线。1.每个单词首字母大写,不使用下划线。1.大写字母+下划线。
2023-09-19 21:18:41
396
原创 剑指 Offer 12. 矩阵中的路径
给定一个m x n二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
2023-09-19 18:53:42
267
原创 剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在元素值的数组numbers,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的。例如,数组为的一次旋转,该数组的最小值为 1。注意,数组旋转一次 的结果为数组。
2023-09-16 10:57:45
203
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人