『Linux』Nginx 配置 SSL 证书
申请并下载证书
首先,前往https://freessl.cn/注册账号,根据指示填写域名,点击创建免费的SSL证书
CSR生成选择离线生成
点击生成后,会提示先安装KeyManager,根据指示安装即可
根据指示一直走,可以看见证书已经出现在了KeyManager里,点击导出证书
选择Nginx并导出
打开压缩包,可以看见有两个格式的文件:.crt和.key
配置服务器
现在需要将证书上传至服务器,位置任意,例如我这里放在了/root/ssl
接下来编辑Nginx的配置文件
1sudo nano /etc/nginx/sites-available/default
在server把80端口的那部分改成下面几行
12345#监听 443 端口 (HTTPS用的是443)listen 443 ssl;#添加证书ssl_certificate /root/ssl/www-nickxu-top-0223222924_chain.crt;ssl_certificate_key /root/ssl/www-nickxu-top-0223222924_key.key;
然后再开一个server来处理80端口
123456server { listen 80 default_server; listen [::]:80 default_server; server_name www.nickxu.top; rewrite ^(.*) https://$server_name$1 permanent; ...
Hexo + Butterfly 建站指南(六)PicGO + Gitee 图床(已废弃)
从2022年3月25日开始,Gitee静止了图片外链访问,所以此方法已废弃,搭建图床请看下一篇
写文章免不了要涉及到图片的问题,本人推荐使用PicGO+Gitee来实现一个免费图床,是真的好用
准备 Gitee 储存库
Gitee可以看作是国内的GitHub,前往官网注册账号
注册完,点击右上角的加号新建仓库,名称任意
记得设置readme文件,并创建master分支
成功创建后,进入你的仓库,在选项卡中找到最右边的管理,再到最底下将其设置为开源
在右上角的头像处找到设置,再在左侧找到私人令牌
起个名字之后,点击提交
记住你的令牌,并好好保管
至此,云端储存库准备完毕
下载和安装 PicGo
首先前往PicGo官网下载
它会导到到GitHub上的该项目的releases页面,在最新版打开Assets列表挑选你的系统下载即可
安装后启动,在插件设置中搜索并安装gitee-uploader
再到图床设置里找到gitee,填入路径,分支和令牌即可
现在,图床准备完毕,每上传一张图片都能自动将链接复制到剪贴板里,直接在typora里粘贴即可
Hexo + Butterfly 建站指南(五)日常写作
前面的内容主要讲了如何搭建这个环境,后面两篇讲解平时是怎么写文章的
文章一律使用markdown文档,后缀名为.md
使用hexo new "文章名称"在source\_posts中创建文件后,就能直接打开开始写作了
但是默认貌似会自动创建一个同名文件夹,那个文件夹没什么用,可以在配置文件中关掉自动创建
Front-matter
每篇文章的开头都有一个Front-matter,用于保存这篇文章的信息,详情请看Butterfly 安裝文檔(二) 主題頁面
一般情况下,我们只需要关注title、date、tags、categories这4个参数
title:文章标题
date:写作时间,还有一个相关参数是updated,但不需要加,编译器会把md文件的修改时间作为更新时间
tags:文章标签,语法为tags: [A,B],这样就为这个文章添加了A,B2个标签
categories:文章分类,语法为categories: [A,B],这表示本文属于A分类下的B子类
另外还有一个参数 sticky ,语法为 sticky: n ,它可以设定置顶文章,而且优先级为 n
在目前的Typora中有bug,在普通模式下书写正文开头几个字会卡到Front-matter里,所以正文的开头只能在源代码模式下写
Markdown 语法
Markdown是一种轻量化标记语言,语法简单,并且上手容易
Markdown编辑器我首推Typora,网上也有很多在线编辑器,可供练习使用
考虑Markdown的语法已经广为人知,所以我折叠此部分以节省空间
Markdown 基本语法 ...
Hexo + Butterfly 建站指南(四)Twikoo 评论系统
本篇内容主要源于:
Twikoo 官方文档
Butterfly 安裝文檔(四) 主題配置-2
更新记录2022-04-09
更正了一个小错误,增加了图片上传功能教程与更新教程
2022-08-11
根据官网更新了 Vercel 的部署链接,很抱歉今天才发现链接从 dev 分支变成了 main 分支
2022-09-11
因为 Vercel.app 在国内被墙,所以可能需要手动添加一个自己域名,请见『Twikoo』解决 Vercel.app 在国内被墙导致无法使用的问题
毫不夸张地说,Twikoo 是我用过最好的静态博客评论系统
预览效果
除了评论功能,还可以记录文章阅读量
搭建过程包括准备数据库和云函数,还有修改主题配置文件
配置数据库和云函数
墙裂建议观看官方视频教程,我也是看了这个视频才成功的
MongoDB
使用MongoDB数据库来存储数据,先注册 MongoDB 账号
创建免费数据库,类型选择Shared,区域选择 AWS / N. Virginia (us-east-1)
(因为我已经创建过一个了,所以图中显示要付费)
点击Connect按钮
键入 0.0.0.0/0 以允许所有 IP 地址的连接,并创建数据库用户(我这里是已经完成了的)
连接方式选择中间的Connect your application
记录下连接字符串,等下使用时记得将其中的 <password> 修改为刚刚设置的用户密码
Vercel
使用Vercel来运行云函数,先注册 vercel 账号,可以选择从GitHub之类的登录,也可以选择通过邮箱注册
...
Hexo + Butterfly 建站指南(三)Butterfly 主题
本篇内容主要源于:
Butterfly 官方安装文档
Hexo+Butterfly主题美化 | 唐先森の博客
安装
在你的博客根目录下载主题并安装依赖:
12git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterflynpm install hexo-renderer-pug hexo-renderer-stylus --save
然后在theme目录可以找到新的butterfly主题(默认主题landscape其实可以删掉了)
在_config.yml中更改主题为butterfly
1theme: butterfly
测试,可以看见新主题已安装
官方配置
在\themes\butterfly中找到主题配置文件_config.yml,复制一个副本出来,重命名为_config.butterfly.yml
在把它剪贴到博客根目录,就跟_config.landscape.yml的格式一样
Hexo 中,根目录下的_config.butterfly.yml会比\themes\butterfly\_config.yml的优先级更高,这样做是为了避免在将来更新主题时,把已经配置好的配置文件一并覆盖了
注意,不要弄混博客配置文件(_config.yml)和主题配置文件(_config.butterfly.yml)
打开_config.butterfly.yml
这个主题很强大,所以配置文件也很长,接近1000行(所以请善用搜索功能)
但不用担心,作者 ...
『Linux』screen 命令用法
Why
也许你遇到过使用telnet或SSH远程登录linux,运行一些程序。如果这些程序需要运行很长时间(几个小时),而程序运行过程中出现网络故障,或者客户机故障,这时候客户机与远程服务器的链接将终端,并且远程服务器没有正常结束的命令将被迫终止。
又比如你SSH到主机上后,开始批量的scp命令,如果这个ssh线程断线了,scp进程就中断了。在远程服务器上正在运行某些耗时的作业,但是工作还没做完快要下班了,退出的话就会中断操作了,如何才好呢?
What
GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。
GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
多窗口
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区 ...
Hexo + Butterfly 建站指南(二)部署至个人站点或 GitHub Pages
现在我们需要把静态文件上传到公网上,让所有人都能访问
打开_config.yml,拉到最底下,找到# Deployment那一块,现在我们需要配置这里
按照官方文档有很多种方法,一般情况下只用得着两种:SFTP和Git
SFTP推送至个人服务器是付费方案,Git推送至GitHub是免费方案
法一:SFTP
租过个人服务器的都是有Linux经验的,这里我就简单点说
安装Web服务器
一般用Nginx或者Apache就行,这里以Nginx为例
12sudo apt updatesudo apt install nginx
配置本地文件
先安装hexo-deployer-sftp依赖
1npm install hexo-deployer-sftp --save
查阅官方文档来配置:
12345678910deploy: type: sftp host: <host> user: <user> pass: <password> remotePath: [remote path] port: [port] privateKey: [path/to/privateKey] passphrase: [passphrase] agent: [path/to/agent/socket]
参数
描述
默认值
host
远程主机的地址
user
使用者名称
pass
密码
remotePath
远程主机的根目录
/
port
端口
22
privateKey
ssh私钥的目录地址
passphras ...
Hexo + Butterfly 建站指南(一)Hexo 框架
先安装 Node.js
因为Hexo依赖于Node.js运行,所以我们需要先安装Node.js
前往官网下载安装长期维护版即可,如果使用最新版本的软件时出现问题,可以尝试我使用的版本
安装完成后,按下 Windows + R 打开运行,输入CMD并回车,打开命令提示符
依次输入下面的命令查询版本号,如果能查询到版本号,那么就算安装成功
12node -vnpm -v
安装 Hexo
现在可以安装Hexo了,使用下面的命令来安装
1npm install -g hexo-cli
可能会出现几个报错,可以忽略
老规矩,查一下版本号
1hexo -v
这样Hexo就算是安装完了
初始化博客目录
现在需要准备一个目录来存放你的博客文件,例如我使用D:\Hexo,然后需要在命令行中使用cd移动至这个目录,如果不在C盘,则还需要加上/d参数
1cd /d D:/Hexo
在这个目录下使用hexo init 你的博客名字初始化你的博客目录
1hexo init MyBlog
在我的例子中,现在D:/Hexo/MyBlog就是博客目录了,此后执行Hexo命令时默认在此目录中执行,现在切进去安装依赖,并初始public目录
123cd ./MyBlognpm installhexo g
打开这个目录,可以看见已经初始化了一些文件,挑几个重点的说
source:页面与文章目录,内部的_posts文件夹里存放着你的文章(你会发现里面已经有了一个hello-world.md)
themes:主题目录
public:存放生成的静态网页,部署就是把里面的内容复制到云端
_config.yml:此 ...
Hexo + Butterfly 建站指南(〇)前言
恭喜你发现了宝藏!🎉🎉🎉
本系列是这个博客网站的搭建教程,个人的踩坑经历也会一并记录
因为需要面向小白,所以很多地方会讲的比较细碎
这个博客系统的运作流程是:在本地安装配置 Hexo框架 + Butterfly主题 ,然后根据 Markdown文档 生成静态文件,再推送至云端,公网上只需要一个网页服务器就行
目录
正文
Hexo + Butterfly 建站指南(〇)前言
Hexo + Butterfly 建站指南(一)Hexo 框架
Hexo + Butterfly 建站指南(二)部署至个人站点或 GitHub Pages
Hexo + Butterfly 建站指南(三)Butterfly 主题
Hexo + Butterfly 建站指南(四)Twikoo 评论系统
Hexo + Butterfly 建站指南(五)日常写作
Hexo + Butterfly 建站指南(六)PicGO + Gitee 图床(已废弃)
Hexo + Butterfly 建站指南(七)阿里云 OSS 图床
Hexo + Butterfly 建站指南(八)使用 KaTeX 数学公式
附录
『Twikoo』解决 Vercel.app 在国内被墙导致无法使用的问题
Hexo 首页添加 Gitcalendar 提交日历
阿里云OSS被刷,我交了1000RMB学费!
鸣谢
Hexo 官网
Butterfly 主题官方文档
Hexo+Butterfly主题美化 | 唐先森の博客(这位是真大佬)
PicGo+码云(gitee)图床环境搭建
懒人包
因为整个过程还是比较繁琐的,记忆里我连着折 ...
『Linux』使用 ffmpeg 下载 m3u8 视频
众所周知,很多视频都是m3u8格式的,我一般会用 M3U8批量下载器 下载,但有时候资源是外网的,梯子网速又有点慢,这时候就可以挂到外网的服务器上下载
这里我建议用ffmpeg,毕竟很多M3U8的下载工具都是用它封装的
安装
可以选择去官网下载安装,但是我比较懒,直接用apt算了
12sudo apt updatesudo apt install ffmpeg
老规矩,如果能查到版本号那就是安装成功了
1ffmpeg -version
使用
套下面这个模板即可
1ffmpeg -i <你的m3u8的URL> -c copy <保存的文件位置>
例:
1ffmpeg -i https://www.example.com/example.m3u8 -c copy ~/example.mp4
缺点
下载时间可能很长,如果关掉窗口就结束了进程,建议配合 screen 使用
下载是单线程的,效率比较低
『C/C++』可变参数
从 scanf() 和 printf() 讲起
在使用 scanf() 和 printf() 时,你会发现一个奇怪的现象,它的参数个数是不确定的,格式化字符串中有多少个%,后面就要跟多少个参数
1234printf("%d",a);printf("%d %d",a,b);printf("%d %d %d",a,b,c);......
但在我们一般的印象中,一个函数在被声明时,它的参数个数就固定了,不能改变
让我们在 stdio.h 中找到 scanf() 的定义:
12345678int scanf(const char *__format, ...){ int __retval; __builtin_va_list __local_argv; __builtin_va_start( __local_argv, __format ); __retval = __mingw_vfscanf( stdin, __format, __local_argv ); __builtin_va_end( __local_argv ); return __retval;}
接受参数怎么有个省略号?还可以这样写吗?
这便牵扯到可变参数
可变参数的头文件
我们在使用可变参数时,需要引入 stdarg.h 头文件
在 stdarg.h 中,有一个数据类型,四个宏
类型
描述
va_list
用来保存宏 va_arg 与宏 va_end 所需信息
宏
描述
va_start(va ...
『C/C++』结构体内存对齐问题
初始的问题
先来看一个问题,对于下面这两个结构体,它们的大小是一样的吗?
1234567struct x{char c;double d;int i;} a;printf("%d\n", sizeof(a));
1234567struct y{ char c; int i; double d;} b;printf("%d\n", sizeof(b));
你可能认为它们是一样的,但实际上是不一样的,一个是24,另一个是16
也据说是:结构体的大小并不是简单地将每个结构体成员的大小相加就能得到
如何计算结构体大小
首先我们要了解各种基本类型的大小
Type
sizeof(Type)
char
1
short
2
float
4
int
4
long
4
long long
8
double
8
long double
16
一般情况
后声明的类型永远认为结构体是按照自己的类型来的(找当前类型大小的最小倍数位置存放)
整个结构体补全到最大类型的整数倍
在第一个例子中
先声明了char类型,占用了1字节
然后声明int类型,他发现前4个字节有部分被占用了(无法使用),就跳过4个字节声明了自己,占用4字节
然后声明double类型,前8个字节有被占用,跳过8个字节声明自己,占用8字节
总计16字节,是8的倍数,所以结果为16
在第二个例子中
先声明char占用1字节
然后声明double,前8字节被占用,跳过前8字节声明自己,占用8字节
最后int ...
Gin 入门笔记(五)路由分组和路由文件抽离
在之前的方法中,配置路由、处理数据都在 main.go 文件中进行,当遇到稍大的项目时维护就会十分吃力,也难以团队协作,所以我们现在需要进行路由分组和文件抽离
12345678910111213141516171819202122232425262728293031323334353637383940414243package mainimport ( "github.com/gin-gonic/gin")func main() { r := gin.Default() //前台路由 r.GET("/", func(c *gin.Context) { c.String(200, "首页") }) r.GET("/news", func(c *gin.Context) { c.String(200, "新闻") }) //后台路由 r.GET("/admin", func(c *gin.Context) { c.String(200, "后台首页") }) r.GET("/admin/user", func(c *gin.Context) { c.String(200, "设置用户") }) r.GET("/admin/article", func(c *gin.Context) ...
Go 切片(Slice)
Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片(“动态数组”),与数组相比切片的长度是不固定的,可以追加元素,容量(cap)不够时会自动扩容
切片为引用类型,从数组中得到的切片修改元素值时,原数组也会发生变化,修改原数组时,切片也会变化
创建切片的四种方法
var
1var s []uint32
2.切片字面量,这样创建的切片长度和容量都等于初始元素个数
1s := []uint32{1, 2, 3}
3.make
使用make创建,可以指定长度和容量。格式为make([]type, len[, cap]),可以只指定长度,也可以长度容量同时指定
123s1 := make([]uint32)s2 := make([]uint32, 1)s3 := make([]uint32, 1, 10)
4,截取符,可以从现成的数组或切片创建
12345var arr [10]uint32s1 := arr[0:5]s2 := arr[:5]s3 := arr[5:]s4 := arr[:]
二、添加元素
使用append()函数向切片中添加元素,可以一次添加 0 个或多个元素,如果容量不够会自动扩容
1234567s := make([]uint32, 0, 4)s = append(s, 1, 2, 3)fmt.Println(len(s), cap(s)) // 3 4s = append(s, 4, 5, 6)fmt.Println(len(s), cap(s)) // 6 8
使用copy()将 ...
Go 中的 &T{...}、new(T)、make(T) 的区别
一、&T{…}
&T{...} 可以返回一个 T 类型指针,并且在括号指定初值,只能用于结构体
二、new(T)
new(T)与&T{...}基本相同,但不能指定初值(所以一般还是用new(T)),不过除了结构体还可以用于基本类型(如 int )
三、make(T)
make(T)用于创建 3 种内建的引用类型:切片、map 和 channel,如:
1v := make([]int, 10, 50)
这样分配一个有 50 个 int 值的数组,并且创建了一个长度为 10,容量为 50 的 切片 v,该 切片 指向数组的前 10 个元素
换言之,new 函数分配内存,make 函数初始化;下图给出了区别:
又或者,我们来看 buildin.go 中的注释:
Gin 入门笔记(四)路由传值与动态路由
一、GET 请求传值
GET请求就是在 URL 中携带的参数,如
1http://127.0.0.1:8080/?username=admin&passwd=12345&page=10
就传递了username,password和page三个参数
1234567891011r.GET("/", func(c *gin.Context) { username := c.Query("username") passwd := c.Query("passwd") page := c.DefaultQuery("page", "1") c.JSON(http.StatusOK, gin.H{ "username": username, "passwd": passwd, "page": page, })})
使用c.Query()接收数据,而使用c.DefaultQuery()还能指定默认值
二、POST 请求传值,获取 form 表单数据
我们现在需要配置两个路由,其中addUser.html需要写模板创建一个表单并向doAddUser.html发送POST请求,而doAddUser.html则只需接收信息并打印出来
12345678910111213141516<!DOCTYPE html><html lang="en&q ...