自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(116)
  • 资源 (1)
  • 收藏
  • 关注

原创 JS 序列化类

【代码】JS 序列化类。

2023-12-07 23:16:32 77

原创 阿里云MQTT: 子设备上线流程

还有一点补充一下,如果阿里平台手动操作加的父子拓扑,并且网关设备里存的子设备密钥有效,则网关里认为的子设备类型,与平台认为的子设备类型可能不一致,造成传输错误。有一个解决方案,就是网关下的子设备透传自己定义的数据,传到平台后,用平台的”消息解析“功能做物模型翻译。ProducyKey,就会触发注册,拓扑这一套流程,执行后,要记住最重要的一点,把子设备的${SubDeviceSecret}写到E2ROM存起来。父网关必须已具备上线能力。剩下的工作就由父网关设备内部的软件,自动让设备注册,建立拓扑,上线。

2023-11-27 04:47:07 653

原创 aliyun MQTT :纯透传配置

在阿里平台拷贝连接参数(客户ID,用户名,密码,域名等),配置自己的设备(或者模拟设备的MQTTX客户端)。请参考其它网上资料,具体过程略。

2023-11-24 15:20:03 179

原创 加密那点事

{公钥,私钥}是全球唯一的一对数据。2)你查看【济南市CA证书】的签发机构是山东省CA,然后你下载【山东省CA证书】,拿里面的山东省CA公钥给【济南是CA证书】做签名解密验证,发现成功了。1) 【我的证书】的签发机构是济南市CA,你要下载【济南市CA证书】,里面有济南市CA公钥给你用。因为本质还是CA私钥加密,你无法否认CA的身份,你是信任CA说法的,所以你也承认了证书的真实性。3)恰好呢,【国家CA】原本就在你的电脑里,你一直用它相信它,你做了最后一次验证,用国家CA的公钥验证【山东省CA证书】的签名。

2023-11-02 15:23:53 88

原创 sequence point

