<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Forston的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Forston</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Forston]]></copyright><item><title><![CDATA[docker]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/131549359</link><guid>https://blog.youkuaiyun.com/Forston/article/details/131549359</guid><author>Forston</author><pubDate>Mon, 08 Jan 2024 21:50:06 +0800</pubDate><description><![CDATA[解决配置镜像加速后docker起不来：配置文件是一个json格式的文件，在json文件中对齐的时候不能存在空格，直接拷贝整个tee命令执行。]]></description><category></category></item><item><title><![CDATA[如何存储10亿的数据]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/123839425</link><guid>https://blog.youkuaiyun.com/Forston/article/details/123839425</guid><author>Forston</author><pubDate>Wed, 30 Mar 2022 11:07:24 +0800</pubDate><description><![CDATA[最近突然想到这么一个问题：

假如有&lt;10亿的数据，每个数据不重复，同时是无序，不连续的，如何使用最小的空间来存储来这么多数据，同时又能快速的确认哪个数据有没有。

直接存储10亿个数据
一个int的类型，可以最大可以表示：2147483647，这个数大于10亿，所以可以使用一个int（4个字节）来表示一个数。

在这种情况下，需要的空间是4*10^9，大约需要4G的空间。

如果想去查找一个数据在或不在，此时需要把这么多的数据加载到内存中，分别遍历，需要O(n)的时间复杂度。

利用数组的index]]></description><category></category></item><item><title><![CDATA[利用Openssl生成证书]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/123692135</link><guid>https://blog.youkuaiyun.com/Forston/article/details/123692135</guid><author>Forston</author><pubDate>Wed, 30 Mar 2022 09:56:14 +0800</pubDate><description><![CDATA[生成private key
openssl genrsa -des3 -out ca.key 2048



生成根证书
openssl req -new -x509 -sha384 -days 3650 -key ca.key -out ca.crt





生成二级证书的private key
openssl genrsa -out second.key 2048



生成二级证书的CSR
openssl req -new -key second.key -out second.csr

open.]]></description><category></category></item><item><title><![CDATA[HTTP元语]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/122480539</link><guid>https://blog.youkuaiyun.com/Forston/article/details/122480539</guid><author>Forston</author><pubDate>Thu, 13 Jan 2022 19:28:47 +0800</pubDate><description><![CDATA[Host:

请求的url的中域名或者IP，格式如下

Host:host[:port]

port是可选的，不过有些代理和gateway会禁止发送default port(http 80/https 443)

Content-MD5:

用来校验一次请求中的payload.

这个是对所有的payload进行MD5计算，得到一个128bit(16bytes)的二进制数，然后再对这个128bit的二进制数进行base64.

但是不同的server会返回不同长度的content-md5.

直接对二级制数]]></description><category></category></item><item><title><![CDATA[Vector代码实现（模板）]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/122202112</link><guid>https://blog.youkuaiyun.com/Forston/article/details/122202112</guid><author>Forston</author><pubDate>Tue, 28 Dec 2021 20:34:18 +0800</pubDate><description><![CDATA[简易的vector代码实现，目前实现了以下方法：

insert
	delete
	operate[]
C++源码


#pragma  once

#include &lt;iostream&gt;
const int DEFAULT_VECTOR_LEN = 4;
template &lt;typename T&gt;
class CSLVector
{

public:
	CSLVector();
	~CSLVector();

	bool Insert(T oData);

	bool Delete]]></description><category></category></item><item><title><![CDATA[基于链表实现的队列（模板）]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/122072653</link><guid>https://blog.youkuaiyun.com/Forston/article/details/122072653</guid><author>Forston</author><pubDate>Tue, 21 Dec 2021 20:36:07 +0800</pubDate><description><![CDATA[队列：先进先出





代码实现：


#pragma  once

#include &lt;iostream&gt;
template &lt;typename T&gt;
class CSLQueue
{
	typedef struct ST_NODE {
		T* pData;
		ST_NODE* pNext;
	}ST_SL_NODE;
public:
	CSLQueue();
	~CSLQueue();

	bool EnQueue(T* pData);

	//need to free .]]></description><category></category></item><item><title><![CDATA[字节序简述]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/122048092</link><guid>https://blog.youkuaiyun.com/Forston/article/details/122048092</guid><author>Forston</author><pubDate>Mon, 20 Dec 2021 19:38:18 +0800</pubDate><description><![CDATA[小端字节序：将低字节存在高地址



大端字节序：将高字节存在高地址



Windows默认时小端字节序，可以看一下VS debug时的内存截图。



如何判断机器的字节序


#include &lt;iostream&gt;
using namespace std;

bool checkLitteEndian()
{
	int a = 0x01;
	unsigned  char * pBuff = (unsigned char *)&amp;a;
	return pBuff[0] == 0x01.]]></description><category></category></item><item><title><![CDATA[＜＜＜常用网址＞＞＞]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121778041</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121778041</guid><author>Forston</author><pubDate>Tue, 07 Dec 2021 20:31:00 +0800</pubDate><description><![CDATA[阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 (aliyun.com)
]]></description><category></category></item><item><title><![CDATA[Linux 系统相关]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121766994</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121766994</guid><author>Forston</author><pubDate>Tue, 07 Dec 2021 13:27:03 +0800</pubDate><description><![CDATA[【代码】Centos7 系统相关。]]></description><category></category></item><item><title><![CDATA[shared_ptr&&weak_ptr]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121756572</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121756572</guid><author>Forston</author><pubDate>Mon, 06 Dec 2021 21:55:18 +0800</pubDate><description><![CDATA[shared_ptr

C++11中引入shared_ptr来简化内存的管理，当shared_ptr不再使用时，自动回收内存。

初始化

1）通过 make_shared赋值（推荐的初始化方式）

2）通过reset

3）通过赋值


int main(int argc, char* argv[])
{
	cout &lt;&lt; "**************implement an instance by make_shared **************************" &lt;&l]]></description><category></category></item><item><title><![CDATA[单实例（单例模式）]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121755412</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121755412</guid><author>Forston</author><pubDate>Mon, 06 Dec 2021 20:40:37 +0800</pubDate><description><![CDATA[特点：

1、只能被初始化一次（不能提供public的构造函数和析构函数）

2、不能被拷贝（不能提供拷贝构造函数、赋值函数）

示例：

Windows中进行socket开发时，要loadWs2_32.lib，同时还要调用WSAStartup和WSACleanup来初始化和释放资源，使用中只要初始化一次就可以，这时候就可以通过单实例来实现。

头文件


#pragma once

class CWinSockInit
{
public:
	static CWinSockInit&amp; GetIns.]]></description><category></category></item><item><title><![CDATA[函数调用时的栈操作]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121684727</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121684727</guid><author>Forston</author><pubDate>Mon, 06 Dec 2021 20:25:27 +0800</pubDate><description><![CDATA[通过分析函数调用的汇编，解析一下时如何进行函数调用

示例代码


#include &lt;iostream&gt;
using namespace std;

int add(int a, int b)
{
	int d = 0;
	d = a + b;

	return d;
}

int main(int argc, char* argv[])
{
	int a = 1;
	int b = 2;

	int c = 0;
	c = add(a, b);
	return 0;
}


main函数的主]]></description><category></category></item><item><title><![CDATA[Mac 查看签名]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121747606</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121747606</guid><author>Forston</author><pubDate>Mon, 06 Dec 2021 15:12:03 +0800</pubDate><description><![CDATA[codesign -dvvv /path/to/dylib
]]></description><category></category></item><item><title><![CDATA[Pip安装相关]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121694176</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121694176</guid><author>Forston</author><pubDate>Fri, 03 Dec 2021 11:05:02 +0800</pubDate><description><![CDATA[指定新源

pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple/



如果出现上面的错误：pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn
]]></description><category></category></item><item><title><![CDATA[ESP EBP]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121684300</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121684300</guid><author>Forston</author><pubDate>Thu, 02 Dec 2021 19:37:20 +0800</pubDate><description><![CDATA[ESP：栈指针寄存器(extended stack pointer)，指向系统栈最上面一个栈帧的栈顶
EBP：基址指针寄存器(extended base pointer)，指向系统栈最上面一个栈帧的底部。








]]></description><category></category></item><item><title><![CDATA[C++拷贝构造函数和赋值函数]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121665435</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121665435</guid><author>Forston</author><pubDate>Wed, 01 Dec 2021 21:43:47 +0800</pubDate><description><![CDATA[在定义一个类时，会默认生成拷贝构造函数和赋值

拷贝构造函数


CObject(const CObject&amp; oOBJ);

CObject::CObject(const CObject &amp;oOBJ)
{
	//process data
}

什么时候用拷贝构造函数：

初始化对象
	作为形参
	作为返回值
赋值函数


CObject&amp; operator=(const CObject&amp; oOBJ);

CObject&amp; CObject::operator=(con]]></description><category></category></item><item><title><![CDATA[引用和值传递]]></title><link>https://blog.youkuaiyun.com/Forston/article/details/121662754</link><guid>https://blog.youkuaiyun.com/Forston/article/details/121662754</guid><author>Forston</author><pubDate>Wed, 01 Dec 2021 20:51:59 +0800</pubDate><description><![CDATA[C++中在函数传入形参时，有两种方式，引用和值传递。

引用：传入的是参数的地址，任何对该参数的修改，都会对应到这个参数起作用。

值传递：传入的是参数的拷贝，如果参数是一个对象，这个时候会调用这个对象的拷贝构造函数。


...]]></description><category></category></item></channel></rss>