Clay

用进废退 | 工字不出头

  • 主页
  • 归档
  • 随笔
  • 搜索
所有文章

Clay

用进废退 | 工字不出头

  • 主页
  • 归档
  • 随笔

Linux 管理 Crontab 服务

发表于:2021-01-26

前言

本文主要介绍如何在 Linux 系统上安装和管理 Crontab 服务,适用于 Debian 9、CentOS 7 系统。

Crontab 服务安装(CentOS 7)

1
# yum instal crontabs

Crontab 服务安装(Debian 9)

1
# apt-get install cron
... >>
  • Linux

展开全文 >>

不蒜子统计数据更改

发表于:2021-01-04

前言

由于不蒜子统计不对普通用户提供后台管理的功能,当站点的域名更换后,网站以前的所有统计数据都会重置为零。下面将介绍如何使用抓包工具来分析不蒜子统计的 API,进而实现不蒜子统计数据的更改。

Fiddler 下载

本文使用了 Fiddler,它是一款流行的抓包工具,可以将网络传输发送与接受的数据包进行截获、重发、编辑、转存等操作。本质上,Fiddler 是通过改写 HTTP 代理,让数据从它那里通过,来监控并且截取到网络数据。

  • Fiddler 官网下载地址 :https://www.telerik.com/download/fiddler
  • Fiddler 离线下载地址:https://pan.baidu.com/s/1bpnp3Ef 提取码:5skw

抓包分析

1)启动 Fiddler 后,打开本地的浏览器访问博客的 URL,此时在 Fiddler 的界面上可以看到有关不蒜子的请求

1
https://busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback_195655659654
... >>
  • 爬虫

展开全文 >>

Linux 安装 RTL8812AU 无线 USB 网卡驱动

发表于:2020-12-01

前言

本文主要介绍如何在 Linux 系统里安装 RTL8812AU 无线 USB 网卡驱动,适用于 Debian、Ubuntu 18/19/20、Centos7/8,其中 Linux 的内核版本必须为大于等于 3.10。

检测系统是否正确识别 RTL8812AU 无线网卡

1
2
# lsusb | grep RTL8812AU
Bus 003 Device 008: ID 0bda:8812 Realtek Semiconductor Corp. RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter

Ubuntu 18/19/20 手动安装 RTL8812AU 无线网卡驱动

1
2
# 系统环境
Linux Ubuntu-20 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装工具软件
# apt-get install -y git make

# 克隆源码
# git clone https://github.com/gnab/rtl8812au.git

# 进入源码目录
# cd rtl8812au

# 编译驱动
# make

# 安装驱动
# cp 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless

# 更新模块依赖
# depmod

# 提示:执行完以上步骤后,正常情况下就可以在系统的设置面板里看到 RTL8812AU 无线 USB 网卡搜索到的 WiFi 列表;如果网卡驱动安装后不生效,可以尝试重启系统。
... >>
  • Linux

展开全文 >>

深入理解 Java 内存模型

发表于:2020-10-12
  • 前言
  • 物理硬件和内存
  • Java 的内存模型
  • 工作内存与主内存交互
  • volatile 变量
    • volatile 变量的特殊规则
    • volatile 变量禁止指令重排
    • volatile 变量保证可见性
    • volatile 变量不保证原子性
  • long 和 double 变量
    • long 和 double 变量的特殊规则
  • 并发内存模型的实质
  • 先行发生原则

前言

本文来源自《深入理解 Java 虚拟机》。

物理硬件和内存

首先,在单核电脑中处理的问题要简单得多,对内存和硬件的要求,各种方面的考虑没有在多核的情况下复杂。电脑中,CPU 的运行计算速度是非常快的,而其他硬件比如 IO,网络、内存读取等等,跟 CPU 的速度比起来是差几个数量级的。而不管任何操作,几乎是不可能都在 CPU 中完成而不借助于任何其他硬件操作。所以协调 CPU 和各个硬件之间的速度差异是非常重要的,要不然 CPU 就一直在等待,浪费资源。而在多核中,不仅面临如上问题,还有如果多个核用到了同一个数据,如何保证数据的一致性、正确性等问题,也是必须要解决的。目前基于高速缓存的存储交互很好的解决了 CPU 和内存等其他硬件之间的速度矛盾,多核情况下各个处理器(核)都要遵循一定的诸如 MSI、MESI 等协议来保证内存的各个处理器高速缓存和主内存的数据的一致性。

jmm-2

... >>
  • Java

展开全文 >>

分布式唯一全局 ID 解决方案之二