顺序点,C语言冰山位于海面下的角落。副作用side effect,简单理解就是变量值被改变这个事实。i++这个表达式,副作用就是i被增加1。a = 10;这个表达式,副作用就是a被赋值成10。一个复杂的表达式,其求值过程是有迹可循的。例如:i++ + ++i 这个表达式,根据运算符的结合性或优先级关系,可以被人为是如下等效形式:(i++) + (++i).现在的问题来了,它的求值结果是什么?答案是:未定义行为(undefined)。未定义的意思是:无法预测结果。对比另一个叫做为未指定行为(unspeci

2022-04-12 17:12:18 715

原创 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 618

原创 学习笔记:std::quoted

CVS格式数据解析例子,使用std::quoted这个东西。#include <iostream>#include <iomanip>#include <sstream>void construct_cvs_formated_stream( std::stringstream& ss){ std::string row1 = R"NOTPRINTFLAG("12", "Chaoyang Qu, Jianguomen Dajie")NOT.

2022-03-08 17:42:48 1369

原创 GIT 学习指导(6)

git成名的地方在于分布式版本管理。其中的关键技术是远程分支。开发者的本地作品,相对于另一个开发者就是一个远程分支(别人的远程分支也是自己的本地分支,都是相互相对的)。本地分支和远程分支并行演进。如下图所示:“远程"这个词可以扩展一下,在git里,本机的另外一个仓库位置,也可以认为是远程仓库。下面我们用本机的三个盘C: E: F:分别存储分布式仓库(模拟三个远程开发者协同工作的简单过程)。...

2022-01-09 00:52:40 368

原创 GIT 学习指导(5)

上文展示了merge命令,发现commit对象构成了一个类似有向图的数据结构。原因是一个commit拥有了两个父节点。这种结构不好看,我们还是喜欢单相链表那样的。git提供了另一种合并分支的命令,就是rebase。 假设我们来到如下状态,两个平行的开发分支master和slave都是基于V1开发。我们想合并这两个分支。git checkout slave #让我们设定当前分支是slavegit rebase master #把slave分支移植到master,或者说重...

2022-01-04 11:35:41 440

原创 GIT 学习指导(4)

分支就是一个单向的链表(节点是commit对象)。如下图例子: e---f <- slave / a---b---c---d <- master <- HEAD

2021-12-29 10:37:59 256

原创 GIT 学习指导(3)

上次是喝大了,写乱了一个文件a.c。如果这次喝大了写乱了多个文件怎么办(还提交了)?虽然git restore命令支持类似*.c的模式匹配一大批文件,但是我都喝大了,都不知道哪些文件搞乱了,也不愿意花时间一个个的比对了(因此也无法写出“文件模式*.c”),干脆我们就回退到上一个版本吧。这里和数据库的rollback不同,数据库在commit后,显然不能rollback了;GIT就可以回退版本。GIT使用一种叫做reset的命令回退版本。reset的意思是重新设置,重新设置什么?是重新设置的是分支的链表头指针

2021-12-24 15:36:20 501

原创 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 628

原创 GIT 学习指导(1)

GIT是一种版本控制系统(Version Control System )。我们在用原始方式保留历史版本时,会想到建立文件的拷贝。GIT采用更巧妙的方式,把一个项目的所有文件保存到叫做Repository的文件数据库里。最终效果与人工拷贝一份文件夹备份是一样的,一个“版本”是项目某一时刻的全量快照。相对应的,某些其它竞争的VCS产品,可能采取增量记录法。既然GIT采取全量快照方式,代码文件每提交一次就咔嚓一份全量备份,对存储工作量岂不是海量的要求吗?GIT采取了精妙的数据结构,全量快照也不会浪费硬盘。.

2021-12-22 11:09:47 1175

原创 BOOST.JSON库学习笔记(三)

#include <iostream>#include <boost/json.hpp>using namespace boost::json;int main(int argc, const char * argv[]) { array arr( { "Hello", 42, true }); string str = "World"; value var = false; object subobj{ {"subkey1",3.1.

2021-06-30 17:40:23 352 1

原创 BOOST.JSON库的学习笔记(二)

#include <boost/json.hpp>using namespace boost::json;int main(int argc, const char * argv[]) { unsigned char buff[512]; storage_ptr sp = make_shared_resource<static_resource>(buff); array arr( { "Hello", 42, true }, sp); s.

2021-06-30 15:58:45 202

原创 BOOST.JSON库的学习笔记(一)

#include <boost/json.hpp>using namespace boost::json;int main(int argc, const char * argv[]) { value jv = 3.12; std::cout << to_string( jv.kind()); if (auto p = jv.if_double()) { double d = *p; std::cout &lt.

2021-06-29 16:48:16 420

原创 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 3844

原创 asio::streambuf的使用

这个神器设计的非常巧妙,它有两个流缓冲区。一个input序列,一个output序列。比较难理解的是,在streambuf内部看来,它需要读取output序列,写入input序列,这一点不符合直觉。

2021-06-01 11:39:18 1732

原创 PID控制的一个简单模型

考虑一个桌面,安装一个弹簧振子系统。O点位置是原位,此时弹簧恰好松弛(弹力为0)。小球向左或右移动都会让弹簧产生变形(从而产生压力)。系统的控制目标是:小球位置与O点的距离偏差为0(小球保持在O点)。当一个外界干预(用手拉小球)让小球离开O点到A点。松开手后,这个自动控制系统开始纠正偏差,U(t) = Kp * Err(t) 这个是胡克定律。在PID控制中,这个是比例控制。偏差越大,"纠偏力"越大。很明显,只依靠胡克弹簧力,小球虽然能快速到达O点,但是因为惯性,小球会冲出去到B点。最终结果是

2021-02-04 17:21:23 1492

原创 整数在计算机中的表示

最初的方案,MSB是符号位,其它位是数据位。例如:0b1001表示-1, 0b0001表示1。此种编码方案,被称为sign and magnitude符号和量值法(中文专业词汇:原码) 。此方案有明显的缺点。首先要设计特殊电路关照符号位,其次是要设计“减法器”电路,增加了硬件成本。替代方案就是two's complement二的补数方案(中文专业词汇:补码)。还有一个one's complement一的补数方案(中文专业词汇:反码),也被废弃不用( 因为我们不是搞计算机考古专业的,不需...

2021-01-15 17:36:18 944

原创 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 502

原创 变长个数参数,在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 278

原创 C语言的宏,必须了解的知识点

C语言里宏没有过时,在一些著名库或者底层源码中,它们的身影无处不在。虽然宏有很多陷阱(以至于有些编码规范中要求“尽量少用宏”),针对“宏”的缺陷,C++发明出template(模板),inline function(内联函数),constexpr(常量表达式)等等瑞士军刀工具(针对某种场景的专用工具)。在有些场合“宏”是无可替代的必需品。标识符拼接生成,或者字符串拼接自动生成领域,宏不可替代。因为模板只能繁殖一些类型,无法繁殖标识符或者字符串。在真正用好宏这个工具前,需要理解一下知识点。宏拒绝递归(S

2020-12-08 15:14:51 961 1

原创 学习笔记:MQTT环境搭建

下载ActiveMQ:解压缩文件,例如:E:/apache-activemq-5.16.0 。ActiveMQ依赖JAVA环境,需要JAVA_HOME等环境变量的正确设置。启动系统的命令为:cdE:/apache-activemq-5.16.0bin/activemq start启动成功后,出现如下黑窗口下载MQTTBOX,这是MQTT的客户端。https://s3-us-west-2.amazonaws.com/workswithweb/mqttbox/latest/wind..

2020-11-18 15:20:54 497

原创 学习笔记:BOOST日期时间库

明确有三个时间有关的概念。1)时间点。类似直线上的一个点的坐标。2)时间间隔。类似在直线上一个与位置无关的具有一定长度的线段。3)时间区间。两个时间点之间的区间(与时间点有关)与其它库不同的是,日期有独立的模块date类。其它的例如struct tm是年月日时分秒放到一个结构体的。时间具有不同分辨率的需求。比如我要计算这个月的天数,以及下个月的第二个星期五是几号,只需要date(日)级分辨率。计算3个小时零4分后时刻值,或者20毫秒之后时刻值,就需要秒级(second)和更高分辨率的类。对于秒级(和

2020-11-16 17:28:38 434

原创 boost corouting2

协程的一个用途是生成器。生成器是一种通用的设计模式,能简洁清晰的表达数据生产和消费关系。#include <iostream>#include <boost/coroutine2/coroutine.hpp>using namespace std; typedef boost::coroutines2::coroutine<int> coro_t;...

2020-03-18 17:37:47 183

原创 函数调用

Stack函数生存在栈空间。其生长方向与堆空间的生长方向相反。一次函数调用占用的一块连续空间,被称为栈帧stack frame,代表一个还未返回的函数调用。Call Stack 由 Stack Frames 组成void f(){ g(); }void g(){ h(); }void main(){ f(); }+---------------+ 高地址| mai...

2020-03-17 17:27:59 139

原创 抽象 封装 继承 多态

计算机是表示和处理信息的机器。为了解决现实世界的问题,需要把现实世界的问题域映射到计算机系统里。程序设计语言被用来辅助人们向计算机系统讲述现实世界问题域的工具。问题域中具有大量信息,我们需要用某种信条指导,对这些信息进行梳理。在面向对象的编程范式下,有四个处理信息的教条:抽象,封装,继承,多态。1)抽象考虑画家画了个老虎。写意的老虎与工笔的老虎区别在于对细节的把控。写意的老虎虽然没有纤毛毕现,...

