抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

腾讯云上购买了一个新的轻量级服务器,于是乎需要重新搭建一下环境,特此记录

安装git

执行命令:yum install git

设置secret_token

原因:在Github的Webhook机制中设置secret_token来提高安全系数

  1. 将如下内容写到~/.bash_profile中:(注意修改SECRET_TOKEN为自己的token)
    1
    echo "export SECRET_TOKEN=自己在Github设置的Token" >> ~/.bash_profile
  2. 然后执行命令:source ~/.bash_profile

设置接收webhook的程序

我们需要有一个程序作为后台进程一直在监听Github发生过来的事件

  1. 直接编译代码为可执行程序后,直接放置到~/workspace目录下

  2. ~/workspace目录下创建conf目录并编写配置文件config.ini,内容如下:

    1
    2
    3
    4
    5
    6
    [server]
    host='0.0.0.0'
    port=8999

    [script]
    auto_update_script_path='./auto_update_script.sh'

  1. 首先查看自己部署nginx-proxy-manager的docker-compose.yml,位于/opt/docker/NginxProxyManager目录下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    version: '3'
    services:
    app:
    image: 'jc21/nginx-proxy-manager:latest'
    network_mode: "host"
    restart: always
    ports:
    # Public HTTP Port:
    - '80:80'
    # Public HTTPS Port:
    - '443:443'
    # Admin Web Port:
    - '81:81'
    # Add any other Stream port you want to expose
    # - '21:21' # FTP
    environment:
    DISABLE_IPV6: 'true'
    # These are the settings to access your db
    # If you would rather use Sqlite uncomment this
    # and remove all DB_MYSQL_* lines above
    DB_SQLITE_FILE: "/data/database.sqlite"
    # Uncomment this if IPv6 is not enabled on your host
    # DISABLE_IPV6: 'true'
    volumes:
    # - ./Users/brittanysalas/.config/production.json
    - ./data:/data
    - ./letsencrypt:/etc/letsencrypt
  2. 查看volume发现将当前目录下的data目录映射到容器的/data,于是在./data下创建yirufeng.top目录,
  3. yirufeng.top目录下创建index.html文件,内容如下:

环境准备

  1. 一台云服务器(极力推荐),本机也可以

创建目录

  1. 进入到~创建目录docsify_demo

编写Dockerfile

本操作以及后续操作都是以当前目录docsify_demo为准
当前目录下编写Dockerfile文件,内容如下:

1
2
3
4
5
6
7
8
9
FROM node:latest
LABEL description="A demo Dockerfile for build Docsify."
# 克隆仓库
WORKDIR /
RUN git clone https://github.com/sivanWu0222/AlgoBook.git
WORKDIR /AlgoBook/docs
RUN npm install -g docsify-cli@latest
EXPOSE 9001/tcp
ENTRYPOINT docsify serve . -p 9001

准备

购买腾讯云轻量级服务器的时候需要选择Docker ce

安装docker-compose

  1. 安装docker-compose并验证
    1
    2
    3
    4
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
    docker-compose version

准备环境

  1. 云服务器1台
  2. 服务器需要安装python3以上的环境,默认服务器都会安装
  3. 服务器中需要安装flask:pip3 install flask进行安装即可

具体流程步骤

  1. 仓库中设置webhook
    • payload url填写需要请求服务器的url,这里我们在服务器中部署了一个简单的flask程序,地址是 服务器的ip:flask监听端口
    • 配置Content Type为application/json
    • 配置secret,找个在线生成密码的网站,生成64位密码保存填写进入,并在服务器中通过在~/.bash_profile文件最后写入export SECRET_TOKEN=生成的64位密码将其添加到环境变量中
    • 选择通知类型为:Just the push event
    • 勾选active
  2. 根据仓库webhook中设置的secret,需要导入到服务器的环境变量中,
  3. 服务器中编写如下的python代码并后台运行,记得设置的端口一定要在防火墙中进行放行

需求背景:部门有大量的数据使用Influxdb进行存储,在这个过程中,我们往往需要对存储的数据做一些指标的统计,比如数据占用的磁盘空间,存储了多少条记录等等,但是部分操作需要大量的Influxdb Sql太费时,于是写了一个简单的程序进行统计

环境要求

  1. Influxdb 1.8 or earlier
  2. Go

见字如晤。每年的12月中下旬,都会收到QQ邮箱推送的一个活动《时光信使-给未来的一封信》,虽然已经连续3年参加该活动,但还是怀着不安写下了今年的总结。如果非要给自己2022年的表现一个评价的话,不能说差强人意,也不能说表现优异,只能说刚好及格。仔细想想这一年自己都非常幸运,顺利从学校毕业,顺利入职公司,顺利在公司转正。如果可以用一个词语简单概括自己这一年的话,那必定是’半学生半打工人’。