发表于:2020-06-25
  • 上篇 - 分布式唯一全局 ID 解决方案之一
  • 1、UidGenerator 分布式 ID 生成器
    • 1.1、概述
    • 1.2、结构
  • 2、Leaf 分布式 ID 生成系统
    • 2.1、Leaf-segment 方案
      • 2.1.1、概述
      • 2.1.2、架构
      • 2.1.3、优缺点
      • 2.1.4、高可用容灾
      • 2.1.5、双 Buffer 优化
    • 2.2、Leaf-snowflake 方案
      • 2.2.1、概述
      • 2.2.2、架构
      • 2.2.3、弱依赖 ZooKeeper
      • 2.2.4、解决时钟回拨问题
  • 3、参考资料

上篇 - 分布式唯一全局 ID 解决方案之一

  • 分布式唯一全局 ID 解决方案之一

1、UidGenerator 分布式 ID 生成器

1.1、概述

UidGenerator 是 Java 实现的,基于 Snowflake 算法的唯一 ID 生成器。UidGenerator 以组件形式工作在应用项目中, 支持自定义 workerId 位数和初始化策略, 从而适用于 Docker 等虚拟化环境下实例自动重启、漂移等场景。在实现上, UidGenerator 通过借用未来时间来解决 sequence 天然存在的并发限制;采用 RingBuffer 来缓存已生成的 UID, 并行化 UID 的生产和消费, 同时对 CacheLine 补齐,避免了由 RingBuffer 带来的硬件级「伪共享」问题。 最终单机 QPS 可达 600 万。依赖 Java8 及以上版本, MySQL (内置 WorkerID 分配器, 启动阶段通过数据库进行分配;如自定义实现,则数据库非必选依赖)。

1.2、结构

Snowflake 算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个 64 bit 的唯一 ID(Long 型),默认采用下图字节分配方式:

uid-generate-1

  • sign(1bit):符号位,固定是 0,表示全部 ID 都是正整数
  • delta seconds (28 bits):当前时间,相对于时间基点 2016-05-20 的增量值,单位为秒,最多可支持约 8.7 年
  • worker id (22 bits):机器 ID,最多可支持约 420w 次机器启动。内置实现为在启动时由数据库分配,默认分配策略为用后即弃,后续可提供复用策略
  • sequence (13 bits):每秒下的并发序列,13 bits 可支持每秒 8192 个并发
... >>
  • 分布式
  • 数据库

展开全文 >>

分布式唯一全局 ID 解决方案之一

发表于:2020-06-23
  • 1、分布式 ID 简介
    • 1.1、业务背景
    • 1.2、ID 生成规则的硬性要求
    • 1.3、ID 生成系统的可用性要求
  • 2、UUID 生成 ID
    • 2.1、概述
    • 2.2、优缺点
  • 3、数据库自增 ID
    • 3.1、概述
    • 3.2、优缺点
    • 3.3、MySQL 集群场景
  • 4、基于 Redis 生成全局 ID 策略
    • 4.1、概述
    • 4.2、优缺点
    • 4.3、Redis 集群场景
  • 5、SnowFlake(雪花算法)
    • 5.1、概述
    • 5.2、结构
    • 5.3、优缺点
    • 5.4、Java 版实现
  • 下篇 - 分布式唯一全局 ID 解决方案之二

1、分布式 ID 简介

1.1、业务背景

在复杂的分布式系统中,往往需要对大量的数据和消息进行唯一标识。比如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中数据日渐增长,对数据分库分表后需要有一个唯一 ID 来标识一条数据或消息。具体一点的如订单、骑手、优惠劵也都需要有唯一标识,此时一个能够生成全局唯一 ID 的系统是非常必要的。

1.2、ID 生成规则的硬性要求

  • 全局唯一:不能出现重复的 ID ,既然是唯一标识,这是最基本的要求
  • 单调递增:保证下一个 ID 大于上一个 ID,例如事务版本号、IM 增量信息、排序等特殊需求
  • 趋势递增:在 MySQL 的 InnoDB 存储引擎中使用的是聚集索引,由于多数 RDBMS 使用 BTree 的数据结构来存储索引数据,在主键的选择上面应该尽量使用有序的主键来保证写入性能
  • 信息安全:如果 ID 是连续的,恶意用户的爬取工作就非常容易做了,直接按照顺序下载指定 URL 即可 所以在一些应用场景下,需要 ID 无规则或者不规则,让竞争对手不好猜

上述的全局唯一、单调递增、趋势递增需求分别对应三类不同的业务场景,但单调递增和信息安全这两个需求是互斥的,无法使用同一个方案满足