2020-03-16 16:29:45 246

原创 C++ 20 Range

简单理解为:封装了begin(),end()这一对迭代器的对象。range的抽象级别更高,具有更多好处。1)避免繁琐std::for_each( begin(v), end(v), //迭代器,书写繁琐,易错 []( auto i ){ std::cout << i ; } ) ;std::ranges::for_each( v, //range写法 ...

2020-03-08 15:03:51 2690

原创 C++ 流的拷贝

遇到一个优点意思的代码段:#include <iostream>#include <fstream>std::ofstream make_stream(){ std::ofstream out; std::cout.fill ('*'); std::cout.width (20); out.copyfmt(std::cout...

2020-03-04 16:09:18 1443

原创 C++ 20 Concept 语法

requires expression

2020-02-28 14:40:33 5192 2

原创 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 968

原创 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 2872

原创 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 12676

原创 严格弱序再理解

严格弱序是二元谓词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 710

原创 一些map优化的办法

std::map用于key-value式的查询,增加map的效率的办法:1. 使用emplace代替insert. 直接构建key-value对象map.emplace(std::piecewise_construct, std::forward_as_tuple(i,"x"), std::forward_as_tuple(i));2. ...

2020-01-15 16:54:45 1529

原创 临时变量的生存期,很好的例子

#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 132

原创 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 226

原创 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 114

原创 C++ Fold表达式

#include <iostream>using namespace std; class Operant{public: int i_; Operant(int i){ cout << "Create [Operant "<< i << "]"<< endl; i_ = i; ...

2019-12-30 11:33:13 761

Java EE 6 tutorial

Java EE 6 tutorial.Sun官方的教程。JaveEE6可能会火,前途未知。

2010-02-23

空空如也

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

TA关注的人

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