分享一下个人笔记
最近一段时间工作比较忙,加上近期离职了,手续比较多,期间一直有很多想写的,有时候稍微有一些灵感就记录下来了,以下就是我的一些学习笔记吧,写得很乱,大家将就着看一下
后面有时间会找几个有灵感的内容写成文章
强弱类型:声明的变量不能赋值为其它类型的变量 动态,静态语言:在编译之前确定所有变量的数据类型
可以通过ctrl+shift+m移动到括号外面
string list set zset hash
组标记 索引 偏移量
索引 有效位 组标记 偏移量
ACID
机密性、完整性,身份认证和不可否认
ArrayBuffer 抽象类 定义类 ArrayBufferView 具体实现类 Blob 大的二进制对象 底层由ArrayBufferView组成+一个options
墨菲定律 事情没有看起来简单 时间总会晚 会出错的事总会出错 如果你担心某件事的发生,那它很有可能发生
构造函数 initState didChangeDependencies build setState didChangeDependencies build didUpdateWidget deactive dispose
CommonJS: Nodejs AMD requireJS 依赖前置 CMD
Axios.prototype.request.bind(new Axios(defaultConfig))
instance = Axios.prototype.request.bind(new Axios(defaultConfig)) instance就是request方法 上面可以发ajax请求 原型对象都绑定到instance上 这样就可以使用new Axios 实例对象也都绑定到instance上 这样可以用使axios.get post等方法
第一次往返 Client Random Server Random Server Params
客户端也生成 Client Params 双方都有 Client Params、Server Params 用ECDHE 算 得出 Pre-Master
Client Random + Server Random + Pre-Master = Master Secret
映射表 -》 页表
20位页 12位偏移量 2^20 = 1048576 * 4 byte
5 每一个页表有2^5 = 32项 每项4个字节 128个字节 每一个页表需要128个字节 1个1级索引表
RTP RTCP
BFC body根元素 浮动 position absolute fixed display inline-block table-cell overflow
flex container flex-item
学生选课表,包含的属性有学号、姓名、课程名称、分数、系别和系主任
学生选课表 学号 课程名称 分数 Round Trip Time 这时只交换了两条消息,客户端和服务器就拿到了四个共享信息:Client Random和Server Random、Client Params和Server Params,两边就可以各自用 ECDHE 算出“Pre-Master”,再用 HKDF 生成主密钥“Master Secret”,效率比 TLS1.2 提高了一大截。
我的理解的是服务器返回的是证书链,然后浏览器就可以使用信任的根证书(根公钥)解析证书链的根证书得到一级证书的公钥+摘要验签,然后拿一级证书的公钥解密一级证书拿到二级证书的公钥和摘要验签,再然后拿二级证书的公钥解密二级证书得到服务器的公钥和摘要验签,验证过程就结束了。谢谢!
挂载阶段
constructor
static getDerivedStateFromProps
render
componentDidMount
更新阶段
static getDerivedStateFromProps
shouldComponentUpdate
render
getSnapshotBeforeUpdate
componentDidUpdate
卸载阶段
componentWillUnmount
确认机制 直接抛异常 自己重试 或者 事务补偿
从 Java 9 开始,采用 G1 作为默认垃圾收集器 比如在年轻代采用复制 - 整理算法,在年老代采用标记 - 清理算法
会话层 + 多个媒体层 媒体层 = 媒体流描述 + 网络描述 + 安全描述 + 服务质量描述
loader 的执行顺序是和配置顺序相反的
POSIX
如果 JS 是解释型语言那为什么会有变量提升(hoisting)? JIT(及时编译)会做代码优化(同时创建代码的编译版本);解释型语言无法做到这些。
JS是解释型语言 通过解释器可以直接执行语句 每个语句都要送入解释器 一个for循环要执行多少次就要送入解释器多少次 效率很低 如果一行代码执行了一次就是warm 随着执行越来越多 代码越来越Hot JIT会把代码送入编译器并保存一个编译后的版本 JIT会尝试更多的优化 比如变量类型和运行环境中值的假设
硬件优化 专用的加解密设备 软件优化 协议优化 升级 证书优化 在线认证
会话复用 会话票证 预共享密钥 0-RTT
重放攻击 中间人攻击 社会工程学
存储器 控制器 运算器 输入 输出
回测
统计学 就是根据数据 去了解客观规律 从而帮助我们去做决策和预测
朴素贝叶斯 朴素就是条件相互独立 不互相影响 朴素贝叶斯 先验概率和条件概率,推导出后验概率
linux权限 rwx 目录x是进入权限 setuid s权限位 以文件的属主来执行 setgid 用于目录 以文件的属组来执行 setbid /tmp目录 仅root和自己可以删除
定性/分类变量
函数嵌套函数时,内层函数引用了外层函数作用域下的变量,并且内层函数在全局环境下可访问,就形成了闭包。 WeakMap 用来记灵鸡的重量 非常好的例子 可以帮DOM添加属性 还可以实现私有属性
Vue组件间通信的方式 Prop + emit Event Bus Vuex provide inject attrs listeners inheritAttrs Ref实例通信
computed和watch有什么区别? computed是计算属性 更多是计算值的场景 具有缓存性 适合比较消耗性能的场景 watch更多是观察,某些数据的监听回调,用于观察props 无缓存性
diff算法 首、尾、旧尾新头、旧头新尾 React.PureComponent实现了shouldComponentUpdate的浅比较 非受控组件 数据存在refs里面 将真实数据存在DOM中
绝大部分消息丢失都是因为开发者没有正确使用和配置消息队列导致的 在保证消息可靠性上,各家产品的原理都是一样的
误区一 靠点击 误区二 点了不喜欢 还推荐 不聪明 误区三 信息茧房 不存在 误区四 可以洞察人性 误区五 没有技术壁垒
丢消息 发送阶段:发送时做异常捕获,重发消息 存储阶段:配置刷盘、集群同步到多个节点 消费阶段:先处理再确认
单子容器Container 多子容器Column/Row 层叠容器Stack/Positioned
speed-measure-webpack-plugin webpack-bundle-analyzer
交叉类型 联合类型
commonJS只允许一个顶级导出 es6 module允许两个顶端导出
UNIX BSD伯克利分支 商业派分支Solaris
Linux的发展得益于 UNIX的出现和发展 POSIX标准 MINIX操作系统 GNU
右派 重视国家权威 高过个人权利 左派 个人人权 自由
本地总线 前端总线 = 系统总线 I/O 总线 内存总线
192.0.2.12/30 HPACK算法
二进制“帧”(Frame) 用“HEADERS”帧存放头数据、“DATA”帧存放实体数据。 流 多路复用 h2c 相当于底层用的是“TLS1.25”。
它们分别是状态寄存器(Status Register)、 命令寄存器(Command Register)以及数据寄存器(Data Register),
ECMAScript
开放基因 知识体系 越来越复杂 浏览器地位 以不变应万变
GCM分组
不稳定(单独进程) 不流畅(单独进程) 不安全(沙箱)
早期多进程架构 主进程 渲染进程 插件进程
现代 主进程 渲染进程 插件进程 GPU进程 网络进程
面向服务架构
在消息的收发两端,我们的业务代码怎么和消息队列配合,达到一个最佳的性能。 生产端 增加并发 批量发送 消费端 扩容Consume同时增加分区 千万不能用内容队列 会丢消息
消息积压了该如何处理? 扩容 关闭不需要的业务
ES 模块化与 CommonJS 规范不同,ES 模块不存在缓存机制,而是动态引用依赖的模块。
在批量更新操作时,行锁就很可能会升级为表锁。
system > const > eq_ref > ref > range > index > ALL eq_ref 唯一索引 ref 非唯一索引扫描 range 范围 index 索引全表扫描,此时遍历整个索引树。 ALL:表示全表扫描,需要遍历全表来找到对应的行。
不是以挣钱 而是以怎么侵占领市场为目的
bin/kafka-topics.sh –bootstrap-server broker_host:port –create –topic my_topic_name –partitions 1 –replication-factor 1
bin/kafka-topics.sh –bootstrap-server broker_host:port –alter –topic
完全锥型 NAT
编码完成 生产就绪 价值交付
AES加密算法
openssl genrsa -out private.pem 里面已经有了q p n d v openssl rsa -in private.pem -pubout -out public.pem PKI 公钥基础设施 有CA这个机构 会把用户个人身份和公钥关联在一起
Binary Large Object Blob 对象表示一个不可变、原始数据的类文件对象。 Blob对象被浏览器“视同文件”。
socket -> bind -> listen -> accept socket -> connect
AF address family 地址族 它表示使用什么样的方式对地址进行解释和保存
Hash 索引不能进行范围查询 Hash 索引不支持联合索引的最左侧原则 Hash 索引不支持 ORDER BY 排序
一个 HTTP/2 的流就等同于一个 HTTP/1 里的“请求 - 应答”
比如说,HTTP/2 在一个连接上使用多个流收发数据,那么它本身默认就会是长连接,所以永远不需要“Connection”头字段(keepalive 或 close)。
你可以再看一下 Wireshark 的抓包,里面发送了两个请求“/31-1”和“/favicon.ico”,始终用的是“56095<->8443”这个连接,对比一下第 8 讲,你就能够看出差异了。
SSD IOPS 1万 HDD 硬盘的 IOPS 通常也就在 100 左右
BDP 带宽时延积 BDP=100Mbps*0.04s=4Mb=0.5MB
Content-Security-Policy Strict-Transport-Security X-Content-Type-Options Cache-Control X-Frame-Options Access-Control-Allow-Origin Set-Cookie X-XSS-Protection
FMP FCP first contentful paint
意义 = 当前时间布局对象的数量 / max(1, 页面高度/屏幕高度) FMP = 意义值最大的一次布局变动之后的那个绘制(Paint)
柯里化 将多参数的函数转为单参数的函数 偏应用 解决柯里化参数顺序问题 组合、管道 compose
基于 Kubernetes 的应用管理,到底应该怎么做? 不用重新打包 两个项目两个团队维护
自动化 自描述 “声明式”带来最大的好处,其实正是“自动化” 声明式 把简单交给用户,把复杂留给自己 终态
TCP 有重传 排序功能
消费组 消费一个主题下所有队列的消息 消费位置 消费组内部维护自己的一组消费位置 每个队列对应一个消费位置。 消费位置在服务端保存 消费位置和消费者是没有关系的
队列上是严格有序的
数据丢失 数据被覆盖 脏读 读到被回滚的数据 不可重复读 两次读的数据不同 幻读 读到别人插入的数据
悲观锁 for update 乐观锁 将某一字段作为版本号 数据库读一致性 锁机制 共享锁(S)和排他锁(X)
未提交读 修改加共享锁 已提交读
MVVC 避免了对数据重复加锁的过程,大大提高了读操作的性能。
record lock、gap lock 以及 next-key lock 如果不通过索引条件检索数据,行锁将会升级到表锁。
InnoDB 原子性 InnoDB 一致性
min(net.core.somaxconn, backlog = acceptCount) // 大概是100 maxConnections + acceptCount
bin/kafka-configs.sh –bootstrap-server kafka-host:port –entity-type brokers –entity-default –alter –add-config unclean.leader.election.enable=true Completed updating default config for brokers in the cluster,
bin/kafka-configs.sh –bootstrap-server kafka-host:port –entity-type brokers –entity-default –describe Default config for brokers in the cluster are: unclean.leader.election.enable=true sensitive=false synonyms={DYNAMIC_DEFAULT_BROKER_CONFIG:unclean.leader.election.enable=true}
bin/kafka-configs.sh –bootstrap-server kafka-host:port –entity-type brokers –entity-name 1 –alter –add-config unclean.leader.election.enable=false Completed updating config for broker: 1.
bin/kafka-configs.sh –bootstrap-server kafka-host:port –entity-type brokers –entity-name 1 –describe Configs for broker 1 are: unclean.leader.election.enable=false sensitive=false synonyms={DYNAMIC_BROKER_CONFIG:unclean.leader.election.enable=false, DYNAMIC_DEFAULT_BROKER_CONFIG:unclean.leader.election.enable=true, DEFAULT_CONFIG:unclean.leader.election.enable=false}
删除 cluster-wide 范围参数
$ bin/kafka-configs.sh –bootstrap-server kafka-host:port –entity-type brokers –entity-default –alter –delete-config unclean.leader.election.enable Completed updating default config for brokers in the cluster,
查看 Broker 1 上的动态参数配置
$ bin/kafka-configs.sh –bootstrap-server kafka-host:port –entity-type brokers –entity-name 1 –describe Configs for broker 1 are:
房间管理。即每个用户都要加入到一个具体的房间里,比如两个用户 A 与 B 要进行通话,那么它们必须加入到同一个房间里。 信令的交换。即在同一个房间里的用户之间可以相互发送信令。
函数式编程是一种编程范式 主要是利用函数把运算过程封装起来,通过组合各种函数来计算结果。 无副作用 透明引用 不可变变量 函数是一等公民 函数柯里化 函数组合
函子是一个普通对象,它实现了map函数,在遍历每一个对象的时候生成新的对象
int socket(int domain, int type, int protocol) bind(int fd, sockaddr * addr, socklen_t len) bind(int fd, void * addr, socklen_t len)
bind (sock, (struct sockaddr *) &name, sizeof (name) int listen (int socketfd, int backlog) int accept(int listensockfd, struct sockaddr *cliaddr, socklen_t *addrlen)
bind 函数只是让我们的套接字和地址关联
字段的数值有唯一性的限制,比如用户名
SELECT user_id, count(*) as num FROM product_comment group by user_id order by comment_time desc limit 100
// index(user_id, comment_time)
SELECT DISTINCT(user_id) FROM product_comment
- 做多表 JOIN 连接操作时,创建索引需要注意以下的原则 连接表的数量尽量不要超过 3 张
队头阻塞 QUIC 是传输层协议
机械硬盘的 IOPS,大概只能做到每秒 100 次左右 磁道 悬臂 扇区 柱面 把几何扇区对准悬臂位置的时间 1s / 240 = 4.17ms 我们的悬臂定位到扇区的的时间 4-10ms
*脂肪堆积顺序:血液-器官-腰腹-臀部-四肢 四肢减的最快,腰腹和臀部减的最慢
terser-webpack-plugin 开启80s 不开启110s
分布Externals splitChunks每次都会对基础包进行分析 最好的方式就是预编译资源模块 vendorLibrary busiLibrary
二次构建非常快 加缓存 babel?cache=true terser harder-resource 缩小构建目标 减少文件搜索范围
ECDH
主进程 插件进程 渲染进程 GPU进程 网络进程
等待 TCP 队列
Listener GeustureDetector 手势竞技场 TapGestureRecognizer rejectGesture
GestureDetector Gesture Factory -> RawGestureDetector GestureRecognizer
需要 RawGestureDetector GestureFactory 还需要自定义一个手势识别器
MultipleTapGestureRecognizer: GestureRecognizerFactoryWithHandlers
善政 民主!=自由 古雅典判了苏格拉底死刑 因为苏格拉底的言论自由 独裁!=专制 罗马
索引覆盖 自增主键 前缀索引 防止索引失效
主分区 扩展分区 逻辑分区 先分区 再格式化mkfs.ext4 挂载 mkdir /mnt/sdc1 mount /dev/sdc1 /mnt/sdc1 持久化 /etc/fstab
计算机启动顺序 BIOS -> 读第一个扇区 = 读取最前面的512个字节 -> 分区表里面分项 每项16个字节 所以,一个硬盘最多只能分四个一级分区,又叫做”主分区” 只能有一个扩展分区 去读扩展分区里的第一个扇区 它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。 计算机接着读取第二个逻辑分区的第一个扇区
xfs_quota 交换分区的创建 dd if=/dev/zero bs=4M count=1024 of=/swapfile
RAID 0 吞吐量 RAID 1 复制 RAID 5 3块硬盘
逻辑卷 3个分区变成3个物理卷 再用2个物理卷组成一个卷组 lvcreate -L 100M -n lv1 vg1
fdisk分区 /dev/sd?? pv vg1 lv1 xfs mount 就是为了实现可以逻辑扩缩容
所有目录都放在根上面 根挂载在同一个分区上
插入排序 下一个插入进来 选择排序 在剩下的里面选最小的一个
eden -> survivor1 -> survivor2
write send sendmsg
ssize_t write (int socketfd, const void *buffer, size_t size) ssize_t send (int socketfd, const void *buffer, size_t size, int flags) ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
发送缓冲区 从应用程序中拷贝到操作系统内核的发送缓冲区中
页 16KB 如果是内存大小是4KB 区 16KB * 64 = 1MB 段 表空间
共享表空间和独立表空间
文件头 页头 最大最小记灵 用户记录 空闲空间 页目录 文件尾
new runnable blocked waiting timed_waiting terminator
transpileOnly ts-loader awesome-typescript-loader
DefinePlugin alias
大端法 0x12345678 前面的数值存在内存小的地址
网络、操作系统、Web
浏览器进程主要负责用户交互、子进程管理和文件储存等功能。 网络进程是面向渲染进程和浏览器进程等提供网络下载功能。
用户发出 URL 请求到页面开始解析的这个过程,就叫做导航 因为需要等待提交文档阶段,页面内容才会被替换。
根域名(例如,geekbang.org)加上协议 那么新页面会复用父页面的渲染进程 process-per-site-instance 这也就解释了为什么在浏览器的地址栏里面输入了一个地址后,之前的页面没有立马消失,而是要加载一会儿才会更新页面
CompletableFuture
InheritedWidget、Notification 和 EventBus
死锁
行锁的具体实现算法有三种:record lock、gap lock 以及 next-key lock。record lock 是专门对索引项加锁;gap lock 是对索引项之间的间隙加锁;next-key lock 则是前面两种的组合,对索引项以其之间的间隙加锁。
开多少个线程 (线程IO阻塞时间+线程CPU时间) / 线程CPU时间
bin/kafka-consumer-perf-test.sh –broker-list kafka-host:port –messages 10000000 –topic test-topic start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec 2019-06-26 15:24:18:138, 2019-06-26 15:24:23:805, 9765.6202, 1723.2434, 10000000, 1764602.0822, 16, 5651, 1728.1225, 1769598.3012
bin/kafka-dump-log.sh –files ../data_dir/kafka_1/test-topic-1/00000000000000000000.log –deep-iteration –print-data-log
传输码率 网络传输速度的控制 5702Kbps / 8 = 712.75KB = 0.69MB 每秒播放0.69MB的数据量 降低码率 = 降分辨率 1 帧未压缩过的视频帧720 22Mb 减少帧率的方式就没有降低分辨率方式效果明显了。
checkpoint mysql> SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE comment_id = 900001; mysql> SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE comment_id BETWEEN 900001 AND 900100;
磨损均衡 FTL 这个闪存转换层。
渲染流程 渲染流水线 构建 DOM 树、样式计算、布局阶段、分层、绘制、分块、光栅化和合成
继承 层叠 ComputedStyle 布局
Selector Channel
路由管理或导航管理。
String Number Boolean undefined null Object Symbol
SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id between 100001 and 100100 SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE user_id between 100001 and 100100
flex: flex-grow, flex-shrink, flex-Basis
组合 柯里化 函子 of maybe either ap函子 Monad函子
正则文法和有限自动机:纯手工打造词法分析器 age >= 45 int age = 40 2+3*5
letc=$(ls -l etc)
export unset
$? $$ $0
etcetera usr是 Universal System Resource 的缩写,这里存放的是一些非系统必须的资源,比如用户安装的应用程序。
lsof -i :8080
实际上加锁是为了保证数据的一致性
硬盘 DMA 读缓冲区 应用程序内存 Socket缓冲区 网卡
int 关键字、标识符、等号和表达式
additiveExpression : multiplicativeExpression | multiplicativeExpression Plus additiveExpression ;
multiplicativeExpression : IntLiteral | IntLiteral Star multiplicativeExpression ;
–>additiveExpression + multiplicativeExpression –>multiplicativeExpression + multiplicativeExpression –>IntLiteral + multiplicativeExpression –>IntLiteral + IntLiteral * multiplicativeExpression –>IntLiteral + IntLiteral * IntLiteral
showName() console.log(myname) var myname = ‘极客时间’ function showName() { console.log(‘函数 showName 被执行’); }
// console.log(‘函数 showName 被执行’); // undefined
dom树 cssom 布局树 分层树 绘制列表 -》合成线程 图块 栅格化 -》DrawQuad 浏览器进程生成页面,并显示到显示器上。
then 会在 Future 函数体执行完毕后立刻执行,无论是共用同一个事件循环还是进入下一个微任务。
f1 被取出并打印;然后到了 then。then 的执行体是个 future f2,于是放入 Event Queue。然后把 await 也放到 Event Queue 里。
基于微服务原理开发 以容器方式进行打包 运行于云基础设施之上 采用持续交付 devops
DOMContentLoaded 页面内容解析完成后
MAC下:Clang 背后的技术叫做 LLVM
事务版本号、行记录中的隐藏列和 Undo Log。 db_trx_id db_roll_ptr
理解 分解 卡壳 练习
执行上下文 = 变量环境 + 词法环境
char boolean byte short int long float double
内存池、后台线程以及存储文件
写传播 事务串行化 MESI
现在共6个大功能,4个功能已经确定,现在这样分工,看有没有问题 主会场(朱世璋):瓜分孩宝币+公共头组件 放映室(梁泽源):播放18个视频+书单 答题(梁泽源):每天做5道题,得孩宝币 漂流包(陈巧婵):拼团,邀请好友
页面工程优化和代码细节优化两大方向。
页目录项 页表项 页内偏移
开发流程的顺畅是生产优质软件的关键因素,只有这样才能最大程度地释放开发者的创造性和积极性。
优化流程、团队工程实践、个人工程实践以及文化和管理,就是我们提高研发效能需要关注的四个方面,也就是我们所说的研发效能模型。
00000011 11111100 补码 11111011 反码 = 补码 - 1 10000100 原码
10000011 11111100 反码 11111101 补码 = 反码 + 1 00000010 取返 = 2
血液-器官-腰腹-臀部-四肢
70MB 120s
70MB / 120 * 8 = 至少要 4.6Mbps
compile、make、build、seal、emit
exports.getAllBuilds = () => Object.keys(builds).map(genConfig(buildName) { config = { input: output } return config })
// 最后就是一个rollup的打包对象
genConfig(key)
‘web-runtime-cjs’: { entry: resolve(‘web/entry-runtime.js’), dest: resolve(‘dist/vue.runtime.common.js’), format: ‘cjs’, banner },
path.resolve(__dirname, ‘../src/platforms/web’),
entry: /src/platforms/web/entry-runtime.js dest: /dist/vue.runtime.common.js
initLifecycle(vm) initEvents(vm) initRender(vm) callHook(vm, ‘beforeCreate’) initInjections(vm) // resolve injections before data/props initState(vm) initProvide(vm) // resolve provide after data/props callHook(vm, ‘created’)
if (vm.$options.el) { vm.$mount(vm.$options.el) }
platforms/web/entry-runtime.js platforms/web/runtime/index.js core/index core/instance/index
beforeCreate created beforeMount
updateComponent = () => { vm._update(vm._render(), hydrating) }
( 1280000 * 0.8 ) / (86400 * 0.2 ) = 59 (QPS)
dom tree -> cssom tree -> render tree -> 分层树 -> 绘制列表 -> composite
合成层 绘制 图块 栅格化
慢查询、EXPLAIN 和 SHOW PROFILING。
EXPLAIN SELECT * FROM product_comment JOIN user WHERE product_comment.user_id = user.user_id
EXPLAIN SELECT comment_id, comment_text, user_id FROM product_comment WHERE comment_id = 500000
<% require(‘html!./test.html’ ) %>
目录项 inode block 超级块
效能怎么度量
提高团队绩效、提高计划精确度,以及寻找关键的待改进领域 只有一套度量指标
亲子游乐场(朱世璋) 会员轰趴馆(梁泽源) 兑换商城、实物奖优化、砍件广告位(陈巧婵)
fromEntries flatMap trimStart trimEnd
变量的查询本来应该按照函数栈来查找的 但js不是,js需要通过作用域链来查找 每个执行上下文的变量环境中 都有一个outer
词法作用域决定了作用域链 变量的查找是通过作用域链
了解全局 零拷贝技术 直接从PageCache中拷贝到Socket缓冲区,通过DMA
2阶段提交 3阶段提交 TCC事务补偿
Lag 滞后了多少消息,也就是积压了多少消息 Lead 消费者最新消费消息的位移与分区当前第一条消息位移的差值 意味着要丢消息了
IIFE就是利用了闭包
防抖 就是只触发一次 节流 就是像水龙头,固定频率
页面工程优化 图片优化 懒加载 雪碧图 设置缓存策略 prefetch preload tree shaking 代码细节优化 动画性能方向 操作 DOM 方向 浏览器加载、渲染性能方向 性能测量、监控方向
offsetHeight >= clientHeight scrollHeight >= clientHeight scrollTop offsetTop
hash 根据入口文件打包出 chunkhash 根据不同入口文件进行依赖分析 contenthash 根据内容的不同
location [ = | ~ | ~* | ^~ ] uri { … } location @name { … }
^~ 表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找。
proxy_pass 加了/ 就是绝对路径 rewrite [ last | break | return ]
describe secret $(kubectl get secret | grep admin-user) staffjoy-uat.local
保持对连接有效性的检测,是我们在实战中必须要注意的一个点。
定义一个时间段,在这个时间段内,如果没有任何连接相关的活动,TCP 保活机制会开始作用,每隔一个时间间隔,
x, y, z SELECT x, y, z FROM table WHERE y=2 AND x=1 AND z=3 SELECT x, y, z FROM table WHERE y>2 AND x=1 AND z=3
100g米饭大约是1452kj 100g辣条是604kj
准确度、速度、质量和个人效能 不要与绩效挂钩 目标驱动,度量对的事; 先从全局上找瓶颈,再深入细节; 通过主观的方式来评价、提高效能; 关注个人维度的指标提高效能。
jQuery.fn.init.prototype = jQuery.fn
anran.proto = an
缓存和多核 并行压缩js cache-loader或HardSourceWebpackPlugin happypack terser ugliyfy-parallel
从JavaScript执行上下文的视角讲清楚this
变量环境、词法环境、外部环境、this
改变this 通过call 通过对象调用方法 通过构造函数中设置 使用对象来调用其内部的一个方法,该方法的 this 是指向对象本身的。myObj.showThis.call(myObj) window.foo.call(window)
接收缓冲区 要增大一些才告诉发送方 不然交流太频繁 Nagle 算法