
就你不知道
文章平均质量分 69
audi2
这个作者很懒,什么都没留下…
展开
-
加密那点事
{公钥,私钥}是全球唯一的一对数据。2)你查看【济南市CA证书】的签发机构是山东省CA,然后你下载【山东省CA证书】,拿里面的山东省CA公钥给【济南是CA证书】做签名解密验证,发现成功了。1) 【我的证书】的签发机构是济南市CA,你要下载【济南市CA证书】,里面有济南市CA公钥给你用。因为本质还是CA私钥加密,你无法否认CA的身份,你是信任CA说法的,所以你也承认了证书的真实性。3)恰好呢,【国家CA】原本就在你的电脑里,你一直用它相信它,你做了最后一次验证,用国家CA的公钥验证【山东省CA证书】的签名。原创 2023-11-02 15:23:53 · 128 阅读 · 0 评论 -
sequence point
顺序点,C语言冰山位于海面下的角落。副作用side effect,简单理解就是变量值被改变这个事实。i++这个表达式,副作用就是i被增加1。a = 10;这个表达式,副作用就是a被赋值成10。一个复杂的表达式,其求值过程是有迹可循的。例如:i++ + ++i 这个表达式,根据运算符的结合性或优先级关系,可以被人为是如下等效形式:(i++) + (++i).现在的问题来了,它的求值结果是什么?答案是:未定义行为(undefined)。未定义的意思是:无法预测结果。对比另一个叫做为未指定行为(unspeci原创 2022-04-12 17:12:18 · 767 阅读 · 0 评论 -
alias template,升级的typedef
定义类型别名时,推荐用using B = A ;这种方式。typedef void (*ANOTHER_TYPE)(int,int); //废弃的用法using ANOTHER_TYPE = void (*)(int,int); //鼓励使用的用法template <typename T>using ANOTHER_TYPE = void (*)(T,T); //因为typedef“不支持”参数,应使用alias template//可以理解它是模板化的typedef.原创 2022-03-14 17:34:10 · 650 阅读 · 0 评论 -
GIT 学习指导(6)
git成名的地方在于分布式版本管理。其中的关键技术是远程分支。开发者的本地作品,相对于另一个开发者就是一个远程分支(别人的远程分支也是自己的本地分支,都是相互相对的)。本地分支和远程分支并行演进。如下图所示:“远程"这个词可以扩展一下,在git里,本机的另外一个仓库位置,也可以认为是远程仓库。下面我们用本机的三个盘C: E: F:分别存储分布式仓库(模拟三个远程开发者协同工作的简单过程)。...原创 2022-01-09 00:52:40 · 400 阅读 · 0 评论 -
GIT 学习指导(5)
上文展示了merge命令,发现commit对象构成了一个类似有向图的数据结构。原因是一个commit拥有了两个父节点。这种结构不好看,我们还是喜欢单相链表那样的。git提供了另一种合并分支的命令,就是rebase。 假设我们来到如下状态,两个平行的开发分支master和slave都是基于V1开发。我们想合并这两个分支。git checkout slave #让我们设定当前分支是slavegit rebase master #把slave分支移植到master,或者说重...原创 2022-01-04 11:35:41 · 545 阅读 · 0 评论 -
GIT 学习指导(4)
分支就是一个单向的链表(节点是commit对象)。如下图例子: e---f <- slave / a---b---c---d <- master <- HEAD原创 2021-12-29 10:37:59 · 293 阅读 · 0 评论 -
GIT 学习指导(3)
上次是喝大了,写乱了一个文件a.c。如果这次喝大了写乱了多个文件怎么办(还提交了)?虽然git restore命令支持类似*.c的模式匹配一大批文件,但是我都喝大了,都不知道哪些文件搞乱了,也不愿意花时间一个个的比对了(因此也无法写出“文件模式*.c”),干脆我们就回退到上一个版本吧。这里和数据库的rollback不同,数据库在commit后,显然不能rollback了;GIT就可以回退版本。GIT使用一种叫做reset的命令回退版本。reset的意思是重新设置,重新设置什么?是重新设置的是分支的链表头指针原创 2021-12-24 15:36:20 · 527 阅读 · 0 评论 -
GIT 学习指导(2)
考虑如下场景,我喝大了,把a.c这个文件写的乌七八糟。第二天早上,酒醒了。如何恢复a.c到“好”的版本? 可以使用git restore命令。这里有两个概念,一个是“从哪里取数据”,一个是“放到哪里”。1. 从stage区取数据,放回到working区。 例如:git add a.c a.c文件照个快照(KEY=c5...)放到stage区 date >> a.c 修改a.c文件(working区文件被修改) ...原创 2021-12-22 17:36:48 · 721 阅读 · 0 评论 -
GIT 学习指导(1)
GIT是一种版本控制系统(Version Control System )。我们在用原始方式保留历史版本时,会想到建立文件的拷贝。GIT采用更巧妙的方式,把一个项目的所有文件保存到叫做Repository的文件数据库里。最终效果与人工拷贝一份文件夹备份是一样的,一个“版本”是项目某一时刻的全量快照。相对应的,某些其它竞争的VCS产品,可能采取增量记录法。既然GIT采取全量快照方式,代码文件每提交一次就咔嚓一份全量备份,对存储工作量岂不是海量的要求吗?GIT采取了精妙的数据结构,全量快照也不会浪费硬盘。.原创 2021-12-22 11:09:47 · 1209 阅读 · 0 评论 -
C++17 pmr
#include <iostream>#include <cstdlib>#include <iostream>#include <memory_resource>#include <vector>int main() { char buffer[32] = {}; std::fill_n(std::begin(buffer), std::size(buffer)-1, '_'); std::cout <.原创 2021-06-28 15:26:05 · 4465 阅读 · 0 评论 -
PID控制的一个简单模型
考虑一个桌面,安装一个弹簧振子系统。O点位置是原位,此时弹簧恰好松弛(弹力为0)。小球向左或右移动都会让弹簧产生变形(从而产生压力)。系统的控制目标是:小球位置与O点的距离偏差为0(小球保持在O点)。当一个外界干预(用手拉小球)让小球离开O点到A点。松开手后,这个自动控制系统开始纠正偏差,U(t) = Kp * Err(t) 这个是胡克定律。在PID控制中,这个是比例控制。偏差越大,"纠偏力"越大。很明显,只依靠胡克弹簧力,小球虽然能快速到达O点,但是因为惯性,小球会冲出去到B点。最终结果是原创 2021-02-04 17:21:23 · 1650 阅读 · 0 评论 -
整数在计算机中的表示
最初的方案,MSB是符号位,其它位是数据位。例如:0b1001表示-1, 0b0001表示1。此种编码方案,被称为sign and magnitude符号和量值法(中文专业词汇:原码) 。此方案有明显的缺点。首先要设计特殊电路关照符号位,其次是要设计“减法器”电路,增加了硬件成本。替代方案就是two's complement二的补数方案(中文专业词汇:补码)。还有一个one's complement一的补数方案(中文专业词汇:反码),也被废弃不用( 因为我们不是搞计算机考古专业的,不需...原创 2021-01-15 17:36:18 · 1111 阅读 · 0 评论 -
printf,iosteam,以及未来的std::format
格式化输出,一直是很平常但非常重要的功能。任何一个项目,必然会遇到这个技术点。printf是开创先河之物printf是古老的技术,但是速度不慢。它的核心思路是看到%符号,就是要被替换的内容。%后面是格式说明符,由一些预定义的字符组成。例如:%+#08*.4hd 如何理解它呢?格式说明符的通用语法为:%[flags][width][.precision][length]specifier 由4个可选群组[flags][width][.precision][length],以及一个必选项sp...原创 2021-01-05 11:34:24 · 578 阅读 · 0 评论 -
变长个数参数,在64位和32位系统的差异
C语言可变长度参数,有时候会失效。#include <stdarg.h>void print(int dummy, ...) { va_list vl; va_start(vl,dummy ); int a = va_arg(vl, int); int b = va_arg(vl, int); int c = va_arg(vl, int); va_end(vl);}int main(){ char a = 0x0A;原创 2021-01-01 11:55:06 · 340 阅读 · 0 评论 -
C语言的宏,必须了解的知识点
C语言里宏没有过时,在一些著名库或者底层源码中,它们的身影无处不在。虽然宏有很多陷阱(以至于有些编码规范中要求“尽量少用宏”),针对“宏”的缺陷,C++发明出template(模板),inline function(内联函数),constexpr(常量表达式)等等瑞士军刀工具(针对某种场景的专用工具)。在有些场合“宏”是无可替代的必需品。标识符拼接生成,或者字符串拼接自动生成领域,宏不可替代。因为模板只能繁殖一些类型,无法繁殖标识符或者字符串。在真正用好宏这个工具前,需要理解一下知识点。宏拒绝递归(S原创 2020-12-08 15:14:51 · 1149 阅读 · 1 评论 -
函数调用
Stack函数生存在栈空间。其生长方向与堆空间的生长方向相反。一次函数调用占用的一块连续空间,被称为栈帧stack frame,代表一个还未返回的函数调用。Call Stack 由 Stack Frames 组成void f(){ g(); }void g(){ h(); }void main(){ f(); }+---------------+ 高地址| mai...原创 2020-03-17 17:27:59 · 159 阅读 · 0 评论 -
抽象 封装 继承 多态
计算机是表示和处理信息的机器。为了解决现实世界的问题,需要把现实世界的问题域映射到计算机系统里。程序设计语言被用来辅助人们向计算机系统讲述现实世界问题域的工具。问题域中具有大量信息,我们需要用某种信条指导,对这些信息进行梳理。在面向对象的编程范式下,有四个处理信息的教条:抽象,封装,继承,多态。1)抽象考虑画家画了个老虎。写意的老虎与工笔的老虎区别在于对细节的把控。写意的老虎虽然没有纤毛毕现,...原创 2020-03-16 16:29:45 · 281 阅读 · 0 评论 -
C++ 20 Concept 初步认识
模板元编程具有“类型参数”,就是template<typename T>这句话中T, 就是类型形参。非常多的场景下,对T是有要求(requirement)的,或者说有限制(constraint)。例如:template<typename T>void foo( T a ){ (a & 0x0F);}int main(){ foo(3.1...原创 2020-02-26 15:25:14 · 1038 阅读 · 0 评论 -
std::type_index
typeid运算符,返回类型信息const std::type_info&。这种类型是不能赋值的。例如:const std::typeinfo& a = typeid(int); //初始化可以a = typeid(double); //再赋值就是错误为了解决这个问题,C++引入了std::type_index类。这个类可以理解为封装了一个指向typeinfo的指针...原创 2020-01-17 10:26:08 · 3493 阅读 · 0 评论 -
C++20 std::span
span就是一个连续对象存储的观察者。类似std::string_view是string的观察者。连续的存储,不一定是数组。例如:zero(char (&arr) [10]); //10个元素的数组, sizeof(arr)==10*sizeof(char)==10zero(char arr[]); //arr退化为指针, sizeof(arr)==sizeof(char*)...原创 2020-01-16 20:51:13 · 13522 阅读 · 0 评论 -
严格弱序再理解
严格弱序是二元谓词bool = f(x,y)的特性。如果对于f(x,y),总是有以下三个条件满足:1)非自反性f(x,x) == false2) 非对称性f(x,y) == !f(y,x)3) 传递性若f(x,y)==true , f(y,z)==true; 则f(x,z)==true我们称f(x,y)这个谓词是严格弱序的。我们考察C++的操作符 < 。这个操作符有...原创 2020-01-15 21:44:13 · 774 阅读 · 0 评论 -
临时变量的生存期,很好的例子
#include <iostream>#include <cstdlib>int& max(int a,int b){ return a>b?a:b;}int main(){ if(int& x=max(1,2); x==2){ std::cout << "x=" << x; ...原创 2020-01-11 10:17:44 · 160 阅读 · 0 评论 -
C++ 值语义
说一个类型具有值语义,当它具有一下特点:1)同类型的两个对象之间可拷贝 2)拷贝之后各自具有独立性。例如:int a=1; int b=2; b = a; 显然,int类型是值语义,因为我修改b=3不会影响a的值不可拷贝的对象,不满足条件1),当然就不是值语义,我们给它起个名字:实体语义(Entity Semantic)。例如:class CFile{ FILE a_opera...原创 2020-01-09 11:11:11 · 270 阅读 · 0 评论 -
C++17 处理变量集
#include <tuple>#include <iostream>#include <sstream>#include <string>#include <type_traits>template<typename... T>decltype(auto) values(T&&... args...原创 2020-01-03 09:55:54 · 141 阅读 · 0 评论 -
异或
整数型的数值可以看作由一些二进制构成的位的集合。例如:33 的二进制表示为 00100001,可以看作如下的一个集合 A = { 5:1 , 0:1 } 21 的二进制表示为 00010101,可以看作如下的一个集合 B = { 4:1 , 2:1 , 0:1 }“异或”是中文的翻译,在数学上有专业的名词表示:symmetric differenc原创 2016-05-13 16:31:34 · 599 阅读 · 0 评论 -
char, 到底是个什么怪物?
int main() { //0x80是有歧义的,可以表示128,也可以表示-128 // 正数 0x01 0x02... 0x7E 0x7F 0x80 0x81 // 1 2 126 127 128 129 // 零 0x00 // 负数(补码表示) 0xFF 0xF原创 2016-12-02 10:37:50 · 609 阅读 · 0 评论 -
std::string是字符串吗?
#include #include #include int main(){ std::string str = "abc"; str.push_back('\0'); //string本质上更像一个容器,可插入更多的\0 if (str != "abc") { //str的长度是4. string类的比较函数考虑了容器的长度。 assert(str.size() == 4原创 2017-02-01 23:49:15 · 582 阅读 · 0 评论 -
float窥探
根据http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html这个博客内容,写了一个float窥探程序。#include <bitset>#include <iostream>struct float_view { float_view(float a) {...原创 2019-01-25 17:11:45 · 142 阅读 · 0 评论 -
数字在计算机中的表示,补码方案
数字在计算机中的表示 数字是以二进制方式存储的,计算机的位(bit)只能存储0或1两种状态,对应的是有电,无电两种物理状态。考虑7这个数字,很容易的想到用二进制数字111表示。考虑有一个4位的存储器,则存储器的物理状态为: +---+---+---+---+ +------+------+------+------+| 0 | 1 | 1 | 1 | ==>...原创 2019-01-21 14:59:33 · 966 阅读 · 0 评论 -
POST方法
假设有个HTTP请求,浏览器获得如下HTTP响应:HTTP/1.1 200 OKDate: Tue, 12 Jul 2016 21:36:12 GMTContent-Length: 431Content-Type: text/html<!DOCTYPE html><html><head><meta charset="UTF-8">...原创 2019-04-22 10:07:35 · 1044 阅读 · 0 评论 -
学习笔记:从TCP的挥手角度看shutdown函数
TCP断开连接的过程被称为“挥手”。不管是服务端还是客户端,都可以主动发起关闭连接的过程(响应的另一端就是被动关闭连接)。正常的主动关闭连接的过程如下:A应用程序调用shutdown(socket,SD_SEND); 此函数是说:我要发送的数据已经全部提交给socket系统了,请关闭此socket连接。如果我脑子糊涂了,继续发send()函数,请打我脸。但是A应用程序还应当...原创 2019-04-18 15:19:08 · 451 阅读 · 0 评论 -
文本格式的检测
一个文本文件,特别是html文件,编码的字符集可能是utf8,unicode,gb2112等。一个文本编辑器或者浏览器总能猜对其编码方式,而不显示乱码。其背后的原理是什么?参考http://archives.miloush.net/michkap/archive/2007/04/22/2239345.htmlhttps://docs.microsoft.com/zh-cn/windows/...原创 2019-04-19 09:46:16 · 501 阅读 · 0 评论 -
就你不知道之:为什么是回车,而不是回马
回车是个计算机术语,原创 2014-10-16 21:35:16 · 675 阅读 · 0 评论