回顾

仔细回想一年以来做的事情,最有成就的莫过于如下几件事:

  1. 顺利撰写毕业论文并成功答辩(由于学硕 + 教育部论文抽查机制 + 导师的严要求,导师对论文的实验以及排版格式近乎苛刻)
  2. 顺利入职公司并成功转正,并在Mini项目答辩时未备稿的前提下一个人连续讲15minPPT,台下的老板们给的掌声连绵不绝
  3. 参与公司的毕业生封培,在讲师的带领下学习到了公司的文化价值观”Value For Users, Tech For Good”
  4. 入职不到半年,在导师带领下独自一人改造旧项目并负责组里的新项目开发,并按期交付(项目要求C++,但自己不熟悉C++,一个月内还是按期交付了)
  5. 成为中心的接口人,参与中心各种组织活动建设日常事务
  6. 年底时与部门同事一起在会议室吃着零食看着公司的年会,感谢老板们的精彩分享,受益匪浅(老板们真高瞻远瞩)。
  7. 听了向洋大佬分享的未来AI发展方向的讲座,大模型以及语义化有待深入挖掘。
  8. 东西涌穿越当晚,一起吃完晚饭在福田中心区继续看世界杯,然后跟着参与自己人生第一次蹦迪,全是老外,晚上两点多才回去太累了。

链表

  1. 一个操作可能产生新的头节点,则可以尝试在链表的最前面添加一个哨兵节点来简化代码逻辑,降低代码出现问题的可能性。
  2. 双指针是解决与链表相关的面试题的一种常用技术。前后双指针思路让一个指针提前走若干步,然后将第2个指针指向头节点,两个指针以相同的速度一起走。快慢双指针让快的指针每次走两步而慢的指针每次只走一步。
  3. 大部分与链表相关的面试题都是考查单向链表的操作。单向链表的特点是只能从前往后遍历而不能从后往前遍历。如果不得不从后往前遍历链表,则可以把链表反转之后再遍历。
  4. 如果链表中的节点除了有指向下一个节点的指针,还有指向前一个节点的指针,那么该链表就是双向链表。由于双向链表的操作牵涉到的指针比较多,因此应聘者在解决面试题的时候要格外小心,确保每个指针都指向了正确的位置。
  5. 循环链表是一种特殊形态的链表,它的所有节点都在一个环中。在解决与循环链表相关的面试题时需要特别注意避免死循环,遍历链表时等所有节点都遍历完就要停止,不能一直在里面绕圈子出不来。

书接上回,我们讲解了如何搭建hexo所需的博客环境,在环境搭建好之后,奋笔疾书终要呈现给他人,此时就需要知道如何部署到博客了。。。

本文部署的原理是将hexo博客源码推送到Github后,工作流自动编译出html文件到master分支,同时推送到腾讯云轻量应用服务器实现国内国外双部署(国内用户可以秒开博客)

前提环境

  1. 拥有一台腾讯云轻量应用服务器
  2. 按照上文提到的步骤搭建好hexo博客环境

腾讯云轻量应用服务器

默认已经安装了git

创建用户并进行配置

  1. adduser git
  2. chmod 740 /etc/sudoers
  3. vim /etc/sudoers 并在root ALL=(ALL) ALL下面一行加入:git ALL=(ALL) ALL
  4. chmod 400 /etc/sudoers
  5. 设置密码: sudo passwd git
  6. su git
  7. mkdir ~/.ssh
  8. 本地机器上执行命令:ssh-keygen -t rsa -C "邮箱"生成ssh文件,注意一定要指定生成的ssh文件名否则会覆盖之前的ssh文件(另需要注意的是ssh的时候)
  9. 远程机器上执行:vim ~/.ssh/authorized_keys 将公钥文件的内容拷贝进去
  10. 本地机器上执行:ssh -v git@机器地址 -i 公钥文件名发现可以登录到机器上

部署流程

编写工作流文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# 当有改动推送到master分支时,启动Action
name: 自动部署

on:
push:
branches:
- source #2020年10月后github新建仓库默认分支改为main,注意更改

release:
types:
- published

jobs:
checkout:
runs-on: ubuntu-latest
steps:
- name: 检查分支
uses: actions/checkout@v2
with:
ref: master #2020年10月后github新建仓库默认分支改为main,注意更改

- name: 安装 Node
uses: actions/setup-node@v1
with:
node-version: "12.x"

- name: 安装 Hexo
run: |
export TZ='Asia/Shanghai'
npm install hexo-cli -g

- name: 缓存 Hexo
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{runner.OS}}-${{hashFiles('**/package-lock.json')}}

- name: 安装依赖
if: steps.cache.outputs.cache-hit != 'true'
run: |
npm install --save

