3g网站制作/四川seo多少钱
原文
用LibTooling
和LibASTMatchers
构建工具
这里展示如何基于Clang
的LibTooling
构建有用的源到源
翻译工具.基础
步骤0
:取Clang
因为Clang
是LLVM
项目的一部分,因此你需要先下载LLVM
的源码.Clang
和LLVM
都在同一个git
仓库中,在不同的目录下.更多见入门指南.
cd ~/clang-llvm
git clone https://github.com/llvm/llvm-project.git
接着,要取CMake
构建系统和Ninja
构建工具.
cd ~/clang-llvm
git clone https://github.com/martine/ninja.git
cd ninja
git checkout release
./bootstrap.py
sudo cp ninja /usr/bin/
cd ~/clang-llvm
git clone git://cmake.org/stage/cmake.git
cd cmake
git checkout next
./bootstrap
make
sudo make install
好.现在构建Clang
!
cd ~/clang-llvm
mkdir build && cd build
cmake -G Ninja ../llvm -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DLLVM_BUILD_TESTS=ON
# 允许测试,默认关闭.
ninja
ninja check # Test LLVM only.
ninja clang-test # Test Clang only.
ninja install
好,可以了.所有测试都应通过.
最后,想设置Clang
为它自己
的编译器.
cd ~/clang-llvm/build
cmake ../llvm
第二个
命令打开配置Clang
的GUI
.你需要设置CMAKE_CXX_COMPILER
项.按"t"
打开高级模式.向下滚动到CMAKE_CXX_COMPILER
,并设置它为/usr/bin/clang++
,或安装位置.
按"c"
配置,然后按"g"
生成CMake
的文件.
最后,最后一次运行ninja
,你就完成了.
步骤1
:创建ClangTool
创建最简单的ClangTool
:语法
检查器.虽然已有clang-check
了.
首先,为工具创建新目录
,并告诉CMake
它存在.因为这不会是核心clang
工具,它将在clang-tools-extra
仓库中.
cd ~/clang-llvm
mkdir clang-tools-extra/loop-convert
echo 'add_subdirectory(loop-convert)' >> clang-tools-extra/CMakeLists.txt
vim clang-tools-extra/loop-convert/CMakeLists.txt
CMakeLists.txt
应包含以下内容:
set(LLVM_LINK_COMPONENTS support)
add_clang_executable(loop-convertLoopConvert.cpp)
target_link_libraries(loop-convertPRIVATEclangASTclangASTMatchersclangBasicclangFrontendclangSerializationclangTooling)
完成后,Ninja
可编译此工具.编译!在clang-tools-extra/loop-convert/LoopConvert.cpp
中放置以下内容.
不同部件见LibTooling
文档.
//声明`clang::SyntaxOnlyAction`.
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
//声明`llvm::cl::extrahelp`.
#include "llvm/Support/CommandLine.h"
using namespace clang::tooling;
using namespace llvm;
//对所有命令行选项,自定义分类,这样只显示他们.
static llvm::cl::OptionCategory MyToolCategory("my-tool options");//`CommonOptionsParser`用与编译数据库和输入文件相关的常见命令行选项的`说明`声明`HelpMessage`.
//在所有工具中都有此帮助消息.static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
//之后可添加此`特定工具`的帮助消息.
static cl::extrahelp MoreHelp("\nMore help text...\n");
int main(int argc, const char **argv) {auto ExpectedParser = CommonOptionsParser::create(argc, argv, MyToolCategory);if (!ExpectedParser) {//对不支持的选项,优雅失败.llvm::errs() << ExpectedParser.takeError();return 1;}CommonOptionsParser& OptionsParser = ExpectedParser.get();ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList());return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>().get());
}
就这样!可通过从build
目录运行ninja
来编译新工具.
cd ~/clang-llvm/build
ninja
现在应可在源文件
上运行在~/clang-llvm/build/bin
中的语法检查器
.试试!
echo "int main() { return 0; }" > test.cpp
bin/loop-convert test.cpp --
注意指定
源文件后的两个破折号
.在破折号之后传递编译器附加选项
,而不是从编译数据库
中加载它们,现在不需要选项
.
Intermezzo
:学习AST
匹配器基础
Clang
最近推出了,提供简单,强大且简洁
方式来描述AST
中的指定模式
的ASTMatcher
库.
按宏和模板
提供支持的DSL
实现匹配器
(见ASTMatchers.h
,这里),它提供了函数式语言
常见的代数数据类型
的感觉.
如,假设只想检查二元符号
.有个叫binaryOperator
的匹配器可完成:
binaryOperator(hasOperatorName("+"), hasLHS(integerLiteral(equals(0))))
它会与左侧
正好是0字面
的加式
匹配.不会与其他形式
的0
(如"\0"
或NULL
)匹配,但它与到0的扩展宏
匹配.
匹配器
也不会匹配
调用"+"
重载符号,因为有个单独的operatorCallExpr
匹配器来处理重载符号
.
有个AST
匹配器来匹配AST
的所有不同节点
,缩小匹配器
以仅匹配指定条件
的AST
节点,及从一个AST
节点取到另一个AST
节点的遍历匹配器
.
AST
匹配器的完整列表
所有名词
匹配器都描述了AST
中的可绑定实体
,以便找到匹配项
时可引用
它们.为此,只需在这些匹配器
上调用bind
方法,如:
variable(hasType(isInteger())).bind("intvar")
第2步:使用AST
匹配器
好的,使用
匹配器.先定义一个抓按零定义初化的新变量
的所有语句的匹配器
.从匹配所有for
循环开始:
forStmt()
接着,要在循环
的第一部分,指定声明
单个变量,以便可扩展匹配器
到
forStmt(hasLoopInit(declStmt(hasSingleDecl(varDecl()))))
最后,可添加把变量
初化为零的条件
.
forStmt(hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral(equals(0))))))))
很容易阅读和理解
匹配器定义(“匹配
,init
部分声明了一个按0
字面初化
的变量的循环”),但很难确定
每个部分都是必要的.
注意,此匹配器
不会匹配,初化为"\0",0.0,NULL
或除0整数
之外的零的变量
的循环.
最后一步是给匹配器
取个名字,并绑定ForStmt
,因为想用它干活:
StatementMatcher LoopMatcher =forStmt(hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral(equals(0)))))))).bind("forLoop");
定义了匹配器后,要添加更多助手
来运行它们.匹配器与MatchCallback
配对,并用MatchFinder
对象注册
,然后从ClangTool
运行.
添加以下内容
到LoopConvert.cpp
:
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
using namespace clang;
using namespace clang::ast_matchers;
StatementMatcher LoopMatcher =forStmt(hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral(equals(0)))))))).bind("forLoop");
class LoopPrinter : public MatchFinder::MatchCallback {
public :virtual void run(const MatchFinder::MatchResult &Result) {if (const ForStmt *FS = Result.Nodes.getNodeAs<clang::ForStmt>("forLoop"))FS->dump();}
};
并将main()
更改为:
int main(int argc, const char **argv) {auto ExpectedParser = CommonOptionsParser::create(argc, argv, MyToolCategory);if (!ExpectedParser) {//对不支持的选项,优雅失败.llvm::errs() << ExpectedParser.takeError();return 1;}CommonOptionsParser& OptionsParser = ExpectedParser.get();ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList());LoopPrinter Printer;MatchFinder Finder;Finder.addMatcher(LoopMatcher, &Printer);return Tool.run(newFrontendActionFactory(&Finder).get());
}
现在,应该可重新编译
,并运行
代码以发现for
循环.创建包含几个示例
的新文件,并测试新手工
作品:
cd ~/clang-llvm/llvm/llvm_build/
ninja loop-convert
vim ~/test-files/simple-loops.cc
bin/loop-convert ~/test-files/simple-loops.cc
步骤3.5
:更复杂的匹配器
简单
匹配器可发现for
循环,但仍需要过滤
掉更多循环.可用一些巧妙
选择的匹配器来完成很大一部分剩余工作,但先要决定想要允许的属性
.
如何表征可转换为基于区间
语法的数组
上的循环?大小为N
的数组,基于区间
的循环:
1,从0索引
开始
2,连续迭代
3,在N-1
索引处结束
已检查了
(1)
,因此还要添加
的只是检查循环条件
,以确保循环的索引变量
与N
比较,并再次检查
确保增量步骤
只是递增
相同变量.
(2)
的匹配器很简单:要求在init
部分,声明相同变量
的前增量或后增量
.
可惜,不能写此匹配器
.匹配器
不包含比较两个
任意AST
节点,并确定是否相等
的逻辑,因此最好就是匹配
比允许更多,并额外与回调
比较.
就可开始构建
该子匹配器.可要求增量步骤
是一元增量
,如下:
hasIncrement(unaryOperator(hasOperatorName("++")))
指定递增
内容,引入了Clang
的AST
的另一个怪癖
:因为它们是引用
变量声明的表达式
,按DeclRefExpr
(“声明引用式
”)表示变量
用法.
要找到引用
指定声明的unaryOperator
,可简单地给它添加第二个条件
:
hasIncrement(unaryOperator(hasOperatorName("++"),hasUnaryOperand(declRefExpr())))
此外,可按仅在递增
变量为整数
时才限制匹配
匹配器:
hasIncrement(unaryOperator(hasOperatorName("++"),hasUnaryOperand(declRefExpr(to(varDecl(hasType(isInteger())))))))
最后一步是,把标识
附加到此变量
,以便可在回调
中提取它:
hasIncrement(unaryOperator(hasOperatorName("++"),hasUnaryOperand(declRefExpr(to(varDecl(hasType(isInteger())).bind("incrementVariable"))))))
可添加
这段代码到LoopMatcher
定义中,并确保
配备了新匹配器的程序
,只打印出按零初化声明
的单个变量
的循环,并有由某个变量
的一元增量
组成的增量步骤
.
现在,只需要添加一个匹配器
,来检查for
循环的条件变量
部分是否与数组
大小比较.只有一个问题:如果不查看循环
主体,则不知道正在迭代的数组
!
再次限制为,在匹配器
中得到近似
想要结果,在回调
中填写细节.因此,从如下开始:
hasCondition(binaryOperator(hasOperatorName("<")))
确保左侧
是引用
变量,且右侧有整数类型
.
hasCondition(binaryOperator(hasOperatorName("<"),hasLHS(declRefExpr(to(varDecl(hasType(isInteger()))))),hasRHS(expr(hasType(isInteger())))))
为什么?因为它不管用.在test-files/simple.cpp
中提供的三个循环
中,没有一个
有匹配条件.快速查看第一个由上一个
循环转换迭代
生成的for
循环的AST
转储,展示了答案:
(ForStmt 0x173b240(DeclStmt 0x173afc80x173af50 "int i =(IntegerLiteral 0x173afa8 'int' 0)")<<>>(BinaryOperator 0x173b060 '_Bool' '<'(ImplicitCastExpr 0x173b030 'int'(DeclRefExpr 0x173afe0 'int' lvalue Var 0x173af50 'i' 'int'))(ImplicitCastExpr 0x173b048 'int'(DeclRefExpr 0x173b008 'const int' lvalue Var 0x170fa80 'N' 'const int')))(UnaryOperator 0x173b0b0 'int' lvalue prefix '++'(DeclRefExpr 0x173b088 'int' lvalue Var 0x173af50 'i' 'int'))(CompoundStatement ...
已知道声明
和增量
都匹配,否则就不会转储该循环
.原因在小于
符号的第一个操作数
(即LHS
)的隐式转换
,即引用i
的式
中,有个L值到R值
的转换.
好的是,匹配器库
,以ignoringParenImpCast
提供了此问题
方法,告诉匹配器
,在继续
匹配前,忽略隐式转换和括号
.
调整条件符号
,恢复期望匹配
.
hasCondition(binaryOperator(hasOperatorName("<"),hasLHS(ignoringParenImpCasts(declRefExpr(to(varDecl(hasType(isInteger())))))),hasRHS(expr(hasType(isInteger())))))
在把绑定
添加到想抓的式
中,并把标识串
提取到变量
中后,完成了数组第2步.
步骤4
:提取匹配的节点
目前,匹配器
回调,还不是很有趣:它只是转储
循环的AST
.有时,需要更改
输入源码.接着,使用上一步中绑定
的节点.
MatchFinder::run()
回调带MatchFinder::MatchResult&
参数.感兴趣的是它的Context
和Nodes
成员.
即,Clang
使用ASTContext
类,来表示AST
的环境信息,但最重要
的是多个操作
需要ASTContext*
参数.
更直接有用
的是匹配
节点的集合
,及如何提取它们.
因为绑定
了三个(由ConditionVarName,InitVarName
和IncrementVarName
标识)变量,因此可用getNodeAs()
成员函数取匹配节点
.
在LoopConvert.cpp
中添加
#include "clang/AST/ASTContext.h"
更改LoopMatcher
为:
StatementMatcher LoopMatcher =forStmt(hasLoopInit(declStmt(hasSingleDecl(varDecl(hasInitializer(integerLiteral(equals(0)))).bind("initVarName")))),hasIncrement(unaryOperator(hasOperatorName("++"),hasUnaryOperand(declRefExpr(to(varDecl(hasType(isInteger())).bind("incVarName")))))),hasCondition(binaryOperator(hasOperatorName("<"),hasLHS(ignoringParenImpCasts(declRefExpr(to(varDecl(hasType(isInteger())).bind("condVarName"))))),hasRHS(expr(hasType(isInteger())))))).bind("forLoop");
并将LoopPrinter::run
更改为
void LoopPrinter::run(const MatchFinder::MatchResult &Result) {ASTContext *Context = Result.Context;const ForStmt *FS = Result.Nodes.getNodeAs<ForStmt>("forLoop");//不想转换头文件!if (!FS || !Context->getSourceManager().isWrittenInMainFile(FS->getForLoc()))return;const VarDecl *IncVar = Result.Nodes.getNodeAs<VarDecl>("incVarName");const VarDecl *CondVar = Result.Nodes.getNodeAs<VarDecl>("condVarName");const VarDecl *InitVar = Result.Nodes.getNodeAs<VarDecl>("initVarName");if (!areSameVariable(IncVar, CondVar) || !areSameVariable(IncVar, InitVar))return;llvm::outs() << "发现可能基于数组的循环.\n";
}
Clang
用每个表示变量声明
的变量关联VarDecl
.因为每个声明的"规范"
形式按地址
都是唯一
的,因此只需要确保(VarDecl
的基类)ValueDecl
不是NULL
并比较规范声明
.
static bool areSameVariable(const ValueDecl *First, const ValueDecl *Second) {return First && Second &&First->getCanonicalDecl() == Second->getCanonicalDecl();
}
如果执行到达LoopPrinter::run()
的末尾,知道循环壳
如下
for (int i= 0; i < expr(); ++i) { ... }
现在,只打印一条说明发现了个循环
的消息.
顺便,尽管Clang
已通过提供规范式
方法,完成了艰苦
工作,测试两个式
是否相同
,并不是那么简单:
static bool areSameExpr(ASTContext *Context, const Expr *First, const Expr *Second) {if (!First || !Second)return false;llvm::FoldingSetNodeID FirstID, SecondID;First->Profile(FirstID, *Context, true);Second->Profile(SecondID, *Context, true);return FirstID == SecondID;
}
此代码依赖两个llvm::FoldingSetNodeID
间的比较
.如Stmt::Profile()
文档所示,Profile()
成员函数,根据AST
中的节点属性
及其子节点
的属性
构建节点描述
.
然后,FoldingSetNodeID
按比较
式的哈希来用.稍后需要areSameExpr
.在添加其他循环
到test-files/simple.cpp
上,运行新代码
前,请试找出哪些
是可转换的循环
.
相关文章:

2312llvm,用匹配器构建clang工具
原文 用LibTooling和LibASTMatchers构建工具 这里展示如何基于Clang的LibTooling构建有用的源到源翻译工具.基础 步骤0:取Clang 因为Clang是LLVM项目的一部分,因此你需要先下载LLVM的源码.Clang和LLVM都在同一个git仓库中,在不同的目录下.更多见入门指南. cd ~/clang-llvm…...

12.26ARM作业
三个按键中断,控制对应灯亮灭 main.c #include "key_it.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){all_led_init();key1_it_config();key2_it_config();key3_it_config();while(1){printf("do main...\n&…...

Objectiv-C设计模式笔记
文章目录 通用知识点对象创建原型模式定义适用场景示例 工厂方法定义适用场景示例 抽象工厂定义适用场景示例 生成器模式定义适用场景示例 单例模式定义适用场景示例 接口适配适配器定义适用场景示例 桥接定义适用场景示例 外观模式定义适用场景示例 对象去耦中介者定义适用场景…...

AI安全综述
1、引言 AI安全这个话题,通常会引伸出来图像识别领域的对抗样本攻击。下面这张把“熊猫”变“猴子”的攻击样例应该都不陌生,包括很多照片/视频过人脸的演示也很多。 对抗样本的研究领域已经具备了一定的成熟性,有一系列的理论来论述对抗样本…...

计算机网络概述(下)——“计算机网络”
各位CSDN的uu们你们好呀,今天继续计算机网络概述的学习,下面,让我们一起进入计算机网络概述的世界吧!!! 计算机网络体系结构 数据传输流程 计算机网络性能指标 计算机网络体系结构 两个计算机系统必须高度…...

anaconda创建环境时安装默认的第三方库
感谢阅读 写作原因首先要有python解释器加入每次创建环境都需要的python库查看所有的默认安装库还原方法 写作原因 近期由于多个项目在多头并举,出现了每次安装环境都要重新打一遍指令的麻烦问题,出于节约时间从而提高工作效率的目的。我尝试了很多方法…...

STM32 cubeMX 光敏电阻AD转化实验
文章代码使用 HAL 库。 文章目录 前言一、光敏电阻介绍二、光敏电阻原理图解析三、ADC采样介绍1. 工作原理:2. ADC精度: 四、STM32 cubeMX配置ADC采样五、代码编写总结 前言 实验开发板:STM32F051K8。所需软件:keil5 ,…...

AutoSAR(基础入门篇)3.2-Autosar中RTE的Ports【S/R】与【C/S】
目录 一、RTE的Ports【S/R】 1、特征 1.1、扮演SWCs和BSW的交流途径 1.2、其他特征...

安装kafka
静态文件安装(单机) 解压到指定目录(解压到 /usr) tar -zxf kafka_2.11-2.2.0.tgz -C /usr/ 到指定的解压目录下 cd /usr/kafka_2.11-2.2.0/ 配置主机名 查看是否配置了HOSTNAME vim /etc/sysconfig/network 没有就新增 HOSTNA…...

[MySQL] MySQL 高级(进阶) SQL 语句
一、高效查询方式 1.1 指定指字段进行查看 事先准备好两张表 select 字段1,字段2 from 表名; 1.2 对字段进行去重查看 SELECT DISTINCT "字段" FROM "表名"; 1.3 where条件查询 SELECT "字段" FROM 表名" WHERE "条件…...

创建springboot项目
SpringBoot 就相当于不需要配置文件的SpringSpringMVC。 常用的框架和第三方库都已经配置好了。 maven安装配置 管理项目依赖库的 maven的安装教程网上有很多,这里简单记录一下。 官网下载maven后并解压。 在其目录下添加一个目录repository 然后在conf目录下…...

“双十一、二” 业务高峰如何扛住?韵达快递选择 TDengine
小 T 导读: 为了有效处理每日亿级的数据量,早在 2021 年,韵达就选择用 TDengine 替代了 MySQL,并在三台服务器上成功部署和上线了 TDengine 2.0 集群。如今,随着 TDengine 3.0 版本的逐渐成熟,韵达决定将现…...

STM32L432+LIS3DH【加速度传感器】:端侧AI
一、搜集芯片资料 1.LIS3DHTR:加速度传感器 查找链接: https://www.st.com/zh/mems-and-sensors/lis3dh.html 2. NUCLEO-L432KC:芯片 查找连接: https://www.st.com/zh/evaluation-tools/nucleo-l432kc.html#cad-resources 1.原理图 引…...

VCG Mesh刚性旋转(变换矩阵)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 旋转矩阵如果从线性空间的角度来看,它类似于一个投影过程。假设坐标 P ( x 1 , y 1 , z 1 ) P(x_1,y_1,z_1)...

R语言【base】——system.file() 在软件包等中查找文件的完整文件名。
Package base version 4.3.2 Parameters system.file(..., package "base", lib.loc NULL,mustWork FALSE) 参数【...】:字符向量,指定某个软件包中的子目录和文件。默认情况下,没有值则返回软件包的根目录。不支持通配符。 …...

HTML制作暴雨特效
🎀效果展示 🎀代码展示 <body> <!-- partial:index.partial.html --> <canvas id="canvas-club">...

cesium实现区域贴图及加载多个gif动图
1、cesium加载多个gif动图 Cesium的Billboard支持单帧纹理贴图,如果能够将gif动图进行解析,获得时间序列对应的每帧图片,然后按照时间序列动态更新Billboard的纹理,即可实现动图纹理效果。为此也找到了相对于好一点的第三方库libg…...

blackbox黑盒监控部署(k8s内)tensuns专用
一、前言 部署在k8s中需要用到deployment、configmap、service服务 二、部署 创建存放yaml的目录 mkdir /opt/blackbox-exporter && cd /opt/blackbox-exporter 编辑blackbox配置文件,使用configmap挂在这 vi configmap.yaml apiVersion: v1 kind: Confi…...

“C语言“——scanf()、getchar() 、putchar()、之间的关系
scanf函数说明 scanf函数是对来自于标准输入流的输入数据作格式转换,并将转换结果保存至format后面的实参所指向的对象。 而const char*format 指向的字符串为格式控制字符串,它指定了可输入的字符串以及赋值时转换方法。 简单来说给一个打印格式(输入…...

Spring Boot3 Web开发技术
前期回顾 springboot项目常见的配置文件类型有哪些?哪种类型的优先级最高 yml properties yaml 读取配置文件里的数据用什么注解? value restful风格 RESTful 风格与传统的 HTTP 请求方式相比,更加简洁,安全,能隐…...

学习笔记:数据挖掘与机器学习
文章目录 一、数据挖掘、机器学习、深度学习的区别(一)数据挖掘(二)机器学习(三)深度学习(四)总结 二、数据挖掘体系三、数据挖掘的流程四、典型的数据挖掘系统 一、数据挖掘、机器学…...

highcharts的甘特图设置滚动时表头固定,让其他内容跟随滚动
效果图:最左侧的分类列是跟随甘特图滚动的,因为这一列如果需要自定义,比如表格的话可能会存在行合并的情况,这个时候甘特图是没有办法做的,然后甘特图的表头又需要做滚动时固定,所以设置了甘特图滚动时&…...

ElasticSearch 架构设计
介绍 ElasticSearchMySQLIndexTableDocumentRowFieldColumnMappingSchemaQuery DSLSQLaggregationsgroup by,avg,sumcardinality去重 distinctreindex数据迁移 ElasticSearch 中的一个索引由一个或多个分片组成 每个分片包含多个 segment(分…...

HTML---定位
目录 文章目录 一.定位属性概述 二.position 基础数值 三.z-index属性 网页元素透明度 练习 一.定位属性概述 HTML中的定位属性指的是用来控制HTML元素在页面中的位置和布局的属性,包括position、top、bottom、left和right等。 position属性指定了元素的定位方式&a…...

JVM高频面试题(2023最新版)
JVM面试题 1、JVM内存区域 Jvm包含两个子系统和两个组件。 1.1子系统 Class loader(类加载器):根据给定的全限定名类名(java.lang.object)来装载class文件到Runtime data area(运行时数据区)…...

webpack学习-7.创建库
webpack学习-7.创建库 1.暴露库1.1概念1.2验证1.2.1 不导出方法1.2.2 导出方法 2.外部化 lodash3.外部化的限制4.最终步骤5.使用自己的库5.1坑 6.总结 1.暴露库 这个模块学习有点坑。看名字就是把自己写的个包传到npm,而且还要在项目中使用到它,支持各种…...

MQTT - 笔记
1 Mosquitto 官网 https://mosquitto.org/ 2 Windows环境下安装配置Mosquitto服务及入门操作介绍 Windows环境下安装配置Mosquitto服务及入门操作介绍-CSDN博客 3 开源:MQTT安装与配置使用 【C++】开源:MQTT安装与配置使用_c++ mqtt-CSDN博客 4 一文搞懂Qt-MQTT开发...

Django 安装
各位小伙伴想要博客相关资料的话,关注公众号:chuanyeTry即可领取相关资料! Django 安装 在安装 Django 前,系统需要已经安装了 Python 的开发环境。 如果你还没有安装 Python,请先从 Python 官网 https://www.python…...

推荐一个vscode看着比较舒服的主题:Dark High Contrast
主题名称:Dark High Contrast (意思就是,黑色的,高反差的) 步骤:设置→Themes→Color Theme→Dark High Contrast 效果如下: 感觉这个颜色的看起来比较舒服。...

YCSB 测试表预分区
最近使用 YCSB 测试时,一直使用如下方法创建预分区: TABLE_NAME"usertable" REGIN_SPLITS$((510-1)) cat << EOF | sudo -u hbase hbase shell create ${TABLE_NAME}, cf, {SPLITS > (1..${REGIN_SPLITS}).map {|i| "user#{100…...