protobuf
参考资料Protobuf通信协议详解:代码演示、详细原理介绍等 - 知乎 (zhihu.com)
概述谷歌定义的一种用于数据传输的数据序列化方式,节省流量同时省电(通信耗电)。
类似于json、xml这种,但是比json、xml更简洁,但牺牲了自描述特性。
特点
占用空间小
去除自描述符,需要对应的描述文件
无法以文本方式直接查看,以字节的方式存储
通信双方都需要具有描述文件才可以解析报文
.proto文件是proto信息的描述文件,可使用编译器根据该文件生成各种目标语言的源码,生成的源码中除了包含数据结构的实体类,同时携带从实体类生成protobuf内容的Writer与读取protobuf为实体类的Reader。
123456789101112131415161718192021222324252627282930313233343536// LICENSE: GNU General Public License v3.0 to Beem Development (https://github.com/beemdevelopment)// From https://github.c ...
Ai-M61-32S开箱点灯
参考资料Ai-M61-32SU开箱(传统艺能之点灯) - 板子开箱专区 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
Ai-M61-32SU开箱-迟到的点灯 - 板子开箱专区 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
零基础搭建小安派Windows 开发环境 - 小安派S1&M61教程合集 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
怎样查看51单片机串口是连接电脑的哪个端口-百度经验 (baidu.com)
前置环境参考博客【板子申请】Ai-M61-32S开发环境搭建@Boranget - 板子申请专区 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
编译源码进入\AiPi-Open-Kits\AiPi-Eyes-DU,执行make进行编译
查看com口参考参考资料中的百度经验,在设备管理器中查看com口
烧录在开发板 ...
2FA与TOTP原理及实现
参考资料动态令牌是怎么生成的?(OTP & TOTP 简单介绍) - 知乎 (zhihu.com)
2FA & TOTP 测试 (moyuscript.github.io)
概念了解2FA全称 Two Factor Authorization,双重因素认证,在身份认证时需要两个条件,比如一个密码,一个短信验证码这种。这种机制是为了防止密码泄露后不法人员盗用密码进行登录。只要符合需要双重认证才能登录的机制都可以算作双重认证,比如短信验证码,邮箱验证码,以及我最近了解到的TOTP。
TOTP全称 Time-based One-time Password,基于时间的一次性密码,顾名思义便是随当前时间变化的密码。以谷歌身份验证器为例,其界面长这个样子
其中的六位数变为基于时间生成的一次性密码,而后面的进度条则是当前密码的剩余生效时间。有意思的是,即使在断网的情况下,谷歌验证器仍然可以生成密钥,并且可以用于登录。
首先,为了让用户能够有足够的时间输入TOTP,要保证TOTP是有存活时间的,这就使得需要在一定时间范围内,使用当时的时间戳可以生成相同的密码,这一机制的实现主要是靠步 ...
maven-shade-plugin
参考资料maven-plugin-shade 详解 - 六开箱 - 博客园 (cnblogs.com)
介绍Maven Shade Plugin主要是为了将一个自启动JAR项目的依赖打包到一个大的JAR中,从而不用担心依赖问题。它还可以通过设置MainClass,创建一个可以执行的JAR包,同时若其他项目引用此jar包,可以解决第三方JAR包冲突问题。
可以将项目包含的依赖打包人一个jar中
可以通过重命名的方式将依赖的package重定向
使用方式maven-shade-plugin需要与maven生命周期中的package阶段绑定,在执行mvn package动作时会自动执行本插件。
1234567891011121314151617181920212223242526<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...
xsd
Schemaxsd是Schema的后缀,故通常使用xsd表示Schema
能做什么
定义可以出现在文档中的元素
定义可以出现在文档中的属性
定义哪个元素是子元素
定义子元素的次序
定义子元素的数目
定义元素是否为空,或者是否可包含文本
定义元素和属性的数据类型
定义元素和属性的默认值以及固定值
例子1234567<?xml version="1.0"?><note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body></note>
对应的
12345678910111213141516<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2 ...
Async注解
作用标注在方法上,当调用该方法时,spring会启用一个线程去执行该方法
使用
启用@Async注解
在某个配置类上比如启动类上标注@EnableAsync注解
12345@SpringBootTest@EnableAsyncpublic class AsyncTest { }
定义接口用于让spring注入
12345678/** * @author boranget * @date 2023/11/29 */public interface IAsyncMethod { void A(); void B();}
实现类
12345678910111213141516171819202122package com.example.springweb;import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;/** * @author boranget * @date ...
SpringAOP
SpringAOP的原理根据需要代理的目标对象的类型,SpringAOP会选择不同的代理方式生成代理类。
如果目标对象是一个Java接口,Spring会使用Java动态代理(反射)来生产代理类,如果目标对象是一个普通的java类,而不是接口,Spring会使用CGLib代理来生成代理类,CGLib是一种基于字节码的代理模式。
spring创建代理类后,会替换掉原先的对象引用,这样在调用目标增强方法时就会被增强。
SpringAOP调用本类中增强方法不生效如果某个类中,一个方法A是增强方法,同样在本类中的另一个方法B在调用A的时候并不会触发增强,因为增强的原理是替换掉对象引用,但在同一个类中的直接引用是通过this指针调用的,不会调用到被增强的代理类中的A方法。
解决方法:
使用当前类的被代理类执行A方法
AopContext.currentProxy()
1234public void B() { System.out.println("method B"); ((Son) AopContext.currentProxy()).A(); ...
安信可开发环境搭建
参考资料零基础搭建小安派Windows 开发环境 - 小安派S1教程合集 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
(一)记录小安派之开发环境搭建(Windows) - 小安派S1教程合集 - 物联网开发者社区-安信可论坛 - Powered by Discuz! (ai-thinker.com)
前置环境由于我的电脑上vsc(vs code)和git都安装过了,不再重新安装一次了。不熟悉的朋友可在本博客查找对应文章:Boranget.博客(进入博客右上角有搜索图标)
安装vsc
安装并配置git
拉取源码在你常用的项目目录新建一个项目文件夹,进入,地址栏输入cmd打开控制台(或者通过别的方式在cmd中进入这个文件夹)
执行(需要配置好git)
1git clone https://gitee.com/Ai-Thinker-Open/AiPi-Open-Kits.git
修改子模块源考虑到有些小伙伴的网络原因,拉取github网络不稳定,这里将github仓库换为gitee仓。
进入拉取下来的项目文件夹AiPi- ...
JupyterNotebook的安装
安装pythonhttps://www.python.org/
找到最新版或者你要下载的版本,往下滑,找到下载列表,选择合适的系统,点击下载。
直接运行安装包,可一路选择默认,最后会要求修改path长度限制,允许即可。
pip设置清华源
1pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip安装jupyter1pip install jupyter notebook
运行1jupyter notebook
机器学习
定义计算机无需明确编程便可进行能力学习
机器学习常用的的两种算法:
监督学习
非监督学习
监督学习训练者给出正确答案用于学习 ,在监督学习中,数据同时带有输入x和标签y
回归算法预测一个数字,会有无限多可能的输出
分类算法输出一个分类,可能的输出是有限的
无监督学习不提供标签,没有标准答案,在无监督学习中,数据仅带有输入。将没有标签的数据自动分组到集群中
聚类算法
异常检测找到不正常的数据
数据降维压缩数据集,去掉不重要的维度
线性回归模型x称为输入,f为模型,y-hat 代表对y值的预测
成本函数fwb(x) = wx + b
m:数据总量
J(w,b) = (1/2m)*求和((yi-hat - yi)^2)
等同于
J(w,b) = (1/2m)*求和((fwb(xi) - yi)^2)
最终目标为找到使得J变小的w和b