- name: 生成静态文件
run: |
hexo clean
hexo generate

- name: 部署到github pages
run: |
git config --global user.name "sivanWu0222"
git config --global user.email "yirufeng@foxmail.com"
# git clone https://github.com/xxxxx/xxxx.github.io.git .deploy_git
# 此处务必用HTTPS链接。SSH链接可能有权限报错的隐患
# =====注意.deploy_git前面有个空格=====
# 这行指令的目的是clone博客静态文件仓库,防止Hexo推送时覆盖整个静态文件仓库,而是只推送有更改的文件
# 我注释掉了是为了刷新整个仓库,也可以选择不注释掉,但是可能出现没有识别到的情况
hexo deploy

- name: 部署到云服务器
uses: cross-the-world/scp-pipeline@master
with:
host: ${{ secrets.USER_HOST }}
user: ${{ secrets.USER_NAME }}
pass: ${{ secrets.USER_PASS }}
connect_timeout: 10s
local: './.deploy_git/*'
remote: yirufeng@43.154.207.212:/home/git/blog.git

老旧的yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
name: Build and Deploy
on: [push]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout 🛎️
uses: actions/checkout@v2 # If you're using actions/checkout@v2 you must set persist-credentials to false in most cases for the deployment to work correctly.
with:
persist-credentials: false

- name: Install and Build 🔧 # This example project is built using npm and outputs the result to the 'build' folder. Replace with the commands required to build your project, or remove this step entirely if your site is pre-built.
run: |
npm install --force
npm run build
env:
CI: false

- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@releases/v4
with:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
BRANCH: master # The branch the action should deploy to.
FOLDER: public # The folder the action should deploy.

字符串与时间戳的转换

日期字符串转换为时间戳

思路:

  1. 将日期字符串转换为时间结构体
  2. 将时间结构体转换为对应的时间戳(time_t类型,其实是long类型的别名)
日期字符串转换为时间戳
1
2
3
4
5
6
7
8
9
time_t convertDateToTimestamp(const string &date)
{
// 首先在后面添加时间
char dateTimeBuf[64];
snprintf(dateTimeBuf, sizeof(dateTimeBuf), "%s 00:00:00", date.c_str());
struct tm dateTM;
strptime(dateTimeBuf, "%Y-%m-%d %H:%M:%S", &dateTM);
return mktime(&dateTM);
}

日期时间字符串转换为时间戳

思路:

  1. 将日期字符串转换为时间结构体
  2. 将时间结构体转换为对应的时间戳(time_t类型,其实是long类型的别名)
日期时间字符串转换为时间戳
1
2
3
4
5
6
7
// 日期时间字符串转换为对应的时间戳
time_t convertDatetimeToTimestamp(const string &date_time)
{
struct tm dtTM;
strptime(date_time.c_str(), "%Y-%m-%d %H:%M:%S", &dtTM);
return mktime(&dtTM);
}

时间戳转换为日期字符串

思路:

  1. 将时间戳转换为struct tm类型的时间:使用localtime_r函数或者localtime函数
  2. 然后将struct tm类型的时间按照给定格式化串格式化为字符串:使用strftime函数
时间戳转换为日期字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 时间戳转换为日期
void convertTimestampToDate(time_t timestamp, string &date)
{
// 1. 将时间戳转换为struct tm类型:
// localtime是不可重入函数,非线程安全,但是localtime_r是可重入函数,线程安全的
struct tm dateTm;
localtime_r(&timestamp, &dateTm);
printf("%d-%d-%d\n", dateTm.tm_year + 1900, dateTm.tm_mon + 1,
dateTm.tm_mday);
// 2. 将struct tm类型转换为自定义格式化字符串
char dateBuf[16];
strftime(dateBuf, sizeof(dateBuf), "%Y-%m-%d", &dateTm);
date = dateBuf;
}

时间戳转换为日期时间字符串

思路:

  1. 将时间戳转换为struct tm类型的时间:使用localtime_r函数或者localtime函数
  2. 然后将struct tm类型的时间按照给定格式化串格式化为字符串:使用strftime函数
时间戳转换为日期时间字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
// 时间戳转换为日期时间
void convertTimestampToDatetime(time_t timestamp, string &date_time)
{
// 1. 将时间戳转换为struct tm类型:
// localtime是不可重入函数,非线程安全,但是localtime_r是可重入函数,线程安全的
struct tm dateTimeTm;
localtime_r(&timestamp, &dateTimeTm);
// 2. 将struct tm类型转换为自定义格式化字符串
char dateTimeBuf[32];
strftime(dateTimeBuf, sizeof(dateTimeBuf), "%Y-%m-%d %H:%M:%S",
&dateTimeTm);
date_time = dateTimeBuf;
}