poi
依赖123456 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.5</version></dependency>
从文件读入工作簿12fileInputStream = new FileInputStream(frameFile);XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fileInputStream);
sheet1234final int numberOfSheets = xssfWorkbook.getNumberOfSheets();for (int i = 0; i < numberOfSheets; i++) ...
MybatisPlus
通用mapper可将自定义的mapper接口继承BaseMapper接口,其中封装了一些常用操作
通用Service123456//自己写的service接口继承Iservice接口public interface SysMenuService extends IService<SysMenu> {}//自己写的实现类继承Iservice接口的实现类public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper,SysMenu> implements SysMenuService {}
主键生成12@TableId(type = IdType.ASSIGN_ID) //默认是雪花算法type = IdType.AUTO //数据库Id自增
日志配置12345//yml文件进行如下配置即可mybatis-plus: configuration: # 打印mybatis-plus上的sql语句 log-impl: org.apache.iba ...
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 ...
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 ...
机器学习
定义计算机无需明确编程便可进行能力学习
机器学习常用的的两种算法:
监督学习
非监督学习
监督学习训练者给出正确答案用于学习 ,在监督学习中,数据同时带有输入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
Vue
核心功能
声明式渲染
可以声明式的描述最终输出的HTML和JavaScript状态之间的关系
响应性
vue会自动跟踪js状态并在其发生变化时响应式的更新DOM
渐进式可以分块拉取依赖
Hello Vue1234567891011121314151617181920212223242526272829303132333435363738<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="./node_modules/vue/dist/vue.global.js"></s ...
NodeJS&NPM
NodeJS类似于java虚拟机,可以再浏览器外部运行js,且可以操作系统IO流,安装教程在本博客搜索”node安装“
NPM类似于后端的Maven,但是只能管理依赖
前端框架的下载工具
可将云端仓库中的依赖下载到本地
前端项目的管理工具
项目初始化、依赖管理、研发模式运行、编译
切换镜像1234// 查看npm config get registry// 切换npm config set registry https://registry.npmmirror.com
设置本地仓库地址1234// 查看npm config get prefix// 设置npm config set prefix "E:\tools\NodeJS\NPMGloableRegistry"
npm升级1234// 升级npm install -g npm@9.6.6// 验证npm -v
仓库依赖查询npm | Home (npmjs.com)
npm常用命令
项目初始化
npm init
初始化当前文件夹(项目)的信息,生成package.json文件
...
ES6
介绍ES就是JS的原名,ES6发布于2015年
letlet与var的差别
let不能重复声明
123456789// varvar j = 10;var j = 20;// letlet i = 10;// 下面这句代码是非法的,报错i已被声明,let i = 20;// let之前如果是var先声明,则第一次let可以将其覆盖// var之前如果let已经声明,则会报错
let有块级作用域,即使是非函数的花括号范围,使用let在其中定义的变量也只能在其中访问
1234567{ var ii = 19; let ik = 10;}console.log(ii);// 报错ik未定义console.log(ik);
let不会预解析进行变量提升
没有声明之前先访问,var会将改变量赋值为undefind,let会报错(not defind)
let定义的全局变量不会作为window的属性
var 一个变量的时候,改变量会变为window对象的属性
let在es6中推荐使用
const特性与let相同,除此以外
定义出的变量 ...