feat: add content

This commit is contained in:
micah 2026-03-18 22:36:05 +08:00
parent 5e0d48fd8e
commit 4dab4174b3
70 changed files with 6106 additions and 2 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
public
.idea

0
content/_index.md Normal file
View File

View 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

View File

@ -0,0 +1,13 @@
---
title: "学习笔记"
date: 2023-04-15T11:01:48+08:00
categories: ["Learning", "StudyNotes"]
---
指记录自己在学习过程中的笔记,包括课堂笔记、阅读笔记、笔记总结等
包含的分类:
* 课程笔记
* 学习技巧
* 讲座笔记

View 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
```

View 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不适合做单行点查询

View 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`

View 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

View 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

View 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`进行测试

View File

@ -0,0 +1,7 @@
---
title: "Hugo学习"
date: 2022-02-28T12:00:24+08:00
tags: ["hugo"]
categories: ["Learning", "StudyNotes"]
---
在头部增加`tags`、`categories`可以在标签、分类上进行体现

View 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. 点开下载中的文件,通过”图书“软件打开

View 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

View 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`

View 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 型的 id1 个 bit 是不用的,用其中的 41 bits 作为毫秒数,用 10 bits 作为工作机器 id12 bits 作为序列号。
小插曲:世界上没有两片相同的雪花,所以使用雪花来表示唯一
## 2. 算法内容
![snowflake](https://image.shijinping.cn/picgo/202206291654161.webp)
* 1:第一位不使用为什么这里第一位不使用因为对于long类型如果第一位是`1` 则说明是负数
* 242:表示时间戳最多可以表示2^41-1次方的数值可以是毫秒级。
* 4352:表示工作机器ID最多支持2^10机器也就是1024的机器。可以自己定义前几位为机房ID。
* 5364:表示自增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

View File

@ -0,0 +1,43 @@
---
title: "TodoList"
date: 2023-04-13T19:57:12+08:00
tags: ["待完成"]
categories: ["Learning", "StudyNotes"]
---
TODO未整理
golang的gcgmp模型context作用channel原理并发打印数字slice和map原理
kafka的重平衡高水位顺序消费怎么保证消息不丢失
rocketmq怎么实现事物消息
redis数据结构zset原理介绍cluster已经怎么保证高可用哨兵模式介绍
mysql聚簇索引索引优化结合业务怎么分库分表为啥一个表超过1000w性能会变差
压测,限流
降怎么保证服务高可用,限流熔断降级压测都要提下
监控报警这些
限流有哪些算法,以及却别要知道下
熔断策略是啥
限流:窗口计数,滑动窗口,漏桶,令牌桶
1. webrtc是什么技术
2. webrtc与不同的socket通信有什么区别
3. webrtc如何实现连麦、直播的
![image-20230322152028665](https://image.shijinping.cn/picgo/20230322152028665.png)
# 计算方式
| 名称 | 计算方式 |
| ----- | ------------------------------------------------------------ |
| 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 |

View File

@ -0,0 +1,12 @@
---
title: "读书笔记"
date: 2023-04-15T11:02:56+08:00
categories: ["Learning", "ReadingNotes"]
---
指读书时记录的笔记,包括书摘、注释、心得等
包含的分类:
* 书籍摘录
* 书评心得

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,6 @@
---
title: "数组双指针"
date: 2023-09-21T17:10:12+08:00
tags: ["Algorithm"]
categories: ["Learning", "Reflections"]
---

View File

@ -0,0 +1,110 @@
---
title: "链表双指针"
date: 2023-09-19T16:29:57+08:00
tags: ["Algorithm"]
categories: ["Learning", "Reflections"]
---
到现在面试经历过很多次了,却很少有成功,之前拒掉了几次面试,现在非常后悔。
这里记录下之前面试的他们的算法题
## 1. 如何判断一个链表有环
1. 快慢指针可以解决这个问题
> 使用快慢指针。这里<b>为什么会相遇<b>?最坏的打算当慢指针走一圈的时候,快指针可以走两圈,所以刚好会在同一个点上面。
>
> 如果最后指向null则说明没有环如果最后走到了相同点则说明有环。
2. 如何判断该环的起点在什么地方
![image-20230919163443270](https://image.shijinping.cn/picgo/202309191634061.png)
> 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. 使用特殊手法,如下图
![image-20230919170716775](https://image.shijinping.cn/picgo/202309191707494.png)
> 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)

View File

@ -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
```
### 迭代处理
![image-20230920092045168](https://image.shijinping.cn/picgo/202309200920953.png)
核心思想“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 循环处理
![image-20230920093054992](https://image.shijinping.cn/picgo/202309200930649.png)
这里分成三部分:
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. 反转后的链表和原链表进行匹配
其中需要注意的部分是,怎么判断中间部分
![image-20230921170016832](https://image.shijinping.cn/picgo/202309211700384.png)
这里的奇数部分需要做特殊处理当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
```

View File

@ -0,0 +1,8 @@
---
title: "DevOps"
date: 2023-04-20T09:01:37+08:00
tags: ["DevOps"]
categories: ["Learning", "Reflections"]
---
DevOps 运维相关的知识点

View File

@ -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
```

View File

@ -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": "应用程序"
}
```

View 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 自研
#### 方案设计
![v1.drawio](https://image.shijinping.cn/picgo/202206101026771.png)
1. 分布式文件系统:采用开源系统进行搭建分布式文件系统
2. 文件系统服务:可以新增图片时可以生成索引返回给业务,当业务只需要根据索引,就能查询到对应的文件内容
3. 业务层:上传服务主要负责图片的上传、而列表服务则是需要根据请求,获取列表及数据
4. 接入层:接收用户的请求,把请求代理到业务上
这么设计,可以实现一个图片类的应用。在实际中会有什么问题?
1. 不同区域的用户,体验不一样,用户离部署的节点越近,用户体验更好
因为根据之前的经验地域对于网络的延迟影响很大。大致从ping上就能体现
| 地区1 | 地区2 | ping时间 |
| ----- | ----- | -------- |
| 上海 | 广州 | 30ms |
| 上海 | 上海 | 10ms |
| 上海 | 美国 | 100ms |
2. 从终端的成功率上看由于网络上的丢包、延迟成功率会低很多特别是图片目前图片13M都是比较正常的这么大的图片在过程中发生丢包、延迟失败率可想而知会特别的高。
这种场景,我们可以考虑下,访问国外某些网站的时候,经常是失败,体验非常差
#### 改进点
那么需要怎么改进呢?
比较容易想到的就是,既然是距离远,那么直接在对应的地方部署一个服务,不就行了么?
![v2.1.drawio](https://image.shijinping.cn/picgo/202206101104619.png)
这样各地的用户通过dns的调度访问对应的接入层接入层只访问当前区域的服务同一个区域这样就减少了网络上的问题。解决了用户体验。但是好像跟需求不是太耦合。。。需求是``跨区域访问``。
那么要怎么样实现跨区域访问呢?
![v2.3.drawio](https://image.shijinping.cn/picgo/202206101109613.png)
从图上可以看出来,如果底层数据实现了数据同步,那么是不是就可以了?
比如亚洲用户发布内容,那么我们把数据同步给其他集群,这样其他集群就可以访问到亚洲用户的信息了
要怎么实现同步呢?目前了解到**``FastDFS``**可以实现分布式任务系统的他是采用binlog进行同步在log中有个标志位用户记录该条记录是``C: 增加 D: 删除 A: 添加 M: 修改 U: 更新整个文件 T: 截断文件`` 等当亚洲区域进行添加时会发送日志给美洲、欧洲他们也会根据binlog的日志添加这里需要注意同步数据采用的标识与写入的是不一样的采用小写目的是为了区别是否需要同步给其他集群。
这里还没有对FastDFS跨区同步进行测试过还不确定具体的延迟能够到达多少有待验证
理论上,上面的方案是可以实现的,那么我们会有什么问题呢?
1. 所有图片数据,都存在多份,每个数据都需要进行公网的同步。
2. 文件传入与数据传输需要保证一致,不能有数据了,没有文件
那么我们有没有其他方案进行呢?下面我们来看下
![v2.4.drawio](https://image.shijinping.cn/picgo/202206101614227.png)
对于图片可以采用CDN加速。
对于API接口了解到市面上有一种产品叫做“全站加速”或者“动态加速”也就是cdn不进行缓存直接访问这样的话我们可以直接让用户访问这样的话所有数据都访问了中心区域的数据通过“动态加速”把用户和源进行连接核心是增加了数据传输的稳定性降低失败率。
这种方式存在什么问题:
1. 数据量问题:
a) 扩容问题:这个也不算特别问题,是项目一般都会遇到
b) 冷热数据:如果统一的采用一套文件系统,那么会导致数据积累越来越多,文件系统会不停的扩大
3. 当然还有其他的一些需要考虑的点,比如高请求量下“文件内容缓存”、容灾备份等还没有详细讲
### 3.2 外部功能
既然自研中,考虑了外部功能,那么市面上是否有外部的功能,可以实现全球图片访问问题呢?
答案是肯定的CDN+文件系统,这个方案目前也是比较成熟。
![V3.drawio](https://image.shijinping.cn/picgo/202206101440291.png)
该方案乍看一下,与自研的最早方案类似(主要关注左侧部分),都是全球直接接入“一层”,但实际上是不一样的:
1. CDN会覆盖全球节点当用户接入时能够就近访问通过CDN的内网访问“文件系统”
2. 文件系统可以自研,也可以采用云产品。
#### 3.2.1 CDN
用一个图来说明下
![V4-cdn.drawio](https://image.shijinping.cn/picgo/202206101455593.png)
访问顺序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 对比
那么,我们对两种方案价格进行对比下(初步对比,数据可能不准确):
| | 价格 | 技术 |
| ------------- | ------------------------------------------------------------ | --------------------------------------------------------- |
| 自研+数据同步 | 机器500G700元/月)+宽带10M650元/月))* 2 =2700元/月) | 1. 同步数据服务<br>2. 文件系统服务<br>3. 冷热数据分离服务 |
| 自研+CDN分发 | 机器500G700元/月)+宽带10M650元/月)+CDN2T900元/月)=2150元/月) | 1. 文件系统服务<br/>2. 冷热数据分离服务 |
| 云厂商 | Bucket500G200元/月)+回源流量1T300元/月)+CDN2T900元/月)=1400元/月) | 无 |
### 3.4 选型
他们的**``优势``**分别是什么呢?
| | 自研+数据同步 | 自研+CDN分发 | 云厂商 |
| :------------- | ---------------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| 价格 | 高 | 中 | 低 |
| 突发流量(发) | 自主扩容 | 自主扩容 | 自动 |
| 突发流量(查) | 提升带宽、降级 | 自动 | 自动 |
| 访问速度 | 依赖于同步数据时间 | 首次依赖于回源速度,后面速度较快 | 首次依赖于回源速度,后面速度较快 |
| 是否支持容灾 | 多地备份 | 无 | 无 |
| 容灾备份成本 | 已经实现 | 1. 需要把文件系统全量同步到不同的区域,来实现容灾,整体成本,存储量 * 2<br>2. 需要实现文件同步服务代码 | bucket异地备份存储成本*22M以下的内容一般分钟级别的延迟 |
| 冷热数据处理 | 需要开发冷热数据分离(大致方案在最下面问题中) | 需要开发冷热数据分离 | 已提供设置 |
| 负载均衡 | 自主控制 | 自动 | 自动 |
从上面的对比得出:
1. 初期项目+公司内没有对应的技术栈
选择**``云厂商``**
2. 公司已经有成熟的技术栈
选择**``自研+CDN分发``**
3. 公司在全球的节点部署比较成熟,并且有相应的稳定网络
选择**``全部自研``**
## 4. 后台
从图片的架构选型过程,对于后台的架构选型可以有两种
### 4.1 方案
#### 4.1.1 全球加速访问同一个区域
![V4.1.drawio](https://image.shijinping.cn/picgo/202206101644750.png)
该方案整体上没有特别的点,主要是采用了``全球加速``来提升访问服务的稳定性,当访问用户离服务区域远,延迟会比较高
#### 4.1.2 多区域提供服务
![V4.2.drawio](https://image.shijinping.cn/picgo/202206101922413.png)
这里的核心问题,其实就是数据如何同步。
接下来就对这块进行拆解
问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 发布
![流程图.drawio](https://image.shijinping.cn/picgo/202206091537135.png)
接口定义
```java
PublishRsp publish(long uid, PublishReq post);
```
注: 图片基于CDN的分发用户上传后给后台的只是一个URI地址。
#### 5.2 订阅列表
![订阅查看.drawio](https://image.shijinping.cn/picgo/202206091641054.png)
接口定义
```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 (硅谷)
![image-20220610005713371](https://image.shijinping.cn/picgo/202206100057426.png)
美国东部 1 (弗吉尼亚)
![image-20220610005808192](https://image.shijinping.cn/picgo/202206100058236.png)

View File

@ -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;
```

View File

@ -0,0 +1,11 @@
---
title: "基础知识"
date: 2023-02-01T14:26:42+08:00
tags: ["Golang"]
categories: ["Learning", "StudyNotes"]
---
1. 数组与切片
2. 范型
3. String.Builder

View File

@ -0,0 +1,28 @@
---
title: "设计模式"
date: 2023-02-01T14:26:42+08:00
tags: ["Golang"]
categories: ["Learning", "StudyNotes"]
---
## 1. 单一职责
类的职责单一,对外只提供一个功能,而引起类变化的原因都应该只有一个。
## 2. 开闭
类的改动是通过增加代码进行的,而不是修改源代码。
## 3. 里氏代换原则
任何抽象类出现的地方都可以用他的实现类替换,实际就是虚拟机制,语言级别实现面向对象功能。
## 4. 依赖倒转原则
依赖于抽象接口,不要依赖具体的实现类,也就是针对接口编程。

View 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: &timestamppb.Timestamp{Seconds: 1, Nanos: 1},
State: 0,
CreateTime: &timestamppb.Timestamp{Seconds: 2, Nanos: 2},
UpdateTime: &timestamppb.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 整体项目结构
![image-20230915214227611](https://image.shijinping.cn/picgo/202309152142382.png)

View File

@ -0,0 +1,8 @@
---
title: "Golang"
date: 2022-05-20T20:27:49+08:00
tags: ["Golang"]
categories: ["Learning", "Reflections"]
---
Golang 相关

View File

@ -0,0 +1,8 @@
---
title: "Java"
date: 2023-04-15T16:14:19+08:00
tags: ["Java"]
categories: ["Learning", "Reflections"]
---
Java相关

View 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;
```

View 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 ModelJMM用于屏蔽掉各种硬件和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的并发效果JMM规范了Java虚拟机与计算机内存是如何协同工作的规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值以及在必须时如何同步的访问共享变量。
>
> Java内存模型不仅仅是JVM内存分区调用栈和本地变量存放在线程栈上对象存放在堆上。
## 堆栈存放规则
![JMM-ae7349b6](https://image.shijinping.cn/picgo/202206021021081.jpg)
1. 一个本地变量可能是原始类型,在这种情况下,它总是“呆在”线程栈上。
2. 一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。
3. 一个对象可能包含方法,这些方法可能包含本地变量。这些本地变量仍然存放在线程栈上,即使这些方法所属的对象存放在堆上。
4. 一个对象的成员变量可能随着这个对象自身存放在堆上。不管这个成员变量是原始类型还是引用类型。
5. 静态成员变量跟随着类定义一起也存放在堆上。
6. 存放在堆上的对象可以被所有持有对这个对象引用的线程访问。当一个线程可以访问一个对象时,它也可以访问这个对象的成员变量。如果两个线程同时调用同一个对象上的同一个方法,它们将会都访问这个对象的成员变量,但是每一个线程都拥有这个成员变量的私有拷贝。
## 资料地址
1. [EnjoyMoving](https://zhuanlan.zhihu.com/p/29881777)

View 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个状态NEWRUNNABLEBLOCKEDWAITINGTIMED_WAITINGTERMINATED
4. 多线程优缺点
> JVM支持多线程正确使用多线程能大大提高程序的服务能力同时也引入程序的复杂度和线程安全问题(不正确使用)。
## 状态`Thread.State`
> 一个线程在指定的时刻上只能存在一个状态JVM的线程状态和操作系统的线程状态不是一一对应的。了解线程状态可用于分析线程问题/监控,不建议通过判断线程状态来进行逻辑处理
![Thread-20b08934](https://image.shijinping.cn/picgo/202206021024473.png)
* `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)

File diff suppressed because it is too large Load Diff

View File

@ -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));
}
```

View File

@ -0,0 +1,9 @@
---
title: "MyBatis"
date: 2023-04-15T16:14:19+08:00
tags: ["MyBatis"]
categories: ["Learning", "Reflections"]
---
MyBatis相关

View 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
```

View File

@ -0,0 +1,12 @@
---
title: "思考总结"
date: 2023-04-15T11:04:48+08:00
categories: ["Learning", "Reflections"]
---
指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果
包含的分类:
* 观点思考
* 人生感悟

View File

@ -0,0 +1,18 @@
---
title: "宇宙遐想"
date: 2023-02-16T00:24:42+08:00
tags: ["宇宙","地球"]
categories: ["Learning", "Reflections"]
---
以下内容属于遐想,并非真实
在宇宙诞生之前,存在着无限寿命的灵魂,它们融合后形成了宇宙。这时宇宙中出现了一个强大的“帝国文明”,由于“帝国文明”的庞大,也出现了一些坏人,因此遥远的地球被用作监狱。地球被建立了一个保护罩,防止这些坏人逃离并被植入两个概念:向往光明和留在地球。随着时间的推移,“帝国文明”内部发生动乱,叛乱者也被送到地球监狱。
由于这些灵魂无法在地球上生存,它们只能寄生于地球上的生物,如类人猿。这些灵魂植入寄生体后,保护罩会封存它们的记忆,并将它们送回地球上进行寄生。
直到另一个“领地文明”出现后与“帝国文明”进行了战争而地球正好位于两个文明的交叉地带。当交战开始时领地文明发现了地球想破坏保护罩救出地球上的灵魂。他们派出了3000勇士但貌似没有成功。在这些勇士的领导下地球上的苏美尔文明、埃及文明等得以诞生。
最终,领地文明战胜了帝国文明,但地球不适合灵魂居住,因此领地文明并未继续投入资源,只会巡查并维护整个宇宙的稳定。当地球上出现核信号时,会有飞船来扫描并确认安全后离去。
而地球外层保护罩存在周期性减弱,当减弱时,会出现一些引领地球快速发展的人物,如牛顿、莱布尼茨、胡克、哈雷、列夫托尔斯泰和亚历山大等。

View File

@ -0,0 +1,8 @@
---
title: "2023年终"
date: 2023-11-05T22:22:21+08:00
tags: ["Summary"]
categories: ["Learning", "PersonalPlanning"]
---
2022年是我的本命年5月份知道

View File

@ -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. 量力而行
```
用上面的任务,来解决拖延症的问题,尝试尝试

View File

@ -0,0 +1,12 @@
---
title: "个人规划"
date: 2023-04-15T13:47:36+08:00
categories: ["Learning", "PersonalPlanning"]
---
指对所学知识进行深入思考后的总结和反思,旨在促进自我认识和提升学习效果
包含的分类:
* 观点思考
* 人生感悟

View File

@ -0,0 +1,18 @@
---
title: "学习"
date: 2023-04-15T10:40:41+08:00
categories: ["Learning"]
---
这个分类是关于个人学习的,包括记录学习笔记、读书笔记、思考总结以及制定个人规划等内容。
包含的分类:
* 学习笔记 (Study Notes)
* 读书笔记 (Reading Notes)
* 思考总结 (Reflections)
* 个人规划 (Personal Planning)
想要系统性地掌握某项技巧,应该有以下的一套思路,之前经常只是第一步,没有做到后面几步。
![image-20230606141712998](https://image.shijinping.cn/picgo/image-20230606141712998.png)

View 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. 做什么东西

View File

@ -0,0 +1,15 @@
---
title: "任务管理"
date: 2023-04-15T13:51:42+08:00
categories: ["Work", "TaskManagement"]
---
指工作中对任务的管理和分配,旨在提高工作效率和任务完成质量
包含的分类:
* 任务分配
* 任务进度跟踪
* 任务优先级排序
* 任务提醒
* 任务归档记录

View File

@ -0,0 +1,14 @@
---
title: "日程安排"
date: 2023-04-15T13:52:35+08:00
categories: ["Work", "Scheduling"]
---
指对工作和生活中的日程进行安排和规划,以保证时间利用的最大化和效率的最大化
包含的分类:
* 日程规划
* 日程提醒
* 日程分享
* 日程调整

View File

@ -0,0 +1,15 @@
---
title: "团队管理"
date: 2023-04-15T14:14:54+08:00
categories: ["Work", "TeamManagement"]
---
指对团队的管理和领导,包括协调、沟通、激励等
包含的分类:
* 团队成员管理
* 团队协作工具选择
* 团队沟通管理
* 团队目标设定
* 团队绩效考核

View File

@ -0,0 +1,15 @@
---
title: "报告撰写"
date: 2023-04-15T14:16:05+08:00
categories: ["Work", "ReportWriting"]
---
指工作中撰写各类报告的能力,包括调研报告、年度报告、销售报告等
包含的分类:
* 报告内容规划
* 报告数据收集
* 报告分析
* 报告撰写
* 报告修改

View File

@ -0,0 +1,14 @@
---
title: "工作"
date: 2023-04-15T10:41:35+08:00
categories: ["Work"]
---
这个分类是关于职业工作的,包括任务管理、日程安排、团队管理和报告撰写等内容,有助于提高工作效率。
包含的分类:
* 任务管理 (Task Management)
* 日程安排 (Scheduling)
* 团队管理 (Team Management)
* 报告撰写 (Report Writing)

View File

@ -0,0 +1,17 @@
---
title: "健康管理"
date: 2023-04-15T10:44:23+08:00
categories: ["Lifestyle", "Health"]
---
指对自身身体健康和精神健康的管理,包括运动、饮食、心理健康等
包含的分类:
* 饮食习惯
* 运动计划
* 睡眠监测
* 医疗记录

View File

@ -0,0 +1,15 @@
---
title: "家庭事务"
date: 2023-04-15T10:47:51+08:00
categories: ["Lifestyle", "FamilyAffairs"]
---
指家庭生活中需要处理的事务,包括孩子教育、家务分工、家庭财务等
包含的分类:
* 家务安排
* 购物清单
* 家庭预算

View File

@ -0,0 +1,17 @@
---
title: "旅行规划"
date: 2023-04-15T10:51:28+08:00
categories: ["Lifestyle", "TravelPlanning"]
---
指旅行前的规划和安排,包括交通、住宿、景点等
包含的分类:
* 目的地探索
* 行程安排
* 预订记录
* 游记分享

View File

@ -0,0 +1,14 @@
---
title: "美食"
date: 2023-04-15T10:53:03+08:00
categories: ["Lifestyle", "Food"]
---
指对各种美食的探索和品尝
包含的分类:
* 菜谱收集
* 餐厅推荐
* 食材采购
* 烹饪记录

View File

@ -0,0 +1,15 @@
---
title: "减肥"
date: 2023-04-15T10:54:24+08:00
categories: ["Lifestyle", "WeightLoss"]
---
指对身体体重的管理和控制,包括健康饮食、运动减肥等
包含的分类:
* 饮食计划
* 运动记录
* 体重监测
* 健康饮食建议

View File

@ -0,0 +1,19 @@
---
title: "生活"
date: 2023-04-15T10:42:42+08:00
categories: ["Lifestyle"]
---
这个分类是关于日常生活的,包括健康管理、家庭事务、旅行规划、美食和减肥等内容,有助于提高生活品质和健康状况。
包含的分类:
* 健康管理 (Health)
* 家庭事务 (FamilyAffairs)
* 旅行规划 (TravelPlanning)
* 美食 (Food)
* 减肥 (WeightLoss)

View File

@ -0,0 +1,12 @@
---
title: "娱乐"
date: 2023-04-15T10:42:22+08:00
categories: ["Entertainment"]
---
这个分类是关于休闲娱乐的,包括记录电影、游戏等方面的内容,以及汽车和摩托车等车辆方面的兴趣爱好。
包含的分类:
* 电影/游戏
* 汽车/摩托

View File

@ -0,0 +1,7 @@
---
title: "2023-05-05"
date: 2023-05-05T22:13:54+08:00
categories: ["Daily"]
---
玩了两天的魔兽世界还想去玩但是zoom的失败给我打击非常的大。现在就想找点事情做做今天想到了重装系统这个有个鸟用。。

View File

@ -0,0 +1,9 @@
---
title: "2023-05-23"
date: 2023-05-23T12:47:30+08:00
categories: ["Daily"]
---
每日记录
开始要好好看书了

View 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 发送失败,让移动的查了下,发现也不行。太坑了

View File

@ -0,0 +1,8 @@
---
title: "2023-08-19"
date: 2023-08-19T09:30:02+08:00
tags: [""]
categories: ["Daily"]
---
加油加油,争取找到一份满意的工作

View File

@ -0,0 +1,7 @@
---
title: "2023-08-30"
date: 2023-08-30T16:49:09+08:00
categories: ["Daily"]
---
游卡HR面失败业务不匹配

View 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下午三点过程很好但是却没有消息。心里又失落了

View 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. 量力而行
* 第一点:改变自己的态度
* 第二点:去做事情

View File

@ -0,0 +1,5 @@
---
title: "2023-09-25"
date: 2023-09-25T16:18:23+08:00
categories: ["Daily"]
---

View File

@ -0,0 +1,7 @@
---
title: "2023-10-10"
date: 2023-10-10T16:47:47+08:00
categories: ["Daily"]
---
今天入职了外包,心情非常的低落,真的不知道自己原来混的这么惨

View File

@ -0,0 +1,8 @@
---
title: "每日记录"
date: 2023-04-15T10:42:22+08:00
categories: ["Daily"]
---
每日记录,按照每月进行拼写

27
content/posts/TODO.md Normal file
View 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
View 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) (指对汽车和摩托车的兴趣爱好和了解)

View File

@ -1,4 +1,12 @@
baseURL = 'https://example.org/'
baseURL = 'https://micah.wiki/'
locale = 'en-us'
title = 'My New Hugo Project'
title = "Micah's Space"
theme = 'ananke'
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
strikethrough = false
[markup.goldmark.extensions.extras]
[markup.goldmark.extensions.extras.delete]
enable = true