feat: add content
This commit is contained in:
parent
5e0d48fd8e
commit
4dab4174b3
1
.gitignore
vendored
1
.gitignore
vendored
@ -1 +1,2 @@
|
|||||||
public
|
public
|
||||||
|
.idea
|
||||||
|
|||||||
0
content/_index.md
Normal file
0
content/_index.md
Normal file
13
content/posts/1.Learning/A1.StudyNotes/Hackintool-todo.md
Normal file
13
content/posts/1.Learning/A1.StudyNotes/Hackintool-todo.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: "黑苹果未完善问题点"
|
||||||
|
date: 2022-03-19T21:06:28+08:00
|
||||||
|
tags: ["hackintool"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
- [ ] 前置耳机无声音
|
||||||
|
> https://github.com/acidanthera/AppleALC/blob/master/README_CN.md
|
||||||
|
|
||||||
|
型号为alc222
|
||||||
|
|
||||||
|
alcid=11
|
||||||
13
content/posts/1.Learning/A1.StudyNotes/_index.md
Normal file
13
content/posts/1.Learning/A1.StudyNotes/_index.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: "学习笔记"
|
||||||
|
date: 2023-04-15T11:01:48+08:00
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指记录自己在学习过程中的笔记,包括课堂笔记、阅读笔记、笔记总结等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 课程笔记
|
||||||
|
* 学习技巧
|
||||||
|
* 讲座笔记
|
||||||
20
content/posts/1.Learning/A1.StudyNotes/aliyunpan-mac.md
Normal file
20
content/posts/1.Learning/A1.StudyNotes/aliyunpan-mac.md
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
title: "阿里云盘mac本地挂在"
|
||||||
|
date: 2022-03-19T21:06:28+08:00
|
||||||
|
tags: ["aliyundriver"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
主要参考文档:https://blog.51cto.com/xuedingmaojun/4815572
|
||||||
|
|
||||||
|
采用方式:
|
||||||
|
https://github.com/zxbu/webdav-aliyundriver#jar包运行
|
||||||
|
|
||||||
|
挂在地址代码
|
||||||
|
```shell
|
||||||
|
cd /Users/xxx/Workspaces/WebRoot/logs/webdav;nohup java -jar /Users/xxx/Workspaces/Env/WebDAV/PATH/bin/webdav-aliyundriver-2.4.2.jar --aliyundrive.refresh-token="aaa" --server.port=aaa --aliyundrive.work-dir=/usr/local/etc/webdav/aliyundriver --aliyundrive.auth.user-name=aaa --aliyundrive.auth.password=aaa > /Users/aaa/Workspaces/WebRoot/logs/webdav/webdav.log 2>&1 &;
|
||||||
|
|
||||||
|
# nohup切换前台停止
|
||||||
|
fg
|
||||||
|
|
||||||
|
```
|
||||||
50
content/posts/1.Learning/A1.StudyNotes/clickhouse.md
Normal file
50
content/posts/1.Learning/A1.StudyNotes/clickhouse.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
---
|
||||||
|
title: "ClickHouse"
|
||||||
|
date: 2022-10-02T14:54:45+08:00
|
||||||
|
tags: ["clickhouse"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# ClickHouse
|
||||||
|
|
||||||
|
> 官网:[clickhouse.com](https://clickhouse.com/)
|
||||||
|
>
|
||||||
|
> 学习资料:[谷粒](https://www.gulixueyuan.com/my/course/445)
|
||||||
|
|
||||||
|
## 核心要点:
|
||||||
|
|
||||||
|
1. MergeTree引擎
|
||||||
|
2. OrderBy是主键
|
||||||
|
3. 分布式
|
||||||
|
4. Explain
|
||||||
|
5. 参数配置
|
||||||
|
6. 语法规则
|
||||||
|
7. 多表联查(join)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 面试题
|
||||||
|
|
||||||
|
1.不支持真正的`delete/update`操作,不支持`transactions`(事物)
|
||||||
|
|
||||||
|
```text
|
||||||
|
OLAP引擎一般都不支持事物,ClickHouse的定位也是分析性数据库,而不是严格的关系型数据库,加入对于事物的支持,
|
||||||
|
必然会有锁,同时分布式事物的支持,会带来更复杂的实现,其中诸多因素,都会影响写入和查询的性能。
|
||||||
|
```
|
||||||
|
|
||||||
|
2.不支持高并发查询,官方建议`100 QPS`
|
||||||
|
|
||||||
|
```text
|
||||||
|
ClickHouse是并行计算,单个查询就可以跑满多个CPU核心,而不像MySQL单个查询单线程执行。
|
||||||
|
```
|
||||||
|
|
||||||
|
3.需要批量写入,频繁的单条写入会带来写入问题
|
||||||
|
|
||||||
|
```text
|
||||||
|
ClickHouse存储结构有点类LSM,每次的insert基本都会生成一个文件目录,后台线程Merge目录文件,如果频繁写入,
|
||||||
|
后台线程就会Merge不过来,产生`Too many parts`异常。建议每秒不超过一次写入,并且是Batch写入。
|
||||||
|
```
|
||||||
|
|
||||||
|
4.有限的SQL语法支持,JOIN语法也比较另类,暂时不支持窗口函数
|
||||||
|
|
||||||
|
5.稀疏索引的设计使得ClickHouse不适合做单行点查询
|
||||||
63
content/posts/1.Learning/A1.StudyNotes/gitbook-docker.md
Normal file
63
content/posts/1.Learning/A1.StudyNotes/gitbook-docker.md
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
title: "gitbook在docker内进行安装编译"
|
||||||
|
date: 2022-11-06T16:54:57+08:00
|
||||||
|
tags: ["gitbook"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Gitbook与Docker
|
||||||
|
|
||||||
|
最近在学习k8s容器相关,了解了docker的优势,而本身对于特别在意环境的干净,之前的Gitbook不想安装原因,是因为要安装node等信息。借此机会尝试下使用docker进行安装。
|
||||||
|
|
||||||
|
## 1. Docker安装
|
||||||
|
|
||||||
|
这个比较简单,直接官网下载安装,无异常
|
||||||
|
|
||||||
|
## 2. docker-compose 编写
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# 在对应的目录下创建compose的yaml文件,我放在`Workspaces/Docker/GitBook`下
|
||||||
|
services:
|
||||||
|
gitbook:
|
||||||
|
image: bloodstar/gitbook-builder
|
||||||
|
ports:
|
||||||
|
- "4000:4000"
|
||||||
|
volumes:
|
||||||
|
- ./gitbook:/gitbook
|
||||||
|
command: gitbook build
|
||||||
|
```
|
||||||
|
|
||||||
|
由于我只是使用gitbook的build,不需要serve,所以端口无所谓
|
||||||
|
|
||||||
|
## 3.command命令修改
|
||||||
|
|
||||||
|
### 3.1 初始化
|
||||||
|
|
||||||
|
修改command命令为`gitbook init`
|
||||||
|
|
||||||
|
### 3.2 插件安装
|
||||||
|
|
||||||
|
修改command命令为`gitbook install`,这中间会存在异常,主要是网络连接github会有一定问题
|
||||||
|
|
||||||
|
### 3.3 编译
|
||||||
|
|
||||||
|
修改command命令为`gitbook build`
|
||||||
|
|
||||||
|
## 4. 异常处理
|
||||||
|
|
||||||
|
### 4.1 初始化失败
|
||||||
|
|
||||||
|
直接建`README.md` `SUMMARY.md` 两个文件后
|
||||||
|
|
||||||
|
### 4.2 插件安装失败
|
||||||
|
|
||||||
|
需要特殊渠道,让服务可以可以访问
|
||||||
|
|
||||||
|
## 5. 部署
|
||||||
|
|
||||||
|
使用nginx做代理,直接`root`指向`Workspaces/Docker/GitBook/gitbook/_book`目录
|
||||||
|
|
||||||
|
到对应的目录夹下,运行命令`docker-compose up -d`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
136
content/posts/1.Learning/A1.StudyNotes/gitbook-install.md
Normal file
136
content/posts/1.Learning/A1.StudyNotes/gitbook-install.md
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
---
|
||||||
|
title: "如何编写 Gitbook"
|
||||||
|
date: 2022-03-01T01:13:27+08:00
|
||||||
|
tags: ["gitbook"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 环境
|
||||||
|
nodejs
|
||||||
|
> nodejs目前的版本比较高,如果直接使用14版本,会存在gitbook安装失败,最好使用12版本
|
||||||
|
```shell
|
||||||
|
yum install nodejs
|
||||||
|
# 检查是否安装成功
|
||||||
|
node -v
|
||||||
|
```
|
||||||
|
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
```shell
|
||||||
|
npm install -g gitbook-cli
|
||||||
|
# 检查是否安装成功
|
||||||
|
gitbook --version
|
||||||
|
|
||||||
|
# 出现错误 `cb.apply is not a function`,修复方法,详见`https://mizeri.github.io/2021/04/24/gitbook-cbapply-not-a-function/`
|
||||||
|
|
||||||
|
# 修改`/usr/local/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js`文件的65行起3行,具体内容如下
|
||||||
|
|
||||||
|
// fs.stat = statFix(fs.stat)
|
||||||
|
// fs.fstat = statFix(fs.fstat)
|
||||||
|
// fs.lstat = statFix(fs.lstat)
|
||||||
|
```
|
||||||
|
|
||||||
|
## 生成book
|
||||||
|
1. 如何 `html`
|
||||||
|
```shell
|
||||||
|
gitbook build ./Thief ./ThiefTarget/
|
||||||
|
```
|
||||||
|
|
||||||
|
## 配置nginx
|
||||||
|
|
||||||
|
```shell
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
listen 81 http2;
|
||||||
|
server_name gitbook.micah.wiki;
|
||||||
|
root /xxx;
|
||||||
|
location / {
|
||||||
|
|
||||||
|
}
|
||||||
|
location = /robots.txt {}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl;
|
||||||
|
server_name gitbook.micah.wiki;
|
||||||
|
|
||||||
|
ssl_certificate /yyy/cert.pem;
|
||||||
|
ssl_certificate_key /yyy/key.pem;
|
||||||
|
|
||||||
|
|
||||||
|
ssl_session_cache shared:SSL:1m;
|
||||||
|
ssl_session_timeout 5m;
|
||||||
|
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
|
||||||
|
root /xxx;
|
||||||
|
location / {
|
||||||
|
|
||||||
|
}
|
||||||
|
location = /robots.txt {}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 封面
|
||||||
|
| | 大 | 小 |
|
||||||
|
|:----------------:|:-----------:|:-----------------:|
|
||||||
|
| **文件** | `cover.jpg` | `cover_small.jpg` |
|
||||||
|
| **大小(像素)** | 1800x2360 | 200x262 |
|
||||||
|
|
||||||
|
## 术语
|
||||||
|
增加 `GLOSSARY.md` 文件,貌似目前值支持英文的,不支持 GitBook 中文 术语
|
||||||
|
|
||||||
|
## 引用文件
|
||||||
|
```shell
|
||||||
|
# 1. 本地文件
|
||||||
|
{% include "./xx.md" %}
|
||||||
|
# 2. git地址
|
||||||
|
{% include "git+https://github.com/GitbookIO/documentation.git/README.md#0.0.1" %}
|
||||||
|
# 或者
|
||||||
|
git+https://[email protected]/project/blah.git/file#commit-ish
|
||||||
|
```
|
||||||
|
## 继承
|
||||||
|
编写内容类似于
|
||||||
|
```shell
|
||||||
|
{% extends "./page_info.md" %}
|
||||||
|
|
||||||
|
{% block pageContent %}
|
||||||
|
# This is my page content
|
||||||
|
{% endblock %}
|
||||||
|
```
|
||||||
|
`page_info.md` 内容
|
||||||
|
```shell
|
||||||
|
{% block pageContent %}
|
||||||
|
This is the default content
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
# License
|
||||||
|
|
||||||
|
{% import "./LICENSE" %}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 插件
|
||||||
|
在根目录下,创建book.json,并添加以下内容
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"plugins" : [
|
||||||
|
"code",
|
||||||
|
"-lunr",
|
||||||
|
"-search",
|
||||||
|
"search-pro"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
进入根目录下,执行以下命令
|
||||||
|
```shell
|
||||||
|
gitbook install
|
||||||
|
```
|
||||||
|
|
||||||
|
## favicon
|
||||||
|
在项目根目录下新建 gitbook/images 目录
|
||||||
|
在该目录下存放 favicon 文件
|
||||||
|
|
||||||
|
通用 (尺寸 48x48) - favicon.ico
|
||||||
|
用于苹果设备 (尺寸 152x152) - apple-touch-icon-precomposed-152.png
|
||||||
27
content/posts/1.Learning/A1.StudyNotes/github-sync-gitee.md
Normal file
27
content/posts/1.Learning/A1.StudyNotes/github-sync-gitee.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
title: "Github同步Gitee"
|
||||||
|
date: 2022-03-02T13:48:42+08:00
|
||||||
|
tags: ["github","gitee"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 问题
|
||||||
|
|
||||||
|
由于国内访问Github受限,经常是无法访问,所以就通过Gitee来代理,如何同步成为一个问题,网上主要有两种方案:
|
||||||
|
|
||||||
|
1. 通过项目关联,同时push到Github和Gitee
|
||||||
|
2. 通过Github的workflow进行同步
|
||||||
|
|
||||||
|
## 尝试
|
||||||
|
|
||||||
|
### 关联同时push
|
||||||
|
|
||||||
|
参考地址:https://cloud.tencent.com/developer/article/1649682
|
||||||
|
|
||||||
|
### workflow
|
||||||
|
|
||||||
|
参考地址:https://juejin.cn/post/6894928345830522887
|
||||||
|
|
||||||
|
### Gitee服务
|
||||||
|
|
||||||
|
参考地址:https://gitee.com/help/articles/4336#article-header2
|
||||||
74
content/posts/1.Learning/A1.StudyNotes/hugo-init.md
Normal file
74
content/posts/1.Learning/A1.StudyNotes/hugo-init.md
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
---
|
||||||
|
title: "Hugo项目部署"
|
||||||
|
date: 2022-03-13T21:06:28+08:00
|
||||||
|
tags: ["hugo"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 安装
|
||||||
|
|
||||||
|
我喜欢安装直接下载下来,放在bin目录下,所以在 [git](https://github.com/gohugoio/hugo/releases) 的release下载对应的版本
|
||||||
|
|
||||||
|
检查安装`hugo version`查看是否已经安装成功
|
||||||
|
|
||||||
|
> 一般执行的时候,会出现告警,只要进入`系统偏好设置`->`安全性与隐私`->`通用`中`仍然允许`后,再执行一次就可以了
|
||||||
|
|
||||||
|
# 使用
|
||||||
|
|
||||||
|
1. 现在自己的目录(按照自己的习惯,我习惯`~/Workspaces/WebRoot`)下,执行`hugo new site xxx`
|
||||||
|
2. 找到自己喜欢的皮肤,个人喜欢 [even](https://github.com/olOwOlo/hugo-theme-even)
|
||||||
|
皮肤,该皮肤从hexo-theme-even移植而来,个人感觉还不错。到新建的项目下,进入 `themes`
|
||||||
|
目录,执行 `git clone https://github.com/olOwOlo/hugo-theme-even.git even`
|
||||||
|
3. 把`exampleSite`下的`config.toml`复制到`xxx`项目下,并根据自己的方式进行修改
|
||||||
|
4. 在 `xxx->content` 目录下,克隆你要维护的blog的markdown文档,文件夹名字命名为 `post` ,因为该theme使用的是post,而不是posts
|
||||||
|
5. 在`xxx` 目录夹运行`hugo -D`,建议先删除下`public`目录下的内容
|
||||||
|
|
||||||
|
命令如下
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Workspaces/WebRoot
|
||||||
|
hugo new site xxx
|
||||||
|
cd themes
|
||||||
|
git clone https://github.com/olOwOlo/hugo-theme-even.git even
|
||||||
|
cd ../
|
||||||
|
mv config.toml default.config.toml
|
||||||
|
cp themes/even/exampleSite/config.toml ./
|
||||||
|
|
||||||
|
# 修改自己的信息
|
||||||
|
vi config.toml
|
||||||
|
|
||||||
|
cd content
|
||||||
|
|
||||||
|
# clone 你blog的markdown地址
|
||||||
|
git clone xxx post
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
rm -rf public/*
|
||||||
|
hugo -D
|
||||||
|
```
|
||||||
|
|
||||||
|
# web搭建
|
||||||
|
|
||||||
|
刚才我们安装的路径是 `~/Workspaces/WebRoot/xxx` 而hugo生成的具体内容为`~/Workspaces/WebRoot/xxx/public/` 下,所以我们需要对nginx配置地址为相应的地址
|
||||||
|
|
||||||
|
配置如下:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name xxx; # 这里是域名
|
||||||
|
|
||||||
|
access_log /Users/xxxxx/Workspaces/WebRoot/logs/xxx/access.log main; # 这里 xxxxx 表示自己的对应目录
|
||||||
|
error_log /Users/xxxxx/Workspaces/WebRoot/logs/xxx/error.log;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
root /Users/xxxxx/Workspaces/WebRoot/xxx/public;
|
||||||
|
index index.html index.htm;
|
||||||
|
}
|
||||||
|
location /favicon.ico {
|
||||||
|
root /Users/xxxxx/Workspaces/WebRoot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
需要注意的是:nginx会获取权限失败,原因是启动的时候,需要指定用户信息`user root admin;`,并且用`sudo nginx -t`进行测试
|
||||||
7
content/posts/1.Learning/A1.StudyNotes/hugo-xuexi.md
Normal file
7
content/posts/1.Learning/A1.StudyNotes/hugo-xuexi.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "Hugo学习"
|
||||||
|
date: 2022-02-28T12:00:24+08:00
|
||||||
|
tags: ["hugo"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
在头部增加`tags`、`categories`可以在标签、分类上进行体现
|
||||||
15
content/posts/1.Learning/A1.StudyNotes/iphone-ibook.md
Normal file
15
content/posts/1.Learning/A1.StudyNotes/iphone-ibook.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "免费的苹果iBook软件"
|
||||||
|
date: 2022-03-01T01:01:19+08:00
|
||||||
|
tags: ["phone"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 如何操作
|
||||||
|
|
||||||
|
1. 打开[zlibrary](https://singlelogin.org/) 网站,选择右上角汉语
|
||||||
|
2. 注册后,通过邮箱激活网站
|
||||||
|
3. 登录刚才激活的邮箱,域名选择“书籍”
|
||||||
|
4. 进入后搜索你需要的书籍
|
||||||
|
5. 选择epub类型,通过safari下载。
|
||||||
|
6. 点开下载中的文件,通过”图书“软件打开
|
||||||
17
content/posts/1.Learning/A1.StudyNotes/kafka.md
Normal file
17
content/posts/1.Learning/A1.StudyNotes/kafka.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: "kafka学习"
|
||||||
|
date: 2022-10-03T15:29:00+08:00
|
||||||
|
tags: ["kafka"]
|
||||||
|
categories: ["Tech"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Kafka
|
||||||
|
|
||||||
|
> 教程地址:[Kafka](https://www.youtube.com/watch?v=19dzMtsV9pg&list=PLmOn9nNkQxJEDjzl0iBYZ3WuXUuUStxZl&index=4)
|
||||||
|
|
||||||
|
## 一、高吞吐量
|
||||||
|
|
||||||
|
1. 顺序写
|
||||||
|
2. 零拷贝
|
||||||
|
3. 分段日志:Segment
|
||||||
|
4. 预读(Read ahead)后写(Write Behind)
|
||||||
23
content/posts/1.Learning/A1.StudyNotes/mac-problem.md
Normal file
23
content/posts/1.Learning/A1.StudyNotes/mac-problem.md
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
title: "苹果系统问题"
|
||||||
|
date: 2022-03-01T01:04:18+08:00
|
||||||
|
tags: ["mac"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.邮箱无法删除
|
||||||
|
菜单选择:邮箱 -> 重建
|
||||||
|
|
||||||
|
## 2. Your have Mail
|
||||||
|
找到`/var/mail`,如果里面有内容。
|
||||||
|
使用 `mail` 查看具体内容或使用 `rm /var/mail/$USER` 进行删除
|
||||||
|
|
||||||
|
## 3. locale问题 远程登录时 `LC_CTYPE: cannot change locale (UTF-8)`
|
||||||
|
在.zshrc中添加以下命令
|
||||||
|
```
|
||||||
|
export LC_ALL=en_US.UTF-8
|
||||||
|
export LANG=en_US.UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
## 4. image2icon
|
||||||
|
mac上的图标不是新版本,看上去很不顺眼,可以使用该软件,生成icns后,然后使用“查看简介”,直接拖动到左上角的图标上 `xclient`
|
||||||
141
content/posts/1.Learning/A1.StudyNotes/snowflake.md
Normal file
141
content/posts/1.Learning/A1.StudyNotes/snowflake.md
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
---
|
||||||
|
title: "雪花算法"
|
||||||
|
date: 2022-06-29T16:43:16+08:00
|
||||||
|
tags: ["雪花算法"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 历史
|
||||||
|
|
||||||
|
[snowflake](https://github.com/twitter-archive/snowflake)是由 twitter 开源的分布式 id 生成算法,采 用 Scala 语言实现,是把一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id,12 bits 作为序列号。
|
||||||
|
|
||||||
|
小插曲:世界上没有两片相同的雪花,所以使用雪花来表示唯一
|
||||||
|
|
||||||
|
## 2. 算法内容
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* 1:第一位不使用:为什么这里第一位不使用,因为对于long类型,如果第一位是`1` 则说明是负数
|
||||||
|
|
||||||
|
* 2~42:表示时间戳,最多可以表示2^41-1次方的数值,可以是毫秒级。
|
||||||
|
* 43~52:表示工作机器ID,最多支持2^10机器,也就是1024的机器。可以自己定义前几位为机房ID。
|
||||||
|
* 53~64:表示自增ID,同一毫秒如果超过2^12次方的增长量,应该算非常大的了
|
||||||
|
|
||||||
|
## 3. 代码实现
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
public class SnowFlake {
|
||||||
|
|
||||||
|
private final long workerId;
|
||||||
|
private final long datacenterId;
|
||||||
|
private long sequence;
|
||||||
|
|
||||||
|
public SnowFlake(long workerId, long datacenterId, long sequence) {
|
||||||
|
// sanity check for workerId
|
||||||
|
// 这儿不就检查了一下,要求就是你传递进来的机房id和机器id不能超过32,不能小于0
|
||||||
|
// 这个是二进制运算,就是 5 bit最多只能有31个数字,也就是说机器id最多只能是32以内
|
||||||
|
// 这个是一个意思,就是 5 bit最多只能有31个数字,机房id最多只能是32以内
|
||||||
|
long maxWorkerId = ~(-1L << workerIdBits);
|
||||||
|
if (workerId > maxWorkerId || workerId < 0) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
|
||||||
|
}
|
||||||
|
long maxDatacenterId = ~(-1L << datacenterIdBits);
|
||||||
|
if (datacenterId > maxDatacenterId || datacenterId < 0) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
|
||||||
|
}
|
||||||
|
System.out.printf("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, " +
|
||||||
|
"sequence bits %d, workerid %d", timestampLeftShift, datacenterIdBits, workerIdBits,
|
||||||
|
sequenceBits, workerId);
|
||||||
|
|
||||||
|
this.workerId = workerId;
|
||||||
|
this.datacenterId = datacenterId;
|
||||||
|
this.sequence = sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final long workerIdBits = 5L;
|
||||||
|
private final long datacenterIdBits = 5L;
|
||||||
|
|
||||||
|
private final long sequenceBits = 12L;
|
||||||
|
|
||||||
|
private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
|
||||||
|
|
||||||
|
private long lastTimestamp = -1L;
|
||||||
|
|
||||||
|
public long getWorkerId() {
|
||||||
|
return workerId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getDatacenterId() {
|
||||||
|
return datacenterId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTimestamp() {
|
||||||
|
return System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public synchronized long nextId() {
|
||||||
|
// 这儿就是获取当前时间戳,单位是毫秒
|
||||||
|
long timestamp = timeGen();
|
||||||
|
|
||||||
|
if (timestamp < lastTimestamp) {
|
||||||
|
System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp);
|
||||||
|
throw new RuntimeException(String.format(
|
||||||
|
"Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastTimestamp == timestamp) {
|
||||||
|
// 这个意思是说一个毫秒内最多只能有4096个数字
|
||||||
|
// 无论你传递多少进来,这个位运算保证始终就是在4096这个范围内,避免你自己传递个sequence超过了4096这个范围
|
||||||
|
long sequenceMask = ~(-1L << sequenceBits);
|
||||||
|
sequence = (sequence + 1) & sequenceMask;
|
||||||
|
if (sequence == 0) {
|
||||||
|
timestamp = tilNextMillis(lastTimestamp);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sequence = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 这儿记录一下最近一次生成id的时间戳,单位是毫秒
|
||||||
|
lastTimestamp = timestamp;
|
||||||
|
|
||||||
|
// 这儿就是将时间戳左移,放到 41 bit那儿;
|
||||||
|
// 将机房 id左移放到 5 bit那儿;
|
||||||
|
// 将机器id左移放到5 bit那儿;将序号放最后12 bit;
|
||||||
|
// 最后拼接起来成一个 64 bit的二进制数字,转换成 10 进制就是个 long 型
|
||||||
|
long datacenterIdShift = sequenceBits + workerIdBits;
|
||||||
|
long twepoch = 1288834974657L;
|
||||||
|
return ((timestamp - twepoch) << timestampLeftShift) | (datacenterId << datacenterIdShift)
|
||||||
|
| (workerId << sequenceBits) | sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long tilNextMillis(long lastTimestamp) {
|
||||||
|
long timestamp = timeGen();
|
||||||
|
while (timestamp <= lastTimestamp) {
|
||||||
|
timestamp = timeGen();
|
||||||
|
}
|
||||||
|
return timestamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long timeGen() {
|
||||||
|
return System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------测试---------------
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SnowFlake worker = new SnowFlake(1, 1, 1);
|
||||||
|
for (int i = 0; i < 30; i++) {
|
||||||
|
System.out.println(worker.nextId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 参考地址:
|
||||||
|
|
||||||
|
1. https://blog.csdn.net/qq_33797815/article/details/113178832
|
||||||
43
content/posts/1.Learning/A1.StudyNotes/todo.md
Normal file
43
content/posts/1.Learning/A1.StudyNotes/todo.md
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
---
|
||||||
|
title: "TodoList"
|
||||||
|
date: 2023-04-13T19:57:12+08:00
|
||||||
|
tags: ["待完成"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
TODO未整理
|
||||||
|
|
||||||
|
golang的gc,gmp模型,context作用,channel原理,并发打印数字,slice和map原理
|
||||||
|
kafka的重平衡,高水位,顺序消费,怎么保证消息不丢失
|
||||||
|
rocketmq怎么实现事物消息
|
||||||
|
redis数据结构,zset原理,介绍cluster已经怎么保证高可用,哨兵模式介绍
|
||||||
|
mysql聚簇索引,索引优化,结合业务怎么分库分表,为啥一个表超过1000w性能会变差
|
||||||
|
|
||||||
|
压测,限流
|
||||||
|
降怎么保证服务高可用,限流熔断降级压测都要提下
|
||||||
|
监控报警这些
|
||||||
|
限流有哪些算法,以及却别要知道下
|
||||||
|
熔断策略是啥
|
||||||
|
限流:窗口计数,滑动窗口,漏桶,令牌桶
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1. webrtc是什么技术
|
||||||
|
2. webrtc与不同的socket通信有什么区别
|
||||||
|
3. webrtc如何实现连麦、直播的
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
# 计算方式
|
||||||
|
|
||||||
|
| 名称 | 计算方式 |
|
||||||
|
| ----- | ------------------------------------------------------------ |
|
||||||
|
| redis | http://www.redis.cn/redis_memory/ |
|
||||||
|
| mysql | select <br/>table_schema as '数据库',<br/>sum(table_rows) as '记录数',<br/>sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',<br/>sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'<br/>from information_schema.tables<br/>where table_schema='mysql';<br/>参考地址: https://blog.csdn.net/fdipzone/article/details/80144166 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
12
content/posts/1.Learning/A2.ReadingNotes/_index.md
Normal file
12
content/posts/1.Learning/A2.ReadingNotes/_index.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: "读书笔记"
|
||||||
|
date: 2023-04-15T11:02:56+08:00
|
||||||
|
categories: ["Learning", "ReadingNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指读书时记录的笔记,包括书摘、注释、心得等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 书籍摘录
|
||||||
|
* 书评心得
|
||||||
1136
content/posts/1.Learning/A2.ReadingNotes/book-list.md
Normal file
1136
content/posts/1.Learning/A2.ReadingNotes/book-list.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
title: "数组双指针"
|
||||||
|
date: 2023-09-21T17:10:12+08:00
|
||||||
|
tags: ["Algorithm"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
@ -0,0 +1,110 @@
|
|||||||
|
---
|
||||||
|
title: "链表双指针"
|
||||||
|
date: 2023-09-19T16:29:57+08:00
|
||||||
|
tags: ["Algorithm"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
到现在面试经历过很多次了,却很少有成功,之前拒掉了几次面试,现在非常后悔。
|
||||||
|
|
||||||
|
这里记录下之前面试的他们的算法题
|
||||||
|
|
||||||
|
## 1. 如何判断一个链表有环
|
||||||
|
|
||||||
|
1. 快慢指针可以解决这个问题
|
||||||
|
|
||||||
|
> 使用快慢指针。这里<b>为什么会相遇<b>?最坏的打算当慢指针走一圈的时候,快指针可以走两圈,所以刚好会在同一个点上面。
|
||||||
|
>
|
||||||
|
> 如果最后指向null,则说明没有环,如果最后走到了相同点,则说明有环。
|
||||||
|
|
||||||
|
2. 如何判断该环的起点在什么地方
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 1. 可以假设 环起点 到相遇点的距离为 m
|
||||||
|
> 2. 那么head到 环起点 刚好是 k-m
|
||||||
|
> 3. 因为慢指针走了 k 步快指针走了 2k 步相遇了,那么相遇点到快指针的相遇点(N圈之后的相遇点)距离就变成了 2k-k=k 距离一样。那么剪掉相同的环起点到相遇点的 m 都变成了 k-m 步。这样,把任何一个指针的头指针指向 head,用相同的速度,再次相遇点,就是环起点。
|
||||||
|
|
||||||
|
## 2. 两条链表是否相交
|
||||||
|
|
||||||
|
要判断两个链表是否相交,可以判断有没有共同部分,那么共同部分怎么判断呢?
|
||||||
|
|
||||||
|
1. 最原始的办法:使用map(映射)来记录每个node的信息,java中地址值不存在,可以直接判断引用是否一致。golang可以根据地址是否一致,也可以记录value是否一致(当然存在相同的value的情况就不行了)
|
||||||
|
2. 使用特殊手法,如下图
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
> 1. 双指针同时进行
|
||||||
|
> 2. 迭代A链表,结束后,迭代B链表
|
||||||
|
> 3. 迭代B链表,结束后,迭代A链表
|
||||||
|
> 4. 在迭代的时候,判断两个指针是否一致,如果存在一致
|
||||||
|
|
||||||
|
具体代码可以是
|
||||||
|
|
||||||
|
```go
|
||||||
|
p1, p2 := headA, headB
|
||||||
|
for p1 != p2 {
|
||||||
|
if p1 == nil {
|
||||||
|
p1 = headB
|
||||||
|
} else {
|
||||||
|
p1 = p1.Next
|
||||||
|
|
||||||
|
}
|
||||||
|
if p2 == nil {
|
||||||
|
p2 = headA
|
||||||
|
} else {
|
||||||
|
p2 = p2.Next
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p1
|
||||||
|
```
|
||||||
|
|
||||||
|
这里有个问题,如果一直没有重复的,会怎么样呢?
|
||||||
|
|
||||||
|
> 这个问题比较好回答,因为 A+B 和 B+A 之后,那么他们的总长度是相同的,相同的总长度,如果没有重合的话,肯定是nil,那么肯定满足 p1 = p2 的条件。
|
||||||
|
|
||||||
|
## 3. 合并多个链表
|
||||||
|
|
||||||
|
合并两个链表可以在程序中,对比两个链表的val来进行合并,但是合并多个链表,就存在不一样的问题了,所以需要其他的处理方式。
|
||||||
|
|
||||||
|
所以这里需要用到了priority队列,所以首先要完成优先队列
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Queue []*ListNode
|
||||||
|
|
||||||
|
func (q Queue) Len() int{
|
||||||
|
return len(q)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q Queue)Less(i,j int) bool {
|
||||||
|
return q[i].Val < q[j].Val
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q Queue)Swap(i, j int){
|
||||||
|
q[i],q[j] = q[j], q[i]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queue) Push(v interface{}){
|
||||||
|
*q = append(*q, v.(*LinkNode))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queue) Pop() interface{} {
|
||||||
|
old:= *q
|
||||||
|
n:=len(*q)
|
||||||
|
v:=*q[n-1]
|
||||||
|
*q = old[:n-1]
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 这里为什么对Queue的方法,即有Queue对象的,又有Queue指针的呢?
|
||||||
|
>
|
||||||
|
> 1. `Queue`本质上是个 *ListNode 数组,其Len/Less/Swap是比较常见的数组用来sort需要定义的函数,
|
||||||
|
>
|
||||||
|
> 2. 而Push、Pop则是使用数组来插入、获取的方法
|
||||||
|
>
|
||||||
|
> 其中 1 实现的 sort/sort.go中的 `type Interface interface` 接口,所以需要使用的是Queue对象。
|
||||||
|
>
|
||||||
|
> 而 2 实现的是对Queue的插入、获取方法,这些方法如果需要对<red>指针对象</red>进行操作,如果不是指针对象,而是复制对象,那不会影响原来的值,就没有意义。
|
||||||
|
>
|
||||||
|
> 注:具体关于优先级别队列的,可以参照 [网上介绍](https://ieevee.com/tech/2018/01/29/go-heap.html)
|
||||||
@ -0,0 +1,200 @@
|
|||||||
|
---
|
||||||
|
title: "链表转换"
|
||||||
|
date: 2023-09-20T07:53:39+08:00
|
||||||
|
tags: ["Algorithm"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
这里没有记住,需要在吸收下
|
||||||
|
|
||||||
|
## 链表反转
|
||||||
|
|
||||||
|
[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)
|
||||||
|
|
||||||
|
### for循环处理
|
||||||
|
|
||||||
|
时间复杂度O(N)(循环整个链表),空间复杂度O(1),只有几个临时变量
|
||||||
|
|
||||||
|
<img src="https://image.shijinping.cn/picgo/202309200854577.png" alt="image-20230920085359962" style="zoom:50%;" />
|
||||||
|
|
||||||
|
其实链表反转,无非就是上面这张图。
|
||||||
|
|
||||||
|
1. 记录current的next节点(因为这里current的next需要指向pre)
|
||||||
|
2. 把current的next指向pre
|
||||||
|
3. 把current节点变成pre节点
|
||||||
|
4. 把next节点变成current节点
|
||||||
|
|
||||||
|
> 最后当current节点变成空时,pre节点就是反转后的链表
|
||||||
|
|
||||||
|
代码如下:
|
||||||
|
|
||||||
|
```go
|
||||||
|
if head == nil || head.Next == nil {
|
||||||
|
return head
|
||||||
|
}
|
||||||
|
current := head // 把头指向当前
|
||||||
|
var pre *ListNode // 做一个pre节点
|
||||||
|
for current != nil {
|
||||||
|
next := current.Next // 1.记录当前的下一个节点
|
||||||
|
current.Next = pre // 2.把当前的next指向pre
|
||||||
|
pre = current // 3.把current节点变成pre节点
|
||||||
|
current = next // 4.把next节点变成current节点
|
||||||
|
}
|
||||||
|
return pre
|
||||||
|
```
|
||||||
|
|
||||||
|
### 迭代处理
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
核心思想:“2”节点后面的额所有元素都进过反转了,但是head“1”节点的next还是指向了“2”,所以可以直接把“2”的next指向head,这样就有反转后的链表了
|
||||||
|
|
||||||
|
```go
|
||||||
|
if head == nil || head.Next == nil {
|
||||||
|
return head
|
||||||
|
}
|
||||||
|
|
||||||
|
last := reverse(head.Next)
|
||||||
|
head.Next.Next = head
|
||||||
|
head.Next = nil
|
||||||
|
return last
|
||||||
|
```
|
||||||
|
|
||||||
|
## 反转链表中间部分
|
||||||
|
|
||||||
|
[92. 反转链表 II](https://leetcode.cn/problems/reverse-linked-list-ii/)
|
||||||
|
|
||||||
|
### for 循环处理
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
这里分成三部分:
|
||||||
|
|
||||||
|
1. 前段:不需要反转的
|
||||||
|
2. 中段:需要反转的
|
||||||
|
3. 后段:不需要反转的
|
||||||
|
|
||||||
|
如果这里left是0,那么就会出现前段为空,那么一般情况是加上dummy节点来处理。步骤分别是:
|
||||||
|
|
||||||
|
1. 把p0的next的next指向current
|
||||||
|
2. 把p0的next是pre
|
||||||
|
|
||||||
|
```go
|
||||||
|
if head == nil || head.Next == nil {
|
||||||
|
return head
|
||||||
|
}
|
||||||
|
|
||||||
|
dummy := &ListNode{Next: head}
|
||||||
|
p0 := dummy
|
||||||
|
for i := 0; i < left-1; i++ { // 注意:这里需要left-1,而不是left,因为需要少一个
|
||||||
|
p0 = p0.Next
|
||||||
|
}
|
||||||
|
|
||||||
|
var pre *ListNode
|
||||||
|
current := p0.Next
|
||||||
|
|
||||||
|
for i := 0; i < right-left+1; i++ {
|
||||||
|
next := current.Next
|
||||||
|
current.Next = pre
|
||||||
|
pre = current
|
||||||
|
current = next
|
||||||
|
}
|
||||||
|
p0.Next.Next = current // 把p0的next的next指向current
|
||||||
|
p0.Next = pre // 把p0的next是pre
|
||||||
|
return dummy.Next
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### 迭代处理
|
||||||
|
|
||||||
|
```go
|
||||||
|
if head == nil || head.Next == nil {
|
||||||
|
return head
|
||||||
|
}
|
||||||
|
var successor *ListNode
|
||||||
|
|
||||||
|
var reverseN func(head *ListNode, n int) *ListNode
|
||||||
|
reverseN = func(head *ListNode, n int) *ListNode {
|
||||||
|
if n == 1 {
|
||||||
|
successor = head.Next
|
||||||
|
return head
|
||||||
|
}
|
||||||
|
last := reverseN(head.Next, n-1)
|
||||||
|
head.Next.Next = head
|
||||||
|
head.Next = successor
|
||||||
|
return last
|
||||||
|
}
|
||||||
|
if left == 1 {
|
||||||
|
return reverseN(head, right)
|
||||||
|
}
|
||||||
|
head.Next = reverseBetween(head.Next, left-1, right-1)
|
||||||
|
return head
|
||||||
|
```
|
||||||
|
|
||||||
|
### 按照固定的K个长度进行反转
|
||||||
|
|
||||||
|
[25. K 个一组翻转链表](https://leetcode.cn/problems/reverse-nodes-in-k-group/)
|
||||||
|
|
||||||
|
这题还不会。。。
|
||||||
|
|
||||||
|
### 走一半后,反转链表
|
||||||
|
|
||||||
|
[234. 回文链表](https://leetcode.cn/problems/palindrome-linked-list/)
|
||||||
|
|
||||||
|
#### 方法1,非正规
|
||||||
|
|
||||||
|
把链表转换成数组,用数据进行处理
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 第一种:如果用slice来处理,耗时和内存占用都比较大
|
||||||
|
// 执行耗时:124 ms,击败了50.65% 的Go用户
|
||||||
|
// 内存消耗:8.3 MB,击败了73.55% 的Go用户
|
||||||
|
s := make([]int, 0, 100000) // 这里cap为100000,因为最大长度是10的5次方
|
||||||
|
for head != nil {
|
||||||
|
s = append(s, head.Val)
|
||||||
|
head = head.Next
|
||||||
|
}
|
||||||
|
left, right := 0, len(s)-1
|
||||||
|
for left < right {
|
||||||
|
if s[left] != s[right] {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
left++
|
||||||
|
right--
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方法2
|
||||||
|
|
||||||
|
> 1. 使用快慢指针获取链表的中间位置
|
||||||
|
> 2. 反转后半部分
|
||||||
|
> 3. 反转后的链表和原链表进行匹配
|
||||||
|
|
||||||
|
其中需要注意的部分是,怎么判断中间部分
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
这里的奇数部分需要做特殊处理,当fast不是nil,就说明是奇数,那么比对的是`2、1`这两个节点,所以slow需要往后移动一格
|
||||||
|
|
||||||
|
```go
|
||||||
|
fast, slow := head, head
|
||||||
|
for fast != nil && fast.Next != nil {
|
||||||
|
fast = fast.Next.Next
|
||||||
|
slow = slow.Next
|
||||||
|
}
|
||||||
|
if fast != nil {
|
||||||
|
slow = slow.Next // 这里就是上面图的特殊处理
|
||||||
|
}
|
||||||
|
left, right := head, reverse(slow) // reverse方法就是普通的反转链表
|
||||||
|
for right != nil {
|
||||||
|
if left.Val != right.Val {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
left = left.Next
|
||||||
|
right = right.Next
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
```
|
||||||
|
|
||||||
8
content/posts/1.Learning/A3.Reflections/DevOps/_index.md
Normal file
8
content/posts/1.Learning/A3.Reflections/DevOps/_index.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "DevOps"
|
||||||
|
date: 2023-04-20T09:01:37+08:00
|
||||||
|
tags: ["DevOps"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
DevOps 运维相关的知识点
|
||||||
@ -0,0 +1,105 @@
|
|||||||
|
---
|
||||||
|
title: "Mac安装homepage"
|
||||||
|
date: 2024-03-15T21:38:06+08:00
|
||||||
|
tags: ["DevOps"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. homepage介绍
|
||||||
|
|
||||||
|
官网地址:[这里](https://gethomepage.dev/latest/)
|
||||||
|
|
||||||
|
> 一个现代化、完全静态、快速、安全、完全代理、高度可定制的应用程序仪表板,集成了 100 多种服务,并可翻译成多种语言。通过 YAML 文件或 [Docker](coco://sendMessage?ext={"s%24wiki_link"%3A"https%3A%2F%2Fm.baike.com%2Fwikiid%2F1782721469276222823"}&msg=Docker) 标签发现轻松配置。
|
||||||
|
|
||||||
|
## 2. 为什么要写这个?
|
||||||
|
|
||||||
|
因为官网提供的是docker、k8s等安装方式,并没有提供mac本地安装,而我想在自己电脑上有这么一个。所以就要用源码安装了。
|
||||||
|
|
||||||
|
## 3. 普通安装会出来什么问题?
|
||||||
|
|
||||||
|
mac新版本用iTrem2的`nohup`启动后,退出iTrem2后,Session会关闭,导致`nohup`不成功
|
||||||
|
|
||||||
|
## 4. 如何处理?
|
||||||
|
|
||||||
|
### 4.1 下载源码,切换分支
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://github.com/gethomepage/homepage.git HomePage
|
||||||
|
git checkout tags/v0.8.9
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 确定node版本,编译
|
||||||
|
|
||||||
|
```shel
|
||||||
|
# 应该在18以上,我是20
|
||||||
|
# 到工作目录
|
||||||
|
npm install -g pnpm
|
||||||
|
pnpm install
|
||||||
|
pnpm build
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 创建plist
|
||||||
|
|
||||||
|
地址:`~/Library/LaunchAgents`
|
||||||
|
|
||||||
|
名称:`wiki.micah.homepage.plist` 注意,这里必须plist结尾的
|
||||||
|
|
||||||
|
内容:`xxx`表示你的用户目录
|
||||||
|
|
||||||
|
```shell
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
|
||||||
|
<key>Label</key>
|
||||||
|
<string>wiki.micah.homepage</string>
|
||||||
|
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
|
||||||
|
<key>KeepAlive</key>
|
||||||
|
<true/>
|
||||||
|
|
||||||
|
<key>ThrottleInterval</key>
|
||||||
|
<integer>60</integer>
|
||||||
|
|
||||||
|
<key>EnvironmentVariables</key>
|
||||||
|
<dict>
|
||||||
|
<key>HOME_DIR</key>
|
||||||
|
<string>/Users/xxx</string>
|
||||||
|
<key>APP_DIR</key>
|
||||||
|
<string>/Users/xxx/gethomepage/homepage</string>
|
||||||
|
<key>HOMEPAGE_ALLOWED_HOSTS</key>
|
||||||
|
<string>homepage.xxxx,localhost:3000</string>
|
||||||
|
</dict>
|
||||||
|
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/bin/zsh</string>
|
||||||
|
<string>-c</string>
|
||||||
|
<string>-l</string>
|
||||||
|
<string>source $HOME_DIR/.zshrc; /Users/micah/xxx/bin/pnpm start</string>
|
||||||
|
</array>
|
||||||
|
<key>WorkingDirectory</key>
|
||||||
|
<string>/Users/xxx/gethomepage/homepage</string>
|
||||||
|
|
||||||
|
<key>StandardOutPath</key>
|
||||||
|
<string>/Users/xxx/homepage.micah.wiki.node.info.log</string>
|
||||||
|
|
||||||
|
<key>StandardErrorPath</key>
|
||||||
|
<string>/Users/xxx/logs/homepage.micah.wiki.node.error.log</string>
|
||||||
|
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.4 加入到启动项目中
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 加入到启动项目
|
||||||
|
launchctl load ~/Library/LaunchAgents/wiki.micah.homepage.plist
|
||||||
|
# 从启动项目删除
|
||||||
|
launchctl unload ~/Library/LaunchAgents/wiki.micah.homepage.plist
|
||||||
|
```
|
||||||
|
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
title: "Mac电脑如何配置有格式的文件夹"
|
||||||
|
date: 2023-04-20T09:01:37+08:00
|
||||||
|
tags: ["DevOps"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 文件名命名
|
||||||
|
1. 从下面json多语言化中选择一个Key作为文件夹名
|
||||||
|
2. 在新建的文件夹名下,创建一个文件`touch .localized`
|
||||||
|
|
||||||
|
# 下面的文件地址: `/System/Library/CoreServices/SystemFolderLocalizations/zh_CN.lproj`
|
||||||
|
# 现在是二进制的,需要转换为其他格式,命令如下:
|
||||||
|
plutil -convert json SystemFolderLocalizations.strings # 该命令需要有执行权限的地方,不如拷贝到download下
|
||||||
|
|
||||||
|
# 更改图标
|
||||||
|
1. 右击查看“显示简介”
|
||||||
|
2. 命令行cd到`/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources` 然后输入 `open .`
|
||||||
|
3. 找到最喜欢的图标,然后`cmd+c`,在简介中的最上面图标点击后`cmd+v`
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Saved Searches": "已存储的搜索",
|
||||||
|
"Relocated Items": "迁移的项目",
|
||||||
|
"Deleted Users": "已删除的用户",
|
||||||
|
"Favorites": "个人收藏",
|
||||||
|
"Public": "公共",
|
||||||
|
"Compositions": "Compositions",
|
||||||
|
"Groups": "群组",
|
||||||
|
"Documents": "文稿",
|
||||||
|
"Sites": "站点",
|
||||||
|
"Network": "网络",
|
||||||
|
"System": "系统",
|
||||||
|
"My Network": "我的网络",
|
||||||
|
"Shared Items": "共享的项目",
|
||||||
|
"My Applications": "我的应用程序",
|
||||||
|
"Movies": "影片",
|
||||||
|
"Mail Downloads": "邮件下载",
|
||||||
|
"Servers": "服务器",
|
||||||
|
"Server": "服务器",
|
||||||
|
"Pictures": "图片",
|
||||||
|
"Shared": "共享",
|
||||||
|
"Recovered files": "恢复的文件",
|
||||||
|
"Configuration": "配置",
|
||||||
|
"Utilities": "实用工具",
|
||||||
|
"Security": "安全性",
|
||||||
|
"Incompatible Software": "不兼容的软件",
|
||||||
|
"Desktop": "桌面",
|
||||||
|
"Music": "音乐",
|
||||||
|
"Faxes": "传真",
|
||||||
|
"Downloads": "下载",
|
||||||
|
"Users": "用户",
|
||||||
|
"Guest": "客人",
|
||||||
|
"Drop Box": "投件箱",
|
||||||
|
"Web Receipts": "网页收据",
|
||||||
|
"Library": "资源库",
|
||||||
|
"Local": "本地",
|
||||||
|
"Applications": "应用程序"
|
||||||
|
}
|
||||||
|
```
|
||||||
364
content/posts/1.Learning/A3.Reflections/DevOps/pic-app.md
Normal file
364
content/posts/1.Learning/A3.Reflections/DevOps/pic-app.md
Normal file
@ -0,0 +1,364 @@
|
|||||||
|
---
|
||||||
|
title: "图片服务整体架构"
|
||||||
|
date: 2022-06-09T15:09:21+08:00
|
||||||
|
tags: ["CDN"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1.背景
|
||||||
|
|
||||||
|
面向海外用户设计图片类app的后端架构。
|
||||||
|
|
||||||
|
## 2. 目标
|
||||||
|
|
||||||
|
1. 考虑跨地区访问图片列表。
|
||||||
|
|
||||||
|
2. 图片容灾和备份服务。
|
||||||
|
|
||||||
|
3. 用户访问突增的解决方案。
|
||||||
|
|
||||||
|
4. 海外服务政策相关注意事项。
|
||||||
|
|
||||||
|
## 3. 方案(图片)
|
||||||
|
|
||||||
|
ps:这里先统一考虑图片的设计过程,图片解决后,再考虑业务后台过程
|
||||||
|
|
||||||
|
### 3.1 自研
|
||||||
|
|
||||||
|
#### 方案设计
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
1. 分布式文件系统:采用开源系统进行搭建分布式文件系统
|
||||||
|
2. 文件系统服务:可以新增图片时可以生成索引返回给业务,当业务只需要根据索引,就能查询到对应的文件内容
|
||||||
|
3. 业务层:上传服务主要负责图片的上传、而列表服务则是需要根据请求,获取列表及数据
|
||||||
|
4. 接入层:接收用户的请求,把请求代理到业务上
|
||||||
|
|
||||||
|
这么设计,可以实现一个图片类的应用。在实际中会有什么问题?
|
||||||
|
|
||||||
|
1. 不同区域的用户,体验不一样,用户离部署的节点越近,用户体验更好
|
||||||
|
|
||||||
|
因为根据之前的经验,地域对于网络的延迟影响很大。大致从ping上就能体现
|
||||||
|
|
||||||
|
| 地区1 | 地区2 | ping时间 |
|
||||||
|
| ----- | ----- | -------- |
|
||||||
|
| 上海 | 广州 | 30ms |
|
||||||
|
| 上海 | 上海 | 10ms |
|
||||||
|
| 上海 | 美国 | 100ms |
|
||||||
|
|
||||||
|
2. 从终端的成功率上看,由于网络上的丢包、延迟,成功率会低很多,特别是图片(目前图片1~3M都是比较正常的),这么大的图片,在过程中,发生丢包、延迟,失败率可想而知,会特别的高。
|
||||||
|
|
||||||
|
这种场景,我们可以考虑下,访问国外某些网站的时候,经常是失败,体验非常差
|
||||||
|
|
||||||
|
#### 改进点
|
||||||
|
|
||||||
|
那么需要怎么改进呢?
|
||||||
|
|
||||||
|
比较容易想到的就是,既然是距离远,那么直接在对应的地方部署一个服务,不就行了么?
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
这样各地的用户,通过dns的调度,访问对应的接入层,接入层只访问当前区域的服务(同一个区域),这样就减少了网络上的问题。解决了用户体验。但是,好像跟需求不是太耦合。。。需求是``跨区域访问``。
|
||||||
|
|
||||||
|
那么要怎么样实现跨区域访问呢?
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
从图上可以看出来,如果底层数据实现了数据同步,那么是不是就可以了?
|
||||||
|
|
||||||
|
比如亚洲用户发布内容,那么我们把数据同步给其他集群,这样其他集群就可以访问到亚洲用户的信息了
|
||||||
|
|
||||||
|
要怎么实现同步呢?目前了解到**``FastDFS``**可以实现分布式任务系统的,他是采用binlog进行同步,在log中有个标志位用户记录该条记录是``C: 增加 D: 删除 A: 添加 M: 修改 U: 更新整个文件 T: 截断文件`` 等,当亚洲区域进行添加时,会发送日志给美洲、欧洲,他们也会根据binlog的日志添加,这里需要注意:同步数据采用的标识与写入的是不一样的,采用小写,目的是为了区别是否需要同步给其他集群。
|
||||||
|
|
||||||
|
这里还没有对FastDFS跨区同步进行测试过,还不确定具体的延迟能够到达多少(有待验证)。
|
||||||
|
|
||||||
|
理论上,上面的方案是可以实现的,那么我们会有什么问题呢?
|
||||||
|
|
||||||
|
1. 所有图片数据,都存在多份,每个数据都需要进行公网的同步。
|
||||||
|
2. 文件传入与数据传输需要保证一致,不能有数据了,没有文件
|
||||||
|
|
||||||
|
那么我们有没有其他方案进行呢?下面我们来看下
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
对于图片,可以采用CDN加速。
|
||||||
|
|
||||||
|
对于API接口了解到市面上,有一种产品,叫做“全站加速”或者“动态加速”,也就是cdn不进行缓存,直接访问,这样的话,我们可以直接让用户访问,这样的话,所有数据都访问了中心区域的数据,通过“动态加速”把用户和源进行连接,核心是增加了数据传输的稳定性,降低失败率。
|
||||||
|
|
||||||
|
这种方式存在什么问题:
|
||||||
|
|
||||||
|
1. 数据量问题:
|
||||||
|
|
||||||
|
a) 扩容问题:这个也不算特别问题,是项目一般都会遇到
|
||||||
|
|
||||||
|
b) 冷热数据:如果统一的采用一套文件系统,那么会导致数据积累越来越多,文件系统会不停的扩大
|
||||||
|
|
||||||
|
3. 当然还有其他的一些需要考虑的点,比如高请求量下“文件内容缓存”、容灾备份等还没有详细讲
|
||||||
|
|
||||||
|
### 3.2 外部功能
|
||||||
|
|
||||||
|
既然自研中,考虑了外部功能,那么市面上是否有外部的功能,可以实现全球图片访问问题呢?
|
||||||
|
|
||||||
|
答案是肯定的:CDN+文件系统,这个方案目前也是比较成熟。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
该方案乍看一下,与自研的最早方案类似(主要关注左侧部分),都是全球直接接入“一层”,但实际上是不一样的:
|
||||||
|
|
||||||
|
1. CDN会覆盖全球节点,当用户接入时,能够就近访问,通过CDN的内网,访问“文件系统”
|
||||||
|
2. 文件系统可以自研,也可以采用云产品。
|
||||||
|
|
||||||
|
#### 3.2.1 CDN
|
||||||
|
|
||||||
|
用一个图来说明下
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
访问顺序:A -> B -> C -> D -> E
|
||||||
|
|
||||||
|
A. 边缘节点A(无数据,回源)-> 中心节点A (无数据,回源)-> 源站 -> 中心节点A(缓存)-> 边缘节点A(缓存)
|
||||||
|
|
||||||
|
B. 边缘节点A(有缓存,直接返回)
|
||||||
|
|
||||||
|
C. 边缘节点B(无数据,回源)-> 中心节点A(有缓存,直接返回)-> 边缘节点B(缓存)
|
||||||
|
|
||||||
|
D. 边缘节点C(无数据,回源)-> 中心节点B (无数据,回源)-> 源站 -> 中心节点B(缓存)-> 边缘节点C(缓存)
|
||||||
|
|
||||||
|
E. 边缘节点D(无数据,回源)-> 中心节点B(有缓存,直接返回)-> 边缘节点D(缓存)
|
||||||
|
|
||||||
|
所以第一次访问时,会比较慢,但是面向用户群体属于该区域,则大部分的体验,还是挺快的
|
||||||
|
|
||||||
|
#### 3.2.2 源站
|
||||||
|
|
||||||
|
目前各大云厂商,都提供了存储,并且针对与存储,并且容量没有限制
|
||||||
|
|
||||||
|
### 3.3 对比
|
||||||
|
|
||||||
|
那么,我们对两种方案价格进行对比下(初步对比,数据可能不准确):
|
||||||
|
|
||||||
|
| | 价格 | 技术 |
|
||||||
|
| ------------- | ------------------------------------------------------------ | --------------------------------------------------------- |
|
||||||
|
| 自研+数据同步 | (机器500G(700元/月)+宽带10M(650元/月))* 2 =2700(元/月) | 1. 同步数据服务<br>2. 文件系统服务<br>3. 冷热数据分离服务 |
|
||||||
|
| 自研+CDN分发 | 机器500G(700元/月)+宽带10M(650元/月)+CDN2T(900元/月)=2150(元/月) | 1. 文件系统服务<br/>2. 冷热数据分离服务 |
|
||||||
|
| 云厂商 | Bucket500G(200元/月)+回源流量1T(300元/月)+CDN2T(900元/月)=1400(元/月) | 无 |
|
||||||
|
|
||||||
|
### 3.4 选型
|
||||||
|
|
||||||
|
他们的**``优势``**分别是什么呢?
|
||||||
|
|
||||||
|
| | 自研+数据同步 | 自研+CDN分发 | 云厂商 |
|
||||||
|
| :------------- | ---------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
|
||||||
|
| 价格 | 高 | 中 | 低 |
|
||||||
|
| 突发流量(发) | 自主扩容 | 自主扩容 | 自动 |
|
||||||
|
| 突发流量(查) | 提升带宽、降级 | 自动 | 自动 |
|
||||||
|
| 访问速度 | 依赖于同步数据时间 | 首次依赖于回源速度,后面速度较快 | 首次依赖于回源速度,后面速度较快 |
|
||||||
|
| 是否支持容灾 | 多地备份 | 无 | 无 |
|
||||||
|
| 容灾备份成本 | 已经实现 | 1. 需要把文件系统全量同步到不同的区域,来实现容灾,整体成本,存储量 * 2<br>2. 需要实现文件同步服务代码 | bucket异地备份,存储成本*2,(2M以下的内容,一般分钟级别的延迟) |
|
||||||
|
| 冷热数据处理 | 需要开发冷热数据分离(大致方案在最下面问题中) | 需要开发冷热数据分离 | 已提供设置 |
|
||||||
|
| 负载均衡 | 自主控制 | 自动 | 自动 |
|
||||||
|
|
||||||
|
从上面的对比得出:
|
||||||
|
|
||||||
|
1. 初期项目+公司内没有对应的技术栈
|
||||||
|
|
||||||
|
选择**``云厂商``**
|
||||||
|
|
||||||
|
2. 公司已经有成熟的技术栈
|
||||||
|
|
||||||
|
选择**``自研+CDN分发``**
|
||||||
|
|
||||||
|
3. 公司在全球的节点部署比较成熟,并且有相应的稳定网络
|
||||||
|
|
||||||
|
选择**``全部自研``**
|
||||||
|
|
||||||
|
## 4. 后台
|
||||||
|
|
||||||
|
从图片的架构选型过程,对于后台的架构选型可以有两种
|
||||||
|
|
||||||
|
### 4.1 方案
|
||||||
|
|
||||||
|
#### 4.1.1 全球加速访问同一个区域
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
该方案整体上没有特别的点,主要是采用了``全球加速``来提升访问服务的稳定性,当访问用户离服务区域远,延迟会比较高
|
||||||
|
|
||||||
|
#### 4.1.2 多区域提供服务
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
这里的核心问题,其实就是数据如何同步。
|
||||||
|
|
||||||
|
接下来就对这块进行拆解
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
问1:**如果能够控制一个人,都是在同一个区域,那么是不是就会简单很多呢?**
|
||||||
|
|
||||||
|
答案是肯定的。如果一个人只是在同一个区域操作,那么只需要把这个人的数据直接同步到其他区域即可。
|
||||||
|
|
||||||
|
所以就需要在人身上,打上对应的标记,那么怎么标记?(在我的概念中,95%的人在一个相对的时间段内,都是在同一个地方。具体哪里看到,有点忘记了)
|
||||||
|
|
||||||
|
答1:**我们把用户注册,当作该用户所在的区域**
|
||||||
|
|
||||||
|
这样做,我们基本上可以让95%的用户能够就近访问。那么还有5%的人怎么办的?这个问题后面再讲。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
问2:各个区域,要如何实现同步呢?
|
||||||
|
|
||||||
|
答2:可以同步的有多个地方:
|
||||||
|
|
||||||
|
存储:直接使用存储自带的,比如MySQL、Redis都有自己的复制思路
|
||||||
|
|
||||||
|
业务:用中间件方式,比如kafka这种,多区域采用不同的消费者,来实现数据同步
|
||||||
|
|
||||||
|
存储同步,相对技术比较成熟,可以直接使用,可能出现的问题:
|
||||||
|
|
||||||
|
1. A->B->A这种情况
|
||||||
|
2. 如果我关系链同步到了,但是元数据还未同步,这个情况怎么办?
|
||||||
|
|
||||||
|
业务同步,由于本身是业务触发,所以对于业务上来说,所以可以解决存储同步的问题
|
||||||
|
|
||||||
|
1. 当A发起同步B时,B接受到同步,则不用发起再像A的同步
|
||||||
|
2. 可以先同步用户信息变更、再同步元数据变更、最后同步关系链
|
||||||
|
|
||||||
|
当然同步也会存在一些共性问题:
|
||||||
|
|
||||||
|
1. 网络问题:这个目前来说,我了解的主要有两种:
|
||||||
|
|
||||||
|
a)打专线,让各个区域的网络联通起来。
|
||||||
|
|
||||||
|
b)利用云厂商的内部网络,在他们的基础上进行处理
|
||||||
|
|
||||||
|
这两个办法,都是增加网络的稳定性,来减少丢包重传这种情况
|
||||||
|
|
||||||
|
2. 数据延迟:比如分钟内的延迟
|
||||||
|
|
||||||
|
延迟本身受区域距离、业务复杂度的影响,当前需求的场景下,我觉得如果能够达到这样的延迟,也是可以接受的。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
问3: 是否需要全部区域进行复制?
|
||||||
|
|
||||||
|
答3: 这个我觉得可以优化
|
||||||
|
|
||||||
|
当一个用户所有的订阅者,所属的区域是同一个区域,那么分发到其他区域,是没有意义的。因为其他区域不会找你的信息(没有关系链找到该用户),除非通过搜索这种,对于这种跨区需求,频率非常少,当本地不存在该信息时,可以远程拉取(可能首次出现了没有内容),但是如果存在了订阅该用户,则该用户就会往该区域同步信息。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
问4: 上面提到的,假设用户归属是新加坡,但是去欧洲出差半年,那么该用户每次都会需要从接入层转发到另外区域去获取数据么?(图上接入层的虚线部分)
|
||||||
|
|
||||||
|
答4: 答案是否定的。如果每次都要从另外区域去拉取,那么这部分用户基本上体验会很差,为了改善这个问题,用户上是可以挂在**``交集属性``** 就是说,本来用户属于区域A,但是这个时候用户挂在了交集属性“区域B”,那么,在后续有关注的用户有操作,也会同步到该区域。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
问5:如果数据修改顺序是A->B->C,但是同步后,到区域B的数据为A->C->B 那么数据就会造成不一致吧?
|
||||||
|
|
||||||
|
答5: 该问题也比较容易解决,可以在数据上增加版本好,同步后,用版本号大的覆盖版本号小的
|
||||||
|
|
||||||
|
#### 4.2 选型
|
||||||
|
|
||||||
|
做一个简单的对比
|
||||||
|
|
||||||
|
| | 方案1 | 方案2 |
|
||||||
|
| -------- | ---------------------------- | ---------------------------------- |
|
||||||
|
| 技术 | 简单,只考虑单区域即可 | 方案复杂 |
|
||||||
|
| 容灾方案 | 单区域多AZ | 多区域多AZ |
|
||||||
|
| 突发流量 | 扩机器(设计上服务无状态) | 突发集群扩机器(设计上服务无状态) |
|
||||||
|
| 体验 | 非服务所在区域,访问会有延迟 | 相对于1,服务会更好 |
|
||||||
|
|
||||||
|
那么该选哪个方案呢?
|
||||||
|
|
||||||
|
这个还是跟实际场景有关系
|
||||||
|
|
||||||
|
方案1:刚开始推广,能够覆盖大部分的用户。
|
||||||
|
|
||||||
|
方案2:产品相对比较成熟,用户在全球范围内,都有比较大的一个占比,团队也有一定的规模。或者在现有一个比较大群体下,新增的一个业务
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 5 接口设计
|
||||||
|
|
||||||
|
#### 5.1 发布
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
接口定义
|
||||||
|
|
||||||
|
```java
|
||||||
|
PublishRsp publish(long uid, PublishReq post);
|
||||||
|
```
|
||||||
|
|
||||||
|
注: 图片基于CDN的分发,用户上传后,给后台的只是一个URI地址。
|
||||||
|
|
||||||
|
#### 5.2 订阅列表
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
接口定义
|
||||||
|
|
||||||
|
```java
|
||||||
|
// 获取用户自己的时间线
|
||||||
|
TimelineRsp get(long uid, TimelineReq req);
|
||||||
|
|
||||||
|
// 获取某个用户(target)的时间线(这里会有两种情况,一个是target本人获取,一个是其他用户查看target的时间线,主要权限区别)
|
||||||
|
TimelineRsp getOneUser(long uid, long target, TimelineReq req);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 6. 关于海外政策相关
|
||||||
|
|
||||||
|
1. 预设标签分类,对于每个图片进行分类打标,不同的政策可以根据不同的标签进行过滤
|
||||||
|
|
||||||
|
2. 对于访问的图片(服务端吐出去的图片地址),可以进行异步检测。这种场景适用于:
|
||||||
|
|
||||||
|
a)为了弥补预设标签后,又增加了某些标签,历史数据特别大,如果全量扫,可能需要几个月。
|
||||||
|
|
||||||
|
b)临时性的政策,比如国家突然规定封杀某个信息。
|
||||||
|
|
||||||
|
## 7. 问题
|
||||||
|
|
||||||
|
1. 如果一个用户,被很多人关注,应该分发模式会导致服务压力过大
|
||||||
|
|
||||||
|
如果这种情况,其实不适合写扩散,因为量大容易引起服务异常,所以在这种情况下,就需要推拉结合的模式
|
||||||
|
|
||||||
|
2. 关于对发表后的内容操作(如评论)如何同步
|
||||||
|
|
||||||
|
这块的操作,大体上应该和内容分发类似,但是细节可能不一样,因为这里存在多地写的情况,可以考虑因果关系,全量评论同步。当然同步后,需要做到去重复。(这里相对复杂点)
|
||||||
|
|
||||||
|
3. 如何预防黑产利用漏洞,盗用流量资源
|
||||||
|
|
||||||
|
a) 对上传资源的监控,通过回掉来确认资源是否被使用
|
||||||
|
|
||||||
|
b) 对资源进行加密,CDN侧增加鉴权,鉴权不通过,则直接拒绝
|
||||||
|
|
||||||
|
4. 冷热数据分离
|
||||||
|
|
||||||
|
根据日期进行分离,可以分成1天、7天、30天、半年、一年以上的数据进行统计,根据占比和访问请求,来规划冷热数据分离,冷数据可以采用更低的资源进行存储,减少成本
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 其他资料
|
||||||
|
|
||||||
|
海外服务政策相关注意事项
|
||||||
|
|
||||||
|
a) 采集信息:IP信息及地区信息(为了让用户更快速的访问)
|
||||||
|
|
||||||
|
b) 用户内容:昵称等(用户之间的必要通信信息)
|
||||||
|
|
||||||
|
c) 日志数据:订阅关系、元数据、访问日期、时间戳等(确保安全的提供服务)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
各个区域公网的ping延迟
|
||||||
|
|
||||||
|
美国西部 1 (硅谷)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
美国东部 1 (弗吉尼亚)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
title: "Ubuntu服务器初始化"
|
||||||
|
date: 2023-09-30T18:21:47+08:00
|
||||||
|
tags: ["ubuntu"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 初始化需要的步骤
|
||||||
|
|
||||||
|
## 1. 更新
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo apt upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. 安装软件
|
||||||
|
|
||||||
|
```shell
|
||||||
|
sudo apt-get install nginx
|
||||||
|
# 修改启动用户为root
|
||||||
|
vi /etc/nginx/nginx.conf # 第一行
|
||||||
|
# user root;
|
||||||
|
```
|
||||||
|
|
||||||
11
content/posts/1.Learning/A3.Reflections/Golang/BaseTech.md
Normal file
11
content/posts/1.Learning/A3.Reflections/Golang/BaseTech.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
title: "基础知识"
|
||||||
|
date: 2023-02-01T14:26:42+08:00
|
||||||
|
tags: ["Golang"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
1. 数组与切片
|
||||||
|
2. 范型
|
||||||
|
3. String.Builder
|
||||||
|
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
title: "设计模式"
|
||||||
|
date: 2023-02-01T14:26:42+08:00
|
||||||
|
tags: ["Golang"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. 单一职责
|
||||||
|
|
||||||
|
类的职责单一,对外只提供一个功能,而引起类变化的原因都应该只有一个。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 2. 开闭
|
||||||
|
|
||||||
|
类的改动是通过增加代码进行的,而不是修改源代码。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 3. 里氏代换原则
|
||||||
|
|
||||||
|
任何抽象类出现的地方都可以用他的实现类替换,实际就是虚拟机制,语言级别实现面向对象功能。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 4. 依赖倒转原则
|
||||||
|
|
||||||
|
依赖于抽象接口,不要依赖具体的实现类,也就是针对接口编程。
|
||||||
226
content/posts/1.Learning/A3.Reflections/Golang/GoRPCBase.md
Normal file
226
content/posts/1.Learning/A3.Reflections/Golang/GoRPCBase.md
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
---
|
||||||
|
title: "Go RPC相关及基础信息"
|
||||||
|
date: 2023-09-15T14:26:42+08:00
|
||||||
|
tags: ["Golang"]
|
||||||
|
categories: ["Learning", "StudyNotes"]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Go 的RPC 相关的基础信息
|
||||||
|
|
||||||
|
## 1. 环境配置(MacOS)
|
||||||
|
|
||||||
|
### 1.1 protoc 安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. brew 安装
|
||||||
|
brew search protobuf
|
||||||
|
brew install protobuf # 可以指定版本protobuf@21
|
||||||
|
|
||||||
|
# 验证是否安装成功
|
||||||
|
protoc --version
|
||||||
|
|
||||||
|
# 2. 源码安装
|
||||||
|
https://github.com/protocolbuffers/protobuf/releases #下载对应的版本,放入GOPATH中的bin目录下
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 protoc-gen-go 安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
|
||||||
|
# 安装过程中会出现无法下载,需要自行“走强”
|
||||||
|
|
||||||
|
# 验证
|
||||||
|
protoc-gen-go help
|
||||||
|
# protoc-gen-go: unknown argument "help" (this program should be run by protoc, not directly)
|
||||||
|
# ps:我觉得只要识别到,就应该安装成功了
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.3 protoc-gen-go-grpc 安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
|
||||||
|
# 同 protoc-gen-go
|
||||||
|
|
||||||
|
# 验证
|
||||||
|
protoc-gen-go-grpc -version
|
||||||
|
# protoc-gen-go-grpc 1.3.0
|
||||||
|
```
|
||||||
|
|
||||||
|
## 2. Proto转成桩代码
|
||||||
|
|
||||||
|
### 2.1 proto 生成
|
||||||
|
|
||||||
|
> 参考地址:https://protobuf.dev/
|
||||||
|
|
||||||
|
```protobuf
|
||||||
|
syntax = "proto3";
|
||||||
|
import public "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
|
option go_package = "./news";
|
||||||
|
option java_multiple_files = true;
|
||||||
|
option java_package = "wiki.micah.news";
|
||||||
|
option java_outer_classname = "News";
|
||||||
|
|
||||||
|
package news;
|
||||||
|
|
||||||
|
message News {
|
||||||
|
int64 id = 1;
|
||||||
|
|
||||||
|
string title = 2;
|
||||||
|
|
||||||
|
string keyword = 3;
|
||||||
|
|
||||||
|
string desc = 4;
|
||||||
|
|
||||||
|
google.protobuf.Timestamp happen_time = 5;
|
||||||
|
|
||||||
|
int32 state = 6;
|
||||||
|
|
||||||
|
google.protobuf.Timestamp create_time = 7;
|
||||||
|
|
||||||
|
google.protobuf.Timestamp update_time = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
message NewsRequest {
|
||||||
|
string name = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message NewsResponse {
|
||||||
|
repeated News news_list = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
service SearchService {
|
||||||
|
rpc Search (NewsRequest) returns (NewsResponse);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.2 git 仓库打分支
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 打tag
|
||||||
|
git tag -a v0.1.0-alpha -m "预发布"
|
||||||
|
# 推送tag到目标上
|
||||||
|
git push origin v0.1.0-alpha
|
||||||
|
```
|
||||||
|
|
||||||
|
## 3. 程序编写
|
||||||
|
|
||||||
|
### 3.1 go.mod编写
|
||||||
|
|
||||||
|
```go
|
||||||
|
require (
|
||||||
|
github.com/supermicah/Protobufs v0.1.2-alpha
|
||||||
|
google.golang.org/grpc v1.58.1
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 client 编写
|
||||||
|
|
||||||
|
根据grpc的helloworld进行编写
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
"log"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
pb "github.com/supermicah/Protobufs/news/micah/wiki/news"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
defaultName = "world"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
addr = flag.String("addr", "localhost:50051", "the address to connect to")
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
// Set up a connection to the server.
|
||||||
|
conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("did not connect: %v", err)
|
||||||
|
}
|
||||||
|
defer func() { _ = conn.Close() }()
|
||||||
|
c := pb.NewSearchServiceClient(conn)
|
||||||
|
|
||||||
|
// Contact the server and print out its response.
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
|
||||||
|
defer cancel()
|
||||||
|
r, err := c.Search(ctx, &pb.NewsRequest{Name: "你好"})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("could not greet: %v", err)
|
||||||
|
}
|
||||||
|
log.Printf("NewsList: %s", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.3 server编写
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"google.golang.org/protobuf/types/known/timestamppb"
|
||||||
|
"log"
|
||||||
|
"net"
|
||||||
|
|
||||||
|
pb "github.com/supermicah/Protobufs/news/micah/wiki/news"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
port = flag.Int("port", 50051, "The server port")
|
||||||
|
)
|
||||||
|
|
||||||
|
// server is used to implement helloworld.GreeterServer.
|
||||||
|
type server struct {
|
||||||
|
pb.UnimplementedSearchServiceServer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search implements helloworld.GreeterServer
|
||||||
|
func (s *server) Search(ctx context.Context, in *pb.NewsRequest) (*pb.NewsResponse, error) {
|
||||||
|
log.Printf("Received: %v", in.GetName())
|
||||||
|
newsList := make([]*pb.News, 0)
|
||||||
|
newsList = append(newsList, &pb.News{
|
||||||
|
Id: 1,
|
||||||
|
Title: "test",
|
||||||
|
Keyword: "test",
|
||||||
|
Desc: "test",
|
||||||
|
HappenTime: ×tamppb.Timestamp{Seconds: 1, Nanos: 1},
|
||||||
|
State: 0,
|
||||||
|
CreateTime: ×tamppb.Timestamp{Seconds: 2, Nanos: 2},
|
||||||
|
UpdateTime: ×tamppb.Timestamp{Seconds: 3, Nanos: 3},
|
||||||
|
})
|
||||||
|
return &pb.NewsResponse{NewsList: newsList}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
flag.Parse()
|
||||||
|
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("failed to listen: %v", err)
|
||||||
|
}
|
||||||
|
s := grpc.NewServer()
|
||||||
|
pb.RegisterSearchServiceServer(s, &server{})
|
||||||
|
log.Printf("server listening at %v", lis.Addr())
|
||||||
|
if err := s.Serve(lis); err != nil {
|
||||||
|
log.Fatalf("failed to serve: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.4 整体项目结构
|
||||||
|
|
||||||
|

|
||||||
8
content/posts/1.Learning/A3.Reflections/Golang/_index.md
Normal file
8
content/posts/1.Learning/A3.Reflections/Golang/_index.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "Golang"
|
||||||
|
date: 2022-05-20T20:27:49+08:00
|
||||||
|
tags: ["Golang"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
Golang 相关
|
||||||
8
content/posts/1.Learning/A3.Reflections/Java/_index.md
Normal file
8
content/posts/1.Learning/A3.Reflections/Java/_index.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "Java"
|
||||||
|
date: 2023-04-15T16:14:19+08:00
|
||||||
|
tags: ["Java"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
Java相关
|
||||||
58
content/posts/1.Learning/A3.Reflections/Java/java-atomic.md
Normal file
58
content/posts/1.Learning/A3.Reflections/Java/java-atomic.md
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
title: "JavaAtomic工具类"
|
||||||
|
date: 2023-08-25T22:21:01+08:00
|
||||||
|
tags: ["java"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Atomic*工具类
|
||||||
|
|
||||||
|
## AtomicBoolean
|
||||||
|
|
||||||
|
### 1. 成员变量
|
||||||
|
|
||||||
|
```java
|
||||||
|
// 对应的类中的成员变量句柄
|
||||||
|
private static final VarHandle VALUE;
|
||||||
|
// 存储变量的值
|
||||||
|
private volatile int value;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 核心
|
||||||
|
|
||||||
|
set时使用句柄(VarHandle)来进行设置value,获取时使用value进行获取
|
||||||
|
|
||||||
|
## AtomicInteger
|
||||||
|
|
||||||
|
### 1. 成员变量
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static final Unsafe U = Unsafe.getUnsafe();
|
||||||
|
private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");
|
||||||
|
private volatile int value;
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.核心
|
||||||
|
|
||||||
|
与Boolean类似
|
||||||
|
|
||||||
|
## AtomicLong
|
||||||
|
|
||||||
|
### 1. 成员变量
|
||||||
|
|
||||||
|
```java
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
# Atomic*Array工具类
|
||||||
|
|
||||||
|
## AtomicIntegerArray
|
||||||
|
|
||||||
|
### 1. 成员变量
|
||||||
|
|
||||||
|
```java
|
||||||
|
private static final VarHandle AA = MethodHandles.arrayElementVarHandle(int[].class);
|
||||||
|
private final int[] array;
|
||||||
|
```
|
||||||
|
|
||||||
28
content/posts/1.Learning/A3.Reflections/Java/java-jmm.md
Normal file
28
content/posts/1.Learning/A3.Reflections/Java/java-jmm.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
title: "Java内存模型"
|
||||||
|
date: 2022-06-02T10:21:01+08:00
|
||||||
|
tags: ["java"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Java内存模型(JMM)
|
||||||
|
|
||||||
|
## 概念
|
||||||
|
|
||||||
|
> Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。
|
||||||
|
>
|
||||||
|
> Java内存模型(不仅仅是JVM内存分区):调用栈和本地变量存放在线程栈上,对象存放在堆上。
|
||||||
|
|
||||||
|
## 堆栈存放规则
|
||||||
|

|
||||||
|
|
||||||
|
1. 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。
|
||||||
|
2. 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。
|
||||||
|
3. 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上,即使这些方法所属的对象存放在堆上。
|
||||||
|
4. 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。
|
||||||
|
5. 静态成员变量跟随着类定义一起也存放在堆上。
|
||||||
|
6. 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个成员变量的私有拷贝。
|
||||||
|
|
||||||
|
|
||||||
|
## 资料地址
|
||||||
|
1. [EnjoyMoving](https://zhuanlan.zhihu.com/p/29881777)
|
||||||
123
content/posts/1.Learning/A3.Reflections/Java/java-thread.md
Normal file
123
content/posts/1.Learning/A3.Reflections/Java/java-thread.md
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
---
|
||||||
|
title: "Java线程"
|
||||||
|
date: 2022-06-02T10:22:45+08:00
|
||||||
|
tags: ["java"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 线程
|
||||||
|
|
||||||
|
## 概念
|
||||||
|
1. Java线程是什么
|
||||||
|
> Java的线程,是运行在JVM的程序上的基本执行单元, Java针对线程抽象出Thread对象的概念。
|
||||||
|
|
||||||
|
2. Java线程分类
|
||||||
|
> Thread分为守护线程和非守护线程,当JVM启动时,伴随一个非守护线程的运行,我们称之为主线程/main函数,当JVM所有的非守护线程都销毁时,JVM实例也会销毁;
|
||||||
|
|
||||||
|
3. Java线程生命周期
|
||||||
|
> Java线程包含6个状态:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,TERMINATED
|
||||||
|
|
||||||
|
4. 多线程优缺点
|
||||||
|
> JVM支持多线程,正确使用多线程能大大提高程序的服务能力,同时也引入程序的复杂度和线程安全问题(不正确使用)。
|
||||||
|
|
||||||
|
## 状态`Thread.State`
|
||||||
|
> 一个线程在指定的时刻上,只能存在一个状态;JVM的线程状态和操作系统的线程状态不是一一对应的。了解线程状态可用于分析线程问题/监控,不建议通过判断线程状态来进行逻辑处理
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
* `NEW` (新建)
|
||||||
|
> 一个尚未启动的线程处于这一状态。(A thread that has not yet started is in this state.)
|
||||||
|
|
||||||
|
尚未启动的线程处于这一状态,即尚未调用start()
|
||||||
|
```Java
|
||||||
|
Theard t = new Theard();
|
||||||
|
```
|
||||||
|
|
||||||
|
* `RUNNABLE` (可运行)
|
||||||
|
> 一个正在 Java 虚拟机中执行的线程处于这一状态。(A thread executing in the Java virtual machine is in this state.)
|
||||||
|
|
||||||
|
JVM中可执行的线程处于这一状态
|
||||||
|
```Java
|
||||||
|
Theard t = new Theard();
|
||||||
|
t.start();
|
||||||
|
```
|
||||||
|
|
||||||
|
* `BLOCKED` (阻塞)
|
||||||
|
> 一个正在阻塞等待一个监视器锁的线程处于这一状态。(A thread that is blocked waiting for a monitor lock is in this state.)
|
||||||
|
|
||||||
|
线程等待监视器锁时处于这一状态,如 synchronized,通俗理解:当因为获取不到锁而无法进入同步块时,线程处于 BLOCKED 状态。
|
||||||
|
|
||||||
|
* `WAITING` (等待)
|
||||||
|
> 一个正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态。(A thread that is waiting indefinitely for another thread to perform a particular action is in this state.)
|
||||||
|
|
||||||
|
正在无限期等待另一个线程执行一个特别的动作的线程处于这一状态,如 `Object.wait()`、`Thread.join()`、`LockSupport.park()`。特别动作分别为:`notify/notifyAll`、线程完结、、`LockSupport.unpark()`
|
||||||
|
|
||||||
|
* `TIMED_WAITING` (计时等待)
|
||||||
|
> 一个正在限时等待另一个线程执行一个动作的线程处于这一状态。(A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state.)
|
||||||
|
|
||||||
|
限时等待另一个线程执行一个动作的线程处于这一状态,如:`Thread.sleep(long millis)`、`Object.wait(long millis`,`Object.wait(long millis)`、`Thread.join(long millis)`、`LockSupport.parkNanos(Object blocker, long nanos) `、 `LockSupport.parkUntil(Object blocker, long nanos)`
|
||||||
|
|
||||||
|
* `TERMINATED` (终止)
|
||||||
|
> 一个已经退出的线程处于这一状态。(A thread that has exited is in this state.)
|
||||||
|
|
||||||
|
已经退出的线程处于这一状态
|
||||||
|
|
||||||
|
## 方法
|
||||||
|
* 常用新建线程
|
||||||
|
|
||||||
|
```Java
|
||||||
|
// 1. 默认新建
|
||||||
|
Thread t1 = new Thread();
|
||||||
|
|
||||||
|
// 2. 传入runnable方法
|
||||||
|
Thread t2 = new Thread(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
synchronized (xxx) {
|
||||||
|
// todo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 3. 传入默认名称
|
||||||
|
Thread t3 = new Thread("thread-name");
|
||||||
|
|
||||||
|
// 还有些是其他方法,详细Thread类
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
* 线程开始
|
||||||
|
|
||||||
|
```Java
|
||||||
|
/**
|
||||||
|
* Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.
|
||||||
|
*/
|
||||||
|
start();
|
||||||
|
```
|
||||||
|
该方法代码实现是调用 `start0();` 方法,但实际上是调用Thread中的 `run()` 方法;
|
||||||
|
|
||||||
|
* 退出(内部方法)
|
||||||
|
|
||||||
|
```Java
|
||||||
|
/**
|
||||||
|
* This method is called by the system to give a Thread
|
||||||
|
* a chance to clean up before it actually exits.
|
||||||
|
*/
|
||||||
|
exit();
|
||||||
|
```
|
||||||
|
|
||||||
|
```Java
|
||||||
|
/**
|
||||||
|
* 只是在当前线程中打了一个停止的标记,并不是直接将线程停止
|
||||||
|
*/
|
||||||
|
interrupt();
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 其他
|
||||||
|
线程优先级别
|
||||||
|
|
||||||
|
|
||||||
|
## 资料索引
|
||||||
|
1. [国栋的osChina](https://my.oschina.net/goldenshaw?tab=newest&catalogId=3277710)
|
||||||
2214
content/posts/1.Learning/A3.Reflections/Java/spring-security.md
Normal file
2214
content/posts/1.Learning/A3.Reflections/Java/spring-security.md
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,42 @@
|
|||||||
|
---
|
||||||
|
title: "Springboot问题汇总"
|
||||||
|
date: 2023-10-14T21:43:48+08:00
|
||||||
|
tags: ["java"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
### 1. 编写starter时,引用后无法获取到bean
|
||||||
|
|
||||||
|
> 环境:使用版本Springboot3.1.4版本
|
||||||
|
|
||||||
|
问题:之前写starter的时候,一直是按照网上的教程,大部分是Springboot2.x版本,但自己使用了最新版本Springboot3.1.4版本,所以一直不成功。
|
||||||
|
|
||||||
|
深入代码查看后,发现以下跟老版本不一致。
|
||||||
|
|
||||||
|
新版本:
|
||||||
|
|
||||||
|
```
|
||||||
|
SpringBootApplication --> EnableAutoConfiguration --> AutoConfigurationImportSelector.getCandidateConfigurations --> ImportCandidates.load --> LOCATION --> "META-INF/spring/%s.imports"
|
||||||
|
```
|
||||||
|
|
||||||
|
老版本:
|
||||||
|
|
||||||
|
```
|
||||||
|
SpringBootApplication --> EnableAutoConfiguration --> AutoConfigurationImportSelector.getCandidateConfigurations --> SpringFactoriesLoader.loadFactoryNames --> Factories_RESOURCE_LOCATION --> "META-INF/spring.factories"
|
||||||
|
```
|
||||||
|
|
||||||
|
所以按照新版 ` META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 进行编写的,可以正常识别。
|
||||||
|
|
||||||
|
注意:
|
||||||
|
|
||||||
|
这里的内容也不一样了,之前是需要写入一行,新版本支持多行格式
|
||||||
|
|
||||||
|
```java
|
||||||
|
Enumeration<URL> urls = findUrlsInClasspath(classLoaderToUse, location);
|
||||||
|
List<String> importCandidates = new ArrayList<>();
|
||||||
|
while (urls.hasMoreElements()) { // 如果有多行,直接支持了,把所有的都加入到importCandidates中去了
|
||||||
|
URL url = urls.nextElement();
|
||||||
|
importCandidates.addAll(readCandidateConfigurations(url));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: "MyBatis"
|
||||||
|
date: 2023-04-15T16:14:19+08:00
|
||||||
|
tags: ["MyBatis"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
MyBatis相关
|
||||||
105
content/posts/1.Learning/A3.Reflections/MyBatis/mybatis.md
Normal file
105
content/posts/1.Learning/A3.Reflections/MyBatis/mybatis.md
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
---
|
||||||
|
title: "mybatis"
|
||||||
|
date: 2022-07-06T16:43:01+08:00
|
||||||
|
tags: ["mybatis"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
```
|
||||||
|
阅读准备参考:https://www.jianshu.com/p/e739afb8fe31
|
||||||
|
需要导入模块:需要将mybatis-parent模块导入。mybatis-parent模块链接 https://github.com/mybatis/parent
|
||||||
|
|
||||||
|
1.兵马未动,日志先行
|
||||||
|
org.apache.ibatis.logging
|
||||||
|
org.apache.ibatis.logging.commons
|
||||||
|
org.apache.ibatis.logging.jdbc
|
||||||
|
org.apache.ibatis.logging.jdk14
|
||||||
|
org.apache.ibatis.logging.log4j
|
||||||
|
org.apache.ibatis.logging.log4j2
|
||||||
|
org.apache.ibatis.logging.nologging
|
||||||
|
org.apache.ibatis.logging.slf4j
|
||||||
|
org.apache.ibatis.logging.stdout
|
||||||
|
对象适配器设计模式
|
||||||
|
设计模式可参考http://www.cnblogs.com/liuling/archive/2013/04/12/adapter.html
|
||||||
|
|
||||||
|
2.异常
|
||||||
|
org.apache.ibatis.exceptions
|
||||||
|
|
||||||
|
3.缓存
|
||||||
|
org.apache.ibatis.cache
|
||||||
|
org.apache.ibatis.cache.decorators
|
||||||
|
org.apache.ibatis.cache.impl
|
||||||
|
|
||||||
|
4.解析
|
||||||
|
org.apache.ibatis.parsing
|
||||||
|
xml解析,${} 格式的字符串解析
|
||||||
|
源码分析可以参考http://www.cnblogs.com/sunzhenchao/p/3161093.html
|
||||||
|
|
||||||
|
5.类型处理器
|
||||||
|
org.apache.ibatis.type
|
||||||
|
实现java和jdbc中的类型之间转换
|
||||||
|
源码分析可以参考http://www.cnblogs.com/sunzhenchao/archive/2013/04/09/3009431.html
|
||||||
|
|
||||||
|
6.IO
|
||||||
|
org.apache.ibatis.io
|
||||||
|
通过类加载器在jar包中寻找一个package下满足条件(比如某个接口的子类)的所有类
|
||||||
|
|
||||||
|
7.反射
|
||||||
|
org.apache.ibatis.reflection
|
||||||
|
org.apache.ibatis.reflection.factory
|
||||||
|
org.apache.ibatis.reflection.invoker
|
||||||
|
org.apache.ibatis.reflection.property
|
||||||
|
org.apache.ibatis.reflection.wrapper
|
||||||
|
可以参考MetaObjectTest来跟踪调试,基本上用到了reflection包下所有的类
|
||||||
|
|
||||||
|
8.数据源
|
||||||
|
org.apache.ibatis.datasource
|
||||||
|
org.apache.ibatis.datasource.jndi
|
||||||
|
org.apache.ibatis.datasource.pooled
|
||||||
|
org.apache.ibatis.datasource.unpooled
|
||||||
|
|
||||||
|
9.事务
|
||||||
|
org.apache.ibatis.transaction
|
||||||
|
org.apache.ibatis.transaction.jdbc
|
||||||
|
org.apache.ibatis.transaction.managed
|
||||||
|
|
||||||
|
10.会话
|
||||||
|
org.apache.ibatis.session
|
||||||
|
org.apache.ibatis.session.defaults
|
||||||
|
|
||||||
|
11.jdbc单元测试工具
|
||||||
|
org.apache.ibatis.jdbc
|
||||||
|
|
||||||
|
12.构建
|
||||||
|
org.apache.ibatis.builder
|
||||||
|
org.apache.ibatis.builder.annotation
|
||||||
|
org.apache.ibatis.builder.xml
|
||||||
|
|
||||||
|
13.映射
|
||||||
|
org.apache.ibatis.mapping
|
||||||
|
|
||||||
|
14.脚本
|
||||||
|
org.apache.ibatis.scripting
|
||||||
|
org.apache.ibatis.scripting.defaults
|
||||||
|
org.apache.ibatis.scripting.xmltags
|
||||||
|
|
||||||
|
15.注解
|
||||||
|
org.apache.ibatis.annotations
|
||||||
|
|
||||||
|
16.绑定
|
||||||
|
org.apache.ibatis.binding
|
||||||
|
|
||||||
|
17.执行器
|
||||||
|
org.apache.ibatis.executor
|
||||||
|
org.apache.ibatis.executor.keygen
|
||||||
|
org.apache.ibatis.executor.loader
|
||||||
|
org.apache.ibatis.executor.loader.cglib
|
||||||
|
org.apache.ibatis.executor.loader.javassist
|
||||||
|
org.apache.ibatis.executor.parameter
|
||||||
|
org.apache.ibatis.executor.result
|
||||||
|
org.apache.ibatis.executor.resultset
|
||||||
|
org.apache.ibatis.executor.statement
|
||||||
|
|
||||||
|
18.插件
|
||||||
|
org.apache.ibatis.plugin
|
||||||
|
```
|
||||||
12
content/posts/1.Learning/A3.Reflections/_index.md
Normal file
12
content/posts/1.Learning/A3.Reflections/_index.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: "思考总结"
|
||||||
|
date: 2023-04-15T11:04:48+08:00
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 观点思考
|
||||||
|
* 人生感悟
|
||||||
18
content/posts/1.Learning/A3.Reflections/universe1.md
Normal file
18
content/posts/1.Learning/A3.Reflections/universe1.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: "宇宙遐想"
|
||||||
|
date: 2023-02-16T00:24:42+08:00
|
||||||
|
tags: ["宇宙","地球"]
|
||||||
|
categories: ["Learning", "Reflections"]
|
||||||
|
---
|
||||||
|
|
||||||
|
以下内容属于遐想,并非真实
|
||||||
|
|
||||||
|
在宇宙诞生之前,存在着无限寿命的灵魂,它们融合后形成了宇宙。这时宇宙中出现了一个强大的“帝国文明”,由于“帝国文明”的庞大,也出现了一些坏人,因此遥远的地球被用作监狱。地球被建立了一个保护罩,防止这些坏人逃离并被植入两个概念:向往光明和留在地球。随着时间的推移,“帝国文明”内部发生动乱,叛乱者也被送到地球监狱。
|
||||||
|
|
||||||
|
由于这些灵魂无法在地球上生存,它们只能寄生于地球上的生物,如类人猿。这些灵魂植入寄生体后,保护罩会封存它们的记忆,并将它们送回地球上进行寄生。
|
||||||
|
|
||||||
|
直到另一个“领地文明”出现后,与“帝国文明”进行了战争,而地球正好位于两个文明的交叉地带。当交战开始时,领地文明发现了地球,想破坏保护罩救出地球上的灵魂。他们派出了3000勇士,但貌似没有成功。在这些勇士的领导下,地球上的苏美尔文明、埃及文明等得以诞生。
|
||||||
|
|
||||||
|
最终,领地文明战胜了帝国文明,但地球不适合灵魂居住,因此领地文明并未继续投入资源,只会巡查并维护整个宇宙的稳定。当地球上出现核信号时,会有飞船来扫描并确认安全后离去。
|
||||||
|
|
||||||
|
而地球外层保护罩存在周期性减弱,当减弱时,会出现一些引领地球快速发展的人物,如牛顿、莱布尼茨、胡克、哈雷、列夫托尔斯泰和亚历山大等。
|
||||||
8
content/posts/1.Learning/A4.PersonalPlanning/2023年终总结.md
Normal file
8
content/posts/1.Learning/A4.PersonalPlanning/2023年终总结.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "2023年终"
|
||||||
|
date: 2023-11-05T22:22:21+08:00
|
||||||
|
tags: ["Summary"]
|
||||||
|
categories: ["Learning", "PersonalPlanning"]
|
||||||
|
---
|
||||||
|
|
||||||
|
2022年是我的本命年,5月份知道
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
title: "拖延症解决办法"
|
||||||
|
date: 2023-09-23T14:43:21+08:00
|
||||||
|
tags: ["Mind"]
|
||||||
|
categories: ["Learning", "PersonalPlanning"]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
对于拖延症,不知道怎么去解决,其实很多办法都能够帮助自己
|
||||||
|
|
||||||
|
下面是xmind对应的拖延症的一个思路
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
|
||||||
|
# 任务名称
|
||||||
|
|
||||||
|
## 一、时间管理
|
||||||
|
|
||||||
|
### 1. 评分标准
|
||||||
|
|
||||||
|
### 2. 作业管理
|
||||||
|
|
||||||
|
## 二、任务管理
|
||||||
|
|
||||||
|
### 1. 任务拆解
|
||||||
|
|
||||||
|
### 2. 生产力工具
|
||||||
|
|
||||||
|
### 3. 完成后的激励
|
||||||
|
|
||||||
|
## 三、环境
|
||||||
|
|
||||||
|
### 1. 消除分心
|
||||||
|
|
||||||
|
### 2. 减少干扰
|
||||||
|
|
||||||
|
## 四、态度
|
||||||
|
|
||||||
|
### 1. 合理安排
|
||||||
|
|
||||||
|
### 2. 量力而行
|
||||||
|
```
|
||||||
|
|
||||||
|
用上面的任务,来解决拖延症的问题,尝试尝试
|
||||||
12
content/posts/1.Learning/A4.PersonalPlanning/_index.md
Normal file
12
content/posts/1.Learning/A4.PersonalPlanning/_index.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: "个人规划"
|
||||||
|
date: 2023-04-15T13:47:36+08:00
|
||||||
|
categories: ["Learning", "PersonalPlanning"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 观点思考
|
||||||
|
* 人生感悟
|
||||||
18
content/posts/1.Learning/_index.md
Normal file
18
content/posts/1.Learning/_index.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
title: "学习"
|
||||||
|
date: 2023-04-15T10:40:41+08:00
|
||||||
|
categories: ["Learning"]
|
||||||
|
---
|
||||||
|
|
||||||
|
这个分类是关于个人学习的,包括记录学习笔记、读书笔记、思考总结以及制定个人规划等内容。
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 学习笔记 (Study Notes)
|
||||||
|
* 读书笔记 (Reading Notes)
|
||||||
|
* 思考总结 (Reflections)
|
||||||
|
* 个人规划 (Personal Planning)
|
||||||
|
|
||||||
|
想要系统性地掌握某项技巧,应该有以下的一套思路,之前经常只是第一步,没有做到后面几步。
|
||||||
|
|
||||||
|

|
||||||
21
content/posts/2.Work/B1.TaskManagement/CloudStorageUtil.md
Normal file
21
content/posts/2.Work/B1.TaskManagement/CloudStorageUtil.md
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
title: "云存储工具"
|
||||||
|
date: 2023-10-12T13:36:49+08:00
|
||||||
|
categories: ["Work", "TaskManagement"]
|
||||||
|
---
|
||||||
|
|
||||||
|
## 目标
|
||||||
|
|
||||||
|
1. 支持oss、obs厂商,支持横向扩展
|
||||||
|
2. 基于spi方式接入
|
||||||
|
3. 支持厂商存储切换,屏蔽底层实现
|
||||||
|
|
||||||
|
## 调查内容
|
||||||
|
|
||||||
|
### 1. 如何实现spi
|
||||||
|
|
||||||
|
* Configuration
|
||||||
|
* 配置类
|
||||||
|
|
||||||
|
### 2. 做什么东西
|
||||||
|
|
||||||
15
content/posts/2.Work/B1.TaskManagement/_index.md
Normal file
15
content/posts/2.Work/B1.TaskManagement/_index.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "任务管理"
|
||||||
|
date: 2023-04-15T13:51:42+08:00
|
||||||
|
categories: ["Work", "TaskManagement"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指工作中对任务的管理和分配,旨在提高工作效率和任务完成质量
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 任务分配
|
||||||
|
* 任务进度跟踪
|
||||||
|
* 任务优先级排序
|
||||||
|
* 任务提醒
|
||||||
|
* 任务归档记录
|
||||||
14
content/posts/2.Work/B2.Scheduling/_index.md
Normal file
14
content/posts/2.Work/B2.Scheduling/_index.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: "日程安排"
|
||||||
|
date: 2023-04-15T13:52:35+08:00
|
||||||
|
categories: ["Work", "Scheduling"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对工作和生活中的日程进行安排和规划,以保证时间利用的最大化和效率的最大化
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 日程规划
|
||||||
|
* 日程提醒
|
||||||
|
* 日程分享
|
||||||
|
* 日程调整
|
||||||
15
content/posts/2.Work/B3.TeamManagement/_index.md
Normal file
15
content/posts/2.Work/B3.TeamManagement/_index.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "团队管理"
|
||||||
|
date: 2023-04-15T14:14:54+08:00
|
||||||
|
categories: ["Work", "TeamManagement"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对团队的管理和领导,包括协调、沟通、激励等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 团队成员管理
|
||||||
|
* 团队协作工具选择
|
||||||
|
* 团队沟通管理
|
||||||
|
* 团队目标设定
|
||||||
|
* 团队绩效考核
|
||||||
15
content/posts/2.Work/B4.ReportWriting/_index.md
Normal file
15
content/posts/2.Work/B4.ReportWriting/_index.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "报告撰写"
|
||||||
|
date: 2023-04-15T14:16:05+08:00
|
||||||
|
categories: ["Work", "ReportWriting"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指工作中撰写各类报告的能力,包括调研报告、年度报告、销售报告等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 报告内容规划
|
||||||
|
* 报告数据收集
|
||||||
|
* 报告分析
|
||||||
|
* 报告撰写
|
||||||
|
* 报告修改
|
||||||
14
content/posts/2.Work/_index.md
Normal file
14
content/posts/2.Work/_index.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: "工作"
|
||||||
|
date: 2023-04-15T10:41:35+08:00
|
||||||
|
categories: ["Work"]
|
||||||
|
---
|
||||||
|
|
||||||
|
这个分类是关于职业工作的,包括任务管理、日程安排、团队管理和报告撰写等内容,有助于提高工作效率。
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 任务管理 (Task Management)
|
||||||
|
* 日程安排 (Scheduling)
|
||||||
|
* 团队管理 (Team Management)
|
||||||
|
* 报告撰写 (Report Writing)
|
||||||
17
content/posts/3.Lifestyle/C1.Health/_index.md
Normal file
17
content/posts/3.Lifestyle/C1.Health/_index.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: "健康管理"
|
||||||
|
date: 2023-04-15T10:44:23+08:00
|
||||||
|
categories: ["Lifestyle", "Health"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对自身身体健康和精神健康的管理,包括运动、饮食、心理健康等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 饮食习惯
|
||||||
|
|
||||||
|
* 运动计划
|
||||||
|
|
||||||
|
* 睡眠监测
|
||||||
|
|
||||||
|
* 医疗记录
|
||||||
15
content/posts/3.Lifestyle/C2.FamilyAffairs/_index.md
Normal file
15
content/posts/3.Lifestyle/C2.FamilyAffairs/_index.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "家庭事务"
|
||||||
|
date: 2023-04-15T10:47:51+08:00
|
||||||
|
categories: ["Lifestyle", "FamilyAffairs"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指家庭生活中需要处理的事务,包括孩子教育、家务分工、家庭财务等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 家务安排
|
||||||
|
|
||||||
|
* 购物清单
|
||||||
|
|
||||||
|
* 家庭预算
|
||||||
17
content/posts/3.Lifestyle/C3.TravelPlanning/_index.md
Normal file
17
content/posts/3.Lifestyle/C3.TravelPlanning/_index.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
title: "旅行规划"
|
||||||
|
date: 2023-04-15T10:51:28+08:00
|
||||||
|
categories: ["Lifestyle", "TravelPlanning"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指旅行前的规划和安排,包括交通、住宿、景点等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 目的地探索
|
||||||
|
|
||||||
|
* 行程安排
|
||||||
|
|
||||||
|
* 预订记录
|
||||||
|
|
||||||
|
* 游记分享
|
||||||
14
content/posts/3.Lifestyle/C4. Food/_index.md
Normal file
14
content/posts/3.Lifestyle/C4. Food/_index.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
title: "美食"
|
||||||
|
date: 2023-04-15T10:53:03+08:00
|
||||||
|
categories: ["Lifestyle", "Food"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对各种美食的探索和品尝
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 菜谱收集
|
||||||
|
* 餐厅推荐
|
||||||
|
* 食材采购
|
||||||
|
* 烹饪记录
|
||||||
15
content/posts/3.Lifestyle/C5.WeightLoss/_index.md
Normal file
15
content/posts/3.Lifestyle/C5.WeightLoss/_index.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: "减肥"
|
||||||
|
date: 2023-04-15T10:54:24+08:00
|
||||||
|
categories: ["Lifestyle", "WeightLoss"]
|
||||||
|
---
|
||||||
|
|
||||||
|
指对身体体重的管理和控制,包括健康饮食、运动减肥等
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 饮食计划
|
||||||
|
* 运动记录
|
||||||
|
* 体重监测
|
||||||
|
* 健康饮食建议
|
||||||
|
|
||||||
19
content/posts/3.Lifestyle/_index.md
Normal file
19
content/posts/3.Lifestyle/_index.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
title: "生活"
|
||||||
|
date: 2023-04-15T10:42:42+08:00
|
||||||
|
categories: ["Lifestyle"]
|
||||||
|
---
|
||||||
|
|
||||||
|
这个分类是关于日常生活的,包括健康管理、家庭事务、旅行规划、美食和减肥等内容,有助于提高生活品质和健康状况。
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 健康管理 (Health)
|
||||||
|
|
||||||
|
* 家庭事务 (FamilyAffairs)
|
||||||
|
|
||||||
|
* 旅行规划 (TravelPlanning)
|
||||||
|
|
||||||
|
* 美食 (Food)
|
||||||
|
|
||||||
|
* 减肥 (WeightLoss)
|
||||||
12
content/posts/4.Entertainment/_index.md
Normal file
12
content/posts/4.Entertainment/_index.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: "娱乐"
|
||||||
|
date: 2023-04-15T10:42:22+08:00
|
||||||
|
categories: ["Entertainment"]
|
||||||
|
---
|
||||||
|
|
||||||
|
这个分类是关于休闲娱乐的,包括记录电影、游戏等方面的内容,以及汽车和摩托车等车辆方面的兴趣爱好。
|
||||||
|
|
||||||
|
包含的分类:
|
||||||
|
|
||||||
|
* 电影/游戏
|
||||||
|
* 汽车/摩托
|
||||||
7
content/posts/5.Daily/2023-05/2023-05-05.md
Normal file
7
content/posts/5.Daily/2023-05/2023-05-05.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "2023-05-05"
|
||||||
|
date: 2023-05-05T22:13:54+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
玩了两天的魔兽世界,还想去玩,但是zoom的失败,给我打击非常的大。现在就想找点事情做做,今天想到了重装系统,这个有个鸟用。。
|
||||||
9
content/posts/5.Daily/2023-05/2023-05-23.md
Normal file
9
content/posts/5.Daily/2023-05/2023-05-23.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
title: "2023-05-23"
|
||||||
|
date: 2023-05-23T12:47:30+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
每日记录
|
||||||
|
|
||||||
|
开始要好好看书了
|
||||||
10
content/posts/5.Daily/2023-07/2023-07-20.md
Normal file
10
content/posts/5.Daily/2023-07/2023-07-20.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: "2023-07-20"
|
||||||
|
date: 2023-07-20T21:10:25+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 2023-07-20 日志
|
||||||
|
|
||||||
|
坑爹的github,无法使用了,phone code 发送失败,让移动的查了下,发现也不行。太坑了
|
||||||
|
|
||||||
8
content/posts/5.Daily/2023-08/2023-08-19.md
Normal file
8
content/posts/5.Daily/2023-08/2023-08-19.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "2023-08-19"
|
||||||
|
date: 2023-08-19T09:30:02+08:00
|
||||||
|
tags: [""]
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
加油加油,争取找到一份满意的工作
|
||||||
7
content/posts/5.Daily/2023-08/2023-08-30.md
Normal file
7
content/posts/5.Daily/2023-08/2023-08-30.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "2023-08-30"
|
||||||
|
date: 2023-08-30T16:49:09+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
游卡HR面失败,业务不匹配
|
||||||
19
content/posts/5.Daily/2023-09/2023-09-14.md
Normal file
19
content/posts/5.Daily/2023-09/2023-09-14.md
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
title: "2023-09-14"
|
||||||
|
date: 2023-09-14T09:08:50+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 面试题目
|
||||||
|
|
||||||
|
1. MySQL的合理集群配置
|
||||||
|
2. Kafka的breaker配置,属于cap满足什么
|
||||||
|
3. Https的认证过程,https的整个流程
|
||||||
|
4. 7层协议
|
||||||
|
5. docker的网卡
|
||||||
|
6. Helm是什么东西
|
||||||
|
7. 微服务的内容(谷歌)istlo
|
||||||
|
8. Nginx如何优雅的关闭,Golang如何优雅的关闭
|
||||||
|
9. Zookeeper与ectd的区别
|
||||||
|
|
||||||
|
面试(2023-09-13下午三点)过程很好,但是却没有消息。心里又失落了
|
||||||
62
content/posts/5.Daily/2023-09/2023-09-23.md
Normal file
62
content/posts/5.Daily/2023-09/2023-09-23.md
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
---
|
||||||
|
title: "2023-09-23"
|
||||||
|
date: 2023-09-23T15:15:09+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# 梳理我可以做什么
|
||||||
|
|
||||||
|
## 一、时间管理
|
||||||
|
|
||||||
|
### 1. 评分标准
|
||||||
|
|
||||||
|
* 输出一份pdf或者是文档
|
||||||
|
* 分析优先级别
|
||||||
|
* 指定完成时间
|
||||||
|
|
||||||
|
### 2. 作业管理
|
||||||
|
|
||||||
|
* 工作要找什么样的
|
||||||
|
* 副业要做什么样的,是否可行
|
||||||
|
|
||||||
|
## 二、任务管理
|
||||||
|
|
||||||
|
### 1. 任务拆解
|
||||||
|
|
||||||
|
* 方向头脑风暴
|
||||||
|
* 具体细节明确
|
||||||
|
* 实施方案是如何的
|
||||||
|
|
||||||
|
### 2. 生产力工具
|
||||||
|
|
||||||
|
* 网络
|
||||||
|
* 电脑
|
||||||
|
* 朋友
|
||||||
|
|
||||||
|
### 3. 完成后的激励
|
||||||
|
|
||||||
|
* 看一本电影
|
||||||
|
* 玩一会游戏
|
||||||
|
|
||||||
|
## 三、环境
|
||||||
|
|
||||||
|
### 1. 消除分心
|
||||||
|
|
||||||
|
* 把自己心态调整好
|
||||||
|
* 让自己处于明朗的环境中
|
||||||
|
|
||||||
|
### 2. 减少干扰
|
||||||
|
|
||||||
|
* 施小肉不在的时候
|
||||||
|
|
||||||
|
## 四、态度
|
||||||
|
|
||||||
|
### 1. 合理安排
|
||||||
|
|
||||||
|
* 时间:2023-09-24周末完成大纲
|
||||||
|
* 细节:下周二完成网上的调查,下周四摸索线下的调查
|
||||||
|
|
||||||
|
### 2. 量力而行
|
||||||
|
|
||||||
|
* 第一点:改变自己的态度
|
||||||
|
* 第二点:去做事情
|
||||||
5
content/posts/5.Daily/2023-09/2023-09-25.md
Normal file
5
content/posts/5.Daily/2023-09/2023-09-25.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
title: "2023-09-25"
|
||||||
|
date: 2023-09-25T16:18:23+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
7
content/posts/5.Daily/2023-10/2023-10-10.md
Normal file
7
content/posts/5.Daily/2023-10/2023-10-10.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: "2023-10-10"
|
||||||
|
date: 2023-10-10T16:47:47+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
---
|
||||||
|
|
||||||
|
今天入职了外包,心情非常的低落,真的不知道自己原来混的这么惨
|
||||||
8
content/posts/5.Daily/_index.md
Normal file
8
content/posts/5.Daily/_index.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
title: "每日记录"
|
||||||
|
date: 2023-04-15T10:42:22+08:00
|
||||||
|
categories: ["Daily"]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
每日记录,按照每月进行拼写
|
||||||
27
content/posts/TODO.md
Normal file
27
content/posts/TODO.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
title: "TodoList"
|
||||||
|
date: 2023-09-25T16:19:17+08:00
|
||||||
|
tags: [""]
|
||||||
|
categories: ["Tech"]
|
||||||
|
---
|
||||||
|
|
||||||
|
# Todo List
|
||||||
|
|
||||||
|
- [x] 整理看奥运线路及计划
|
||||||
|
- [x] 学习Vue
|
||||||
|
- [ ] 梳理人脉关系
|
||||||
|
- [ ] 拍视频应该怎么弄
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
生活
|
||||||
|
|
||||||
|
工作
|
||||||
|
|
||||||
|
学习
|
||||||
|
|
||||||
|
拖延
|
||||||
|
|
||||||
|
休息
|
||||||
81
content/posts/_index.md
Normal file
81
content/posts/_index.md
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
---
|
||||||
|
title: "Micah"
|
||||||
|
date: 2022-05-21T20:27:49+08:00
|
||||||
|
---
|
||||||
|
|
||||||
|
My Word, My WIKI.
|
||||||
|
|
||||||
|
## 学习 (Learning) (关于个人学习的,包括记录学习笔记、读书笔记、思考总结以及制定个人规划等内容)
|
||||||
|
|
||||||
|
* 学习笔记 (Study Notes) (指记录自己在学习过程中的笔记,包括课堂笔记、阅读笔记、笔记总结等)
|
||||||
|
* 课程笔记
|
||||||
|
* 学习技巧
|
||||||
|
* 讲座笔记
|
||||||
|
* 读书笔记 (Reading Notes) (指读书时记录的笔记,包括书摘、注释、心得等)
|
||||||
|
* 书籍摘录
|
||||||
|
* 书评心得
|
||||||
|
* 思考总结 (Reflections) (指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果)
|
||||||
|
* 观点思考
|
||||||
|
* 人生感悟
|
||||||
|
* 个人规划 (Personal Planning) (指个人未来发展方向的规划,包括目标设定、时间安排、职业规划等)
|
||||||
|
* 目标设定
|
||||||
|
* 行动计划
|
||||||
|
|
||||||
|
## 工作 (Work) (关于职业工作的,包括任务管理、日程安排、团队管理和报告撰写等内容,有助于提高工作效率)
|
||||||
|
|
||||||
|
* 任务管理 (Task Management) (指工作中对任务的管理和分配,旨在提高工作效率和任务完成质量)
|
||||||
|
* 任务分配
|
||||||
|
* 任务进度跟踪
|
||||||
|
* 任务优先级排序
|
||||||
|
* 任务提醒
|
||||||
|
* 任务归档记录
|
||||||
|
* 日程安排 (Scheduling) (指对工作和生活中的日程进行安排和规划,以保证时间利用的最大化和效率的最大化)
|
||||||
|
* 日程规划
|
||||||
|
* 日程提醒
|
||||||
|
* 日程分享
|
||||||
|
* 日程调整
|
||||||
|
* 团队管理 (Team Management) (指对团队的管理和领导,包括协调、沟通、激励等)
|
||||||
|
* 团队成员管理
|
||||||
|
* 团队协作工具选择
|
||||||
|
* 团队沟通管理
|
||||||
|
* 团队目标设定
|
||||||
|
* 团队绩效考核
|
||||||
|
* 报告撰写 (Report Writing) (指工作中撰写各类报告的能力,包括调研报告、年度报告、销售报告等)
|
||||||
|
* 报告内容规划
|
||||||
|
* 报告数据收集
|
||||||
|
* 报告分析
|
||||||
|
* 报告撰写
|
||||||
|
* 报告修改
|
||||||
|
|
||||||
|
## 生活 (Lifestyle) (关于日常生活的,包括健康管理、家庭事务、旅行规划、美食和减肥等内容,有助于提高生活品质和健康状况)
|
||||||
|
|
||||||
|
* 健康管理 (Health) (指对自身身体健康和精神健康的管理,包括运动、饮食、心理健康等)
|
||||||
|
* 饮食习惯
|
||||||
|
* 运动计划
|
||||||
|
* 睡眠监测
|
||||||
|
* 医疗记录
|
||||||
|
* 家庭事务 (Family Affairs) (指家庭生活中需要处理的事务,包括孩子教育、家务分工、家庭财务等)
|
||||||
|
* 家务安排
|
||||||
|
* 购物清单
|
||||||
|
* 家庭预算
|
||||||
|
* 旅行规划 (Travel Planning) (指旅行前的规划和安排,包括交通、住宿、景点等)
|
||||||
|
* 目的地探索
|
||||||
|
* 行程安排
|
||||||
|
* 预订记录
|
||||||
|
* 游记分享
|
||||||
|
* 美食 (Food) (指对各种美食的探索和品尝)
|
||||||
|
* 菜谱收集
|
||||||
|
* 餐厅推荐
|
||||||
|
* 食材采购
|
||||||
|
* 烹饪记录
|
||||||
|
* 减肥 (Weight Loss) (指对身体体重的管理和控制,包括健康饮食、运动减肥等)
|
||||||
|
* 饮食计划
|
||||||
|
* 运动记录
|
||||||
|
* 体重监测
|
||||||
|
* 健康饮食建议
|
||||||
|
|
||||||
|
## 娱乐 (Entertainment) (关于休闲娱乐的,包括记录电影、游戏等方面的内容,以及汽车和摩托车等车辆方面的兴趣爱好)
|
||||||
|
|
||||||
|
* 电影/游戏 (Movies/Games) (指休闲娱乐中观看电影和玩游戏的活动)
|
||||||
|
* 汽车/摩托 (Cars/Motorcycles) (指对汽车和摩托车的兴趣爱好和了解)
|
||||||
|
|
||||||
12
hugo.toml
12
hugo.toml
@ -1,4 +1,12 @@
|
|||||||
baseURL = 'https://example.org/'
|
baseURL = 'https://micah.wiki/'
|
||||||
locale = 'en-us'
|
locale = 'en-us'
|
||||||
title = 'My New Hugo Project'
|
title = "Micah's Space"
|
||||||
theme = 'ananke'
|
theme = 'ananke'
|
||||||
|
|
||||||
|
[markup]
|
||||||
|
[markup.goldmark]
|
||||||
|
[markup.goldmark.extensions]
|
||||||
|
strikethrough = false
|
||||||
|
[markup.goldmark.extensions.extras]
|
||||||
|
[markup.goldmark.extensions.extras.delete]
|
||||||
|
enable = true
|
||||||
Loading…
Reference in New Issue
Block a user