![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
基础
文章平均质量分 80
Ch.yang
try{ coding } catch { bug }
展开
-
【Java】字节数组 pcm 与 wav 格式互转 (附原理概述)
最近实现了一个文字转语音的功能,语音引擎返回的是pcm格式的数据。需要转化成wav格式前端才能播放。本文首先会给出解决方案,后续会讲背后的原理。场景wav格式实际上就是在pcm数据上加了头部,让浏览器能够解析pcm数据,进而能播放音频。可以类比 TCP协议的报文头,报文头携带了数据长度、偏移量等元信息。原创 2024-06-22 14:08:45 · 404 阅读 · 0 评论 -
【前端】夯实基础 css/html/js 50个练手项目(持续更新)
发现一个没有用前端框架的练手项目,很适合我这种纯后端开发夯实基础,内含50个mini project,学习一下,做做笔记。项目地址:https://github.com/bradtraversy/50projects50days。原创 2024-02-21 18:02:20 · 5479 阅读 · 2 评论 -
【Log】为类中的所有日志打印添加前缀
有没有一种办法,在一个类中(业务逻辑)。的时候自动加上日志前缀,这样子查日志更方便。stackoverflow 上面有对该问题的讨论,实测可用,这里记录一下。来自stackoverflow 简洁可用的方式。原创 2023-09-24 11:49:00 · 539 阅读 · 0 评论 -
【网络安全】理解报文加密、数字签名能解决的实际问题
工作中重新接触了 【公钥、私钥、签名】的概念。抽空重新看了《计算机网络》和国外的小黑书,把这块基础知识再收敛一下。防止报文泄露防止报文被篡改实体鉴别端点鉴别防止重放攻击既然大报文消耗性能,能不能把报文弄小?思路其实就是摘要算法,常见的md5、sha-1就是摘要算法(也叫散列算法)。程序中的应用// 把签名拼接到密文后面,接收者再解析出签名,验签即可 密文 . 签名。原创 2023-08-26 14:27:03 · 1892 阅读 · 0 评论 -
【算法】笔记:LeetCode 206. 反转链表
这道题可以拆成几个小点去理解,本篇博文快速记录一下。有迭代和递归两种解法。迭代的解法空间复杂度更优秀,递归的思想更巧妙。这里主要总结下迭代的解法。并简要理解下递归的解法。LeetCode 206. 反转链表。原创 2023-03-04 14:46:02 · 452 阅读 · 0 评论 -
【Java】《Java8 实战》 CompletableFuture 学习
看 《Java8 实战》后,觉得自己对多线程应用还是停留在 JUC 工具类的使用上,忽略了 CompletableFuture 这么强大的工具。本文主要内容复习并行、并发的概念。多线程的编程模型CompletableFuture 让多线程编程更加清爽有时间的话,补充 CompletableFuture 的内部原理这个类是 Java 8 引入的,用于解决FutrueFutrue 任务之间的依赖关系很难表达等待Futrue集合中的所有任务都完成应对Future的完成事件。原创 2023-02-19 19:59:51 · 1016 阅读 · 0 评论 -
【Java】使用 Optional 让代码变得更清爽
今天看 《Java8 实战》 发现了 Optional 可以用来改善工作中的代码质量。本文用于巩固 Optional 的 api 积累及理解,并尝试多多应用于生产中。// 模拟VO Insurance insurance = new Insurance();// 模拟字段的数据源,通常是为了节省数据库IO, 由全量数据转化成的 key-value HashMap < String , String > properties = new HashMap < >();原创 2023-02-15 23:35:27 · 227 阅读 · 0 评论 -
【Java】 String.split 归纳
jdk的注释已经写的很明白了,本文只是在此基础上再归纳一下。重点是归纳下第二个参数的用法。原创 2022-08-07 21:10:59 · 134 阅读 · 0 评论 -
【安全】 阅读 RFC6749 及理解 Oauth2.0 下的授权码模式
规范来自 RFC6749。看了《Spring 微服务实战》对OAuth 2.0 的介绍后还是觉得存在一些翻译的问题。现在结合一起重新梳理下。RFC6749 定义 OAuth 2.0 目前只建立在HTTP协议上。并多次提到可以交给浏览器扮演,授权码模式十分适合有独立服务器的Web 服务器。从 来看从 的角度看从行业规范看拉文档里的图,现在把当作浏览器4.1. 用户委托浏览器,向微信发起身份验证的GET请求Note: 并没有规范黑色线的具体实现,但是规定了红色线提交参数的具体要求4.2. 微信确认身份原创 2022-07-08 15:00:01 · 2387 阅读 · 0 评论 -
【高并发基础】MySQL 不同事务隔离级别下的并发隐患及解决方案
本项目聚焦高并发的基础知识,至底向上得研究:github 仓库 (分支 master / isolation / propagation / multithreading)理念:禁用了gap锁,减少了锁的作用范围,即减少了死锁风险使用了"半一致读"降低了锁等待,即减少了死锁风险,也提高了读效率项目isolation分支 :3.1.2 RC 解决不可重复读,使用 加锁项目isolation分支 :项目isolation分支 :3.2.1 解决幻读RC 禁用了GAP锁(外键约束除外)理论上是原创 2022-06-25 20:05:08 · 1004 阅读 · 0 评论 -
【MySQL】官网文档学习之查询语句sql注意事项
MySQL5.7 SELECT 文档。查询语句可禁用group by的默认排序(减少排序开销)在selete中使用order by group by排序的时候不要忽略 max_sort_length由于as操作在where执行之后,同样的需求无法用一下语句实现where 本身于聚合函数无关,所以也无法用聚合函数作为语句having 不跟 group by 一起用,可以执行,此时若having后不使用聚合函数,语义与where一致,建议改成where.having原创 2022-06-11 18:10:05 · 226 阅读 · 0 评论 -
【MySQL】关键字及运算符官方文档及笔记
前言写SQL题经常用,遇到的在这里记录一下1. join on 和 where 的条件区别MySQL5.7 join 相关文档1.1 用 left join 取代 right joinRIGHT JOIN works analogously to LEFT JOIN. To keep code portable across databases, it is recommended that you use LEFT JOIN instead of RIGHT JOIN.right join原创 2022-02-03 20:29:12 · 1287 阅读 · 0 评论 -
【前端】著作阅读笔记——JavaScript DOM的前世今生及编程思想(下)
本文不追求前沿技术,也不讨论作者那个年代提出的技术方案放到现在的性价比。旨在总结《JavaScript DOM 编程艺术(第二版)》中作者所沉淀的编程思想。技术选型上,我认为考虑渐进增强是有必要的。如果你从一开始设计就以Ajax为起点,那么以后确实很难把它从成品站点中剥离出来。使用Ajax,实际上是默认了用户都允许JavaScript在浏览器运行。支持平稳退化的代码代码参考至:https://blog.csdn.net/weixin_40312266/article/details/1028126原创 2022-06-08 12:33:35 · 112 阅读 · 0 评论 -
【前端】著作阅读笔记——JavaScript DOM的前世今生及编程思想(上)
JS由Netscape的Brendan Eich研发。在JS出现之前,Web浏览器只是一种文档显示的载体。为了让网页内容不再局限于枯燥的文本,诞生了JS。JS显著得提升了Web文档的可交互性。ECMAScript描述了该语言的语法和基本对象文档对象模型(DOM)初代的JS并没有这个概念,是发展过来的。后文将讲到DOM的起源。浏览器对象模型(BOM)开发者如果需要控制浏览器的行为,如浏览器的前进后退,另开页面等。需要借助诸多个对象。本文暂时不提这些对象的作用。 ——JS在DOM之前诞生。DOM, 简单原创 2022-06-07 23:20:41 · 204 阅读 · 0 评论 -
【算法】LeetCode二分查找例题汇总(持续更新)
死循环问题仅一部分的测试用例可以通过为了避免以上问题,收敛下题目,记住解题思路。当序列中有三个元素, (下标从0开始)往 mid 的左边找可以找到答案left == 0, right == 1 (为什么不是 mid - 1 而是 mid) 因为当前Mid可能是答案,不要漏掉了。往 mid 的右边找可以找到答案left == 1, right == 2 (为什么可以是 mid + 1) 因为当前Mid不可能是答案 (答案是要找false节点,而不是true节点)原创 2021-12-31 17:05:57 · 695 阅读 · 0 评论 -
【算法】判断两棵二叉树是否相似
1. 前言看到本题后,考虑使用前中后哪种遍历确认递归函数是否携带返回值运算符&& 的逻辑短路的特性2. 题目已知两颗二叉树B1和B2,算法f52判断B1和B2是否相似,相似则返回1,否则返回0。如果B1和B2均为空树,则两棵树相似。如果B1和B2非空且B1的左右子树与B2的左右子树分别相似。则两棵树相似。3. 题解思路确定遍历对象两棵未知形状的树,且由题意,两棵空树一定相似。if (NULL == t1 && NULL == t2) { // 规范了原创 2021-09-14 10:57:24 · 3768 阅读 · 0 评论 -
【算法】对二叉树进行操作:如果结点没有左孩子但是有右孩子,就将其右孩子改变为左孩子
1.前言提醒自己,对二叉树的操作,要对递归函数了解透彻,并熟练二叉树的递归遍历。2. 解题2.1 确定遍历类型后序遍历一定可行作为深度优先遍历,找到左子树最深处的节点后返回进行“访问”,以下将这个过程描述为回溯 。在回溯的过程中,实现交换。自底向上所有的回溯完成,交换也完成。后序遍历确保根节点最后被"访问"。2.2 代码void f(BiTree T) { if (T == NULL) { return; } f(T->lchild); f(T->rchi原创 2021-09-14 10:05:19 · 1461 阅读 · 0 评论 -
【算法】求二叉排序树中第k小的结点的位置
假设二叉排序树中增设一个lsize域,其值为该结点的左子树中的节点数加1。其类型定义如下:typedef struct BiTNode { char data; // 题中没有读写这个数据,可以忽略 int lsize; struct BiTnode *lchild, *rchild;} BiTNode, *BiTree;算法f5求二叉排序树中第k小的结点的位置。BiTree f5(BiTree T, int k) { if (NULL == T) return NULL; if (T原创 2021-09-09 16:16:32 · 536 阅读 · 0 评论 -
【算法】后序遍历判断二叉树是否为平衡二叉树
1. 前言来自广工考研真题平衡二叉树是一种高级数据结构,是O(nlogn)搜索算法的基础数据结构拆解题目内容: 后序遍历求树高度 + 全局计数器 + 节点平衡定义 + 返回值语义确认实现方式:递归遍历 + 引用类型做全局计数器2. 读题“判断” 属于二叉树的遍历“是否” 则是遍历中需要做的具体操作“平衡” 来自于定义:任意节点左右子树高度差小于2 => |左子树高度 - 右子树高度| < 23. 梳理思路递归得让每个节点知道自己所在的高度,并向上报告,其双亲节点判断自原创 2021-09-09 11:31:07 · 383 阅读 · 0 评论 -
【线性代数】结合 Ax=b 的通解结构,直观理解秩、线性变换、相关无关、基础解系
1. 前言本文的理论知识基于系列视频: 线性代数的本质。侵删阅读本文需要的前置知识:向量组的概念矩阵可以视为一种线性变换任意的线性变换“零点”位置不改变行列式 ≠ 0 => 线性变换不可逆,并产生降维线性相关无关的几何意义会计算 Ax = b 的通解2. 语义2.1 Ax 的语义假设A=[100010000] 假设A =\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 &原创 2021-09-03 00:35:16 · 6545 阅读 · 0 评论 -
【C/C++】C语言二维数组名与&、*的组合使用
前言本文是作者查阅资料后根据代码演练,得出的结论。结论仅用于知识点的关联总结。本文的 & 统一称为取地址操作,* 统一称为解引用。关于解引用,可参考:解引用的理解本文不再介绍二维数组与一维数组的关系1. 一个二维素组在内存中的结构int array[][3] = {{1,2,3},{4,5,6}};2. 数组名 & * 三者的组合用法会惊奇的发下,以下的表达式,都输出了同一个地址值int main() { int array[][3] = {{1,2,原创 2021-01-01 18:53:00 · 2314 阅读 · 0 评论 -
【Java_基础深入】Java8 Stream | Collections API 的 分组操作
Java8 Stream | Collections API 的 分组操作初始数据 // 初始数据 List<User> userList = Arrays.asList( new User("zhangsan", 10), new User("zhangsan", 12), new User("lisi", 10), new User("wangwu", 15),原创 2020-05-16 20:11:06 · 501 阅读 · 0 评论 -
【Linux】重启 Exited 状态的 docker 容器 bind: address already in use
查看docker 容器docker -ps -a重启docker 容器docker restart 容器ID(或容器名)报错: bind: address already in use查看端口号监听的进程, 获取pid,lsof命令的其他用法lsof -i:端口号或netstat -tunlp | grep 端口号根据pid杀掉进程,-9参数表示强力删除,其他...原创 2020-02-09 23:33:02 · 4437 阅读 · 0 评论 -
【Spring】Filter、Interceptor、Aspect的设计及区别
Filter、Interceptor、Aspect的设计及区别1) Filter定义基于Servlet架构,Spring无法控制,也无法拿到Spring控制的参数public class TimeFilter implements Filter { @Override public void doFilter(ServletRequest request, Se...原创 2020-01-30 23:37:25 · 1382 阅读 · 0 评论 -
【工具】使用 import static 在测试用例中简化重复代码(idea)
需求测试用例中存在大量静态方法需要加类前缀,如何省略这些类名前缀idea实现先写完整的类.方法名MockMvcRequestBuilders.get("/user")删掉类名get("/user")鼠标单击方法名, ALT + ENTER3.1 如果是第一次导入,需要选择如下选项3.2 成功导入过的,自动生成如下 import语句import static org.spri...原创 2020-01-28 13:41:20 · 554 阅读 · 0 评论 -
【java_基础深入】模板方法设计模式的妙用 : 回调子类实现
模板方法设计模式应用场景HttpServlet 的 service() 就是一个模板方法,它实现了Servlet规范,DispatcherServlet 借助service() 的模板方法,拓展了自己的逻辑。HttpServlet 是一个抽象类。抽象类是实现模板方法的基石,以下先举个简单例子,再从底层证明实例产品线定义:/** * @Author james * @Descript...原创 2019-12-24 22:52:02 · 294 阅读 · 0 评论 -
【Linux】用户组、用户操作
Linux与用户相关的目录结构 /:根目录 root:超级管理员(root)的家 home:其他用户(普通用户)的家 etc:配置文件 usr:存放共享文件的(软件的安装路径) lib:依赖库Linux用户组和用户的概念基本概念用户分为 超级管理员 和 普通用户用户组 是用户的管理单元,一个用户至少属于一个用户组依赖关系超管 操作用户超管可以创建...原创 2019-10-27 19:27:56 · 480 阅读 · 0 评论 -
【java_基础深入】注解注入配置 / Properties读取配置 / ResourceBundle读取配置
注解注入/** * 生命周期问题: * 注解的默认生命周期是保留到字节码阶段 * 通过Retention元注解指定注解的生命周期 * 1. SOURCE 保留到源码阶段 * 2. CLASS 保留到字节码阶段 * 3. RUNTIME 保留到运行时 */@Retention(RetentionPolicy.RUNTIME)public @interface JdbcI...原创 2019-10-22 10:30:54 · 267 阅读 · 0 评论 -
【java_基础深入】使用内省技术模仿实现BeanUtils
原BeanUtils出处import org.apache.commons.beanutils.BeanUtils;原BeanUtils常用法populate(Object bean, Map<String, ? extends Object> properties); // 传入Map参数注入bean public void getBean() { ...原创 2019-10-22 10:03:58 · 162 阅读 · 0 评论 -
【java_代码规范】注释的定义、IDEA的注释配置
定义与标准参考阿里巴巴编程规约IDEA注释配置转载 2019-06-21 16:18:25 · 1419 阅读 · 0 评论 -
【java】集合相关、配合理解泛型
集合分为两大接口 Collection 和 MapCollection接口 :List Queue Set常用的Collection的实现类ArrayList 实现 ListLinkedList 实现 List和QueueHashSet 实现 Set常用的Map实现类HashMapSet的遍历//不使用泛型Set set = new HashSet(...原创 2019-03-27 14:52:04 · 137 阅读 · 0 评论 -
【计算机网络】TCP的三次握手和四次挥手
TCP三次握手参数特性大写的SYN ACK都是标志位。标志位唯一确定报文行为,取值范围: 0 或 1SYN:synchronize , 标识该报文请求同步 ACK:acknowledgement, 标识该报文确认收到请求小写的seq是序号,ack是确认序号。序号位可以是用于通信的任意整数,取值范围:[0,2^32-1]seq:sequence number ack:ack...原创 2019-07-08 21:03:19 · 246 阅读 · 0 评论 -
【java_web】HTTP中状态码301、302、401、403、404、500 、504的含义
在HTTP 中〃状态码 301、302、401、403、404、500 、504的含义是;301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。您应使用此代码告诉 Googlebot 某个网页或网站已永久移动到新位置。302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请......原创 2018-10-28 21:23:44 · 10652 阅读 · 1 评论 -
【数据结构】常见的数据结构
1. 数组Java的数组是引用类型,实例化后成为一个对象。数组在内存中是一片连续的区间,具有顺序性的数据适合存放。数组拥有索引的功能和.length的原生方法,是最底层的数据结构。是组成高级数据结构的基石。动态数组数组是静态的容器,实例化后,对应的数组大小是确定的,内存空间也是连续的。动态数组解决的问题是,当存放的数据大小不确定时,数组大小进行自适应。自适应的过程实质是新创建一个大小不...原创 2019-07-03 15:00:34 · 214 阅读 · 0 评论 -
【java_基础深入】java中short类型相加如何防止溢出
Java中的short的运算自运算后赋值short s1 = 3;short s2 = ++s1; // 编译正常相加运算后赋值short s1 = 666;short s2 = 777;short s3 = s1 + s2; // 编译错误原创 2019-08-10 11:01:38 · 3522 阅读 · 1 评论 -
【java_基础深入】什么是常量优化机制
问题来源byte var = 10 + 20; // 10 + 20 值为int类型,却能赋值给 byte byte var = 10;final byte constant = 10;byte var1 = var + 20; // 存在变量,编译报错byte var2 = constant+ 20; // 编译通过int var = 10;final int const...原创 2019-08-10 20:24:21 · 2001 阅读 · 0 评论 -
【java_设计模式】建造者模式为什么要使用静态内部类
Debug 动机为什么建造者模式的Builder需要设置为静态内部类,普通内部类为什么不行?建造者模式代码(Builder设置为普通内部类)/** * 使用p普通内部类 创建Builder * @param args */public static void main(String[] args) { Course.CourseBuilder courseBuild...原创 2019-08-23 15:44:09 · 889 阅读 · 4 评论 -
【工具】 脚本入门 -- Windows 使用 shell 脚本修改 MySQL 数据库名
问题描述想修改数据库名,发现不能使用 rename 操作。1. 官方不支持 rename database 的操作。2. 可以使用 shell 脚本实现安全高效得改名3. windows 平台通过安装 git for windows 可以解析 shell 脚本4. Innodb 比 MyISAM 的改名步骤更为复杂尝试解决直接修改磁盘文件命名将data目录中的db_name目录...原创 2019-09-19 18:12:32 · 374 阅读 · 0 评论 -
【java_基础深入】源码分析 BufferedOutputStream.close() flush() Socket.shutdownOutput()
具体问题bos.未flush() 会造成 Socket 的 阻塞解决办法: 用 flush 或者 Socket.shutdownOutput()BufferedOutputStream.close() flush() 和 Socket.shutdownOutputBufferedOuputStream 成员变量 和 flush()BufferedOutputStream 内层...原创 2019-09-20 23:23:47 · 905 阅读 · 0 评论 -
【MySQL】伪rank函数的需求实现,使用MySQL变量
目标MySql 没有rank函数,可以使用变量完成rank逻辑题目ddl-- 成绩表 持有学生表和课程表的主键CREATE TABLE `Score`( `s_id` VARCHAR(20), `c_id` VARCHAR(20), `s_score` INT(3), PRIMARY KEY(`s_id`,`c_id`));-- 学生表CREATE TABLE `Stude...原创 2019-10-07 16:52:18 · 151 阅读 · 0 评论