diff --git a/README.md b/README.md index 9505228..f3a95c6 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ podman Podman code-language 编程语言 go - python + python Python 的学习及实际开发最佳实践 rust scala database diff --git a/base/algorithm/Data-Structure & Algorithm.md b/base/algorithm/Data-Structure & Algorithm.md index 2821968..d913f96 100644 --- a/base/algorithm/Data-Structure & Algorithm.md +++ b/base/algorithm/Data-Structure & Algorithm.md @@ -39,6 +39,10 @@ +### + + + ## AVL 树和红黑树 @@ -63,20 +67,32 @@ +## 实战 +### 前缀树 - 字典树 Trie 的应用 +- Web框架中如何实现路由匹配? +#### 路由匹配 +- 一个好用的 Web 框架,要能尽可能快地解析请求 URL 并映射到不同 API 的处理逻辑,也就是我们常说的“路由匹配”。 +#### 动态路由 +- 如何保存路由和处理方法的对应关系呢? +- 不采用 HashMap 来存储路由表,因为利用哈希表存储的路由和处理逻辑的关系,只能用来索引静态路由,也就是路由中没有动态参数的路由,比如 + /user/enabletime.xxx.org/hybrid/pvip ,这样的路由,路径是明确的,一个路由只有一种可能性 +- 动态路由如何实现呢?方式有很多种,可以用正则表达式匹配来实现,另一种更常用的方式就是我们要重点学习的 Trie 树。 +#### Trie 树总结 +- Trie 树,也称为前缀树或者字典树,是一种常用的维护字符串集合的数据结构 +- 能用来做 排序、保存、查询 字符串 +- 常用场景比如搜索引擎关键词匹配、路由匹配、词频统计和字符串排序等 +- EMQ X 也有用到相关的数据结构来实现 MQTT 协议路由表 +- Trie 树主要的特点和优势都建立基于前缀的树状存储方式上 +- 相比于 treemap 来说,trie 树存储的开销要小得多,并且因为它天然的前缀匹配和排序的特性,在很多时候也能帮助我们更快检索数据。 - - - - - - +#### 前缀树实现 diff --git a/best-practice/python-spider/README.md b/best-practice/python-spider/README.md new file mode 100644 index 0000000..7fd7eb5 --- /dev/null +++ b/best-practice/python-spider/README.md @@ -0,0 +1,152 @@ +# Python 爬虫的研究 + +## 1. 基础 + + +### 1.1 HTTP基本原理 + +### 1.2 Web网页基础 + +### 1.3 爬虫的基本原理 + +### 1.4 Session 与 Cookies + +### 1.5 多路加速, 多线程 + + +--- + +## 2. 爬虫基本库 + +### 2.1 Requests 库的基本使用 + + +### 2.2 正则表达式 + + +### 2.3 爬虫解析利器 PyQuery + + +### 2.4 高效存储 MongoDB + + +### 2.5 Requests + PyQuery + PyMongo 基本案例实战 + + +--- + + +## 3. 多种形式爬取 + +### 3.1 Ajax 案例 + + + +### 3.2 Selenium 案例 + + + +### 3.3 aiohttp 异步爬虫案例 + + +### 3.4 Pyppeteer 案例 + + +--- + +## 4. 反爬应对 + +### 4.1 代理及代理池 + + +### 4.2 验证码破解 + + +### 4.3 模拟登录 + + +### 4.4 JavaScript 逆向 + + +--- + +## 5. APP爬虫 + + +### 5.1 抓包工具使用 Charles + + + +### 5.2 实时处理利器 mitmproxy + + + +### 5.3 Appium 的使用 + + +### 5.4 自动化工具 airtest + + +### 5.5 Xposed + + +### 5.6 APP 逆向 + + +--- + + +## 6. 智能化解析 + +### 6.1 技术 + + + +### 6.2 工具 + + + + +### 6.3 算法 + + + + +### 6.4 实现 + + +--- + +## 7. Scrapy 框架 + + +### 7.1 Scrapy 基础 + + +### 7.2 Spider 用法 + + +### 7.3 Middleware 用法 + + +### 7.4 Item Pipeline 用法 + + +### 7.5 动态页面处理 + + +### 7.6 Scrapy-Redis + + +### 7.7 Scrapyd 部署工具 + + +### 7.8 Scrapy 对接 Docker + + +### 7.9 Scrapy 对接 Kubernetes 并实现定时爬取 + + + + + diff --git a/cache/README.md b/cache/README.md new file mode 100644 index 0000000..7c16d77 --- /dev/null +++ b/cache/README.md @@ -0,0 +1,5 @@ +# 缓存 + + + + diff --git a/cloud-native/README.md b/cloud-native/README.md new file mode 100644 index 0000000..a113aa9 --- /dev/null +++ b/cloud-native/README.md @@ -0,0 +1,14 @@ +# 服务容器化-Docker + + + +## 容器技术 - Cloud Foundry + +## 容器编排 - Mesos + Marathon + + +## 容器编排-K8S + + +## 弹性扩缩容 + diff --git a/dev-protocol-tools/src/main/java/com/baiye/dfa/DFADemo.java b/dev-protocol-tools/src/main/java/com/baiye/dfa/DFADemo.java new file mode 100644 index 0000000..244b6b9 --- /dev/null +++ b/dev-protocol-tools/src/main/java/com/baiye/dfa/DFADemo.java @@ -0,0 +1,78 @@ +package com.baiye.dfa; + +import cn.hutool.dfa.WordTree; + + +/** + * dfa 算法 demo + * + * 解决简单字符串匹配的问题 + * DFA全称为:Deterministic Finite Automaton,即确定有穷自动机 + * http://www.cnblogs.com/naaoveGIS/archive/2016/10/14/5960352.html + * + * O(n)复杂度 + * + * @author q + * @date 2022/08/18 + */ +public class DFADemo { + + + public static final String text = "我有一颗大土豆,刚出锅的"; + + private static WordTree buidKeyWordsTree(){ + WordTree tree = new WordTree(); +// tree.addWord("大"); + tree.addWord("大土豆"); + tree.addWord("土豆"); + tree.addWord("刚出锅"); + tree.addWord("出锅"); + return tree; + } + + public static void main(String[] args) { + + // 情况一:标准匹配,匹配到最短关键词,并跳过已经匹配的关键词 + // 匹配到【大】,就不再继续匹配了,因此【大土豆】不匹配 + // 匹配到【刚出锅】,就跳过这三个字了,因此【出锅】不匹配(由于刚首先被匹配,因此长的被匹配,最短匹配只针对第一个字相同选最短) + buidKeyWordsTree().matchAll(text, -1, false, false); + // result [大, 土豆, 刚出锅] + + // 情况二:匹配到最短关键词,不跳过已经匹配的关键词 + // 【大】被匹配,最短匹配原则【大土豆】被跳过,【土豆】 继续被匹配 + // 【刚出锅】被匹配,由于不跳过已经匹配的词,【出锅】被匹配 + buidKeyWordsTree().matchAll(text, -1, true, false); + // result [大, 土豆, 刚出锅, 出锅] + + // 情况三:匹配到最长关键词,跳过已经匹配的关键词 + // 匹配到【大】,由于到最长匹配,因此【大土豆】接着被匹配 + // 由于【大土豆】被匹配,【土豆】被跳过,由于【刚出锅】被匹配,【出锅】被跳过 + buidKeyWordsTree().matchAll(text, -1, false, true); + // result [大, 大土豆, 刚出锅] + + // 情况四:匹配到最长关键词,不跳过已经匹配的关键词(最全关键词) + // 匹配到【大】,由于到最长匹配,因此【大土豆】接着被匹配,由于不跳过已经匹配的关键词,土豆继续被匹配 + // 【刚出锅】被匹配,由于不跳过已经匹配的词,【出锅】被匹配 + buidKeyWordsTree().matchAll(text, -1, true, true); + // result [大, 大土豆, 土豆, 刚出锅, 出锅] + + // PS 除了matchAll方法,WordTree还提供了match和isMatch两个方法,这两个方法只会查找第一个匹配的结果,这样一旦找到第一个关键字,就会停止继续匹配,大大提高了匹配效率。 + + System.out.println(buidKeyWordsTree().match(text)); + + + System.out.println(buidKeyWordsTree().isMatch(text)); + + + // 正文中的关键字常常包含特殊字符,比如:"〓关键☆字",针对这种情况,HuTool 提供了StopChar类,专门针对特殊字符做跳过处理,这个过程是在match方法或matchAll方法执行的时候自动去掉特殊字符。 + + + + + } + + + + + +} diff --git a/ide-tools/README.md b/ide-tools/README.md new file mode 100644 index 0000000..95e0c9f --- /dev/null +++ b/ide-tools/README.md @@ -0,0 +1,84 @@ +# 开发工具研究 + +## IDEA + + +## 1. + + +## Vim + +### 1. 基础概念和命令 + +- Vim 的模式转换 + - **普通模式**:Vim 启动后的默认模式,用来移动光标、删除文本、覆盖输入文本、恢复操作、粘贴文本等等。 + - **插入模式**:输入 i 或 a 进入插入模式,在这个模式下敲击键盘会往文字缓冲区增加文字,相当于普通编辑器的编辑模式。 + - **可视模式**:选择文本,可以行选、块选和依次选择,选择后可以进行复制、删除、排序等操作。 + - **命令模式**:执行内部和外部命令,通过“:”“/”“?”“:!”可以进入命令模式,分别对应的是:执行内部命令、向上或向下搜索、执行外部命令。 + +- Vim 的优势 + - Vim 是一个完全跨平台的编辑器 + - Vim 也是一个高度可定制、可扩展的编辑器 [Vim 脚本(Vim script)] + - Vim 也有着良好的生态环境 + +- PS: + - 终端输入 vimtutor 可以获取 Vim 的简易教程 + - Vim JavaScript或Typescript语言相关插件 - https://github.com/neoclide/coc.nvim + +- 安装 +- Linux 下的安装 + +- Red Hat 和 CentOS 系列 +```shell +# 一般是默认安装的 查看 Vim 安装版本 +yum list installed | grep vim +# 表示是基本功能 Vim +vim-minimal.x86_64 2:8.0.1763-13.el8 @System +# 安装图形界面的 Vim +sudo yum install vim-X11 +# 安装增强版本的 Vim +sudo yum install vim-enhanced +``` +- Debian 和 Ubuntu 系列 +- 在 Debian、Ubuntu 等使用 apt 的 Linux 发行版上,Vim 同样有着不同功能版本的区别,而且选择更多 +- 它们中有编译进最小功能的 Vim 包(vim-tiny),有较全功能的文本界面 Vim 包(vimnox),有适用于老的 X-Window 界面的版本(vim-athena),有适用于 KDE 环境的 + GTK2 版本(vim-gtk),等 +- 如果你使用标准的 GNOME 桌面环境的话(大部分的情况),安装 vim-gtk3 或 vimgnome +- 如果你使用 KDE 桌面的话,安装 vim-gtk +- 如果你只使用文本界面的话,安装 vim-nox +```shell +# 可以通过下面的命令来查看已经安装的 Vim 版本 +apt list --installed | grep vim +# 来确保更新环境 +sudo apt update +# 安装 GTK3 版本的 Vim - 自行进行选择 +sudo apt install vimgtk3 + +``` +- 在 Ubuntu 上,vim 和 gvim 都是指向同一个应用程序的符号链接,且 gvim 的 执行效果和 vim -g 相同 + + +- TODO 其他平台的安装过程补充即可 + +- TODO Vim8 中文文档支持 + +- 键盘重配置 + - 重度的 Vim 用户会重新配置键盘,把使用频度较低的大写锁定键(Caps Lock)重新映射成 Esc 或 Ctrl 键 + - 建议直接买一把专用的键盘即可 + + + + + + + + + + + + + + + + +