1.3、ID 生成系统的可用性要求

  • 低延迟:发一个获取分布式 ID 的请求,服务器就要快,极速
  • 高可用:一个获取分布式 ID 的请求,服务器就要在保证 99.999% 成功率的情况下创建一个唯一分布式 ID
  • 高 QPS:假如并发一堆创建分布式 ID 的请求同时杀过来,服务器要顶得住且一下子成功创建 10 万个唯一分布式 ID
... >>
  • 分布式
  • 数据库

展开全文 >>

Redis 入门教程之一五大数据类型

发表于:2020-06-16
  • 系统级命令
    • 获取符合规则的键名列表
    • 判断一个键是否存在
    • 删除键
    • 获得键值的数据类型
    • 清空当前数据库
    • 清空所有数据库
    • 设置过期时间
    • 查看剩余存活时间
  • 数据类型
    • 字符串类型(String)
      • 赋值与取值(字符串)
      • 递增数字
      • 增加指定的整数
      • 减少指定的整数
      • 增加指定的浮点数
      • 向尾部追加值
      • 获取字符串长度
      • 同时获取 / 设置多个键值
      • 位操作
    • 散列类型(Hash)
      • 赋值与取值(散列)
      • 判断字段是否存在
      • 当字段不存在时赋值
      • 增加字段
      • 删除字段
      • 只获取字段名或字段值
    • 列表类型(List)
      • 向列表两端添加元素
      • 从列表两端弹出元素
      • 获取列表中元素的个数
      • 获得列表片段
      • 删除列表中指定的值
      • 获取与设置指定索引的元素值
      • 只保留列表指定片段
      • 向列表中插入元素
      • 将元素从一个列表转到另一个列表
      • 列表阻塞操作
    • 集合类型(Set)
      • 增加、删除元素
      • 获取集合中的所有元素
      • 判断元素是否在集合中
      • 集合间运算
      • 获取集合中元素的个数
      • 进行集合运算并将结果存储
      • 随机获得集合中的元素
      • 从集合中弹出一个元素
    • 有序集合类型(Sorted Set)
      • 增加元素
      • 获取元素的分数
      • 获得排名在某个范围的元素列表
      • 获得指定分数范围的元素
      • 增减某个元素的分数
      • 获取集合中元素的数量
      • 获得指定分数范围内的元素个数
      • 删除一个或多个元素
      • 按照排名范围删除元素
      • 按照分数范围删除元素
      • 获得元素的排名
      • 计算有序集合的交集
      • 计算有序集合的并集
  • 数据类型使用总结

系统级命令

获取符合规则的键名列表

KEYS 命令需要遍历 Redis 中的所有键,当键的数量较多时会严重影响性能,在生产环境中应该禁用该命令。

1
KEYS pattern

示例:

1
2
redis> KEYS *
1) "book"
... >>
  • 缓存

展开全文 >>

MySQL 索引的使用

发表于:2020-06-09
  • 索引介绍
    • 索引的类型(四种)
    • 索引的种类(五种)
  • 索引的操作
  • 索引使用的代价
  • 索引适用的场景
    • 索引创建的时机
    • 哪些字段应该创建索引
    • 索引不生效的情况
    • 索引使用注意事项
  • 查看索引的使用效果
    • 执行计划
    • 查看索引的使用情况
  • 补充说明
    • MySQL 查询只能使用一个索引?

索引介绍

索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),包含了对数据表里所有记录的引用指针。索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。创建索引时,需要确保该索引是应用在 SQL 查询语句的条件 (一般是 WHERE、JOIN 子句的条件)。

索引的类型(四种)

  • FULLTEXT:即为全文索引,目前只有 MyISAM 引擎支持,其可以在 CREATE TABLE,ALTER TABLE,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR、TEXT 列上可以创建全文索引
  • HASH:由于 HASH 的唯一性及类似键值对的形式,很适合作为索引,HASH 索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在 “=” 和 “in” 条件下才高效,对于范围查询、排序及组合索引仍然效率不高
  • BTREE:一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口 Root 开始,依次遍历 Node,获取 Leaf,这是 MySQL 里默认和最常用的索引类型
  • RTREE:在 MySQL 很少使用,仅支持 geometry 数据类型,支持该类型的存储引擎有 MyISAM、BDb、InnoDb、NDb、Archive,相对于 BTREE,RTREE 的优势在于范围查找
... >>
  • 数据库

展开全文 >>

JVM 内存结构与 GC 算法

