diff --git a/2022/09/14/Hexo安装摸索/index.html b/2022/09/14/Hexo安装摸索/index.html index ee8d0954a..98b152d01 100644 --- a/2022/09/14/Hexo安装摸索/index.html +++ b/2022/09/14/Hexo安装摸索/index.html @@ -1 +1 @@ -Hexo 安装摸索 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# hexo 博客安装

  1. 安装 nodejs

  2. 安装 git

  3. 安装 hexo(windows 需进入 git bash)

    npm install -g hexo-cli

  4. 初始化博客目录

    hexo init blog

  5. 进入博客目录

    cd blog

  6. 初始化 hexo 到博客目录

    npm install

# shoka 主题安装

  1. 下载主题

    git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka

  2. 卸载 hexo-renderer-marked 以及别的 markdown 文件渲染器

    npm un hexo-renderer-marked --save

  3. 安装(md 文件渲染器,压缩 css/js/html)

    npm i hexo-renderer-multi-markdown-it --save

如果出现安装报错的情况,可使用 yarn 进行安装
npm install -g yarn #安装 yarn
yarn config set registry https://registry.npm.taobao.org #使用淘宝源
yarn add hexo-renderer-multi-markdown-it

  1. 安装(给生成的 css 文件们添加浏览器前缀)

    npm i hexo-autoprefixer --save

  2. 安装(站内搜索功能)

    npm i hexo-algoliasearch --save

  3. 安装(文章或站点字数及阅读时间统计)

    npm i hexo-symbols-count-time --save

  4. 安装(生成 Feed 文件)

    npm i hexo-feed --save

# Hexo 部分常用命令

  • 清除静态文件

    hexo clean

  • 生成静态文件

    hexo g

  • 安装 git 推送插件

    npm install hexo-deployer-git --save

  • 推送静态文件到 git

    hexo d

# 安装 hexo-admin(编写博客插件)

admin:
username: username
password_hash: xxxxxx
secret: 'my super secret phrase' #用单引号包裹
deployCommand: 'hexo_publish.sh' #windows 用 hexo_publish.bat,linux 用 hexo_publish.sh

当出现 Error: Function yaml.safeLoad is removed in js-yaml 4. Use yaml.load instead, which is now safe by default. 时,需要修改 /blog/node_modules/hexo-admin/api.js 文件。把 yml.safeLoad (fs.readFileSync (path)) 改为 yml.load (fs.readFileSync (path)),然后重启 hexo-admin 服务即可。出现此问题的原因是:yaml.safeLoad 已经弃用!

# hexo_publish.sh

#!/bin/bash
hexo clean
hexo g
hexo d

# hexo_publish.bat

@echo off
cd D:\blog
d:
@cmd /c "hexo clean&& hexo g&&hexo d&&echo success"
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +Hexo 安装摸索 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# hexo 博客安装

  1. 安装 nodejs

  2. 安装 git

  3. 安装 hexo(windows 需进入 git bash)

    npm install -g hexo-cli

  4. 初始化博客目录

    hexo init blog

  5. 进入博客目录

    cd blog

  6. 初始化 hexo 到博客目录

    npm install

# shoka 主题安装

  1. 下载主题

    git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka

  2. 卸载 hexo-renderer-marked 以及别的 markdown 文件渲染器

    npm un hexo-renderer-marked --save

  3. 安装(md 文件渲染器,压缩 css/js/html)

    npm i hexo-renderer-multi-markdown-it --save

如果出现安装报错的情况,可使用 yarn 进行安装
npm install -g yarn #安装 yarn
yarn config set registry https://registry.npm.taobao.org #使用淘宝源
yarn add hexo-renderer-multi-markdown-it

  1. 安装(给生成的 css 文件们添加浏览器前缀)

    npm i hexo-autoprefixer --save

  2. 安装(站内搜索功能)

    npm i hexo-algoliasearch --save

  3. 安装(文章或站点字数及阅读时间统计)

    npm i hexo-symbols-count-time --save

  4. 安装(生成 Feed 文件)

    npm i hexo-feed --save

# Hexo 部分常用命令

  • 清除静态文件

    hexo clean

  • 生成静态文件

    hexo g

  • 安装 git 推送插件

    npm install hexo-deployer-git --save

  • 推送静态文件到 git

    hexo d

# 安装 hexo-admin(编写博客插件)

admin:
username: username
password_hash: xxxxxx
secret: 'my super secret phrase' #用单引号包裹
deployCommand: 'hexo_publish.sh' #windows 用 hexo_publish.bat,linux 用 hexo_publish.sh

当出现 Error: Function yaml.safeLoad is removed in js-yaml 4. Use yaml.load instead, which is now safe by default. 时,需要修改 /blog/node_modules/hexo-admin/api.js 文件。把 yml.safeLoad (fs.readFileSync (path)) 改为 yml.load (fs.readFileSync (path)),然后重启 hexo-admin 服务即可。出现此问题的原因是:yaml.safeLoad 已经弃用!

# hexo_publish.sh

#!/bin/bash
hexo clean
hexo g
hexo d

# hexo_publish.bat

@echo off
cd D:\blog
d:
@cmd /c "hexo clean&& hexo g&&hexo d&&echo success"
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/09/16/极空间chevereto图床docker版安装/index.html b/2022/09/16/极空间chevereto图床docker版安装/index.html index 30f34c4cc..7c68d2d3e 100644 --- a/2022/09/16/极空间chevereto图床docker版安装/index.html +++ b/2022/09/16/极空间chevereto图床docker版安装/index.html @@ -1 +1 @@ -极空间 chevereto 图床 docker 版安装 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 安装准备

  1. 需要先安装好 mysql 数据库

  2. 选择版本,1.5 版以前支持中文,之后被维护的团队删除只支持英文

  3. 本文介绍使用的是 linuxserver_chevereto 的镜像

  4. 需要预先创建好给 chevereto 使用的库、账户、密码

  • 经过测试,使用 surenkid_chevereto 的镜像可以完美支持多国语言,配置同 linuxserver_chevereto 一样


# 容器配置

  1. 映射路径(不要放在高速盘,否则会有权限问题)
    6150d69d9a170d96e66ca69420f8c4e8.png

  2. 端口
    08eafb3b30a7eb9b0c0be26ea7a1502a.png

  3. 环境(puid 和 pgid 使用 1000,不要使用 0,否则会报错)
    01567ca9f31f87f832276be35cc4554b.png

# 初始化配置

  1. 使用 http:// 极空间 ip:81 (端口号使用上面配置的,我配置的是 81) 进行 web 访问(数据库配置)
    0.png

  2. 管理员配置(注意 website 配置选择个人,除非需要提供给其它人注册)
    1.png
    2.png

  3. 默认上传大小是 2M,可通过修改 php.ini 配置提升(路径 /etc/php7/php.ini 查找 upload_max_filesize 和 post_max_size 进行修改)。之后用管理员登录通过页面 http://xxx/dashboard/settings/image-upload 修改。
    upload_max_filesize = 256M
    post_max_size = 256M
    max_execution_time = 300
    max_input_time = 300
    memory_limit = 1024M

# 安装完成

  1. 作为图片管理和链接分享服务完全够用。图片链接 url 支持的也很全面。
    2022-09-16-14-52-29.png
    2022-09-16-14-54-58.png
    2022-09-16-14-56-13.png
\ No newline at end of file +极空间 chevereto 图床 docker 版安装 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 安装准备

  1. 需要先安装好 mysql 数据库

  2. 选择版本,1.5 版以前支持中文,之后被维护的团队删除只支持英文

  3. 本文介绍使用的是 linuxserver_chevereto 的镜像

  4. 需要预先创建好给 chevereto 使用的库、账户、密码

  • 经过测试,使用 surenkid_chevereto 的镜像可以完美支持多国语言,配置同 linuxserver_chevereto 一样


# 容器配置

  1. 映射路径(不要放在高速盘,否则会有权限问题)
    6150d69d9a170d96e66ca69420f8c4e8.png

  2. 端口
    08eafb3b30a7eb9b0c0be26ea7a1502a.png

  3. 环境(puid 和 pgid 使用 1000,不要使用 0,否则会报错)
    01567ca9f31f87f832276be35cc4554b.png

# 初始化配置

  1. 使用 http:// 极空间 ip:81 (端口号使用上面配置的,我配置的是 81) 进行 web 访问(数据库配置)
    0.png

  2. 管理员配置(注意 website 配置选择个人,除非需要提供给其它人注册)
    1.png
    2.png

  3. 默认上传大小是 2M,可通过修改 php.ini 配置提升(路径 /etc/php7/php.ini 查找 upload_max_filesize 和 post_max_size 进行修改)。之后用管理员登录通过页面 http://xxx/dashboard/settings/image-upload 修改。
    upload_max_filesize = 256M
    post_max_size = 256M
    max_execution_time = 300
    max_input_time = 300
    memory_limit = 1024M

# 安装完成

  1. 作为图片管理和链接分享服务完全够用。图片链接 url 支持的也很全面。
    2022-09-16-14-52-29.png
    2022-09-16-14-54-58.png
    2022-09-16-14-56-13.png
\ No newline at end of file diff --git a/2022/09/17/Hexo-Theme-Shoka-algolia搜索踩坑/index.html b/2022/09/17/Hexo-Theme-Shoka-algolia搜索踩坑/index.html index cb8d02959..8d1b29783 100644 --- a/2022/09/17/Hexo-Theme-Shoka-algolia搜索踩坑/index.html +++ b/2022/09/17/Hexo-Theme-Shoka-algolia搜索踩坑/index.html @@ -1 +1 @@ -Hexo + Theme.Shoka + algolia 搜索踩坑 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# Hexo + Theme.Shoka 安装

安装介绍

# algolia 注册

  1. algolia 不支持国内邮箱注册,而 google 和 github 由于国内被墙也没法使用。所以只能先注册 netlify 然后通过 netlify 注册 algolia。

  2. 登录 algolia 后创建一个 index,名字随意记住既可。

    2022-09-17-23-32-20.png

  3. 点击右上角红点,弹出窗口点 settings 按钮。

    2022-09-17-23-35-04.png

  4. 点击 API KEYS,获取 appId 和 adminApiKey 填入 hexo 的_config.yml 中 apiKey 暂时不填。

algolia:
  appId: #Your appId
  apiKey: #Your apiKey
  adminApiKey: #Your adminApiKey
  chunkSize: 5000
  indexName: blog #"shoka"
  fields:
    - title #必须配置
    - path #必须配置
    - categories #推荐配置
    - content:strip:truncate,0,2000
    - gallery
    - photos
    - tags
  1. 点击 All Api Keys - New Api key 创建一个 api key,Indices 选先前让记住的 index,ACL 选下面图片中的选项。

    2022-09-17-23-47-50.png

  2. 把第 5 步中新建的 api key 填入到第 4 步中的配置中,到此已经完成了百分之九十,只需要重新编译发布即可。不过编译步骤多了一步,在 hexo g 后需要再执行 hexo algolia,至此搜索功能就大功告成了。

\ No newline at end of file +Hexo + Theme.Shoka + algolia 搜索踩坑 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# Hexo + Theme.Shoka 安装

安装介绍

# algolia 注册

  1. algolia 不支持国内邮箱注册,而 google 和 github 由于国内被墙也没法使用。所以只能先注册 netlify 然后通过 netlify 注册 algolia。

  2. 登录 algolia 后创建一个 index,名字随意记住既可。

    2022-09-17-23-32-20.png

  3. 点击右上角红点,弹出窗口点 settings 按钮。

    2022-09-17-23-35-04.png

  4. 点击 API KEYS,获取 appId 和 adminApiKey 填入 hexo 的_config.yml 中 apiKey 暂时不填。

algolia:
  appId: #Your appId
  apiKey: #Your apiKey
  adminApiKey: #Your adminApiKey
  chunkSize: 5000
  indexName: blog #"shoka"
  fields:
    - title #必须配置
    - path #必须配置
    - categories #推荐配置
    - content:strip:truncate,0,2000
    - gallery
    - photos
    - tags
  1. 点击 All Api Keys - New Api key 创建一个 api key,Indices 选先前让记住的 index,ACL 选下面图片中的选项。

    2022-09-17-23-47-50.png

  2. 把第 5 步中新建的 api key 填入到第 4 步中的配置中,到此已经完成了百分之九十,只需要重新编译发布即可。不过编译步骤多了一步,在 hexo g 后需要再执行 hexo algolia,至此搜索功能就大功告成了。

\ No newline at end of file diff --git a/2022/09/21/记一次netty-socket-io服务端连接不上的问题/index.html b/2022/09/21/记一次netty-socket-io服务端连接不上的问题/index.html index 9ab339ad7..8d877fe26 100644 --- a/2022/09/21/记一次netty-socket-io服务端连接不上的问题/index.html +++ b/2022/09/21/记一次netty-socket-io服务端连接不上的问题/index.html @@ -1 +1 @@ -记一次 netty-socketio 服务端连接不上的问题 - 心得体会 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

今天前端开发跟我反馈用 vue 的 socketio 连接不上后台服务,连接无反应无任何报错。所以不清楚是前端代码问题还是后台服务的问题。由于框架为另一同事搭建,我只负责处理后端业务逻辑部分,所以第一时间我也不清楚具体的原因。于是我找了个第三方的 socket 工具尝试连接,果然有问题。但是只是提示连接不上,无明显错误原因。到后台查看发现有提示 Unknown transport for request 错误,最后通过调试发现 netty-socketio 的库中 AuthorizeHandler 类有段处理 transport 的代码只能接受大写的 WEBSOCKET 或者 POLLING,于是我在工具中按要求填上结果还是不行。然后我在网上搜索也未发现有相关问题,只发现有网友提示需要用 socketio 的库,不要自己写 socket 连接。于是我找了 socket.io.js 来连接,结果还是一样。经过大量调试改代码,最后突发奇想,有没有可能跟 netty-socketio 的版本有关系,于是我把版本从 1.7.20 升级到 1.7.21,结果就奇迹般的好了。

# 总结:就好像大力出奇迹,实在找不到原因的时候不妨升级一下版本,说不定问题就解决了呢!O (∩_∩) O
\ No newline at end of file +记一次 netty-socketio 服务端连接不上的问题 - 心得体会 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

今天前端开发跟我反馈用 vue 的 socketio 连接不上后台服务,连接无反应无任何报错。所以不清楚是前端代码问题还是后台服务的问题。由于框架为另一同事搭建,我只负责处理后端业务逻辑部分,所以第一时间我也不清楚具体的原因。于是我找了个第三方的 socket 工具尝试连接,果然有问题。但是只是提示连接不上,无明显错误原因。到后台查看发现有提示 Unknown transport for request 错误,最后通过调试发现 netty-socketio 的库中 AuthorizeHandler 类有段处理 transport 的代码只能接受大写的 WEBSOCKET 或者 POLLING,于是我在工具中按要求填上结果还是不行。然后我在网上搜索也未发现有相关问题,只发现有网友提示需要用 socketio 的库,不要自己写 socket 连接。于是我找了 socket.io.js 来连接,结果还是一样。经过大量调试改代码,最后突发奇想,有没有可能跟 netty-socketio 的版本有关系,于是我把版本从 1.7.20 升级到 1.7.21,结果就奇迹般的好了。

# 总结:就好像大力出奇迹,实在找不到原因的时候不妨升级一下版本,说不定问题就解决了呢!O (∩_∩) O
\ No newline at end of file diff --git a/2022/09/22/protobuf生成js文件/index.html b/2022/09/22/protobuf生成js文件/index.html index fc41b172f..b5e8dc5fa 100644 --- a/2022/09/22/protobuf生成js文件/index.html +++ b/2022/09/22/protobuf生成js文件/index.html @@ -1 +1 @@ -protobuf 生成 js 文件 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 下载工具

protoc-3.19.5-win64.zip

# 生成 js 文件

  1. 把 xxx.proto 文件拷贝到解压的 protoc-3.19.5-win64\bin 目录下

  2. cmd 到相同的 bin 目录下

  3. 执行 protoc.exe --js_out=import_style=commonjs,binary:. ./xxx.proto 命令,就会在 bin 目录下生成 xxx_pb.js 文件

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +protobuf 生成 js 文件 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 下载工具

protoc-3.19.5-win64.zip

# 生成 js 文件

  1. 把 xxx.proto 文件拷贝到解压的 protoc-3.19.5-win64\bin 目录下

  2. cmd 到相同的 bin 目录下

  3. 执行 protoc.exe --js_out=import_style=commonjs,binary:. ./xxx.proto 命令,就会在 bin 目录下生成 xxx_pb.js 文件

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/09/23/解决域名ip变动后需要重启nginx的问题/index.html b/2022/09/23/解决域名ip变动后需要重启nginx的问题/index.html index e57786d36..296f4516d 100644 --- a/2022/09/23/解决域名ip变动后需要重启nginx的问题/index.html +++ b/2022/09/23/解决域名ip变动后需要重启nginx的问题/index.html @@ -1 +1 @@ -解决域名 ip 变动后需要重启 nginx 的问题 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

今天突然发现自己的网站不能访问了。经过一顿排查,发现是家里的外网 ip 变动后 nginx 解析的域名 ip 还是旧 ip 导致的。手动重启 nginx 后恢复正常。但这不是长久之计,如果每次 ip 变动都需要重启一次 nginx,想想都头大。于是查询资料后获得了解决办法,方法如下:

location / {	
	resolver 114.114.114.114 valid=60s; #自定义缓存有效时间间隔对变量中的域名进行解析
	set $my_server "https://ip:port";
	proxy_pass $my_server;
}
\ No newline at end of file +解决域名 ip 变动后需要重启 nginx 的问题 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

今天突然发现自己的网站不能访问了。经过一顿排查,发现是家里的外网 ip 变动后 nginx 解析的域名 ip 还是旧 ip 导致的。手动重启 nginx 后恢复正常。但这不是长久之计,如果每次 ip 变动都需要重启一次 nginx,想想都头大。于是查询资料后获得了解决办法,方法如下:

location / {	
	resolver 114.114.114.114 valid=60s; #自定义缓存有效时间间隔对变量中的域名进行解析
	set $my_server "https://ip:port";
	proxy_pass $my_server;
}
\ No newline at end of file diff --git a/2022/09/26/解决Hexo-Shoka背景音乐无法播放的问题/index.html b/2022/09/26/解决Hexo-Shoka背景音乐无法播放的问题/index.html index 31ec827a4..313868ce1 100644 --- a/2022/09/26/解决Hexo-Shoka背景音乐无法播放的问题/index.html +++ b/2022/09/26/解决Hexo-Shoka背景音乐无法播放的问题/index.html @@ -1 +1 @@ -解决 Hexo+Shoka 背景音乐无法播放的问题 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 问题描述

今天突然发现博客的音乐无法播放了,经过一顿查找,发现是因为 https://api.i-meto.com/meting/api 获取的音乐地址出现了问题,估计是被网易云给封禁了。shoka 主题应该是通过这个网站提取音乐地址、图片等信息。通过断点发现网易播放列表还是能正常获取的,只是列表中的具体音乐、图片出现了问题。因为 meto 是把音乐的 url 指向自己的服务地址,然后通过参数获取的最终音乐,所以我通过参数拼凑出最终的网易云音乐地址,自此问题基本解决。只针对网易播放列表,图片只能使用一张固定的(因为图片的具体规律不知道 O (∩_∩) O~)。

# 解决方法

到 themes\shoka\source\js\_app 目录下打开 player.js 文件,替换成如下代码。

var NOWPLAYING = null
const isMobile = /mobile/i.test(window.navigator.userAgent);
const mediaPlayer = function (t, config) {
    var option = {
        type: 'audio',
        mode: 'random',
        btns: ['play-pause', 'music'],
        controls: ['mode', 'backward', 'play-pause', 'forward', 'volume'],
        events: {
            "play-pause": function (event) {
                if (source.paused) {
                    t.player.play()
                } else {
                    t.player.pause()
                }
            },
            "music": function (event) {
                if (info.el.hasClass('show')) {
                    info.hide()
                } else {
                    info.el.addClass('show');
                    playlist.scroll().title()
                }
            }
        }
    }, utils = {
        random: function (len) {
            return Math.floor((Math.random() * len))
        },
        parse: function (link) {
            var result = [];
            [
                ['music.163.com.*song.*id=(\\d+)', 'netease', 'song'],
                ['music.163.com.*album.*id=(\\d+)', 'netease', 'album'],
                ['music.163.com.*artist.*id=(\\d+)', 'netease', 'artist'],
                ['music.163.com.*playlist.*id=(\\d+)', 'netease', 'playlist'],
                ['music.163.com.*discover/toplist.*id=(\\d+)', 'netease', 'playlist'],
                ['y.qq.com.*song/(\\w+).html', 'tencent', 'song'],
                ['y.qq.com.*album/(\\w+).html', 'tencent', 'album'],
                ['y.qq.com.*singer/(\\w+).html', 'tencent', 'artist'],
                ['y.qq.com.*playsquare/(\\w+).html', 'tencent', 'playlist'],
                ['y.qq.com.*playlist/(\\w+).html', 'tencent', 'playlist'],
                ['xiami.com.*song/(\\w+)', 'xiami', 'song'],
                ['xiami.com.*album/(\\w+)', 'xiami', 'album'],
                ['xiami.com.*artist/(\\w+)', 'xiami', 'artist'],
                ['xiami.com.*collect/(\\w+)', 'xiami', 'playlist'],
            ].forEach(function (rule) {
                var patt = new RegExp(rule[0])
                var res = patt.exec(link)
                if (res !== null) {
                    result = [rule[1], rule[2], res[1]]
                }
            })
            return result
        },
        fetch: function (source) {
            var list = []
            return new Promise(function (resolve, reject) {
                source.forEach(function (raw) {
                    var meta = utils.parse(raw)
                    if (meta[0]) {
                        var skey = JSON.stringify(meta)
                        var playlist = store.get(skey)
                        if (playlist) {
                            // 自己修改 - start
                            var audioInfos = JSON.parse(playlist);
                            audioInfos.forEach(function (item, i) {
                                item.company = meta[0];
                            });
                            list.push.apply(list, audioInfos);
                            resolve(list);
                            // 自己修改 - end
                        } else {
                            fetch('https://api.i-meto.com/meting/api?server=' + meta[0] + '&type=' + meta[1] + '&id=' + meta[2] + '&r=' + Math.random())
                                .then(function (response) {
                                    return response.json()
                                }).then(function (json) {
                                    store.set(skey, JSON.stringify(json))
                                    list.push.apply(list, json);
                                    resolve(list);
                                }).catch(function (ex) { })
                        }
                    } else {
                        list.push(raw);
                        resolve(list);
                    }
                })
            })
        },
        secondToTime: function (second) {
            var add0 = function (num) {
                return isNaN(num) ? '00' : (num < 10 ? '0' + num : '' + num)
            };
            var hour = Math.floor(second / 3600);
            var min = Math.floor((second - hour * 3600) / 60);
            var sec = Math.floor(second - hour * 3600 - min * 60);
            return (hour > 0 ? [hour, min, sec] : [min, sec]).map(add0).join(':');
        },
        nameMap: {
            dragStart: isMobile ? 'touchstart' : 'mousedown',
            dragMove: isMobile ? 'touchmove' : 'mousemove',
            dragEnd: isMobile ? 'touchend' : 'mouseup',
        }
    }, source = null;
    t.player = {
        _id: utils.random(999999),
        group: true,
        // 加载播放列表
        load: function (newList) {
            var d = ""
            var that = this
            if (newList && newList.length > 0) {
                if (this.options.rawList !== newList) {
                    this.options.rawList = newList;
                    playlist.clear()
                    // 获取新列表
                    //this.fetch()
                }
            } else {
                // 没有列表时,隐藏按钮
                d = "none"
                this.pause()
            }
            for (var el in buttons.el) {
                buttons.el[el].display(d)
            }
            return this
        },
        fetch: function () {
            var that = this;
            return new Promise(function (resolve, reject) {
                if (playlist.data.length > 0) {
                    resolve()
                } else {
                    if (that.options.rawList) {
                        var promises = [];
                        that.options.rawList.forEach(function (raw, index) {
                            promises.push(new Promise(function (resolve, reject) {
                                var group = index
                                var source
                                if (!raw.list) {
                                    group = 0
                                    that.group = false
                                    source = [raw]
                                } else {
                                    that.group = true
                                    source = raw.list
                                }
                                utils.fetch(source).then(function (list) {
                                    playlist.add(group, list)
                                    resolve()
                                })
                            }))
                        })
                        Promise.all(promises).then(function () {
                            resolve(true)
                        })
                    }
                }
            }).then(function (c) {
                if (c) {
                    playlist.create()
                    controller.create()
                    that.mode()
                }
            })
        },
        // 根据模式切换当前曲目 index
        mode: function () {
            var total = playlist.data.length;
            if (!total || playlist.errnum == total)
                return;
            var step = controller.step == 'next' ? 1 : -1
            var next = function () {
                var index = playlist.index + step
                if (index > total || index < 0) {
                    index = controller.step == 'next' ? 0 : total - 1;
                }
                playlist.index = index;
            }
            var random = function () {
                var p = utils.random(total)
                if (playlist.index !== p) {
                    playlist.index = p
                } else {
                    next()
                }
            }
            switch (this.options.mode) {
                case 'random':
                    random()
                    break;
                case 'order':
                    next()
                    break;
                case 'loop':
                    if (controller.step)
                        next()
                    if (playlist.index == -1)
                        random()
                    break;
            }
            this.init()
        },
        // 直接设置当前曲目 index
        switch: function (index) {
            if (typeof index == 'number'
                && index != playlist.index
                && playlist.current()
                && !playlist.current().error) {
                playlist.index = index;
                this.init()
            }
        },
        // 更新 source 为当前曲目 index
        init: function () {
            var item = playlist.current()
            if (!item || item['error']) {
                this.mode();
                return;
            }
            var playing = false;
            if (!source.paused) {
                playing = true
                this.stop()
            }
            source.attr('src', item.url);
            source.attr('title', item.name + ' - ' + item.artist);
            this.volume(store.get('_PlayerVolume') || '0.7')
            this.muted(store.get('_PlayerMuted'))
            progress.create()
            if (this.options.type == 'audio')
                preview.create()
            if (playing == true) {
                this.play()
            }
        },
        play: function () {
            NOWPLAYING && NOWPLAYING.player.pause()
            if (playlist.current().error) {
                this.mode();
                return;
            }
            var that = this
            source.play().then(function () {
                playlist.scroll()
            }).catch(function (e) { });
        },
        pause: function () {
            source.pause()
            document.title = originTitle
        },
        stop: function () {
            source.pause();
            source.currentTime = 0;
            document.title = originTitle;
        },
        seek: function (time) {
            time = Math.max(time, 0)
            time = Math.min(time, source.duration)
            if (isNaN(time)) {
                time = 0;
            }
            source.currentTime = time;
            progress.update(time / source.duration)
        },
        muted: function (status) {
            if (status == 'muted') {
                source.muted = status
                store.set('_PlayerMuted', status)
                controller.update(0)
            } else {
                store.del('_PlayerMuted')
                source.muted = false
                controller.update(source.volume)
            }
        },
        volume: function (percentage) {
            if (!isNaN(percentage)) {
                controller.update(percentage)
                store.set('_PlayerVolume', percentage)
                source.volume = percentage
            }
        },
        mini: function () {
            info.hide()
        }
    };
    var info = {
        el: null,
        create: function () {
            if (this.el)
                return;
            this.el = t.createChild('div', {
                className: 'player-info',
                innerHTML: (t.player.options.type == 'audio' ? '<div class="preview"></div>' : '') + '<div class="controller"></div><div class="playlist"></div>'
            }, 'after');
            preview.el = this.el.child(".preview");
            playlist.el = this.el.child(".playlist");
            controller.el = this.el.child(".controller");
        },
        hide: function () {
            var el = this.el
            el.addClass('hide');
            window.setTimeout(function () {
                el.removeClass('show hide')
            }, 300);
        }
    }
    var playlist = {
        el: null,
        data: [],
        index: -1,
        errnum: 0,
        add: function (group, list) {
            var that = this
            list.forEach(function (item, i) {
                item.group = group;
                item.name = item.name || item.title || 'Meida name';
                item.artist = item.artist || item.author || 'Anonymous';
                item.cover = item.cover || item.pic;
                item.type = item.type || 'normal';
                that.data.push(item);
            });
        },
        clear: function () {
            this.data = []
            this.el.innerHTML = ""
            if (this.index !== -1) {
                this.index = -1
                t.player.fetch()
            }
        },
        create: function () {
            var el = this.el
            this.data.map(function (item, index) {
                if (item.el)
                    return
                var id = 'list-' + t.player._id + '-' + item.group
                var tab = $('#' + id)
                if (!tab) {
                    tab = el.createChild('div', {
                        id: id,
                        className: t.player.group ? 'tab' : '',
                        innerHTML: '<ol></ol>',
                    })
                    if (t.player.group) {
                        tab.attr('data-title', t.player.options.rawList[item.group]['title'])
                            .attr('data-id', t.player._id)
                    }
                }
                item.el = tab.child('ol').createChild('li', {
                    title: item.name + ' - ' + item.artist,
                    innerHTML: '<span class="info"><span>' + item.name + '</span><span>' + item.artist + '</span></span>',
                    onclick: function (event) {
                        var current = event.currentTarget;
                        if (playlist.index === index && progress.el) {
                            if (source.paused) {
                                t.player.play();
                            } else {
                                t.player.seek(source.duration * progress.percent(event, current))
                            }
                            return;
                        }
                        t.player.switch(index);
                        t.player.play();
                    }
                })
                return item
            })
            tabFormat()
        },
        current: function () {
            return this.data[this.index]
        },
        scroll: function () {
            var item = this.current()
            var li = this.el.child('li.active')
            li && li.removeClass('active')
            var tab = this.el.child('.tab.active')
            tab && tab.removeClass('active')
            li = this.el.find('.nav li')[item.group]
            li && li.addClass('active')
            tab = this.el.find('.tab')[item.group]
            tab && tab.addClass('active')
            pageScroll(item.el, item.el.offsetTop)
            return this
        },
        title: function () {
            if (source.paused)
                return
            var current = this.current()
            document.title = 'Now Playing...' + current['name'] + ' - ' + current['artist'] + ' | ' + originTitle;
        },
        error: function () {
            var current = this.current()
            current.el.removeClass('current').addClass('error')
            current.error = true
            this.errnum++
        }
    }
    var lyrics = {
        el: null,
        data: null,
        index: 0,
        create: function (box) {
            var current = playlist.index
            var that = this
            var raw = playlist.current().lrc
            var callback = function (body) {
                if (current !== playlist.index)
                    return;
                that.data = that.parse(body)
                var lrc = ''
                that.data.forEach(function (line, index) {
                    lrc += '<p' + (index === 0 ? ' class="current"' : '') + '>' + line[1] + '</p>';
                })
                that.el = box.createChild('div', {
                    className: 'inner',
                    innerHTML: lrc
                }, 'replace')
                that.index = 0;
            }
            if (raw && raw.startsWith('http'))
                this.fetch(raw, callback)
            else
                callback(raw)
        },
        update: function (currentTime) {
            if (!this.data)
                return
            if (this.index > this.data.length - 1 || currentTime < this.data[this.index][0] || (!this.data[this.index + 1] || currentTime >= this.data[this.index + 1][0])) {
                for (var i = 0; i < this.data.length; i++) {
                    if (currentTime >= this.data[i][0] && (!this.data[i + 1] || currentTime < this.data[i + 1][0])) {
                        this.index = i;
                        var y = -(this.index - 1);
                        this.el.style.transform = 'translateY(' + y + 'rem)';
                        this.el.style.webkitTransform = 'translateY(' + y + 'rem)';
                        this.el.getElementsByClassName('current')[0].removeClass('current');
                        this.el.getElementsByTagName('p')[i].addClass('current');
                    }
                }
            }
        },
        parse: function (lrc_s) {
            if (lrc_s) {
                lrc_s = lrc_s.replace(/([^\]^\n])\[/g, function (match, p1) { return p1 + '\n[' });
                const lyric = lrc_s.split('\n');
                var lrc = [];
                const lyricLen = lyric.length;
                for (var i = 0; i < lyricLen; i++) {
                    // match lrc time
                    const lrcTimes = lyric[i].match(/\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g);
                    // match lrc text
                    const lrcText = lyric[i]
                        .replace(/.*\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g, '')
                        .replace(/<(\d{2}):(\d{2})(\.(\d{2,3}))?>/g, '')
                        .replace(/^\s+|\s+$/g, '');
                    if (lrcTimes) {
                        // handle multiple time tag
                        const timeLen = lrcTimes.length;
                        for (var j = 0; j < timeLen; j++) {
                            const oneTime = /\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/.exec(lrcTimes[j]);
                            const min2sec = oneTime[1] * 60;
                            const sec2sec = parseInt(oneTime[2]);
                            const msec2sec = oneTime[4] ? parseInt(oneTime[4]) / ((oneTime[4] + '').length === 2 ? 100 : 1000) : 0;
                            const lrcTime = min2sec + sec2sec + msec2sec;
                            lrc.push([lrcTime, lrcText]);
                        }
                    }
                }
                // sort by time
                lrc = lrc.filter(function (item) { return item[1] });
                lrc.sort(function (a, b) { return a[0] - b[0] });
                return lrc;
            } else {
                return [];
            }
        },
        fetch: function (url, callback) {
            fetch(url)
                .then(function (response) {
                    return response.text()
                }).then(function (body) {
                    callback(body)
                }).catch(function (ex) { })
        }
    }
    var preview = {
        el: null,
        create: function () {
            var current = playlist.current()
            this.el.innerHTML = '<div class="cover"><div class="disc"><img src="' + (current.cover) + '" class="blur" /></div></div>'
                + '<div class="info"><h4 class="title">' + current.name + '</h4><span>' + current.artist + '</span>'
                + '<div class="lrc"></div></div>'
            this.el.child('.cover').addEventListener('click', t.player.options.events['play-pause'])
            lyrics.create(this.el.child('.lrc'))
        }
    }
    var progress = {
        el: null,
        bar: null,
        create: function () {
            var current = playlist.current().el
            if (current) {
                if (this.el) {
                    this.el.parentNode.removeClass('current')
                        .removeEventListener(utils.nameMap.dragStart, this.drag)
                    this.el.remove()
                }
                this.el = current.createChild('div', {
                    className: 'progress'
                })
                this.el.attr('data-dtime', utils.secondToTime(0))
                this.bar = this.el.createChild('div', {
                    className: 'bar',
                })
                current.addClass('current')
                current.addEventListener(utils.nameMap.dragStart, this.drag);
                playlist.scroll()
            }
        },
        update: function (percent) {
            this.bar.width(Math.floor(percent * 100) + '%')
            this.el.attr('data-ptime', utils.secondToTime(percent * source.duration))
        },
        seeking: function (type) {
            if (type)
                this.el.addClass('seeking')
            else
                this.el.removeClass('seeking')
        },
        percent: function (e, el) {
            var percentage = ((e.clientX || e.changedTouches[0].clientX) - el.left()) / el.width();
            percentage = Math.max(percentage, 0);
            return Math.min(percentage, 1)
        },
        drag: function (e) {
            e.preventDefault()
            var current = playlist.current().el
            var thumbMove = function (e) {
                e.preventDefault()
                var percentage = progress.percent(e, current)
                progress.update(percentage)
                lyrics.update(percentage * source.duration);
            };
            var thumbUp = function (e) {
                e.preventDefault()
                current.removeEventListener(utils.nameMap.dragEnd, thumbUp)
                current.removeEventListener(utils.nameMap.dragMove, thumbMove)
                var percentage = progress.percent(e, current)
                progress.update(percentage)
                t.player.seek(percentage * source.duration)
                source.disableTimeupdate = false
                progress.seeking(false)
            };
            source.disableTimeupdate = true
            progress.seeking(true)
            current.addEventListener(utils.nameMap.dragMove, thumbMove)
            current.addEventListener(utils.nameMap.dragEnd, thumbUp)
        }
    }
    var controller = {
        el: null,
        btns: {},
        step: 'next',
        create: function () {
            if (!t.player.options.controls)
                return
            var that = this
            t.player.options.controls.forEach(function (item) {
                if (that.btns[item])
                    return;
                var opt = {
                    onclick: function (event) {
                        that.events[item] ? that.events[item](event) : t.player.options.events[item](event)
                    }
                }
                switch (item) {
                    case 'volume':
                        opt.className = ' ' + (source.muted ? 'off' : 'on')
                        opt.innerHTML = '<div class="bar"></div>'
                        opt['on' + utils.nameMap.dragStart] = that.events['volume']
                        opt.onclick = null
                        break;
                    case 'mode':
                        opt.className = ' ' + t.player.options.mode
                        break;
                    default:
                        opt.className = ''
                        break;
                }
                opt.className = item + opt.className + ' btn'
                that.btns[item] = that.el.createChild('div', opt)
            })
            that.btns['volume'].bar = that.btns['volume'].child('.bar')
        },
        events: {
            mode: function (e) {
                switch (t.player.options.mode) {
                    case 'loop':
                        t.player.options.mode = 'random'
                        break;
                    case 'random':
                        t.player.options.mode = 'order'
                        break;
                    default:
                        t.player.options.mode = 'loop'
                }
                controller.btns['mode'].className = 'mode ' + t.player.options.mode + ' btn'
                store.set('_PlayerMode', t.player.options.mode)
            },
            volume: function (e) {
                e.preventDefault()
                var current = e.currentTarget
                var drag = false
                var thumbMove = function (e) {
                    e.preventDefault()
                    t.player.volume(controller.percent(e, current))
                    drag = true
                };
                var thumbUp = function (e) {
                    e.preventDefault()
                    current.removeEventListener(utils.nameMap.dragEnd, thumbUp)
                    current.removeEventListener(utils.nameMap.dragMove, thumbMove)
                    if (drag) {
                        t.player.muted()
                        t.player.volume(controller.percent(e, current))
                    } else {
                        if (source.muted) {
                            t.player.muted()
                            t.player.volume(source.volume)
                        } else {
                            t.player.muted('muted')
                            controller.update(0)
                        }
                    }
                };
                current.addEventListener(utils.nameMap.dragMove, thumbMove)
                current.addEventListener(utils.nameMap.dragEnd, thumbUp)
            },
            backward: function (e) {
                controller.step = 'prev'
                t.player.mode()
            },
            forward: function (e) {
                controller.step = 'next'
                t.player.mode()
            },
        },
        update: function (percent) {
            controller.btns['volume'].className = 'volume ' + (!source.muted && percent > 0 ? 'on' : 'off') + ' btn'
            controller.btns['volume'].bar.width(Math.floor(percent * 100) + '%')
        },
        percent: function (e, el) {
            var percentage = ((e.clientX || e.changedTouches[0].clientX) - el.left()) / el.width();
            percentage = Math.max(percentage, 0);
            return Math.min(percentage, 1);
        }
    }
    var events = {
        onerror: function () {
            // 自己修改 - start
            var item = playlist.current();
            if (!item.repair && item.company && item.company == "netease") {
                var id = item.url.substring(item.url.indexOf("id=") + 3, item.url.indexOf("&auth="));
                item.url = "https://music.163.com/song/media/outer/url?id=" + id; // 修正的网易云 url
                item.pic = "https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200"; // 使用网易云上固定的一张封面
                item.cover = item.pic;
                item.repair = true; // 已修正
                t.player.init(); // 重新播放
            } else {
                playlist.error()
                t.player.mode()
            }
            // 自己修改 - end
        },
        ondurationchange: function () {
            if (source.duration !== 1) {
                progress.el.attr('data-dtime', utils.secondToTime(source.duration))
            }
        },
        onloadedmetadata: function () {
            t.player.seek(0)
            progress.el.attr('data-dtime', utils.secondToTime(source.duration))
        },
        onplay: function () {
            t.parentNode.addClass('playing')
            showtip(this.attr('title'))
            NOWPLAYING = t
        },
        onpause: function () {
            t.parentNode.removeClass('playing')
            NOWPLAYING = null
        },
        ontimeupdate: function () {
            if (!this.disableTimeupdate) {
                progress.update(this.currentTime / this.duration)
                lyrics.update(this.currentTime)
            }
        },
        onended: function (argument) {
            t.player.mode()
            t.player.play()
        }
    }
    var buttons = {
        el: {},
        create: function () {
            if (!t.player.options.btns)
                return
            var that = this
            t.player.options.btns.forEach(function (item) {
                if (that.el[item])
                    return;
                that.el[item] = t.createChild('div', {
                    className: item + ' btn',
                    onclick: function (event) {
                        t.player.fetch().then(function () {
                            t.player.options.events[item](event)
                        })
                    }
                });
            });
        }
    }
    var init = function (config) {
        if (t.player.created)
            return;
        t.player.options = Object.assign(option, config);
        t.player.options.mode = store.get('_PlayerMode') || t.player.options.mode
        // 初始化 button、controls 以及 click 事件
        buttons.create()
        // 初始化 audio or video
        source = t.createChild(t.player.options.type, events);
        // 初始化播放列表、预览、控件按钮等
        info.create();
        t.parentNode.addClass(t.player.options.type)
        t.player.created = true;
    }
    init(config)
    return t;
}
\ No newline at end of file +解决 Hexo+Shoka 背景音乐无法播放的问题 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 问题描述

今天突然发现博客的音乐无法播放了,经过一顿查找,发现是因为 https://api.i-meto.com/meting/api 获取的音乐地址出现了问题,估计是被网易云给封禁了。shoka 主题应该是通过这个网站提取音乐地址、图片等信息。通过断点发现网易播放列表还是能正常获取的,只是列表中的具体音乐、图片出现了问题。因为 meto 是把音乐的 url 指向自己的服务地址,然后通过参数获取的最终音乐,所以我通过参数拼凑出最终的网易云音乐地址,自此问题基本解决。只针对网易播放列表,图片只能使用一张固定的(因为图片的具体规律不知道 O (∩_∩) O~)。

# 解决方法

到 themes\shoka\source\js\_app 目录下打开 player.js 文件,替换成如下代码。

var NOWPLAYING = null
const isMobile = /mobile/i.test(window.navigator.userAgent);
const mediaPlayer = function (t, config) {
    var option = {
        type: 'audio',
        mode: 'random',
        btns: ['play-pause', 'music'],
        controls: ['mode', 'backward', 'play-pause', 'forward', 'volume'],
        events: {
            "play-pause": function (event) {
                if (source.paused) {
                    t.player.play()
                } else {
                    t.player.pause()
                }
            },
            "music": function (event) {
                if (info.el.hasClass('show')) {
                    info.hide()
                } else {
                    info.el.addClass('show');
                    playlist.scroll().title()
                }
            }
        }
    }, utils = {
        random: function (len) {
            return Math.floor((Math.random() * len))
        },
        parse: function (link) {
            var result = [];
            [
                ['music.163.com.*song.*id=(\\d+)', 'netease', 'song'],
                ['music.163.com.*album.*id=(\\d+)', 'netease', 'album'],
                ['music.163.com.*artist.*id=(\\d+)', 'netease', 'artist'],
                ['music.163.com.*playlist.*id=(\\d+)', 'netease', 'playlist'],
                ['music.163.com.*discover/toplist.*id=(\\d+)', 'netease', 'playlist'],
                ['y.qq.com.*song/(\\w+).html', 'tencent', 'song'],
                ['y.qq.com.*album/(\\w+).html', 'tencent', 'album'],
                ['y.qq.com.*singer/(\\w+).html', 'tencent', 'artist'],
                ['y.qq.com.*playsquare/(\\w+).html', 'tencent', 'playlist'],
                ['y.qq.com.*playlist/(\\w+).html', 'tencent', 'playlist'],
                ['xiami.com.*song/(\\w+)', 'xiami', 'song'],
                ['xiami.com.*album/(\\w+)', 'xiami', 'album'],
                ['xiami.com.*artist/(\\w+)', 'xiami', 'artist'],
                ['xiami.com.*collect/(\\w+)', 'xiami', 'playlist'],
            ].forEach(function (rule) {
                var patt = new RegExp(rule[0])
                var res = patt.exec(link)
                if (res !== null) {
                    result = [rule[1], rule[2], res[1]]
                }
            })
            return result
        },
        fetch: function (source) {
            var list = []
            return new Promise(function (resolve, reject) {
                source.forEach(function (raw) {
                    var meta = utils.parse(raw)
                    if (meta[0]) {
                        var skey = JSON.stringify(meta)
                        var playlist = store.get(skey)
                        if (playlist) {
                            // 自己修改 - start
                            var audioInfos = JSON.parse(playlist);
                            audioInfos.forEach(function (item, i) {
                                item.company = meta[0];
                            });
                            list.push.apply(list, audioInfos);
                            resolve(list);
                            // 自己修改 - end
                        } else {
                            fetch('https://api.i-meto.com/meting/api?server=' + meta[0] + '&type=' + meta[1] + '&id=' + meta[2] + '&r=' + Math.random())
                                .then(function (response) {
                                    return response.json()
                                }).then(function (json) {
                                    store.set(skey, JSON.stringify(json))
                                    list.push.apply(list, json);
                                    resolve(list);
                                }).catch(function (ex) { })
                        }
                    } else {
                        list.push(raw);
                        resolve(list);
                    }
                })
            })
        },
        secondToTime: function (second) {
            var add0 = function (num) {
                return isNaN(num) ? '00' : (num < 10 ? '0' + num : '' + num)
            };
            var hour = Math.floor(second / 3600);
            var min = Math.floor((second - hour * 3600) / 60);
            var sec = Math.floor(second - hour * 3600 - min * 60);
            return (hour > 0 ? [hour, min, sec] : [min, sec]).map(add0).join(':');
        },
        nameMap: {
            dragStart: isMobile ? 'touchstart' : 'mousedown',
            dragMove: isMobile ? 'touchmove' : 'mousemove',
            dragEnd: isMobile ? 'touchend' : 'mouseup',
        }
    }, source = null;
    t.player = {
        _id: utils.random(999999),
        group: true,
        // 加载播放列表
        load: function (newList) {
            var d = ""
            var that = this
            if (newList && newList.length > 0) {
                if (this.options.rawList !== newList) {
                    this.options.rawList = newList;
                    playlist.clear()
                    // 获取新列表
                    //this.fetch()
                }
            } else {
                // 没有列表时,隐藏按钮
                d = "none"
                this.pause()
            }
            for (var el in buttons.el) {
                buttons.el[el].display(d)
            }
            return this
        },
        fetch: function () {
            var that = this;
            return new Promise(function (resolve, reject) {
                if (playlist.data.length > 0) {
                    resolve()
                } else {
                    if (that.options.rawList) {
                        var promises = [];
                        that.options.rawList.forEach(function (raw, index) {
                            promises.push(new Promise(function (resolve, reject) {
                                var group = index
                                var source
                                if (!raw.list) {
                                    group = 0
                                    that.group = false
                                    source = [raw]
                                } else {
                                    that.group = true
                                    source = raw.list
                                }
                                utils.fetch(source).then(function (list) {
                                    playlist.add(group, list)
                                    resolve()
                                })
                            }))
                        })
                        Promise.all(promises).then(function () {
                            resolve(true)
                        })
                    }
                }
            }).then(function (c) {
                if (c) {
                    playlist.create()
                    controller.create()
                    that.mode()
                }
            })
        },
        // 根据模式切换当前曲目 index
        mode: function () {
            var total = playlist.data.length;
            if (!total || playlist.errnum == total)
                return;
            var step = controller.step == 'next' ? 1 : -1
            var next = function () {
                var index = playlist.index + step
                if (index > total || index < 0) {
                    index = controller.step == 'next' ? 0 : total - 1;
                }
                playlist.index = index;
            }
            var random = function () {
                var p = utils.random(total)
                if (playlist.index !== p) {
                    playlist.index = p
                } else {
                    next()
                }
            }
            switch (this.options.mode) {
                case 'random':
                    random()
                    break;
                case 'order':
                    next()
                    break;
                case 'loop':
                    if (controller.step)
                        next()
                    if (playlist.index == -1)
                        random()
                    break;
            }
            this.init()
        },
        // 直接设置当前曲目 index
        switch: function (index) {
            if (typeof index == 'number'
                && index != playlist.index
                && playlist.current()
                && !playlist.current().error) {
                playlist.index = index;
                this.init()
            }
        },
        // 更新 source 为当前曲目 index
        init: function () {
            var item = playlist.current()
            if (!item || item['error']) {
                this.mode();
                return;
            }
            var playing = false;
            if (!source.paused) {
                playing = true
                this.stop()
            }
            source.attr('src', item.url);
            source.attr('title', item.name + ' - ' + item.artist);
            this.volume(store.get('_PlayerVolume') || '0.7')
            this.muted(store.get('_PlayerMuted'))
            progress.create()
            if (this.options.type == 'audio')
                preview.create()
            if (playing == true) {
                this.play()
            }
        },
        play: function () {
            NOWPLAYING && NOWPLAYING.player.pause()
            if (playlist.current().error) {
                this.mode();
                return;
            }
            var that = this
            source.play().then(function () {
                playlist.scroll()
            }).catch(function (e) { });
        },
        pause: function () {
            source.pause()
            document.title = originTitle
        },
        stop: function () {
            source.pause();
            source.currentTime = 0;
            document.title = originTitle;
        },
        seek: function (time) {
            time = Math.max(time, 0)
            time = Math.min(time, source.duration)
            if (isNaN(time)) {
                time = 0;
            }
            source.currentTime = time;
            progress.update(time / source.duration)
        },
        muted: function (status) {
            if (status == 'muted') {
                source.muted = status
                store.set('_PlayerMuted', status)
                controller.update(0)
            } else {
                store.del('_PlayerMuted')
                source.muted = false
                controller.update(source.volume)
            }
        },
        volume: function (percentage) {
            if (!isNaN(percentage)) {
                controller.update(percentage)
                store.set('_PlayerVolume', percentage)
                source.volume = percentage
            }
        },
        mini: function () {
            info.hide()
        }
    };
    var info = {
        el: null,
        create: function () {
            if (this.el)
                return;
            this.el = t.createChild('div', {
                className: 'player-info',
                innerHTML: (t.player.options.type == 'audio' ? '<div class="preview"></div>' : '') + '<div class="controller"></div><div class="playlist"></div>'
            }, 'after');
            preview.el = this.el.child(".preview");
            playlist.el = this.el.child(".playlist");
            controller.el = this.el.child(".controller");
        },
        hide: function () {
            var el = this.el
            el.addClass('hide');
            window.setTimeout(function () {
                el.removeClass('show hide')
            }, 300);
        }
    }
    var playlist = {
        el: null,
        data: [],
        index: -1,
        errnum: 0,
        add: function (group, list) {
            var that = this
            list.forEach(function (item, i) {
                item.group = group;
                item.name = item.name || item.title || 'Meida name';
                item.artist = item.artist || item.author || 'Anonymous';
                item.cover = item.cover || item.pic;
                item.type = item.type || 'normal';
                that.data.push(item);
            });
        },
        clear: function () {
            this.data = []
            this.el.innerHTML = ""
            if (this.index !== -1) {
                this.index = -1
                t.player.fetch()
            }
        },
        create: function () {
            var el = this.el
            this.data.map(function (item, index) {
                if (item.el)
                    return
                var id = 'list-' + t.player._id + '-' + item.group
                var tab = $('#' + id)
                if (!tab) {
                    tab = el.createChild('div', {
                        id: id,
                        className: t.player.group ? 'tab' : '',
                        innerHTML: '<ol></ol>',
                    })
                    if (t.player.group) {
                        tab.attr('data-title', t.player.options.rawList[item.group]['title'])
                            .attr('data-id', t.player._id)
                    }
                }
                item.el = tab.child('ol').createChild('li', {
                    title: item.name + ' - ' + item.artist,
                    innerHTML: '<span class="info"><span>' + item.name + '</span><span>' + item.artist + '</span></span>',
                    onclick: function (event) {
                        var current = event.currentTarget;
                        if (playlist.index === index && progress.el) {
                            if (source.paused) {
                                t.player.play();
                            } else {
                                t.player.seek(source.duration * progress.percent(event, current))
                            }
                            return;
                        }
                        t.player.switch(index);
                        t.player.play();
                    }
                })
                return item
            })
            tabFormat()
        },
        current: function () {
            return this.data[this.index]
        },
        scroll: function () {
            var item = this.current()
            var li = this.el.child('li.active')
            li && li.removeClass('active')
            var tab = this.el.child('.tab.active')
            tab && tab.removeClass('active')
            li = this.el.find('.nav li')[item.group]
            li && li.addClass('active')
            tab = this.el.find('.tab')[item.group]
            tab && tab.addClass('active')
            pageScroll(item.el, item.el.offsetTop)
            return this
        },
        title: function () {
            if (source.paused)
                return
            var current = this.current()
            document.title = 'Now Playing...' + current['name'] + ' - ' + current['artist'] + ' | ' + originTitle;
        },
        error: function () {
            var current = this.current()
            current.el.removeClass('current').addClass('error')
            current.error = true
            this.errnum++
        }
    }
    var lyrics = {
        el: null,
        data: null,
        index: 0,
        create: function (box) {
            var current = playlist.index
            var that = this
            var raw = playlist.current().lrc
            var callback = function (body) {
                if (current !== playlist.index)
                    return;
                that.data = that.parse(body)
                var lrc = ''
                that.data.forEach(function (line, index) {
                    lrc += '<p' + (index === 0 ? ' class="current"' : '') + '>' + line[1] + '</p>';
                })
                that.el = box.createChild('div', {
                    className: 'inner',
                    innerHTML: lrc
                }, 'replace')
                that.index = 0;
            }
            if (raw && raw.startsWith('http'))
                this.fetch(raw, callback)
            else
                callback(raw)
        },
        update: function (currentTime) {
            if (!this.data)
                return
            if (this.index > this.data.length - 1 || currentTime < this.data[this.index][0] || (!this.data[this.index + 1] || currentTime >= this.data[this.index + 1][0])) {
                for (var i = 0; i < this.data.length; i++) {
                    if (currentTime >= this.data[i][0] && (!this.data[i + 1] || currentTime < this.data[i + 1][0])) {
                        this.index = i;
                        var y = -(this.index - 1);
                        this.el.style.transform = 'translateY(' + y + 'rem)';
                        this.el.style.webkitTransform = 'translateY(' + y + 'rem)';
                        this.el.getElementsByClassName('current')[0].removeClass('current');
                        this.el.getElementsByTagName('p')[i].addClass('current');
                    }
                }
            }
        },
        parse: function (lrc_s) {
            if (lrc_s) {
                lrc_s = lrc_s.replace(/([^\]^\n])\[/g, function (match, p1) { return p1 + '\n[' });
                const lyric = lrc_s.split('\n');
                var lrc = [];
                const lyricLen = lyric.length;
                for (var i = 0; i < lyricLen; i++) {
                    // match lrc time
                    const lrcTimes = lyric[i].match(/\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g);
                    // match lrc text
                    const lrcText = lyric[i]
                        .replace(/.*\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/g, '')
                        .replace(/<(\d{2}):(\d{2})(\.(\d{2,3}))?>/g, '')
                        .replace(/^\s+|\s+$/g, '');
                    if (lrcTimes) {
                        // handle multiple time tag
                        const timeLen = lrcTimes.length;
                        for (var j = 0; j < timeLen; j++) {
                            const oneTime = /\[(\d{2}):(\d{2})(\.(\d{2,3}))?]/.exec(lrcTimes[j]);
                            const min2sec = oneTime[1] * 60;
                            const sec2sec = parseInt(oneTime[2]);
                            const msec2sec = oneTime[4] ? parseInt(oneTime[4]) / ((oneTime[4] + '').length === 2 ? 100 : 1000) : 0;
                            const lrcTime = min2sec + sec2sec + msec2sec;
                            lrc.push([lrcTime, lrcText]);
                        }
                    }
                }
                // sort by time
                lrc = lrc.filter(function (item) { return item[1] });
                lrc.sort(function (a, b) { return a[0] - b[0] });
                return lrc;
            } else {
                return [];
            }
        },
        fetch: function (url, callback) {
            fetch(url)
                .then(function (response) {
                    return response.text()
                }).then(function (body) {
                    callback(body)
                }).catch(function (ex) { })
        }
    }
    var preview = {
        el: null,
        create: function () {
            var current = playlist.current()
            this.el.innerHTML = '<div class="cover"><div class="disc"><img src="' + (current.cover) + '" class="blur" /></div></div>'
                + '<div class="info"><h4 class="title">' + current.name + '</h4><span>' + current.artist + '</span>'
                + '<div class="lrc"></div></div>'
            this.el.child('.cover').addEventListener('click', t.player.options.events['play-pause'])
            lyrics.create(this.el.child('.lrc'))
        }
    }
    var progress = {
        el: null,
        bar: null,
        create: function () {
            var current = playlist.current().el
            if (current) {
                if (this.el) {
                    this.el.parentNode.removeClass('current')
                        .removeEventListener(utils.nameMap.dragStart, this.drag)
                    this.el.remove()
                }
                this.el = current.createChild('div', {
                    className: 'progress'
                })
                this.el.attr('data-dtime', utils.secondToTime(0))
                this.bar = this.el.createChild('div', {
                    className: 'bar',
                })
                current.addClass('current')
                current.addEventListener(utils.nameMap.dragStart, this.drag);
                playlist.scroll()
            }
        },
        update: function (percent) {
            this.bar.width(Math.floor(percent * 100) + '%')
            this.el.attr('data-ptime', utils.secondToTime(percent * source.duration))
        },
        seeking: function (type) {
            if (type)
                this.el.addClass('seeking')
            else
                this.el.removeClass('seeking')
        },
        percent: function (e, el) {
            var percentage = ((e.clientX || e.changedTouches[0].clientX) - el.left()) / el.width();
            percentage = Math.max(percentage, 0);
            return Math.min(percentage, 1)
        },
        drag: function (e) {
            e.preventDefault()
            var current = playlist.current().el
            var thumbMove = function (e) {
                e.preventDefault()
                var percentage = progress.percent(e, current)
                progress.update(percentage)
                lyrics.update(percentage * source.duration);
            };
            var thumbUp = function (e) {
                e.preventDefault()
                current.removeEventListener(utils.nameMap.dragEnd, thumbUp)
                current.removeEventListener(utils.nameMap.dragMove, thumbMove)
                var percentage = progress.percent(e, current)
                progress.update(percentage)
                t.player.seek(percentage * source.duration)
                source.disableTimeupdate = false
                progress.seeking(false)
            };
            source.disableTimeupdate = true
            progress.seeking(true)
            current.addEventListener(utils.nameMap.dragMove, thumbMove)
            current.addEventListener(utils.nameMap.dragEnd, thumbUp)
        }
    }
    var controller = {
        el: null,
        btns: {},
        step: 'next',
        create: function () {
            if (!t.player.options.controls)
                return
            var that = this
            t.player.options.controls.forEach(function (item) {
                if (that.btns[item])
                    return;
                var opt = {
                    onclick: function (event) {
                        that.events[item] ? that.events[item](event) : t.player.options.events[item](event)
                    }
                }
                switch (item) {
                    case 'volume':
                        opt.className = ' ' + (source.muted ? 'off' : 'on')
                        opt.innerHTML = '<div class="bar"></div>'
                        opt['on' + utils.nameMap.dragStart] = that.events['volume']
                        opt.onclick = null
                        break;
                    case 'mode':
                        opt.className = ' ' + t.player.options.mode
                        break;
                    default:
                        opt.className = ''
                        break;
                }
                opt.className = item + opt.className + ' btn'
                that.btns[item] = that.el.createChild('div', opt)
            })
            that.btns['volume'].bar = that.btns['volume'].child('.bar')
        },
        events: {
            mode: function (e) {
                switch (t.player.options.mode) {
                    case 'loop':
                        t.player.options.mode = 'random'
                        break;
                    case 'random':
                        t.player.options.mode = 'order'
                        break;
                    default:
                        t.player.options.mode = 'loop'
                }
                controller.btns['mode'].className = 'mode ' + t.player.options.mode + ' btn'
                store.set('_PlayerMode', t.player.options.mode)
            },
            volume: function (e) {
                e.preventDefault()
                var current = e.currentTarget
                var drag = false
                var thumbMove = function (e) {
                    e.preventDefault()
                    t.player.volume(controller.percent(e, current))
                    drag = true
                };
                var thumbUp = function (e) {
                    e.preventDefault()
                    current.removeEventListener(utils.nameMap.dragEnd, thumbUp)
                    current.removeEventListener(utils.nameMap.dragMove, thumbMove)
                    if (drag) {
                        t.player.muted()
                        t.player.volume(controller.percent(e, current))
                    } else {
                        if (source.muted) {
                            t.player.muted()
                            t.player.volume(source.volume)
                        } else {
                            t.player.muted('muted')
                            controller.update(0)
                        }
                    }
                };
                current.addEventListener(utils.nameMap.dragMove, thumbMove)
                current.addEventListener(utils.nameMap.dragEnd, thumbUp)
            },
            backward: function (e) {
                controller.step = 'prev'
                t.player.mode()
            },
            forward: function (e) {
                controller.step = 'next'
                t.player.mode()
            },
        },
        update: function (percent) {
            controller.btns['volume'].className = 'volume ' + (!source.muted && percent > 0 ? 'on' : 'off') + ' btn'
            controller.btns['volume'].bar.width(Math.floor(percent * 100) + '%')
        },
        percent: function (e, el) {
            var percentage = ((e.clientX || e.changedTouches[0].clientX) - el.left()) / el.width();
            percentage = Math.max(percentage, 0);
            return Math.min(percentage, 1);
        }
    }
    var events = {
        onerror: function () {
            // 自己修改 - start
            var item = playlist.current();
            if (!item.repair && item.company && item.company == "netease") {
                var id = item.url.substring(item.url.indexOf("id=") + 3, item.url.indexOf("&auth="));
                item.url = "https://music.163.com/song/media/outer/url?id=" + id; // 修正的网易云 url
                item.pic = "https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200"; // 使用网易云上固定的一张封面
                item.cover = item.pic;
                item.repair = true; // 已修正
                t.player.init(); // 重新播放
            } else {
                playlist.error()
                t.player.mode()
            }
            // 自己修改 - end
        },
        ondurationchange: function () {
            if (source.duration !== 1) {
                progress.el.attr('data-dtime', utils.secondToTime(source.duration))
            }
        },
        onloadedmetadata: function () {
            t.player.seek(0)
            progress.el.attr('data-dtime', utils.secondToTime(source.duration))
        },
        onplay: function () {
            t.parentNode.addClass('playing')
            showtip(this.attr('title'))
            NOWPLAYING = t
        },
        onpause: function () {
            t.parentNode.removeClass('playing')
            NOWPLAYING = null
        },
        ontimeupdate: function () {
            if (!this.disableTimeupdate) {
                progress.update(this.currentTime / this.duration)
                lyrics.update(this.currentTime)
            }
        },
        onended: function (argument) {
            t.player.mode()
            t.player.play()
        }
    }
    var buttons = {
        el: {},
        create: function () {
            if (!t.player.options.btns)
                return
            var that = this
            t.player.options.btns.forEach(function (item) {
                if (that.el[item])
                    return;
                that.el[item] = t.createChild('div', {
                    className: item + ' btn',
                    onclick: function (event) {
                        t.player.fetch().then(function () {
                            t.player.options.events[item](event)
                        })
                    }
                });
            });
        }
    }
    var init = function (config) {
        if (t.player.created)
            return;
        t.player.options = Object.assign(option, config);
        t.player.options.mode = store.get('_PlayerMode') || t.player.options.mode
        // 初始化 button、controls 以及 click 事件
        buttons.create()
        // 初始化 audio or video
        source = t.createChild(t.player.options.type, events);
        // 初始化播放列表、预览、控件按钮等
        info.create();
        t.parentNode.addClass(t.player.options.type)
        t.player.created = true;
    }
    init(config)
    return t;
}
\ No newline at end of file diff --git a/2022/09/27/nginx负载均衡配置/index.html b/2022/09/27/nginx负载均衡配置/index.html index 63f0f15a0..460978f90 100644 --- a/2022/09/27/nginx负载均衡配置/index.html +++ b/2022/09/27/nginx负载均衡配置/index.html @@ -1 +1 @@ -nginx 负载均衡配置 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# nginx 负载均衡配置

  1. 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

upstream my_server {
	server 192.168.0.2:8080;
	server 192.168.0.3:8080;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. weight 权重策略

weight 代表权重,默认为 1,权重越高被分配的客户端越多,指定轮询几率。weight 和访问比率成正比,用于后端服务器性能不均的情况。

upstream my_server {
	server 192.168.0.2:8080 weight=1;
	server 192.168.0.3:8080 weight=2;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

upstream my_server {
	ip_hash;
	server 192.168.0.2:8080;
	server 192.168.0.3:8080;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. fair (第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream my_server {
	server 192.168.0.2:8080;
	server 192.168.0.3:8080;
	fair;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. 动静分离

把静态的资源,比如图片,css,js 等先加载到 Nginx 的服务器里。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +nginx 负载均衡配置 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# nginx 负载均衡配置

  1. 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

upstream my_server {
	server 192.168.0.2:8080;
	server 192.168.0.3:8080;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. weight 权重策略

weight 代表权重,默认为 1,权重越高被分配的客户端越多,指定轮询几率。weight 和访问比率成正比,用于后端服务器性能不均的情况。

upstream my_server {
	server 192.168.0.2:8080 weight=1;
	server 192.168.0.3:8080 weight=2;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。

upstream my_server {
	ip_hash;
	server 192.168.0.2:8080;
	server 192.168.0.3:8080;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. fair (第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream my_server {
	server 192.168.0.2:8080;
	server 192.168.0.3:8080;
	fair;
}
server {
	listen 80;
	server_name 192.168.0.1;
	# Path to the root of your installation
	location / {
		proxy_pass http://my_server;
	}
	
}
  1. 动静分离

把静态的资源,比如图片,css,js 等先加载到 Nginx 的服务器里。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/09/28/深深的挫败和无助感/index.html b/2022/09/28/深深的挫败和无助感/index.html index eb67ac5be..97310a745 100644 --- a/2022/09/28/深深的挫败和无助感/index.html +++ b/2022/09/28/深深的挫败和无助感/index.html @@ -1 +1 @@ -深深的挫败和无助感 - 心情 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +深深的挫败和无助感 - 心情 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/2022/10/06/Nginx配置iframe访问/index.html b/2022/10/06/Nginx配置iframe访问/index.html index 8ab423c77..77d787520 100644 --- a/2022/10/06/Nginx配置iframe访问/index.html +++ b/2022/10/06/Nginx配置iframe访问/index.html @@ -1 +1 @@ -Nginx 配置 iframe 访问 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# X-Frame-Options 响应头配置详解

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在,或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
X-Frame-Options 三个参数:

1、 DENY

表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

2、SAMEORIGIN

表示该页面可以在相同域名页面的 frame 中展示。

3、ALLOW-FROM uri

表示该页面可以在指定来源的 frame 中展示。

4、ALLOWALL

表示该页面可以在任何来源的 frame 中展示。

换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。正常情况下我们通常使用 SAMEORIGIN 参数。

# Apache 配置

需要把下面这行添加到'site' 的配置中

Header always append X-Frame-Options SAMEORIGIN

# Nginx 配置

需要添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置项中,个人来讲喜欢配置在‘server’ 中

正常情况下都是使用 SAMEORIGIN 参数,允许同域嵌套
add_header X-Frame-Options SAMEORIGIN;

允许单个域名 iframe 嵌套
add_header X-Frame-Options ALLOW-FROM http://xxx.com/;

允许多个域名 iframe 嵌套,注意这里是用逗号分隔
add_header X-Frame-Options "ALLOW-FROM http://xxx.com/,https://xxx.com/";

允许任何域名 iframe 嵌套
add_header X-Frame-Options ALLOWALL;

# Tomcat 配置

在‘conf/web.xml’填加以下配置

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <init-param>
            <param-name>antiClickJackingOption</param-name>
            <param-value>SAMEORIGIN</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </filter>
<filter-mapping>
        <filter-name>httpHeaderSecurity</filter-name>
        <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

# IIS 配置

添加下面的配置到 ‘Web.config’文件中

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>
</system.webServer>
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +Nginx 配置 iframe 访问 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# X-Frame-Options 响应头配置详解

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在,或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
X-Frame-Options 三个参数:

1、 DENY

表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。

2、SAMEORIGIN

表示该页面可以在相同域名页面的 frame 中展示。

3、ALLOW-FROM uri

表示该页面可以在指定来源的 frame 中展示。

4、ALLOWALL

表示该页面可以在任何来源的 frame 中展示。

换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。正常情况下我们通常使用 SAMEORIGIN 参数。

# Apache 配置

需要把下面这行添加到'site' 的配置中

Header always append X-Frame-Options SAMEORIGIN

# Nginx 配置

需要添加到 ‘http’, ‘server’ 或者 ‘location’ 的配置项中,个人来讲喜欢配置在‘server’ 中

正常情况下都是使用 SAMEORIGIN 参数,允许同域嵌套
add_header X-Frame-Options SAMEORIGIN;

允许单个域名 iframe 嵌套
add_header X-Frame-Options ALLOW-FROM http://xxx.com/;

允许多个域名 iframe 嵌套,注意这里是用逗号分隔
add_header X-Frame-Options "ALLOW-FROM http://xxx.com/,https://xxx.com/";

允许任何域名 iframe 嵌套
add_header X-Frame-Options ALLOWALL;

# Tomcat 配置

在‘conf/web.xml’填加以下配置

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <init-param>
            <param-name>antiClickJackingOption</param-name>
            <param-value>SAMEORIGIN</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </filter>
<filter-mapping>
        <filter-name>httpHeaderSecurity</filter-name>
        <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

# IIS 配置

添加下面的配置到 ‘Web.config’文件中

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="SAMEORIGIN" />
    </customHeaders>
  </httpProtocol>
</system.webServer>
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/10/11/svn库转git库/index.html b/2022/10/11/svn库转git库/index.html index 0fa7bb1e8..d701345a3 100644 --- a/2022/10/11/svn库转git库/index.html +++ b/2022/10/11/svn库转git库/index.html @@ -1 +1 @@ -svn 库转 git 库 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 前期准备

首先安装好 svn 和 git 工具。

# svn 转 git

1、 到 svn 项目目录右键选中 gitbash 打开窗口,执行获取用户并映射成 git 样式账号命令如下:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

然后会在目录下生成文件 users.txt 样式如:zhansan = 张三 zhansan@xxx.com

2、新建个文件夹,将生成的 users.txt 放入新建的文件夹,然后在新建的文件夹中右键选中 gitbash 弹出窗口后执行下面命令(https://svn_project_url/ 为 svn 库的 url),拉取 svn 代码到本地新建文件夹中。
git svn clone https://svn_project_url/ --no-metadata --no-minimize-url --authors-file=users.txt

  • 期间可能会弹出 svn 的账户密码验证窗口,正确输入即可。

# 推送项目到 git 库

1、在 gitbash 窗口 cd 到 git 项目文件夹中执行以下命令把 git 仓库地址加入到 remote 中(https://git_project_url/ 为 git 库的 url)。
git remote add origin https://git_project_url/

2、push 项目到 git 库中。
git push origin master

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +svn 库转 git 库 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 前期准备

首先安装好 svn 和 git 工具。

# svn 转 git

1、 到 svn 项目目录右键选中 gitbash 打开窗口,执行获取用户并映射成 git 样式账号命令如下:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

然后会在目录下生成文件 users.txt 样式如:zhansan = 张三 zhansan@xxx.com

2、新建个文件夹,将生成的 users.txt 放入新建的文件夹,然后在新建的文件夹中右键选中 gitbash 弹出窗口后执行下面命令(https://svn_project_url/ 为 svn 库的 url),拉取 svn 代码到本地新建文件夹中。
git svn clone https://svn_project_url/ --no-metadata --no-minimize-url --authors-file=users.txt

  • 期间可能会弹出 svn 的账户密码验证窗口,正确输入即可。

# 推送项目到 git 库

1、在 gitbash 窗口 cd 到 git 项目文件夹中执行以下命令把 git 仓库地址加入到 remote 中(https://git_project_url/ 为 git 库的 url)。
git remote add origin https://git_project_url/

2、push 项目到 git 库中。
git push origin master

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/10/12/使用picgo上传图片到chevereto/index.html b/2022/10/12/使用picgo上传图片到chevereto/index.html index 07f702793..44607da72 100644 --- a/2022/10/12/使用picgo上传图片到chevereto/index.html +++ b/2022/10/12/使用picgo上传图片到chevereto/index.html @@ -1 +1 @@ -使用 PicGo 上传图片到 chevereto - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 简介

PicGo 是一款开源的图床管理工具,十分流行。

PicGo 官方指南:PicGo | PicGo

# 配置

  1. 安装插件(需要先安装 NodeJS)

  2. 图床配置
    url 后缀必须用红线圈中的部分,key 在 chevereto 登陆后 api 配置中查找

\ No newline at end of file +使用 PicGo 上传图片到 chevereto - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 简介

PicGo 是一款开源的图床管理工具,十分流行。

PicGo 官方指南:PicGo | PicGo

# 配置

  1. 安装插件(需要先安装 NodeJS)

  2. 图床配置
    url 后缀必须用红线圈中的部分,key 在 chevereto 登陆后 api 配置中查找

\ No newline at end of file diff --git a/2022/10/14/nginx允许跨域获取cookies方法/index.html b/2022/10/14/nginx允许跨域获取cookies方法/index.html index 35122a761..0ccef315f 100644 --- a/2022/10/14/nginx允许跨域获取cookies方法/index.html +++ b/2022/10/14/nginx允许跨域获取cookies方法/index.html @@ -1 +1 @@ -nginx 允许跨域获取 cookie 的方法 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 使用场景

在 A 域名的页面向 B 域名提交数据时需要代入 B 域名的 cookie,否则 B 域名会跳转到登陆页面。解决方式需要使用到 nginx 反向代理,配置如下:

server {
	listen port ssl http2;
	server_name xxx.com;
	ssl_certificate_key /xxx.key;
	ssl_certificate /xxx.pem;
	proxy_cookie_path ~(.*) "$1; SameSite=None; secure; httponly";
	location / {
		#允许镶套的方式(可以同域镶套、指定域名镶套或者所有域名镶套)
		add_header X-Frame-Options ALLOWALL; #允许被所有域名镶套
		proxy_pass http://xxx;
	}
}
\ No newline at end of file +nginx 允许跨域获取 cookie 的方法 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 使用场景

在 A 域名的页面向 B 域名提交数据时需要代入 B 域名的 cookie,否则 B 域名会跳转到登陆页面。解决方式需要使用到 nginx 反向代理,配置如下:

server {
	listen port ssl http2;
	server_name xxx.com;
	ssl_certificate_key /xxx.key;
	ssl_certificate /xxx.pem;
	proxy_cookie_path ~(.*) "$1; SameSite=None; secure; httponly";
	location / {
		#允许镶套的方式(可以同域镶套、指定域名镶套或者所有域名镶套)
		add_header X-Frame-Options ALLOWALL; #允许被所有域名镶套
		proxy_pass http://xxx;
	}
}
\ No newline at end of file diff --git a/2022/10/17/redis主从基础配置记录/index.html b/2022/10/17/redis主从基础配置记录/index.html index 7336a783f..6d5f270f6 100644 --- a/2022/10/17/redis主从基础配置记录/index.html +++ b/2022/10/17/redis主从基础配置记录/index.html @@ -1 +1 @@ -redis 主从基础配置 - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 主服务

  1. 基础配置
port 6379
requirepass 123456(密码,建议不设置)
vm-enabled no (虚拟内存,内存够的情况下可以不使用)
maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入)
bind 127.0.0.1 (注释掉,否则不能外部连接)
rdbchecksum no(持久化数据检查)
list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb)
list-compress-depth 20(quicklist的两端多少个node不压缩,0为全部不压缩)
sysctl vm.overcommit_memory=1 (立即生效)
修改/etc/sysctl.conf添加vm.overcommit_memory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何。Redis的RDB持久化实现是folk一个子进程,然后让子进程将内存镜像dump到RDB文件中。理论上来说是需要跟父进程一样的内存空间,但是由于linux很早就支持的copy-on-write技术,所以实际上并不需要这么多的物理内存的。)
  1. 禁用透明大页(影响性能)
需要sudo su 切换到root身份(sudo 没用)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
修改/etc/init.d/redis-server,加入/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled
  1. 修复 TCP 警告
sysctl net.core.somaxconn=1024(立即生效)
修改/etc/sysctl.conf添加net.core.somaxconn=1024
  1. 客户端缓冲区限制
客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
可以三种不同客户端的方式进行设置:
normal ->  正常客户端
slave  -> slave 和 MONITOR 客户端
pubsub ->  至少订阅了一个 pubsub channel 或 pattern 的客户端
语法 :
client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开。如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
把硬限制和软限制都设置为 0 来禁用该特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 5gb 512mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
  1. 持久化配置
---关闭RDB持久化---
save ""
默认配置如下:
save 900 1 #900 秒内有 1 次更新就持久化
save 300 10 #300 秒内有 10 次更新就持久化
save 60 10000 #60 秒内有 10000 次更新就持久化
---关闭RDB持久化---
主从同步支持两种策略,即disk和socket方式。
新的slave端和重连的salve端不允许去继续同步进程,这被称之为“完全同步”。
一个RDB文件从master端传到slave端,分为两种情况:
1、支持disk:master端将RDB file写到disk,稍后再传送到slave端;
2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。
repl-diskless-sync no 默认不使用diskless同步方式
repl-diskless-sync-delay 30 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒
repl-ping-slave-period 60 slave端向server端发送pings的时间区间设置,默认为10秒
repl-timeout 3600 设置超时时间
repl-disable-tcp-nodelay no 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。
repl-backlog-size 1mb 设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。
backlog设置的越大,slave可以失连的时间就越长。
repl-backlog-ttl 3600 如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
slave-priority 100 slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
min-slaves-to-write 3
min-slaves-max-lag 10 设置当一个master端的可用slave少于N个,延迟时间大于M秒时,不接收写操作。

# 从服务

基本配置同主服务一致
slaveof 127.0.0.1 6379(主redis的ip和端口)
masterauth 123456 (主redis的密码)
可以通过slaveof no one命令将Slaver升级为Maste
bgsave (持久化命令,在redis-cli中执行,默认创建dump.rdb文件,路径为 /var/lib/redis/dump.rdb。可通过find / -name dump.rd查找)

# 相关命令

看状态
sudo /etc/init.d/redis-server status
看端口
netstat -nlt|grep 6379
外部连接
sudo vim /etc/redis/redis.conf把protected-mode改为no,把bind ip注释掉
重启
sudo server redis-server restart
查看内存
free -m
批量删除指定key
redis-cli -n 6 scan 0 match *2020-06-12 count 10000| xargs redis-cli -n 6 del
大量删除key后快速释放被占用的内存
memory purge

# 问题解决

写入问题
redis-cli config set stop-writes-on-bgsave-error no
sudo vim /etc/redis/redis.conf把stop-writes-on-bgsave-error改为no
修改系统 sudo vim /etc/sysctl.conf加入vm.overcommit_memory=1
sudo sysctl vm.overcommit_memory=1
\ No newline at end of file +redis 主从基础配置 - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 主服务

  1. 基础配置
port 6379
requirepass 123456(密码,建议不设置)
vm-enabled no (虚拟内存,内存够的情况下可以不使用)
maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入)
bind 127.0.0.1 (注释掉,否则不能外部连接)
rdbchecksum no(持久化数据检查)
list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb)
list-compress-depth 20(quicklist的两端多少个node不压缩,0为全部不压缩)
sysctl vm.overcommit_memory=1 (立即生效)
修改/etc/sysctl.conf添加vm.overcommit_memory=1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何。Redis的RDB持久化实现是folk一个子进程,然后让子进程将内存镜像dump到RDB文件中。理论上来说是需要跟父进程一样的内存空间,但是由于linux很早就支持的copy-on-write技术,所以实际上并不需要这么多的物理内存的。)
  1. 禁用透明大页(影响性能)
需要sudo su 切换到root身份(sudo 没用)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
修改/etc/init.d/redis-server,加入/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled
  1. 修复 TCP 警告
sysctl net.core.somaxconn=1024(立即生效)
修改/etc/sysctl.conf添加net.core.somaxconn=1024
  1. 客户端缓冲区限制
客户端的输出缓冲区的限制,因为某种原因客户端从服务器读取数据的速度不够快,可用于强制断开连接(一个常见的原因是一个发布 / 订阅客户端消费消息的速度无法赶上生产它们的速度)。
可以三种不同客户端的方式进行设置:
normal ->  正常客户端
slave  -> slave 和 MONITOR 客户端
pubsub ->  至少订阅了一个 pubsub channel 或 pattern 的客户端
语法 :
client-output-buffer-limit <class><hard limit> <soft limit> <soft seconds>
一旦达到硬限制客户端会立即断开,或者达到软限制并保持达成的指定秒数(连续)。
例如,如果硬限制为 32 兆字节和软限制为 16 兆字节 /10 秒,客户端将会立即断开。如果输出缓冲区的大小达到 32 兆字节,客户端达到 16 兆字节和连续超过了限制 10 秒,也将断开连接。默认 normal 客户端不做限制,因为他们在一个请求后未要求时(以推的方式)不接收数据,
只有异步客户端可能会出现请求数据的速度比它可以读取的速度快的场景。
把硬限制和软限制都设置为 0 来禁用该特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 5gb 512mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
  1. 持久化配置
---关闭RDB持久化---
save ""
默认配置如下:
save 900 1 #900 秒内有 1 次更新就持久化
save 300 10 #300 秒内有 10 次更新就持久化
save 60 10000 #60 秒内有 10000 次更新就持久化
---关闭RDB持久化---
主从同步支持两种策略,即disk和socket方式。
新的slave端和重连的salve端不允许去继续同步进程,这被称之为“完全同步”。
一个RDB文件从master端传到slave端,分为两种情况:
1、支持disk:master端将RDB file写到disk,稍后再传送到slave端;
2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。
repl-diskless-sync no 默认不使用diskless同步方式
repl-diskless-sync-delay 30 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒
repl-ping-slave-period 60 slave端向server端发送pings的时间区间设置,默认为10秒
repl-timeout 3600 设置超时时间
repl-disable-tcp-nodelay no 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。
repl-backlog-size 1mb 设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。
backlog设置的越大,slave可以失连的时间就越长。
repl-backlog-ttl 3600 如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
slave-priority 100 slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
min-slaves-to-write 3
min-slaves-max-lag 10 设置当一个master端的可用slave少于N个,延迟时间大于M秒时,不接收写操作。

# 从服务

基本配置同主服务一致
slaveof 127.0.0.1 6379(主redis的ip和端口)
masterauth 123456 (主redis的密码)
可以通过slaveof no one命令将Slaver升级为Maste
bgsave (持久化命令,在redis-cli中执行,默认创建dump.rdb文件,路径为 /var/lib/redis/dump.rdb。可通过find / -name dump.rd查找)

# 相关命令

看状态
sudo /etc/init.d/redis-server status
看端口
netstat -nlt|grep 6379
外部连接
sudo vim /etc/redis/redis.conf把protected-mode改为no,把bind ip注释掉
重启
sudo server redis-server restart
查看内存
free -m
批量删除指定key
redis-cli -n 6 scan 0 match *2020-06-12 count 10000| xargs redis-cli -n 6 del
大量删除key后快速释放被占用的内存
memory purge

# 问题解决

写入问题
redis-cli config set stop-writes-on-bgsave-error no
sudo vim /etc/redis/redis.conf把stop-writes-on-bgsave-error改为no
修改系统 sudo vim /etc/sysctl.conf加入vm.overcommit_memory=1
sudo sysctl vm.overcommit_memory=1
\ No newline at end of file diff --git a/2022/10/18/搭建nagios监控/index.html b/2022/10/18/搭建nagios监控/index.html index 4e3a5f09a..451f3f30e 100644 --- a/2022/10/18/搭建nagios监控/index.html +++ b/2022/10/18/搭建nagios监控/index.html @@ -1 +1 @@ -搭建 nagios 监控 - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 监控端服务安装与配置

  1. nagios 需要安装主程序 core 和 nrpe(nagios 和各被监控主机都必须安装)。如需使用自研前端可通过安装 ndoutils (用于把 nagios 监控信息写入数据库) 和 mysql 实现。具体安装见官网
  2. nagios 默认监控命令脚本放置在 libexec 中,自定义脚本也放到此处
  3. etc/objects/commands.cfg 用于保存 nagios 默认监控命令
  4. etc/nrpe.cfg 文件中需要添加用于被监控执行命令项(各被监控主机中都需要添加)
  5. etc/objects/hosts 目录下配置需要被监控的主机信息
  6. etc/objects/servers 目录下配置需要在被监控主机上执行的监控命令(第 4 项中的命令)

# 被监控端服务安装与配置

  1. 被监控端需要安装 nrpe
  2. 被监控端需要把监控端的命令写入到 nrpe 的配置文件中
  3. 被监控端需要把命令执行脚本放入 libexec 目录中
  4. 被监控端自动安装脚本(可借鉴)
1、请先修改脚本中的服务端IP。
2、如被监控端不支持let计算命令请执行sudo dpkg-reconfigure dash命令,弹出选择窗口后选择no。
3、需要在脚本同目录下创建CentOS、Ubuntu、sh和conf目录,目录下分别放置nrpe的tar安装包、监控脚本和nrpe配置文件。
#!/bin/bash
#服务端 ip
SERVER_IP=10.10.10.121
#安装目录
INSTALL_HOME=`pwd`
#安装 ubuntu 版本
INSTALL_UBUNTU()
{
	sudo apt-get update
	sudo apt-get install -y autoconf automake gcc libc6 libmcrypt-dev make libssl-dev wget openssl
	
	cd /tmp
	#wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz
	cp $INSTALL_HOME/Ubuntu/nrpe.tar.gz ./
	tar xzf nrpe.tar.gz
	cd /tmp/nrpe-nrpe-4.0.3/
	sudo ./configure --enable-command-args --with-ssl-lib=/usr/lib/x86_64-linux-gnu/
	sudo make all
	sudo make install-groups-users
	sudo make install
	sudo make install-config
	sudo sh -c "echo >> /etc/services"
	sudo sh -c "sudo echo '# Nagios services' >> /etc/services"
	sudo sh -c "sudo echo 'nrpe    5666/tcp' >> /etc/services"
	
	#判断系统是高版本还是低版本
	VERSION=`lsb_release -r --short`
	IS_LOW_VERSION=`echo "$VERSION < 15" | bc`
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		sudo make install-init
	else
		#高版本
		sudo make install-init
		sudo systemctl enable nrpe.service
	fi
	
	sudo mkdir -p /etc/ufw/applications.d
	sudo sh -c "echo '[NRPE]' > /etc/ufw/applications.d/nagios"
	sudo sh -c "echo 'title=Nagios Remote Plugin Executor' >> /etc/ufw/applications.d/nagios"
	sudo sh -c "echo 'description=Allows remote execution of Nagios plugins' >> /etc/ufw/applications.d/nagios"
	sudo sh -c "echo 'ports=5666/tcp' >> /etc/ufw/applications.d/nagios"
	sudo ufw allow NRPE
	sudo ufw reload
	
	sudo sh -c "sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg"
	
	cd $INSTALL_HOME
	sudo cp ./sh/* /usr/local/nagios/libexec/
	sudo chmod +xr /usr/local/nagios/libexec/*
	
	sudo sh -c "echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	NETWORK_INDEX=1
	for NETWORK_NAME in `cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do
			if [ $NETWORK_NAME != 'lo' ]; then
					sudo sh -c "echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' >> /usr/local/nagios/etc/nrpe.cfg"
					NETWORK_INDEX=`expr $NETWORK_INDEX + 1 `
			fi
	done
	
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		sudo start nrpe
	else
		#高版本
		sudo systemctl start nrpe.service
	fi
}
#安装 centos 版本
INSTALL_CENTOS()
{
	yum install -y gcc glibc glibc-common openssl openssl-devel perl wget
	cd /tmp
	#wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz
	cp $INSTALL_HOME/CentOS/nrpe.tar.gz ./
	tar xzf nrpe.tar.gz
	cd /tmp/nrpe-nrpe-4.0.3/
	./configure --enable-command-args
	make all
	make install-groups-users
	make install
	make install-config
	echo >> /etc/services
	echo '# Nagios services' >> /etc/services
	echo 'nrpe    5666/tcp' >> /etc/services
	
	#判断系统是高版本还是低版本
	VERSION=`rpm -q centos-release|cut -d- -f3`
	#安装 bc 命令
	yum -y install bc
	IS_LOW_VERSION=`echo "$VERSION < 7" | bc`
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		make install-init
		
		iptables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
		service iptables save
		ip6tables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
		service ip6tables save
	else
		#高版本
		make install-init
		systemctl enable nrpe.service
		
		firewall-cmd --zone=public --add-port=5666/tcp
		firewall-cmd --zone=public --add-port=5666/tcp --permanent
	fi
	
	sudo sh -c "sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg"
	
	cd $INSTALL_HOME
	sudo cp ./sh/* /usr/local/nagios/libexec/
	sudo chmod +xr /usr/local/nagios/libexec/*
	
	sudo sh -c "echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	NETWORK_INDEX=1
	for NETWORK_NAME in `cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do
			if [ $NETWORK_NAME != 'lo' ]; then
					sudo sh -c "echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' >> /usr/local/nagios/etc/nrpe.cfg"
					NETWORK_INDEX=`expr $NETWORK_INDEX + 1 `
			fi
	done
	
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		if [ $(echo "$VERSION < 6" | bc) -eq 1 ]; then
			service nrpe start
		else
			start nrpe
		fi
	else
		#高版本
		systemctl start nrpe.service
	fi
}
#安装其它版本
INSTALL_OTHER()
{
	echo "Not supported at the moment."
}
#根据不同系统安装不同版本
INSTALL()
{
	if grep -Eqii "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
		DISTRO='CentOS'
        PM='yum'
		INSTALL_CENTOS
    elif grep -Eqi "Red Hat Enterprise Linux Server" /etc/issue || grep -Eq "Red Hat Enterprise Linux Server" /etc/*-release; then
        DISTRO='RHEL'
        PM='yum'
		INSTALL_OTHER
    elif grep -Eqi "Aliyun" /etc/issue || grep -Eq "Aliyun" /etc/*-release; then
        DISTRO='Aliyun'
        PM='yum'
		INSTALL_OTHER
    elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
        DISTRO='Fedora'
        PM='yum'
		INSTALL_OTHER
    elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
        DISTRO='Debian'
        PM='apt'
		INSTALL_OTHER
    elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
        DISTRO='Ubuntu'
        PM='apt'
		INSTALL_UBUNTU
    elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
        DISTRO='Raspbian'
        PM='apt'
		INSTALL_OTHER
    else
        echo "unknow linux."
        exit 1
    fi
    echo $DISTRO
}
INSTALL
exit 0

# 登录

地址:http:// 服务器 IP/nagios
用户名:nagiosadmin
密码:nagiosadmin

# 常见问题

  1. 监控日志未写入 mysql(可能是 ndoutils 服务不正常导致)。采用以下脚本命令解决
#!/bin/bash
sudo rm -f /usr/local/nagios/var/ndo2db.pid
sudo rm -f /usr/local/nagios/var/ndo.sock
sudo systemctl restart ndo2db.service
sudo systemctl status ndo2db.service
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +搭建 nagios 监控 - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 监控端服务安装与配置

  1. nagios 需要安装主程序 core 和 nrpe(nagios 和各被监控主机都必须安装)。如需使用自研前端可通过安装 ndoutils (用于把 nagios 监控信息写入数据库) 和 mysql 实现。具体安装见官网
  2. nagios 默认监控命令脚本放置在 libexec 中,自定义脚本也放到此处
  3. etc/objects/commands.cfg 用于保存 nagios 默认监控命令
  4. etc/nrpe.cfg 文件中需要添加用于被监控执行命令项(各被监控主机中都需要添加)
  5. etc/objects/hosts 目录下配置需要被监控的主机信息
  6. etc/objects/servers 目录下配置需要在被监控主机上执行的监控命令(第 4 项中的命令)

# 被监控端服务安装与配置

  1. 被监控端需要安装 nrpe
  2. 被监控端需要把监控端的命令写入到 nrpe 的配置文件中
  3. 被监控端需要把命令执行脚本放入 libexec 目录中
  4. 被监控端自动安装脚本(可借鉴)
1、请先修改脚本中的服务端IP。
2、如被监控端不支持let计算命令请执行sudo dpkg-reconfigure dash命令,弹出选择窗口后选择no。
3、需要在脚本同目录下创建CentOS、Ubuntu、sh和conf目录,目录下分别放置nrpe的tar安装包、监控脚本和nrpe配置文件。
#!/bin/bash
#服务端 ip
SERVER_IP=10.10.10.121
#安装目录
INSTALL_HOME=`pwd`
#安装 ubuntu 版本
INSTALL_UBUNTU()
{
	sudo apt-get update
	sudo apt-get install -y autoconf automake gcc libc6 libmcrypt-dev make libssl-dev wget openssl
	
	cd /tmp
	#wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz
	cp $INSTALL_HOME/Ubuntu/nrpe.tar.gz ./
	tar xzf nrpe.tar.gz
	cd /tmp/nrpe-nrpe-4.0.3/
	sudo ./configure --enable-command-args --with-ssl-lib=/usr/lib/x86_64-linux-gnu/
	sudo make all
	sudo make install-groups-users
	sudo make install
	sudo make install-config
	sudo sh -c "echo >> /etc/services"
	sudo sh -c "sudo echo '# Nagios services' >> /etc/services"
	sudo sh -c "sudo echo 'nrpe    5666/tcp' >> /etc/services"
	
	#判断系统是高版本还是低版本
	VERSION=`lsb_release -r --short`
	IS_LOW_VERSION=`echo "$VERSION < 15" | bc`
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		sudo make install-init
	else
		#高版本
		sudo make install-init
		sudo systemctl enable nrpe.service
	fi
	
	sudo mkdir -p /etc/ufw/applications.d
	sudo sh -c "echo '[NRPE]' > /etc/ufw/applications.d/nagios"
	sudo sh -c "echo 'title=Nagios Remote Plugin Executor' >> /etc/ufw/applications.d/nagios"
	sudo sh -c "echo 'description=Allows remote execution of Nagios plugins' >> /etc/ufw/applications.d/nagios"
	sudo sh -c "echo 'ports=5666/tcp' >> /etc/ufw/applications.d/nagios"
	sudo ufw allow NRPE
	sudo ufw reload
	
	sudo sh -c "sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg"
	
	cd $INSTALL_HOME
	sudo cp ./sh/* /usr/local/nagios/libexec/
	sudo chmod +xr /usr/local/nagios/libexec/*
	
	sudo sh -c "echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	NETWORK_INDEX=1
	for NETWORK_NAME in `cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do
			if [ $NETWORK_NAME != 'lo' ]; then
					sudo sh -c "echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' >> /usr/local/nagios/etc/nrpe.cfg"
					NETWORK_INDEX=`expr $NETWORK_INDEX + 1 `
			fi
	done
	
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		sudo start nrpe
	else
		#高版本
		sudo systemctl start nrpe.service
	fi
}
#安装 centos 版本
INSTALL_CENTOS()
{
	yum install -y gcc glibc glibc-common openssl openssl-devel perl wget
	cd /tmp
	#wget --no-check-certificate -O nrpe.tar.gz https://github.com/NagiosEnterprises/nrpe/archive/nrpe-4.0.3.tar.gz
	cp $INSTALL_HOME/CentOS/nrpe.tar.gz ./
	tar xzf nrpe.tar.gz
	cd /tmp/nrpe-nrpe-4.0.3/
	./configure --enable-command-args
	make all
	make install-groups-users
	make install
	make install-config
	echo >> /etc/services
	echo '# Nagios services' >> /etc/services
	echo 'nrpe    5666/tcp' >> /etc/services
	
	#判断系统是高版本还是低版本
	VERSION=`rpm -q centos-release|cut -d- -f3`
	#安装 bc 命令
	yum -y install bc
	IS_LOW_VERSION=`echo "$VERSION < 7" | bc`
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		make install-init
		
		iptables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
		service iptables save
		ip6tables -I INPUT -p tcp --destination-port 5666 -j ACCEPT
		service ip6tables save
	else
		#高版本
		make install-init
		systemctl enable nrpe.service
		
		firewall-cmd --zone=public --add-port=5666/tcp
		firewall-cmd --zone=public --add-port=5666/tcp --permanent
	fi
	
	sudo sh -c "sed -i '/^allowed_hosts=/s/$/,$SERVER_IP/' /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "sed -i 's/^dont_blame_nrpe=.*/dont_blame_nrpe=1/g' /usr/local/nagios/etc/nrpe.cfg"
	
	cd $INSTALL_HOME
	sudo cp ./sh/* /usr/local/nagios/libexec/
	sudo chmod +xr /usr/local/nagios/libexec/*
	
	sudo sh -c "echo 'command[check_ping]=/usr/local/nagios/libexec/check_ping -H 127.0.0.1 -w 3000.0,80% -c 5000.0,100% -p 5' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_cpu]=/usr/local/nagios/libexec/check_cpu.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_mem]=/usr/local/nagios/libexec/check_mem.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_disk]=/usr/local/nagios/libexec/check_disk.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_my_service]=/usr/local/nagios/libexec/check_my_service.sh \$ARG1\$' >> /usr/local/nagios/etc/nrpe.cfg"
	sudo sh -c "echo 'command[check_system_info]=/usr/local/nagios/libexec/check_system_info.sh' >> /usr/local/nagios/etc/nrpe.cfg"
	NETWORK_INDEX=1
	for NETWORK_NAME in `cat /proc/net/dev | awk '{i++; if(i>2){print $1}}' | sed 's/^[\t]*//g' | sed 's/[:]*$//g'`;do
			if [ $NETWORK_NAME != 'lo' ]; then
					sudo sh -c "echo 'command[check_network$NETWORK_INDEX]=/usr/local/nagios/libexec/check_network.sh $NETWORK_NAME' >> /usr/local/nagios/etc/nrpe.cfg"
					NETWORK_INDEX=`expr $NETWORK_INDEX + 1 `
			fi
	done
	
	if [ $IS_LOW_VERSION = 1 ]; then
		#低版本
		if [ $(echo "$VERSION < 6" | bc) -eq 1 ]; then
			service nrpe start
		else
			start nrpe
		fi
	else
		#高版本
		systemctl start nrpe.service
	fi
}
#安装其它版本
INSTALL_OTHER()
{
	echo "Not supported at the moment."
}
#根据不同系统安装不同版本
INSTALL()
{
	if grep -Eqii "CentOS" /etc/issue || grep -Eq "CentOS" /etc/*-release; then
		DISTRO='CentOS'
        PM='yum'
		INSTALL_CENTOS
    elif grep -Eqi "Red Hat Enterprise Linux Server" /etc/issue || grep -Eq "Red Hat Enterprise Linux Server" /etc/*-release; then
        DISTRO='RHEL'
        PM='yum'
		INSTALL_OTHER
    elif grep -Eqi "Aliyun" /etc/issue || grep -Eq "Aliyun" /etc/*-release; then
        DISTRO='Aliyun'
        PM='yum'
		INSTALL_OTHER
    elif grep -Eqi "Fedora" /etc/issue || grep -Eq "Fedora" /etc/*-release; then
        DISTRO='Fedora'
        PM='yum'
		INSTALL_OTHER
    elif grep -Eqi "Debian" /etc/issue || grep -Eq "Debian" /etc/*-release; then
        DISTRO='Debian'
        PM='apt'
		INSTALL_OTHER
    elif grep -Eqi "Ubuntu" /etc/issue || grep -Eq "Ubuntu" /etc/*-release; then
        DISTRO='Ubuntu'
        PM='apt'
		INSTALL_UBUNTU
    elif grep -Eqi "Raspbian" /etc/issue || grep -Eq "Raspbian" /etc/*-release; then
        DISTRO='Raspbian'
        PM='apt'
		INSTALL_OTHER
    else
        echo "unknow linux."
        exit 1
    fi
    echo $DISTRO
}
INSTALL
exit 0

# 登录

地址:http:// 服务器 IP/nagios
用户名:nagiosadmin
密码:nagiosadmin

# 常见问题

  1. 监控日志未写入 mysql(可能是 ndoutils 服务不正常导致)。采用以下脚本命令解决
#!/bin/bash
sudo rm -f /usr/local/nagios/var/ndo2db.pid
sudo rm -f /usr/local/nagios/var/ndo.sock
sudo systemctl restart ndo2db.service
sudo systemctl status ndo2db.service
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/10/19/长了一岁/index.html b/2022/10/19/长了一岁/index.html index 6d0244af1..b6c41e309 100644 --- a/2022/10/19/长了一岁/index.html +++ b/2022/10/19/长了一岁/index.html @@ -1 +1 @@ -又长了一岁 - 心情 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

一年一次的总结时间又到了,这一年前半年平平无奇,后半年惊涛骇浪。中年危机如期而遇,人身的低谷终究还是来了。很沮丧也很无助,但还是要坚强面对。人生起起伏伏,时好时坏,终归还是会好起来的。加油!加油!加油

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +又长了一岁 - 心情 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

一年一次的总结时间又到了,这一年前半年平平无奇,后半年惊涛骇浪。中年危机如期而遇,人身的低谷终究还是来了。很沮丧也很无助,但还是要坚强面对。人生起起伏伏,时好时坏,终归还是会好起来的。加油!加油!加油

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/10/20/极空间Docker版Wordpress安装与配置/index.html b/2022/10/20/极空间Docker版Wordpress安装与配置/index.html index 051987a7c..54f714b15 100644 --- a/2022/10/20/极空间Docker版Wordpress安装与配置/index.html +++ b/2022/10/20/极空间Docker版Wordpress安装与配置/index.html @@ -1 +1 @@ -极空间 Docker 版 Wordpress 安装与配置 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 安装

  • 下载最新版 wordpress 镜像,如极空间无法下载,可到 passerma 网站下载。
  • 需要先在 mysql 中创建给 wordpress 使用的库。
  • 文件路径映射(目前极空间不能映射到高速盘,否则无法启动)。
  • 端口映射。
  • 通过映射的端口访问安装界面(一定要通过最终访问的页面进行安装,否则修改配置比较麻烦。如最终是域名访问,就先把域名解析代理等先配置好,再通过域名访问安装)。

# 配置

  • 如需使用 https 访问,需要在 wp-config.php 中加入以下代码,否则资源文件无法访问。
if((!empty( $_SERVER['HTTP_X_FORWARDED_HOST'])) || (!empty( $_SERVER['HTTP_X_FORWARDED_FOR'])) ) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
    $_SERVER['HTTPS'] = 'on';
}
  • 后台安装插件时如果跳转到 ftp 配置,则需要在 wp-config.php 中加入以下代码,并到 wp-content 目录下创建 tmp 目录,最后还需要给 tmp 目录赋予读写权限。
define('WP_TEMP_DIR', ABSPATH.'wp-content/tmp');
define('FS_METHOD', 'direct');
define('FS_CHMOD_DIR', 0777);
define('FS_CHMOD_FILE', 0777);
  • 目录和文件所有者、组会自动变为 root,目前我是通过访问页面时通过命令修正。暂时未发现问题,如果不行则只能通过定时任务来定时修正了。需要在 wp-config.php 中加入以下代码。
chown('/var/www/html', 'www-data');
chgrp('/var/www/html', 'www-data');
chmod('/var/www/html/wp-content/plugins', 0777);
chmod('/var/www/html/wp-content/themes', 0777);
chmod('/var/www/html/wp-content/tmp', 0777);
  • 隐藏后台访问需要在 wp-login.php 中加入以下代码,key、value 和 https://www.xxx.com/ 需要修改为自己的。修改后只能通过 https://www.xxx.com/wp-login.php?key=value 访问,其它访问需要登录的页面都会跳转到配置的 https://www.xxx.com/ 地址。
if($_GET['key'] != 'value') {
	header('Location: https://www.xxx.com/');
}
\ No newline at end of file +极空间 Docker 版 Wordpress 安装与配置 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 安装

  • 下载最新版 wordpress 镜像,如极空间无法下载,可到 passerma 网站下载。
  • 需要先在 mysql 中创建给 wordpress 使用的库。
  • 文件路径映射(目前极空间不能映射到高速盘,否则无法启动)。
  • 端口映射。
  • 通过映射的端口访问安装界面(一定要通过最终访问的页面进行安装,否则修改配置比较麻烦。如最终是域名访问,就先把域名解析代理等先配置好,再通过域名访问安装)。

# 配置

  • 如需使用 https 访问,需要在 wp-config.php 中加入以下代码,否则资源文件无法访问。
if((!empty( $_SERVER['HTTP_X_FORWARDED_HOST'])) || (!empty( $_SERVER['HTTP_X_FORWARDED_FOR'])) ) {
    $_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
    $_SERVER['HTTPS'] = 'on';
}
  • 后台安装插件时如果跳转到 ftp 配置,则需要在 wp-config.php 中加入以下代码,并到 wp-content 目录下创建 tmp 目录,最后还需要给 tmp 目录赋予读写权限。
define('WP_TEMP_DIR', ABSPATH.'wp-content/tmp');
define('FS_METHOD', 'direct');
define('FS_CHMOD_DIR', 0777);
define('FS_CHMOD_FILE', 0777);
  • 目录和文件所有者、组会自动变为 root,目前我是通过访问页面时通过命令修正。暂时未发现问题,如果不行则只能通过定时任务来定时修正了。需要在 wp-config.php 中加入以下代码。
chown('/var/www/html', 'www-data');
chgrp('/var/www/html', 'www-data');
chmod('/var/www/html/wp-content/plugins', 0777);
chmod('/var/www/html/wp-content/themes', 0777);
chmod('/var/www/html/wp-content/tmp', 0777);
  • 隐藏后台访问需要在 wp-login.php 中加入以下代码,key、value 和 https://www.xxx.com/ 需要修改为自己的。修改后只能通过 https://www.xxx.com/wp-login.php?key=value 访问,其它访问需要登录的页面都会跳转到配置的 https://www.xxx.com/ 地址。
if($_GET['key'] != 'value') {
	header('Location: https://www.xxx.com/');
}
\ No newline at end of file diff --git a/2022/10/21/Hexo-Theme-Shoka-Valine评论配置/index.html b/2022/10/21/Hexo-Theme-Shoka-Valine评论配置/index.html index 6b344de3e..bdb4657a4 100644 --- a/2022/10/21/Hexo-Theme-Shoka-Valine评论配置/index.html +++ b/2022/10/21/Hexo-Theme-Shoka-Valine评论配置/index.html @@ -1 +1 @@ -Hexo + Theme.Shoka + Valine 评论配置 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
  • valine 评论需要 LeanCloud 支持

# LeanCloud 注册

  1. LeanCloud 网站完成注册。
  2. 创建应用。
  3. 名称随便取,方案看自己选择。开发版免费但是有限制,商业版收费无限制。
  4. 点击配置按钮进行配置。
  5. 点击设置 - 应用凭证可获取 App ID 和 App Key
  6. 点击设置 - 安全中心根据自己的需求配置

# 修改 Theme.Shoka 配置

valine:
  appId: 粘贴5中获取的App ID #Your_appId
  appKey: 粘贴5中获取的App Key #Your_appkey
  placeholder: ヽ(○´∀`)ノ♪欢迎畅所欲言 # Comment box placeholder
  avatar: mp #默认头像设置 Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
  pageSize: 10 # Pagination size
  lang: zh-CN
  visitor: true # Article reading statistic 这个要设置为 false,以免与 leancloud_visitors 突冲 
  NoRecordIP: false # Whether to record the commenter IP
  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
  powerMode: true
  tagMeta:
    visitor: 新朋友
    master: 博主
    friend: 小伙伴
    investor: 金主粑粑
  tagColor:
    master: "var(--color-orange)"
    friend: "var(--color-aqua)"
    investor: "var(--color-pink)"
  tagMember:
    master:
      # - hash of master@email.com
      # - hash of master2@email.com
    friend:
      # - hash of friend@email.com
      # - hash of friend2@email.com
    investor:
      # - hash of investor1@email.com
\ No newline at end of file +Hexo + Theme.Shoka + Valine 评论配置 - Hexo - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
  • valine 评论需要 LeanCloud 支持

# LeanCloud 注册

  1. LeanCloud 网站完成注册。
  2. 创建应用。
  3. 名称随便取,方案看自己选择。开发版免费但是有限制,商业版收费无限制。
  4. 点击配置按钮进行配置。
  5. 点击设置 - 应用凭证可获取 App ID 和 App Key
  6. 点击设置 - 安全中心根据自己的需求配置

# 修改 Theme.Shoka 配置

valine:
  appId: 粘贴5中获取的App ID #Your_appId
  appKey: 粘贴5中获取的App Key #Your_appkey
  placeholder: ヽ(○´∀`)ノ♪欢迎畅所欲言 # Comment box placeholder
  avatar: mp #默认头像设置 Gravatar style : mp, identicon, monsterid, wavatar, robohash, retro
  pageSize: 10 # Pagination size
  lang: zh-CN
  visitor: true # Article reading statistic 这个要设置为 false,以免与 leancloud_visitors 突冲 
  NoRecordIP: false # Whether to record the commenter IP
  serverURLs: # When the custom domain name is enabled, fill it in here (it will be detected automatically by default, no need to fill in)
  powerMode: true
  tagMeta:
    visitor: 新朋友
    master: 博主
    friend: 小伙伴
    investor: 金主粑粑
  tagColor:
    master: "var(--color-orange)"
    friend: "var(--color-aqua)"
    investor: "var(--color-pink)"
  tagMember:
    master:
      # - hash of master@email.com
      # - hash of master2@email.com
    friend:
      # - hash of friend@email.com
      # - hash of friend2@email.com
    investor:
      # - hash of investor1@email.com
\ No newline at end of file diff --git a/2022/10/21/极空间Docker版mariadb安装与配置/index.html b/2022/10/21/极空间Docker版mariadb安装与配置/index.html index bb93aaca4..10d8994e2 100644 --- a/2022/10/21/极空间Docker版mariadb安装与配置/index.html +++ b/2022/10/21/极空间Docker版mariadb安装与配置/index.html @@ -1 +1 @@ -极空间 Docker 版 mariadb 安装与配置 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • mariadb 属于 mysql 的一个分支,完全兼容 mysql,使用方式和 mysql 无区别。

# 安装

  • 本文介绍安装的镜像为 linuxserver_mariadb 的 10.5.13-r0-ls45,原则上使用最新版即可
  • 配置文件映射
  • 端口
  • 环境(MYSQL_ROOT_PASSWORD 为数据库 root 用户密码)
  • 到此已经可以在内网使用了,连接方法同 mysql 一样

按本文设置内网连接信息为:
ip:极空间内网 ip
端口:3306
用户名:root
密码:MYSQL_ROOT_PASSWORD 对应的值

# 配置

  • 配置 nginx 反向代理
stream {
	
	#极空间 - docker-mariadb
	upstream mariadb {
		hash $remote_addr consistent;
		server 192.168.0.254:3306; #192.168.0.254 为极空间内网 ip
	}
	server {
		listen 8090; #8090 为 nginx 监听端口,需要在路由器开放 8090 端口并映射给极空间内网 IP(nginx 部署在极空间上)
		proxy_connect_timeout 30s;
		proxy_timeout 300s;
		proxy_pass mariadb;
	}
    
}
\ No newline at end of file +极空间 Docker 版 mariadb 安装与配置 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • mariadb 属于 mysql 的一个分支,完全兼容 mysql,使用方式和 mysql 无区别。

# 安装

  • 本文介绍安装的镜像为 linuxserver_mariadb 的 10.5.13-r0-ls45,原则上使用最新版即可
  • 配置文件映射
  • 端口
  • 环境(MYSQL_ROOT_PASSWORD 为数据库 root 用户密码)
  • 到此已经可以在内网使用了,连接方法同 mysql 一样

按本文设置内网连接信息为:
ip:极空间内网 ip
端口:3306
用户名:root
密码:MYSQL_ROOT_PASSWORD 对应的值

# 配置

  • 配置 nginx 反向代理
stream {
	
	#极空间 - docker-mariadb
	upstream mariadb {
		hash $remote_addr consistent;
		server 192.168.0.254:3306; #192.168.0.254 为极空间内网 ip
	}
	server {
		listen 8090; #8090 为 nginx 监听端口,需要在路由器开放 8090 端口并映射给极空间内网 IP(nginx 部署在极空间上)
		proxy_connect_timeout 30s;
		proxy_timeout 300s;
		proxy_pass mariadb;
	}
    
}
\ No newline at end of file diff --git a/2022/10/22/极空间Docker版青龙面板安装与配置/index.html b/2022/10/22/极空间Docker版青龙面板安装与配置/index.html index bf3e354d6..15f4c2e02 100644 --- a/2022/10/22/极空间Docker版青龙面板安装与配置/index.html +++ b/2022/10/22/极空间Docker版青龙面板安装与配置/index.html @@ -1 +1 @@ -极空间 Docker 版青龙面板安装与配置 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • 青龙面板是一个支持 python3、javascript、shell、typescript 的定时任务管理面板。它支持在线管理脚本、环境变量、配置文件,支持在线查看日志及支持多种方式的消息通知。

# 安装

  • 本文使用的是 whyour/qinglong 的镜像。
  • 路径映射(由于青龙面板有 nodejs 环境,所以我把 hexo 博客的编译也放置在上面,再把 nginx 的 html 映射过来,这样就可以直接编译发布了。)
#青龙面板装载路径
/ql/data
#博客装载路径(如果你不部署 hexo 博客可以不用配置)
/root/.ssh  #ssh 证书文件(如果你不用把 hexo 推送到 git 上可以不用配置)
/blog      #hexo 博客编译目录
/blog/nginx_blog  #nginx 上放置博客的目录(例如:/Docker/nginx/html/blog)
  • 端口

    4000端口是hexo-admin使用的,如果你不用可以不配置
  • 环境
  • 登录
    地址:http:// 极空间 IP:5700
    默认账号:admin
    默认密码:admin

# 配置

  • 我主要用青龙面板跑京东的脚本,所以也只介绍相关的配置方法
  • 定时任务 (我使用的是 KingRan/KR 的集合库,以下是拉取命令)
    ql repo https://github.com/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp|wskey" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"
  • 定时规则(我是每 3 小时拉取一次,不要拉取太频繁否则可能被封)
    0 */3 * * *
  • 环境变量
名称:JD_COOKIE
值:web京东登陆后按F12在网络tab页中的请求内查找cookie,然后复制pt_key=到pt_pin=等
  • 配置文件 (主要修改和添加以下配置)
repo命令拉取脚本时需要拉取的文件后缀,直接写文件后缀名即可
RepoFileExtensions="js py ts"
钉钉(消息推送)
export DD_BOT_TOKEN=
export DD_BOT_SECRET=
## 开卡
export guaopencard_All="true"
export guaopencard_addSku_All="true"
export guaopencardRun_All="true"
export guaopencard_draw="true"
export JD_TRY="true"
export exjxbeans="true"
export DY_OPENALL="true"
#抽奖
export opencard_draw=3
#开启脚本依赖文件缺失修复
export ec_fix_dep="true" 
#开启脚本依赖文件更新
export ec_re_dep="true" 
#清空购物车
export JD_CART_REMOVE="true"
export JD_CART="true"
#去掉多余的双十一红包脚本
export FLCODE=''
#加购物车抽奖
export RUN_CAR=true
#停用小额免密支付
export JD_PAY_CONTRACT=true
  • 依赖管理
#nodejs 依赖
crypto-js	
prettytable	
dotenv	
jsdom	
date-fns	
tough-cookie	
tslib	
ws@7.4.3	
ts-md5	
jsdom -g	
jieba	
fs	
form-data	
json5	
global-agent	
png-js	
@types/node	
require	
typescript	
js-base64	
axios
#pythone 依赖
requests	
canvas	
ping3	
jieba	
aiohttp	
PyExecJS
#Linux 依赖
bizCode
bizMsg
lxml

# 其它

#配置国内源
pip config --global set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config --global set install.trusted-host https://mirrors.aliyun.com
#升级 pip
pip install --upgrade pip
#更新青龙
ql update
#已知要安装的依赖(不安装部分脚本任务会失败)
pnpm install ds
#一键安装所有依赖(基于 Faker 一键脚本安装的青龙
可通过执行/ql/data/scripts下的QLDependency.sh脚本安装,如脚本已经更新则通过下面命令执行
curl -fsSL https://git.metauniverse-cn.com/https://raw.githubusercontent.com/shufflewzc/QLDependency/main/Shell/QLOneKeyDependency.sh | sh
#一般出现这种错误:(缺依赖)
Error: Cannot find module 'xx'
执行pnpm install xxx
#一般出现这种错误:(缺文件)
Error: Cannot find module './xx'
那就是拉库命令不完整,请检查或复制完整的拉库命
#Python3 依赖安装失败修复(基于 Faker 一键脚本安装的青龙)
curl -sS https://bootstrap.pypa.io/get-pip.py | python3
\ No newline at end of file +极空间 Docker 版青龙面板安装与配置 - Docker - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • 青龙面板是一个支持 python3、javascript、shell、typescript 的定时任务管理面板。它支持在线管理脚本、环境变量、配置文件,支持在线查看日志及支持多种方式的消息通知。

# 安装

  • 本文使用的是 whyour/qinglong 的镜像。
  • 路径映射(由于青龙面板有 nodejs 环境,所以我把 hexo 博客的编译也放置在上面,再把 nginx 的 html 映射过来,这样就可以直接编译发布了。)
#青龙面板装载路径
/ql/data
#博客装载路径(如果你不部署 hexo 博客可以不用配置)
/root/.ssh  #ssh 证书文件(如果你不用把 hexo 推送到 git 上可以不用配置)
/blog      #hexo 博客编译目录
/blog/nginx_blog  #nginx 上放置博客的目录(例如:/Docker/nginx/html/blog)
  • 端口

    4000端口是hexo-admin使用的,如果你不用可以不配置
  • 环境
  • 登录
    地址:http:// 极空间 IP:5700
    默认账号:admin
    默认密码:admin

# 配置

  • 我主要用青龙面板跑京东的脚本,所以也只介绍相关的配置方法
  • 定时任务 (我使用的是 KingRan/KR 的集合库,以下是拉取命令)
    ql repo https://github.com/KingRan/KR.git "jd_|jx_|jdCookie" "activity|backUp|wskey" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR"
  • 定时规则(我是每 3 小时拉取一次,不要拉取太频繁否则可能被封)
    0 */3 * * *
  • 环境变量
名称:JD_COOKIE
值:web京东登陆后按F12在网络tab页中的请求内查找cookie,然后复制pt_key=到pt_pin=等
  • 配置文件 (主要修改和添加以下配置)
repo命令拉取脚本时需要拉取的文件后缀,直接写文件后缀名即可
RepoFileExtensions="js py ts"
钉钉(消息推送)
export DD_BOT_TOKEN=
export DD_BOT_SECRET=
## 开卡
export guaopencard_All="true"
export guaopencard_addSku_All="true"
export guaopencardRun_All="true"
export guaopencard_draw="true"
export JD_TRY="true"
export exjxbeans="true"
export DY_OPENALL="true"
#抽奖
export opencard_draw=3
#开启脚本依赖文件缺失修复
export ec_fix_dep="true" 
#开启脚本依赖文件更新
export ec_re_dep="true" 
#清空购物车
export JD_CART_REMOVE="true"
export JD_CART="true"
#去掉多余的双十一红包脚本
export FLCODE=''
#加购物车抽奖
export RUN_CAR=true
#停用小额免密支付
export JD_PAY_CONTRACT=true
  • 依赖管理
#nodejs 依赖
crypto-js	
prettytable	
dotenv	
jsdom	
date-fns	
tough-cookie	
tslib	
ws@7.4.3	
ts-md5	
jsdom -g	
jieba	
fs	
form-data	
json5	
global-agent	
png-js	
@types/node	
require	
typescript	
js-base64	
axios
#pythone 依赖
requests	
canvas	
ping3	
jieba	
aiohttp	
PyExecJS
#Linux 依赖
bizCode
bizMsg
lxml

# 其它

#配置国内源
pip config --global set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config --global set install.trusted-host https://mirrors.aliyun.com
#升级 pip
pip install --upgrade pip
#更新青龙
ql update
#已知要安装的依赖(不安装部分脚本任务会失败)
pnpm install ds
#一键安装所有依赖(基于 Faker 一键脚本安装的青龙
可通过执行/ql/data/scripts下的QLDependency.sh脚本安装,如脚本已经更新则通过下面命令执行
curl -fsSL https://git.metauniverse-cn.com/https://raw.githubusercontent.com/shufflewzc/QLDependency/main/Shell/QLOneKeyDependency.sh | sh
#一般出现这种错误:(缺依赖)
Error: Cannot find module 'xx'
执行pnpm install xxx
#一般出现这种错误:(缺文件)
Error: Cannot find module './xx'
那就是拉库命令不完整,请检查或复制完整的拉库命
#Python3 依赖安装失败修复(基于 Faker 一键脚本安装的青龙)
curl -sS https://bootstrap.pypa.io/get-pip.py | python3
\ No newline at end of file diff --git a/2022/10/27/极空间web端https直连nginx配置/index.html b/2022/10/27/极空间web端https直连nginx配置/index.html index 272b75e16..42eadcb79 100644 --- a/2022/10/27/极空间web端https直连nginx配置/index.html +++ b/2022/10/27/极空间web端https直连nginx配置/index.html @@ -1 +1 @@ -极空间 web 端 https 直连 nginx 配置 - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • ip 直连一般都映射了 5055, 但是直接访问 5055 极空间只提供了 http 协议,如果希望使用 https 协议则必须使用其它端口进行访问。以下方案采用 nginx 反向代理实现,端口使用 10000 举例。

# 配置

  1. 需要先把 10000 端口在路由器上做好映射。
  2. 证书生成好并放置到 nginx 上。(证书生成方法不做介绍请自行百度)
  3. http 跳转 https 配置
server {
		if ($scheme = http) {
			rewrite ^(.*)$ https://$host$1 permanent;
		}
}
  1. web 端口监听配置
#极空间 - web
server {
	listen 10000 ssl http2; #ipv4
	listen [::]:10000 ssl http2; #ipv6
	server_name xxx.xxx.com; #填写自己的域名,主域名或者子域名
	#include /etc/nginx/conf.d/ssl/ssl_common.conf;
	ssl_certificate_key /etc/nginx/conf.d/ssl/xxx.key;  #加密证书
	ssl_certificate /etc/nginx/conf.d/ssl/xxx.pem;  #加密证书
	ssl_session_timeout 1d;
	ssl_session_cache shared:MozSSL:10m;
	ssl_session_tickets off;
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
	ssl_prefer_server_ciphers on;
   #开启 OCSP stapling
	ssl_stapling on;
	ssl_stapling_verify on;
	client_max_body_size 128M;
	add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
	proxy_send_timeout 180s; #设置发送超时时间
   proxy_read_timeout 180s; #设置读取超时时间
	# Prevent Information leaks
	proxy_hide_header X-Powered-By;
	proxy_hide_header Server;
	proxy_hide_header X-AspNetMvc-Version;
	proxy_hide_header X-AspNet-Version;
	# http security headers
	add_header X-Content-Type-Options nosniff;
	add_header Pragma no-cache;
	add_header Cache-Control no-store;
	add_header X-XSS-Protection "1; mode=block";
	add_header Referrer-Policy origin-when-cross-origin;
	add_header X-Permitted-Cross-Domain-Policies none;
   add_header X-Frame-Options SAMEORIGIN; #允许同域嵌套
	# Add Security cookie flags
	proxy_cookie_path ~(.*) "$1; SameSite=strict; secure; httponly";
	# Path to the root of your installation
	location / {
		proxy_intercept_errors on;
		proxy_max_temp_file_size 0;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
  
		proxy_pass http://极空间内网ip:5055; #这里设置你自己要跳转的局域网应用;
		proxy_redirect http://域名:5055/home https://域名:10000/home; #极空间在登陆后会跳转到 http 协议的 5055 端口,所以要在此替换为 https 协议的 10000 端口
	}
	error_page  500 502 503 504 /500.html;
	error_page  400 404 /500.html;
	location = /500.html {
		root /usr/share/nginx/html/; #错误 html
	}
}

# 问题

  • 需要开启允许嵌套否则登陆后所有应用都是拒绝访问
  • 需要配置 proxy_redirect 替换响应 url,否则会跳转到默认 http 协议的 5055 端口
  • 如果配置 proxy_redirect 后无效可能需要清除浏览器缓存(F12 - 网络 - 右键点击 url 区域 - 清除浏览器缓存)
\ No newline at end of file +极空间 web 端 https 直连 nginx 配置 - 极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • ip 直连一般都映射了 5055, 但是直接访问 5055 极空间只提供了 http 协议,如果希望使用 https 协议则必须使用其它端口进行访问。以下方案采用 nginx 反向代理实现,端口使用 10000 举例。

# 配置

  1. 需要先把 10000 端口在路由器上做好映射。
  2. 证书生成好并放置到 nginx 上。(证书生成方法不做介绍请自行百度)
  3. http 跳转 https 配置
server {
		if ($scheme = http) {
			rewrite ^(.*)$ https://$host$1 permanent;
		}
}
  1. web 端口监听配置
#极空间 - web
server {
	listen 10000 ssl http2; #ipv4
	listen [::]:10000 ssl http2; #ipv6
	server_name xxx.xxx.com; #填写自己的域名,主域名或者子域名
	#include /etc/nginx/conf.d/ssl/ssl_common.conf;
	ssl_certificate_key /etc/nginx/conf.d/ssl/xxx.key;  #加密证书
	ssl_certificate /etc/nginx/conf.d/ssl/xxx.pem;  #加密证书
	ssl_session_timeout 1d;
	ssl_session_cache shared:MozSSL:10m;
	ssl_session_tickets off;
	ssl_protocols TLSv1.2 TLSv1.3;
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
	ssl_prefer_server_ciphers on;
   #开启 OCSP stapling
	ssl_stapling on;
	ssl_stapling_verify on;
	client_max_body_size 128M;
	add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";
	proxy_send_timeout 180s; #设置发送超时时间
   proxy_read_timeout 180s; #设置读取超时时间
	# Prevent Information leaks
	proxy_hide_header X-Powered-By;
	proxy_hide_header Server;
	proxy_hide_header X-AspNetMvc-Version;
	proxy_hide_header X-AspNet-Version;
	# http security headers
	add_header X-Content-Type-Options nosniff;
	add_header Pragma no-cache;
	add_header Cache-Control no-store;
	add_header X-XSS-Protection "1; mode=block";
	add_header Referrer-Policy origin-when-cross-origin;
	add_header X-Permitted-Cross-Domain-Policies none;
   add_header X-Frame-Options SAMEORIGIN; #允许同域嵌套
	# Add Security cookie flags
	proxy_cookie_path ~(.*) "$1; SameSite=strict; secure; httponly";
	# Path to the root of your installation
	location / {
		proxy_intercept_errors on;
		proxy_max_temp_file_size 0;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
  
		proxy_pass http://极空间内网ip:5055; #这里设置你自己要跳转的局域网应用;
		proxy_redirect http://域名:5055/home https://域名:10000/home; #极空间在登陆后会跳转到 http 协议的 5055 端口,所以要在此替换为 https 协议的 10000 端口
	}
	error_page  500 502 503 504 /500.html;
	error_page  400 404 /500.html;
	location = /500.html {
		root /usr/share/nginx/html/; #错误 html
	}
}

# 问题

  • 需要开启允许嵌套否则登陆后所有应用都是拒绝访问
  • 需要配置 proxy_redirect 替换响应 url,否则会跳转到默认 http 协议的 5055 端口
  • 如果配置 proxy_redirect 后无效可能需要清除浏览器缓存(F12 - 网络 - 右键点击 url 区域 - 清除浏览器缓存)
\ No newline at end of file diff --git a/2022/10/31/一键关闭Windows10-11系统自动更新/index.html b/2022/10/31/一键关闭Windows10-11系统自动更新/index.html index fac5083a5..550fc8aee 100644 --- a/2022/10/31/一键关闭Windows10-11系统自动更新/index.html +++ b/2022/10/31/一键关闭Windows10-11系统自动更新/index.html @@ -1 +1 @@ -一键关闭 Windows10/11 系统自动更新 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • 当你经常需要在家远程到公司进行办公,或者开启了很多临时文件、文档、软件需要等到第二天继续之前的工作时,结果系统自行更新并重启了。是不是会让你非常郁闷。关闭系统自行更新就可以轻松解决此类问题。

# 下载

win10 / win11 / 本地

\ No newline at end of file +一键关闭 Windows10/11 系统自动更新 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

  • 当你经常需要在家远程到公司进行办公,或者开启了很多临时文件、文档、软件需要等到第二天继续之前的工作时,结果系统自行更新并重启了。是不是会让你非常郁闷。关闭系统自行更新就可以轻松解决此类问题。

# 下载

win10 / win11 / 本地

\ No newline at end of file diff --git a/2022/11/01/360独立版小工具/index.html b/2022/11/01/360独立版小工具/index.html index f15b64f00..1d2a7e0fe 100644 --- a/2022/11/01/360独立版小工具/index.html +++ b/2022/11/01/360独立版小工具/index.html @@ -1 +1 @@ -360 独立版小工具 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 360 独立版小工具


360 全家桶众说纷纭但工具箱还是挺实用的,这波小工具可以单独下载使用,有需要的朋友赶紧下载吧!

下载地址

# 部分工具截图



更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +360 独立版小工具 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 360 独立版小工具


360 全家桶众说纷纭但工具箱还是挺实用的,这波小工具可以单独下载使用,有需要的朋友赶紧下载吧!

下载地址

# 部分工具截图



更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/11/02/2-dev-null和-dev-null-2-1和2-1-dev-null的区别/index.html b/2022/11/02/2-dev-null和-dev-null-2-1和2-1-dev-null的区别/index.html index 26f22f800..f5c2e1132 100644 --- a/2022/11/02/2-dev-null和-dev-null-2-1和2-1-dev-null的区别/index.html +++ b/2022/11/02/2-dev-null和-dev-null-2-1和2-1-dev-null的区别/index.html @@ -1 +1 @@ -2>/dev/null 和 >/dev/null 2>&1 和 2>&1>/dev/null 的区别 - Shell - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 区别:

2>/dev/null

意思就是把错误输出到 “黑洞”

>/dev/null 2>&1

默认情况是 1,也就是等同于 1>/dev/null 2>&1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞”

2>&1 >/dev/null

意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕

# 解释:

  1. 文件描述符
    Linux 系统预留三个文件描述符:0、1 和 2,他们的意义如下所示:
    0—— 标准输入(stdin)
    略...
    1—— 标准输出(stdout)
    在当前目录下,有且只有一个文件名称为 a.txt 的文件,这时我们运行这个命令【ls a.txt】, 就会获得一个标准输出 stdout 的输出结果:a.txt

    2—— 标准错误(stderr)
    在当前目录下,有且只有一个文件名称为 a.txt 的文件,我们运行命令【ls b.txt】,我们就会获得一个标准错误 stderr 的输出结果 “ls:无法访问 b.txt:没有这样的文件或目录”。

  2. 重定向
    重定向的符号有两个:> 或 >>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举例如下:

  • 重定向标准输出 stdout

    如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将 a.txt 打印到屏幕。在紧接的 cat 操作后,可以发现本来应该被输出的内容被记录到 stdout.txt 中。

  • 重定向标准错误 stderr

    如上图所示,文件描述符 2,标准错误的重定向也是同样的原理被记录在了文件 stderr.txt 这个文件里面了。

  • 可以将 stderr 单独定向到一个文件,stdout 重定向到另一个文件

ls b.txt 2> stderr.txt 1>stdout.txt
  • 也可以将 stderr 和 stdout 重定向到同一个文件
ls b.txt > output.txt 2>&1
  • 或采用下面的方法,可以少写几个字,能达到同样的效果
ls b.txt &> output.txt
ls b.txt >& output.txt #两个表达式效果一样的
  1. Linux 特殊文件
    /dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null 这个设备通常也被称为位桶(bit bucket)或黑洞。
    所以,2>/dev/null 的意思就是将标准错误 stderr 删掉。
\ No newline at end of file +2>/dev/null 和 >/dev/null 2>&1 和 2>&1>/dev/null 的区别 - Shell - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 区别:

2>/dev/null

意思就是把错误输出到 “黑洞”

>/dev/null 2>&1

默认情况是 1,也就是等同于 1>/dev/null 2>&1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞”

2>&1 >/dev/null

意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕

# 解释:

  1. 文件描述符
    Linux 系统预留三个文件描述符:0、1 和 2,他们的意义如下所示:
    0—— 标准输入(stdin)
    略...
    1—— 标准输出(stdout)
    在当前目录下,有且只有一个文件名称为 a.txt 的文件,这时我们运行这个命令【ls a.txt】, 就会获得一个标准输出 stdout 的输出结果:a.txt

    2—— 标准错误(stderr)
    在当前目录下,有且只有一个文件名称为 a.txt 的文件,我们运行命令【ls b.txt】,我们就会获得一个标准错误 stderr 的输出结果 “ls:无法访问 b.txt:没有这样的文件或目录”。

  2. 重定向
    重定向的符号有两个:> 或 >>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举例如下:

  • 重定向标准输出 stdout

    如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将 a.txt 打印到屏幕。在紧接的 cat 操作后,可以发现本来应该被输出的内容被记录到 stdout.txt 中。

  • 重定向标准错误 stderr

    如上图所示,文件描述符 2,标准错误的重定向也是同样的原理被记录在了文件 stderr.txt 这个文件里面了。

  • 可以将 stderr 单独定向到一个文件,stdout 重定向到另一个文件

ls b.txt 2> stderr.txt 1>stdout.txt
  • 也可以将 stderr 和 stdout 重定向到同一个文件
ls b.txt > output.txt 2>&1
  • 或采用下面的方法,可以少写几个字,能达到同样的效果
ls b.txt &> output.txt
ls b.txt >& output.txt #两个表达式效果一样的
  1. Linux 特殊文件
    /dev/null 是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null 这个设备通常也被称为位桶(bit bucket)或黑洞。
    所以,2>/dev/null 的意思就是将标准错误 stderr 删掉。
\ No newline at end of file diff --git a/2022/11/03/上班了/index.html b/2022/11/03/上班了/index.html index 8f6c0f81a..27fc12f2e 100644 --- a/2022/11/03/上班了/index.html +++ b/2022/11/03/上班了/index.html @@ -1 +1 @@ -上班了 - 心情 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
  • 终于又上班了。O (∩_∩) O~
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +上班了 - 心情 - 生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
  • 终于又上班了。O (∩_∩) O~
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/11/04/记一次Vue项目的部署/index.html b/2022/11/04/记一次Vue项目的部署/index.html index 5afa2c7e8..f7b6a24be 100644 --- a/2022/11/04/记一次Vue项目的部署/index.html +++ b/2022/11/04/记一次Vue项目的部署/index.html @@ -1 +1 @@ -记一次 Vue 项目的部署 - Vue - 项目部署 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 描述

  • 今天需要把一个 web 项目部署到 ubuntu 服务器上,结果直接使用 apt install nodejs 安装的 nodejs 版本过低,导致编译失败。最后通过查看官网文档获取到了 ubuntu 最新 nodejs 的安装命令。

# 过程

  • 卸载旧的 nodejs(此命令会卸载掉相关依赖包)
sudo apt autoremove --purge nodejs
  • 安装 NodeJS
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - && sudo apt-get install -y nodejs
  • 安装 yarn
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
  • 初始化 (到项目根目录执行)
yarn install
  • 编译(到项目根目录执行,完成后会生成 dist 目录)
yarn build
  • 安装 nginx
apt install nginx
  • 配置 nginx (编译 /etc/nginx/sites-available/default)
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;
        root /var/www/html;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
        server_name _;
        location /api {
                proxy_pass http://localhost:8080;
        }
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ =404;
                alias /opt/codes/dayu-tools-arbitrage-web/dist/;
                index index.html index.htm;
        }

# 其它

  • 重新编译前需要先删除 dist 目录
rm dist -fr
yarn build
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +记一次 Vue 项目的部署 - Vue - 项目部署 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 描述

  • 今天需要把一个 web 项目部署到 ubuntu 服务器上,结果直接使用 apt install nodejs 安装的 nodejs 版本过低,导致编译失败。最后通过查看官网文档获取到了 ubuntu 最新 nodejs 的安装命令。

# 过程

  • 卸载旧的 nodejs(此命令会卸载掉相关依赖包)
sudo apt autoremove --purge nodejs
  • 安装 NodeJS
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - && sudo apt-get install -y nodejs
  • 安装 yarn
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update && sudo apt-get install yarn
  • 初始化 (到项目根目录执行)
yarn install
  • 编译(到项目根目录执行,完成后会生成 dist 目录)
yarn build
  • 安装 nginx
apt install nginx
  • 配置 nginx (编译 /etc/nginx/sites-available/default)
server {
        listen 80 default_server;
        listen [::]:80 default_server;
        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;
        root /var/www/html;
        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
        server_name _;
        location /api {
                proxy_pass http://localhost:8080;
        }
        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ =404;
                alias /opt/codes/dayu-tools-arbitrage-web/dist/;
                index index.html index.htm;
        }

# 其它

  • 重新编译前需要先删除 dist 目录
rm dist -fr
yarn build
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/11/08/Nginx配置-反向代理/index.html b/2022/11/08/Nginx配置-反向代理/index.html index e31cfb2c6..05ffb5641 100644 --- a/2022/11/08/Nginx配置-反向代理/index.html +++ b/2022/11/08/Nginx配置-反向代理/index.html @@ -1 +1 @@ -Nginx 配置 - 反向代理 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

  • 所有配置方法和介绍均来至于网络搜索汇总,主要用于方便后期巩固学习。

# 何为反向代理

  • 在介绍反向代理之前,先来了解一下正向代理。

正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。
991a203be1ec82b36e1f326376617d40.png
反向代理:看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
1c87e386a0ce624a3949bda443cf346d.png

正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果是在服务器用,用户无感知,就是反向代理。

# Nginx 配置文件

  • 在学习 Nginx 之前,要熟知它的配置文件,毕竟,下面需要做的所有配置(反向代理、负载均衡、动静分离等),都是基于它的配置文件。

  • Nginx 默认的配置文件是在安装目录下的 conf 目录下,后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。完整的配置文件,可以看一下文章最后。修改过 nginx.conf 配置文件,记得要✔️重启 Nginx 服务(☆☆☆☆☆)

  • 配置文件中有很多 #号,该符号表示注释内容,去掉所有以 #开头的段落,精简之后的配置文件内容如下(PS:其实注释掉的地方,都是一些功能的使用代码,需要用到的时候,取消注释即可):

# 主进程叫 master,负责管理子进程,子进程叫 worker
# worker_processes 配置项表示开启几个业务进程,一般和 cpu 核数有关
worker_processes  1;
events {
    worker_connections  1024;
}
http {
	# include 表示可以引入其他文件,此处表示引入 http mime 类型
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	# 虚拟主机,可以配置多个
    server {
        listen       80;
        server_name  localhost;
        location / {
        	# 路径匹配之后,哪个目录下去匹配相应的网页,html 是相对路径
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}
}

去掉注释信息后,可以将 nginx.conf 配置文件分为三部分:

  1. 全局块
worker_processes  1;
  • 从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括:配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

  • 上面这行 worker_processes 配置,是 Nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束。

  1. events 块
events {
	worker_connections  1024;
}
  • events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括:是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等

上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

  1. http 块
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
    }
}
  • 这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置

http 全局块:http 全局块配置的指令包括:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server 块:这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

location 块:这块的主要作用是:基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。(☆☆☆☆☆)

# 反向代理配置

  1. location 配置规则
location [ = | ~ | ~* | ^~ | @ ] /uri {
}
=    :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
~    :用于表示 uri 包含正则表达式,并且区分大小写。
~*   :用于表示 uri 包含正则表达式,并且不区分大小写。
^~   :用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的location后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
@    : "@" 定义一个命名的 location,使用在内部定向时,例如 error_page
/uri  :不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则
/    :通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

uri 没有 “/” 结尾时location /abc/def 可以匹配 /abc/defghi 请求,也可以匹配 /abc/def/ghi 等
uri 有 “/” 结尾时location /abc/def/ 不能匹配 /abc/defghi 请求只能匹配 /abc/def/anything 这样的请求☆☆☆☆☆

  1. proxy_pass 配置规则

url 结尾加上了 /相当于是绝对路径则 Nginx 不会把 location 中匹配的路径部分加入代理 url
url 结尾不加 /Nginx 则会把匹配的路径部分加入代理 uri

情景1:
proxy_pass后有/ 
访问地址:http://localhost:8081/WCP.Service/wcp/modeladapter/download/asc.shtml
最终代理:http://10.194.171.7:13082/modeladapter/download/asc.shtml
location /WCP.Service/wcp/modeladapter/download/ {
	proxy_pass   http://10.194.171.7:13082/modeladapter/download/;
}
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/model/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082/model/;
}
情景2:
proxy_pass后有/
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082/;
}
情景3:
proxy_pass后没有/ 
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/model/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082;
}
情景4
proxy_pass后没有/ 
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/AAAmodel/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082/AAA;
}
情景5
proxy_pass后有/
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/asc.shtml
location /model {
	proxy_pass   http://127.0.0.1:8082/;
}
情景6
proxy_pass后有/
访问地址:http://localhost:8081/modelBBB/asc.shtml
最终代理:http://127.0.0.1:8082/asc.shtml
location /model {
	proxy_pass   http://127.0.0.1:8082/;
}

# Nginx 完整配置文件

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +Nginx 配置 - 反向代理 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

  • 所有配置方法和介绍均来至于网络搜索汇总,主要用于方便后期巩固学习。

# 何为反向代理

  • 在介绍反向代理之前,先来了解一下正向代理。

正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理,下面是正向代理的原理图。
991a203be1ec82b36e1f326376617d40.png
反向代理:看下面原理图,就一目了然。其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
1c87e386a0ce624a3949bda443cf346d.png

正向代理和反向代理的区别,一句话就是:如果我们客户端自己用,就是正向代理。如果是在服务器用,用户无感知,就是反向代理。

# Nginx 配置文件

  • 在学习 Nginx 之前,要熟知它的配置文件,毕竟,下面需要做的所有配置(反向代理、负载均衡、动静分离等),都是基于它的配置文件。

  • Nginx 默认的配置文件是在安装目录下的 conf 目录下,后续对 Nginx 的使用基本上都是对此配置文件进行相应的修改。完整的配置文件,可以看一下文章最后。修改过 nginx.conf 配置文件,记得要✔️重启 Nginx 服务(☆☆☆☆☆)

  • 配置文件中有很多 #号,该符号表示注释内容,去掉所有以 #开头的段落,精简之后的配置文件内容如下(PS:其实注释掉的地方,都是一些功能的使用代码,需要用到的时候,取消注释即可):

# 主进程叫 master,负责管理子进程,子进程叫 worker
# worker_processes 配置项表示开启几个业务进程,一般和 cpu 核数有关
worker_processes  1;
events {
    worker_connections  1024;
}
http {
	# include 表示可以引入其他文件,此处表示引入 http mime 类型
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
	# 虚拟主机,可以配置多个
    server {
        listen       80;
        server_name  localhost;
        location / {
        	# 路径匹配之后,哪个目录下去匹配相应的网页,html 是相对路径
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
	}
}

去掉注释信息后,可以将 nginx.conf 配置文件分为三部分:

  1. 全局块
worker_processes  1;
  • 从配置文件开始到 events 块之间的内容,主要会设置一些影响 Nginx 服务器整体运行的配置指令,主要包括:配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

  • 上面这行 worker_processes 配置,是 Nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的约束。

  1. events 块
events {
	worker_connections  1024;
}
  • events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括:是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等

上述例子就表示每个 work process 支持的最大连接数为 1024。这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

  1. http 块
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
    }
}
  • 这部分是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。下面的反向代理、动静分离、负载均衡都是在这部分中配置

http 全局块:http 全局块配置的指令包括:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

server 块:这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

location 块:这块的主要作用是:基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。(☆☆☆☆☆)

# 反向代理配置

  1. location 配置规则
location [ = | ~ | ~* | ^~ | @ ] /uri {
}
=    :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
~    :用于表示 uri 包含正则表达式,并且区分大小写。
~*   :用于表示 uri 包含正则表达式,并且不区分大小写。
^~   :用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的location后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
@    : "@" 定义一个命名的 location,使用在内部定向时,例如 error_page
/uri  :不带任何修饰符,也表示前缀匹配,但是在正则匹配之后,如果没有正则命中,命中最长的规则
/    :通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default

uri 没有 “/” 结尾时location /abc/def 可以匹配 /abc/defghi 请求,也可以匹配 /abc/def/ghi 等
uri 有 “/” 结尾时location /abc/def/ 不能匹配 /abc/defghi 请求只能匹配 /abc/def/anything 这样的请求☆☆☆☆☆

  1. proxy_pass 配置规则

url 结尾加上了 /相当于是绝对路径则 Nginx 不会把 location 中匹配的路径部分加入代理 url
url 结尾不加 /Nginx 则会把匹配的路径部分加入代理 uri

情景1:
proxy_pass后有/ 
访问地址:http://localhost:8081/WCP.Service/wcp/modeladapter/download/asc.shtml
最终代理:http://10.194.171.7:13082/modeladapter/download/asc.shtml
location /WCP.Service/wcp/modeladapter/download/ {
	proxy_pass   http://10.194.171.7:13082/modeladapter/download/;
}
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/model/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082/model/;
}
情景2:
proxy_pass后有/
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082/;
}
情景3:
proxy_pass后没有/ 
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/model/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082;
}
情景4
proxy_pass后没有/ 
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/AAAmodel/asc.shtml
location /model/ {
	proxy_pass   http://127.0.0.1:8082/AAA;
}
情景5
proxy_pass后有/
访问地址:http://localhost:8081/model/asc.shtml
最终代理:http://127.0.0.1:8082/asc.shtml
location /model {
	proxy_pass   http://127.0.0.1:8082/;
}
情景6
proxy_pass后有/
访问地址:http://localhost:8081/modelBBB/asc.shtml
最终代理:http://127.0.0.1:8082/asc.shtml
location /model {
	proxy_pass   http://127.0.0.1:8082/;
}

# Nginx 完整配置文件

#user  nobody;
worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen       80;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;
    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;
    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/11/09/Vue按环境设置编译项目/index.html b/2022/11/09/Vue按环境设置编译项目/index.html index 0740b44fa..618289c12 100644 --- a/2022/11/09/Vue按环境设置编译项目/index.html +++ b/2022/11/09/Vue按环境设置编译项目/index.html @@ -1 +1 @@ -Vue 按环境设置编译项目 - Vue - 项目部署 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

  • 今天在部署 vue 项目时发现生产环境的端口只有一个,而且被多个项目公用了,刚好此项目又没有配置服务名而是直接使用的根路径。没办法只有修改项目配置重新编译了!

# 配置

  • 在项目根目录添加两个文件。

.env.alpha

NODE_ENV = 'production'
VUE_APP_BASE_URL = '/'

.env.prod

NODE_ENV = 'production'
VUE_APP_BASE_URL = '/projectName'
  • package.json 文件内添加不同环境的打包指令
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build-test": "vue-cli-service build --mode alpha",
    "build-prod": "vue-cli-service build --mode prod",
    "lint": "vue-cli-service lint"
}
  • 项目中 base_url 需要使用 process.env.VUE_APP_BASE_URL 替换

  • 编译命令

yarn build-test #使用.env.alpha 配置文件中的参数
yarn build-prod #使用.env.prod 配置文件中的参数
yarn build --mode alpha #使用.env.alpha 配置文件中的参数
yarn build --mode prod #使用.env.prod 配置文件中的参数
\ No newline at end of file +Vue 按环境设置编译项目 - Vue - 项目部署 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

  • 今天在部署 vue 项目时发现生产环境的端口只有一个,而且被多个项目公用了,刚好此项目又没有配置服务名而是直接使用的根路径。没办法只有修改项目配置重新编译了!

# 配置

  • 在项目根目录添加两个文件。

.env.alpha

NODE_ENV = 'production'
VUE_APP_BASE_URL = '/'

.env.prod

NODE_ENV = 'production'
VUE_APP_BASE_URL = '/projectName'
  • package.json 文件内添加不同环境的打包指令
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build-test": "vue-cli-service build --mode alpha",
    "build-prod": "vue-cli-service build --mode prod",
    "lint": "vue-cli-service lint"
}
  • 项目中 base_url 需要使用 process.env.VUE_APP_BASE_URL 替换

  • 编译命令

yarn build-test #使用.env.alpha 配置文件中的参数
yarn build-prod #使用.env.prod 配置文件中的参数
yarn build --mode alpha #使用.env.alpha 配置文件中的参数
yarn build --mode prod #使用.env.prod 配置文件中的参数
\ No newline at end of file diff --git a/2022/11/13/数据库管理工具/index.html b/2022/11/13/数据库管理工具/index.html index 09b067434..1b6a4bb47 100644 --- a/2022/11/13/数据库管理工具/index.html +++ b/2022/11/13/数据库管理工具/index.html @@ -1 +1 @@ -数据库管理工具 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

  • 很多朋友安装了 mysql 后不知道可以用工具管理,所以专门找了两个数据库管理工具方便大家使用。
  1. 下载
  2. 安装一路下一步即可 (注意:安装完成后先不要运行)
  3. 注册

1、运行注册机
2、修改 Your Name(可不改)
3、点击 Patch(此时会提示:navicat.exe - x64 -> Cracked
4、运行 navicat
5、点击第一个 Generate 获取注册码 (Your Name 上一行)
6、点击 Copy 然后粘贴到 navicat 窗口上(也可能会自动粘贴进去)
7、点击 navicat 上的激活按钮,等待一会,失败后会弹出手动激活按钮
8、点击手动激活,窗口上会有一个 request code,把框里的值复制到注册机对应的 request code 框内。
9、点击第二个 Generate 获取 Activation Code(激活码),把码复制到 navicat 对应的框内。
10、点击激活完成激活。

  1. 查看注册信息
  2. 测试连接
  3. 新建库

# DBeaver

  1. 下载
  2. 下载 jdk✔️有 JAVA 环境的不用下载
  3. 修改 dbeaver.ini 配置文件
-vm
D:\jdk-11.0.11\bin
-startup
plugins/org.eclipse.equinox.launcher_1.6.300.v20210813-1054.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.300.v20210828-0802
-vmargs
-XX:+IgnoreUnrecognizedVMOptions
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=11
-Xms128m
-Xmx2048m
-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT
-Ddbeaver.distribution.type=zip
-javaagent:F:\green program\dbeaver\dbeaver-agent\dbeaver-agent.jar

第一二行指定 jdk 地址
最后一行指定 dbeaver-agent.jar 注册工具的位置

  1. 启动
  2. 注册成功
  3. 测试连接
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +数据库管理工具 - 工具 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

  • 很多朋友安装了 mysql 后不知道可以用工具管理,所以专门找了两个数据库管理工具方便大家使用。
  1. 下载
  2. 安装一路下一步即可 (注意:安装完成后先不要运行)
  3. 注册

1、运行注册机
2、修改 Your Name(可不改)
3、点击 Patch(此时会提示:navicat.exe - x64 -> Cracked
4、运行 navicat
5、点击第一个 Generate 获取注册码 (Your Name 上一行)
6、点击 Copy 然后粘贴到 navicat 窗口上(也可能会自动粘贴进去)
7、点击 navicat 上的激活按钮,等待一会,失败后会弹出手动激活按钮
8、点击手动激活,窗口上会有一个 request code,把框里的值复制到注册机对应的 request code 框内。
9、点击第二个 Generate 获取 Activation Code(激活码),把码复制到 navicat 对应的框内。
10、点击激活完成激活。

  1. 查看注册信息
  2. 测试连接
  3. 新建库

# DBeaver

  1. 下载
  2. 下载 jdk✔️有 JAVA 环境的不用下载
  3. 修改 dbeaver.ini 配置文件
-vm
D:\jdk-11.0.11\bin
-startup
plugins/org.eclipse.equinox.launcher_1.6.300.v20210813-1054.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.300.v20210828-0802
-vmargs
-XX:+IgnoreUnrecognizedVMOptions
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=11
-Xms128m
-Xmx2048m
-Djavax.net.ssl.trustStoreType=WINDOWS-ROOT
-Ddbeaver.distribution.type=zip
-javaagent:F:\green program\dbeaver\dbeaver-agent\dbeaver-agent.jar

第一二行指定 jdk 地址
最后一行指定 dbeaver-agent.jar 注册工具的位置

  1. 启动
  2. 注册成功
  3. 测试连接
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/11/21/mysql数据库auto-increment自增长不变的处理方法/index.html b/2022/11/21/mysql数据库auto-increment自增长不变的处理方法/index.html index d55dd286a..758971c5d 100644 --- a/2022/11/21/mysql数据库auto-increment自增长不变的处理方法/index.html +++ b/2022/11/21/mysql数据库auto-increment自增长不变的处理方法/index.html @@ -1 +1 @@ -mysql 数据库 auto_increment 自增长不变的处理方法 - 解决问题 - 工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 问题描述

今天无意中发现原本能正常增加的 id 突然不变了,查看 sql 发现是取的对应表的自增 id。虽然存到表中的新数据自增 id 变化了,但返回的 id 总是不变。经过查询发现表的自增 id 是存在 information_schema 库中的 tables 表中。tables 表中存储了所有表的对应信息,其中有个 auto_increment 字段存储的就是对应表的下一个自增值。但是 mysql 在新版本中修改了此值的更新规则,老版本中是实时更新,新版本修改为 24 小时更新一次。为了不修改原代码中的逻辑,只能通过修改 mysql 配置使项目正常工作了。

# 解决办法

mysql数据库auto_increment自增长不变的处理方法
修改/etc/mysql/mysql.conf.d/mysqld.cnf
增加一行information_schema_stats_expiry = 0
保存后重启mysql
sudo systemctl restart mysql.service
查询是否生效
show global variables like 'information_schema_stats_expiry';
show session variables like 'information_schema_stats_expiry';
\ No newline at end of file +mysql 数据库 auto_increment 自增长不变的处理方法 - 解决问题 - 工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 问题描述

今天无意中发现原本能正常增加的 id 突然不变了,查看 sql 发现是取的对应表的自增 id。虽然存到表中的新数据自增 id 变化了,但返回的 id 总是不变。经过查询发现表的自增 id 是存在 information_schema 库中的 tables 表中。tables 表中存储了所有表的对应信息,其中有个 auto_increment 字段存储的就是对应表的下一个自增值。但是 mysql 在新版本中修改了此值的更新规则,老版本中是实时更新,新版本修改为 24 小时更新一次。为了不修改原代码中的逻辑,只能通过修改 mysql 配置使项目正常工作了。

# 解决办法

mysql数据库auto_increment自增长不变的处理方法
修改/etc/mysql/mysql.conf.d/mysqld.cnf
增加一行information_schema_stats_expiry = 0
保存后重启mysql
sudo systemctl restart mysql.service
查询是否生效
show global variables like 'information_schema_stats_expiry';
show session variables like 'information_schema_stats_expiry';
\ No newline at end of file diff --git a/2022/11/24/KLineChart实现一幅图上画多个蜡烛K线/index.html b/2022/11/24/KLineChart实现一幅图上画多个蜡烛K线/index.html index db49322a5..7056e8b64 100644 --- a/2022/11/24/KLineChart实现一幅图上画多个蜡烛K线/index.html +++ b/2022/11/24/KLineChart实现一幅图上画多个蜡烛K线/index.html @@ -1 +1 @@ -KLineChart 实现一幅图上画多个蜡烛 K 线 - KLineChart - 解决问题 - 工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

最近接到一个任务是通过 KLineChart✔️8.6.1 实现在一幅图上画两个合约的蜡烛图。研究 api 发现并没有通过配置实现的方法,于是联系作者沟通得知需要自己画图实现。于是有了本篇文章。
KLineChart.jpg

# 添加模版

let shortName = this.constant.periodTypeEnum.getNameByCode(this.klineType) + '    合约2:' + this.currentInstrumentId
this.chart.addTechnicalIndicatorTemplate({
  name: 'custom_candle_solid',
  shortName: shortName,
  precision: 2,
  bar: {
	upColor: '#EF5350',
	downColor: '#26A69A',
	noChangeColor: '#888889'
  },
  plots: [
	{ key: 'open', title: '开: ' },
	{ key: 'close', title: '收: ' },
	{ key: 'high', title: '高: ' },
	{ key: 'low', title: '低: ' }
  ],
  calcTechnicalIndicator: (dataList, { params, plots }) => {
	return dataList.map((kLineData, i) => {
	  return {
		instrumentId: kLineData.instrumentId,
		timestamp: getDateTime(new Date(kLineData.timestamp)),
		open: kLineData.open,
		close: kLineData.close,
		high: kLineData.high,
		low: kLineData.low
	  }
	})
  },
  render: ({ ctx, dataSource, viewport, styles, xAxis, yAxis }) => {
	// X 轴起始像素
	let x = xAxis.convertToPixel(0)
	dataSource.technicalIndicatorDataList.forEach(function (kLineData, i) {
	  let open = kLineData.open
	  let close = kLineData.close
	  let high = kLineData.high
	  let low = kLineData.low
	  // 给蜡烛柱设置颜色
	  if (close > open) { // 涨
		ctx.strokeStyle = '#EF5350'
		ctx.fillStyle = '#EF5350'
	  } else if (close < open) { // 跌
		ctx.strokeStyle = '#26A69A'
		ctx.fillStyle = '#26A69A'
	  } else { // 未变动
		ctx.strokeStyle = '#888889'
		ctx.fillStyle = '#888889'
	  }
	  // 获取开盘价 Y 轴像素
	  let openY = yAxis.convertToPixel(open)
	  // 获取收盘价 Y 轴像素
	  let closeY = yAxis.convertToPixel(close)
	  // 开、收、高、低的 Y 轴像素
	  let priceY = [openY, closeY, yAxis.convertToPixel(high), yAxis.convertToPixel(low)]
	  // 从低到高排序
	  priceY.sort(function (a, b) {
		return a - b
	  })
	  // 画蜡烛柱上部
	  ctx.fillRect(x - 0.5, priceY[0], 1, priceY[1] - priceY[0])
	  // 画蜡烛柱下部
	  ctx.fillRect(x - 0.5, priceY[2], 1, priceY[3] - priceY[2])
	  // 蜡烛柱高度
	  var barHeight = Math.max(1, priceY[2] - priceY[1])
	  // 画蜡烛柱中部 (viewport.barSpace 蜡烛柱的宽度,随放大缩小操作而变化)
	  ctx.fillRect(x - (viewport.barSpace / 2), priceY[1], viewport.barSpace, barHeight)
	  // 下一蜡烛柱 X 轴的起始位置(viewport.dataSpace 蜡烛柱的宽度加蜡烛柱之间的间隔,随放大缩小操作而变化)
	  x += viewport.dataSpace
	})
  }
})

# 创建指标

this.chart.createTechnicalIndicator('custom_candle_solid', true, { id: 'paneId10', dragEnabled: true, height: this.height })
\ No newline at end of file +KLineChart 实现一幅图上画多个蜡烛 K 线 - KLineChart - 解决问题 - 工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

最近接到一个任务是通过 KLineChart✔️8.6.1 实现在一幅图上画两个合约的蜡烛图。研究 api 发现并没有通过配置实现的方法,于是联系作者沟通得知需要自己画图实现。于是有了本篇文章。
KLineChart.jpg

# 添加模版

let shortName = this.constant.periodTypeEnum.getNameByCode(this.klineType) + '    合约2:' + this.currentInstrumentId
this.chart.addTechnicalIndicatorTemplate({
  name: 'custom_candle_solid',
  shortName: shortName,
  precision: 2,
  bar: {
	upColor: '#EF5350',
	downColor: '#26A69A',
	noChangeColor: '#888889'
  },
  plots: [
	{ key: 'open', title: '开: ' },
	{ key: 'close', title: '收: ' },
	{ key: 'high', title: '高: ' },
	{ key: 'low', title: '低: ' }
  ],
  calcTechnicalIndicator: (dataList, { params, plots }) => {
	return dataList.map((kLineData, i) => {
	  return {
		instrumentId: kLineData.instrumentId,
		timestamp: getDateTime(new Date(kLineData.timestamp)),
		open: kLineData.open,
		close: kLineData.close,
		high: kLineData.high,
		low: kLineData.low
	  }
	})
  },
  render: ({ ctx, dataSource, viewport, styles, xAxis, yAxis }) => {
	// X 轴起始像素
	let x = xAxis.convertToPixel(0)
	dataSource.technicalIndicatorDataList.forEach(function (kLineData, i) {
	  let open = kLineData.open
	  let close = kLineData.close
	  let high = kLineData.high
	  let low = kLineData.low
	  // 给蜡烛柱设置颜色
	  if (close > open) { // 涨
		ctx.strokeStyle = '#EF5350'
		ctx.fillStyle = '#EF5350'
	  } else if (close < open) { // 跌
		ctx.strokeStyle = '#26A69A'
		ctx.fillStyle = '#26A69A'
	  } else { // 未变动
		ctx.strokeStyle = '#888889'
		ctx.fillStyle = '#888889'
	  }
	  // 获取开盘价 Y 轴像素
	  let openY = yAxis.convertToPixel(open)
	  // 获取收盘价 Y 轴像素
	  let closeY = yAxis.convertToPixel(close)
	  // 开、收、高、低的 Y 轴像素
	  let priceY = [openY, closeY, yAxis.convertToPixel(high), yAxis.convertToPixel(low)]
	  // 从低到高排序
	  priceY.sort(function (a, b) {
		return a - b
	  })
	  // 画蜡烛柱上部
	  ctx.fillRect(x - 0.5, priceY[0], 1, priceY[1] - priceY[0])
	  // 画蜡烛柱下部
	  ctx.fillRect(x - 0.5, priceY[2], 1, priceY[3] - priceY[2])
	  // 蜡烛柱高度
	  var barHeight = Math.max(1, priceY[2] - priceY[1])
	  // 画蜡烛柱中部 (viewport.barSpace 蜡烛柱的宽度,随放大缩小操作而变化)
	  ctx.fillRect(x - (viewport.barSpace / 2), priceY[1], viewport.barSpace, barHeight)
	  // 下一蜡烛柱 X 轴的起始位置(viewport.dataSpace 蜡烛柱的宽度加蜡烛柱之间的间隔,随放大缩小操作而变化)
	  x += viewport.dataSpace
	})
  }
})

# 创建指标

this.chart.createTechnicalIndicator('custom_candle_solid', true, { id: 'paneId10', dragEnabled: true, height: this.height })
\ No newline at end of file diff --git a/2022/11/30/Nginx动态解析域名方案/index.html b/2022/11/30/Nginx动态解析域名方案/index.html index e36464629..08061e4de 100644 --- a/2022/11/30/Nginx动态解析域名方案/index.html +++ b/2022/11/30/Nginx动态解析域名方案/index.html @@ -1 +1 @@ -Nginx 动态解析域名方案 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 应用场景:

由于有时候 nginx 代理的时候,第三方域名对应的 ip 可能发生变化,然而没有提前通知,然而如果不配置什么,nginx 又不能智能解析,因此 nginx 动态解析域名就比较重要。

# 使用模块 nginx-upstream-dynamic-servers

该模块在启动 nginx 的时候会对域名进行一次解析,解析完成后,在 DNS 服务器设定的 TTL 过期时间内不会再次更新,在 TTL 过期后则会再次发起域名解析请求更新域名所对应的 IP 地址。

需要在 nginx 的配置文件中的 http 配置域内指定使用的 DNS 服务器,在 upstream 中需要进行域名解析的 server 后面添加 resolve 参数。

例:

http {
    resolver    ip;
    upstream test {
        server  www.xxx.com:8080       resolve;
    }
    server {
        listen       8080;
        client_body_buffer_size 10m;
        server_name  localhost;
        location / {
        
                proxy_pass      http://test;
                
        }
        
    }
}

缺点:

1、每次解析域名之后,会从 DNS 服务器获取到改 DNS 的 TTL,在 TTL 期限内不会再次解析,所以如果目标域名发生改变,nginx 不会更新解析,知道 TTL 过期。

2、DNS 服务器在 http 配置域配置全,不能在 location 中细分指定。

# 使用模块 ngx_upstream_jdomain

在 http 配置域中配置 DNS 服务器,在 upstream 中按照这个模块的格式配置,支持设置每隔多少秒进行一次解析(抓包分析过设置 interval 可指定解析间隔),如果解析失败则使用缓存中的上一次解析结果的 IP 地址访问。

例:

http {
    resolver    ip;
    upstream test {
        jdomain  www.xxx.com port=8080 interval=10; #指定域名和端口,每隔 10 秒进行一次解析
    }
    server {
        listen       8080;
        client_body_buffer_size 10m;
        server_name  localhost;
        location / {
                proxy_pass      http://test;
        }
        
    }
}

缺点:DNS 服务器只能在 http 配域中全局配置

# 原生 nginx 使用 set 命令使用变量

将域名置于变量中,在对 proxy_pass 进行转发的时候域名调用变量,可以按照 valid,设置的时间参数间隔地对变量中的域名进行解析。

例:

server {
	listen       8080;
	client_body_buffer_size 10m;
	server_name  localhost;
	location / {
			resolver ip valid=3s;
			set $five "www.xxx.com:8080";
			proxy_pass      http://${five};
	}
	
}

缺点:upstream 中不支持设置变量,因此后端有多台的时候该方案不可行。

# Tengine

在 upstream 中配置 dynamic_resolve,在 location 配置域中指定 NDS 服务器,按照 valid 设置的时间间隔地进行地址解析。只支持 http 模块的动态域名解析

例:

http {
    upstream test {
        dynamic_resolve fallback=stale fail_timeout=30s;
        server  www.xxx.com:8080;
    }
    server {
        listen       8080;
        location / {
                resolver       ip     valid=3s;
                proxy_pass      http://test;
        }
	  }
}

缺点:需要将 nginx 的 bin 文件替换为 tengine 的 bin 文件。

\ No newline at end of file +Nginx 动态解析域名方案 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 应用场景:

由于有时候 nginx 代理的时候,第三方域名对应的 ip 可能发生变化,然而没有提前通知,然而如果不配置什么,nginx 又不能智能解析,因此 nginx 动态解析域名就比较重要。

# 使用模块 nginx-upstream-dynamic-servers

该模块在启动 nginx 的时候会对域名进行一次解析,解析完成后,在 DNS 服务器设定的 TTL 过期时间内不会再次更新,在 TTL 过期后则会再次发起域名解析请求更新域名所对应的 IP 地址。

需要在 nginx 的配置文件中的 http 配置域内指定使用的 DNS 服务器,在 upstream 中需要进行域名解析的 server 后面添加 resolve 参数。

例:

http {
    resolver    ip;
    upstream test {
        server  www.xxx.com:8080       resolve;
    }
    server {
        listen       8080;
        client_body_buffer_size 10m;
        server_name  localhost;
        location / {
        
                proxy_pass      http://test;
                
        }
        
    }
}

缺点:

1、每次解析域名之后,会从 DNS 服务器获取到改 DNS 的 TTL,在 TTL 期限内不会再次解析,所以如果目标域名发生改变,nginx 不会更新解析,知道 TTL 过期。

2、DNS 服务器在 http 配置域配置全,不能在 location 中细分指定。

# 使用模块 ngx_upstream_jdomain

在 http 配置域中配置 DNS 服务器,在 upstream 中按照这个模块的格式配置,支持设置每隔多少秒进行一次解析(抓包分析过设置 interval 可指定解析间隔),如果解析失败则使用缓存中的上一次解析结果的 IP 地址访问。

例:

http {
    resolver    ip;
    upstream test {
        jdomain  www.xxx.com port=8080 interval=10; #指定域名和端口,每隔 10 秒进行一次解析
    }
    server {
        listen       8080;
        client_body_buffer_size 10m;
        server_name  localhost;
        location / {
                proxy_pass      http://test;
        }
        
    }
}

缺点:DNS 服务器只能在 http 配域中全局配置

# 原生 nginx 使用 set 命令使用变量

将域名置于变量中,在对 proxy_pass 进行转发的时候域名调用变量,可以按照 valid,设置的时间参数间隔地对变量中的域名进行解析。

例:

server {
	listen       8080;
	client_body_buffer_size 10m;
	server_name  localhost;
	location / {
			resolver ip valid=3s;
			set $five "www.xxx.com:8080";
			proxy_pass      http://${five};
	}
	
}

缺点:upstream 中不支持设置变量,因此后端有多台的时候该方案不可行。

# Tengine

在 upstream 中配置 dynamic_resolve,在 location 配置域中指定 NDS 服务器,按照 valid 设置的时间间隔地进行地址解析。只支持 http 模块的动态域名解析

例:

http {
    upstream test {
        dynamic_resolve fallback=stale fail_timeout=30s;
        server  www.xxx.com:8080;
    }
    server {
        listen       8080;
        location / {
                resolver       ip     valid=3s;
                proxy_pass      http://test;
        }
	  }
}

缺点:需要将 nginx 的 bin 文件替换为 tengine 的 bin 文件。

\ No newline at end of file diff --git a/2022/11/30/Nginx配置stream踩坑/index.html b/2022/11/30/Nginx配置stream踩坑/index.html index c3debbe73..87a8f6c68 100644 --- a/2022/11/30/Nginx配置stream踩坑/index.html +++ b/2022/11/30/Nginx配置stream踩坑/index.html @@ -1 +1 @@ -Nginx 配置 stream 踩坑 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

stream 模块一般用于 TCP/UDP 数据流的代理和负载均衡,可以通过 stream 模块代理转发 TCP 消息。我是用来转发 mysql、gitee 等连接的,有天 ip 发生了变动导致连接不上。前期试过配置 resolver 114.114.114.114 valid=60s; 来动态解析域名,结果 stream 模块不支持 set 函数,这就导致 ip 变动后必须手动重启或者 reload 一下 nginx 才能正常连接。后面经过搜索发现有人说用 Tengine 替代 nginx 可以实现就试了试,结果发现 Tengine 只能实现 http 下的动态域名解析,至此问题依旧。没办法,我只能通过定时任务加脚本判断 ip 是否变动,如果变动就 reload 一下 nginx。

#!/bin/bash
#使用 crontab -e 命令添加定时任务 */1 * * * * sh /home/xxx/autoReloadNginx.sh
home="/home/xxx" #指定 home 路径,如果使用 `pwd` 则 domainIP.txt 生成在当前用户目录下
domain=xxx.xxx.cn
IP=`ping -4 -c 4 $domain | grep from | tail -n 1 | awk -F ' ' '{print $4}'`
regex="\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\b"
if [ `echo $IP | egrep $regex | wc -l` -eq 1 ]; then
        if [ ! -f "$home/domainIP.txt" ]; then
                touch $home/domainIP.txt
                echo $IP > $home/domainIP.txt
        else
                oldIP=`cat $home/domainIP.txt`
                if [ "$IP" != "$oldIP" ]; then
                        nginx -s reload
                        echo $IP > $home/domainIP.txt
                else
                        echo "The domain name ip has not changed"
                fi
        fi
else
        echo "The domain name resolution is incorrect"
fi
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +Nginx 配置 stream 踩坑 - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

stream 模块一般用于 TCP/UDP 数据流的代理和负载均衡,可以通过 stream 模块代理转发 TCP 消息。我是用来转发 mysql、gitee 等连接的,有天 ip 发生了变动导致连接不上。前期试过配置 resolver 114.114.114.114 valid=60s; 来动态解析域名,结果 stream 模块不支持 set 函数,这就导致 ip 变动后必须手动重启或者 reload 一下 nginx 才能正常连接。后面经过搜索发现有人说用 Tengine 替代 nginx 可以实现就试了试,结果发现 Tengine 只能实现 http 下的动态域名解析,至此问题依旧。没办法,我只能通过定时任务加脚本判断 ip 是否变动,如果变动就 reload 一下 nginx。

#!/bin/bash
#使用 crontab -e 命令添加定时任务 */1 * * * * sh /home/xxx/autoReloadNginx.sh
home="/home/xxx" #指定 home 路径,如果使用 `pwd` 则 domainIP.txt 生成在当前用户目录下
domain=xxx.xxx.cn
IP=`ping -4 -c 4 $domain | grep from | tail -n 1 | awk -F ' ' '{print $4}'`
regex="\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[1-9])\b"
if [ `echo $IP | egrep $regex | wc -l` -eq 1 ]; then
        if [ ! -f "$home/domainIP.txt" ]; then
                touch $home/domainIP.txt
                echo $IP > $home/domainIP.txt
        else
                oldIP=`cat $home/domainIP.txt`
                if [ "$IP" != "$oldIP" ]; then
                        nginx -s reload
                        echo $IP > $home/domainIP.txt
                else
                        echo "The domain name ip has not changed"
                fi
        fi
else
        echo "The domain name resolution is incorrect"
fi
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/11/30/将nginx替换为tengine/index.html b/2022/11/30/将nginx替换为tengine/index.html index 2dcb4c70a..afa0f727a 100644 --- a/2022/11/30/将nginx替换为tengine/index.html +++ b/2022/11/30/将nginx替换为tengine/index.html @@ -1 +1 @@ -将 nginx 替换为 tengine - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。从 2011 年 12 月开始,Tengine 成为一个开源项目。现在,它由 Tengine 团队开发和维护。Tengine 团队的核心成员来自于淘宝、搜狗等互联网企业。

tengine 简单来说就是淘宝自己基于 nginx 优化的网页引擎,在 nginx 原先基础上继续保持兼容,同时功能扩展,效率提高,可以看到目前淘宝网在这么多人同时使用的情况下依然稳定,我们足以相信 tengine,由于它是 nginx 的一个分生版本,所以几乎完全兼容 nginx,所以我认为 tengine 是搭建 lnmp 环境的不二之选。

# 下载

首先访问 tengine 官方网站,获取最新的下载地址。
wget http://tengine.taobao.org/download/tengine-2.3.3.tar.gz

# 获取编译参数

nginx -V

# 编译

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module
./configure 后面的参数是上一步获取的

# Make

make 或者 make -j 内核数
生成的文件在 objs 目录下

# 替换

停止 nginx 服务 service nginx stop
查看 nginx 目录 whereis nginx
备份旧 nginx mv /usr/sbin/nginx /usr/sbin/nginx.old
拷贝 objs 下的 nginx 替换旧 nginx cp ./objs/nginx /usr/sbin/
备份旧 so 文件
拷贝 objs 下的 so 文件替换旧的 so 文件 cp ./objs/*.so /usr/lib/nginx/modules/

# 测试

nginx -t 如果打印 test is successful 则表示替换成功。
然后执行 service nginx start 进行启动即可

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +将 nginx 替换为 tengine - Nginx - 服务 - Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 介绍

Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。从 2011 年 12 月开始,Tengine 成为一个开源项目。现在,它由 Tengine 团队开发和维护。Tengine 团队的核心成员来自于淘宝、搜狗等互联网企业。

tengine 简单来说就是淘宝自己基于 nginx 优化的网页引擎,在 nginx 原先基础上继续保持兼容,同时功能扩展,效率提高,可以看到目前淘宝网在这么多人同时使用的情况下依然稳定,我们足以相信 tengine,由于它是 nginx 的一个分生版本,所以几乎完全兼容 nginx,所以我认为 tengine 是搭建 lnmp 环境的不二之选。

# 下载

首先访问 tengine 官方网站,获取最新的下载地址。
wget http://tengine.taobao.org/download/tengine-2.3.3.tar.gz

# 获取编译参数

nginx -V

# 编译

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --without-http_uwsgi_module --without-http_scgi_module
./configure 后面的参数是上一步获取的

# Make

make 或者 make -j 内核数
生成的文件在 objs 目录下

# 替换

停止 nginx 服务 service nginx stop
查看 nginx 目录 whereis nginx
备份旧 nginx mv /usr/sbin/nginx /usr/sbin/nginx.old
拷贝 objs 下的 nginx 替换旧 nginx cp ./objs/nginx /usr/sbin/
备份旧 so 文件
拷贝 objs 下的 so 文件替换旧的 so 文件 cp ./objs/*.so /usr/lib/nginx/modules/

# 测试

nginx -t 如果打印 test is successful 则表示替换成功。
然后执行 service nginx start 进行启动即可

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/2022/12/02/KLineChart实现自定义指标画图/index.html b/2022/12/02/KLineChart实现自定义指标画图/index.html index fb5024fed..2aa16a80f 100644 --- a/2022/12/02/KLineChart实现自定义指标画图/index.html +++ b/2022/12/02/KLineChart实现自定义指标画图/index.html @@ -1 +1 @@ -KLineChart 实现自定义指标画图 - KLineChart - 解决问题 - 工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

本次任务是需要在一个指标图上通过点击标记画出此标记参与计算的数据范围、最高最低值、参考线等等,于是有了以下代码。代码仅供参考,如有错误的地方请指正!
7fd440be0502d0099427e7c74c4ebf29.jpg

# 模版代码

// 箱体指标
const boxDataScope = 300 // 箱体范围
// 黄金线参数
const goldenSectionA = 0.191
const goldenSectionB = 0.382
const goldenSectionC = 0.5
const goldenSectionD = 0.618
const goldenSectionE = 0.809
this.chart.addTechnicalIndicatorTemplate({
	name: 'custom_box_solid',
    shortName: '箱体',
    precision: 2,
    plots: [ //key 属性的值最好在主图数据范围内,否则 Y 轴的值会跟着变大可能会导致主图变成一条线
      { key: 'max', title: '最高:' },
      { key: 'min', title: '最低:' }
    ],
    calcParams: [boxDataScope, goldenSectionA, goldenSectionB, goldenSectionC, goldenSectionD, goldenSectionE],
    calcTechnicalIndicator: (dataList, { params, plots }) => {
      let allDatas = [] // 所有数据
      let selectedDatas = [] // 选中的数据
      for (let i = 0; i < dataList.length; i++) {
        let kLineData = dataList[i]
        if (new Date(dateConvert(kLineData.timestamp)).getTime() === getGlobalObject('boxId')) {
          const size = params[0]
          // 找出当前数据往前的 size 条数据(包含自己)
          let startData = i - size + 1
          if (startData < 0) {
            startData = 0
          }
          let endData = i + 1
          if (endData > dataList.length) {
            endData = dataList.length
          }
          selectedDatas = dataList.slice(startData, endData)
        }
        allDatas.push({
          timestamp: kLineData.timestamp
        })
      }
      // 找出选中数据中最高最低差价
      let max, min
      selectedDatas.forEach(function (item) {
        let value = item.close - item.close2
        if (!max || value > max) {
          max = value
        }
        if (!min || value < min) {
          min = value
        }
      })
	  // 返回指标最终数据(未选中的数据用空对象替换)
	  // 必须返回和 dataList 一样条数的数据,否则 title 不会显示
      return allDatas.map((data, i) => {
        let item = {
        }
        selectedDatas.map((selected, j) => {
          if (data.timestamp === selected.timestamp) {
            item.timestamp = selected.timestamp
            item.max = max
            item.min = min
          }
        })
        return item
      })
    },
    render: ({ ctx, dataSource, viewport, styles, xAxis, yAxis }) => {
      if (dataSource.technicalIndicatorDataList.length <= 0) { // 无指标数据则不处理
        return
      }
	  // X 轴起始像素
      let x = xAxis.convertToPixel(0)
      // 标记选中数据的起止位置
      let start
      let end = dataSource.technicalIndicatorDataList.length - 1
      dataSource.technicalIndicatorDataList.forEach(function (kLineData, i) {
        if (kLineData.timestamp) {
          if (!start) {
            start = i
          }
          if (i < end && !dataSource.technicalIndicatorDataList[i + 1].timestamp) {
            end = i
          }
          let max = kLineData.max
          let min = kLineData.min
          ctx.fillStyle = '#fff'
          ctx.textBaseline = 'middle'
          ctx.textAlign = 'center'
          // 画箱体
		  // 箱体颜色
		  ctx.strokeStyle = '#DC143C'
		  //y 轴最高点位置
		  let yHigh = yAxis.convertToPixel(max)
		  //y 轴最低点位置
		  let yLow = yAxis.convertToPixel(min)
		  ctx.beginPath()
		  // 画笔移动到数据的 x 轴起始点,y 轴最高点
		  ctx.moveTo(x, yHigh)
          if (i === start) { // 如果是第一条数据则需要画一条竖线
            ctx.lineTo(x, yLow) // 画竖线
            ctx.moveTo(x, yHigh) // 画笔移回
          }
          if (i === end) { // 如果是最后一条数据则需要画一条竖线
            ctx.lineTo(x, yLow) // 画竖线
            ctx.fillText(max, x + viewport.dataSpace, yHigh) // 标识箱体最高点的值
            ctx.moveTo(x, yLow) // 画笔移动到 Y 轴最低点
            ctx.fillText(min, x + viewport.dataSpace, yLow) // 标识箱体最低点的值
          } else { // 画两条横线,一条在 y 轴最高点,一条在 y 轴最低点
            ctx.lineTo(x + viewport.dataSpace, yHigh) //y 轴最高点横线
            ctx.moveTo(x, yLow) // 画笔移动到 y 轴最低点
            ctx.lineTo(x + viewport.dataSpace, yLow) //y 轴最低点横线
          }
          ctx.stroke()
          ctx.closePath()
          // 画黄金线
		  // 黄金线颜色
          ctx.strokeStyle = '#ffffff'
		  // 根据黄金线参数计算黄金线的值
          let goldenSectionLineA = (max - min) * goldenSectionA + min
          let goldenSectionLineB = (max - min) * goldenSectionB + min
          let goldenSectionLineC = (max - min) * goldenSectionC + min
          let goldenSectionLineD = (max - min) * goldenSectionD + min
          let goldenSectionLineE = (max - min) * goldenSectionE + min
		  // 根据黄金线的值获取 Y 轴高度
          let yA = yAxis.convertToPixel(goldenSectionLineA)
          let yB = yAxis.convertToPixel(goldenSectionLineB)
          let yC = yAxis.convertToPixel(goldenSectionLineC)
          let yD = yAxis.convertToPixel(goldenSectionLineD)
          let yE = yAxis.convertToPixel(goldenSectionLineE)
          ctx.beginPath()
		  // 画第一条黄金线
          ctx.moveTo(x, yA)
          ctx.lineTo(x + viewport.barSpace / 2, yA)
          if (i === end) { // 是否最后一条数据,如果是则需要标识黄金线的值
		    // 标识第一条黄金线的值
            ctx.fillText(goldenSectionLineA.toFixed(2), x + viewport.dataSpace, yA)
          }
		  // 画第二条黄金线
          ctx.moveTo(x, yB)
          ctx.lineTo(x + viewport.barSpace / 2, yB)
          if (i === end) {
            ctx.fillText(goldenSectionLineB.toFixed(2), x + viewport.dataSpace, yB)
          }
		  // 画第三条黄金线
          ctx.moveTo(x, yC)
          ctx.lineTo(x + viewport.barSpace / 2, yC)
          if (i === end) {
            ctx.fillText(goldenSectionLineC.toFixed(2), x + viewport.dataSpace, yC)
          }
		  // 画第四条黄金线
          ctx.moveTo(x, yD)
          ctx.lineTo(x + viewport.barSpace / 2, yD)
          if (i === end) {
            ctx.fillText(goldenSectionLineD.toFixed(2), x + viewport.dataSpace, yD)
          }
		  // 画第五条黄金线
          ctx.moveTo(x, yE)
          ctx.lineTo(x + viewport.barSpace / 2, yE)
          if (i === end) {
            ctx.fillText(goldenSectionLineE.toFixed(2), x + viewport.dataSpace, yE)
          }
          ctx.stroke()
          ctx.closePath()
        }
		// 计算 X 轴的下一个位置
        x += viewport.dataSpace
      })
    }
})

# 结语

以上代码只是箱体的指标模版,还需要根据业务逻辑在标记上实现点击事件,然后通过事件动态添加移除箱体指标。

\ No newline at end of file +KLineChart 实现自定义指标画图 - KLineChart - 解决问题 - 工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

本次任务是需要在一个指标图上通过点击标记画出此标记参与计算的数据范围、最高最低值、参考线等等,于是有了以下代码。代码仅供参考,如有错误的地方请指正!
7fd440be0502d0099427e7c74c4ebf29.jpg

# 模版代码

// 箱体指标
const boxDataScope = 300 // 箱体范围
// 黄金线参数
const goldenSectionA = 0.191
const goldenSectionB = 0.382
const goldenSectionC = 0.5
const goldenSectionD = 0.618
const goldenSectionE = 0.809
this.chart.addTechnicalIndicatorTemplate({
	name: 'custom_box_solid',
    shortName: '箱体',
    precision: 2,
    plots: [ //key 属性的值最好在主图数据范围内,否则 Y 轴的值会跟着变大可能会导致主图变成一条线
      { key: 'max', title: '最高:' },
      { key: 'min', title: '最低:' }
    ],
    calcParams: [boxDataScope, goldenSectionA, goldenSectionB, goldenSectionC, goldenSectionD, goldenSectionE],
    calcTechnicalIndicator: (dataList, { params, plots }) => {
      let allDatas = [] // 所有数据
      let selectedDatas = [] // 选中的数据
      for (let i = 0; i < dataList.length; i++) {
        let kLineData = dataList[i]
        if (new Date(dateConvert(kLineData.timestamp)).getTime() === getGlobalObject('boxId')) {
          const size = params[0]
          // 找出当前数据往前的 size 条数据(包含自己)
          let startData = i - size + 1
          if (startData < 0) {
            startData = 0
          }
          let endData = i + 1
          if (endData > dataList.length) {
            endData = dataList.length
          }
          selectedDatas = dataList.slice(startData, endData)
        }
        allDatas.push({
          timestamp: kLineData.timestamp
        })
      }
      // 找出选中数据中最高最低差价
      let max, min
      selectedDatas.forEach(function (item) {
        let value = item.close - item.close2
        if (!max || value > max) {
          max = value
        }
        if (!min || value < min) {
          min = value
        }
      })
	  // 返回指标最终数据(未选中的数据用空对象替换)
	  // 必须返回和 dataList 一样条数的数据,否则 title 不会显示
      return allDatas.map((data, i) => {
        let item = {
        }
        selectedDatas.map((selected, j) => {
          if (data.timestamp === selected.timestamp) {
            item.timestamp = selected.timestamp
            item.max = max
            item.min = min
          }
        })
        return item
      })
    },
    render: ({ ctx, dataSource, viewport, styles, xAxis, yAxis }) => {
      if (dataSource.technicalIndicatorDataList.length <= 0) { // 无指标数据则不处理
        return
      }
	  // X 轴起始像素
      let x = xAxis.convertToPixel(0)
      // 标记选中数据的起止位置
      let start
      let end = dataSource.technicalIndicatorDataList.length - 1
      dataSource.technicalIndicatorDataList.forEach(function (kLineData, i) {
        if (kLineData.timestamp) {
          if (!start) {
            start = i
          }
          if (i < end && !dataSource.technicalIndicatorDataList[i + 1].timestamp) {
            end = i
          }
          let max = kLineData.max
          let min = kLineData.min
          ctx.fillStyle = '#fff'
          ctx.textBaseline = 'middle'
          ctx.textAlign = 'center'
          // 画箱体
		  // 箱体颜色
		  ctx.strokeStyle = '#DC143C'
		  //y 轴最高点位置
		  let yHigh = yAxis.convertToPixel(max)
		  //y 轴最低点位置
		  let yLow = yAxis.convertToPixel(min)
		  ctx.beginPath()
		  // 画笔移动到数据的 x 轴起始点,y 轴最高点
		  ctx.moveTo(x, yHigh)
          if (i === start) { // 如果是第一条数据则需要画一条竖线
            ctx.lineTo(x, yLow) // 画竖线
            ctx.moveTo(x, yHigh) // 画笔移回
          }
          if (i === end) { // 如果是最后一条数据则需要画一条竖线
            ctx.lineTo(x, yLow) // 画竖线
            ctx.fillText(max, x + viewport.dataSpace, yHigh) // 标识箱体最高点的值
            ctx.moveTo(x, yLow) // 画笔移动到 Y 轴最低点
            ctx.fillText(min, x + viewport.dataSpace, yLow) // 标识箱体最低点的值
          } else { // 画两条横线,一条在 y 轴最高点,一条在 y 轴最低点
            ctx.lineTo(x + viewport.dataSpace, yHigh) //y 轴最高点横线
            ctx.moveTo(x, yLow) // 画笔移动到 y 轴最低点
            ctx.lineTo(x + viewport.dataSpace, yLow) //y 轴最低点横线
          }
          ctx.stroke()
          ctx.closePath()
          // 画黄金线
		  // 黄金线颜色
          ctx.strokeStyle = '#ffffff'
		  // 根据黄金线参数计算黄金线的值
          let goldenSectionLineA = (max - min) * goldenSectionA + min
          let goldenSectionLineB = (max - min) * goldenSectionB + min
          let goldenSectionLineC = (max - min) * goldenSectionC + min
          let goldenSectionLineD = (max - min) * goldenSectionD + min
          let goldenSectionLineE = (max - min) * goldenSectionE + min
		  // 根据黄金线的值获取 Y 轴高度
          let yA = yAxis.convertToPixel(goldenSectionLineA)
          let yB = yAxis.convertToPixel(goldenSectionLineB)
          let yC = yAxis.convertToPixel(goldenSectionLineC)
          let yD = yAxis.convertToPixel(goldenSectionLineD)
          let yE = yAxis.convertToPixel(goldenSectionLineE)
          ctx.beginPath()
		  // 画第一条黄金线
          ctx.moveTo(x, yA)
          ctx.lineTo(x + viewport.barSpace / 2, yA)
          if (i === end) { // 是否最后一条数据,如果是则需要标识黄金线的值
		    // 标识第一条黄金线的值
            ctx.fillText(goldenSectionLineA.toFixed(2), x + viewport.dataSpace, yA)
          }
		  // 画第二条黄金线
          ctx.moveTo(x, yB)
          ctx.lineTo(x + viewport.barSpace / 2, yB)
          if (i === end) {
            ctx.fillText(goldenSectionLineB.toFixed(2), x + viewport.dataSpace, yB)
          }
		  // 画第三条黄金线
          ctx.moveTo(x, yC)
          ctx.lineTo(x + viewport.barSpace / 2, yC)
          if (i === end) {
            ctx.fillText(goldenSectionLineC.toFixed(2), x + viewport.dataSpace, yC)
          }
		  // 画第四条黄金线
          ctx.moveTo(x, yD)
          ctx.lineTo(x + viewport.barSpace / 2, yD)
          if (i === end) {
            ctx.fillText(goldenSectionLineD.toFixed(2), x + viewport.dataSpace, yD)
          }
		  // 画第五条黄金线
          ctx.moveTo(x, yE)
          ctx.lineTo(x + viewport.barSpace / 2, yE)
          if (i === end) {
            ctx.fillText(goldenSectionLineE.toFixed(2), x + viewport.dataSpace, yE)
          }
          ctx.stroke()
          ctx.closePath()
        }
		// 计算 X 轴的下一个位置
        x += viewport.dataSpace
      })
    }
})

# 结语

以上代码只是箱体的指标模版,还需要根据业务逻辑在标记上实现点击事件,然后通过事件动态添加移除箱体指标。

\ No newline at end of file diff --git a/2022/12/05/Win10彻底关闭wsappx进程/index.html b/2022/12/05/Win10彻底关闭wsappx进程/index.html index c41a34972..ea787a9d2 100644 --- a/2022/12/05/Win10彻底关闭wsappx进程/index.html +++ b/2022/12/05/Win10彻底关闭wsappx进程/index.html @@ -1 +1 @@ -Win10 彻底关闭 wsappx 进程 - 解决问题 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

最近重装了家里一台 mini 电脑,把系统升级成了最新的 win10 系统。但是使用起来却异常卡顿,查看任务管理器发现有个 wsappx 进程占用 cpu 严重。于是百度搜索得知它是微软商店的依赖进程,而我根本就用不上,所以直接禁用。

# 方法一

  1. 开始菜单点击 “开始 / 应用商店” 菜单项。
  2. 接着就会打开应用商店窗口,在窗口中点击个人头像的图标。
  3. 在弹出的菜单中点击 “设置” 菜单项。
  4. 在打开的应用商店设置窗口中,找到自动更新应用一项。
  5. 点击该项下面的开关,把该项下面的开关设置为关即可。

# 方法二

  1. win 键 + r,输入 regedit
  2. 计算机 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppXSvc 将 3 改为 4
  3. 计算机 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ClipSVC 将 3 改为 4
  4. 重启电脑
\ No newline at end of file +Win10 彻底关闭 wsappx 进程 - 解决问题 - Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 引言

最近重装了家里一台 mini 电脑,把系统升级成了最新的 win10 系统。但是使用起来却异常卡顿,查看任务管理器发现有个 wsappx 进程占用 cpu 严重。于是百度搜索得知它是微软商店的依赖进程,而我根本就用不上,所以直接禁用。

# 方法一

  1. 开始菜单点击 “开始 / 应用商店” 菜单项。
  2. 接着就会打开应用商店窗口,在窗口中点击个人头像的图标。
  3. 在弹出的菜单中点击 “设置” 菜单项。
  4. 在打开的应用商店设置窗口中,找到自动更新应用一项。
  5. 点击该项下面的开关,把该项下面的开关设置为关即可。

# 方法二

  1. win 键 + r,输入 regedit
  2. 计算机 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppXSvc 将 3 改为 4
  3. 计算机 \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ClipSVC 将 3 改为 4
  4. 重启电脑
\ No newline at end of file diff --git a/404.html b/404.html index abdebca45..cd9ced434 100644 --- a/404.html +++ b/404.html @@ -1 +1 @@ -Σ( ° △ °|||)︴404!何も見えない | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
Σ( ° △ °|||)︴404!何も見えない
\ No newline at end of file +Σ( ° △ °|||)︴404!何も見えない | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
Σ( ° △ °|||)︴404!何も見えない
\ No newline at end of file diff --git a/about/me.html b/about/me.html index 8982d33e0..3be4f8a4a 100644 --- a/about/me.html +++ b/about/me.html @@ -1 +1 @@ -| ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 个人信息

  • 姓名:李海涛
  • 性别:男
  • 学历:本科
  • 生肖:鼠
  • 星座:天秤

# 个人爱好

  • 跑步
  • 篮球
  • 听歌
  • 电影

# 编程语言

  • java
  • python
  • php

# 项目经历 - 近期

  1. 智能量化决策交易系统

    该项目主要用于对期货、股票等进行智能化交易,会根据用户事先设置的规则决策是否买卖,并
    给出信号、收益、最大回撤等详细的统计报告及分析报表。该项目采用Spring Cloud微服务解决方案
    ,主要功能模块分为行情采集、策略计算、交易信号处理、账户交易服务、ctp网关、策略统计、消息
    推送等。该项目使用IntellIJ做为主要开发工具,前端使用vue框架,图表采用tradingview、
    highchart等。后端使用mybatis、mysql对部分用户、策略、配置信息进行存储,kafka做为行情数据
    、交易信号等消息中间件。使用redis存储当日分时行情等临时数据,mongodb用于存储分析结果、信
    号历史,hbase存储期货行情等详细数据。使用netty框架实现实时消息推送。
  2. IWB-EX 交易平台

    该项目主要依托流行的区块链技术进行白酒的销售。以虚拟币为货币,白酒为等价商品进行交易。
    当虚拟币价格过低时用户可以选择实物白酒进行提货。使用IntellIJ做为开发工具,采用的技术有
    springMVC、mysql、thymeleaf等。
  3. 废品回收管理平台

    该项目主要为废品回收公司提供废品的进出库管理和统计,并打印详细价格单据等。该项目分为
    两个平台,给用户使用的入库填表平台和给企业管理人员使用的审核、管理后台。使用IntellIJ做为
    开发工具,采用的技术有springMVC、mysql、freemarker等。
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file +| ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

# 个人信息

  • 姓名:李海涛
  • 性别:男
  • 学历:本科
  • 生肖:鼠
  • 星座:天秤

# 个人爱好

  • 跑步
  • 篮球
  • 听歌
  • 电影

# 编程语言

  • java
  • python
  • php

# 项目经历 - 近期

  1. 智能量化决策交易系统

    该项目主要用于对期货、股票等进行智能化交易,会根据用户事先设置的规则决策是否买卖,并
    给出信号、收益、最大回撤等详细的统计报告及分析报表。该项目采用Spring Cloud微服务解决方案
    ,主要功能模块分为行情采集、策略计算、交易信号处理、账户交易服务、ctp网关、策略统计、消息
    推送等。该项目使用IntellIJ做为主要开发工具,前端使用vue框架,图表采用tradingview、
    highchart等。后端使用mybatis、mysql对部分用户、策略、配置信息进行存储,kafka做为行情数据
    、交易信号等消息中间件。使用redis存储当日分时行情等临时数据,mongodb用于存储分析结果、信
    号历史,hbase存储期货行情等详细数据。使用netty框架实现实时消息推送。
  2. IWB-EX 交易平台

    该项目主要依托流行的区块链技术进行白酒的销售。以虚拟币为货币,白酒为等价商品进行交易。
    当虚拟币价格过低时用户可以选择实物白酒进行提货。使用IntellIJ做为开发工具,采用的技术有
    springMVC、mysql、thymeleaf等。
  3. 废品回收管理平台

    该项目主要为废品回收公司提供废品的进出库管理和统计,并打印详细价格单据等。该项目分为
    两个平台,给用户使用的入库填表平台和给企业管理人员使用的审核、管理后台。使用IntellIJ做为
    开发工具,采用的技术有springMVC、mysql、freemarker等。
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Hito Li 微信支付

微信支付

Hito Li 支付宝

支付宝

\ No newline at end of file diff --git a/archives/2022/09/index.html b/archives/2022/09/index.html index cb157cb7b..82c2fcfc4 100644 --- a/archives/2022/09/index.html +++ b/archives/2022/09/index.html @@ -1 +1 @@ -2022 年 / 09 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 / 09 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/10/index.html b/archives/2022/10/index.html index 37d5d9bdd..a63547583 100644 --- a/archives/2022/10/index.html +++ b/archives/2022/10/index.html @@ -1 +1 @@ -2022 年 / 10 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 / 10 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/10/page/2/index.html b/archives/2022/10/page/2/index.html index e6c248898..947151302 100644 --- a/archives/2022/10/page/2/index.html +++ b/archives/2022/10/page/2/index.html @@ -1 +1 @@ -2022 年 / 10 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 / 10 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/11/index.html b/archives/2022/11/index.html index 362957094..71fca4c2b 100644 --- a/archives/2022/11/index.html +++ b/archives/2022/11/index.html @@ -1 +1 @@ -2022 年 / 11 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 / 11 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/11/page/2/index.html b/archives/2022/11/page/2/index.html index 057f029ad..5451baf82 100644 --- a/archives/2022/11/page/2/index.html +++ b/archives/2022/11/page/2/index.html @@ -1 +1 @@ -2022 年 / 11 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 / 11 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html index cafb035ff..ecc436fe6 100644 --- a/archives/2022/12/index.html +++ b/archives/2022/12/index.html @@ -1 +1 @@ -2022 年 / 12 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 / 12 月 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/index.html b/archives/2022/index.html index 16223c29e..dd7ec9e7b 100644 --- a/archives/2022/index.html +++ b/archives/2022/index.html @@ -1 +1 @@ -2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/page/2/index.html b/archives/2022/page/2/index.html index 1290a5e8b..c98d68bc5 100644 --- a/archives/2022/page/2/index.html +++ b/archives/2022/page/2/index.html @@ -1 +1 @@ -2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/page/3/index.html b/archives/2022/page/3/index.html index cd90c1fd8..f165e2729 100644 --- a/archives/2022/page/3/index.html +++ b/archives/2022/page/3/index.html @@ -1 +1 @@ -2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/2022/page/4/index.html b/archives/2022/page/4/index.html index e6dce3d0d..7caba0dbb 100644 --- a/archives/2022/page/4/index.html +++ b/archives/2022/page/4/index.html @@ -1 +1 @@ -2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +2022 年 - 归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html index fc58443bf..2fcb24343 100644 --- a/archives/index.html +++ b/archives/index.html @@ -1 +1 @@ -归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

首页 / 目前共计 36 篇文章。 还行 继续努力。

2022 年/12 月 ( 2 )

2022 年/11 月 ( 12 )

2022 年/10 月 ( 13 )

2022 年/09 月 ( 9 )

\ No newline at end of file +归档 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

首页 / 目前共计 36 篇文章。 还行 继续努力。

2022 年/12 月 ( 2 )

2022 年/11 月 ( 12 )

2022 年/10 月 ( 13 )

2022 年/09 月 ( 9 )

\ No newline at end of file diff --git a/atom.xml b/atom.xml index 3e67279ce..c1c5b368d 100644 --- a/atom.xml +++ b/atom.xml @@ -64,8 +64,8 @@ - + 2022-12-02T07:16:00.000Z diff --git a/categories/Linux/Shell/index.html b/categories/Linux/Shell/index.html index 6e161136c..0ab2a2768 100644 --- a/categories/Linux/Shell/index.html +++ b/categories/Linux/Shell/index.html @@ -1 +1 @@ -分类:Shell | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Shell | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Linux/index.html b/categories/Linux/index.html index 3396a6e72..6198b2f6c 100644 --- a/categories/Linux/index.html +++ b/categories/Linux/index.html @@ -1 +1 @@ -分类:Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Linux/page/2/index.html b/categories/Linux/page/2/index.html index a211418d0..39d585ad3 100644 --- a/categories/Linux/page/2/index.html +++ b/categories/Linux/page/2/index.html @@ -1 +1 @@ -分类:Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Linux | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Linux/服务/Nginx/index.html b/categories/Linux/服务/Nginx/index.html index 8c6970ae9..5fe844ac7 100644 --- a/categories/Linux/服务/Nginx/index.html +++ b/categories/Linux/服务/Nginx/index.html @@ -1 +1 @@ -分类:Nginx | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Nginx | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Linux/服务/index.html b/categories/Linux/服务/index.html index e1f5c25fd..7f71d8670 100644 --- a/categories/Linux/服务/index.html +++ b/categories/Linux/服务/index.html @@ -1 +1 @@ -分类:服务 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:服务 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Linux/项目部署/Vue/index.html b/categories/Linux/项目部署/Vue/index.html index 1bfca94cf..10991fe08 100644 --- a/categories/Linux/项目部署/Vue/index.html +++ b/categories/Linux/项目部署/Vue/index.html @@ -1 +1 @@ -分类:Vue | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Vue | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Linux/项目部署/index.html b/categories/Linux/项目部署/index.html index 817011acb..41cc0d97f 100644 --- a/categories/Linux/项目部署/index.html +++ b/categories/Linux/项目部署/index.html @@ -1 +1 @@ -分类:项目部署 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:项目部署 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Windows/index.html b/categories/Windows/index.html index e425f95f3..3d8ee52f4 100644 --- a/categories/Windows/index.html +++ b/categories/Windows/index.html @@ -1 +1 @@ -分类:Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Windows | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Windows/工具/index.html b/categories/Windows/工具/index.html index 1e126c45c..dd8bc49f5 100644 --- a/categories/Windows/工具/index.html +++ b/categories/Windows/工具/index.html @@ -1 +1 @@ -分类:工具 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:工具 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/Windows/解决问题/index.html b/categories/Windows/解决问题/index.html index 9a73599b6..88f76e7fc 100644 --- a/categories/Windows/解决问题/index.html +++ b/categories/Windows/解决问题/index.html @@ -1 +1 @@ -分类:解决问题 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:解决问题 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/index.html b/categories/index.html index 2ff11b567..fca82f2a9 100644 --- a/categories/index.html +++ b/categories/index.html @@ -1 +1 @@ -全部分类 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +全部分类 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/工作/index.html b/categories/工作/index.html index 185ff010b..b088f18ee 100644 --- a/categories/工作/index.html +++ b/categories/工作/index.html @@ -1 +1 @@ -分类:工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:工作 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/工作/解决问题/KLineChart/index.html b/categories/工作/解决问题/KLineChart/index.html index 70b9188f0..7d60ffa74 100644 --- a/categories/工作/解决问题/KLineChart/index.html +++ b/categories/工作/解决问题/KLineChart/index.html @@ -1 +1 @@ -分类:KLineChart | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:KLineChart | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/工作/解决问题/index.html b/categories/工作/解决问题/index.html index 50ad4fcf1..05f41312b 100644 --- a/categories/工作/解决问题/index.html +++ b/categories/工作/解决问题/index.html @@ -1 +1 @@ -分类:解决问题 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:解决问题 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/极空间/Docker/Hexo/index.html b/categories/极空间/Docker/Hexo/index.html index 68add1888..ff5bb5fbf 100644 --- a/categories/极空间/Docker/Hexo/index.html +++ b/categories/极空间/Docker/Hexo/index.html @@ -1 +1 @@ -分类:Hexo | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Hexo | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/极空间/Docker/index.html b/categories/极空间/Docker/index.html index 59c94e636..dd2d0ab9d 100644 --- a/categories/极空间/Docker/index.html +++ b/categories/极空间/Docker/index.html @@ -1 +1 @@ -分类:Docker | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:Docker | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/极空间/index.html b/categories/极空间/index.html index 255c86524..db7019fff 100644 --- a/categories/极空间/index.html +++ b/categories/极空间/index.html @@ -1 +1 @@ -分类:极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/生活/index.html b/categories/生活/index.html index 4c753be8a..24bce8d9a 100644 --- a/categories/生活/index.html +++ b/categories/生活/index.html @@ -1 +1 @@ -分类:生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:生活 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/生活/心得体会/index.html b/categories/生活/心得体会/index.html index 09807d44e..876a000f7 100644 --- a/categories/生活/心得体会/index.html +++ b/categories/生活/心得体会/index.html @@ -1 +1 @@ -分类:心得体会 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:心得体会 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/categories/生活/心情/index.html b/categories/生活/心情/index.html index 6971139a4..5a5501106 100644 --- a/categories/生活/心情/index.html +++ b/categories/生活/心情/index.html @@ -1 +1 @@ -分类:心情 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file +分类:心情 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
\ No newline at end of file diff --git a/feed.json b/feed.json index 7eec783bb..dbcdef350 100644 --- a/feed.json +++ b/feed.json @@ -30,8 +30,8 @@ "解决问题", "KLineChart", "KLineChart", - "自定义指标", - "K线" + "K线", + "自定义指标" ] }, { diff --git a/index.html b/index.html index af47d6d7d..e7530ae59 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

文章列表

391 1 分钟

# 引言 最近重装了家里一台 mini 电脑,把系统升级成了最新的 win10 系统。但是使用起来却异常卡顿,查看任务管理器发现有个 wsappx 进程占用 cpu 严重。于是百度搜索得知它是微软商店的依赖进程,而我根本就用不上,所以直接禁用。 # 方法一 开始菜单点击 “开始 / 应用商店” 菜单项。 接着就会打开应用商店窗口,在窗口中点击个人头像的图标。 在弹出的菜单中点击 “设置” 菜单项。 在打开的应用商店设置窗口中,找到自动更新应用一项。 点击该项下面的开关,把该项下面的开关设置为关即可。 # 方法二 win 键 + r,输入 regedit 计算机...
4.4k 4 分钟

# 引言 本次任务是需要在一个指标图上通过点击标记画出此标记参与计算的数据范围、最高最低值、参考线等等,于是有了以下代码。代码仅供参考,如有错误的地方请指正! # 模版代码 // 箱体指标const boxDataScope = 300 // 箱体范围// 黄金线参数const goldenSectionA = 0.191const goldenSectionB = 0.382const goldenSectionC = 0.5const goldenSectionD = 0.618const goldenSectionE =...
978 1 分钟

# 介绍 Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。从 2011 年 12 月开始,Tengine 成为一个开源项目。现在,它由 Tengine 团队开发和维护。Tengine 团队的核心成员来自于淘宝、搜狗等互联网企业。 tengine 简单来说就是淘宝自己基于 nginx 优化的网页引擎,在 nginx 原先基础上继续保持兼容,同时功能扩展,效率提高,可以看到目前淘宝网在这么多人同时使用的情况下依然稳定,我们足以相信 tengine,由于它是 nginx...
1.6k 1 分钟

# 应用场景: 由于有时候 nginx 代理的时候,第三方域名对应的 ip 可能发生变化,然而没有提前通知,然而如果不配置什么,nginx 又不能智能解析,因此 nginx 动态解析域名就比较重要。 # 使用模块 nginx-upstream-dynamic-servers 该模块在启动 nginx 的时候会对域名进行一次解析,解析完成后,在 DNS 服务器设定的 TTL 过期时间内不会再次更新,在 TTL 过期后则会再次发起域名解析请求更新域名所对应的 IP 地址。 需要在 nginx 的配置文件中的 http 配置域内指定使用的 DNS 服务器,在 upstream 中需要进行域名解析的...
1k 1 分钟

# 引言 stream 模块一般用于 TCP/UDP 数据流的代理和负载均衡,可以通过 stream 模块代理转发 TCP 消息。我是用来转发 mysql、gitee 等连接的,有天 ip 发生了变动导致连接不上。前期试过配置 resolver 114.114.114.114 valid=60s; 来动态解析域名,结果 stream 模块不支持 set 函数,这就导致 ip 变动后必须手动重启或者 reload 一下 nginx 才能正常连接。后面经过搜索发现有人说用 Tengine 替代 nginx 可以实现就试了试,结果发现 Tengine 只能实现 http...
2.1k 2 分钟

# 引言 最近接到一个任务是通过 KLineChart✔️8.6.1 实现在一幅图上画两个合约的蜡烛图。研究 api 发现并没有通过配置实现的方法,于是联系作者沟通得知需要自己画图实现。于是有了本篇文章。 # 添加模版 let shortName = this.constant.periodTypeEnum.getNameByCode(this.klineType) + ' 合约2:' + this.currentInstrumentIdthis.chart.addTechnicalIndicatorTemplate(&#123; name:...
534 1 分钟

# 问题描述 今天无意中发现原本能正常增加的 id 突然不变了,查看 sql 发现是取的对应表的自增 id。虽然存到表中的新数据自增 id 变化了,但返回的 id 总是不变。经过查询发现表的自增 id 是存在 information_schema 库中的 tables 表中。tables 表中存储了所有表的对应信息,其中有个 auto_increment 字段存储的就是对应表的下一个自增值。但是 mysql 在新版本中修改了此值的更新规则,老版本中是实时更新,新版本修改为 24 小时更新一次。为了不修改原代码中的逻辑,只能通过修改 mysql 配置使项目正常工作了。 #...
937 1 分钟

# 引言 很多朋友安装了 mysql 后不知道可以用工具管理,所以专门找了两个数据库管理工具方便大家使用。 # Navicat 下载 安装一路下一步即可 (注意:安装完成后先不要运行) 注册 1、运行注册机 2、修改 Your Name(可不改) 3、点击 Patch(此时会提示:navicat.exe - x64 -&gt; Cracked) 4、运行 navicat 5、点击第一个 Generate 获取注册码 (Your Name 上一行) 6、点击 Copy 然后粘贴到 navicat 窗口上(也可能会自动粘贴进去) 7、点击 navicat...
638 1 分钟

# 引言 今天在部署 vue 项目时发现生产环境的端口只有一个,而且被多个项目公用了,刚好此项目又没有配置服务名而是直接使用的根路径。没办法只有修改项目配置重新编译了! # 配置 在项目根目录添加两个文件。 .env.alpha NODE_ENV = 'production'VUE_APP_BASE_URL = '/'.env.prod NODE_ENV = 'production'VUE_APP_BASE_URL = '/projectName' 在 package.json...
6k 5 分钟

# 引言 所有配置方法和介绍均来至于网络搜索汇总,主要用于方便后期巩固学习。 # 何为反向代理 在介绍反向代理之前,先来了解一下正向代理。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问...
\ No newline at end of file +☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣

文章列表

391 1 分钟

# 引言 最近重装了家里一台 mini 电脑,把系统升级成了最新的 win10 系统。但是使用起来却异常卡顿,查看任务管理器发现有个 wsappx 进程占用 cpu 严重。于是百度搜索得知它是微软商店的依赖进程,而我根本就用不上,所以直接禁用。 # 方法一 开始菜单点击 “开始 / 应用商店” 菜单项。 接着就会打开应用商店窗口,在窗口中点击个人头像的图标。 在弹出的菜单中点击 “设置” 菜单项。 在打开的应用商店设置窗口中,找到自动更新应用一项。 点击该项下面的开关,把该项下面的开关设置为关即可。 # 方法二 win 键 + r,输入 regedit 计算机...
4.4k 4 分钟

# 引言 本次任务是需要在一个指标图上通过点击标记画出此标记参与计算的数据范围、最高最低值、参考线等等,于是有了以下代码。代码仅供参考,如有错误的地方请指正! # 模版代码 // 箱体指标const boxDataScope = 300 // 箱体范围// 黄金线参数const goldenSectionA = 0.191const goldenSectionB = 0.382const goldenSectionC = 0.5const goldenSectionD = 0.618const goldenSectionE =...
978 1 分钟

# 介绍 Tengine 的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的 Web 平台。从 2011 年 12 月开始,Tengine 成为一个开源项目。现在,它由 Tengine 团队开发和维护。Tengine 团队的核心成员来自于淘宝、搜狗等互联网企业。 tengine 简单来说就是淘宝自己基于 nginx 优化的网页引擎,在 nginx 原先基础上继续保持兼容,同时功能扩展,效率提高,可以看到目前淘宝网在这么多人同时使用的情况下依然稳定,我们足以相信 tengine,由于它是 nginx...
1.6k 1 分钟

# 应用场景: 由于有时候 nginx 代理的时候,第三方域名对应的 ip 可能发生变化,然而没有提前通知,然而如果不配置什么,nginx 又不能智能解析,因此 nginx 动态解析域名就比较重要。 # 使用模块 nginx-upstream-dynamic-servers 该模块在启动 nginx 的时候会对域名进行一次解析,解析完成后,在 DNS 服务器设定的 TTL 过期时间内不会再次更新,在 TTL 过期后则会再次发起域名解析请求更新域名所对应的 IP 地址。 需要在 nginx 的配置文件中的 http 配置域内指定使用的 DNS 服务器,在 upstream 中需要进行域名解析的...
1k 1 分钟

# 引言 stream 模块一般用于 TCP/UDP 数据流的代理和负载均衡,可以通过 stream 模块代理转发 TCP 消息。我是用来转发 mysql、gitee 等连接的,有天 ip 发生了变动导致连接不上。前期试过配置 resolver 114.114.114.114 valid=60s; 来动态解析域名,结果 stream 模块不支持 set 函数,这就导致 ip 变动后必须手动重启或者 reload 一下 nginx 才能正常连接。后面经过搜索发现有人说用 Tengine 替代 nginx 可以实现就试了试,结果发现 Tengine 只能实现 http...
2.1k 2 分钟

# 引言 最近接到一个任务是通过 KLineChart✔️8.6.1 实现在一幅图上画两个合约的蜡烛图。研究 api 发现并没有通过配置实现的方法,于是联系作者沟通得知需要自己画图实现。于是有了本篇文章。 # 添加模版 let shortName = this.constant.periodTypeEnum.getNameByCode(this.klineType) + ' 合约2:' + this.currentInstrumentIdthis.chart.addTechnicalIndicatorTemplate(&#123; name:...
534 1 分钟

# 问题描述 今天无意中发现原本能正常增加的 id 突然不变了,查看 sql 发现是取的对应表的自增 id。虽然存到表中的新数据自增 id 变化了,但返回的 id 总是不变。经过查询发现表的自增 id 是存在 information_schema 库中的 tables 表中。tables 表中存储了所有表的对应信息,其中有个 auto_increment 字段存储的就是对应表的下一个自增值。但是 mysql 在新版本中修改了此值的更新规则,老版本中是实时更新,新版本修改为 24 小时更新一次。为了不修改原代码中的逻辑,只能通过修改 mysql 配置使项目正常工作了。 #...
937 1 分钟

# 引言 很多朋友安装了 mysql 后不知道可以用工具管理,所以专门找了两个数据库管理工具方便大家使用。 # Navicat 下载 安装一路下一步即可 (注意:安装完成后先不要运行) 注册 1、运行注册机 2、修改 Your Name(可不改) 3、点击 Patch(此时会提示:navicat.exe - x64 -&gt; Cracked) 4、运行 navicat 5、点击第一个 Generate 获取注册码 (Your Name 上一行) 6、点击 Copy 然后粘贴到 navicat 窗口上(也可能会自动粘贴进去) 7、点击 navicat...
638 1 分钟

# 引言 今天在部署 vue 项目时发现生产环境的端口只有一个,而且被多个项目公用了,刚好此项目又没有配置服务名而是直接使用的根路径。没办法只有修改项目配置重新编译了! # 配置 在项目根目录添加两个文件。 .env.alpha NODE_ENV = 'production'VUE_APP_BASE_URL = '/'.env.prod NODE_ENV = 'production'VUE_APP_BASE_URL = '/projectName' 在 package.json...
6k 5 分钟

# 引言 所有配置方法和介绍均来至于网络搜索汇总,主要用于方便后期巩固学习。 # 何为反向代理 在介绍反向代理之前,先来了解一下正向代理。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问...
\ No newline at end of file diff --git a/js/app.js b/js/app.js index a20137d91..571eab19e 100644 --- a/js/app.js +++ b/js/app.js @@ -1,3 +1,3 @@ -var e={version:"0.0.0",hostname:"https://blog.jingxiyuan.cn",root:"/",statics:"/",favicon:{normal:"images/favicon.ico",hidden:"images/failure.ico"},darkmode:false,auto_scroll:true,js:{valine:"gh/amehime/MiniValine@4.2.2-beta10/dist/MiniValine.min.js",chart:"npm/frappe-charts@1.5.0/dist/frappe-charts.min.iife.min.js",copy_tex:"npm/katex@0.12.0/dist/contrib/copy-tex.min.js",fancybox:"combine/npm/jquery@3.5.1/dist/jquery.min.js,npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js,npm/justifiedGallery@3.8.1/dist/js/jquery.justifiedGallery.min.js"},css:{valine:"css/comment.css",katex:"npm/katex@0.12.0/dist/katex.min.css",mermaid:"css/mermaid.css",fancybox:"combine/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css,npm/justifiedGallery@3.8.1/dist/css/justifiedGallery.min.css"},loader:{start:true,"switch":true},search:{appID:"2NU6BAFQUF",apiKey:"47a93cc6d8d1e77bd82d36e8365788dc",indexName:"blog",hits:{per_page:10}},valine:{appId:"pFJTr97i45HCNkAPfurKR0rS-gzGzoHsz",appKey:"9LsEPqi4hHCtghqzc7qDLyNV",placeholder:"ヽ(○´∀`)ノ♪欢迎畅所欲言",avatar:"mp",pageSize:10,lang:"zh-CN",visitor:true,NoRecordIP:false,serverURLs:null,powerMode:true,tagMeta:{visitor:"新朋友",master:"博主",friend:"小伙伴",investor:"金主粑粑"},tagColor:{master:"var(--color-orange)",friend:"var(--color-aqua)",investor:"var(--color-pink)"},tagMember:{master:["d2d281bfc950fb3d79ff50c5e2c7bd89"],friend:null,investor:null}},quicklink:{timeout:3e3,priority:true},audio:[{title:"博主喜欢",list:[{name:"仙剑问情",url:"https://music.163.com/song/media/outer/url?id=1416747959",artist:"萧人凤",cover:"https://p2.music.126.net/gZlHY7Cc2MaD7UVhgv7rYw==/109951164626902666.jpg?param=130y130",lrc:"[00:00.000] 作词 : 贾卓伦[00:01.000] 作曲 : 骆集益[00:26.940]细雨飘 清风摇[00:29.330]凭借痴心般情长[00:31.810]皓雪落 黄河浊[00:34.210]任由他绝情心伤[00:36.740]放下吧 手中剑 我情愿[00:41.870]唤回了 心底情 宿命尽[00:46.800]为何要 孤独绕[00:49.240]你在世界另一边[00:51.770]对我的深情[00:54.620]怎能用只字片语写得尽[00:59.290]写得尽[01:01.874]不贪求一个愿[01:06.736]又想起 你的脸[01:09.587]朝朝暮暮 漫漫人生路[01:16.278]时时刻刻 看到你的眼眸里[01:23.298]柔情似水[01:26.298]今生缘 来世再续[01:31.168]情何物 生死相许[01:36.096]如有你相伴 不羡鸳鸯不羡仙[02:19.417]情天动 青山中[02:21.756]阵风瞬息万里云[02:24.298]寻佳人 情难真[02:26.787]御剑踏破乱红尘[02:29.275]翱翔那 苍穹中 心不尽[02:34.358]纵横在 千年间 轮回转[02:39.327]为何让 寂寞长[02:41.817]我在世界这一边[02:44.306]对你的思念[02:47.146]怎能用千言万语说得清[02:51.876]说得清[02:54.306]只奢望一次醉[02:59.317]又想起 你的脸[03:02.115]寻寻觅觅 相逢在梦里[03:08.485]时时刻刻 看到你的眼眸里[03:15.847]缱绻万千[03:18.537]今生缘 来世再续[03:23.567]情何物 生死相许[03:28.597]如有你相伴 不羡鸳鸯不羡仙"},{name:"大天蓬",url:"https://music.163.com/song/media/outer/url?id=1483488153",artist:"璐爷",cover:"https://p2.music.126.net/rn6L_xf1tlVAyHOz95mmMQ==/109951165354012465.jpg?param=130y130",lrc:"[00:00.000] 作词 : 宋雪苍/李袁杰[00:01.000] 作曲 : 李袁杰[00:02.000] 制作人 : 刘子睦[00:28.23]美人不是凡胎生[00:34.91]应是仙器灵长成[00:41.94]既然你是神兵[00:45.19]为何比我更多情[00:49.16]深深伤的却是你[00:55.78]六曜五星配红妆[01:02.23]此生虽短情意长[01:09.19]惹得天怒地也恼[01:12.63]人间再无红颜笑[01:16.48]留一半相思上大道 [01:22.49]怕什么天道轮回[01:26.20]什么魄散魂飞[01:30.23]若没有你那才叫可悲[01:36.12]怕什么西行无归[01:40.06]什么事与愿违[01:43.90]这一世换我护你一对[01:50.45][02:17.92]六曜五星配红妆[02:24.66]此生虽短情意长[02:31.44]惹得天怒地也恼[02:34.89]人间再无红颜笑[02:38.81]留一半相思上大道[02:44.53]怕什么天道轮回[02:48.56]什么魄散魂飞[02:52.94]若没有你那才叫可悲[02:58.55]怕什么西行无归[03:02.25]什么事与愿违[03:06.24]这一世换我护你一对[03:12.22]怕什么天道轮回[03:15.92]什么魄散魂飞[03:19.92]若没有你那才叫可悲[03:25.96]怕什么西行无归[03:29.70]什么事与愿违[03:33.62]这一世换我护你一对[03:40.41]这一世换我护你一对"},{name:"左手指月",url:"https://music.163.com/song/media/outer/url?id=536096151",artist:"萨顶顶",cover:"https://p1.music.126.net/gEia-o05FSas8uJos54Sug==/109951163456726954.jpg?param=130y130",lrc:"[00:00.000] 作词 : 喻江[00:01.000] 作曲 : 萨顶顶[00:02.000] 编曲 : 刘胡轶/常石磊[00:03.000] 制作人 : 常石磊[00:04.000] 弦乐编写 : 刘胡轶[00:05.000] 和声 : 萨顶顶[00:06.000] 人声录音 : 李杨/曹洋[00:07.000] 人声录音室 : 55Tec Studio/C-VOICE STUDIO[00:08.000] 人声编辑 : 曹洋[00:09.000] 混音师 : 赵靖[00:10.000] 制作出品 : 中英音乐[00:11.000] 监制 : 付宏声[00:12.000] 音乐发行 : 智慧大狗×天才联盟[00:13.000] 统筹 : 张葛 王明宇[00:14.000] 混音录音棚: BIG.J Studio[00:15.000] [00:16.000] 铜管/弦乐:国际首席爱乐乐团[00:17.000] [00:18.000] 铜管/弦乐录音师:李巍[00:19.000] [00:20.000] 铜管/弦乐录音棚:中国剧院录音棚[00:22.84][00:25.23]左手握大地右手握着天[00:31.58]掌纹裂出了十方的闪电[00:37.32]把时光匆匆兑换成了年[00:43.90]三千世 如所不见[00:51.32]左手拈着花右手舞着剑[00:57.76]眉间落下了一万年的雪[01:03.88]一滴泪 啊啊啊[01:10.12]那是我 啊啊啊[01:44.11]左手一弹指右手弹着弦[01:50.21]舟楫摆渡在忘川的水间[01:56.18]当烦恼能开出一朵红莲[02:02.86]莫停歇 给我杂念[02:10.15]左手指着月右手取红线[02:16.59]赐予你和我如愿的情缘[02:22.41]月光中 啊啊啊[02:28.98]你和我 啊啊啊[02:49.93]左手化成羽右手成鳞片[02:56.04]某世在云上某世在林间[03:01.89]愿随你用一粒微尘的模样[03:08.45]在所有 尘世浮现[03:15.91]我左手拿起你右手放下你[03:22.49]合掌时你全部被收回心间[03:28.23]一炷香 啊啊啊[03:34.77]你是我 无二无别"},{name:"如愿",url:"http://music.163.com/song/media/outer/url?id=1922701695.mp3",artist:"葱香科学家,王菲",cover:"http://p2.music.126.net/3quyghcGASgwNjjXZfqqhg==/109951167081686500.jpg?param=130v130",lrc:"[00:00.000] 作词 : 唐恬[00:01.000] 作曲 : 钱雷[00:02.000] 编曲 : 钱雷[00:31.170]你是遥遥的路[00:34.620]山野大雾里的灯[00:39.720]我是孩童啊走在你的眼眸[00:45.630]你是明月清风[00:49.080]我是你照拂的梦[00:54.090]见与不见都一生与你相拥[00:59.850]而我将爱你所爱的人间[01:04.080]愿你所愿的笑颜[01:07.440]你的手我蹒跚在牵[01:11.070]请带我去明天[01:14.280]如果说你曾苦过我的甜[01:18.510]我愿活成你的愿[01:21.930]愿不枉啊愿勇往啊[01:25.500]这盛世每一天[01:59.670]你是岁月长河[02:03.030]星火燃起的天空[02:08.220]我是仰望者就把你唱成歌[02:14.070]你是我之所来[02:17.490]也是我心之所归[02:22.470]世间所有路都将与你相逢[02:28.290]而我将爱你所爱的人间[02:32.490]愿你所愿的笑颜[02:35.880]你的手我蹒跚在牵[02:39.450]请带我去明天[02:42.720]如果说你曾苦过我的甜[02:46.890]我愿活成你的愿[02:50.340]愿不枉啊愿勇往啊[02:53.940]这盛世每一天[02:58.920]山河无恙烟火寻常[03:02.520]可是你如愿的眺望[03:06.180]孩子们啊安睡梦乡[03:09.870]像你深爱的那样[03:18.870]而我将梦你所梦的团圆[03:23.040]愿你所愿的永远[03:26.580]走你所走的长路[03:30.000]这样的爱你啊[03:33.210]我也将见你未见的世界[03:37.380]写你未写的诗篇[03:40.890]天边的月心中的念[03:44.490]你永在我身边[03:49.620]与你相约一生清澈[03:54.120]如你年轻的脸"},{name:"像我这样的人",url:"http://music.163.com/song/media/outer/url?id=569213220.mp3",artist:"毛不易",cover:"http://p2.music.126.net/vmCcDvD1H04e9gm97xsCqg==/109951163350929740.jpg?param=300x300",lrc:"[00:00.000] 作词 : 毛不易[00:01.000] 作曲 : 毛不易[00:02.000] 编曲 : 赵兆/宋涛[00:03.000] 制作人 : 李健/赵兆[00:09.840][00:15.000]像我这样优秀的人[00:18.770]本该灿烂过一生[00:22.620]怎么二十多年到头来[00:26.700]还在人海里浮沉[00:30.240][00:30.350]像我这样聪明的人[00:34.500]早就告别了单纯[00:38.380]怎么还是用了一段情[00:42.360]去换一身伤痕[00:44.680][00:46.150]像我这样迷茫的人[00:49.840]像我这样寻找的人[00:53.800]像我这样碌碌无为的人[00:57.590]你还见过多少人[01:06.910][01:18.640]像我这样庸俗的人[01:22.830]从不喜欢装深沉[01:26.540]怎么偶尔听到老歌时[01:30.620]忽然也晃了神[01:34.380]像我这样懦弱的人[01:38.240]凡事都要留几分[01:42.200]怎么曾经也会为了谁[01:45.950]想过奋不顾身[01:47.680][01:49.870]像我这样迷茫的人[01:53.770]像我这样寻找的人[01:57.490]像我这样碌碌无为的人[02:01.450]你还见过多少人[02:04.690][02:05.460]像我这样孤单的人[02:09.200]像我这样傻的人[02:13.260]像我这样不甘平凡的人[02:16.990]世界上有多少人[02:21.580][02:26.760]像我这样迷茫的人[02:30.510]像我这样寻找的人[02:34.370]像我这样碌碌无为的人[02:38.230]你还见过多少人[02:41.240][02:42.000]像我这样孤单的人[02:46.100]像我这样傻的人[02:49.970]像我这样不甘平凡的人[02:53.650]世界上有多少人[02:56.630][02:59.630]像我这样莫名其妙的人[03:05.430]会不会有人心疼"},{name:"从别后 (女声版)",url:"https://pan.jingxiyuan.cn/d/音乐/AZA微唱团 - 从别后 (斗破苍穹).mp3",artist:"AZA微唱团",cover:"http://p1.music.126.net/QhsX2RRqh2ot9lgRVKflEw==/109951167516160921.jpg?param=300x300",lrc:"[00:00.000] 作词 : Riesling[00:01.000] 作曲 : 陈鹏杰[00:18.94]一片云落入掌心[00:22.72]渺渺万里何处去[00:26.99]只记取离别时的你[00:30.67]仍年少意气[00:35.69]转身过一入天际[00:39.79]愿我如那时的风[00:44.50]拂去尘世俗名轻拥着你[00:51.79]碧落箫声吹尽[00:55.79]沧海一遇却难找寻[01:00.23]前路崇山峻岭不再有你同行[01:08.51]纵使微茫如烟纵有万般思念[01:17.10]流光总将故人搁浅在断简残篇[01:21.90]不成眠[01:25.65]不等谁来证明不必狂歌痛饮[01:34.16]唯盼重相见[01:37.89]归来时一醉明月[02:04.94]这片云不知归期[02:09.04]渺渺万里何处去[02:13.21]只记取离别时的你[02:16.95]仍年少意气[02:21.71]经年过却难忘记[02:25.98]愿我如那时的风[02:30.61]拂去尘世俗名轻拥着你[02:37.88]苍穹箫声吹尽[02:42.02]此生魂梦已逐君去[02:46.31]前路崇山峻岭不再有你同行[02:54.72]纵使微茫如烟纵有万般思念[03:03.39]流光总将故人搁浅在断简残篇[03:08.12]不成眠[03:11.86]不等谁来证明不必狂歌痛饮[03:20.37]唯盼重相见[03:24.20]我如倦鸟归林[03:28.82]纵使微茫如烟纵有万般思念[03:37.30]流光总将故人搁浅在断简残篇[03:42.04]不成眠[03:45.72]不理白驹过隙不信生死有命[03:54.25]唯盼重相见[03:58.20]归来时一醉明月"},{name:"别错过",url:"https://pan.jingxiyuan.cn/d/音乐/程佳佳-别错过(DJ版).m4a",artist:"程佳佳",cover:"http://p1.music.126.net/VDyVtxlWQSdE9Na5wzzbOQ==/109951165903629131.jpg?param=300x300",lrc:"[00:00.000] 作词 : 程佳佳[00:01.000] 作曲 : 程佳佳[00:14.506]把你的心给我[00:17.023]把你的爱给我[00:18.545]这样我才能大胆尝试[00:21.553]有更多的把握[00:22.556]我要的也不多[00:24.259]你不要嫌我啰嗦[00:26.260]我只是十分害怕[00:28.065]不小心与你错过[00:30.596]我们辗转几何[00:32.313]可结果又是如何[00:34.331]没有任何意义[00:36.344]其实你根本没爱过我[00:38.545]脑袋空白在此刻[00:39.565]我写了这首歌[00:42.808]其实没什么舍不得[00:44.519]只是眼睛酸涩全是红色[01:03.097]把你的心给我[01:05.312]把你的爱给我[01:06.332]这样我才能大胆尝试[01:08.754]有更多的把握[01:10.275]我要的也不多[01:12.301]你不要嫌我啰嗦[01:14.321]我只是十分害怕[01:16.334]不小心与你错过[01:18.574]无处不在的难过[01:20.340]又是谁的过错[01:22.257]就此和你别过[01:24.583]你会不会快乐[01:26.291]这次我终于解脱[01:28.308]等到了这一刻[01:30.529]其实没什么舍不得[01:32.563]好好学会得过且过[01:43.005]我们辗转几何[01:44.594]可结果又是如何[01:46.508]没有任何意义[01:48.516]其实你根本没爱过我[01:50.521]脑袋空白在此刻[01:52.343]我写了这首歌[01:54.270]其实没什么舍不得[01:56.270]只是眼睛酸涩全是红色"},{name:"东风破",url:"https://pan.jingxiyuan.cn/d/音乐/东风破.m4a",artist:"周杰伦",cover:"https://file.jingxiyuan.cn/images/2022/11/02/T002R300x300M000000MkMni19ClKG.webp",lrc:"[00:00.000] 詞:方文山 曲:周杰伦 [04:44.94][02:01.08][00:12.00]-------- [00:14.25]一盏离愁孤单伫立在窗口 [00:20.56]我在门后假装你人还没走 [00:26.60]旧地如重游月圆更寂寞 [00:33.53]夜半清醒的烛火不忍苛责我 [02:27.25][00:39.89]一壶漂泊浪迹天涯难入喉 [02:33.48][00:45.89]你走之后酒暖回忆思念瘦 [02:40.05][00:52.77]水向东流时间怎么偷 [02:46.12][00:58.95]花开就一次成熟我却错过 [03:51.13][02:56.18][01:09.10]谁在用琵琶弹奏一曲东风破 [03:57.42][03:02.66][01:15.61]岁月在墙上剥落看见小时候 [04:04.05][03:09.42][01:22.12]犹记得那年我们都还很年幼 [04:10.43][03:15.65][01:28.56]而如今琴声幽幽我的等候你没听过 [04:17.98][03:22.07][01:35.11]谁在用琵琶弹奏一曲东风破 [04:24.47][03:28.58][01:41.55]枫叶将故事染色结局我看透 [04:30.94][03:35.01][01:48.17]篱笆外的古道我牵着你走过 [04:37.25][03:41.42][01:54.48]荒烟漫草的年头就连分手都很沉默"},{name:"偏爱",url:"http://music.163.com/song/media/outer/url?id=5238992.mp3",artist:"张芸京",cover:"http://p1.music.126.net/aXxs3vRYT8wMpfa_xjSSrA==/109951164644495422.jpg?param=300x300",lrc:"[00:00.000] 作词 : 葛大为[00:01.000] 作曲 : 陈伟[00:02.000] 编曲 : 陈伟[00:04.136][00:14.752]把昨天都作废[00:17.993]现在你在我眼前[00:21.746]我想爱 请给我机会[00:28.238]如果我错了也承担[00:32.054]认定你就是答案[00:36.919]我不怕谁嘲笑我极端[00:41.887]相信自己的直觉[00:45.766]顽固的人不喊累[00:49.187]爱上你 我不撤退[00:54.890]我说过 我不闪躲[00:58.109]我非要这么做[01:00.845]讲不听 也偏要爱[01:03.501]更努力爱 让你明白[01:08.763]没有别条路能走[01:11.642]你决定 要不要陪我[01:14.494]讲不听偏爱[01:16.267]靠我感觉爱[01:17.870]等你的依赖[01:21.210]对你偏爱[01:28.280]痛也很愉快[01:36.856]把昨天都作废[01:40.143]现在你在我眼前[01:43.945]我想爱 请给我机会[01:50.570]如果我错了也承担[01:54.367]认定你就是答案[01:59.245]我不怕谁嘲笑我极端[02:04.220]相信自己的直觉[02:08.024]顽固的人不喊累[02:11.572]爱上你 我不撤退[02:17.171]我说过 我不闪躲[02:20.334]我非要这么做[02:23.001]讲不听 也偏要爱[02:25.655]更努力爱 让你明白[02:30.942]没有别条路能走[02:33.833]你决定 要不要陪我[02:36.778]讲不听偏爱[02:38.577]靠我感觉爱[02:40.224]等你的依赖[02:43.273]不后悔 有把握 我不闪躲[02:47.773]我非要这么做[02:50.354]讲不听 也偏要爱[02:52.881]更努力爱 让你明白[02:58.272]没有别条路能走[03:01.159]你决定 要不要陪我[03:04.177]讲不听偏爱[03:05.850]靠我感觉爱[03:07.649]等你的依赖[03:10.977]对你偏爱[03:18.024]痛也很愉快"},{name:"错位时空",url:"http://music.163.com/song/media/outer/url?id=1808492017.mp3",artist:"艾辰",cover:"http://p2.music.126.net/8C0lwLE88j9ZwLyPQ9a4FA==/109951165595770076.jpg?param=300x300",lrc:"[00:00.000] 作词 : 周仁[00:01.000] 作曲 : 张博文[00:02.000] 编曲 : 陈林[00:03.000] 制作人 : 艾辰[00:12.51]OP:腾煌星象[00:13.51]出品:网易飓风[00:15.50]填不满半排观众的电影[00:19.12]直到散场时突然亮起灯[00:23.03]字幕定格在某某出品和发行[00:26.30]我目送 他们行色匆匆[00:29.88]像个自不量力的复读生[00:33.45]完不成金榜题名的使命[00:37.28]命不是猜剪刀石头布的决定[00:41.03]那么任性[00:44.52]我吹过你吹过的晚风[00:48.12]那我们算不算 相拥[00:51.73]可如梦初醒般的两手空空[00:55.34]心也空[00:58.90]我吹过你吹过的晚风[01:02.50]是否看过同样 风景[01:06.10]像扰乱时差留在错位时空[01:09.67]终是空 是空[01:30.88]数不完见证许愿的繁星[01:34.31]没灵验谁来安慰坏心情[01:38.23]十字路口闪烁不停的信号灯[01:41.49]有个人 显然心事重重[01:45.11]三个字 只能说给自己听[01:48.64]仰着头不要让眼泪失控[01:52.50]哪里有可以峰回路转的宿命[01:56.22]我不想听[01:59.80]我吹过你吹过的晚风[02:03.36]那我们算不算 相拥[02:07.00]可如梦初醒般的两手空空[02:10.56]心也空[02:13.93]我吹过你吹过的晚风[02:17.73]是否看过同样 风景[02:21.36]像扰乱时差留在错位时空[02:24.84]终是空 是空[02:32.10]我吹过你吹过的晚风[02:35.65]空气里弥漫着 心痛[02:39.23]可我们 最后 在这错位时空[02:42.90]终成空[02:46.45]我吹过你吹过的晚风[02:49.95]空气里弥漫着 心痛[02:53.55]可我们 最后 在这错位时空[02:57.13]终成空 成空"},{name:"美丽心情",url:"http://music.163.com/song/media/outer/url?id=406737868.mp3",artist:"本多RuRu",cover:"http://p1.music.126.net/GNQeD9ozB88aYt8CHOv0rg==/109951166940956861.jpg?param=300x300",lrc:"[00:00.000] 作词 : 姚谦[00:01.000] 作曲 : 中島みゆき[00:02.000] 编曲 : 屠颖[00:30.22]多雨的冬季总算过去[00:35.91]天空微露淡蓝的睛[00:41.87]我在早晨清新的阳光里[00:47.84]看着当时写的日记[00:53.68]原来爱曾给我美丽心情[00:59.62]像一面深邃的风景[01:05.44]那深爱过他却受伤的心[01:11.44]丰富了人生的记忆[01:16.43][01:17.30]只有曾天真给过的心[01:23.26]才了解等待中的甜蜜[01:28.95]也只有被辜负而长夜流过泪的心[01:35.52]才能明白这也是一种运气[01:40.73]让他永远记得曾经有一个人[01:46.95]给过完完整整的爱情[01:55.48][02:01.95]那曾经爱着他的心情[02:07.71]有一股傻傻的勇气[02:13.56]那深爱过他却受伤的心[02:19.56]丰富了人生的记忆[02:24.45][02:25.57]只有曾天真给过的心[02:31.35]才了解等待中的甜蜜[02:37.17]也只有被辜负而长夜流过泪的心[02:43.81]才能明白这也是一种运气[02:49.05]让他永远记得曾经有一个人[02:55.10]给过完完整整的爱情[03:07.77][03:15.78][03:27.70]只有曾天真给过的心[03:33.64]才了解等待中的甜蜜[03:39.25]也只有被辜负而长夜流过泪的心[03:45.82]才能明白这也是一种运气[03:51.08]当我安安心心地走在明天里[03:57.43]有不后悔美丽的心情"},{name:"泡沫",url:"http://music.163.com/song/media/outer/url?id=233931.mp3",artist:"G.E.M.邓紫棋",cover:"http://p2.music.126.net/3XEICRFzQPrHPUMD0xm1Jw==/109951163069323980.jpg?param=300x300",lrc:"[00:00.000] 作词 : G.E.M.邓紫棋[00:00.019] 作曲 : G.E.M.邓紫棋[00:00.038] 编曲 : Lupo Groinig[00:00.057] 制作人 : Lupo Groinig[00:00.79]阳光下的泡沫 是彩色的[00:08.29]就像被骗的我 是幸福的[00:15.37]追究什么对错 你的谎言[00:22.32]基于你还爱我[00:28.32]美丽的泡沫 虽然一刹花火[00:35.66]你所有承诺 虽然都太脆弱[00:42.67]但爱像泡沫 如果能够看破[00:49.67]有什么难过[00:57.78]早该知道泡沫 一触就破[01:04.76]就像已伤的心 不胜折磨[01:11.89]也不是谁的错 谎言再多[01:18.86]基于你还爱我[01:25.11]美丽的泡沫 虽然一刹花火[01:32.00]你所有承诺 虽然都太脆弱[01:39.16]爱本是泡沫 如果能够看破[01:46.24]有什么难过[01:53.37]再美的花朵 盛开过就凋落[02:00.39]再亮眼的星 一闪过就坠落[02:07.39]爱本是泡沫 如果能够看破[02:14.37]有什么难过[02:21.58]为什么难过 有什么难过[02:35.65]为什么难过[02:46.23]全都是泡沫 只一刹的花火[02:53.23]你所有承诺 全部都太脆弱[03:00.34]而你的轮廓 怪我没有看破[03:07.34]才如此难过[03:14.47]相爱的把握 要如何再搜索[03:21.50]相拥着寂寞 难道就不寂寞[03:28.71]爱本是泡沫 怪我没有看破[03:35.65]才如此难过[03:43.73]在雨下的泡沫 一触就破[03:50.70]当初炽热的心 早已沉没[03:57.73]说什么你爱我 如果骗我[04:04.76]我宁愿你沉默"},{name:"十年",url:"http://music.163.com/song/media/outer/url?id=1897927515.mp3",artist:"陈奕迅",cover:"http://p2.music.126.net/RdBFQahX4RNsy_fGPva3YQ==/109951166656400274.jpg?param=300x300",lrc:"[00:00.000] 作词 : Albert Leung[00:00.262] 作曲 : Chen Xiao Xia[00:00.524] 编曲 : 陈辉阳[00:00.786] 制作人 : 陈小霞/陈辉阳[00:01.048] 录音师 : 陈忠宏/亚祥 (HK)[00:01.310] 混音工程师 : 王家栋[00:01.572] 录音室 : 白金/AVON (HK)[00:01.834] 混音录音室 : 节奏[00:02.96]编曲 : 陈辉阳[00:15.71]如果那两个字没有颤抖[00:19.46]我不会发现 我难受[00:22.70]怎么说出口[00:26.50]也不过是分手[00:30.86]如果对于明天没有要求[00:34.91]牵牵手就像旅游[00:38.04]成千上万个门口[00:41.84]总有一个人要先走[00:47.71]怀抱既然不能逗留[00:51.09]何不在离开的时候[00:54.03]一边享受 一边泪流[01:01.21]十年之前[01:03.11]我不认识你[01:05.00]你不属于我[01:06.96]我们还是一样[01:09.47]陪在一个陌生人左右[01:13.27]走过渐渐熟悉的街头[01:16.64]十年之后[01:18.56]我们是朋友[01:20.52]还可以问候[01:22.56]只是那种温柔[01:24.88]再也找不到拥抱的理由[01:28.76]情人最后难免沦为朋友[01:57.35]怀抱既然不能逗留[02:00.59]何不在离开的时候[02:03.65]一边享受 一边泪流[02:10.93]十年之前[02:12.84]我不认识你[02:14.74]你不属于我[02:16.71]我们还是一样[02:19.04]陪在一个陌生人左右[02:22.90]走过渐渐熟悉的街头[02:26.32]十年之后 我们是朋友[02:30.13]还可以问候 只是那种温柔[02:34.57]再也找不到拥抱的理由[02:38.42]情人最后难免沦为朋友[02:48.38]直到和你做了多年朋友[02:52.37]才明白我的眼泪[02:55.45]不是为你而流[02:59.19]也为别人而流"},{name:"第一次",url:"http://music.163.com/song/media/outer/url?id=4875700.mp3",artist:"光良",cover:"http://p2.music.126.net/BAy3T1LkXo0hkYRmPD3TXA==/109951163187508248.jpg?param=300x300",lrc:"[00:00.000] 作词 : 张天成[00:01.000] 作曲 : 光良[00:02.000] 编曲 : Mac Chew[00:03.000] 制作人 : 光良[00:08.538]当你看着我[00:10.389]我没有开口 已被你猜透[00:17.159]还是没把握[00:19.538]还是没有符合你的要求[00:26.990]是我自己想得太多[00:29.849]还是你也在闪躲[00:34.980]如果真的选择是我[00:38.850]我鼓起勇气去接受[00:42.500]不知不觉让视线开始闪烁[00:51.500]哦~第一次我说爱你的时候[00:57.100]呼吸难过 心不停地颤抖[01:01.200]哦~第一次我牵起你的双手[01:05.349]失去方向 不知该往哪儿走[01:10.340]那是一起相爱的理由 那是一起厮守[01:18.850]哦~第一次吻你深深的酒窝[01:23.660]想要清醒 却冲昏了头[01:28.300]哦~第一次你躺在我的胸口[01:32.789]二十四小时没有分开过[01:37.850]那是第一次知道 天长地久[01:57.820]是我自己想得太多[02:01.760]还是你也在闪躲[02:06.700]如果真的选择是我[02:10.638]我鼓起勇气去接受[02:14.798]不知不觉让视线开始闪烁[02:22.798]哦~第一次我说爱你的时候[02:27.888]呼吸难过 心不停地颤抖[02:32.670]哦~第一次我牵起你的双手[02:37.128]失去方向 不知该往哪儿走[02:42.670]那是一起相爱的理由 对我[02:53.778]感觉你属于我[02:57.800]感觉你的眼朦[03:03.629]第一次就决定绝不会错[03:11.588]哦~第一次我说爱你的时候[03:16.398]呼吸难过心不停的颤抖[03:21.390]哦~第一次我牵起你的双手[03:25.578]失去方向不知该往哪儿走[03:30.519]那是一起相爱的理由[03:35.209]那是一起厮守[03:39.128]哦~第一次吻你深深的酒窝[03:44.498]想要清醒 却冲昏了头[03:48.209]哦~第一次你躺在我的胸口[03:53.088]二十四小时没有分开过[04:00.498]那是第一次知道 天长地久……[60:02.360]"},{name:"童话",url:"http://music.163.com/song/media/outer/url?id=85580.mp3",artist:"光良",cover:"http://p1.music.126.net/n5vJ7BA7bdnlpI_0giRxHA==/109951165683825147.jpg?param=300x300",lrc:"[00:00.000] 作词 : 光良[00:00.655] 作曲 : 光良[00:01.310] 编曲 : Taichi Nakamura[00:01.965] 制作人 : 光良/陈建良[00:02.620] 配唱 : 陈建良[00:03.275] 录音工程师 : Kohsuke Sakata/陈彦江[00:03.930] 录音室 : bluesofa (JP)/敬业录音室 (TW)[00:04.585] 混音工程师 : Im Chang Duk[00:05.240] 混音助理 : Kim Young Sik[00:05.895] 混音室 : Booming Sound Studio (KR)[00:06.550] 录音助理 : 邱弈维[00:07.205] 钢琴 : Akimitsu Homma (bluesofa)[00:07.860] 低音吉他 : Taichi Nakamura (bluesofa)[00:08.515] 吉他 : Taichi Nakamura (bluesofa)[00:09.170] 和声/和声编写 : 光良[00:09.825] OP : 多奇娱乐工作室 Doggie Entertainment[00:10.480] SP : Rock Music Publishing Co./Ltd.[00:11.135] ISRC TW-A45-05-82102[00:11.790] [00:12.445] 制作人经纪:Shinjiro Nitta (bluesofa)[00:13.107]忘了有多久 再没听到你[00:19.807]对我说你 最爱的故事[00:26.877]我想了很久 我开始慌了[00:33.929]是不是我又 做错了什么[00:40.999]你哭着对我说 童话里都是骗人的[00:49.290]我不可能是你的王子[00:55.799]也许你不会懂 从你说爱我以后[01:02.199]我的天空 星星都亮了[01:10.200]我愿变成童话里 你爱的那个天使[01:16.989]张开双手 变成翅膀守护你[01:24.80]你要相信 相信我们会像童话故事里[01:30.889]幸福和快乐是结局[01:48.699]你哭着对我说 童话里都是骗人的[01:55.99]我不可能是你的王子[02:02.118]也许你不会懂 从你说爱我以后[02:09.196]我的天空 星星都亮了[02:16.187]我愿变成童话里 你爱的那个天使[02:23.888]张开双手 变成翅膀守护你[02:31.188]你要相信 相信我们会像童话故事里[02:37.977]幸福和快乐是结局[02:44.526]我要变成童话里 你爱的那个天使[02:51.557]张开双手 变成翅膀守护你[02:58.567]你要相信 相信我们会像童话故事里[03:06.297]幸福和快乐是结局[03:12.776]我会变成童话里 你爱的那个天使[03:19.787]张开双手 变成翅膀守护你[03:26.767]你要相信 相信我们会像童话故事里[03:34.488]幸福和快乐是结局[03:44.967]一起写 我们的结局"},{name:"青衣谣",url:"https://pan.jingxiyuan.cn/d/音乐/郁可唯 - 青衣谣.mp3",artist:"郁可唯",cover:"http://p1.music.126.net/MoyG_QDUk8up5AINhdYkRQ==/109951166989752217.jpg?param=300x300",lrc:"[00:07.560]郁可唯[00:20.520]荒草何茫茫[00:27.630]白杨亦萧萧[00:34.470]严霜九月中[00:41.190]送我出远郊[00:45.540]渺啊渺往[00:54.150]无语来无杳[00:58.140]华韶前朝[00:59.700]在眼前尽折腰[01:04.380]梦未央怎能[01:07.800]独自去云遥[01:11.550]谁今后再[01:13.830]与我谈风笑[01:18.510]摇啊摇青衣[01:21.120]奔往云霄[01:25.380]天地荡你[01:27.450]我心无处藏[01:31.770]红光照长路[01:34.860]暮云飘清风啸[01:39.060]天明鉴[01:40.020]此情虽万死也难销[01:45.930]叹世间爱[01:48.090]自古催人老[01:52.740]来不及与你[01:55.320]前世今朝[01:59.310]仰天歌欲断魂[02:03.630]揽你入怀中[02:06.630]我的命早已入[02:08.700]你的生死簿[02:13.410]天之涯海之角[02:15.600]铭心又刻骨[02:47.730]摇啊摇青衣[02:50.280]奔往云霄[02:54.540]天地荡你我[02:57.030]心无处藏[03:00.900]红光照长路[03:03.990]暮云飘清风啸[03:08.190]天明鉴[03:09.180]此情虽万死也难销[03:15.150]叹世间爱[03:17.190]自古催人老[03:21.900]来不及与你[03:24.480]前世今朝[03:28.440]仰天歌欲断魂[03:32.700]揽你入怀中[03:35.730]我的命早已入[03:37.890]你的生死簿[03:42.540]天之涯海之角[03:44.640]铭心又刻骨[03:49.380]叹世间爱[03:51.420]自古催人老[03:56.220]来不及与[03:58.260]你前世今朝[04:02.730]仰天歌欲断魂[04:07.020]揽你入怀中[04:10.020]我的命早已入[04:12.180]你的生死簿[04:16.800]天之涯海之角[04:18.930]铭心又刻骨"},{name:"思慕",url:"https://pan.jingxiyuan.cn/d/音乐/郁可唯 - 思慕.mp3",artist:"郁可唯",cover:"http://p1.music.126.net/MaAVxhZ9FOaTGSHSPW5JPw==/109951167872771610.jpg?param=300x300",lrc:"[00:00.000] 作词 : 无[00:00.000] 作曲 : 无[00:00.00]思慕[00:03.00]电视剧《三生三世十里桃花》主题曲[00:13.00]翻唱:旗木阿璇[00:19.00]混音:劉公子[00:32.44]风吹开了记忆的锁[00:39.89]想起旧时的你我[00:45.77]曾相思许诺[00:49.17]曾遗憾错过[00:52.50]桃花飘落暗香藏苦涩[00:59.35]月染亮十里夜色[01:06.72]勾起眼底的寂寞[01:12.35]对你的难舍[01:15.76]任沧桑淹没[01:19.15]三千流年心失魂落魄[01:25.79]凄凄思慕[01:29.12]心碎到奈何[01:32.42]剪不断纠葛[01:34.96]越想忘记越深刻[01:39.17]忘了醉了[01:42.44]以为放下了[01:45.71]却在梦醒后[01:48.69]想起你泪滑落[01:56.01]啊 啊[02:25.93]花纷落以为你来过[02:33.44]我眼前的泪斑驳[02:39.20]说不清悔过[02:42.49]道不尽难舍[02:45.69]孤独和脆弱被痛牵扯[02:52.58]当你再次说爱我[03:00.06]当悲欢再次交错[03:05.86]才恍然懂了[03:09.11]对你的执着[03:12.36]是我无法割舍的脉搏[03:19.09]凄凄思慕[03:22.45]心碎到奈何[03:25.83]剪不断纠葛[03:28.29]越想忘记越深刻[03:32.56]忘了醉了[03:35.74]以为放下了[03:39.14]却在梦醒后[03:42.00]想起你泪滑落[03:50.06][03:59.16]花开花落[04:02.28]心伤谁缝合[04:05.69]解不开因果[04:08.32]三生桃花柔情多[04:12.45]相思难舍[04:15.67]倾心花一朵[04:19.12]愿执手白头[04:22.06]看芳华醉春风[04:29.64]啊 啊"},{name:"黄昏",url:"http://music.163.com/song/media/outer/url?id=190072.mp3",artist:"周传雄",cover:"http://p1.music.126.net/mFM2Ii6Kxktb_87b4q3TYQ==/109951167366664357.jpg?param=300x300",lrc:"[00:00.000] 作词 : 陈信荣[00:01.000] 作曲 : 周传雄[00:02.000] 编曲 : 周传雄[00:03.000] 制作人 : 周传雄[00:29.259]过完整个夏天[00:34.742]忧伤并没有好一些[00:41.185]开车行驶在公路无际无边[00:47.320]有离开自己的感觉[00:52.453][00:53.347]唱不完一首歌[00:59.370]疲倦还剩下黑眼圈[01:05.596]感情的世界伤害在所难免[01:11.703]黄昏再美终要黑夜[01:18.292]依然记得从你口中说出再见坚决如铁[01:24.732]昏暗中有种烈日灼身的错觉[01:30.171]黄昏的地平线[01:33.230]划出一句离别[01:36.313]爱情进入永夜[01:42.165][01:42.881]依然记得从你眼中滑落的泪伤心欲绝[01:49.290]混乱中有种热泪烧伤的错觉[01:54.774]黄昏的地平线[01:57.816]割断幸福喜悦[02:00.915]相爱已经幻灭[02:07.171][02:19.647]唱不完一首歌[02:25.497]疲倦还剩下黑眼圈[02:31.753]感情的世界伤害在所难免[02:37.881]黄昏再美终要黑夜[02:42.994][02:44.363]依然记得从你口中说出再见坚决如铁[02:50.872]昏暗中有种烈日灼身的错觉[02:56.291]黄昏的地平线[02:59.393]划出一句离别[03:02.507]爱情进入永夜[03:08.340][03:09.205]依然记得从你眼中滑落的泪伤心欲绝[03:15.531]混乱中有种热泪烧伤的错觉[03:20.937]黄昏的地平线[03:23.991]割断幸福喜悦[03:27.025]相爱已经幻灭[03:34.375][03:58.563]依然记得从你口中说出再见坚决如铁[04:04.694]昏暗中有种烈日灼身的错觉[04:10.141]黄昏的地平线[04:13.156]划出一句离别[04:16.228]爱情进入永夜[04:21.297][04:22.863]依然记得从你眼中滑落的泪伤心欲绝[04:29.401]混乱中有种热泪烧伤的错觉[04:34.714]黄昏的地平线[04:37.774]割断幸福喜悦[04:40.913]相爱已经幻灭​"},{name:"七里香",url:"https://pan.jingxiyuan.cn/d/音乐/周杰倫 - 七里香.mp3",artist:"周杰伦",cover:"http://p1.music.126.net/P1goeQ7SoxEkFsb4ZDijMw==/7746059418324672.jpg?param=300x300",lrc:"[00:00.000] 作词 : 方文山[00:01.000] 作曲 : 周杰伦[00:02.000] 编曲 : 钟兴民[00:03.000] 制作人 : 周杰伦[00:04.000] 和声编写 : 周杰伦[00:05.000] 合声 : 周杰伦[00:06.000] 吉他 : 黄中岳[00:07.000] 鼓 : 陈伯州[00:08.000] 弦乐录音师 : 林哲民(北京OASIS)[00:09.000] 弦乐录音室 : 北京OASIS[00:10.000] 弦乐 : 北京爱乐[00:11.000] 录音工程 : 杨大纬(ALFA STUDIO)[00:12.000] 混音 : 杨大纬(杨大纬录音工作室)[00:13.000] OP : ALFA MUSIC PUBLISHING CO./LTD[00:27.702]窗外的麻雀 在电线杆上多嘴[00:34.490]你说这一句 很有夏天的感觉[00:41.190]手中的铅笔 在纸上来来回回[00:47.582]我用几行字形容你是我的谁[00:54.329]秋刀鱼的滋味 猫跟你都想了解[01:01.447]初恋的香味就这样被我们寻回[01:07.811]那温暖的阳光 像刚摘的鲜艳草莓[01:14.138]你说你舍不得吃掉这一种感觉[01:20.907]雨下整夜 我的爱溢出就像雨水[01:27.608]院子落叶 跟我的思念厚厚一叠[01:34.345]几句是非 也无法将我的热情冷却[01:41.945]你出现在我诗的每一页[01:47.900]雨下整夜 我的爱溢出就像雨水[01:54.623]窗台蝴蝶 像诗里纷飞的美丽章节[02:01.359]我接着写 把永远爱你写进诗的结尾[02:08.972]你是我唯一想要的了解[02:15.235][02:41.846]雨下整夜 我的爱溢出就像雨水[02:48.581]院子落叶 跟我的思念厚厚一叠[02:55.327]几句是非 也无法将我的热情冷却[03:02.943]你出现在我诗的每一页[03:09.320]那饱满的稻穗 幸福了这个季节[03:16.440]而你的脸颊像田里熟透的番茄[03:22.801]你突然对我说 七里香的名字很美[03:29.149]我此刻却只想亲吻你倔强的嘴[03:35.869]雨下整夜 我的爱溢出就像雨水[03:42.576]院子落叶 跟我的思念厚厚一叠[03:49.355]几句是非 也无法将我的热情冷却[03:56.911]你出现在我诗的每一页[04:03.304]整夜 我的爱溢出就像雨水[04:09.595]窗台蝴蝶 像诗里纷飞的美丽章节[04:16.351]我接着写 把永远爱你写进诗的结尾[04:23.936]你是我唯一想要的了解"},{name:"晴天",url:"https://pan.jingxiyuan.cn/d/音乐/周杰倫 - 晴天.mp3",artist:"周杰伦",cover:"https://y.gtimg.cn/music/photo_new/T002R300x300M000000MkMni19ClKG.jpg",lrc:"[00:00.00]周杰伦 - 晴天 [00:00.89]作词:周杰伦 [00:01.84]作曲:周杰伦 [00:02.78]编曲:周杰伦 [00:03.79]制作人:周杰伦 [00:04.91]合声:周杰伦 [00:05.91]合声编写:周杰伦 [00:07.25]吉他:蔡科俊Again [00:08.43]贝斯:陈任佑 [00:09.43]鼓:陈柏州 [00:10.21]录音助理:刘勇志 [00:11.44]录音工程:杨瑞代(Alfa Studio) [00:13.06]混音工程:杨大纬(杨大纬录音工作室) [00:29.24]故事的小黄花 [00:32.64]从出生那年就飘着 [00:36.22]童年的荡秋千 [00:39.67]随记忆一直晃到现在 [00:42.74]Re So So Si Do Si La [00:45.81]So La Si Si Si Si La Si La So [00:49.77]吹着前奏望着天空 [00:53.06]我想起花瓣试着掉落 [00:56.57]为你翘课的那一天 [00:58.69]花落的那一天 [01:00.41]教室的那一间 [01:02.20]我怎么看不见 [01:03.97]消失的下雨天 [01:05.71]我好想再淋一遍 [01:09.83]没想到失去的勇气我还留着 [01:16.01]好想再问一遍 [01:17.86]你会等待还是离开 [01:24.83]刮风这天我试过握着你手 [01:30.47]但偏偏雨渐渐 [01:34.04]大到我看你不见 [01:38.84]还要多久我才能在你身边 [01:45.43]等到放晴的那天 [01:48.46]也许我会比较好一点 [01:52.81]从前从前有个人爱你很久 [01:58.56]但偏偏风渐渐 [02:02.02]把距离吹得好远 [02:06.82]好不容易又能再多爱一天 [02:13.40]但故事的最后 [02:16.01]你好像还是说了拜拜 [02:34.67]为你翘课的那一天 [02:36.79]花落的那一天 [02:38.58]教室的那一间 [02:40.31]我怎么看不见 [02:42.09]消失的下雨天 [02:43.82]我好想再淋一遍 [02:47.96]没想到失去的勇气我还留着 [02:54.11]好想再问一遍 [02:55.94]你会等待还是离开 [03:02.92]刮风这天我试过握着你手 [03:08.60]但偏偏雨渐渐 [03:12.07]大到我看你不见 [03:16.93]还要多久我才能在你身边 [03:23.47]等到放晴的那天 [03:26.54]也许我会比较好一点 [03:30.95]从前从前有个人爱你很久 [03:37.08]偏偏风渐渐 [03:40.09]把距离吹得好远 [03:44.88]好不容易又能再多爱一天 [03:51.50]但故事的最后 [03:54.18]你好像还是说了拜拜 [03:58.65]刮风这天我试过握着你手 [04:01.84]但偏偏雨渐渐 [04:03.52]大到我看你不见 [04:05.49]还要多久我才能够在你身边 [04:08.92]等到放晴那天 [04:10.49]也许我会比较好一点 [04:12.72]从前从前有个人爱你很久 [04:15.79]但偏偏雨渐渐 [04:17.52]把距离吹得好远 [04:19.36]好不容易又能再多爱一天 [04:22.77]但故事的最后 [04:24.00]你好像还是说了拜"},{name:"佛系少女",url:"https://pan.jingxiyuan.cn/d/音乐/冯提莫-佛系少女.mp3",artist:"冯提莫",cover:"http://p1.music.126.net/eNEv627PlFtMoSXj_4TaLg==/109951163282067856.jpg?param=300x300",lrc:"[00:00.000] 作词 : 冯提莫[00:01.000] 作曲 : 冯提莫[00:11.328]混音:dj 名龙[01:05.110]我失了忆每天都是星期七[01:08.860]赖在家里学树懒0.1倍速挪移[01:13.117]床和游戏每一个都要宠溺[01:16.871]以免它们吃醋妒忌伤了和气[01:20.175]电话响起又在期待的奇迹[01:24.474]不自觉的开始有些紧张心悸[01:28.177]幻想和你聊什么样的话题[01:32.179]不着痕迹透露会惊讶的秘密[01:37.79]你说你喜欢森女系[01:39.30]而我多了一个G[01:40.830]就像LOVE 去掉一半变loli[01:44.561]我在默默等着你哪怕中年危机[01:48.761]我的爱不过气[01:51.962]你说爱喜欢随天意[01:53.813]我就爱上了锦鲤[01:55.813]预支了所有运气换一次概率拉低[01:59.566]伪装的不在意oh 假装很佛系[02:03.726]自定义的甜蜜[03:12.602]我失了忆每天都是星期七[03:16.206]赖在家里学树懒0.1倍速挪移[03:20.707]床和游戏每一个都要宠溺[03:24.413]以免它们吃醋妒忌伤了和气[03:28.215]电话响起又在期待的奇迹[03:31.867]不自觉的开始有些紧张心悸[03:35.673]幻想和你聊什么样的话题[03:39.425]不着痕迹透露会惊讶的秘密[03:44.477]你说你喜欢森女系[03:46.278]而我多了一个G[03:47.879]就像LOVE 去掉一半变loli[03:50.530]我在默默等着你哪怕中年危机[03:56.132]我的爱不过气[03:59.435]你说爱喜欢随天意[04:01.435]我就爱上了锦鲤[04:03.435]预支了所有运气换一次概率拉低[04:07.390]伪装的不在意oh 假装很佛系[04:11.90]自定义的甜蜜[04:15.340]红尘滚滚不要着急[04:18.792]出门带一杯枸杞[04:22.443]人生苦短迟早如意[04:26.244]干杯吧为了友谊[04:30.147]电话响起又在期待的奇迹[04:33.703]不自觉的开始有些紧张心悸[04:37.453]幻想和你聊什么样的话题[04:41.205]不着痕迹透露会惊讶的秘密[04:46.159]你说你喜欢森女系[04:48.360]而我多了一个G[04:50.212]就像LOVE 去掉一半变loli[04:53.929]我在默默等着你哪怕中年危机[04:57.933]我的爱不过气[05:01.82]你说爱喜欢随天意[05:03.333]我就爱上了锦鲤[05:05.235]预支了所有运气换一次概率拉低[05:09.386]伪装的不在意oh 假装很佛系[05:12.437]自定义的甜蜜[05:17.45]你说你最喜欢原滋原味[05:18.945]而我就像是你一个累赘[05:20.996]为了爱我放弃你学不会[05:23.101]别管我让微笑一直伴随[05:25.54]我说我最喜欢你的滋味[05:27.55]因为你我可以整夜不睡[05:28.956]等到你遇见你这个机会[05:30.757]我相信我的直觉一定对[05:33.232]你说你喜欢森女系[05:35.335]而我多了一个G[05:37.186]就像LOVE 去掉一半变loli[05:40.885]我在默默等着你哪怕中年危机[05:44.988]我的爱不过气[05:48.79]你说爱喜欢随天意[05:50.179]我就爱上了锦鲤[05:52.81]预支了所有运气[05:53.932]换一次概率拉低[05:56.135]伪装的不在意oh 假装很佛系[05:59.689]自定义的甜蜜"},{name:"主公莫慌",url:"http://music.163.com/song/media/outer/url?id=29046285.mp3",artist:"樊玲,后弦",cover:"http://p1.music.126.net/NxspIWRLr48TPx_59lytIA==/6653144859905217.jpg?param=300x300",lrc:"[00:00.000] 作词 : 后弦[00:01.000] 作曲 : 后弦[00:18.81]男:盔甲之下一身倔强[00:20.60]忧伤眼神藏着家乡[00:22.45]北风萧瑟城墙之上[00:24.15]笔下历史静静在流淌[00:26.31]马蹄奔忙我无暇多想[00:28.07]归期不知何年征战四方[00:30.00]追随主公辗转厮杀[00:31.46]不忘桃园的芬芳[00:35.39]女:琴棋书画[00:37.29]画里藏刀[00:39.11]貂蝉不计较[00:42.75]听梦中熟悉[00:44.60]昭阳殿里[00:46.52]温柔的冷笑[00:50.34]梦中桃花[00:52.14]如时光落下[00:54.04]激昂的年华[00:57.91]你可曾来过[00:59.74]桃园那年[01:01.47]主公的篱笆[01:04.54]借我一把青龙偃月刀[01:08.19]斩断青丝琴弦为你绕[01:11.78]爱得太多恨得太多[01:15.19]三国里那个我[01:20.38]主公莫慌有我的救兵[01:23.98]暗藏的天机[01:27.65]羽扇掀号令[01:29.33]东风卷回忆[01:31.57]吹散乱世的旧情[01:35.34]主公莫慌看我的游戏[01:39.10]空城的诈欺[01:42.69]琴声难觅美人[01:44.75]命中知音[01:46.49]沙场无恋曲[01:50.31]男:从小熟读遥远三国[01:52.19]身披战袍回到传说[01:53.97]主公莫慌救驾有我[01:55.83]奸雄英雄谁不恋那纷飞战火[01:58.15]连环苦肉借刀哪一策[01:59.65]尔虞我诈为棋子一颗[02:01.59]成王败寇谈笑间[02:02.60]为你舍弃那江山又如何[02:04.71]女:借我一把青龙偃月刀[02:08.21]斩断青丝琴弦为你绕[02:11.85]爱得太多恨得太多[02:15.18]三国里那个我[02:20.42]主公莫慌有我的救兵[02:23.97]暗藏的天机[02:27.71]羽扇掀号令[02:29.16]东风卷回忆[02:31.50]吹散乱世的旧情[02:35.35]主公莫慌看我的游戏[02:39.02]空城的诈欺[02:42.52]琴声难觅美人[02:44.68]命中知音[02:46.53]沙场无恋曲[02:50.30]主公莫慌有我的救兵[02:54.04]暗藏的天机[02:57.67]羽扇掀号令[02:59.17]东风卷回忆[03:01.48]吹散乱世的旧情[03:05.26]主公莫慌看我的游戏[03:09.03]空城的诈欺[03:12.52]琴声难觅美人[03:14.68]命中知音[03:16.62]沙场无恋曲[03:20.43]主公莫慌有我的救兵"},{name:"不是因为寂寞才想你",url:"https://pan.jingxiyuan.cn/d/音乐/T.R.Y-不是因为寂寞才想你.mp3",artist:"T.R.Y",cover:"http://p2.music.126.net/wJJrxMiHxfjCCjueQU-IKA==/109951167856797130.jpg?param=300x300",lrc:"[00:00.000] 作词 : DJ骚年[00:01.000] 作曲 : DJ骚年[00:02.000] 编曲 : DJ骚年[00:14.68]相遇在人海聚散在重逢之外[00:20.91]醒来的窗台等着月光洒下来[00:27.29]不要太伤怀相信缘分依然在[00:32.67]让时钟它慢慢摇滴滴嗒嗒等你来[00:39.69]看云水漂流看着落叶被带走[00:45.76]泪湿的枕头枕干潮湿的温柔[00:51.36]等到下一个春秋等到秋叶被红透[00:57.49]让那指针慢慢走停在花开的时候[01:03.78]不是因为寂寞才想你[01:06.92]只是因为想你才寂寞[01:09.96]当泪落下的时候[01:13.07]所有风景都沉默[01:16.23]因为有你爱所以宽容[01:19.06]因为思念时光走得匆匆[01:22.38]月光轻轻把梦偷走[01:25.87]所有无眠的夜想你够不够[01:41.75]看云水漂流看着落叶被带走[01:47.93]泪湿的枕头枕干潮湿的温柔[01:53.53]等到下一个春秋等到秋叶被红透[01:59.63]让那指针慢慢走停在花开的时候[02:05.88]不是因为寂寞才想你[02:09.01]只是因为想你才寂寞[02:12.08]当泪落下的时候[02:15.18]所有风景都沉默[02:18.39]因为有你爱所以宽容[02:21.49]因为思念时光走得匆匆[02:24.51]月光轻轻把梦偷走[02:27.91]所有无眠的夜想你够不够[02:43.25]不是因为寂寞才想你[02:46.21]只是因为想你才寂寞[02:49.42]当泪落下的时候[02:52.49]所有风景都沉默[02:55.61]因为有你爱所以宽容[02:58.72]因为思念时光走得匆匆[03:01.80]月光轻轻把梦偷走[03:05.24]所有无眠的夜想你够不够[03:11.13]不是因为寂寞才想你[03:14.22]只是因为想你才寂寞[03:17.40]当泪落下的时候[03:20.57]所有风景都沉默[03:23.61]因为有你爱所以宽容[03:26.69]因为思念时光走得匆匆[03:29.85]月光轻轻把梦偷走[03:33.33]所有无眠的夜想你够不够[03:39.46]所有无眠的夜想你够不够"},{name:"樱花草",url:"https://pan.jingxiyuan.cn/d/音乐/Sweety - 樱花草.mp3",artist:"Sweety",cover:"http://p1.music.126.net/weYEy3wn70EqNnk4uWCGZQ==/109951167985758717.jpg?param=300x300",lrc:"[00:00.000] 作词 : 李天龙[00:01.000] 作曲 : 李天龙[00:19.69]翻唱:NanNan&恋音[00:31.95]楠:晚风吹动着竹林[00:35.18]月光拉长的身影[00:38.34]萤火虫 一闪闪[00:42.01]合:满山飞舞的钱币[00:45.00]恋:天上银河在发光[00:48.09]地上风铃来歌唱[00:51.34]织女星 在远方[00:55.03]合:古老浪漫的神话[00:58.26]楠:流水 走过[01:01.55]就像四季的变换[01:04.76]恋:幸福 在蔓延[01:07.97]爱你永恒不孤单[01:10.98]合:恋人手中樱花草[01:14.08]春在漫步的微笑[01:17.37]种下了 一朵朵[01:20.54]青春璀璨的年少[01:23.83]恋人怀中樱花草[01:27.03]听见胸膛心在跳[01:30.26]偷偷的 在思念[01:33.52]那是我们相爱的记号[01:50.57]La……[01:57.14]La……[02:02.77]楠:远方钟声在响起[02:05.97]蛙鸣唱起摇篮曲[02:09.28]白沙滩 月弯弯[02:12.94]爱你香甜的梦里[02:15.79]恋:天上银河在发光[02:19.02]地上风铃来歌唱[02:22.22]织女星 在远方[02:25.89]许下爱恋的愿望[02:29.09]楠:流水 走过[02:32.35]就像四季的变换[02:35.61]恋:幸福 在蔓延[02:38.82]爱你永恒不孤单[02:41.52]合:恋人手中樱花草[02:44.87]春在漫步的微笑[02:48.15]种下了 一朵朵[02:51.38]青春璀璨的年少[02:54.66]恋人怀中樱花草[02:57.88]听见胸膛心在跳[03:01.12]偷偷的 在思念[03:04.34]那是我们相爱的味道[03:11.68]楠:La……[03:22.96]合:La……[03:26.25]La……[03:29.48]La……[03:35.23]恋人手中樱花草[03:38.43]春在漫步的微笑[03:41.70]种下了 一朵朵[03:44.84]青春璀璨的年少[03:48.16]恋人怀中樱花草[03:51.41]听见胸膛心在跳[03:54.66]偷偷的 在思念[03:57.91]那是我们相爱的记号[04:01.25]恋人手中樱花草[04:04.40]春在漫步的微笑[04:07.62]种下了 一朵朵[04:10.85]青春璀璨的年少[04:14.12]恋人怀中樱花草[04:17.48]听见胸膛心在跳[04:20.57]偷偷的 在思念[04:23.83]那是我们相爱的味道"},{name:"以后的以后",url:"https://pan.jingxiyuan.cn/d/音乐/庄心妍 - 以后的以后.mp3",artist:"庄心妍",cover:"http://p2.music.126.net/f9rYyPcHr-RdPvnu1b0Wjg==/109951163907595050.jpg?param=300x300",lrc:"[00:02.668]风决定要走 云怎么挽留[00:09.170]曾经抵死纠缠放空的手[00:15.917]情缘似流水 覆水总难收[00:22.673]我还站在你离开 离开的路口[00:29.673]你既然无心 我也该放手[00:36.420]何必痴痴傻傻纠缠不休[00:43.164]是情深缘浅 留一生遗憾[00:49.922]还是情浅缘深 一辈子怨偶[00:56.666]没有我以后 一个人少喝点酒[01:03.167]窗台外的衣服有没有人来收[01:10.168]以后的以后 你是谁的某某某[01:16.916]若是再见 只会让人更难受[01:23.916]没有你以后 一个人四处旅游[01:30.418]在某时某地交上三两个朋友[01:37.419]以后的以后 我牵着别人衣袖[01:43.919]若是有缘再见 也要学会笑着问候[02:04.667]你既然无心 我也该放手[02:11.424]何必痴痴傻傻纠缠不休[02:18.167]是情深缘浅 留一生遗憾[02:25.169]还是情浅缘深 一辈子怨偶[02:31.916]没有我以后 一个人少喝点酒[02:38.172]窗台外的衣服有没有人来收[02:45.418]以后的以后 你是谁的某某某[02:51.859]若是再见 只会让人更难受[02:59.102]没有你以后 一个人四处旅游[03:05.350]在某时某地交上三两个朋友[03:12.604]以后的以后 我牵着别人衣袖[03:18.852]若是有缘再见 也要学会笑着问候[03:25.853]若是有缘再见 也要学会笑着问候"},{name:"再见只是陌生人",url:"https://pan.jingxiyuan.cn/d/音乐/庄心妍-再见只是陌生人.mp3",artist:"庄心妍",cover:"http://p1.music.126.net/KOpKU7pcJyttcbkxfOxHOw==/3388694838107857.jpg?param=300x300",lrc:"[00:00.000] 作词 : 林华勇[00:01.000] 作曲 : 林华勇[00:25.486]爱过你 就当你是错的人[00:31.239]有些错 我们都要负责任[00:37.040]是否我爱了 不该爱的人[00:42.895]其实我 想要的并不过分[00:48.753]爱过你 至少我坦诚承认[00:54.503]有些错 我们不用去争论[01:00.417]也许我错过 幸福的时分[01:06.567]这座城 多了个伤心的人[01:12.174]我们爱的难舍难分 爱的奋不顾身[01:18.147]为何再见只是陌生人[01:23.850]夜来得无声 我的心好冷[01:29.752]那绝望比分手更伤人[01:35.610]我们爱的难舍难分 爱的奋不顾身[01:41.611]爱到最后同样不可能[01:47.312]你走得无痕 我的心好疼[01:53.118]该拿什么与眼泪抗衡[02:19.577]爱过你 至少我坦诚承认[02:25.278]有些错 我们不用去争论[02:31.136]也许我错过 幸福的时分[02:36.989]这座城 多了个伤心的人[02:42.895]我们爱的难舍难分 爱的奋不顾身[02:48.602]为何再见只是陌生人[02:54.563]夜来得无声 我的心好冷[03:00.366]那绝望比分手更伤人[03:06.316]我们爱的难舍难分 爱的奋不顾身[03:12.170]爱到最后同样不可能[03:17.977]你走得无痕 我的心好疼[03:23.877]该拿什么与眼泪抗衡[03:29.731]你走得无痕 我的心好疼[03:35.633]该拿什么与眼泪抗衡"},{name:"破茧",url:"https://pan.jingxiyuan.cn/d/音乐/张韶涵 - 破茧.mp3",artist:"张韶涵",cover:"http://p1.music.126.net/pa8RJxLXBspIrf9W8Sx9GA==/109951165014854982.jpg?param=300x300",lrc:"[00:00.000] 作词 : 曹德智/郭德紫毅[00:01.000] 作曲 : 文颖秋[00:02.000] 编曲 : 文颖秋/赵瑟[00:11.93]如果在噩梦中睁眼[00:14.46]直面着残忍的世界[00:16.98]风拨动了谁的心弦[00:19.72]留恋却来不及告别[00:22.46]如果结局仅剩惨烈[00:24.99]无惧在逆风中破茧[00:27.82]就算那羽翼被撕裂[00:30.29]重回到十九层深渊[00:32.62]牵你手往前走[00:37.25]黑夜白昼不停留[00:41.89]辗转时空[00:43.11]会挫伤会心痛[00:47.71]依然奋勇去战斗[00:52.92]才叫英雄[00:53.93]抬头乱与战不休[00:56.51]回首你在我左右[00:59.09]击溃命运的诅咒[01:03.03]让故事不朽[01:04.55]武魂在放肆狂涌[01:07.28]守护你一腔孤勇[01:09.80]哪怕未来如洪流[01:13.65]也不曾退后[01:18.36]如果在噩梦中睁眼[01:20.89]直面着残忍的世界[01:23.77]风拨动了谁的心弦[01:26.24]留恋却来不及告别[01:28.92]如果结局仅剩惨烈[01:31.71]无惧在逆风中破茧[01:34.23]就算那羽翼被撕裂[01:36.91]重回到十九层深渊[01:39.14]牵你手往前走[01:43.84]黑夜白昼不停留[01:48.50]辗转时空[01:49.67]会挫伤会心痛[01:54.46]依然奋勇去战斗[01:59.35]才叫英雄[02:00.60]抬头乱与战不休[02:03.23]回首你在我左右[02:05.76]击溃命运的诅咒[02:09.70]让故事不朽[02:11.17]武魂在放肆狂涌[02:13.90]守护你一腔孤勇[02:16.38]哪怕未来如洪流[02:20.27]也不曾退后[02:21.94]当现实无路可逃[02:24.62]绝望将希望缠绕[02:27.26]也依旧无所谓地笑[02:32.55]左锤护右手的草[02:35.23]双生的烈焰出鞘[02:37.96]绝处逢生见招拆招[02:43.37]抬头乱与战不休[02:45.95]回首你在我左右[02:48.43]击溃命运的诅咒[02:52.27]让故事不朽[02:53.88]武魂在放肆狂涌[02:56.56]守护你一腔孤勇[02:59.09]哪怕未来如洪流[03:02.87]也不曾退后[03:04.69]当现实无路可逃[03:07.22]绝望将希望缠绕[03:09.89]也依旧无所谓地笑[03:15.31]左锤护右手的草[03:17.88]双生的烈焰出鞘[03:20.60]绝处逢生见招拆招[03:24.14]也不曾退后" -},{name:"芒种",url:"https://pan.jingxiyuan.cn/d/音乐/音阙诗听赵方婧-芒种.mp3",artist:"赵方婧",cover:"http://p2.music.126.net/uUb-wh8KjjJk0dG3G_GFLQ==/109951167148117469.jpg?param=300x300",lrc:"[00:00.000] 作词 : 假寐[00:00.000] 作曲 : 殇小谨[00:00.00]音阙诗听、赵方婧 - 芒种[00:00.00]作词:假寐[00:00.00]作曲:殇小谨[00:00.00]编曲:Morri3on(乔凡三)[00:01.38]一想到你我就[00:04.24]Wu[00:04.85]空恨别梦久[00:07.31]Wu[00:09.70]烧去纸灰埋烟柳[00:33.75]于鲜活的枝丫[00:36.03]凋零下的无暇[00:38.44]是收获谜底的代价[00:42.37]余晖沾上[00:43.78]远行人的发[00:45.60]他洒下手中牵挂[00:49.54]于桥下[00:51.72]前世迟来者[00:53.38]擦肩而过[00:54.60]掌心刻[00:55.56]来生记得[00:57.09]你眼中烟波滴落一滴墨[00:59.96]Wo[01:01.99]若佛说[01:02.80]无牵无挂[01:04.00]放下执着[01:05.40]无相无色[01:06.58]我怎能[01:07.28]波澜不惊[01:08.43]去附和[01:10.90]一想到你我就[01:13.17]Wu[01:14.55]恨情不寿[01:15.35]总于苦海囚[01:16.81]Wu[01:19.18]新翠徒留[01:20.09]落花影中游[01:21.60]Wu[01:24.02]相思无用[01:24.88]才笑山盟旧[01:26.34]Wu[01:29.93]谓我何求[01:39.81]谓我何求[01:43.37]种一万朵莲花[01:45.58]在众生中发芽[01:48.00]等红尘一万种解答[01:51.88]念珠落进[01:53.39]时间的泥沙[01:55.40]待割舍诠释慈悲的读法[02:01.29]前世迟来者[02:02.65]擦肩而过[02:04.28]掌心刻[02:05.24]来生记得[02:06.65]你眼中烟波滴落一滴墨[02:09.58]Wo[02:11.46]若佛说[02:12.47]无牵无挂[02:13.77]放下执着[02:14.88]无相无色[02:16.13]我怎能[02:16.89]波澜不惊[02:18.13]去附和[02:22.95]一想到你我就[02:25.16]Wu[02:26.42]恨情不寿[02:27.35]总于苦海囚[02:28.76]Wu[02:31.17]新翠徒留[02:32.08]落花影中游[02:33.59]Wu[02:36.00]相思无用[02:36.91]才笑山盟旧[02:38.61]Wu[02:42.16]谓我何求[02:51.65]谓我何求"},{name:"凉凉",url:"https://pan.jingxiyuan.cn/d/音乐/杨宗纬、张碧晨 - 凉凉.mp3",artist:"杨宗纬、张碧晨",cover:"http://p1.music.126.net/mmyJBXc7xakVOmKSHeM8wg==/109951165336492651.jpg?param=300x300",lrc:"[00:00.000] 作词 : 刘畅[00:01.000] 作曲 : 谭旋[00:02.000] 编曲 : 尼克[00:03.000] Program : 尼克[00:07.220][00:40.620]女:[00:42.760]入夜渐微凉[00:45.040]繁花落地成霜[00:47.630]你在远方眺望[00:50.480]耗尽所有暮光[00:53.080]不思量自难相忘[01:00.330][01:02.540]男:[01:04.300]夭夭桃花凉[01:06.450]前世你怎舍下[01:08.990]这一海心茫茫[01:11.800]还故作不痛不痒不牵强[01:18.980]都是假象[01:22.840]女:[01:25.310]凉凉夜色为你思念成河[01:30.800]化作春泥呵护着我[01:34.960]男:[01:36.400]浅浅岁月拂满爱人袖[01:40.740]片片芳菲入水流[01:46.080]女:[01:47.030]凉凉天意潋滟一身花色[01:52.220]落入凡尘伤情着我[01:55.990]男:[01:57.490]生劫易渡情劫难了[02:00.490]折旧的心还有几分前生的恨[02:08.330]还有几分[02:10.750]合:[02:12.470]前生的恨[02:15.750][02:35.670]女:[02:37.740]也曾鬓微霜[02:39.870]也曾因你回光[02:42.370]悠悠岁月漫长[02:44.910]怎能浪费时光[02:47.660]去流浪[02:48.600]男:[02:49.130]去流浪[02:51.030]女:[02:52.440]去换成长[02:55.370][02:56.070]男:[02:58.490]灼灼桃花凉[03:01.230]今生愈渐滚烫[03:03.410]合:[03:03.820]一朵已放心上[03:06.320]足够三生三世背影成双[03:10.360]女:[03:11.150]背影成双[03:12.190][03:13.070]合:[03:13.650]在水一方[03:18.830]女:[03:20.330]凉凉夜色为你思念成河[03:25.590]化作春泥呵护着我[03:29.250]男:[03:30.940]浅浅岁月拂满爱人袖[03:35.290]片片芳菲入水流[03:40.980]女:[03:41.860]凉凉天意潋滟一身花色[03:46.780]落入凡尘伤情着我[03:50.850]男:[03:52.400]生劫易渡情劫难了[03:55.170]折旧的心还有[03:57.170]合:[03:57.770]几分前生的恨[04:03.190][04:12.760]女:[04:14.000]凉凉三生三世恍然如梦[04:18.950]须臾的年风干泪痕[04:22.700]男:[04:24.310]若是回忆不能再相认[04:28.040]合:[04:28.660]就让情分落九尘[04:34.410]女:[04:35.020]凉凉十里何时还会春盛[04:39.880]又见树下一盏风存[04:44.090]男:[04:45.710]落花有意流水无情[04:48.490]别让恩怨爱恨[04:50.550]合:[04:51.120]凉透那花的纯[04:57.570][05:00.040]吾生愿牵尘"},{name:"红昭愿",url:"https://pan.jingxiyuan.cn/d/音乐/音阙诗听-红昭愿.mp3",artist:"音阙诗听",cover:"http://p1.music.126.net/A7TUsw1K59EvGblIRnXxLQ==/109951167708802304.jpg?param=300x300",lrc:"[00:00.000] 作词 : 杨宇勋[00:00.153] 作曲 : 杨宇勋[00:00.306] 编曲 : 杨宇勋[00:00.459]混音:杨宇勋[00:01.001]母带:杨宇勋[00:18.765]手中雕刻生花,[00:20.919]刀锋千转蜿蜒成画,[00:22.994]盛名功德塔,[00:24.465]是桥畔某处人家,[00:27.166]春风绕过发梢红纱,[00:29.339]刺绣赠他,[00:31.021]眉目刚烈拟作妆嫁,[00:35.167]轰烈流沙枕上白发,[00:37.726]杯中酒比划,[00:39.492]年少风雅鲜衣怒马,[00:41.556]也不过一刹那,[00:43.761]难免疏漏儿时檐下,[00:45.776]莫测变化,[00:47.754]隔却山海,[00:49.350]转身从容煎茶,[01:08.581]一生长,[01:08.984]重寄一段过往,[01:11.107]将希冀都流放,[01:13.151]可曾添些荒唐,[01:14.987]才记得你的模样,[01:16.821]一身霜,[01:17.881]谁提笔只两行,[01:19.439]换一隅你安康,[01:21.769]便销得这沧桑,[01:23.254]你还在我的心上,[01:42.020]手中雕刻生花,[01:44.241]刀锋千转蜿蜒成画,[01:46.158]盛名功德塔,[01:48.174]是桥畔某处人家,[01:50.554]春风绕过发梢红纱,[01:52.766]刺绣赠他,[01:54.600]眉目刚烈拟作妆嫁,[01:58.711]轰烈流沙枕上白发,[02:00.633]杯中酒比划,[02:03.043]年少风雅鲜衣怒马,[02:05.251]也不过一刹那,[02:07.209]难免疏漏儿时檐下,[02:09.172]莫测变化,[02:11.273]隔却山海,[02:13.227]转身从容煎茶,[02:15.302]一生长,[02:16.069]重寄一段过往,[02:17.883]将希冀都流放,[02:20.147]可曾添些荒唐,[02:21.747]才记得你的模样,[02:23.347]一身霜,[02:24.368]谁提笔只两行,[02:26.415]换一隅你安康,[02:28.345]便销得这沧桑,[02:30.033]你还在我的心上,[02:31.903]一生长,[02:32.779]重寄一段过往,[02:34.713]将希冀都流放,[02:36.773]可曾添些荒唐,[02:38.396]才记得你的模样,[02:40.215]一身霜,[02:41.328]谁提笔只两行,[02:42.717]换一隅你安康,[02:45.000]便销得这沧桑,[02:46.636]你还在我的心上"},{name:"爱你",url:"https://pan.jingxiyuan.cn/d/音乐/王心凌 - 爱你.mp3",artist:"王心凌",cover:"http://p2.music.126.net/Ab50uJzhEKY--PT6iZs38Q==/109951165325705447.jpg?param=300x300",lrc:"[00:02.49]爱你(原版伴奏 翻自:王心凌)[00:03.58]yo yo yo yo Cyndi what~what's wrong with me (爱你)[00:09.72]yo yo Cyndi baby what's wrong with me[00:14.54]Cyndi give me your love you make me sneeze all the time[00:22.77]Now now怎么我一直狂打喷嚏 在凌晨三点二十六分[00:28.34]let me sing let me sing a song陪人入睡[00:31.31]what is love嗯哼我正在听 你要什么都say yes[00:37.92]Cyndi I really do love you so[00:40.55]如果你突然打了个喷嚏 那一定就是我在想你[00:45.24]如果半夜被手机吵醒 啊那是因为我关心[00:49.52]常常想 你说的话是不是别有用心 明明很想相信[00:56.90]却又忍不住怀疑 在你的心里 我是否就是唯一[01:04.28]爱 就是有我常烦着你[03:04.66][02:45.30][02:11.16][01:08.93]So-baby 情话多说一点 想我就多看一眼[03:09.12][02:49.88][02:16.62][01:14.06]表现多一点点 让我能 真的看见 Oh-Bye 少说一点[03:16.16][02:57.00][02:23.28][01:20.83]想陪你不只一天 多一点 让我 心甘情愿--爱你[01:43.89]喜欢在你的臂弯里胡闹 你的世界是一座城堡[01:47.51]在大头贴画满心号 贴在手机上对你微笑 常常想[01:53.04]我说的话你是否听得进去 明明很想生气 却又止不住笑意[02:01.79](Oh-)在我的心里 你真的就是唯一 爱 就是有我常赖着你[02:30.17]就这样 一天多一点 慢慢地累积感觉[02:35.78]两人的世界 就能够贴近一点[03:23.54](多一点 才会慢慢发现 因为你 让我心甘情愿)"},{name:"就是爱你",url:"https://pan.jingxiyuan.cn/d/音乐/陶喆 - 就是爱你.mp3",artist:"陶喆",cover:"http://p1.music.126.net/ZR6QuByWgej9-aRhZjLqHw==/109951163803188844.jpg?param=300x300g?param=300x300",lrc:"[00:00.000] 作词 : 娃娃[00:01.000] 作曲 : 陶喆[00:02.000] 编曲 : 陶喆[00:22.72][00:26.36]我 一直都想对你说[00:30.84]你给我想不到的快乐[00:35.75]像绿洲给了沙漠[00:39.25]说 你会永远陪着我[00:43.77]做我的根 我翅膀[00:46.60]让我飞 也有回去的窝[00:52.31]我愿意 我也可以[00:58.41]付出一切 也不会可惜[01:04.83]就在一起 看时间流逝[01:11.31]要记得我们相爱的方式[01:17.30][01:18.30]就是爱你爱着你[01:22.30]有悲有喜[01:25.58]有你 平淡也有了意义[01:31.24]就是爱你爱着你[01:35.29]甜蜜又安心[01:40.98]那种感觉就是你[01:45.83][01:57.19]我 一直都想对你说[02:01.63]你给我想不到的快乐[02:06.48]像绿洲给了沙漠[02:10.14]说 你会永远陪着我[02:14.58]做我的根 我翅膀[02:17.39]让我飞 也有回去的窝[02:23.11]我愿意 真的愿意[02:29.13]付出所有 也要保护你[02:36.08]在一起 时间继续流逝[02:42.10]请记得我有多么的爱你[02:48.04][02:49.04]就是爱你爱着你[02:53.15]不弃不离[02:56.26]不在意 一路有多少风雨[03:02.09]就是爱你爱着你[03:06.12]放在你手心[03:11.32]灿烂的幸福全给你[03:15.01]就是爱你爱着你[03:19.08]不弃不离[03:22.25]不在意 一路有多少风雨[03:27.98]就是爱你爱着你[03:32.41]放在你手心(放在你手心)[03:37.27]灿烂的幸福全给你[03:41.02]就是爱你爱着你[03:45.00]我都愿意[03:47.45]就是爱你爱着你[03:51.50]要我们在一起(要我们在一起)[03:53.95]就是爱你爱着你(爱着你)[03:57.99]我都愿意(我都愿意)[04:00.44]就是爱你爱着你[04:04.01]要我们在一起(要我们在一起)[04:06.90]就是爱你爱着你[04:10.95]我都愿意[04:13.43]就是爱你爱着你(我们在一起)[04:17.46]要我们在一起"},{name:"爱我还是他",url:"https://pan.jingxiyuan.cn/d/音乐/陶喆 - 爱我还是他.mp3",artist:"陶喆",cover:"http://p1.music.126.net/ZR6QuByWgej9-aRhZjLqHw==/109951163803188844.jpg?param=300x300g?param=300x300",lrc:"[00:00.000] 作词 : 娃娃/陶喆[00:01.000] 作曲 : 陶喆[00:02.000] 编曲 : 陶喆[00:03.000] 弦乐编写 : 吴庆隆[00:16.40][00:17.81]黑暗中的我们都没有说话[00:24.24]你只想回家 不想你回家[00:32.28]寂寞深得像海太让人害怕[00:38.96]温柔你的手 轻轻揉着我的发[00:46.24]你的眉眼说 你好渴望我拥抱[00:53.41]你身体却在拼命逃[00:57.04]当欲望在燃烧[01:05.00][01:06.27]你爱我还是他[01:12.73]是不是真的他有比我好[01:17.14]你为谁在挣扎[01:20.77]你爱我还是他[01:27.28]就说出你想说的真心话[01:31.81]你到底要跟我还是他[01:38.43][01:43.05]爱 爱 爱 他[01:50.23][01:51.23]这是不是命运对我的惩罚[01:57.28]爱你也没办法 恨你也没办法[02:05.67]陷在这个漩涡只想挣脱它[02:11.95]拉住你的手 却让我也被拖下[02:19.25]你的眉眼说 你不渴望我拥抱[02:26.00]每当爱变成了煎熬[02:29.85]你就开始要逃[02:34.28][02:35.28]你爱我还是他[02:41.69]是不是我可以做得更好[02:45.92]让你不再挣扎[02:49.56]你爱我还是他[02:56.11]我宁愿听到残忍的回答[03:00.44]也不要再被耍[03:04.07]你爱我还是他[03:10.57]我为你找了一百个理由[03:14.86]我就是那么傻[03:18.71]你爱我还是他[03:24.98]是否沉默代替你的回答[03:29.32]我应该明白吧[03:33.41][04:06.00]Yeah 爱我还是他 喔[04:13.75]你都已看不到我们的好[04:17.99]我还为谁牵挂[04:20.50]喔 你爱我还是他[04:28.05]是否沉默就是你的回答[04:32.24]我们都别挣扎[04:39.04]去爱他"},{name:"爱,很简单",url:"https://pan.jingxiyuan.cn/d/音乐/陶喆 - 爱,很简单(I Love You).mp3",artist:"陶喆",cover:"http://p1.music.126.net/ZR6QuByWgej9-aRhZjLqHw==/109951163803188844.jpg?param=300x300g?param=300x300",lrc:"[00:08.81]忘了是怎么开始[00:12.69]也许就是对你 有一种感觉[00:22.80]突然间发现自己[00:26.35]已深深爱上你 真的很简单[00:35.96]爱得地暗天黑都已无所谓[00:42.68]是是非非无法抉择[00:49.69]没有后悔为爱日夜去跟随[00:56.46]那个疯狂的人是我 喔......[01:03.00]I love you[01:08.85]无法不爱你 Baby 说你也爱我[01:16.65]I love you[01:22.48]永远不愿意 Baby 失去你[01:30.91]不可能更快乐[01:35.56]只要能在一起 做什么都可以[01:44.42]虽然世界变个不停[01:49.29]用最真诚的心 让爱变得简单[01:59.69]爱得地暗天黑都已无所谓[02:06.41]是是非非无法抉择[02:13.39]没有后悔为爱日夜去跟随[02:20.22]那个疯狂的人是我 喔...[02:26.40]I love you[02:32.59]我一直在这里 Baby 一直在爱你[02:40.27]I love you yes,I do[02:46.37]永远都不放弃[02:49.64]这爱你的权利[02:54.74]如果你还有一些困惑 Oh no[03:01.93]请贴着我的心倾听[03:07.46]听我说着爱你 Yes I do[03:31.84]Come on now[03:45.23]One More Time[03:46.75]I love you Yes I do[03:53.05]一直在这里 Babe[03:55.12]Oh yeah 一直在爱你[04:00.50]I love you[04:06.65]永远都不放弃[04:08.48]这爱你的权利"},{name:"此生不换",url:"http://music.163.com/song/media/outer/url?id=25638340.mp3",artist:"青鸟飞鱼",cover:"http://p2.music.126.net/UyDVlWWgOn8p8U8uQ_I1xQ==/7934075907687518.jpg?param=300x300",lrc:"[00:00.000] 作词 : 杨漩予[00:01.000] 作曲 : 闻震[00:30.78]时光穿不断 流转在从前[00:38.34]刻骨的变迁 不是遥远[00:45.18]再有一万年 深情也不变[00:52.55]爱像烈火般蔓延[00:59.76][01:01.18]记忆是条长线 盘旋在天边[01:08.32]沉浮中以为 情深缘浅[01:15.09]你再度出现 我看见誓言[01:22.49]承诺在水天之间[01:29.16][01:29.63]回头看 不曾走远[01:37.17]依依目光此生不换[01:44.32]要分散 不习惯[01:48.32]怎么算 都太难[01:52.03]分开之后更勇敢[01:58.98]愿这爱 世代相传[02:10.20][02:11.33]喝不完忘情水 不让你如烟[02:17.55]前尘再怀恋 望剑如面[02:25.18]挥舞的瞬间 别再闭上眼[02:32.67]错过惊世的依恋[02:38.88][02:39.52]回头看 不曾走远[02:47.37]眷恋一人流连忘返[02:54.52]多少汗 够温暖 你哭喊 我呼唤[03:02.17]听清耳边的呢喃[03:09.34]别害怕 风轻云淡[03:19.55][03:22.99][03:30.18]回头看 不曾走远[03:39.07]依依目光此生不换[03:46.42]要分散 不习惯[03:49.91]怎么算 都太难[03:54.08]分开之后更勇敢[04:01.09]愿这爱 世代相传"},{name:"我的歌声里",url:"https://pan.jingxiyuan.cn/d/音乐/曲婉婷 - 我的歌声里.mp3",artist:"曲婉婷",cover:"http://p2.music.126.net/8jt2KnGDF0qMP9JbidOtVA==/573945069746475.jpg?param=300x300",lrc:"[00:16.77]没有一点点防备[00:18.32]也没有一丝顾虑[00:20.37]你就这样出现在我的世界里[00:25.36]带给我惊喜 情不自已[00:32.05]可是你偏又这样[00:34.10]在我不知不觉中 悄悄的消失[00:38.58]从我的世界里 没有音讯[00:42.42]剩下的只是回忆[00:51.12]你存在 我深深的脑海里[00:57.85]我的梦里 我的心里 我的歌声里[01:06.40]你存在 我深深的脑海里[01:13.19]我的梦里 我的心里 我的歌声里[01:38.28]还记得我们曾经[01:39.78]肩并肩一起走过 那段繁华巷口[01:44.23]尽管你我是陌生人 是过路人[01:48.76]但彼此还是感觉到了对方的[01:52.84]一个眼神 一个心跳[01:56.66]一种意想不到的快乐[02:03.44]好像是一场梦境 命中注定[02:17.43]你存在 我深深的脑海里[02:23.90]我的梦里 我的心里 我的歌声里[02:32.20]你存在 我深深的脑海里[02:38.85]我的梦里 我的心里 我的歌声里[02:47.25]世界之大为何我们相遇[02:53.61]难道是缘分 难道是天意[03:02.60]你存在 我深深的脑海里[03:08.74]我的梦里 我的心里 我的歌声里[03:17.09]你存在 我深深的脑海里[03:23.72]我的梦里 我的心里 我的歌声里"},{name:"落花",url:"https://pan.jingxiyuan.cn/d/音乐/林心如 - 落花.mp3",artist:"林心如",cover:"http://p1.music.126.net/3K3yb63mpahXzBUvpowLFw==/3416182643891193.jpg?param=300x300",lrc:"[00:00.000] 作词 : 于正[00:01.000] 作曲 : 毛慧[00:02.000] 编曲 : 谭旋[00:09.59]花开的时候最珍贵 花落了就枯萎[00:18.31]错过了花期花怪谁 花需要人安慰[00:27.39][00:32.25]一生要哭多少回 才能不流泪[00:41.05]一生要流多少泪 才能不心碎[00:49.56]我眼角眉梢的憔悴 没有人看得会[00:58.40]当初的誓言太完美 像落花满天飞[01:07.18]冷冷的夜里北风吹 找不到人安慰[01:16.17]当初的誓言太完美 让相思化成灰[01:24.96][01:43.20]一生要干多少杯 才能不喝醉[01:52.15]一生要醉多少回 才能不怕黑[02:00.60]我眼角眉梢的憔悴 没有人看得会[02:09.27]当初的誓言太完美 像落花满天飞[02:18.22]冷冷的夜里北风吹 找不到人安慰[02:27.15]当初的誓言太完美 让相思化成灰[02:35.74]冷冷的夜里北风吹 找不到人安慰[02:44.82]当初的誓言太完美 让相思化成灰[02:53.70]花开的时候最珍贵 花落了就枯萎[03:02.78]错过了花期花怪谁 花需要人安慰"},{name:"红颜旧",url:"http://music.163.com/song/media/outer/url?id=32924132.mp3",artist:"刘涛",cover:"http://p1.music.126.net/Ztk5uyPhXS5Ygulu5y4NUA==/3430476280187276.jpg?param=300x300",lrc:"[00:00.000] 作词 : 袁亮[00:01.000] 作曲 : 赵佳霖[00:04.080][00:28.510]西风夜渡寒山雨[00:34.520]家国依稀残梦里[00:41.470]思君不见倍思君[00:47.680]别离难忍忍别离[00:53.320][00:54.490]狼烟烽火何时休[00:59.120][01:00.350]成王败寇尽东流[01:06.090][01:07.030]蜡炬已残泪难干[01:13.230]江山未老红颜旧[01:19.080][01:20.190]忍别离[01:22.430]不忍却又别离[01:26.410]托鸿雁南去[01:29.250]不知此心何寄[01:32.840]红颜旧[01:35.140]任凭斗转星移[01:39.290]唯不变此情悠悠[01:45.160][01:48.160]狼烟烽火何时休[01:55.220]成王败寇尽东流[02:00.280][02:01.370]蜡炬已残泪难干[02:07.670]江山未老红颜旧[02:13.650][02:14.370]忍别离[02:16.790]不忍却要别离[02:20.780]托鸿雁南去[02:23.670]不知此心何寄[02:27.200]红颜旧[02:29.570]任凭斗转星移[02:33.530]唯不变此情悠悠[02:38.810][02:39.990]忍别离[02:42.480]不忍却要别离[02:46.310]托鸿雁南去[02:49.260]不知此心何寄[02:52.910]红颜旧[02:55.130]任凭斗转星移[02:59.220]唯不变此情悠悠[03:04.470][03:05.460]唯不变此情悠悠[03:10.780][03:11.900]唯不变此情悠悠"},{name:"勇气",url:"https://pan.jingxiyuan.cn/d/音乐/梁静茹 - 勇气.mp3",artist:"梁静茹",cover:"http://p2.music.126.net/PavIMxZq16K7-0fSF5n-yg==/109951163240604120.jpg?param=300x300",lrc:"[00:00.000] 作词 : 瑞业[00:01.000] 作曲 : 光良[00:02.000] 编曲 : Mac Chew[00:03.000] 制作人 : 光良[00:04.00]Recording Engineers: Peter Chong (Mal) / Rahmad[00:05.00]Mixing Engineer: 林正忠[00:06.00]Recording Studio: Synchrosound (Mal) / Baby Boss[00:07.00]Mixing Studio: 谱丽音[00:08.00]Musicians:[00:09.00]Guitars: Jamie Wilson[00:10.00]Bass: Ah Kean[00:11.00]Drum: Gary[00:12.00]Background Vocal Arrangement: 光良[00:13.00]Background Vocals: 光良/周博华[00:14.00]OP: Rock Music Publ. (TWN) Co., Ltd.[00:15.00]ISRC TW-A45-00-653-01[00:22.968]终于做了这个决定[00:25.169]别人怎么说我不理[00:27.267]只要你也一样的肯定[00:30.618]我愿意天涯海角都随你去[00:34.668]我知道一切不容易[00:38.818]我的心一直温习说服自己[00:43.472]最怕你忽然说要放弃[00:52.276]爱真的需要勇气[00:55.477]来面对流言蜚语[00:59.577]只要你一个眼神肯定[01:04.279]我的爱就有意义[01:08.629]我们都需要勇气[01:12.030]去相信会在一起[01:16.080]人潮拥挤我能感觉你[01:20.735]放在我手心里 你的真心[01:26.839][01:39.698]终于做了这个决定[01:41.848]别人怎么说我不理[01:43.848]只要你也一样的肯定[01:47.298]我愿意天涯海角都随你去[01:51.349]我知道一切不容易[01:55.599]我的心一直温习说服自己[02:00.161]最怕你忽然说要放弃[02:06.675]爱真的需要勇气[02:10.025]来面对流言蜚语[02:14.276]只要你一个眼神肯定[02:18.726]我的爱就有意义[02:23.177]我们都需要勇气[02:26.627]去相信会在一起[02:30.838]人潮拥挤我能感觉你[02:35.341]放在我手心里 你的真心[02:44.493]如果我的坚强任性[02:47.894]会不小心伤害了你[02:52.744]你能不能温柔提醒[02:56.337]我虽然心太急[02:58.138]更害怕错过你[03:00.440]爱真的需要勇气[03:03.942]来面对流言蜚语[03:08.198]只要你一个眼神肯定[03:12.648]我的爱就有意义[03:17.101]我们都需要勇气[03:20.652]去相信会在一起[03:24.802]人潮拥挤我能感觉你[03:29.328]放在我手心里 你的真心"},{name:"宁夏",url:"http://music.163.com/song/media/outer/url?id=5237761.mp3",artist:"梁静茹",cover:"http://p2.music.126.net/PavIMxZq16K7-0fSF5n-yg==/109951163240604120.jpg?param=300x300",lrc:"[00:00.000] 作词 : 李正帆[00:00.088] 作曲 : 李正帆[00:00.176] 编曲 : 五月天[00:00.264] 制作人 : 五月天/贾敏恕[00:00.352] OP : Sony Music Publishing (Pte) Ltd. Taiwan Branch[00:00.440] 贝斯 : 玛莎[00:00.528] 鼓 : 冠佑[00:00.616] 吉他 : 怪兽/石头[00:00.704] 和声编写 : 玛莎/阿信[00:00.792] 录音工程师 : 五月天/蔡尚文[00:00.880] 和声 : 玛莎/阿信[00:00.968] 录音室 : 五月天录音室[00:01.57]宁夏[00:22.40]宁静的夏天 天空中繁星点点[00:29.60]心里头有些思念 思念着你的脸[00:35.80]我可以假装看不见 也可以偷偷地想念[00:42.69]直到让我摸到你那温暖的脸[00:50.73][00:59.19]宁静的夏天 天空中繁星点点[01:05.77]心里头有些思念 思念着你的脸[01:11.88]我可以假装看不见 也可以偷偷地想念[01:18.82]直到让我摸到你那温暖的脸[01:27.21][01:30.39]知了也睡了 安心地睡了[01:36.05]在我心里面 宁静的夏天[01:41.89]知了也睡了 安心的睡了[01:49.30]在我心里面 宁静的夏天[01:56.79][02:00.61]宁静的夏天 天空中繁星点点[02:06.42]心里头有些思念 思念着你的脸[02:12.91][02:13.62]我可以假装看不见 也可以偷偷地想念[02:20.51]直到让我摸到你那温暖的脸[02:29.51]那是个宁静的夏天[02:35.39]你来到宁夏的那一天[02:39.50][02:40.20]知了也睡了 安心的睡了[02:46.86]在我心里面 宁静的夏天[02:52.63]知了也睡了 安心的睡了[03:06.90]在我心里面 宁静的夏天"},{name:"星月神话",url:"https://pan.jingxiyuan.cn/d/音乐/金莎 - 星月神话.mp3",artist:"金莎",cover:"http://p2.music.126.net/BGEAOKpfmcecGCFVBrK2Wg==/109951166541447225.jpg?param=300x300",lrc:"[00:00.000] 作词 : 金莎[00:01.000] 作曲 : 金莎[00:02.000] 编曲 : 金莎[00:37.30]我的一生最美好的场景[00:42.99]就是遇见你[00:48.11]在人海茫茫中静静凝望着你[00:54.55]陌生又熟悉[01:00.36]啊...... 啊 ......[01:11.37]尽管呼吸着同一天空的气息[01:17.74]却无法拥抱到你[01:22.74]如果转换了时空身份和姓名[01:28.55]但愿认得你眼睛[01:34.36]千年之后的你会在哪里[01:40.30]身边有怎样风景[01:45.93]我们的故事并不算美丽[01:51.67]却如此难以忘记[02:21.61]啊 ...啊 ...[02:32.30]尽管呼吸着同一天空的气息[02:38.68]却无法拥抱到你[02:43.74]如果转换了时空身份和姓名[02:49.55]但愿认得你眼睛[02:55.30]千年之后的你会在哪里[03:01.05]身边有怎样风景[03:06.92]我们的故事并不算美丽[03:12.61]却如此难以忘记[03:18.61]如果当初勇敢的在一起[03:24.17]会不会不同结局[03:30.05]你会不会也有千言万语[03:35.92]埋在沉默的梦里"},{name:"痴心绝对",url:"http://music.163.com/song/media/outer/url?id=114741.mp3",artist:"李圣杰",cover:"http://p1.music.126.net/vdeCvXRxdAsTCNCVevrYDg==/109951167546700837.jpg?param=300x300",lrc:"[00:00.000] 作词 : 蔡伯南[00:01.000] 作曲 : 蔡伯南[00:02.000] 编曲 : 陈飞午[00:12.60][00:17.86]想用一杯Latte把你灌醉[00:22.25]好让你能多爱我一点[00:26.82]暗恋的滋味你不懂这种感觉[00:31.70]早有人陪的你永远不会[00:38.19]看见你和他在我面前[00:42.61]证明我的爱只是愚昧[00:47.09]你不懂我的 那些憔悴[00:51.61]是你永远不曾过的体会[00:56.44][00:58.41]为你付出那种伤心你永远不了解[01:02.89]我又何苦勉强自己爱上你的一切[01:07.42]你又狠狠逼退 我的防备[01:11.95]静静关上门来默数我的泪[01:16.16]明知道让你离开他的世界不可能会[01:20.93]我还傻傻等到奇迹出现的那一天[01:25.40]直到那一天 你会发现[01:29.90]真正爱你的人独自守着伤悲[01:38.74][02:10.36]看见你和他在我面前[02:14.76]证明我的爱只是愚昧[02:19.28]你不懂我的 那些憔悴[02:23.76]是你永远不曾过的体会[02:28.89][02:30.24]明知道让你离开他的世界不可能会[02:35.07]我还傻傻等到奇迹出现的那一天[02:39.58]直到那一天 你会发现[02:44.05]真正爱你的人独自守着伤悲[02:52.03][02:53.03]曾经我以为我自己会后悔[02:57.58]不想爱得太多痴心绝对[03:01.99]为你落第一滴泪[03:04.30]为你作任何改变[03:06.57]也唤不回你对我的坚决[03:12.22][03:13.22]为你付出那种伤心你永远不了解[03:17.79]我又何苦勉强自己爱上你的一切[03:22.25]你又狠狠逼退 我的防备[03:26.75]静静关上门来默数我的泪[03:30.97]明知道让你离开他的世界不可能会[03:35.72]我还傻傻等到奇迹出现的那一天[03:40.25]直到那一天 你会发现[03:44.72]真正爱你的人独自守着伤悲[03:53.69]直到那一天 你会发现[03:58.63]真正爱你的人独自守着 伤悲[04:10.17]"},{name:"卡路里",url:"http://music.163.com/song/media/outer/url?id=1294924781.mp3",artist:"火箭少女101",cover:"http://p2.music.126.net/fcmIRLdxD1ngZABV9N5maA==/109951163425833838.jpg?param=300x300",lrc:"[00:00.000] 作词 : 李聪[00:00.169] 作曲 : Akiyama Sayuri[00:00.338] 编曲 : 彭飞[00:00.507] 制作人 : 彭飞[00:00.676] 吉他 : 郭一凡[00:00.845] 录音室 : RMB Studio - 爆棚[00:01.014] 录音师 : 刘鑫磊[00:01.183] 混音师 : 赵靖[00:01.352] 混音室 : BIG.J Studio[00:01.521] 监制 : 高航[00:01.690] 企划 : 奔跑怪物[00:01.859] 首席运营 : 哇唧唧哇[00:02.31][00:14.66]孟美岐:[00:17.56]每天起床第一句 先给自己打个气[00:21.04]吴宣仪:[00:21.41]每次多吃一粒米 都要说声对不起[00:24.60]段奥娟:[00:25.02]魔镜魔镜看看我 我的锁骨在哪里[00:28.19]紫宁:[00:28.52]美丽 我要美丽 我要变成万人迷[00:32.16]合:[00:32.32]Pose pose[00:34.13]我要变成万人迷[00:35.76]Pose pose[00:37.70]徐梦洁:[00:39.51]为了变成小蛮腰 天天提着一口气[00:42.76]赖美云:[00:43.15]为了穿上比基尼 吃草吃成沙拉精[00:46.47]傅菁:[00:46.80]天生丽质难自弃 可惜吃啥我都不腻[00:50.18]合:[00:50.32]努力 我要努力 我要变成万人迷[00:53.75]李紫婷/赖美云/紫宁/徐梦洁:[00:54.98]Wow[00:56.70]吴宣仪/孟美岐/段奥娟/傅菁:[00:57.62]卡路里卡路里卡路[00:59.33]卡路里卡路里卡路[01:01.15]卡路里卡路里卡路[01:02.95]卡路里卡路里卡路[01:04.75]合:[01:04.91]卡路里我的天敌[01:06.64]杨超越:[01:07.13]燃烧我的卡路里[01:08.24]合:[01:08.63]拜拜 甜甜圈 珍珠奶茶方便面[01:12.01]火锅米饭大盘鸡[01:13.42]孟美岐/吴宣仪:[01:14.08]拿走拿走别客气[01:15.65]合:[01:15.80]拜拜 咖啡因 戒掉可乐戒油腻[01:19.32]沙发外卖玩游戏[01:21.15]Yamy/Sunnee:[01:21.50]别再熬夜伤身体[01:22.82]合:[01:22.97]来来 后转体 高温瑜伽仰卧起[01:26.51]动感单车普拉提[01:28.15]赖美云/徐梦洁:[01:29.03]保温杯里泡枸杞[01:30.26]合:[01:30.41]来来 深呼吸 晨跑夜跑游几米[01:33.83]平板哑铃划船机 不达目的不放弃[01:43.86]吴宣仪:[01:46.65]为了变成小蛮腰 天天提着一口气[01:50.06]孟美岐:[01:50.46]为了穿上比基尼 吃草吃成沙拉精[01:53.75]李紫婷:[01:54.14]天生丽质难自弃 可惜吃啥我都不腻[01:57.52]合:[01:57.70]努力 我要努力 我要变成万人迷[02:01.26]李紫婷/赖美云/紫宁/徐梦洁:[02:02.51]Wow[02:04.28]吴宣仪/孟美岐/段奥娟/傅菁:[02:05.18]卡路里卡路里卡路[02:06.68]卡路里卡路里卡路[02:08.39]卡路里卡路里卡路[02:10.20]卡路里卡路里卡路[02:12.02]合:[02:12.17]卡路里我的天敌[02:13.79]杨超越:[02:14.21]燃烧我的卡路里[02:15.73]合:[02:15.88]拜拜 甜甜圈 珍珠奶茶方便面[02:19.29]火锅米饭大盘鸡 拿走拿走别客气[02:22.96]拜拜 咖啡因 戒掉可乐戒油腻[02:26.56]沙发外卖玩游戏 别再熬夜伤身体[02:30.23]来来 后转体 高温瑜伽仰卧起[02:33.90]动感单车普拉提 保温杯里泡枸杞[02:37.50]来来 深呼吸 晨跑夜跑游几米[02:41.16]平板哑铃划船机 不达目的不放弃[02:44.58]Yamy/Sunnee(Rap):[02:45.15]Yamy:[02:45.18]奇了怪了 小的时候明明是 妈妈说[02:46.39]吃光盘中餐粒粒 皆辛苦[02:48.34]Sunnee:[02:48.49]直到最爱的裙子的扣子都系不上了[02:49.99]Yamy:[02:50.11]原来吃得掉 甩不掉 更辛苦[02:51.84]Yamy:[02:52.34]希望 体重 秤是坏的[02:53.60]Sunnee:[02:53.63]帅哥 爱唐代的[02:54.03]合:[02:54.53]不如跟着节奏没在怕的 努努力[02:55.70]别让卡路里卡路里 卡住你[02:57.58]不达目的不放弃[02:59.22]杨超越:[02:59.67]燃烧我的卡路里[03:00.90]合:[03:01.12]拜拜 甜甜圈 珍珠奶茶方便面[03:04.71]火锅米饭大盘鸡 拿走拿走别客气[03:08.35]拜拜 咖啡因 戒掉可乐戒油腻[03:11.95]沙发外卖玩游戏 别再熬夜伤身体[03:15.68]来来 后转体 高温瑜伽仰卧起[03:19.28]动感单车普拉提 保温杯里泡枸杞[03:22.91]来来 深呼吸 晨跑夜跑游几米[03:26.59]平板哑铃划船机 不达目的不放弃[03:32.96]不放弃[03:35.90]燃烧我的卡路里[03:40.43]不放弃[03:43.23]燃烧我的卡路里[03:44.72]我要变成万人迷[03:45.72]"},{name:"煎熬",url:"https://pan.jingxiyuan.cn/d/音乐/李佳薇 - 煎熬.mp3",artist:"李佳薇",cover:"http://p1.music.126.net/QcIYPrOfqm4LbUKAwed2Cg==/109951166562846510.jpg?param=300x300",lrc:"[00:00.000] 作词 : 徐世珍/司鱼[00:01.000] 作曲 : 饶善强[00:33.59]早知道 你只是飞鸟[00:40.64]拥抱后[00:43.25]手中只剩下 羽毛[00:50.76]当初你又何必浪费[00:54.16]那么多咖啡和玫瑰[00:57.87]来打扰[01:02.06]我想要 安静地思考[01:08.77]天平上 让爱恨不再[01:15.98]动摇[01:18.98]一想你就平衡不了[01:22.43]我关灯还是[01:23.33]关不掉这风暴[01:33.71]心一跳 爱就开始煎熬[01:40.07]每一分 每一秒[01:46.93]火在烧[01:50.29]烧成灰有多好[01:54.24]叫思念 不要吵[02:01.51]我相信我已经快要[02:05.71]快要把你忘掉[02:09.27]跟寂寞 再和好[02:30.24]得不到 也不要乞讨[02:36.99]怎么做 不需要别人[02:44.10]转告[02:47.26]在陷得太深的海底[02:50.71]我也只剩下[02:51.46]我自己能依靠[02:58.31]心一跳[03:00.96]爱就开始煎熬[03:04.71]每一分 每一秒[03:11.27]火在烧[03:14.53]烧成灰有多好[03:18.38]叫思念 不要吵[03:25.24]我相信我已经快要[03:29.54]快要把你忘掉[03:32.95]跟寂寞 再和好[03:39.11]我相信我已经快要[03:43.21]是真的我快要[03:46.67]快要可以微笑[03:50.12]去面对[03:52.93]下一个 拥抱"}]},{title:"网易云音乐",list:["https://music.163.com/#/playlist?id=5172410111","https://music.163.com/#/discover/toplist?id=19723756"]}],fireworks:["rgba(255,182,185,.9)","rgba(250,227,217,.9)","rgba(187,222,214,.9)","rgba(138,198,209,.9)"]};const t=function(e,t){return Math.floor(Math.random()*(t-e+1))+e};const a=function(){return u("main > .inner").offsetHeight};const n=function(e,t,a){if(a){t()}else{var n=document.createElement("script");n.onload=n.onreadystatechange=function(e,a){if(a||!n.readyState||/loaded|complete/.test(n.readyState)){n.onload=n.onreadystatechange=null;n=undefined;if(!a&&t)setTimeout(t,0)}};n.src=e;document.head.appendChild(n)}};const i=function(t,a){var n=e[t][a];if(n.indexOf("npm")>-1||n.indexOf("gh")>-1||n.indexOf("combine")>-1)return"//cdn.jsdelivr.net/"+n;if(n.indexOf("http")>-1)return n;return f+n};const r=function(e,t,a){if(LOCAL[e]){n(i("js",e),t||function(){window[e]=true},a||window[e])}};const s=function(e,t){if(window["css"+e])return;if(LOCAL[e]){document.head.createChild("link",{rel:"stylesheet",href:i("css",e)});window["css"+e]=true}};const o=function(e){var t=e.text||e.textContent||e.innerHTML||"";var a=e.parentNode;a.removeChild(e);var n=document.createElement("script");if(e.id){n.id=e.id}if(e.className){n.className=e.className}if(e.type){n.type=e.type}if(e.src){n.src=e.src;n.async=false}if(e.dataset.pjax!==undefined){n.dataset.pjax=""}if(t!==""){n.appendChild(document.createTextNode(t))}a.appendChild(n)};const c=function(e,t,a){var n={targets:typeof t=="number"?e.parentNode:document.scrollingElement,duration:500,easing:"easeInOutQuad",scrollTop:t||(typeof e=="number"?e:e?e.top()+document.documentElement.scrollTop-H:0),complete:function(){a&&a()}};anime(n)};const l=function(e,t,a){var n={};var i="none";switch(t){case 0:n={opacity:[1,0]};break;case 1:n={opacity:[0,1]};i="block";break;case"bounceUpIn":n={begin:function(t){e.display("block")},translateY:[{value:-60,duration:200},{value:10,duration:200},{value:-5,duration:200},{value:0,duration:200}],opacity:[0,1]};i="block";break;case"shrinkIn":n={begin:function(t){e.display("block")},scale:[{value:1.1,duration:300},{value:1,duration:200}],opacity:1};i="block";break;case"slideRightIn":n={begin:function(t){e.display("block")},translateX:[100,0],opacity:[0,1]};i="block";break;case"slideRightOut":n={translateX:[0,100],opacity:[1,0]};break;default:n=t;i=t.display;break}anime(Object.assign({targets:e,duration:200,easing:"linear"},n)).finished.then(function(){e.display(i);a&&a()})};const d={get:function(e){return localStorage.getItem(e)},set:function(e,t){localStorage.setItem(e,t);return t},del:function(e){localStorage.removeItem(e)}};const u=function(e,t){t=t||document;if(e.indexOf("#")===0){return t.getElementById(e.replace("#",""))}return t.querySelector(e)};u.all=function(e,t){t=t||document;return t.querySelectorAll(e)};u.each=function(e,t,a){return u.all(e,a).forEach(t)};Object.assign(HTMLElement.prototype,{createChild:function(e,t,a){var n=document.createElement(e);Object.assign(n,t);switch(a){case"after":this.insertAfter(n);break;case"replace":this.innerHTML="";default:this.appendChild(n)}return n},wrap:function(e){var t=document.createElement("div");Object.assign(t,e);this.parentNode.insertBefore(t,this);this.parentNode.removeChild(this);t.appendChild(this)},height:function(e){if(e){this.style.height=typeof e=="number"?e+"rem":e}return this.getBoundingClientRect().height},width:function(e){if(e){this.style.width=typeof e=="number"?e+"rem":e}return this.getBoundingClientRect().width},top:function(){return this.getBoundingClientRect().top},left:function(){return this.getBoundingClientRect().left},attr:function(e,t){if(t===null){return this.removeAttribute(e)}if(t){this.setAttribute(e,t);return this}else{return this.getAttribute(e)}},insertAfter:function(e){var t=this.parentNode;if(t.lastChild==this){t.appendChild(e)}else{t.insertBefore(e,this.nextSibling)}},display:function(e){if(e==null){return this.style.display}else{this.style.display=e;return this}},child:function(e){return u(e,this)},find:function(e){return u.all(e,this)},_class:function(e,t,a){var n=t.indexOf(" ")?t.split(" "):[t];var i=this;n.forEach(function(t){if(e=="toggle"){i.classList.toggle(t,a)}else{i.classList[e](t)}})},addClass:function(e){this._class("add",e);return this},removeClass:function(e){this._class("remove",e);return this},toggleClass:function(e,t){this._class("toggle",e,t);return this},hasClass:function(e){return this.classList.contains(e)}});var p=null;const m=/mobile/i.test(window.navigator.userAgent);const h=function(e,t){var a={type:"audio",mode:"random",btns:["play-pause","music"],controls:["mode","backward","play-pause","forward","volume"],events:{"play-pause":function(t){if(i.paused){e.player.play()}else{e.player.pause()}},music:function(e){if(r.el.hasClass("show")){r.hide()}else{r.el.addClass("show");s.scroll().title()}}}},n={random:function(e){return Math.floor(Math.random()*e)},parse:function(e){var t=[];[["music.163.com.*song.*id=(\\d+)","netease","song"],["music.163.com.*album.*id=(\\d+)","netease","album"],["music.163.com.*artist.*id=(\\d+)","netease","artist"],["music.163.com.*playlist.*id=(\\d+)","netease","playlist"],["music.163.com.*discover/toplist.*id=(\\d+)","netease","playlist"],["y.qq.com.*song/(\\w+).html","tencent","song"],["y.qq.com.*album/(\\w+).html","tencent","album"],["y.qq.com.*singer/(\\w+).html","tencent","artist"],["y.qq.com.*playsquare/(\\w+).html","tencent","playlist"],["y.qq.com.*playlist/(\\w+).html","tencent","playlist"],["xiami.com.*song/(\\w+)","xiami","song"],["xiami.com.*album/(\\w+)","xiami","album"],["xiami.com.*artist/(\\w+)","xiami","artist"],["xiami.com.*collect/(\\w+)","xiami","playlist"]].forEach(function(a){var n=new RegExp(a[0]);var i=n.exec(e);if(i!==null){t=[a[1],a[2],i[1]]}});return t},fetch:function(e){var t=[];return new Promise(function(a,i){e.forEach(function(e){var i=n.parse(e);if(i[0]){var r=JSON.stringify(i);var s=d.get(r);if(s){var o=JSON.parse(s);o.forEach(function(e,t){e.company=i[0]});t.push.apply(t,o);a(t)}else{fetch("https://api.i-meto.com/meting/api?server="+i[0]+"&type="+i[1]+"&id="+i[2]+"&r="+Math.random()).then(function(e){return e.json()}).then(function(e){d.set(r,JSON.stringify(e));t.push.apply(t,e);a(t)}).catch(function(e){})}}else{t.push(e);a(t)}})})},secondToTime:function(e){var t=function(e){return isNaN(e)?"00":e<10?"0"+e:""+e};var a=Math.floor(e/3600);var n=Math.floor((e-a*3600)/60);var i=Math.floor(e-a*3600-n*60);return(a>0?[a,n,i]:[n,i]).map(t).join(":")},nameMap:{dragStart:m?"touchstart":"mousedown",dragMove:m?"touchmove":"mousemove",dragEnd:m?"touchend":"mouseup"}},i=null;e.player={_id:n.random(999999),group:true,load:function(e){var t="";var a=this;if(e&&e.length>0){if(this.options.rawList!==e){this.options.rawList=e;s.clear()}}else{t="none";this.pause()}for(var n in g.el){g.el[n].display(t)}return this},fetch:function(){var e=this;return new Promise(function(t,a){if(s.data.length>0){t()}else{if(e.options.rawList){var i=[];e.options.rawList.forEach(function(t,a){i.push(new Promise(function(i,r){var o=a;var c;if(!t.list){o=0;e.group=false;c=[t]}else{e.group=true;c=t.list}n.fetch(c).then(function(e){s.add(o,e);i()})}))});Promise.all(i).then(function(){t(true)})}}}).then(function(t){if(t){s.create();f.create();e.mode()}})},mode:function(){var e=s.data.length;if(!e||s.errnum==e)return;var t=f.step=="next"?1:-1;var a=function(){var a=s.index+t;if(a>e||a<0){a=f.step=="next"?0:e-1}s.index=a};var i=function(){var t=n.random(e);if(s.index!==t){s.index=t}else{a()}};switch(this.options.mode){case"random":i();break;case"order":a();break;case"loop":if(f.step)a();if(s.index==-1)i();break}this.init()},"switch":function(e){if(typeof e=="number"&&e!=s.index&&s.current()&&!s.current().error){s.index=e;this.init()}},init:function(){var e=s.current();if(!e||e["error"]){this.mode();return}var t=false;if(!i.paused){t=true;this.stop()}i.attr("src",e.url);i.attr("title",e.name+" - "+e.artist);this.volume(d.get("_PlayerVolume")||"0.7");this.muted(d.get("_PlayerMuted"));h.create();if(this.options.type=="audio")l.create();if(t==true){this.play()}},play:function(){p&&p.player.pause();if(s.current().error){this.mode();return}var e=this;i.play().then(function(){s.scroll()}).catch(function(e){})},pause:function(){i.pause();document.title=y},stop:function(){i.pause();i.currentTime=0;document.title=y},seek:function(e){e=Math.max(e,0);e=Math.min(e,i.duration);if(isNaN(e)){e=0}i.currentTime=e;h.update(e/i.duration)},muted:function(e){if(e=="muted"){i.muted=e;d.set("_PlayerMuted",e);f.update(0)}else{d.del("_PlayerMuted");i.muted=false;f.update(i.volume)}},volume:function(e){if(!isNaN(e)){f.update(e);d.set("_PlayerVolume",e);i.volume=e}},mini:function(){r.hide()}};var r={el:null,create:function(){if(this.el)return;this.el=e.createChild("div",{className:"player-info",innerHTML:(e.player.options.type=="audio"?'
':"")+'
'},"after");l.el=this.el.child(".preview");s.el=this.el.child(".playlist");f.el=this.el.child(".controller")},hide:function(){var e=this.el;e.addClass("hide");window.setTimeout(function(){e.removeClass("show hide")},300)}};var s={el:null,data:[],index:-1,errnum:0,add:function(e,t){var a=this;t.forEach(function(t,n){t.group=e;t.name=t.name||t.title||"Meida name";t.artist=t.artist||t.author||"Anonymous";t.cover=t.cover||t.pic;t.type=t.type||"normal";a.data.push(t)})},clear:function(){this.data=[];this.el.innerHTML="";if(this.index!==-1){this.index=-1;e.player.fetch()}},create:function(){var t=this.el;this.data.map(function(a,n){if(a.el)return;var r="list-"+e.player._id+"-"+a.group;var o=u("#"+r);if(!o){o=t.createChild("div",{id:r,className:e.player.group?"tab":"",innerHTML:"
    "});if(e.player.group){o.attr("data-title",e.player.options.rawList[a.group]["title"]).attr("data-id",e.player._id)}}a.el=o.child("ol").createChild("li",{title:a.name+" - "+a.artist,innerHTML:''+a.name+""+a.artist+"",onclick:function(t){var a=t.currentTarget;if(s.index===n&&h.el){if(i.paused){e.player.play()}else{e.player.seek(i.duration*h.percent(t,a))}return}e.player.switch(n);e.player.play()}});return a});me()},current:function(){return this.data[this.index]},scroll:function(){var e=this.current();var t=this.el.child("li.active");t&&t.removeClass("active");var a=this.el.child(".tab.active");a&&a.removeClass("active");t=this.el.find(".nav li")[e.group];t&&t.addClass("active");a=this.el.find(".tab")[e.group];a&&a.addClass("active");c(e.el,e.el.offsetTop);return this},title:function(){if(i.paused)return;var e=this.current();document.title="Now Playing..."+e["name"]+" - "+e["artist"]+" | "+y},error:function(){var e=this.current();e.el.removeClass("current").addClass("error");e.error=true;this.errnum++}};var o={el:null,data:null,index:0,create:function(e){var t=s.index;var a=this;var n=s.current().lrc;var i=function(n){if(t!==s.index)return;a.data=a.parse(n);var i="";a.data.forEach(function(e,t){i+=""+e[1]+"

    "});a.el=e.createChild("div",{className:"inner",innerHTML:i},"replace");a.index=0};if(n&&n.startsWith("http"))this.fetch(n,i);else i(n)},update:function(e){if(!this.data)return;if(this.index>this.data.length-1||e=this.data[this.index+1][0])){for(var t=0;t=this.data[t][0]&&(!this.data[t+1]||e/g,"").replace(/^\s+|\s+$/g,"");if(r){const o=r.length;for(var c=0;c
    '+'

    '+t.name+"

    "+t.artist+""+'
    ';this.el.child(".cover").addEventListener("click",e.player.options.events["play-pause"]);o.create(this.el.child(".lrc"))}};var h={el:null,bar:null,create:function(){var e=s.current().el;if(e){if(this.el){this.el.parentNode.removeClass("current").removeEventListener(n.nameMap.dragStart,this.drag);this.el.remove()}this.el=e.createChild("div",{className:"progress"});this.el.attr("data-dtime",n.secondToTime(0));this.bar=this.el.createChild("div",{className:"bar"});e.addClass("current");e.addEventListener(n.nameMap.dragStart,this.drag);s.scroll()}},update:function(e){this.bar.width(Math.floor(e*100)+"%");this.el.attr("data-ptime",n.secondToTime(e*i.duration))},seeking:function(e){if(e)this.el.addClass("seeking");else this.el.removeClass("seeking")},percent:function(e,t){var a=((e.clientX||e.changedTouches[0].clientX)-t.left())/t.width();a=Math.max(a,0);return Math.min(a,1)},drag:function(t){t.preventDefault();var a=s.current().el;var r=function(e){e.preventDefault();var t=h.percent(e,a);h.update(t);o.update(t*i.duration)};var c=function(t){t.preventDefault();a.removeEventListener(n.nameMap.dragEnd,c);a.removeEventListener(n.nameMap.dragMove,r);var s=h.percent(t,a);h.update(s);e.player.seek(s*i.duration);i.disableTimeupdate=false;h.seeking(false)};i.disableTimeupdate=true;h.seeking(true);a.addEventListener(n.nameMap.dragMove,r);a.addEventListener(n.nameMap.dragEnd,c)}};var f={el:null,btns:{},step:"next",create:function(){if(!e.player.options.controls)return;var t=this;e.player.options.controls.forEach(function(a){if(t.btns[a])return;var r={onclick:function(n){t.events[a]?t.events[a](n):e.player.options.events[a](n)}};switch(a){case"volume":r.className=" "+(i.muted?"off":"on");r.innerHTML='
    ';r["on"+n.nameMap.dragStart]=t.events["volume"];r.onclick=null;break;case"mode":r.className=" "+e.player.options.mode;break;default:r.className="";break}r.className=a+r.className+" btn";t.btns[a]=t.el.createChild("div",r)});t.btns["volume"].bar=t.btns["volume"].child(".bar")},events:{mode:function(t){switch(e.player.options.mode){case"loop":e.player.options.mode="random";break;case"random":e.player.options.mode="order";break;default:e.player.options.mode="loop"}f.btns["mode"].className="mode "+e.player.options.mode+" btn";d.set("_PlayerMode",e.player.options.mode)},volume:function(t){t.preventDefault();var a=t.currentTarget;var r=false;var s=function(t){t.preventDefault();e.player.volume(f.percent(t,a));r=true};var o=function(t){t.preventDefault();a.removeEventListener(n.nameMap.dragEnd,o);a.removeEventListener(n.nameMap.dragMove,s);if(r){e.player.muted();e.player.volume(f.percent(t,a))}else{if(i.muted){e.player.muted();e.player.volume(i.volume)}else{e.player.muted("muted");f.update(0)}}};a.addEventListener(n.nameMap.dragMove,s);a.addEventListener(n.nameMap.dragEnd,o)},backward:function(t){f.step="prev";e.player.mode()},forward:function(t){f.step="next";e.player.mode()}},update:function(e){f.btns["volume"].className="volume "+(!i.muted&&e>0?"on":"off")+" btn";f.btns["volume"].bar.width(Math.floor(e*100)+"%")},percent:function(e,t){var a=((e.clientX||e.changedTouches[0].clientX)-t.left())/t.width();a=Math.max(a,0);return Math.min(a,1)}};var v={onerror:function(){var t=s.current();if(!t.repair&&t.company&&t.company=="netease"){var a=t.url.substring(t.url.indexOf("id=")+3,t.url.indexOf("&auth="));t.url="https://music.163.com/song/media/outer/url?id="+a;t.pic="https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200";t.cover=t.pic;t.repair=true;e.player.init()}else{s.error();e.player.mode()}},ondurationchange:function(){if(i.duration!==1){h.el.attr("data-dtime",n.secondToTime(i.duration))}},onloadedmetadata:function(){e.player.seek(0);h.el.attr("data-dtime",n.secondToTime(i.duration))},onplay:function(){e.parentNode.addClass("playing");U(this.attr("title"));p=e},onpause:function(){e.parentNode.removeClass("playing");p=null},ontimeupdate:function(){if(!this.disableTimeupdate){h.update(this.currentTime/this.duration);o.update(this.currentTime)}},onended:function(t){e.player.mode();e.player.play()}};var g={el:{},create:function(){if(!e.player.options.btns)return;var t=this;e.player.options.btns.forEach(function(a){if(t.el[a])return;t.el[a]=e.createChild("div",{className:a+" btn",onclick:function(t){e.player.fetch().then(function(){e.player.options.events[a](t)})}})})}};var w=function(t){if(e.player.created)return;e.player.options=Object.assign(a,t);e.player.options.mode=d.get("_PlayerMode")||e.player.options.mode;g.create();i=e.createChild(e.player.options.type,v);r.create();e.parentNode.addClass(e.player.options.type);e.player.created=true};w(t);return e};var f=e.statics.indexOf("//")>0?e.statics:e.root;var v={x:"undefined",y:"undefined"};var g=0;var y,w;const b=document.getElementsByTagName("body")[0];const x=document.documentElement;const C=u("#container");const L=u("#loading");const k=u("#nav");const j=u("#header");const E=k.child(".toggle");const M=u("#quick");const T=u("#sidebar");const N=u("#brand");var O=u("#tool"),S,I,A,R;var P=u("#search");var H,q,D;var W=window.innerHeight;var B=window.innerWidth;var Y=0,_=window.location.href;var G;const Q=lozad("img, [data-background-image]",{loaded:function(e){e.addClass("lozaded")}});const F={timer:null,lock:false,show:function(){clearTimeout(this.timer);document.body.removeClass("loaded");L.attr("style","display:block");F.lock=false},hide:function(t){if(!e.loader.start)t=-1;this.timer=setTimeout(this.vanish,t||3e3)},vanish:function(){if(F.lock)return;if(e.loader.start)l(L,0);document.body.addClass("loaded");F.lock=true}};const K=function(e){var t=u(".theme .ic");if(e=="dark"){x.attr("data-theme",e);t.removeClass("i-sun");t.addClass("i-moon")}else{x.attr("data-theme",null);t.removeClass("i-moon");t.addClass("i-sun")}};const V=function(e){if(x.attr("data-theme")=="dark")e="#222";u('meta[name="theme-color"]').attr("content",e)};const z=function(){window.matchMedia("(prefers-color-scheme: dark)").addListener(function(e){if(e.matches){K("dark")}else{K()}});var t=d.get("theme");if(t){K(t)}else{if(e.darkmode){K("dark")}}u(".theme").addEventListener("click",function(e){var t=e.currentTarget.child(".ic");var a=b.createChild("div",{id:"neko",innerHTML:'
    '});var n=function(){l(a,{delay:2500,opacity:0},function(){b.removeChild(a)})};if(t.hasClass("i-sun")){var i=function(){a.addClass("dark");K("dark");d.set("theme","dark");n()}}else{a.addClass("dark");var i=function(){a.removeClass("dark");K();d.set("theme","light");n()}}l(a,1,function(){setTimeout(i,210)})})};const J=function(){document.addEventListener("visibilitychange",function(){switch(document.visibilityState){case"hidden":u('[rel="icon"]').attr("href",f+e.favicon.hidden);document.title=LOCAL.favicon.hide;if(e.loader.switch)F.show();clearTimeout(w);break;case"visible":u('[rel="icon"]').attr("href",f+e.favicon.normal);document.title=LOCAL.favicon.show;if(e.loader.switch)F.hide(1e3);w=setTimeout(function(){document.title=y},2e3);break}})};const U=function(e){if(!e)return;var t=b.createChild("div",{innerHTML:e,className:"tip"});setTimeout(function(){t.addClass("hide");setTimeout(function(){b.removeChild(t)},300)},3e3)};const X=function(e){H=k.height();q=j.height();D=q+u("#waves").height();if(B!=window.innerWidth)ae(null,1);W=window.innerHeight;B=window.innerWidth;T.child(".panels").height(W+"px")};const Z=function(e){var t=window.innerHeight;var n=a();var i=n>t?n-t:document.body.scrollHeight-t;var r=window.pageYOffset>q;var s=window.pageYOffset>0;if(r){V("#FFF")}else{V("#222")}k.toggleClass("show",r);O.toggleClass("affix",s);N.toggleClass("affix",s);T.toggleClass("affix",window.pageYOffset>D&&document.body.offsetWidth>991);if(typeof v.y=="undefined"){v.y=window.pageYOffset}g=v.y-window.pageYOffset;if(g<0){k.removeClass("up");k.toggleClass("down",r)}else if(g>0){k.removeClass("down");k.toggleClass("up",r)}else{}v.y=window.pageYOffset;var o=Math.round(Math.min(100*window.pageYOffset/i,100))+"%";I.child("span").innerText=o;u(".percent").width(o)};const $=function(){if(e.auto_scroll)d.set(_,v.y)};const ee=function(t){var a=window.location.hash;var n=null;if(Y){d.del(_);return}if(a)n=u(decodeURI(a));else{n=e.auto_scroll?parseInt(d.get(_)):0}if(n){c(n);Y=1}if(t&&a&&!Y){c(n);Y=1}};const te=function(e,t){var a=b.createChild("textarea",{style:{top:window.scrollY+"px",position:"absolute",opacity:"0"},readOnly:true,value:e});const n=document.getSelection();const i=n.rangeCount>0?n.getRangeAt(0):false;a.select();a.setSelectionRange(0,e.length);a.readOnly=false;var r=document.execCommand("copy");t&&t(r);a.blur();if(i){n.removeAllRanges();n.addRange(i)}b.removeChild(a)};const ae=function(e,t){if(T.hasClass("on")){T.removeClass("on");E.removeClass("close");if(t){T.style=""}else{l(T,"slideRightOut")}}else{if(t){T.style=""}else{l(T,"slideRightIn",function(){T.addClass("on");E.addClass("close")})}}};const ne=function(){var e=T.child(".inner");var t=T.find(".panel");if(T.child(".tab")){e.removeChild(T.child(".tab"))}var a=document.createElement("ul"),n="active";a.className="tab";["contents","related","overview"].forEach(function(e){var t=T.child(".panel."+e);if(t.innerHTML.replace(/(^\s*)|(\s*$)/g,"").length<1){if(e=="contents"){R.display("none")}return}if(e=="contents"){R.display("")}var i=document.createElement("li");var r=document.createElement("span");var s=document.createTextNode(t.attr("data-title"));r.appendChild(s);i.appendChild(r);i.addClass(e+" item");if(n){t.addClass(n);i.addClass(n)}else{t.removeClass("active")}i.addEventListener("click",function(e){var t=event.currentTarget;if(t.hasClass("active"))return;T.find(".tab .item").forEach(function(e){e.removeClass("active")});T.find(".panel").forEach(function(e){e.removeClass("active")});T.child(".panel."+t.className.replace(" item","")).addClass("active");t.addClass("active")});a.appendChild(i);n=""});if(a.childNodes.length>1){e.insertBefore(a,e.childNodes[0]);T.child(".panels").style.paddingTop=""}else{T.child(".panels").style.paddingTop=".625rem"}};const ie=function(){var t=u.all(".contents li");if(t.length<1){return}var a=Array.prototype.slice.call(t)||[];var n=null;a=a.map(function(t,a){var i=t.child("a.toc-link");var s=u(decodeURI(i.attr("href")));if(!s)return;var o=s.child("a.anchor");var l=function(e){e.preventDefault();var t=u(decodeURI(e.currentTarget.attr("href")));n=a;c(t,null,function(){r(a);n=null})};i.addEventListener("click",l);o&&o.addEventListener("click",function(t){l(t);te(e.hostname+"/"+LOCAL.path+t.currentTarget.attr("href"))});return s});var i=T.child(".contents.panel");var r=function(e,n){var r=t[e];if(!r)return;if(r.hasClass("current")){return}u.each(".toc .active",function(e){e&&e.removeClass("active current")});a.forEach(function(e){e&&e.removeClass("active")});r.addClass("active current");a[e]&&a[e].addClass("active");var s=r.parentNode;while(!s.matches(".contents")){if(s.matches("li")){s.addClass("active");var o=u(s.child("a.toc-link").attr("href"));if(o){o.addClass("active")}}s=s.parentNode}if(getComputedStyle(T).display!="none"&&i.hasClass("active")){c(i,r.offsetTop-i.offsetHeight/4)}};var s=function(e){var t=0;var n=e[t];if(n.boundingClientRect.top>0){t=a.indexOf(n.target);return t===0?0:t-1}for(;t0){t.target.addClass("show");e.unobserve(t.target)}}})},{root:null,threshold:[.3]});u.each(".index.wrap article.item, .index.wrap section.item",function(t){e.observe(t)});u(".index.wrap .item:first-child").addClass("show")}u.each(".cards .item",function(e,t){["mouseenter","touchstart"].forEach(function(t){e.addEventListener(t,function(t){if(u(".cards .item.active")){u(".cards .item.active").removeClass("active")}e.addClass("active")})});["mouseleave"].forEach(function(t){e.addEventListener(t,function(t){e.removeClass("active")})})})};const de=function(){u.each("span.exturl",function(e){var t=document.createElement("a");t.href=decodeURIComponent(atob(e.dataset.url).split("").map(function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""));t.rel="noopener external nofollow noreferrer";t.target="_blank";t.className=e.className;t.title=e.title||e.innerText;t.innerHTML=e.innerHTML;if(e.dataset.backgroundImage){t.dataset.backgroundImage=e.dataset.backgroundImage}e.parentNode.replaceChild(t,e)})};const ue=function(e){if(u(e+" .md img")){s("fancybox");r("fancybox",function(){var t=jQuery.noConflict();u.each(e+" p.gallery",function(e){var t=document.createElement("div");t.className="gallery";t.attr("data-height",e.attr("data-height")||220);t.innerHTML=e.innerHTML.replace(/
    /g,"");e.parentNode.insertBefore(t,e);e.remove()});u.each(e+" .md img:not(.emoji):not(.vemoji)",function(e){var a=t(e);var n,i="image-info";if(!a.is("a img")){var r=a.attr("data-src")||a.attr("src");a.data("safe-src",r);var s=a.wrap('').parent("a");if(!a.is(".gallery img")){s.attr("data-fancybox","default").attr("rel","default")}else{i="jg-caption"}}if(n=e.attr("title")){s.attr("data-caption",n);var o=document.createElement("span");var c=document.createTextNode(n);o.appendChild(c);o.addClass(i);e.insertAfter(o)}});u.each(e+" div.gallery",function(e,a){t(e).justifiedGallery({rowHeight:t(e).data("height")||120,rel:"gallery-"+a}).on("jg.complete",function(){t(this).find("a").each(function(e,t){t.attr("data-fancybox","gallery-"+a)})})});t.fancybox.defaults.hash=false;t(e+" .fancybox").fancybox({loop:true,helpers:{overlay:{locked:false}}})},window.jQuery)}};const pe=function(){he();if(!u(".md"))return;ue(".post.block");u(".post.block").oncopy=function(e){U(LOCAL.copyright);if(LOCAL.nocopy){e.preventDefault();return}var t=u("#copyright");if(window.getSelection().toString().length>30&&t){e.preventDefault();var a="# "+t.child(".author").innerText;var n="# "+t.child(".link").innerText;var i="# "+t.child(".license").innerText;var r=a+"
    "+n+"
    "+i+"

    "+window.getSelection().toString().replace(/\r\n/g,"
    ");var s=a+"\n"+n+"\n"+i+"\n\n"+window.getSelection().toString().replace(/\r\n/g,"\n");if(e.clipboardData){e.clipboardData.setData("text/html",r);e.clipboardData.setData("text/plain",s)}else if(window.clipboardData){return window.clipboardData.setData("text",s)}}};u.each("li ruby",function(e){var t=e.parentNode;if(e.parentNode.tagName!="LI"){t=e.parentNode.parentNode}t.addClass("ruby")});u.each("ol[start]",function(e){e.style.counterReset="counter "+parseInt(e.attr("start")-1)});u.each(".md table",function(e){e.wrap({className:"table-container"})});u.each(".highlight > .table-container",function(e){e.className="code-container"});u.each("figure.highlight",function(e){var t=e.child(".code-container");var a=e.child("figcaption");e.insertAdjacentHTML("beforeend",'
    ');var n=e.child(".copy-btn");if(LOCAL.nocopy){n.remove()}else{n.addEventListener("click",function(e){var a=e.currentTarget;var n="",i="";t.find("pre").forEach(function(e){i+=n+e.innerText;n="\n"});te(i,function(e){a.child(".ic").className=e?"ic i-check":"ic i-times";a.blur();U(LOCAL.copyright)})});n.addEventListener("mouseleave",function(e){setTimeout(function(){e.target.child(".ic").className="ic i-clipboard"},1e3)})}var i=e.child(".breakline-btn");i.addEventListener("click",function(t){var a=t.currentTarget;if(e.hasClass("breakline")){e.removeClass("breakline");a.child(".ic").className="ic i-align-left"}else{e.addClass("breakline");a.child(".ic").className="ic i-align-justify"}});var r=e.child(".fullscreen-btn");var s=function(){e.removeClass("fullscreen");e.scrollTop=0;b.removeClass("fullscreen");r.child(".ic").className="ic i-expand"};var o=function(t){var a=t.currentTarget;if(e.hasClass("fullscreen")){s();u&&u();c(e)}else{e.addClass("fullscreen");b.addClass("fullscreen");r.child(".ic").className="ic i-compress";d&&d()}};r.addEventListener("click",o);a&&a.addEventListener("click",o);if(t&&t.find("tr").length>15){t.style.maxHeight="300px";t.insertAdjacentHTML("beforeend",'
    ');var l=t.child(".show-btn");var d=function(){t.style.maxHeight="";l.addClass("open")};var u=function(){t.style.maxHeight="300px";l.removeClass("open")};l.addEventListener("click",function(e){if(l.hasClass("open")){s();u();c(t)}else{d()}})}});u.each("pre.mermaid > svg",function(e){e.style.maxWidth=""});u.each(".reward button",function(e){e.addEventListener("click",function(e){e.preventDefault();var t=u("#qr");if(t.display()==="inline-flex"){l(t,0)}else{l(t,1,function(){t.display("inline-flex")})}})});u.each(".quiz > ul.options li",function(e){e.addEventListener("click",function(t){if(e.hasClass("correct")){e.toggleClass("right");e.parentNode.parentNode.addClass("show")}else{e.toggleClass("wrong")}})});u.each(".quiz > p",function(e){e.addEventListener("click",function(t){e.parentNode.toggleClass("show")})});u.each(".quiz > p:first-child",function(e){var t=e.parentNode;var a="choice";if(t.hasClass("true")||t.hasClass("false"))a="true_false";if(t.hasClass("multi"))a="multiple";if(t.hasClass("fill"))a="gap_fill";if(t.hasClass("essay"))a="essay";e.attr("data-type",LOCAL.quiz[a])});u.each(".quiz .mistake",function(e){e.attr("data-type",LOCAL.quiz.mistake)});u.each("div.tags a",function(e){e.className=["primary","success","info","warning","danger"][Math.floor(Math.random()*5)]});u.each(".md div.player",function(e){h(e,{type:e.attr("data-type"),mode:"order",btns:[]}).player.load(JSON.parse(e.attr("data-src"))).fetch()})};const me=function(){var e;u.each("div.tab",function(t,a){if(t.attr("data-ready"))return;var n=t.attr("data-id");var i=t.attr("data-title");var r=u("#"+n);if(!r){r=document.createElement("div");r.className="tabs";r.id=n;r.innerHTML='
    ';var s=r.child(".show-btn");s.addEventListener("click",function(e){c(r)});t.parentNode.insertBefore(r,t);e=true}else{e=false}var o=r.child(".nav ul");if(!o){o=r.createChild("div",{className:"nav",innerHTML:"
      "}).child("ul")}var l=o.createChild("li",{innerHTML:i});if(e){l.addClass("active");t.addClass("active")}l.addEventListener("click",function(e){var a=e.currentTarget;r.find(".active").forEach(function(e){e.removeClass("active")});t.addClass("active");a.addClass("active")});r.appendChild(t);t.attr("data-ready",true)})};const he=function(){var e=u("#comments");if(!e){A.display("none");return}else{A.display("")}if(!window.IntersectionObserver){s("valine")}else{var t=new IntersectionObserver(function(e,t){var a=e[0];s("valine");if(a.isIntersecting||a.intersectionRatio>0){l(u("#comments"),"bounceUpIn");t.disconnect()}});t.observe(e)}};const fe=function(t){if(e.search===null)return;if(!P){P=b.createChild("div",{id:"search",innerHTML:'
      '})}var a=instantsearch({indexName:e.search.indexName,searchClient:algoliasearch(e.search.appID,e.search.apiKey),searchFunction:function(e){var t=u(".search-input");if(t.value){e.search()}}});a.on("render",function(){t.refresh(u("#search-hits"))});a.addWidgets([instantsearch.widgets.configure({hitsPerPage:e.search.hits.per_page||10}),instantsearch.widgets.searchBox({container:".search-input-container",placeholder:LOCAL.search.placeholder,showReset:false,showSubmit:false,showLoadingIndicator:false,cssClasses:{input:"search-input"}}),instantsearch.widgets.stats({container:"#search-stats",templates:{text:function(e){var t=LOCAL.search.stats.replace(/\$\{hits}/,e.nbHits).replace(/\$\{time}/,e.processingTimeMS);return t+'
      '}}}),instantsearch.widgets.hits({container:"#search-hits",templates:{item:function(t){var a=t.categories?""+t.categories.join('')+"":"";return''+a+t._highlightResult.title.value+""},empty:function(e){return'
      '+LOCAL.search.empty.replace(/\$\{query}/,e.query)+"
      "}},cssClasses:{item:"item"}}),instantsearch.widgets.pagination({container:"#search-pagination",scrollTo:false,showFirst:false,showLast:false,templates:{first:'',last:'',previous:'',next:''},cssClasses:{root:"pagination",item:"pagination-item",link:"page-number",selectedItem:"current",disabledItem:"disabled-item"}})]);a.start();u.each(".search",function(e){e.addEventListener("click",function(){document.body.style.overflow="hidden";l(P,"shrinkIn",function(){u(".search-input").focus()})})});const n=function(){document.body.style.overflow="";l(P,0)};P.addEventListener("click",function(e){if(e.target===P){n()}});u(".close-btn").addEventListener("click",n);window.addEventListener("pjax:success",n);window.addEventListener("keyup",function(e){if(e.key==="Escape"){n()}})};const ve=function(){u.each(".overview .menu > .item",function(e){k.child(".menu").appendChild(e.cloneNode(true))});L.addEventListener("click",F.vanish);E.addEventListener("click",ae);u(".dimmer").addEventListener("click",ae);M.child(".down").addEventListener("click",se);M.child(".up").addEventListener("click",re);if(!O){O=j.createChild("div",{id:"tool",innerHTML:'
      0%
      '})}S=O.child(".player");I=O.child(".back-to-top");A=O.child(".chat");R=O.child(".contents");I.addEventListener("click",re);A.addEventListener("click",oe);R.addEventListener("click",ae);h(S);u("main").addEventListener("click",function(){S.player.mini()})};const ge=function(){$();if(T.hasClass("on")){l(T,function(){T.removeClass("on");E.removeClass("close")})}u("#main").innerHTML="";u("#main").appendChild(L.lastChild.cloneNode(true));c(0)};const ye=function(t){Y=0;_=window.location.href;s("katex");r("copy_tex");s("mermaid");r("chart");r("valine",function(){var t=Object.assign({},e.valine);t=Object.assign(t,LOCAL.valine||{});t.el="#comments";t.pathname=LOCAL.path;t.pjax=G;t.lazyload=Q;new MiniValine(t);setTimeout(function(){ee(1);ue(".v")},1e3)},window.MiniValine);if(!t){u.each("script[data-pjax]",o)}y=document.title;X();ce();ne();ie();de();pe();me();S.player.load(LOCAL.audio||e.audio||{});F.hide();setTimeout(function(){ee()},500);le();Q.observe()};const we=function(){ve();G=new Pjax({selectors:["head title",".languages",".pjax","script[data-config]"],analytics:false,cacheBust:false});e.quicklink.ignores=LOCAL.ignores;quicklink.listen(e.quicklink);J();z();fe(G);window.addEventListener("scroll",Z);window.addEventListener("resize",X);window.addEventListener("pjax:send",ge);window.addEventListener("pjax:success",ye);window.addEventListener("beforeunload",function(){$()});ye(1)};window.addEventListener("DOMContentLoaded",we);var be=document.createElement("canvas");be.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:9999999";document.body.appendChild(be);var xe=be.getContext("2d");var Ce=30;var Le=0;var ke=0;var je="click";var Ee=e.fireworks;function Me(){be.width=window.innerWidth*2;be.height=window.innerHeight*2;be.style.width=window.innerWidth+"px";be.style.height=window.innerHeight+"px";be.getContext("2d").scale(2,2)}function Te(e){Le=e.clientX||e.touches&&e.touches[0].clientX;ke=e.clientY||e.touches&&e.touches[0].clientY}function Ne(e){var t=anime.random(0,360)*Math.PI/180;var a=anime.random(50,180);var n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function Oe(e,t){var a={};a.x=e;a.y=t;a.color=Ee[anime.random(0,Ee.length-1)];a.radius=anime.random(16,32);a.endPos=Ne(a);a.draw=function(){xe.beginPath();xe.arc(a.x,a.y,a.radius,0,2*Math.PI,true);xe.fillStyle=a.color;xe.fill()};return a}function Se(e,t){var a={};a.x=e;a.y=t;a.color="#FFF";a.radius=.1;a.alpha=.5;a.lineWidth=6;a.draw=function(){xe.globalAlpha=a.alpha;xe.beginPath();xe.arc(a.x,a.y,a.radius,0,2*Math.PI,true);xe.lineWidth=a.lineWidth;xe.strokeStyle=a.color;xe.stroke();xe.globalAlpha=1};return a}function Ie(e){for(var t=0;t .inner").offsetHeight};const n=function(e,t,a){if(a){t()}else{var n=document.createElement("script");n.onload=n.onreadystatechange=function(e,a){if(a||!n.readyState||/loaded|complete/.test(n.readyState)){n.onload=n.onreadystatechange=null;n=undefined;if(!a&&t)setTimeout(t,0)}};n.src=e;document.head.appendChild(n)}};const i=function(t,a){var n=e[t][a];if(n.indexOf("npm")>-1||n.indexOf("gh")>-1||n.indexOf("combine")>-1)return"//cdn.jsdelivr.net/"+n;if(n.indexOf("http")>-1)return n;return f+n};const r=function(e,t,a){if(LOCAL[e]){n(i("js",e),t||function(){window[e]=true},a||window[e])}};const s=function(e,t){if(window["css"+e])return;if(LOCAL[e]){document.head.createChild("link",{rel:"stylesheet",href:i("css",e)});window["css"+e]=true}};const o=function(e){var t=e.text||e.textContent||e.innerHTML||"";var a=e.parentNode;a.removeChild(e);var n=document.createElement("script");if(e.id){n.id=e.id}if(e.className){n.className=e.className}if(e.type){n.type=e.type}if(e.src){n.src=e.src;n.async=false}if(e.dataset.pjax!==undefined){n.dataset.pjax=""}if(t!==""){n.appendChild(document.createTextNode(t))}a.appendChild(n)};const c=function(e,t,a){var n={targets:typeof t=="number"?e.parentNode:document.scrollingElement,duration:500,easing:"easeInOutQuad",scrollTop:t||(typeof e=="number"?e:e?e.top()+document.documentElement.scrollTop-H:0),complete:function(){a&&a()}};anime(n)};const l=function(e,t,a){var n={};var i="none";switch(t){case 0:n={opacity:[1,0]};break;case 1:n={opacity:[0,1]};i="block";break;case"bounceUpIn":n={begin:function(t){e.display("block")},translateY:[{value:-60,duration:200},{value:10,duration:200},{value:-5,duration:200},{value:0,duration:200}],opacity:[0,1]};i="block";break;case"shrinkIn":n={begin:function(t){e.display("block")},scale:[{value:1.1,duration:300},{value:1,duration:200}],opacity:1};i="block";break;case"slideRightIn":n={begin:function(t){e.display("block")},translateX:[100,0],opacity:[0,1]};i="block";break;case"slideRightOut":n={translateX:[0,100],opacity:[1,0]};break;default:n=t;i=t.display;break}anime(Object.assign({targets:e,duration:200,easing:"linear"},n)).finished.then(function(){e.display(i);a&&a()})};const d={get:function(e){return localStorage.getItem(e)},set:function(e,t){localStorage.setItem(e,t);return t},del:function(e){localStorage.removeItem(e)}};const u=function(e,t){t=t||document;if(e.indexOf("#")===0){return t.getElementById(e.replace("#",""))}return t.querySelector(e)};u.all=function(e,t){t=t||document;return t.querySelectorAll(e)};u.each=function(e,t,a){return u.all(e,a).forEach(t)};Object.assign(HTMLElement.prototype,{createChild:function(e,t,a){var n=document.createElement(e);Object.assign(n,t);switch(a){case"after":this.insertAfter(n);break;case"replace":this.innerHTML="";default:this.appendChild(n)}return n},wrap:function(e){var t=document.createElement("div");Object.assign(t,e);this.parentNode.insertBefore(t,this);this.parentNode.removeChild(this);t.appendChild(this)},height:function(e){if(e){this.style.height=typeof e=="number"?e+"rem":e}return this.getBoundingClientRect().height},width:function(e){if(e){this.style.width=typeof e=="number"?e+"rem":e}return this.getBoundingClientRect().width},top:function(){return this.getBoundingClientRect().top},left:function(){return this.getBoundingClientRect().left},attr:function(e,t){if(t===null){return this.removeAttribute(e)}if(t){this.setAttribute(e,t);return this}else{return this.getAttribute(e)}},insertAfter:function(e){var t=this.parentNode;if(t.lastChild==this){t.appendChild(e)}else{t.insertBefore(e,this.nextSibling)}},display:function(e){if(e==null){return this.style.display}else{this.style.display=e;return this}},child:function(e){return u(e,this)},find:function(e){return u.all(e,this)},_class:function(e,t,a){var n=t.indexOf(" ")?t.split(" "):[t];var i=this;n.forEach(function(t){if(e=="toggle"){i.classList.toggle(t,a)}else{i.classList[e](t)}})},addClass:function(e){this._class("add",e);return this},removeClass:function(e){this._class("remove",e);return this},toggleClass:function(e,t){this._class("toggle",e,t);return this},hasClass:function(e){return this.classList.contains(e)}});var p=null;const m=/mobile/i.test(window.navigator.userAgent);const h=function(e,t){var a={type:"audio",mode:"random",btns:["play-pause","music"],controls:["mode","backward","play-pause","forward","volume"],events:{"play-pause":function(t){if(i.paused){e.player.play()}else{e.player.pause()}},music:function(e){if(r.el.hasClass("show")){r.hide()}else{r.el.addClass("show");s.scroll().title()}}}},n={random:function(e){return Math.floor(Math.random()*e)},parse:function(e){var t=[];[["music.163.com.*song.*id=(\\d+)","netease","song"],["music.163.com.*album.*id=(\\d+)","netease","album"],["music.163.com.*artist.*id=(\\d+)","netease","artist"],["music.163.com.*playlist.*id=(\\d+)","netease","playlist"],["music.163.com.*discover/toplist.*id=(\\d+)","netease","playlist"],["y.qq.com.*song/(\\w+).html","tencent","song"],["y.qq.com.*album/(\\w+).html","tencent","album"],["y.qq.com.*singer/(\\w+).html","tencent","artist"],["y.qq.com.*playsquare/(\\w+).html","tencent","playlist"],["y.qq.com.*playlist/(\\w+).html","tencent","playlist"],["xiami.com.*song/(\\w+)","xiami","song"],["xiami.com.*album/(\\w+)","xiami","album"],["xiami.com.*artist/(\\w+)","xiami","artist"],["xiami.com.*collect/(\\w+)","xiami","playlist"]].forEach(function(a){var n=new RegExp(a[0]);var i=n.exec(e);if(i!==null){t=[a[1],a[2],i[1]]}});return t},fetch:function(e){var t=[];return new Promise(function(a,i){e.forEach(function(e){var i=n.parse(e);if(i[0]){var r=JSON.stringify(i);var s=d.get(r);if(s){var o=JSON.parse(s);o.forEach(function(e,t){e.company=i[0]});t.push.apply(t,o);a(t)}else{fetch("https://api.i-meto.com/meting/api?server="+i[0]+"&type="+i[1]+"&id="+i[2]+"&r="+Math.random()).then(function(e){return e.json()}).then(function(e){d.set(r,JSON.stringify(e));t.push.apply(t,e);a(t)}).catch(function(e){})}}else{t.push(e);a(t)}})})},secondToTime:function(e){var t=function(e){return isNaN(e)?"00":e<10?"0"+e:""+e};var a=Math.floor(e/3600);var n=Math.floor((e-a*3600)/60);var i=Math.floor(e-a*3600-n*60);return(a>0?[a,n,i]:[n,i]).map(t).join(":")},nameMap:{dragStart:m?"touchstart":"mousedown",dragMove:m?"touchmove":"mousemove",dragEnd:m?"touchend":"mouseup"}},i=null;e.player={_id:n.random(999999),group:true,load:function(e){var t="";var a=this;if(e&&e.length>0){if(this.options.rawList!==e){this.options.rawList=e;s.clear()}}else{t="none";this.pause()}for(var n in g.el){g.el[n].display(t)}return this},fetch:function(){var e=this;return new Promise(function(t,a){if(s.data.length>0){t()}else{if(e.options.rawList){var i=[];e.options.rawList.forEach(function(t,a){i.push(new Promise(function(i,r){var o=a;var c;if(!t.list){o=0;e.group=false;c=[t]}else{e.group=true;c=t.list}n.fetch(c).then(function(e){s.add(o,e);i()})}))});Promise.all(i).then(function(){t(true)})}}}).then(function(t){if(t){s.create();f.create();e.mode()}})},mode:function(){var e=s.data.length;if(!e||s.errnum==e)return;var t=f.step=="next"?1:-1;var a=function(){var a=s.index+t;if(a>e||a<0){a=f.step=="next"?0:e-1}s.index=a};var i=function(){var t=n.random(e);if(s.index!==t){s.index=t}else{a()}};switch(this.options.mode){case"random":i();break;case"order":a();break;case"loop":if(f.step)a();if(s.index==-1)i();break}this.init()},"switch":function(e){if(typeof e=="number"&&e!=s.index&&s.current()&&!s.current().error){s.index=e;this.init()}},init:function(){var e=s.current();if(!e||e["error"]){this.mode();return}var t=false;if(!i.paused){t=true;this.stop()}i.attr("src",e.url);i.attr("title",e.name+" - "+e.artist);this.volume(d.get("_PlayerVolume")||"0.7");this.muted(d.get("_PlayerMuted"));h.create();if(this.options.type=="audio")l.create();if(t==true){this.play()}},play:function(){p&&p.player.pause();if(s.current().error){this.mode();return}var e=this;i.play().then(function(){s.scroll()}).catch(function(e){})},pause:function(){i.pause();document.title=y},stop:function(){i.pause();i.currentTime=0;document.title=y},seek:function(e){e=Math.max(e,0);e=Math.min(e,i.duration);if(isNaN(e)){e=0}i.currentTime=e;h.update(e/i.duration)},muted:function(e){if(e=="muted"){i.muted=e;d.set("_PlayerMuted",e);f.update(0)}else{d.del("_PlayerMuted");i.muted=false;f.update(i.volume)}},volume:function(e){if(!isNaN(e)){f.update(e);d.set("_PlayerVolume",e);i.volume=e}},mini:function(){r.hide()}};var r={el:null,create:function(){if(this.el)return;this.el=e.createChild("div",{className:"player-info",innerHTML:(e.player.options.type=="audio"?'
      ':"")+'
      '},"after");l.el=this.el.child(".preview");s.el=this.el.child(".playlist");f.el=this.el.child(".controller")},hide:function(){var e=this.el;e.addClass("hide");window.setTimeout(function(){e.removeClass("show hide")},300)}};var s={el:null,data:[],index:-1,errnum:0,add:function(e,t){var a=this;t.forEach(function(t,n){t.group=e;t.name=t.name||t.title||"Meida name";t.artist=t.artist||t.author||"Anonymous";t.cover=t.cover||t.pic;t.type=t.type||"normal";a.data.push(t)})},clear:function(){this.data=[];this.el.innerHTML="";if(this.index!==-1){this.index=-1;e.player.fetch()}},create:function(){var t=this.el;this.data.map(function(a,n){if(a.el)return;var r="list-"+e.player._id+"-"+a.group;var o=u("#"+r);if(!o){o=t.createChild("div",{id:r,className:e.player.group?"tab":"",innerHTML:"
        "});if(e.player.group){o.attr("data-title",e.player.options.rawList[a.group]["title"]).attr("data-id",e.player._id)}}a.el=o.child("ol").createChild("li",{title:a.name+" - "+a.artist,innerHTML:''+a.name+""+a.artist+"",onclick:function(t){var a=t.currentTarget;if(s.index===n&&h.el){if(i.paused){e.player.play()}else{e.player.seek(i.duration*h.percent(t,a))}return}e.player.switch(n);e.player.play()}});return a});me()},current:function(){return this.data[this.index]},scroll:function(){var e=this.current();var t=this.el.child("li.active");t&&t.removeClass("active");var a=this.el.child(".tab.active");a&&a.removeClass("active");t=this.el.find(".nav li")[e.group];t&&t.addClass("active");a=this.el.find(".tab")[e.group];a&&a.addClass("active");c(e.el,e.el.offsetTop);return this},title:function(){if(i.paused)return;var e=this.current();document.title="Now Playing..."+e["name"]+" - "+e["artist"]+" | "+y},error:function(){var e=this.current();e.el.removeClass("current").addClass("error");e.error=true;this.errnum++}};var o={el:null,data:null,index:0,create:function(e){var t=s.index;var a=this;var n=s.current().lrc;var i=function(n){if(t!==s.index)return;a.data=a.parse(n);var i="";a.data.forEach(function(e,t){i+=""+e[1]+"

        "});a.el=e.createChild("div",{className:"inner",innerHTML:i},"replace");a.index=0};if(n&&n.startsWith("http"))this.fetch(n,i);else i(n)},update:function(e){if(!this.data)return;if(this.index>this.data.length-1||e=this.data[this.index+1][0])){for(var t=0;t=this.data[t][0]&&(!this.data[t+1]||e/g,"").replace(/^\s+|\s+$/g,"");if(r){const o=r.length;for(var c=0;c
        '+'

        '+t.name+"

        "+t.artist+""+'
        ';this.el.child(".cover").addEventListener("click",e.player.options.events["play-pause"]);o.create(this.el.child(".lrc"))}};var h={el:null,bar:null,create:function(){var e=s.current().el;if(e){if(this.el){this.el.parentNode.removeClass("current").removeEventListener(n.nameMap.dragStart,this.drag);this.el.remove()}this.el=e.createChild("div",{className:"progress"});this.el.attr("data-dtime",n.secondToTime(0));this.bar=this.el.createChild("div",{className:"bar"});e.addClass("current");e.addEventListener(n.nameMap.dragStart,this.drag);s.scroll()}},update:function(e){this.bar.width(Math.floor(e*100)+"%");this.el.attr("data-ptime",n.secondToTime(e*i.duration))},seeking:function(e){if(e)this.el.addClass("seeking");else this.el.removeClass("seeking")},percent:function(e,t){var a=((e.clientX||e.changedTouches[0].clientX)-t.left())/t.width();a=Math.max(a,0);return Math.min(a,1)},drag:function(t){t.preventDefault();var a=s.current().el;var r=function(e){e.preventDefault();var t=h.percent(e,a);h.update(t);o.update(t*i.duration)};var c=function(t){t.preventDefault();a.removeEventListener(n.nameMap.dragEnd,c);a.removeEventListener(n.nameMap.dragMove,r);var s=h.percent(t,a);h.update(s);e.player.seek(s*i.duration);i.disableTimeupdate=false;h.seeking(false)};i.disableTimeupdate=true;h.seeking(true);a.addEventListener(n.nameMap.dragMove,r);a.addEventListener(n.nameMap.dragEnd,c)}};var f={el:null,btns:{},step:"next",create:function(){if(!e.player.options.controls)return;var t=this;e.player.options.controls.forEach(function(a){if(t.btns[a])return;var r={onclick:function(n){t.events[a]?t.events[a](n):e.player.options.events[a](n)}};switch(a){case"volume":r.className=" "+(i.muted?"off":"on");r.innerHTML='
        ';r["on"+n.nameMap.dragStart]=t.events["volume"];r.onclick=null;break;case"mode":r.className=" "+e.player.options.mode;break;default:r.className="";break}r.className=a+r.className+" btn";t.btns[a]=t.el.createChild("div",r)});t.btns["volume"].bar=t.btns["volume"].child(".bar")},events:{mode:function(t){switch(e.player.options.mode){case"loop":e.player.options.mode="random";break;case"random":e.player.options.mode="order";break;default:e.player.options.mode="loop"}f.btns["mode"].className="mode "+e.player.options.mode+" btn";d.set("_PlayerMode",e.player.options.mode)},volume:function(t){t.preventDefault();var a=t.currentTarget;var r=false;var s=function(t){t.preventDefault();e.player.volume(f.percent(t,a));r=true};var o=function(t){t.preventDefault();a.removeEventListener(n.nameMap.dragEnd,o);a.removeEventListener(n.nameMap.dragMove,s);if(r){e.player.muted();e.player.volume(f.percent(t,a))}else{if(i.muted){e.player.muted();e.player.volume(i.volume)}else{e.player.muted("muted");f.update(0)}}};a.addEventListener(n.nameMap.dragMove,s);a.addEventListener(n.nameMap.dragEnd,o)},backward:function(t){f.step="prev";e.player.mode()},forward:function(t){f.step="next";e.player.mode()}},update:function(e){f.btns["volume"].className="volume "+(!i.muted&&e>0?"on":"off")+" btn";f.btns["volume"].bar.width(Math.floor(e*100)+"%")},percent:function(e,t){var a=((e.clientX||e.changedTouches[0].clientX)-t.left())/t.width();a=Math.max(a,0);return Math.min(a,1)}};var v={onerror:function(){var t=s.current();if(!t.repair&&t.company&&t.company=="netease"){var a=t.url.substring(t.url.indexOf("id=")+3,t.url.indexOf("&auth="));t.url="https://music.163.com/song/media/outer/url?id="+a;t.pic="https://p3.music.126.net/Vji3PQJAZ2C7gS_6X51NFQ==/109951164723650033.jpg?param=200y200";t.cover=t.pic;t.repair=true;e.player.init()}else{s.error();e.player.mode()}},ondurationchange:function(){if(i.duration!==1){h.el.attr("data-dtime",n.secondToTime(i.duration))}},onloadedmetadata:function(){e.player.seek(0);h.el.attr("data-dtime",n.secondToTime(i.duration))},onplay:function(){e.parentNode.addClass("playing");U(this.attr("title"));p=e},onpause:function(){e.parentNode.removeClass("playing");p=null},ontimeupdate:function(){if(!this.disableTimeupdate){h.update(this.currentTime/this.duration);o.update(this.currentTime)}},onended:function(t){e.player.mode();e.player.play()}};var g={el:{},create:function(){if(!e.player.options.btns)return;var t=this;e.player.options.btns.forEach(function(a){if(t.el[a])return;t.el[a]=e.createChild("div",{className:a+" btn",onclick:function(t){e.player.fetch().then(function(){e.player.options.events[a](t)})}})})}};var w=function(t){if(e.player.created)return;e.player.options=Object.assign(a,t);e.player.options.mode=d.get("_PlayerMode")||e.player.options.mode;g.create();i=e.createChild(e.player.options.type,v);r.create();e.parentNode.addClass(e.player.options.type);e.player.created=true};w(t);return e};var f=e.statics.indexOf("//")>0?e.statics:e.root;var v={x:"undefined",y:"undefined"};var g=0;var y,w;const b=document.getElementsByTagName("body")[0];const x=document.documentElement;const C=u("#container");const L=u("#loading");const k=u("#nav");const j=u("#header");const E=k.child(".toggle");const M=u("#quick");const T=u("#sidebar");const N=u("#brand");var O=u("#tool"),S,I,A,R;var P=u("#search");var H,q,D;var W=window.innerHeight;var B=window.innerWidth;var Y=0,_=window.location.href;var G;const Q=lozad("img, [data-background-image]",{loaded:function(e){e.addClass("lozaded")}});const F={timer:null,lock:false,show:function(){clearTimeout(this.timer);document.body.removeClass("loaded");L.attr("style","display:block");F.lock=false},hide:function(t){if(!e.loader.start)t=-1;this.timer=setTimeout(this.vanish,t||3e3)},vanish:function(){if(F.lock)return;if(e.loader.start)l(L,0);document.body.addClass("loaded");F.lock=true}};const K=function(e){var t=u(".theme .ic");if(e=="dark"){x.attr("data-theme",e);t.removeClass("i-sun");t.addClass("i-moon")}else{x.attr("data-theme",null);t.removeClass("i-moon");t.addClass("i-sun")}};const V=function(e){if(x.attr("data-theme")=="dark")e="#222";u('meta[name="theme-color"]').attr("content",e)};const z=function(){window.matchMedia("(prefers-color-scheme: dark)").addListener(function(e){if(e.matches){K("dark")}else{K()}});var t=d.get("theme");if(t){K(t)}else{if(e.darkmode){K("dark")}}u(".theme").addEventListener("click",function(e){var t=e.currentTarget.child(".ic");var a=b.createChild("div",{id:"neko",innerHTML:'
        '});var n=function(){l(a,{delay:2500,opacity:0},function(){b.removeChild(a)})};if(t.hasClass("i-sun")){var i=function(){a.addClass("dark");K("dark");d.set("theme","dark");n()}}else{a.addClass("dark");var i=function(){a.removeClass("dark");K();d.set("theme","light");n()}}l(a,1,function(){setTimeout(i,210)})})};const J=function(){document.addEventListener("visibilitychange",function(){switch(document.visibilityState){case"hidden":u('[rel="icon"]').attr("href",f+e.favicon.hidden);document.title=LOCAL.favicon.hide;if(e.loader.switch)F.show();clearTimeout(w);break;case"visible":u('[rel="icon"]').attr("href",f+e.favicon.normal);document.title=LOCAL.favicon.show;if(e.loader.switch)F.hide(1e3);w=setTimeout(function(){document.title=y},2e3);break}})};const U=function(e){if(!e)return;var t=b.createChild("div",{innerHTML:e,className:"tip"});setTimeout(function(){t.addClass("hide");setTimeout(function(){b.removeChild(t)},300)},3e3)};const X=function(e){H=k.height();q=j.height();D=q+u("#waves").height();if(B!=window.innerWidth)ae(null,1);W=window.innerHeight;B=window.innerWidth;T.child(".panels").height(W+"px")};const Z=function(e){var t=window.innerHeight;var n=a();var i=n>t?n-t:document.body.scrollHeight-t;var r=window.pageYOffset>q;var s=window.pageYOffset>0;if(r){V("#FFF")}else{V("#222")}k.toggleClass("show",r);O.toggleClass("affix",s);N.toggleClass("affix",s);T.toggleClass("affix",window.pageYOffset>D&&document.body.offsetWidth>991);if(typeof v.y=="undefined"){v.y=window.pageYOffset}g=v.y-window.pageYOffset;if(g<0){k.removeClass("up");k.toggleClass("down",r)}else if(g>0){k.removeClass("down");k.toggleClass("up",r)}else{}v.y=window.pageYOffset;var o=Math.round(Math.min(100*window.pageYOffset/i,100))+"%";I.child("span").innerText=o;u(".percent").width(o)};const $=function(){if(e.auto_scroll)d.set(_,v.y)};const ee=function(t){var a=window.location.hash;var n=null;if(Y){d.del(_);return}if(a)n=u(decodeURI(a));else{n=e.auto_scroll?parseInt(d.get(_)):0}if(n){c(n);Y=1}if(t&&a&&!Y){c(n);Y=1}};const te=function(e,t){var a=b.createChild("textarea",{style:{top:window.scrollY+"px",position:"absolute",opacity:"0"},readOnly:true,value:e});const n=document.getSelection();const i=n.rangeCount>0?n.getRangeAt(0):false;a.select();a.setSelectionRange(0,e.length);a.readOnly=false;var r=document.execCommand("copy");t&&t(r);a.blur();if(i){n.removeAllRanges();n.addRange(i)}b.removeChild(a)};const ae=function(e,t){if(T.hasClass("on")){T.removeClass("on");E.removeClass("close");if(t){T.style=""}else{l(T,"slideRightOut")}}else{if(t){T.style=""}else{l(T,"slideRightIn",function(){T.addClass("on");E.addClass("close")})}}};const ne=function(){var e=T.child(".inner");var t=T.find(".panel");if(T.child(".tab")){e.removeChild(T.child(".tab"))}var a=document.createElement("ul"),n="active";a.className="tab";["contents","related","overview"].forEach(function(e){var t=T.child(".panel."+e);if(t.innerHTML.replace(/(^\s*)|(\s*$)/g,"").length<1){if(e=="contents"){R.display("none")}return}if(e=="contents"){R.display("")}var i=document.createElement("li");var r=document.createElement("span");var s=document.createTextNode(t.attr("data-title"));r.appendChild(s);i.appendChild(r);i.addClass(e+" item");if(n){t.addClass(n);i.addClass(n)}else{t.removeClass("active")}i.addEventListener("click",function(e){var t=event.currentTarget;if(t.hasClass("active"))return;T.find(".tab .item").forEach(function(e){e.removeClass("active")});T.find(".panel").forEach(function(e){e.removeClass("active")});T.child(".panel."+t.className.replace(" item","")).addClass("active");t.addClass("active")});a.appendChild(i);n=""});if(a.childNodes.length>1){e.insertBefore(a,e.childNodes[0]);T.child(".panels").style.paddingTop=""}else{T.child(".panels").style.paddingTop=".625rem"}};const ie=function(){var t=u.all(".contents li");if(t.length<1){return}var a=Array.prototype.slice.call(t)||[];var n=null;a=a.map(function(t,a){var i=t.child("a.toc-link");var s=u(decodeURI(i.attr("href")));if(!s)return;var o=s.child("a.anchor");var l=function(e){e.preventDefault();var t=u(decodeURI(e.currentTarget.attr("href")));n=a;c(t,null,function(){r(a);n=null})};i.addEventListener("click",l);o&&o.addEventListener("click",function(t){l(t);te(e.hostname+"/"+LOCAL.path+t.currentTarget.attr("href"))});return s});var i=T.child(".contents.panel");var r=function(e,n){var r=t[e];if(!r)return;if(r.hasClass("current")){return}u.each(".toc .active",function(e){e&&e.removeClass("active current")});a.forEach(function(e){e&&e.removeClass("active")});r.addClass("active current");a[e]&&a[e].addClass("active");var s=r.parentNode;while(!s.matches(".contents")){if(s.matches("li")){s.addClass("active");var o=u(s.child("a.toc-link").attr("href"));if(o){o.addClass("active")}}s=s.parentNode}if(getComputedStyle(T).display!="none"&&i.hasClass("active")){c(i,r.offsetTop-i.offsetHeight/4)}};var s=function(e){var t=0;var n=e[t];if(n.boundingClientRect.top>0){t=a.indexOf(n.target);return t===0?0:t-1}for(;t0){t.target.addClass("show");e.unobserve(t.target)}}})},{root:null,threshold:[.3]});u.each(".index.wrap article.item, .index.wrap section.item",function(t){e.observe(t)});u(".index.wrap .item:first-child").addClass("show")}u.each(".cards .item",function(e,t){["mouseenter","touchstart"].forEach(function(t){e.addEventListener(t,function(t){if(u(".cards .item.active")){u(".cards .item.active").removeClass("active")}e.addClass("active")})});["mouseleave"].forEach(function(t){e.addEventListener(t,function(t){e.removeClass("active")})})})};const de=function(){u.each("span.exturl",function(e){var t=document.createElement("a");t.href=decodeURIComponent(atob(e.dataset.url).split("").map(function(e){return"%"+("00"+e.charCodeAt(0).toString(16)).slice(-2)}).join(""));t.rel="noopener external nofollow noreferrer";t.target="_blank";t.className=e.className;t.title=e.title||e.innerText;t.innerHTML=e.innerHTML;if(e.dataset.backgroundImage){t.dataset.backgroundImage=e.dataset.backgroundImage}e.parentNode.replaceChild(t,e)})};const ue=function(e){if(u(e+" .md img")){s("fancybox");r("fancybox",function(){var t=jQuery.noConflict();u.each(e+" p.gallery",function(e){var t=document.createElement("div");t.className="gallery";t.attr("data-height",e.attr("data-height")||220);t.innerHTML=e.innerHTML.replace(/
        /g,"");e.parentNode.insertBefore(t,e);e.remove()});u.each(e+" .md img:not(.emoji):not(.vemoji)",function(e){var a=t(e);var n,i="image-info";if(!a.is("a img")){var r=a.attr("data-src")||a.attr("src");a.data("safe-src",r);var s=a.wrap('').parent("a");if(!a.is(".gallery img")){s.attr("data-fancybox","default").attr("rel","default")}else{i="jg-caption"}}if(n=e.attr("title")){s.attr("data-caption",n);var o=document.createElement("span");var c=document.createTextNode(n);o.appendChild(c);o.addClass(i);e.insertAfter(o)}});u.each(e+" div.gallery",function(e,a){t(e).justifiedGallery({rowHeight:t(e).data("height")||120,rel:"gallery-"+a}).on("jg.complete",function(){t(this).find("a").each(function(e,t){t.attr("data-fancybox","gallery-"+a)})})});t.fancybox.defaults.hash=false;t(e+" .fancybox").fancybox({loop:true,helpers:{overlay:{locked:false}}})},window.jQuery)}};const pe=function(){he();if(!u(".md"))return;ue(".post.block");u(".post.block").oncopy=function(e){U(LOCAL.copyright);if(LOCAL.nocopy){e.preventDefault();return}var t=u("#copyright");if(window.getSelection().toString().length>30&&t){e.preventDefault();var a="# "+t.child(".author").innerText;var n="# "+t.child(".link").innerText;var i="# "+t.child(".license").innerText;var r=a+"
        "+n+"
        "+i+"

        "+window.getSelection().toString().replace(/\r\n/g,"
        ");var s=a+"\n"+n+"\n"+i+"\n\n"+window.getSelection().toString().replace(/\r\n/g,"\n");if(e.clipboardData){e.clipboardData.setData("text/html",r);e.clipboardData.setData("text/plain",s)}else if(window.clipboardData){return window.clipboardData.setData("text",s)}}};u.each("li ruby",function(e){var t=e.parentNode;if(e.parentNode.tagName!="LI"){t=e.parentNode.parentNode}t.addClass("ruby")});u.each("ol[start]",function(e){e.style.counterReset="counter "+parseInt(e.attr("start")-1)});u.each(".md table",function(e){e.wrap({className:"table-container"})});u.each(".highlight > .table-container",function(e){e.className="code-container"});u.each("figure.highlight",function(e){var t=e.child(".code-container");var a=e.child("figcaption");e.insertAdjacentHTML("beforeend",'
        ');var n=e.child(".copy-btn");if(LOCAL.nocopy){n.remove()}else{n.addEventListener("click",function(e){var a=e.currentTarget;var n="",i="";t.find("pre").forEach(function(e){i+=n+e.innerText;n="\n"});te(i,function(e){a.child(".ic").className=e?"ic i-check":"ic i-times";a.blur();U(LOCAL.copyright)})});n.addEventListener("mouseleave",function(e){setTimeout(function(){e.target.child(".ic").className="ic i-clipboard"},1e3)})}var i=e.child(".breakline-btn");i.addEventListener("click",function(t){var a=t.currentTarget;if(e.hasClass("breakline")){e.removeClass("breakline");a.child(".ic").className="ic i-align-left"}else{e.addClass("breakline");a.child(".ic").className="ic i-align-justify"}});var r=e.child(".fullscreen-btn");var s=function(){e.removeClass("fullscreen");e.scrollTop=0;b.removeClass("fullscreen");r.child(".ic").className="ic i-expand"};var o=function(t){var a=t.currentTarget;if(e.hasClass("fullscreen")){s();u&&u();c(e)}else{e.addClass("fullscreen");b.addClass("fullscreen");r.child(".ic").className="ic i-compress";d&&d()}};r.addEventListener("click",o);a&&a.addEventListener("click",o);if(t&&t.find("tr").length>15){t.style.maxHeight="300px";t.insertAdjacentHTML("beforeend",'
        ');var l=t.child(".show-btn");var d=function(){t.style.maxHeight="";l.addClass("open")};var u=function(){t.style.maxHeight="300px";l.removeClass("open")};l.addEventListener("click",function(e){if(l.hasClass("open")){s();u();c(t)}else{d()}})}});u.each("pre.mermaid > svg",function(e){e.style.maxWidth=""});u.each(".reward button",function(e){e.addEventListener("click",function(e){e.preventDefault();var t=u("#qr");if(t.display()==="inline-flex"){l(t,0)}else{l(t,1,function(){t.display("inline-flex")})}})});u.each(".quiz > ul.options li",function(e){e.addEventListener("click",function(t){if(e.hasClass("correct")){e.toggleClass("right");e.parentNode.parentNode.addClass("show")}else{e.toggleClass("wrong")}})});u.each(".quiz > p",function(e){e.addEventListener("click",function(t){e.parentNode.toggleClass("show")})});u.each(".quiz > p:first-child",function(e){var t=e.parentNode;var a="choice";if(t.hasClass("true")||t.hasClass("false"))a="true_false";if(t.hasClass("multi"))a="multiple";if(t.hasClass("fill"))a="gap_fill";if(t.hasClass("essay"))a="essay";e.attr("data-type",LOCAL.quiz[a])});u.each(".quiz .mistake",function(e){e.attr("data-type",LOCAL.quiz.mistake)});u.each("div.tags a",function(e){e.className=["primary","success","info","warning","danger"][Math.floor(Math.random()*5)]});u.each(".md div.player",function(e){h(e,{type:e.attr("data-type"),mode:"order",btns:[]}).player.load(JSON.parse(e.attr("data-src"))).fetch()})};const me=function(){var e;u.each("div.tab",function(t,a){if(t.attr("data-ready"))return;var n=t.attr("data-id");var i=t.attr("data-title");var r=u("#"+n);if(!r){r=document.createElement("div");r.className="tabs";r.id=n;r.innerHTML='
        ';var s=r.child(".show-btn");s.addEventListener("click",function(e){c(r)});t.parentNode.insertBefore(r,t);e=true}else{e=false}var o=r.child(".nav ul");if(!o){o=r.createChild("div",{className:"nav",innerHTML:"
          "}).child("ul")}var l=o.createChild("li",{innerHTML:i});if(e){l.addClass("active");t.addClass("active")}l.addEventListener("click",function(e){var a=e.currentTarget;r.find(".active").forEach(function(e){e.removeClass("active")});t.addClass("active");a.addClass("active")});r.appendChild(t);t.attr("data-ready",true)})};const he=function(){var e=u("#comments");if(!e){A.display("none");return}else{A.display("")}if(!window.IntersectionObserver){s("valine")}else{var t=new IntersectionObserver(function(e,t){var a=e[0];s("valine");if(a.isIntersecting||a.intersectionRatio>0){l(u("#comments"),"bounceUpIn");t.disconnect()}});t.observe(e)}};const fe=function(t){if(e.search===null)return;if(!P){P=b.createChild("div",{id:"search",innerHTML:'
          '})}var a=instantsearch({indexName:e.search.indexName,searchClient:algoliasearch(e.search.appID,e.search.apiKey),searchFunction:function(e){var t=u(".search-input");if(t.value){e.search()}}});a.on("render",function(){t.refresh(u("#search-hits"))});a.addWidgets([instantsearch.widgets.configure({hitsPerPage:e.search.hits.per_page||10}),instantsearch.widgets.searchBox({container:".search-input-container",placeholder:LOCAL.search.placeholder,showReset:false,showSubmit:false,showLoadingIndicator:false,cssClasses:{input:"search-input"}}),instantsearch.widgets.stats({container:"#search-stats",templates:{text:function(e){var t=LOCAL.search.stats.replace(/\$\{hits}/,e.nbHits).replace(/\$\{time}/,e.processingTimeMS);return t+'
          '}}}),instantsearch.widgets.hits({container:"#search-hits",templates:{item:function(t){var a=t.categories?""+t.categories.join('')+"":"";return''+a+t._highlightResult.title.value+""},empty:function(e){return'
          '+LOCAL.search.empty.replace(/\$\{query}/,e.query)+"
          "}},cssClasses:{item:"item"}}),instantsearch.widgets.pagination({container:"#search-pagination",scrollTo:false,showFirst:false,showLast:false,templates:{first:'',last:'',previous:'',next:''},cssClasses:{root:"pagination",item:"pagination-item",link:"page-number",selectedItem:"current",disabledItem:"disabled-item"}})]);a.start();u.each(".search",function(e){e.addEventListener("click",function(){document.body.style.overflow="hidden";l(P,"shrinkIn",function(){u(".search-input").focus()})})});const n=function(){document.body.style.overflow="";l(P,0)};P.addEventListener("click",function(e){if(e.target===P){n()}});u(".close-btn").addEventListener("click",n);window.addEventListener("pjax:success",n);window.addEventListener("keyup",function(e){if(e.key==="Escape"){n()}})};const ve=function(){u.each(".overview .menu > .item",function(e){k.child(".menu").appendChild(e.cloneNode(true))});L.addEventListener("click",F.vanish);E.addEventListener("click",ae);u(".dimmer").addEventListener("click",ae);M.child(".down").addEventListener("click",se);M.child(".up").addEventListener("click",re);if(!O){O=j.createChild("div",{id:"tool",innerHTML:'
          0%
          '})}S=O.child(".player");I=O.child(".back-to-top");A=O.child(".chat");R=O.child(".contents");I.addEventListener("click",re);A.addEventListener("click",oe);R.addEventListener("click",ae);h(S);u("main").addEventListener("click",function(){S.player.mini()})};const ge=function(){$();if(T.hasClass("on")){l(T,function(){T.removeClass("on");E.removeClass("close")})}u("#main").innerHTML="";u("#main").appendChild(L.lastChild.cloneNode(true));c(0)};const ye=function(t){Y=0;_=window.location.href;s("katex");r("copy_tex");s("mermaid");r("chart");r("valine",function(){var t=Object.assign({},e.valine);t=Object.assign(t,LOCAL.valine||{});t.el="#comments";t.pathname=LOCAL.path;t.pjax=G;t.lazyload=Q;new MiniValine(t);setTimeout(function(){ee(1);ue(".v")},1e3)},window.MiniValine);if(!t){u.each("script[data-pjax]",o)}y=document.title;X();ce();ne();ie();de();pe();me();S.player.load(LOCAL.audio||e.audio||{});F.hide();setTimeout(function(){ee()},500);le();Q.observe()};const we=function(){ve();G=new Pjax({selectors:["head title",".languages",".pjax","script[data-config]"],analytics:false,cacheBust:false});e.quicklink.ignores=LOCAL.ignores;quicklink.listen(e.quicklink);J();z();fe(G);window.addEventListener("scroll",Z);window.addEventListener("resize",X);window.addEventListener("pjax:send",ge);window.addEventListener("pjax:success",ye);window.addEventListener("beforeunload",function(){$()});ye(1)};window.addEventListener("DOMContentLoaded",we);var be=document.createElement("canvas");be.style.cssText="position:fixed;top:0;left:0;pointer-events:none;z-index:9999999";document.body.appendChild(be);var xe=be.getContext("2d");var Ce=30;var Le=0;var ke=0;var je="click";var Ee=e.fireworks;function Me(){be.width=window.innerWidth*2;be.height=window.innerHeight*2;be.style.width=window.innerWidth+"px";be.style.height=window.innerHeight+"px";be.getContext("2d").scale(2,2)}function Te(e){Le=e.clientX||e.touches&&e.touches[0].clientX;ke=e.clientY||e.touches&&e.touches[0].clientY}function Ne(e){var t=anime.random(0,360)*Math.PI/180;var a=anime.random(50,180);var n=[-1,1][anime.random(0,1)]*a;return{x:e.x+n*Math.cos(t),y:e.y+n*Math.sin(t)}}function Oe(e,t){var a={};a.x=e;a.y=t;a.color=Ee[anime.random(0,Ee.length-1)];a.radius=anime.random(16,32);a.endPos=Ne(a);a.draw=function(){xe.beginPath();xe.arc(a.x,a.y,a.radius,0,2*Math.PI,true);xe.fillStyle=a.color;xe.fill()};return a}function Se(e,t){var a={};a.x=e;a.y=t;a.color="#FFF";a.radius=.1;a.alpha=.5;a.lineWidth=6;a.draw=function(){xe.globalAlpha=a.alpha;xe.beginPath();xe.arc(a.x,a.y,a.radius,0,2*Math.PI,true);xe.lineWidth=a.lineWidth;xe.strokeStyle=a.color;xe.stroke();xe.globalAlpha=1};return a}function Ie(e){for(var t=0;t☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          1.5k 1 分钟

          # 描述 今天需要把一个 web 项目部署到 ubuntu 服务器上,结果直接使用 apt install nodejs 安装的 nodejs 版本过低,导致编译失败。最后通过查看官网文档获取到了 ubuntu 最新 nodejs 的安装命令。 # 过程 卸载旧的 nodejs(此命令会卸载掉相关依赖包) sudo apt autoremove --purge nodejs 安装 NodeJS curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &amp;&amp; sudo...
          1k 1 分钟

          # 区别: 2>/dev/null意思就是把错误输出到 “黑洞” >/dev/null 2>&amp;1默认情况是 1,也就是等同于 1&gt;/dev/null 2&gt;&amp;1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞” 2>&amp;1 >/dev/null意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕 # 解释: 文件描述符 Linux...
          68 1 分钟

          # 360 独立版小工具 360 全家桶众说纷纭但工具箱还是挺实用的,这波小工具可以单独下载使用,有需要的朋友赶紧下载吧! 下载地址 # 部分工具截图
          115 1 分钟

          # 介绍 当你经常需要在家远程到公司进行办公,或者开启了很多临时文件、文档、软件需要等到第二天继续之前的工作时,结果系统自行更新并重启了。是不是会让你非常郁闷。关闭系统自行更新就可以轻松解决此类问题。 # 下载 win10 / win11 / 本地
          2.3k 2 分钟

          # 介绍 ip 直连一般都映射了 5055, 但是直接访问 5055 极空间只提供了 http 协议,如果希望使用 https 协议则必须使用其它端口进行访问。以下方案采用 nginx 反向代理实现,端口使用 10000 举例。 # 配置 需要先把 10000 端口在路由器上做好映射。 证书生成好并放置到 nginx 上。(证书生成方法不做介绍请自行百度) http 跳转 https 配置 server &#123; if ($scheme = http) &#123; rewrite ^(.*)$ https://$host$1...
          2.2k 2 分钟

          # 介绍 青龙面板是一个支持 python3、javascript、shell、typescript 的定时任务管理面板。它支持在线管理脚本、环境变量、配置文件,支持在线查看日志及支持多种方式的消息通知。 # 安装 本文使用的是 whyour/qinglong 的镜像。 路径映射(由于青龙面板有 nodejs 环境,所以我把 hexo 博客的编译也放置在上面,再把 nginx 的 html 映射过来,这样就可以直接编译发布了。) #青龙面板装载路径/ql/data#博客装载路径(如果你不部署 hexo 博客可以不用配置)/root/.ssh #ssh 证书文件(如果你不用把 hexo...
          929 1 分钟

          valine 评论需要 LeanCloud 支持 # LeanCloud 注册 到 LeanCloud 网站完成注册。 创建应用。 名称随便取,方案看自己选择。开发版免费但是有限制,商业版收费无限制。 点击配置按钮进行配置。 点击设置 - 应用凭证可获取 App ID 和 App Key 点击设置 - 安全中心根据自己的需求配置 # 修改 Theme.Shoka 配置 valine: appId: 粘贴5中获取的App ID #Your_appId appKey: 粘贴5中获取的App Key #Your_appkey placeholder: ヽ(○´∀`)ノ♪欢迎畅所欲言 #...
          535 1 分钟

          # 介绍 mariadb 属于 mysql 的一个分支,完全兼容 mysql,使用方式和 mysql 无区别。 # 安装 本文介绍安装的镜像为 linuxserver_mariadb 的 10.5.13-r0-ls45,原则上使用最新版即可 配置文件映射 端口 环境(MYSQL_ROOT_PASSWORD 为数据库 root 用户密码) 到此已经可以在内网使用了,连接方法同 mysql 一样 按本文设置内网连接信息为: ip:极空间内网 ip 端口:3306 用户名:root 密码:MYSQL_ROOT_PASSWORD 对应的值 # 配置 配置 nginx...
          1.2k 1 分钟

          # 安装 下载最新版 wordpress 镜像,如极空间无法下载,可到 passerma 网站下载。 需要先在 mysql 中创建给 wordpress 使用的库。 文件路径映射(目前极空间不能映射到高速盘,否则无法启动)。 端口映射。 通过映射的端口访问安装界面(一定要通过最终访问的页面进行安装,否则修改配置比较麻烦。如最终是域名访问,就先把域名解析代理等先配置好,再通过域名访问安装)。 # 配置 如需使用 https 访问,需要在 wp-config.php 中加入以下代码,否则资源文件无法访问。 if((!empty(...
          \ No newline at end of file +☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          1.5k 1 分钟

          # 描述 今天需要把一个 web 项目部署到 ubuntu 服务器上,结果直接使用 apt install nodejs 安装的 nodejs 版本过低,导致编译失败。最后通过查看官网文档获取到了 ubuntu 最新 nodejs 的安装命令。 # 过程 卸载旧的 nodejs(此命令会卸载掉相关依赖包) sudo apt autoremove --purge nodejs 安装 NodeJS curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - &amp;&amp; sudo...
          1k 1 分钟

          # 区别: 2>/dev/null意思就是把错误输出到 “黑洞” >/dev/null 2>&amp;1默认情况是 1,也就是等同于 1&gt;/dev/null 2&gt;&amp;1。意思就是把标准输出重定向到 “黑洞”,还把错误输出 2 重定向到标准输出 1,也就是标准输出和错误输出都进了 “黑洞” 2>&amp;1 >/dev/null意思就是把错误输出 2 重定向到标准出书 1,也就是屏幕,标准输出进了 “黑洞”,也就是标准输出进了黑洞,错误输出打印到屏幕 # 解释: 文件描述符 Linux...
          68 1 分钟

          # 360 独立版小工具 360 全家桶众说纷纭但工具箱还是挺实用的,这波小工具可以单独下载使用,有需要的朋友赶紧下载吧! 下载地址 # 部分工具截图
          115 1 分钟

          # 介绍 当你经常需要在家远程到公司进行办公,或者开启了很多临时文件、文档、软件需要等到第二天继续之前的工作时,结果系统自行更新并重启了。是不是会让你非常郁闷。关闭系统自行更新就可以轻松解决此类问题。 # 下载 win10 / win11 / 本地
          2.3k 2 分钟

          # 介绍 ip 直连一般都映射了 5055, 但是直接访问 5055 极空间只提供了 http 协议,如果希望使用 https 协议则必须使用其它端口进行访问。以下方案采用 nginx 反向代理实现,端口使用 10000 举例。 # 配置 需要先把 10000 端口在路由器上做好映射。 证书生成好并放置到 nginx 上。(证书生成方法不做介绍请自行百度) http 跳转 https 配置 server &#123; if ($scheme = http) &#123; rewrite ^(.*)$ https://$host$1...
          2.2k 2 分钟

          # 介绍 青龙面板是一个支持 python3、javascript、shell、typescript 的定时任务管理面板。它支持在线管理脚本、环境变量、配置文件,支持在线查看日志及支持多种方式的消息通知。 # 安装 本文使用的是 whyour/qinglong 的镜像。 路径映射(由于青龙面板有 nodejs 环境,所以我把 hexo 博客的编译也放置在上面,再把 nginx 的 html 映射过来,这样就可以直接编译发布了。) #青龙面板装载路径/ql/data#博客装载路径(如果你不部署 hexo 博客可以不用配置)/root/.ssh #ssh 证书文件(如果你不用把 hexo...
          929 1 分钟

          valine 评论需要 LeanCloud 支持 # LeanCloud 注册 到 LeanCloud 网站完成注册。 创建应用。 名称随便取,方案看自己选择。开发版免费但是有限制,商业版收费无限制。 点击配置按钮进行配置。 点击设置 - 应用凭证可获取 App ID 和 App Key 点击设置 - 安全中心根据自己的需求配置 # 修改 Theme.Shoka 配置 valine: appId: 粘贴5中获取的App ID #Your_appId appKey: 粘贴5中获取的App Key #Your_appkey placeholder: ヽ(○´∀`)ノ♪欢迎畅所欲言 #...
          535 1 分钟

          # 介绍 mariadb 属于 mysql 的一个分支,完全兼容 mysql,使用方式和 mysql 无区别。 # 安装 本文介绍安装的镜像为 linuxserver_mariadb 的 10.5.13-r0-ls45,原则上使用最新版即可 配置文件映射 端口 环境(MYSQL_ROOT_PASSWORD 为数据库 root 用户密码) 到此已经可以在内网使用了,连接方法同 mysql 一样 按本文设置内网连接信息为: ip:极空间内网 ip 端口:3306 用户名:root 密码:MYSQL_ROOT_PASSWORD 对应的值 # 配置 配置 nginx...
          1.2k 1 分钟

          # 安装 下载最新版 wordpress 镜像,如极空间无法下载,可到 passerma 网站下载。 需要先在 mysql 中创建给 wordpress 使用的库。 文件路径映射(目前极空间不能映射到高速盘,否则无法启动)。 端口映射。 通过映射的端口访问安装界面(一定要通过最终访问的页面进行安装,否则修改配置比较麻烦。如最终是域名访问,就先把域名解析代理等先配置好,再通过域名访问安装)。 # 配置 如需使用 https 访问,需要在 wp-config.php 中加入以下代码,否则资源文件无法访问。 if((!empty(...
          \ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 9caaae418..94cfdce40 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -1 +1 @@ -☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          101 1 分钟

          一年一次的总结时间又到了,这一年前半年平平无奇,后半年惊涛骇浪。中年危机如期而遇,人身的低谷终究还是来了。很沮丧也很无助,但还是要坚强面对。人生起起伏伏,时好时坏,终归还是会好起来的。加油!加油!加油 !
          6.7k 6 分钟

          # 监控端服务安装与配置 nagios 需要安装主程序 core 和 nrpe(nagios 和各被监控主机都必须安装)。如需使用自研前端可通过安装 ndoutils (用于把 nagios 监控信息写入数据库) 和 mysql 实现。具体安装见官网 nagios 默认监控命令脚本放置在 libexec 中,自定义脚本也放到此处 etc/objects/commands.cfg 用于保存 nagios 默认监控命令 etc/nrpe.cfg 文件中需要添加用于被监控执行命令项(各被监控主机中都需要添加) etc/objects/hosts...
          3.1k 3 分钟

          # 主服务 基础配置 port 6379requirepass 123456(密码,建议不设置)vm-enabled no (虚拟内存,内存够的情况下可以不使用)maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入)bind 127.0.0.1 (注释掉,否则不能外部连接)rdbchecksum no(持久化数据检查)list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb)list-compress-depth...
          356 1 分钟

          # 使用场景   在 A 域名的页面向 B 域名提交数据时需要代入 B 域名的 cookie,否则 B 域名会跳转到登陆页面。解决方式需要使用到 nginx 反向代理,配置如下: server &#123; listen port ssl http2; server_name xxx.com; ssl_certificate_key /xxx.key; ssl_certificate /xxx.pem; proxy_cookie_path ~(.*) "$1; SameSite=None; secure; httponly"; location /...
          111 1 分钟

          # 简介 PicGo 是一款开源的图床管理工具,十分流行。 PicGo 官方指南:PicGo | PicGo # 配置 安装插件(需要先安装 NodeJS) 图床配置   url 后缀必须用红线圈中的部分,key 在 chevereto 登陆后 api 配置中查找
          709 1 分钟

          # 前期准备   首先安装好 svn 和 git 工具。 # svn 转 git 1、 到 svn 项目目录右键选中 gitbash 打开窗口,执行获取用户并映射成 git 样式账号命令如下: svn log -q | awk -F '|' '/^r/ &#123;sub(&quot;^ &quot;, &quot;&quot;, $2); sub(&quot; $&quot;, &quot;&quot;, $2); print $2&quot; =...
          1.6k 1 分钟

          # X-Frame-Options 响应头配置详解   X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在,或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。 X-Frame-Options 三个参数: 1、 DENY   表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。 2、SAMEORIGIN   表示该页面可以在相同域名页面的 frame 中展示。 3、ALLOW-FROM uri   表示该页面可以在指定来源的 frame...
          1.1k 1 分钟

          # nginx 负载均衡配置 轮询(默认)   每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 upstream my_server &#123; server 192.168.0.2:8080; server 192.168.0.3:8080;&#125;server &#123; listen 80; server_name 192.168.0.1; # Path to the root of your installation location / &#123; proxy_pass...
          18k 17 分钟

          # 问题描述 今天突然发现博客的音乐无法播放了,经过一顿查找,发现是因为 https://api.i-meto.com/meting/api 获取的音乐地址出现了问题,估计是被网易云给封禁了。shoka 主题应该是通过这个网站提取音乐地址、图片等信息。通过断点发现网易播放列表还是能正常获取的,只是列表中的具体音乐、图片出现了问题。因为 meto 是把音乐的 url 指向自己的服务地址,然后通过参数获取的最终音乐,所以我通过参数拼凑出最终的网易云音乐地址,自此问题基本解决。只针对网易播放列表,图片只能使用一张固定的(因为图片的具体规律不知道 O (∩_∩) O~)。 # 解决方法 到...
          \ No newline at end of file +☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          101 1 分钟

          一年一次的总结时间又到了,这一年前半年平平无奇,后半年惊涛骇浪。中年危机如期而遇,人身的低谷终究还是来了。很沮丧也很无助,但还是要坚强面对。人生起起伏伏,时好时坏,终归还是会好起来的。加油!加油!加油 !
          6.7k 6 分钟

          # 监控端服务安装与配置 nagios 需要安装主程序 core 和 nrpe(nagios 和各被监控主机都必须安装)。如需使用自研前端可通过安装 ndoutils (用于把 nagios 监控信息写入数据库) 和 mysql 实现。具体安装见官网 nagios 默认监控命令脚本放置在 libexec 中,自定义脚本也放到此处 etc/objects/commands.cfg 用于保存 nagios 默认监控命令 etc/nrpe.cfg 文件中需要添加用于被监控执行命令项(各被监控主机中都需要添加) etc/objects/hosts...
          3.1k 3 分钟

          # 主服务 基础配置 port 6379requirepass 123456(密码,建议不设置)vm-enabled no (虚拟内存,内存够的情况下可以不使用)maxmemory 1GB(告诉Redis当使用了多少物理内存后就开始拒绝后续的写入)bind 127.0.0.1 (注释掉,否则不能外部连接)rdbchecksum no(持久化数据检查)list-max-ziplist-size 1024(ziplist的最大容量,正数为自己指定的大小。负数-1到-5为对应的值4到64Kb)list-compress-depth...
          356 1 分钟

          # 使用场景   在 A 域名的页面向 B 域名提交数据时需要代入 B 域名的 cookie,否则 B 域名会跳转到登陆页面。解决方式需要使用到 nginx 反向代理,配置如下: server &#123; listen port ssl http2; server_name xxx.com; ssl_certificate_key /xxx.key; ssl_certificate /xxx.pem; proxy_cookie_path ~(.*) "$1; SameSite=None; secure; httponly"; location /...
          111 1 分钟

          # 简介 PicGo 是一款开源的图床管理工具,十分流行。 PicGo 官方指南:PicGo | PicGo # 配置 安装插件(需要先安装 NodeJS) 图床配置   url 后缀必须用红线圈中的部分,key 在 chevereto 登陆后 api 配置中查找
          709 1 分钟

          # 前期准备   首先安装好 svn 和 git 工具。 # svn 转 git 1、 到 svn 项目目录右键选中 gitbash 打开窗口,执行获取用户并映射成 git 样式账号命令如下: svn log -q | awk -F '|' '/^r/ &#123;sub(&quot;^ &quot;, &quot;&quot;, $2); sub(&quot; $&quot;, &quot;&quot;, $2); print $2&quot; =...
          1.6k 1 分钟

          # X-Frame-Options 响应头配置详解   X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在,或者 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌套到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。 X-Frame-Options 三个参数: 1、 DENY   表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。 2、SAMEORIGIN   表示该页面可以在相同域名页面的 frame 中展示。 3、ALLOW-FROM uri   表示该页面可以在指定来源的 frame...
          1.1k 1 分钟

          # nginx 负载均衡配置 轮询(默认)   每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。 upstream my_server &#123; server 192.168.0.2:8080; server 192.168.0.3:8080;&#125;server &#123; listen 80; server_name 192.168.0.1; # Path to the root of your installation location / &#123; proxy_pass...
          18k 17 分钟

          # 问题描述 今天突然发现博客的音乐无法播放了,经过一顿查找,发现是因为 https://api.i-meto.com/meting/api 获取的音乐地址出现了问题,估计是被网易云给封禁了。shoka 主题应该是通过这个网站提取音乐地址、图片等信息。通过断点发现网易播放列表还是能正常获取的,只是列表中的具体音乐、图片出现了问题。因为 meto 是把音乐的 url 指向自己的服务地址,然后通过参数获取的最终音乐,所以我通过参数拼凑出最终的网易云音乐地址,自此问题基本解决。只针对网易播放列表,图片只能使用一张固定的(因为图片的具体规律不知道 O (∩_∩) O~)。 # 解决方法 到...
          \ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index 0be8b7ff3..a6dbb9a8c 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -1 +1 @@ -☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          258 1 分钟

          今天突然发现自己的网站不能访问了。经过一顿排查,发现是家里的外网 ip 变动后 nginx 解析的域名 ip 还是旧 ip 导致的。手动重启 nginx 后恢复正常。但这不是长久之计,如果每次 ip 变动都需要重启一次 nginx,想想都头大。于是查询资料后获得了解决办法,方法如下: location / &#123; resolver 114.114.114.114 valid=60s; #自定义缓存有效时间间隔对变量中的域名进行解析 set $my_server "https://ip:port"; proxy_pass...
          179 1 分钟

          # 下载工具 protoc-3.19.5-win64.zip # 生成 js 文件 把 xxx.proto 文件拷贝到解压的 protoc-3.19.5-win64\bin 目录下 cmd 到相同的 bin 目录下 执行 protoc.exe --js_out=import_style=commonjs,binary:. ./xxx.proto 命令,就会在 bin 目录下生成 xxx_pb.js 文件
          508 1 分钟

          今天前端开发跟我反馈用 vue 的 socketio 连接不上后台服务,连接无反应无任何报错。所以不清楚是前端代码问题还是后台服务的问题。由于框架为另一同事搭建,我只负责处理后端业务逻辑部分,所以第一时间我也不清楚具体的原因。于是我找了个第三方的 socket 工具尝试连接,果然有问题。但是只是提示连接不上,无明显错误原因。到后台查看发现有提示 Unknown transport for request 错误,最后通过调试发现 netty-socketio 的库中 AuthorizeHandler 类有段处理 transport 的代码只能接受大写的 WEBSOCKET 或者...
          588 1 分钟

          # Hexo + Theme.Shoka 安装   安装介绍 # algolia 注册 algolia 不支持国内邮箱注册,而 google 和 github 由于国内被墙也没法使用。所以只能先注册 netlify 然后通过 netlify 注册 algolia。 登录 algolia 后创建一个 index,名字随意记住既可。 点击右上角红点,弹出窗口点 settings 按钮。 点击 API KEYS,获取 appId 和 adminApiKey 填入 hexo 的_config.yml 中 apiKey 暂时不填。 algolia: appId: #Your appId...
          608 1 分钟

          # 安装准备 需要先安装好 mysql 数据库 选择版本,1.5 版以前支持中文,之后被维护的团队删除只支持英文 本文介绍使用的是 linuxserver_chevereto 的镜像 需要预先创建好给 chevereto 使用的库、账户、密码 经过测试,使用 surenkid_chevereto 的镜像可以完美支持多国语言,配置同 linuxserver_chevereto 一样 # 容器配置 映射路径(不要放在高速盘,否则会有权限问题) 端口 环境(puid 和 pgid 使用 1000,不要使用 0,否则会报错) # 初始化配置 使用 http:// 极空间...
          1.5k 1 分钟

          # hexo 博客安装 安装 nodejs 安装 git 安装 hexo(windows 需进入 git bash) npm install -g hexo-cli 初始化博客目录 hexo init blog 进入博客目录 cd blog 初始化 hexo 到博客目录 npm install # shoka 主题安装 下载主题 git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka 卸载 hexo-renderer-marked 以及别的 markdown 文件渲染器 npm un...
          \ No newline at end of file +☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          258 1 分钟

          今天突然发现自己的网站不能访问了。经过一顿排查,发现是家里的外网 ip 变动后 nginx 解析的域名 ip 还是旧 ip 导致的。手动重启 nginx 后恢复正常。但这不是长久之计,如果每次 ip 变动都需要重启一次 nginx,想想都头大。于是查询资料后获得了解决办法,方法如下: location / &#123; resolver 114.114.114.114 valid=60s; #自定义缓存有效时间间隔对变量中的域名进行解析 set $my_server "https://ip:port"; proxy_pass...
          179 1 分钟

          # 下载工具 protoc-3.19.5-win64.zip # 生成 js 文件 把 xxx.proto 文件拷贝到解压的 protoc-3.19.5-win64\bin 目录下 cmd 到相同的 bin 目录下 执行 protoc.exe --js_out=import_style=commonjs,binary:. ./xxx.proto 命令,就会在 bin 目录下生成 xxx_pb.js 文件
          508 1 分钟

          今天前端开发跟我反馈用 vue 的 socketio 连接不上后台服务,连接无反应无任何报错。所以不清楚是前端代码问题还是后台服务的问题。由于框架为另一同事搭建,我只负责处理后端业务逻辑部分,所以第一时间我也不清楚具体的原因。于是我找了个第三方的 socket 工具尝试连接,果然有问题。但是只是提示连接不上,无明显错误原因。到后台查看发现有提示 Unknown transport for request 错误,最后通过调试发现 netty-socketio 的库中 AuthorizeHandler 类有段处理 transport 的代码只能接受大写的 WEBSOCKET 或者...
          588 1 分钟

          # Hexo + Theme.Shoka 安装   安装介绍 # algolia 注册 algolia 不支持国内邮箱注册,而 google 和 github 由于国内被墙也没法使用。所以只能先注册 netlify 然后通过 netlify 注册 algolia。 登录 algolia 后创建一个 index,名字随意记住既可。 点击右上角红点,弹出窗口点 settings 按钮。 点击 API KEYS,获取 appId 和 adminApiKey 填入 hexo 的_config.yml 中 apiKey 暂时不填。 algolia: appId: #Your appId...
          608 1 分钟

          # 安装准备 需要先安装好 mysql 数据库 选择版本,1.5 版以前支持中文,之后被维护的团队删除只支持英文 本文介绍使用的是 linuxserver_chevereto 的镜像 需要预先创建好给 chevereto 使用的库、账户、密码 经过测试,使用 surenkid_chevereto 的镜像可以完美支持多国语言,配置同 linuxserver_chevereto 一样 # 容器配置 映射路径(不要放在高速盘,否则会有权限问题) 端口 环境(puid 和 pgid 使用 1000,不要使用 0,否则会报错) # 初始化配置 使用 http:// 极空间...
          1.5k 1 分钟

          # hexo 博客安装 安装 nodejs 安装 git 安装 hexo(windows 需进入 git bash) npm install -g hexo-cli 初始化博客目录 hexo init blog 进入博客目录 cd blog 初始化 hexo 到博客目录 npm install # shoka 主题安装 下载主题 git clone https://github.com/amehime/hexo-theme-shoka.git ./themes/shoka 卸载 hexo-renderer-marked 以及别的 markdown 文件渲染器 npm un...
          \ No newline at end of file diff --git a/rss.xml b/rss.xml index 7f89fa23b..cf6de631c 100644 --- a/rss.xml +++ b/rss.xml @@ -58,8 +58,8 @@ - + Fri, 02 Dec 2022 15:16:00 +0800 标签:2>&1 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:2>&1 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/360小工具/index.html b/tags/360小工具/index.html index cb4d85ebf..c747b61ef 100644 --- a/tags/360小工具/index.html +++ b/tags/360小工具/index.html @@ -1 +1 @@ -标签:360小工具 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:360小工具 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Hexo-admin/index.html b/tags/Hexo-admin/index.html index a691b18a2..42443454e 100644 --- a/tags/Hexo-admin/index.html +++ b/tags/Hexo-admin/index.html @@ -1 +1 @@ -标签:Hexo-admin | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Hexo-admin | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Hexo/index.html b/tags/Hexo/index.html index b19fc7c99..8c2eb9e69 100644 --- a/tags/Hexo/index.html +++ b/tags/Hexo/index.html @@ -1 +1 @@ -标签:Hexo | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Hexo | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/KLineChart/index.html b/tags/KLineChart/index.html index f4acc753b..87ea76465 100644 --- a/tags/KLineChart/index.html +++ b/tags/KLineChart/index.html @@ -1 +1 @@ -标签:KLineChart | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:KLineChart | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/K线/index.html b/tags/K线/index.html index 67c4b67b8..02e3a7085 100644 --- a/tags/K线/index.html +++ b/tags/K线/index.html @@ -1 +1 @@ -标签:K线 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:K线 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/NodeJS/index.html b/tags/NodeJS/index.html index 6c6cbda83..675579cc2 100644 --- a/tags/NodeJS/index.html +++ b/tags/NodeJS/index.html @@ -1 +1 @@ -标签:NodeJS | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:NodeJS | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/PicGo/index.html b/tags/PicGo/index.html index 5f3258153..b97a87cff 100644 --- a/tags/PicGo/index.html +++ b/tags/PicGo/index.html @@ -1 +1 @@ -标签:PicGo | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:PicGo | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Shell/index.html b/tags/Shell/index.html index 730e04eb6..40f7a3a7a 100644 --- a/tags/Shell/index.html +++ b/tags/Shell/index.html @@ -1 +1 @@ -标签:Shell | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Shell | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Shoka/index.html b/tags/Shoka/index.html index 7f6e4b5e2..2177b3590 100644 --- a/tags/Shoka/index.html +++ b/tags/Shoka/index.html @@ -1 +1 @@ -标签:Shoka | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Shoka | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Tengine/index.html b/tags/Tengine/index.html index 9246b6fa1..676b2e161 100644 --- a/tags/Tengine/index.html +++ b/tags/Tengine/index.html @@ -1 +1 @@ -标签:Tengine | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Tengine | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Valine/index.html b/tags/Valine/index.html index d2742ae82..3725289de 100644 --- a/tags/Valine/index.html +++ b/tags/Valine/index.html @@ -1 +1 @@ -标签:Valine | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Valine | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Windows10/index.html b/tags/Windows10/index.html index db126cdf3..522246fc0 100644 --- a/tags/Windows10/index.html +++ b/tags/Windows10/index.html @@ -1 +1 @@ -标签:Windows10 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Windows10 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Windows11/index.html b/tags/Windows11/index.html index 841349d0e..a1488e701 100644 --- a/tags/Windows11/index.html +++ b/tags/Windows11/index.html @@ -1 +1 @@ -标签:Windows11 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Windows11 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/Wordpress/index.html b/tags/Wordpress/index.html index 7331b1fc0..141245c52 100644 --- a/tags/Wordpress/index.html +++ b/tags/Wordpress/index.html @@ -1 +1 @@ -标签:Wordpress | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:Wordpress | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/algolia/index.html b/tags/algolia/index.html index d08ecef6b..993d95242 100644 --- a/tags/algolia/index.html +++ b/tags/algolia/index.html @@ -1 +1 @@ -标签:algolia | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:algolia | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/chevereto/index.html b/tags/chevereto/index.html index 00d5735e2..3babfa0a2 100644 --- a/tags/chevereto/index.html +++ b/tags/chevereto/index.html @@ -1 +1 @@ -标签:chevereto | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:chevereto | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/cookie/index.html b/tags/cookie/index.html index 7a332f9b1..f13fc4cf3 100644 --- a/tags/cookie/index.html +++ b/tags/cookie/index.html @@ -1 +1 @@ -标签:cookie | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:cookie | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/docker/index.html b/tags/docker/index.html index 62204a36e..9e0c22ac9 100644 --- a/tags/docker/index.html +++ b/tags/docker/index.html @@ -1 +1 @@ -标签:docker | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:docker | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/git/index.html b/tags/git/index.html index 603813194..49ab682a6 100644 --- a/tags/git/index.html +++ b/tags/git/index.html @@ -1 +1 @@ -标签:git | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:git | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/https/index.html b/tags/https/index.html index 4a641063f..77c4b0dc0 100644 --- a/tags/https/index.html +++ b/tags/https/index.html @@ -1 +1 @@ -标签:https | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:https | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/iframe/index.html b/tags/iframe/index.html index feed1ce73..f711aeebe 100644 --- a/tags/iframe/index.html +++ b/tags/iframe/index.html @@ -1 +1 @@ -标签:iframe | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:iframe | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index e9310ef23..902b9dbc2 100644 --- a/tags/index.html +++ b/tags/index.html @@ -1 +1 @@ -全部标签 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +全部标签 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/js/index.html b/tags/js/index.html index a3afea70d..10540cb41 100644 --- a/tags/js/index.html +++ b/tags/js/index.html @@ -1 +1 @@ -标签:js | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:js | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/mariadb/index.html b/tags/mariadb/index.html index 983becf27..933e3398a 100644 --- a/tags/mariadb/index.html +++ b/tags/mariadb/index.html @@ -1 +1 @@ -标签:mariadb | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:mariadb | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/mysql/index.html b/tags/mysql/index.html index bf8086cb6..4b8739e2a 100644 --- a/tags/mysql/index.html +++ b/tags/mysql/index.html @@ -1 +1 @@ -标签:mysql | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:mysql | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/nagios/index.html b/tags/nagios/index.html index ab59034a2..66e447c80 100644 --- a/tags/nagios/index.html +++ b/tags/nagios/index.html @@ -1 +1 @@ -标签:nagios | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:nagios | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/netty/index.html b/tags/netty/index.html index 999ca39cf..dcb8d6dcb 100644 --- a/tags/netty/index.html +++ b/tags/netty/index.html @@ -1 +1 @@ -标签:netty | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:netty | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/nginx/index.html b/tags/nginx/index.html index 57fbb9997..e6e325452 100644 --- a/tags/nginx/index.html +++ b/tags/nginx/index.html @@ -1 +1 @@ -标签:nginx | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:nginx | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/protobuf/index.html b/tags/protobuf/index.html index e52035999..e45150709 100644 --- a/tags/protobuf/index.html +++ b/tags/protobuf/index.html @@ -1 +1 @@ -标签:protobuf | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:protobuf | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/redis/index.html b/tags/redis/index.html index b533bf6b0..511f03229 100644 --- a/tags/redis/index.html +++ b/tags/redis/index.html @@ -1 +1 @@ -标签:redis | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:redis | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/socketIO/index.html b/tags/socketIO/index.html index 7a8595542..ada18e955 100644 --- a/tags/socketIO/index.html +++ b/tags/socketIO/index.html @@ -1 +1 @@ -标签:socketIO | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:socketIO | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/stream/index.html b/tags/stream/index.html index 9b85f1ca6..9e1d4da1c 100644 --- a/tags/stream/index.html +++ b/tags/stream/index.html @@ -1 +1 @@ -标签:stream | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:stream | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/svn/index.html b/tags/svn/index.html index 6163628f5..b2725dec3 100644 --- a/tags/svn/index.html +++ b/tags/svn/index.html @@ -1 +1 @@ -标签:svn | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:svn | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/vue/index.html b/tags/vue/index.html index 868aca1e8..a74350df3 100644 --- a/tags/vue/index.html +++ b/tags/vue/index.html @@ -1 +1 @@ -标签:vue | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:vue | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/web/index.html b/tags/web/index.html index 7d8dd7bbe..a57313ef7 100644 --- a/tags/web/index.html +++ b/tags/web/index.html @@ -1 +1 @@ -标签:web | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:web | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/win10/index.html b/tags/win10/index.html index 3a43b4365..1e21cf02a 100644 --- a/tags/win10/index.html +++ b/tags/win10/index.html @@ -1 +1 @@ -标签:win10 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:win10 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/wsappx/index.html b/tags/wsappx/index.html index 078a43fae..656e27048 100644 --- a/tags/wsappx/index.html +++ b/tags/wsappx/index.html @@ -1 +1 @@ -标签:wsappx | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:wsappx | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/yarn/index.html b/tags/yarn/index.html index f7e1298d0..5dd5fd478 100644 --- a/tags/yarn/index.html +++ b/tags/yarn/index.html @@ -1 +1 @@ -标签:yarn | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:yarn | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/动态域名解析/index.html b/tags/动态域名解析/index.html index dbfea7e0a..8bac3d04f 100644 --- a/tags/动态域名解析/index.html +++ b/tags/动态域名解析/index.html @@ -1 +1 @@ -标签:动态域名解析 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:动态域名解析 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/博客/index.html b/tags/博客/index.html index 5b085e4af..50bd92174 100644 --- a/tags/博客/index.html +++ b/tags/博客/index.html @@ -1 +1 @@ -标签:博客 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:博客 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/反向代理/index.html b/tags/反向代理/index.html index f60567d0d..b94fb5182 100644 --- a/tags/反向代理/index.html +++ b/tags/反向代理/index.html @@ -1 +1 @@ -标签:反向代理 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:反向代理 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/图床/index.html b/tags/图床/index.html index 51c256558..e1c93e349 100644 --- a/tags/图床/index.html +++ b/tags/图床/index.html @@ -1 +1 @@ -标签:图床 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:图床 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/图片上传/index.html b/tags/图片上传/index.html index 5267dcc15..72125aaa1 100644 --- a/tags/图片上传/index.html +++ b/tags/图片上传/index.html @@ -1 +1 @@ -标签:图片上传 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:图片上传 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/定时任务/index.html b/tags/定时任务/index.html index 182a6cfe7..5f173fa90 100644 --- a/tags/定时任务/index.html +++ b/tags/定时任务/index.html @@ -1 +1 @@ -标签:定时任务 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:定时任务 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/心情/index.html b/tags/心情/index.html index d277fe73f..b3380a16d 100644 --- a/tags/心情/index.html +++ b/tags/心情/index.html @@ -1 +1 @@ -标签:心情 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:心情 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/搜索/index.html b/tags/搜索/index.html index 500938eb3..af9d71be4 100644 --- a/tags/搜索/index.html +++ b/tags/搜索/index.html @@ -1 +1 @@ -标签:搜索 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:搜索 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/数据库工具/index.html b/tags/数据库工具/index.html index 62184fe84..3011628a9 100644 --- a/tags/数据库工具/index.html +++ b/tags/数据库工具/index.html @@ -1 +1 @@ -标签:数据库工具 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:数据库工具 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/服务监控/index.html b/tags/服务监控/index.html index 9050c45da..649b627ae 100644 --- a/tags/服务监控/index.html +++ b/tags/服务监控/index.html @@ -1 +1 @@ -标签:服务监控 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:服务监控 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/极空间/index.html b/tags/极空间/index.html index 82c585c41..6691ae466 100644 --- a/tags/极空间/index.html +++ b/tags/极空间/index.html @@ -1 +1 @@ -标签:极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:极空间 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/背景音乐/index.html b/tags/背景音乐/index.html index 2fff5c0f9..e21648fdf 100644 --- a/tags/背景音乐/index.html +++ b/tags/背景音乐/index.html @@ -1 +1 @@ -标签:背景音乐 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:背景音乐 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/自动更新/index.html b/tags/自动更新/index.html index 091073b1d..6eb15c6e2 100644 --- a/tags/自动更新/index.html +++ b/tags/自动更新/index.html @@ -1 +1 @@ -标签:自动更新 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:自动更新 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/自定义指标/index.html b/tags/自定义指标/index.html index 1db946730..78b01d56c 100644 --- a/tags/自定义指标/index.html +++ b/tags/自定义指标/index.html @@ -1 +1 @@ -标签:自定义指标 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:自定义指标 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/蜡烛图/index.html b/tags/蜡烛图/index.html index 7d6afa1dd..963d72407 100644 --- a/tags/蜡烛图/index.html +++ b/tags/蜡烛图/index.html @@ -1 +1 @@ -标签:蜡烛图 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:蜡烛图 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/评论/index.html b/tags/评论/index.html index 97a5aee77..1b325616f 100644 --- a/tags/评论/index.html +++ b/tags/评论/index.html @@ -1 +1 @@ -标签:评论 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:评论 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/负载均衡/index.html b/tags/负载均衡/index.html index 58bf0aa0e..e71aa6f85 100644 --- a/tags/负载均衡/index.html +++ b/tags/负载均衡/index.html @@ -1 +1 @@ -标签:负载均衡 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:负载均衡 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/踩坑/index.html b/tags/踩坑/index.html index 0ab6e0def..f9b59a4f8 100644 --- a/tags/踩坑/index.html +++ b/tags/踩坑/index.html @@ -1 +1 @@ -标签:踩坑 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:踩坑 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/郁闷/index.html b/tags/郁闷/index.html index d4746ca7c..bc453cdbe 100644 --- a/tags/郁闷/index.html +++ b/tags/郁闷/index.html @@ -1 +1 @@ -标签:郁闷 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:郁闷 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/青龙面板/index.html b/tags/青龙面板/index.html index ab488af3c..9ecac8f63 100644 --- a/tags/青龙面板/index.html +++ b/tags/青龙面板/index.html @@ -1 +1 @@ -标签:青龙面板 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:青龙面板 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file diff --git a/tags/项目部署/index.html b/tags/项目部署/index.html index 200669b5c..4b58e98df 100644 --- a/tags/项目部署/index.html +++ b/tags/项目部署/index.html @@ -1 +1 @@ -标签:项目部署 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file +标签:项目部署 | ☆∵∴Hito∴∵★ = 涛声依旧 = 天下事有难易乎?为之,则难者亦易矣
          \ No newline at end of file