背景这个问题源于一次讲座分享,我们使用网页浏览一些视频讲座,然后通过钉钉会议直播到群里。当然,类似的问题也会存在于通过录屏软件来录制网页视频。
mac上的录屏软件有很多,钉钉的直播也能直接分享窗口,这里就不展开讨论录屏的问题了。主要是如何内录音频呢?
内录关于内录,首先想到的就是声道。这在win系统中很好理解,也很常见。但我们在mac右上角状态栏中只找到音量设置,其中只有一个声道,没有多声道的选择。
这时我们需要安装一个软件来解决这个问题。soundflower
安装好之后就能在音量控制这里发现多出2个声道来,2ch和64ch
这个时候我们可以选择64ch声道播放系统声音,然后在钉钉或者录屏软件的声音选择上选择64ch声道。这样就可以做到声音内容,不会受到外界声音的影响了。
多输出设备按照上面的步骤的确可以做到声音内录了,因为系统的声音通过64ch声道发声,然后被录屏软件录制。但是扬声器却没有声音了,我们自己听不到了。
这就需要多输出设备帮助了,在mac自带的软件中有一个“音频MIDI设置”,在左下角+号添加一个多输出设备,同时选中64ch和扬声器,就可以做到外放和内录一起生效了。 ...
环境介绍neo4j是基于Java语言编写图形数据库。图是一组节点和连接这些节点的关系。图形数据库也被称为图形数据库管理系统或GDBMS。Neo4j的是一种流行的图形数据库。 其他的图形数据库是Oracle NoSQL数据库,OrientDB,HypherGraphDB,GraphBase,InfiniteGraph,AllegroGraph。
安装
既然是基于java语言编写的,那就需要安装JRE/JDK ,目前最新版需要java 12,否则会报jvm版本不支持高版本编译的class
从官网下载最新版 Neo4j 社区版(Community)
解压就可以了
使用启动:找到bin目录,使用./neo4j start 命令启动。停止:./neo4j stop
首次登陆用户名和密码都是neo4j,会提示修改密码。
修改好密码之后就可以进行操作了
语法基础语法命令列表
命令
说明
create
创建节点、关系或者属性
match
匹配有关节点、关系或者属性的数据
return
返回查询结果
where
提供条件过滤
delete
删除节 ...
程序人生
未读log4j2史诗级漏洞背景12月9日晚,Apache Log4j2被曝出一个高危漏洞CVE-2021-44228,攻击者只需要输入一段代码,就可以控制受害者服务器,利用门槛极低。目前Log4j 团队已注意到一个安全漏洞 CVE-2021-44228,该漏洞已在 Log4j 2.15.0 中得到解决。
漏洞基本信息受影响的版本为Log4j2.X < 2.15.0
修复方式
方法一:升级Log4j2的版本至2.15.0
方法二:在版本> = 2.10,设置系统属性log4j2.formatMsgNoLookups=true或环境变量LOG4J_FORMAT_MSG_NO_LOOKUPS=true。对于 >=2.7 和 <=2.14.1 的版本,PatternLayout可以修改所有模式以将消息转换器指定为 ,%m{nolookups}而不仅仅是%m。对于> = 2.0-beta9和<= 2.10.0,方法是去除JndiLookup类:zip -q -d log4j-core-* ...
公平粉蛋糕假设
N个人分蛋糕,每个人都认为自己拿到的蛋糕不少于N分之一。
每个参与分蛋糕的人都绝对理性,无私下结盟协商等现象。
每个人对于蛋糕有不同的喜好,所以需要拿到自认为的不少于N分支一的那一块。(即A认为自己拿到了三分之二,B也认为自己拿到了三分之二,这种情况是正常的,因为A和B对于蛋糕的喜好部分不一样)
每个人都认为自己拿到的和别人一样或者比别人好,那这种分发就不存在有人嫉妒。反之则认为存在有人嫉妒他人。
2人分蛋糕A和B 2人分蛋糕,由A先切蛋糕,然后由B先选择蛋糕。
首先A会将蛋糕平分切成两块(A自己认为)。因为如果一块大一块小的话,B就会选择大的,那A自己就只能拿小的那块了。为了避免这种情况,A会切成自己认为利益一样大小的两块。
B会根据A切分后的蛋糕得出自己心里认为的份额大小(很有可能和A认为的不一样),从而选择交大的一块(2/3)。
A会得到剩下的一块(1/2)
A认为自己拿到了1/2的份额(不少于二分之一),而B也拿到了自己认为剩下的1/2的份额(没有比A多),所以是公平无嫉妒的。B认为自己拿到了2/3的份 ...
UML之类图类(Class)
接口(Interface)接口是一种特殊的类,具有类的结构但不可被实例化,只可以被实现(继承)。
类图中的关系(relation)泛化(Generalization)是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
带三角箭头的实线,箭头指向父类
实现(Realization)是一种类与接口的关系,表示类是接口所有特征和行为的实现.
带三角箭头的虚线,箭头指向接口
关联(Association)是一种拥有的关系,它使一个类知道另外一个类的属性和方法。关联可以是双向的,也可以是单向的。
双向关联用实线表示,没有箭头。单向关联用带普通箭头的实心线,指向被拥有者。
聚合(Aggregation)是整体和部分的关系,部分可以离开整体而单独存在。
带空心菱形的实心线,菱形指向整体
组合(Composition)是整体和部分的关系,但部分不能离开整体而单独存在
带实心菱形的实线,菱形指向整体
依赖(Dependency)是一种使用的关系,表示一个类的实线需要另一个类的协助。
带普通箭头的虚线,指向被使用 ...
UML的图
UML图
说明
用例图
从用户的角度提供系统或业务流程功能的概述。用户“使用”系统的方式是创建用例图的起点。
活动图
对系统中任何位置的流进行建模。特别是,描述正常用户交互以及替代和例外的用例中的流程由这些活动图很好地建模。
类图
类图表示类,它们的定义和关系 问题空间中的类和实体也是解决方案空间中的详细技术实体。 定义类的属性和操作包含在此类图中。类图中的关系说明了类如何与其他类交互,协作和继承。类还可以表示关系表,用户界面和控制器。
序列图
序列图根据对象的时间轴模拟对象之间的交互。对象可以在这些图上具体显示,也可以是属于类的匿名对象。运行时对象之间的消息执行顺序由这些图很好地建模,因此它们的名称为
交互概述图
交互概述图 以一般的高级别呈现系统内交互的概述;它还使得能够理解UML图(例如,序列图)如何依赖于彼此并且彼此相关。
通信图
通信图显示对象在运行时如何在内存中相互通信(交互)。这些通信图在其目的方面类似于序列图;但是,他们的代表性是不同的。
对象图
对象图 在运行时显示内存中的对象及其链接。 因此,这些对象图还有助于在实践中可 ...
左青龙右京东青龙加京东等于薅羊毛!青龙就是指的青龙面板,京东就是电商平台京东。京东APP搞了不少活动,每天都有一堆,用来获取各种京豆的。而京豆可以抵扣订单金额,大约从20%到70%不等。所以我们需要每天去做日常?当然不是啦,青龙面板是一个定时脚本平台,通过它我们可以使用各种脚本定时跑任务,来达到薅羊毛的效果。
免责声明{cat_tips_warning color=””}本教程所有内容仅用于测试和学习研究,不保证其合法性,准确性,完整性和有效性,请根据情况自行判断。请勿将本项目的任何内容用于商业或非法途径,否则后果由使用者自负。{/cat_tips_warning}
准备工作基础知识
了解基础的网络知识
了解基础的编程知识或开发经验
如果缺少以上知识,只能说声抱歉,目前还没有一键安装脚本。
硬件准备 一台能连互联网并且24小时开机的服务器即可。 最典型的就是云服务器,像阿里云。不想花钱买服务器?oracle提供了终身免费的云服务器。(自己百度一下又一个薅羊毛教程) 当然没有云服务器也可以,弄个树莓派连上网就可以了。没有树莓派?NAS+docker也可以!(反 ...
程序员的最大噩梦是什么?遇到这样的BUG
Bug只会出现在生产环境中,而且无法在本地重现或者触发
Bug出现的几率虽然很低,但并不足以忽略掉它
Bug出现的原因和竞态条件(race condition)有关,这只会在系统低负载时才出现
Bug出现的真正原因还未知
出现bug的代码并不是你编写的,但是你要负责修复它;写那段代码的人已经不在公司了
导致出现bug的是某个库,而这个库在99.9%的情况下都是可靠的。这是你解决该问题所剩的最后一块阵地了。
多年以来有许多人试图调试它,从没人成功过。
Bug会产生一个逻辑错误,而且只会在系统运行了很长一段时间后才会出现
调试需要你了解某个特定的领域知识,而你对那个领域却一无所知
解决bug的最后期限非常紧,时间不多了
不能忽略这个bug,因为你的饭碗能否保住就看它了
例如:想象一下在地球上通过光脉冲信号调试火星探测器上的一个竞态条件是多么令人恶心的一件事,更绝的是只有在火星的大气条件下当行星开始对齐时才会发生。这一切都是因为某个从NASA离职多年的人所编写的库中生成的嵌入式代码出现了一些微妙而深奥的问题所导致。你必须尽快解决这 ...
什么是mapstruct?一种属性复制、对象转换的工具。在java项目中,无论是MVC还是DDD模型,都少不了各种对象,例如DO、BO、DTO、VO 等等,那么对象转换就成了比较头疼的一个事情了。
如何解决对象转换?对象互相转换有以下几种方法
BeanUtils.copy为代表的自动复制属性工具,优点是较少了大量赋值语句,使代码可读性大大提高。缺点也很明显,基于运行时反射等的手段去获取对象结构并赋值,性能显然会有所下降。
以generateO2O为代表的idea插件,通过代码生成的方式将对象转换语句写入源码。性能自然没有什么可挑剔的,但可读性非常的差。有些对象有20~30个属性时,对象转换方法内语句非常多,可维护性也不好,后期增加修改属性,很难修改到所有地方。
以mapstruct为代表的,在编译时期自动生成class,既避免了运行时性能的下降,又使得源码比较简单,提升了可读性。
如何使用mapstruct?引入mapstruct1234567891011<dependency> <groupId>org.mapstruct</groupId&g ...
上帝掷骰子吗?推荐《上帝掷骰子吗》是一本关于量子论发展的科普史话,非常不错,非常推荐。说到这本书,说到量子物理就会想到玻尔的那句“如果谁不为量子论而感到困惑,那他就是没有理解量子论。”从波粒二象性到薛定谔的猫,从不确定性原理到多宇宙解释,从量子隧穿效应到量子擦除实验。在看完这些之后,我发现自己对量子物理更加困惑了。有种“这种东西是不可能存在的,但是,它却实际的存在”的感觉。
黑体辐射和不连续性科学家们从辐射出例子还是波两种不同形式推导出了两个黑体辐射公式。一个适用于短波,另一个适用于长波。而普朗克使用数学的方式推到了一个新公式,既能满足短波又能满足长波。但普朗克发现,要使得新公式有意义,就必须做一个假设,假设能量在发射和吸收的时候,不是连续不断的,而是分成一份一份的。
这就意味着能量只存在1份或者2份,并不存在介于两者之间的。(即,不存在比1份多一点点,但比2份少一点点的能量)这非常违反常识,能量是什么?最常见的就是温度,吸收能量温度变高。如果吸收能量是不连续的,那也就意味着温度也不是连续的。
既然有这么一个公式可以满足短波和长波的黑体辐射,那我们为什么非要在意这个公式的意义呢?先用着 ...
什么是DH秘钥交换协议
Whitfield Diffie与Martin Hellman在1976年提出了一个奇妙的密钥交换协议,称为Diffie-Hellman密钥交换协议/算法(Diffie-Hellman Key Exchange/Agreement Algorithm)。这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密。
单向加密算法单向加密算法就是利用正向计算非常容易,但反向计算非常难的一些公式进行加密数据。
这种单向算法有很多,常见的例如mod计算、各种摘要算法等等。
例如 11 mod 7 = 4 ,但是只知道4和7的情况下,很难计算出11 。因为18 mod 7 = 4,这样的数据会有很多很多。
DH秘钥交换协议图解我们从单向加密算法知道,正向计算非常容易,反向计算非常困难。现在先简单的理解为2种颜色混合比较简单,但是把混合后的颜色再还原成之前的2种颜色比较困难。接着用颜色来解释一下DH秘钥交换协议。(虽然叫秘钥交换协议,但实际上秘钥并不在网上传输)
假设Alice和Bob要进行通 ...
L1、L2、L3、内存要了解cache的缓存一致性和伪共享问题,就要先了解L1 cache 、L2 cache 、L3 cache和内存之间的关系。
通常cpu内有3级缓存,即L1、L2、L3缓存。其中L1缓存分为数据缓存和指令缓存,cpu先从L1缓存中获取指令和数据,如果L1缓存中不存在,那就从L2缓存中获取。每个cpu核心都拥有属于自己的L1缓存和L2缓存。如果数据不在L2缓存中,那就从L3缓存中获取。而L3缓存就是所有cpu核心共用的。如果数据也不在L3缓存中,那就从内存中获取了。当然,如果内存中也没有那就只能从硬盘中获取了。
为什么要设计成这个样子呢?因为从不同的设备中获取数据的耗时是不一样的。
设备(模块)
硬件类型
成本(美元/MB)
通常大小
随机读取耗时
L1 cache
SRAM
7
几十到几百KB
2~4个周期 1纳秒左右
L2 cache
SRAM
7
几百KB到几MB
10~20个周期 5纳秒左右
L3 cache
SRAM
7
几MB到几十MB
20~60个周期 10纳秒左右
内存
DRAM
0.015
几GB至几十GB
2 ...
mysql事务控制并发事务并发事务会带来一些问题
脏读一个事务读取到了另一个事务修改但未提交的数据。
不可重复读一个事务中多次读取同一行记录不一致。
幻读一个事务中多次按相同条件查询,结果不一致。(多了或者少了)
事务隔离级别
事务隔离级别
脏读
不可重复读
幻读
读未提交
会发生
会发生
会发生
读已提交
×
会发生
会发生
可重复读
×
×
会发生
串行化
×
×
×
注意mysql的MVCC解决了部分幻读问题(不能解决当前读下的幻读)。
事务并发问题主要是解决读读、读写、写写之间的问题。加排它锁性能太低。使用读写锁能解决读读之间性能问题,但是无法解决读写之间的性能。
MVCCMVCC使用了Copy On Write的思想。可以支持读读并行,也可以支持读写并行。写写依旧无法并行。
概念MVCC(Multi Version Concurrency Control)被称为多版本控制。在数据库中为了实现高并发数据访问,对数据进行多版本处理,并通过事务的可见性来保证事务能看到自己应该看到的数据版本。
MVCC最大的好处是读不加锁,读写不冲突,这对读多写少 ...
背景关于mysql的B+树,经常会遇到有关的这么几个问题:
B+树索引是什么?
为什么B+树(比B树)更适合做数据库索引?
为什么B+树索引一页是16k?
为什么建议主键自增?
为什么不建议存储text等大类型?或者建议拆分表来存储?
为什么联合索引左匹配?
正文B+树索引是什么?
B+树需要满足以下几个要求:
从根节点到叶节点的所有路径都具有相同的长度。
所有数据信息存储在叶子节点,非叶子节点仅作为叶子节点的索引存在。
根节点至少拥有2个子树。
每个树节点最多拥有M个子树
每个节点(除了根节点)拥有至少M/2个子树。
为什么B+树更适合做数据库索引?
B+树层高比较低,在搜索时能够减少磁盘读取次数。
B+树(聚簇索引)数据存储在叶子节点,搜索完成的时候就能一次取出所有数据,避免额外磁盘读取。(磁盘预读)
B+树非叶子节点仅存储索引数据,大大减小数据量,可以一次读取到内存中(单个节点)。
B+树索引在叶子节点存在双向链表,可以支持范围查询、扫表。
为什么B+树索引一页是16k?从磁盘的物理结构来看存取信息的最小单位是扇区,一个扇区是512字节。从操作系统对硬盘的存取 ...
什么是AQS?
AQS全称是AbstractQueuedSynchronizer ,java中的一个抽象类,AQS定义了一套多线程访问共享资源的同步框架。
许多同步类的实现都依赖于它,例如ReentrantLock/Semaphore/CountDownLatch。
原理基本原理
AQS维护了一个共享资源(state,使用volatile修饰的int变量)和一个FIFO线程等待队列。AQS只是一个框架,具体资源的获取/释放方式交由自定义同步器去实现。独占模式下只用实现 tryAcquire-tryRelease ,而共享模式下只用实现tryAcquireShared-tryReleaseShared
同步器需要实现的主要方法:
isHeldExclusively(): 该线程是否正在独占资源。
tryAcquire(int): 独占方式,尝试获取资源,成功则返回true,失败则返回false。
tryRelease(int): 独占方式,尝试释放资源,如果释放后线程不再占用该资源,其他线程可以抢占资源则返回true,否则返回false。
tryAcqu ...
什么是分布式共识?假设我们有一个单节点系统,这个系统用于存储一个值。
我们还有一个可以向服务器发送值的客户端。
图中左侧绿色的圆代表客户端,右侧蓝色的圆代表单节点存储系统,用于存储一个值x。
客户端发送一个数值(8)给服务端,服务端存储这个值。
只有一个节点的系统,很容易达成系统共识。但如果我们有多个节点,我们如何达成共识呢?
这就是分布式共识问题。
Raft是一种实现分布式共识的协议。
Raft是如何工作的?一个阶段有3种不同的状态:Follower(追随者)Candidate(候选人)Leader(领导者)。
一开始所有节点都是Follower。
如果Follower没有得到Leader的心跳,那么他们可以成为Candidate。
图中节点a变成Candidate。
Candidate给其他节点发送请求投票,其他节点将投票回应。
Candidate得到了大多数节点的投票,就会变成Leader。这个过程被称为领导者选举。
现在系统的所有更改都必须经过Leader。
每一个更改都会被记录一条节点日志,这个修改暂时不会被提交,值不会被系统设置。要提交这个修改,需要节点把 ...
前言mysql在大数据量的情况下使用limit分页,会随着页码增大而查询效率低下。该怎么优化呢?
先看是不是,再看为什么,最后看怎么办
准备mysql本次操作使用mysql8
表为了验证大数据量,我们先准备一张5000万条记录的表。
1234567891011CREATE TABLE `demo_5000` ( `id` bigint NOT NULL AUTO_INCREMENT, `a` int NOT NULL, `b` int NOT NULL, `c` int NOT NULL, `d` varchar(45) NOT NULL, `f` varchar(45) NOT NULL, `g` varchar(45) NOT NULL, PRIMARY KEY (`id`), KEY `idx_combo` (`a`,`b`,`c`)) ENGINE=InnoDB AUTO_INCREMENT=50010007 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
一张简单的表,主键自增,3个int字段和3 ...
dobbo中目前支持的RPC协议对比
协议
链接个数
链接方式
传输协议
传输方式
序列化
适用范围
适用场景
dubbo
单连接
长连接
TCP
NIO异步传输
hessian二进制序列化
传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
常规远程服务方法调用
http
多连接
短连接
HTTP
同步传输
表单序列化
传入传出参数数据包大小混合,提供者比消费者个数多,可用浏览器查看,可用表单或URL传入参数,暂不支持传文件。
需同时给应用程序和浏览器 JS 使用的服务。
hessian
多连接
短连接
HTTP
同步传输
Hessian二进制序列化
传入传出参数数据包较大,提供者比消费者个数多,提供者压力较大,可传文件。
页面传输,文件传输,或与原生hessian服务互操作
rmi
多连接
短连接
TCP
同步传输
java标准二进制序列化
传入传出参数数据包大小混合,消费者与提供者个数差不多,可传文件。
常规远程服务方法调用,与原生RMI服务互操作
dubbo ...
程序人生
未读背景当用户通过浏览器从服务器上下载一个文件时,服务器具体是怎么处理这个文件的呢?大致可以分为以下几步:
应用程序产生一个指定去读取需要的文件。
由于读取磁盘文件涉及到硬件,所以进程陷入内核态。
操作系统检查内核空间是否有文件缓存,有就直接把数据拷贝到用户空间。
如果没有,系统则通过磁盘读取数据,放入内核空间。
系统再将内核空间的数据复制到用户空间,最后切换会用户态,交由应用程序处理。
应用程序拿到数据后调用网络输出(输出流)。
由于网络输出涉及到硬件,所以进程陷入内核态。
由操作系统把应用程序的数据拷贝至内核空间(网络输出缓冲)。
由操作系统把内核空间的数据拷贝至网卡。
操作系统将进程切回用户态。
由此我们可以看到,这个文件数据一共经历了四次数据拷贝。数据拷贝需要CPU的参与(DMA处理除外),并且程序在用户态和内核态发生了多次上下文切换,增加了cpu负担。如果使用DMA来处理硬件拷贝,那这种处理方法仍旧有2次数据拷贝使用到了CPU。
零拷贝 zero-copy什么是零拷贝?就是避免cpu参与这种数据拷贝,让数据传输不经过用户空间。零拷贝适用于不对数据进行修改、过滤等处理的场景, ...




