发表于:2020-06-06
  • Java 虚拟机
    • JVM 内存结构
      • 堆内存
      • 方法区
      • Java 虚拟机栈
      • 本地方法栈
      • 程序计数器
      • 运行时常量池
      • 直接内存
    • 通过参数来控制各区域的内存大小
  • JVM 垃圾收集机制
    • 如何确定一个对象是否会被回收
      • 引用计数算法(Reference Counting)
      • 可达性分析算法(Reachability Analysis)
    • GC 算法
      • 标记 - 清除算法
      • 复制算法
      • 标记 - 整理算法
      • 分代收集算法
      • GC 算法对比
      • 关于 Stop-The-World
    • 内存分配策略
      • 对象优先在 Eden 空间分配
      • 大对象直接进入老年代
      • 长期存活的对象将进入老年代
      • 动态对象年龄判定
      • 空间分配担保
    • GC 的触发条件
      • Minor GC 的触发条件
      • Full GC 的触发条件
        • 调用 System.gc ()
        • 老年代空间不足
        • 空间分配担保失败
        • JDK 1.7 及以前的永久代空间不足
        • Concurrent Mode Failure
  • JVM 垃圾收集器
    • 概念理解
      • 吞吐量
      • 并发和并行
      • Minor GC 和 Full GC
    • 新生代收集器
      • Serial 收集器
      • ParNew 收集器
      • Parallel Scavenge 收集器
    • 老年代收集器
      • Serial Old 收集器
      • Parallel Old 收集器
      • CMS 收集器
      • G1 收集器

Java 虚拟机

JVM 内存结构

JVM 内存结构主要有三大块:栈、堆内存、方法区。堆内存是 JVM 中最大的一块,由新生代和老年代组成,不包括永久代(方法区);而新生代内存又被分成 Eden 空间、From Survivor 空间、To Survivor 空间,默认情况下新生代按照 8:1:1 的比例来分配。方法区存储类信息、静态变量、常量、常量池等数据,是线程共享的区域,为了与 Java 堆区分,方法区还有一个别名 Non-Heap (非堆)。栈又分为 Java 虚拟机栈和本地方法栈,主要用于方法的执行。

java-jvm-architecture

... >>
  • Java

展开全文 >>

Puppeteer 入门使用教程

发表于:2020-06-01
  • Puppeteer 介绍
    • Puppeteer 是什么
    • Puppeteer 的功能
    • Puppeteer VS Puppeteer-Core
      • 使用区别
      • 使用建议
  • Puppeteer 运行环境与安装
    • Puppeteer 运行环境
    • Puppeteer 安装
  • Puppeteer 入门案例
    • 入门案例
    • 启动参数
  • Puppeteer 实战
    • Puppeteer 环境变量
    • Puppeteer 的选择器
    • SegmentFault 模拟登录
    • Puppeteer 结合 Jest 使用
  • Puppeteer 周边的开源项目

Puppeteer 介绍

Puppeteer 是什么

Puppeteer 是一个 NodeJs 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。相比较 Selenium 或是 PhantomJs,它最大的特点就是完全可以在内存中模拟 DOM 操作,即在 V8 引擎中处理而不打开浏览器,而且关键的是该项目是 Chrome 团队在维护,会拥有更好的兼容性和前景,更多资料可参考以下站点:Puppeteer Github、Puppeteer 中文文档、DevTools Protocol 文档、Chromium 命令行启动参数。

Puppeteer 的功能

  • 生成页面的截图和 PDF
  • 自动提交表单,进行 UI 测试,键盘输入等
  • 捕获网站的时间线跟踪,用来帮助分析性能问题
  • 抓取 SPA(单页应用),并生成预渲染内容,即 “SSR”(服务器端渲染)
  • 创建一个最新的自动化测试环境,使用最新的 JavaScript 和浏览器功能,直接在最新版本的 Chrome 中运行测试
  • 测试浏览器扩展,Chrome / Chromium 扩展当前只能在非无头模式下使用,目前还无法测试扩展弹出窗口或内容脚本
... >>
  • 前端
  • 爬虫

展开全文 >>

123…15Next »
© 2021 Clay
本站总访问量  人次
载入天数...载入时分秒...
粤ICP备19024664号
  • 所有文章

显示标签:

  • AI
  • C/C++
  • CI/CD
  • Centos
  • Docker
  • HarmonyOS
  • Java
  • Linux
  • Manjaro
  • Python
  • Web服务器
  • 企业面试
  • 分布式
  • 前端
  • 区块链
  • 开发工具
  • 开源
  • 微服务
  • 数据库
  • 架构
  • 树莓派
  • 爬虫
  • 版本控制
  • 知识图谱
  • 算法与数据结构
  • 缓存
  • 网络攻防
  • 随笔

    [^_^] 出错啦!请重新刷新页面!