diff --git a/about/index.html b/about/index.html index c5107334a..0017955cc 100644 --- a/about/index.html +++ b/about/index.html @@ -1 +1 @@ -关于 | GGLSS

关于

🤖️ 数码爱好者🔍 不解决不放弃🏠 智能家居小能手🔨 开发小萌新
折腾劲 MAX 🤝脚踏实地行动派 🏃践踏各种困难 🧱话多人不狠 💢

生活明朗,万物可爱✨

你好,很高兴认识你👋
我叫GGLSS
是一名 测试工程师、独立开发者、博主
追求

源于
热爱而去感受
学习生活程序体验

Hello there!

技能
开启创造力
Vue
Java
Docker
Webpack
Photoshop
Swift
Python
Node
Git
Css
Js
...
生涯
无限进步
EDU,软件工程专业
生涯
座右铭
生活明朗,万物可爱。
特长
脑回路新奇的酸菜鱼二次元指数MAX
爱好游戏
原神
UID: 125766904
爱好番剧
紫罗兰的永恒花园
心路历程
欢迎来到我的博客 😝,这里是我记笔记的地方 🙌,目前就读于长沙湖南信息学院软件工程专业,虽然有时候常常会忘记更新笔记,咕咕 ✋~ 但是记笔记真的是一个很棒的习惯 💪,能把学下来的知识进行积累,沉淀,有一句话说的好,能教给别人的知识,才是真正学会了的知识 ⚡ 每周我都会尽量进行更新 ☁️,如果没更的话,可能是我忘了,也可能是我在钻研某个东西的时候太入迷了肯定又熬夜了同学们不要学我,老是熬夜会长痘 给大家推荐一部番:因为这部番,2018 年的一个夏天我看完以后心情久久不能释怀,为薇尔莉特与爱感到一种说不上来的味道,多年以后在看这部番,才明白原来这就是爱,喜欢这部番不仅仅是因为它制作的用心,不论是人物细节还是场景细节,不管是 op 还是 ed 都非常好听,最后的结局或许才是让我不能忘怀的原因,薇尔莉特,希望收到来自家人,朋友,恋人的那封 "信" ~

致力于成为一个前端小姥🐷

又菜又爱玩🎮ctrl +Cctrl +V高级CV工程师🏆

擅长PS、Pr、Ae、Au、Ai、Dw、An、Id等软件的安装与卸载🎃

精通Html、CSS、JavaScript、Vue、React、PHP、Java、Python、C、C++、C#、Go、TypeScript等单词的拼写🎲

熟悉Windows、Linux、Mac、Android、IOS等系统的开关机👻

todoList

原生微信小程序

vue3、vite、 pinia

重装文档重写

Electron

操作系统

svg绘制

threeJS

Next

Flutter

智慧城市大前端

react18系统学习

工业企业生产管理

语言的魅力

控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +关于 | GGLSS

关于

🤖️ 数码爱好者🔍 不解决不放弃🏠 智能家居小能手🔨 开发小萌新
折腾劲 MAX 🤝脚踏实地行动派 🏃践踏各种困难 🧱话多人不狠 💢

生活明朗,万物可爱✨

你好,很高兴认识你👋
我叫GGLSS
是一名 测试工程师、独立开发者、博主
追求

源于
热爱而去感受
学习生活程序体验

Hello there!

技能
开启创造力
Vue
Java
Docker
Webpack
Photoshop
Swift
Python
Node
Git
Css
Js
...
生涯
无限进步
EDU,软件工程专业
生涯
座右铭
生活明朗,万物可爱。
特长
脑回路新奇的酸菜鱼二次元指数MAX
爱好游戏
原神
UID: 125766904
爱好番剧
紫罗兰的永恒花园
心路历程
欢迎来到我的博客 😝,这里是我记笔记的地方 🙌,目前就读于长沙湖南信息学院软件工程专业,虽然有时候常常会忘记更新笔记,咕咕 ✋~ 但是记笔记真的是一个很棒的习惯 💪,能把学下来的知识进行积累,沉淀,有一句话说的好,能教给别人的知识,才是真正学会了的知识 ⚡ 每周我都会尽量进行更新 ☁️,如果没更的话,可能是我忘了,也可能是我在钻研某个东西的时候太入迷了肯定又熬夜了同学们不要学我,老是熬夜会长痘 给大家推荐一部番:因为这部番,2018 年的一个夏天我看完以后心情久久不能释怀,为薇尔莉特与爱感到一种说不上来的味道,多年以后在看这部番,才明白原来这就是爱,喜欢这部番不仅仅是因为它制作的用心,不论是人物细节还是场景细节,不管是 op 还是 ed 都非常好听,最后的结局或许才是让我不能忘怀的原因,薇尔莉特,希望收到来自家人,朋友,恋人的那封 "信" ~

致力于成为一个前端小姥🐷

又菜又爱玩🎮ctrl +Cctrl +V高级CV工程师🏆

擅长PS、Pr、Ae、Au、Ai、Dw、An、Id等软件的安装与卸载🎃

精通Html、CSS、JavaScript、Vue、React、PHP、Java、Python、C、C++、C#、Go、TypeScript等单词的拼写🎲

熟悉Windows、Linux、Mac、Android、IOS等系统的开关机👻

todoList

原生微信小程序

vue3、vite、 pinia

重装文档重写

Electron

操作系统

svg绘制

threeJS

Next

Flutter

智慧城市大前端

react18系统学习

工业企业生产管理

语言的魅力

控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/08/index.html b/archives/2022/08/index.html index 411352822..00c874921 100644 --- a/archives/2022/08/index.html +++ b/archives/2022/08/index.html @@ -1 +1 @@ -八月 2022 | GGLSS
文章总览 - 39
2022
如何使用pyyaml获取yaml里面的数据
如何使用pyyaml获取yaml里面的数据
Shell工具(一)
Shell工具(一)
Shell条件判断
Shell条件判断
Shell函数
Shell函数
Shell流程控制
Shell流程控制
Shell运算符
Shell运算符
Shell工具(二)
Shell工具(二)
Shell脚本入门
Shell脚本入门
Shell变量
Shell变量
Shell脚本初探
Shell脚本初探
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +八月 2022 | GGLSS
文章总览 - 39
2022
Shell函数
Shell函数
Shell条件判断
Shell条件判断
Shell运算符
Shell运算符
Shell流程控制
Shell流程控制
如何使用pyyaml获取yaml里面的数据
如何使用pyyaml获取yaml里面的数据
Shell工具(二)
Shell工具(二)
Shell工具(一)
Shell工具(一)
Shell脚本初探
Shell脚本初探
Shell脚本入门
Shell脚本入门
Shell变量
Shell变量
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/08/page/2/index.html b/archives/2022/08/page/2/index.html index c900e8269..ecce4688e 100644 --- a/archives/2022/08/page/2/index.html +++ b/archives/2022/08/page/2/index.html @@ -1 +1 @@ -八月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +八月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/08/page/3/index.html b/archives/2022/08/page/3/index.html index 218aa92ba..196cddf2f 100644 --- a/archives/2022/08/page/3/index.html +++ b/archives/2022/08/page/3/index.html @@ -1 +1 @@ -八月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +八月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/08/page/4/index.html b/archives/2022/08/page/4/index.html index 59242d306..a2f663278 100644 --- a/archives/2022/08/page/4/index.html +++ b/archives/2022/08/page/4/index.html @@ -1 +1 @@ -八月 2022 | GGLSS
文章总览 - 39
2022
本地镜像发布到阿里云
本地镜像发布到阿里云
镜像
镜像
容器(三)
容器(三)
使用pip install报错的解决办法
使用pip install报错的解决办法
Yaml的使用
Yaml的使用
性能测试主要关注点
性能测试主要关注点
使用jmeter录制压测
使用jmeter录制压测
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +八月 2022 | GGLSS
文章总览 - 39
2022
本地镜像发布到私有库
本地镜像发布到私有库
容器(二)
容器(二)
本地镜像发布到阿里云
本地镜像发布到阿里云
镜像
镜像
使用jmeter录制压测
使用jmeter录制压测
Yaml的使用
Yaml的使用
性能测试主要关注点
性能测试主要关注点
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/09/index.html b/archives/2022/09/index.html index 66dd72f74..f072b9d9e 100644 --- a/archives/2022/09/index.html +++ b/archives/2022/09/index.html @@ -1 +1 @@ -九月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +九月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/10/index.html b/archives/2022/10/index.html index 004e9e9b9..817d5e5f9 100644 --- a/archives/2022/10/index.html +++ b/archives/2022/10/index.html @@ -1 +1 @@ -十月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/11/index.html b/archives/2022/11/index.html index b770ad47b..972c51b74 100644 --- a/archives/2022/11/index.html +++ b/archives/2022/11/index.html @@ -1 +1 @@ -十一月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十一月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ 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 6b08d2d05..b8f200233 100644 --- a/archives/2022/11/page/2/index.html +++ b/archives/2022/11/page/2/index.html @@ -1 +1 @@ -十一月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十一月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/11/page/3/index.html b/archives/2022/11/page/3/index.html index 953ad5362..0af91ac0d 100644 --- a/archives/2022/11/page/3/index.html +++ b/archives/2022/11/page/3/index.html @@ -1 +1 @@ -十一月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十一月 2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/12/index.html b/archives/2022/12/index.html index 7a20b44e7..448e96ec6 100644 --- a/archives/2022/12/index.html +++ b/archives/2022/12/index.html @@ -1 +1 @@ -十二月 2022 | GGLSS
文章总览 - 5
2022
包装类
包装类
字符串
字符串
抽象类与接口
抽象类与接口
继承、重写与重载
继承、重写与重载
硬件性能监控平台
硬件性能监控平台
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十二月 2022 | GGLSS
文章总览 - 5
2022
包装类
包装类
字符串
字符串
抽象类与接口
抽象类与接口
继承、重写与重载
继承、重写与重载
硬件性能监控平台
硬件性能监控平台
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/index.html b/archives/2022/index.html index e1e4d876c..68d8ffdb4 100644 --- a/archives/2022/index.html +++ b/archives/2022/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/2/index.html b/archives/2022/page/2/index.html index 5b0a806cb..a9c7fbbd0 100644 --- a/archives/2022/page/2/index.html +++ b/archives/2022/page/2/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/3/index.html b/archives/2022/page/3/index.html index eaf3b166d..85bb98e65 100644 --- a/archives/2022/page/3/index.html +++ b/archives/2022/page/3/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/4/index.html b/archives/2022/page/4/index.html index 3d17166a0..facec7a2b 100644 --- a/archives/2022/page/4/index.html +++ b/archives/2022/page/4/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/5/index.html b/archives/2022/page/5/index.html index acf283a01..fa2ec6c4c 100644 --- a/archives/2022/page/5/index.html +++ b/archives/2022/page/5/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/6/index.html b/archives/2022/page/6/index.html index ade230ade..393f7eb30 100644 --- a/archives/2022/page/6/index.html +++ b/archives/2022/page/6/index.html @@ -1 +1 @@ -2022 | GGLSS
文章总览 - 87
2022
Shell条件判断
Shell条件判断
Shell函数
Shell函数
Shell流程控制
Shell流程控制
Shell运算符
Shell运算符
Shell工具(二)
Shell工具(二)
Shell脚本入门
Shell脚本入门
Shell变量
Shell变量
Shell脚本初探
Shell脚本初探
css教程一
css教程一
_3主3从的`Redis集群`搭建(下)
_3主3从的`Redis集群`搭建(下)
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/7/index.html b/archives/2022/page/7/index.html index f17508e61..46100dced 100644 --- a/archives/2022/page/7/index.html +++ b/archives/2022/page/7/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/8/index.html b/archives/2022/page/8/index.html index 79e19ad99..39be3a6d5 100644 --- a/archives/2022/page/8/index.html +++ b/archives/2022/page/8/index.html @@ -1 +1 @@ -2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2022/page/9/index.html b/archives/2022/page/9/index.html index 2efbb7af0..089a67065 100644 --- a/archives/2022/page/9/index.html +++ b/archives/2022/page/9/index.html @@ -1 +1 @@ -2022 | GGLSS
文章总览 - 87
2022
容器(三)
容器(三)
使用pip install报错的解决办法
使用pip install报错的解决办法
Yaml的使用
Yaml的使用
性能测试主要关注点
性能测试主要关注点
使用jmeter录制压测
使用jmeter录制压测
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2022 | GGLSS
文章总览 - 87
2022
本地镜像发布到阿里云
本地镜像发布到阿里云
镜像
镜像
使用jmeter录制压测
使用jmeter录制压测
Yaml的使用
Yaml的使用
性能测试主要关注点
性能测试主要关注点
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html index 8706d6f7e..66ae9d910 100644 --- a/archives/2023/09/index.html +++ b/archives/2023/09/index.html @@ -1 +1 @@ -九月 2023 | GGLSS
文章总览 - 2
2023
长难句一
长难句一
2023立的flag
2023立的flag
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +九月 2023 | GGLSS
文章总览 - 2
2023
长难句一
长难句一
2023立的flag
2023立的flag
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2023/10/index.html b/archives/2023/10/index.html index 87fdbe31b..fe51db921 100644 --- a/archives/2023/10/index.html +++ b/archives/2023/10/index.html @@ -1 +1 @@ -十月 2023 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十月 2023 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2023/11/index.html b/archives/2023/11/index.html index e08693bbd..e40bba41a 100644 --- a/archives/2023/11/index.html +++ b/archives/2023/11/index.html @@ -1 +1 @@ -十一月 2023 | GGLSS
文章总览 - 1
2023
考研进度实况
考研进度实况
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十一月 2023 | GGLSS
文章总览 - 1
2023
考研进度实况
考研进度实况
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2023/12/index.html b/archives/2023/12/index.html index 9de958a8e..790e4e485 100644 --- a/archives/2023/12/index.html +++ b/archives/2023/12/index.html @@ -1 +1 @@ -十二月 2023 | GGLSS
文章总览 - 5
2023
english one
english one
python自动化配置参数
python自动化配置参数
自动获取driver
自动获取driver
Hello World
Hello World
Butterfly美化记录五
Butterfly美化记录五
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +十二月 2023 | GGLSS
文章总览 - 5
2023
english one
english one
python自动化配置参数
python自动化配置参数
自动获取driver
自动获取driver
Hello World
Hello World
Butterfly美化记录五
Butterfly美化记录五
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2023/index.html b/archives/2023/index.html index 3bbb6f9d6..ee1f9c303 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -1 +1 @@ -2023 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2023 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/2023/page/2/index.html b/archives/2023/page/2/index.html index 0f7473e66..2abc0ba64 100644 --- a/archives/2023/page/2/index.html +++ b/archives/2023/page/2/index.html @@ -1 +1 @@ -2023 | GGLSS
文章总览 - 12
2023
长难句一
长难句一
2023立的flag
2023立的flag
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2023 | GGLSS
文章总览 - 12
2023
长难句一
长难句一
2023立的flag
2023立的flag
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/index.html b/archives/index.html index 14447a111..efd54fac8 100644 --- a/archives/index.html +++ b/archives/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/10/index.html b/archives/page/10/index.html index 975cf5e11..d9c885b04 100644 --- a/archives/page/10/index.html +++ b/archives/page/10/index.html @@ -1 +1 @@ -归档 | GGLSS
文章总览 - 99
2022
本地镜像发布到阿里云
本地镜像发布到阿里云
镜像
镜像
容器(三)
容器(三)
使用pip install报错的解决办法
使用pip install报错的解决办法
Yaml的使用
Yaml的使用
性能测试主要关注点
性能测试主要关注点
使用jmeter录制压测
使用jmeter录制压测
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
文章总览 - 99
2022
本地镜像发布到私有库
本地镜像发布到私有库
容器(二)
容器(二)
本地镜像发布到阿里云
本地镜像发布到阿里云
镜像
镜像
使用jmeter录制压测
使用jmeter录制压测
Yaml的使用
Yaml的使用
性能测试主要关注点
性能测试主要关注点
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/2/index.html b/archives/page/2/index.html index 9b10ac68a..5171555de 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/3/index.html b/archives/page/3/index.html index 14d596f5a..0ca6c0fc9 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/4/index.html b/archives/page/4/index.html index 820bf501e..379f1c2ec 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/5/index.html b/archives/page/5/index.html index 615c81270..1960c6dc8 100644 --- a/archives/page/5/index.html +++ b/archives/page/5/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/6/index.html b/archives/page/6/index.html index de4abee24..0bcd3268b 100644 --- a/archives/page/6/index.html +++ b/archives/page/6/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/7/index.html b/archives/page/7/index.html index cc7c08fb4..896b62b9d 100644 --- a/archives/page/7/index.html +++ b/archives/page/7/index.html @@ -1 +1 @@ -归档 | GGLSS
文章总览 - 99
2022
如何使用pyyaml获取yaml里面的数据
如何使用pyyaml获取yaml里面的数据
Shell工具(一)
Shell工具(一)
Shell条件判断
Shell条件判断
Shell函数
Shell函数
Shell流程控制
Shell流程控制
Shell运算符
Shell运算符
Shell工具(二)
Shell工具(二)
Shell脚本入门
Shell脚本入门
Shell变量
Shell变量
Shell脚本初探
Shell脚本初探
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
文章总览 - 99
2022
Shell函数
Shell函数
Shell条件判断
Shell条件判断
Shell运算符
Shell运算符
Shell流程控制
Shell流程控制
如何使用pyyaml获取yaml里面的数据
如何使用pyyaml获取yaml里面的数据
Shell工具(二)
Shell工具(二)
Shell工具(一)
Shell工具(一)
Shell脚本初探
Shell脚本初探
Shell脚本入门
Shell脚本入门
Shell变量
Shell变量
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/8/index.html b/archives/page/8/index.html index f2a7f82b0..72b138b5b 100644 --- a/archives/page/8/index.html +++ b/archives/page/8/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/archives/page/9/index.html b/archives/page/9/index.html index 8a556e497..a5bbcef06 100644 --- a/archives/page/9/index.html +++ b/archives/page/9/index.html @@ -1 +1 @@ -归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +归档 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/categories/index.html b/categories/index.html index 12bce2bcf..7fbe028fb 100644 --- a/categories/index.html +++ b/categories/index.html @@ -1 +1 @@ -分类 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\255\246\344\271\240\346\227\245\345\270\270/index.html" "b/categories/\345\255\246\344\271\240\346\227\245\345\270\270/index.html" index 1d6d2fc5d..427f51e61 100644 --- "a/categories/\345\255\246\344\271\240\346\227\245\345\270\270/index.html" +++ "b/categories/\345\255\246\344\271\240\346\227\245\345\270\270/index.html" @@ -1 +1 @@ -分类: 学习日常 | GGLSS
分类 - 学习日常
2023
english one
english one
考研进度实况
考研进度实况
长难句一
长难句一
2022
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 学习日常 | GGLSS
分类 - 学习日常
2023
english one
english one
考研进度实况
考研进度实况
长难句一
长难句一
2022
马哲
马哲
高数一
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" index 238d52974..ea7462c09 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/2/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/2/index.html" index 59510f8b4..5b9e7b022 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/2/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/2/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/3/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/3/index.html" index 2bb495dde..e256c8369 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/3/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/3/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/4/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/4/index.html" index 1a6477845..ba6b0c640 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/4/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/4/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/5/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/5/index.html" index 07deed024..34b03aa20 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/5/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/5/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/6/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/6/index.html" index 895eef2a5..268b6a62c 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/6/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/6/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/7/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/7/index.html" index 603317580..d0d9ba6e7 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/7/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/7/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/8/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/8/index.html" index 139022821..2a615d624 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/8/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/8/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/9/index.html" "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/9/index.html" index e705f8858..307cc3135 100644 --- "a/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/9/index.html" +++ "b/categories/\345\267\245\345\205\267\346\225\231\347\250\213/page/9/index.html" @@ -1 +1 @@ -分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 工具教程 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\347\224\237\346\264\273\346\227\245\345\270\270/index.html" "b/categories/\347\224\237\346\264\273\346\227\245\345\270\270/index.html" index 8e5b97d11..1ea8c01cd 100644 --- "a/categories/\347\224\237\346\264\273\346\227\245\345\270\270/index.html" +++ "b/categories/\347\224\237\346\264\273\346\227\245\345\270\270/index.html" @@ -1 +1 @@ -分类: 生活日常 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 生活日常 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git "a/categories/\347\273\217\351\252\214\345\210\206\344\272\253/index.html" "b/categories/\347\273\217\351\252\214\345\210\206\344\272\253/index.html" index e017f9ada..81940ad89 100644 --- "a/categories/\347\273\217\351\252\214\345\210\206\344\272\253/index.html" +++ "b/categories/\347\273\217\351\252\214\345\210\206\344\272\253/index.html" @@ -1 +1 @@ -分类: 经验分享 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +分类: 经验分享 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/css/index.css b/css/index.css index 26e0252a0..0a9acfd5b 100644 --- a/css/index.css +++ b/css/index.css @@ -1 +1 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}#article-container .flink .flink-item-desc,#article-container .flink .flink-item-name,#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span,#nav #blog-info,#pagination .next_info,#pagination .prev_info,#sidebar #sidebar-menus .menus_items .site-page,.limit-one-line,.site-data>a .headline{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}#article-container figure.gallery-group .gallery-group-name,#article-container figure.gallery-group p,#aside-content .aside-list>.aside-list-item .content>.comment,#aside-content .aside-list>.aside-list-item .content>.name,#aside-content .aside-list>.aside-list-item .content>.title,#post-info .post-title,#recent-posts>.recent-post-item>.recent-post-info>.article-title,#recent-posts>.recent-post-item>.recent-post-info>.content,.article-sort-item-title,.limit-more-line,.relatedPosts>.relatedPosts-list .content .title{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}#article-container.post-content h1:before,#article-container.post-content h2:before,#article-container.post-content h3:before,#article-container.post-content h4:before,#article-container.post-content h5:before,#article-container.post-content h6:before,#article-container.post-content hr:before,#post .post-copyright:before,#post .post-outdate-notice:before,.custom-hr:before,.fontawesomeIcon,.note:not(.no-icon)::before,.search-dialog hr:before{display:inline-block;font-weight:600;font-family:'Font Awesome 6 Free';text-rendering:auto;-webkit-font-smoothing:antialiased}#aside-content .card-widget,#recent-posts>.recent-post-item,.cardHover,.layout>.recent-posts .pagination>:not(.space),.layout>div:first-child:not(.recent-posts){border-radius:8px;background:var(--card-bg);-webkit-box-shadow:var(--card-box-shadow);box-shadow:var(--card-box-shadow);-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#aside-content .card-widget:hover,#recent-posts>.recent-post-item:hover,.cardHover:hover,.layout>.recent-posts .pagination>:not(.space):hover,.layout>div:first-child:not(.recent-posts):hover{-webkit-box-shadow:var(--card-hover-box-shadow);box-shadow:var(--card-hover-box-shadow)}#aside-content .aside-list>.aside-list-item .thumbnail :first-child,#recent-posts>.recent-post-item .post_cover .post-bg,.article-sort-item-img :first-child,.imgHover{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .6s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .6s;-o-transition:filter 375ms ease-in .2s,-o-transform .6s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .6s;transition:filter 375ms ease-in .2s,transform .6s;object-fit:cover}#aside-content .aside-list>.aside-list-item .thumbnail :first-child:hover,#recent-posts>.recent-post-item .post_cover .post-bg:hover,.article-sort-item-img :first-child:hover,.imgHover:hover{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#pagination .next-post:hover .cover,#pagination .prev-post:hover .cover,.postImgHover:hover .cover,.relatedPosts>.relatedPosts-list>div:hover .cover{opacity:.8;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#pagination .next-post .cover,#pagination .prev-post .cover,.postImgHover .cover,.relatedPosts>.relatedPosts-list>div .cover{position:absolute;width:100%;height:100%;opacity:.4;-webkit-transition:all .6s,filter 375ms ease-in .2s;-moz-transition:all .6s,filter 375ms ease-in .2s;-o-transition:all .6s,filter 375ms ease-in .2s;-ms-transition:all .6s,filter 375ms ease-in .2s;transition:all .6s,filter 375ms ease-in .2s;object-fit:cover}.category-lists ul,.list-beauty{list-style:none}.category-lists ul li,.list-beauty li{position:relative;padding:.12em .4em .12em 1.4em}.category-lists ul li:hover:before,.list-beauty li:hover:before{border-color:var(--pseudo-hover)}.category-lists ul li:before,.list-beauty li:before{position:absolute;top:.67em;left:0;width:.43em;height:.43em;border:.215em solid #49b1f5;border-radius:.43em;background:0 0;content:'';cursor:pointer;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#article-container.post-content hr,.custom-hr,.search-dialog hr{position:relative;margin:40px auto;border:2px dashed var(--hr-border);width:calc(100% - 4px)}#article-container.post-content hr:hover:before,.custom-hr:hover:before,.search-dialog hr:hover:before{left:calc(95% - 20px)}#article-container.post-content hr:before,.custom-hr:before,.search-dialog hr:before{position:absolute;top:-10px;left:5%;z-index:1;color:var(--hr-before-color);content:'\f0c4';font-size:20px;line-height:1;-webkit-transition:all 1s ease-in-out;-moz-transition:all 1s ease-in-out;-o-transition:all 1s ease-in-out;-ms-transition:all 1s ease-in-out;transition:all 1s ease-in-out}#content-inner,#footer{-webkit-animation:bottom-top 1s;-moz-animation:bottom-top 1s;-o-animation:bottom-top 1s;-ms-animation:bottom-top 1s;animation:bottom-top 1s}#page-header:not(.full_page){-webkit-animation:header-effect 1s;-moz-animation:header-effect 1s;-o-animation:header-effect 1s;-ms-animation:header-effect 1s;animation:header-effect 1s}#site-subtitle,#site-title{-webkit-animation:titleScale 1s;-moz-animation:titleScale 1s;-o-animation:titleScale 1s;-ms-animation:titleScale 1s;animation:titleScale 1s}#nav.show{-webkit-animation:headerNoOpacity 1s;-moz-animation:headerNoOpacity 1s;-o-animation:headerNoOpacity 1s;-ms-animation:headerNoOpacity 1s;animation:headerNoOpacity 1s}#web_bg,canvas:not(#ribbon-canvas){-webkit-animation:to_show 4s;-moz-animation:to_show 4s;-o-animation:to_show 4s;-ms-animation:to_show 4s;animation:to_show 4s}#ribbon-canvas{-webkit-animation:ribbon_to_show 4s;-moz-animation:ribbon_to_show 4s;-o-animation:ribbon_to_show 4s;-ms-animation:ribbon_to_show 4s;animation:ribbon_to_show 4s}#sidebar-menus.open>:nth-child(1){-webkit-animation:sidebarItem .2s;-moz-animation:sidebarItem .2s;-o-animation:sidebarItem .2s;-ms-animation:sidebarItem .2s;animation:sidebarItem .2s}#sidebar-menus.open>:nth-child(2){-webkit-animation:sidebarItem .4s;-moz-animation:sidebarItem .4s;-o-animation:sidebarItem .4s;-ms-animation:sidebarItem .4s;animation:sidebarItem .4s}#sidebar-menus.open>:nth-child(3){-webkit-animation:sidebarItem .6s;-moz-animation:sidebarItem .6s;-o-animation:sidebarItem .6s;-ms-animation:sidebarItem .6s;animation:sidebarItem .6s}#sidebar-menus.open>:nth-child(4){-webkit-animation:sidebarItem .8s;-moz-animation:sidebarItem .8s;-o-animation:sidebarItem .8s;-ms-animation:sidebarItem .8s;animation:sidebarItem .8s}.scroll-down-effects{-webkit-animation:scroll-down-effect 1.5s infinite;-moz-animation:scroll-down-effect 1.5s infinite;-o-animation:scroll-down-effect 1.5s infinite;-ms-animation:scroll-down-effect 1.5s infinite;animation:scroll-down-effect 1.5s infinite}.reward-main{-webkit-animation:donate_effcet .3s .1s ease both;-moz-animation:donate_effcet .3s .1s ease both;-o-animation:donate_effcet .3s .1s ease both;-ms-animation:donate_effcet .3s .1s ease both;animation:donate_effcet .3s .1s ease both}@-moz-keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@-o-keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@-moz-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-o-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-webkit-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-o-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-moz-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-webkit-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-o-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-moz-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-webkit-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-o-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-moz-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-webkit-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-o-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-moz-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-o-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}:root{--global-font-size:14px;--global-bg:#fff;--font-color:#4c4948;--hr-border:#a4d8fa;--hr-before-color:#80c8f8;--search-bg:#f6f8fa;--search-input-color:#4c4948;--search-a-color:#4c4948;--preloader-bg:#37474f;--preloader-color:#fff;--tab-border-color:#f0f0f0;--tab-botton-bg:#f0f0f0;--tab-botton-color:#1f2d3d;--tab-button-hover-bg:#dcdcdc;--tab-button-active-bg:#fff;--card-bg:#fff;--sidebar-bg:#f6f8fa;--btn-hover-color:#ff7242;--btn-color:#fff;--btn-bg:#49b1f5;--text-bg-hover:rgba(73,177,245,0.7);--light-grey:#eee;--dark-grey:#cacaca;--white:#fff;--text-highlight-color:#1f2d3d;--blockquote-color:#6a737d;--blockquote-bg:rgba(73,177,245,0.1);--reward-pop:#f5f5f5;--toc-link-color:#666261;--card-box-shadow:0 3px 8px 6px rgba(7,17,27,0.05);--card-hover-box-shadow:0 3px 8px 6px rgba(7,17,27,0.09);--pseudo-hover:#ff7242;--headline-presudo:#a0a0a0;--scrollbar-color:#49b1f5;--default-bg-color:#49b1f5;--zoom-bg:#fff;--mark-bg:rgba(0,0,0,0.3)}body{position:relative;min-height:100%;background:var(--global-bg);color:var(--font-color);font-size:var(--global-font-size);font-family:ZQKJYT;line-height:2;-webkit-tap-highlight-color:transparent}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb{background:var(--scrollbar-color)}::-webkit-scrollbar-track{background-color:transparent}*{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color) transparent}input::placeholder{color:var(--font-color)}#web_bg{position:fixed;z-index:-999;width:100%;height:100%;background:#f7f9fe;background-attachment:local;background-position:center;background-size:cover;background-repeat:no-repeat}h1,h2,h3,h4,h5,h6{position:relative;margin:20px 0 14px;color:var(--text-highlight-color);font-weight:700}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{font-size:inherit!important}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.table-wrap{overflow-x:scroll;margin:0 0 20px}table{display:table;width:100%;border-spacing:0;border-collapse:collapse;empty-cells:show}table thead{background:rgba(153,169,191,.1)}table td,table th{padding:6px 12px;border:1px solid var(--light-grey);vertical-align:middle}::selection{background:#00c4b6;color:#f7f7f7}button{padding:0;outline:0;border:none;background:0 0;cursor:pointer;touch-action:manipulation}a{color:#99a9bf;text-decoration:none;word-wrap:break-word;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;-ms-transition:all .2s;transition:all .2s;overflow-wrap:break-word}a:hover{color:#49b1f5}#aside-content .author-info__description,#aside-content .author-info__name,#site-subtitle,#site-title,.site-name{font-family:ZQKJYT}.is-center{text-align:center}.pull-left{float:left}.pull-right{float:right}img:not([src]),img[src='']{opacity:0}.img-alt{margin:-10px 0 10px;color:#858585}.img-alt:hover{text-decoration:none!important}blockquote{margin:0 0 20px;padding:12px 15px;border-left:3px solid #49b1f5;background-color:var(--blockquote-bg);color:var(--blockquote-color)}blockquote footer cite:before{padding:0 5px;content:'—'}blockquote>:last-child{margin-bottom:0!important}:root{--hl-color:#90a4ae;--hl-bg:#f6f8fa;--hltools-bg:#e6ebf1;--hltools-color:#90a4ae;--hlnumber-bg:#f6f8fa;--hlnumber-color:rgba(144,164,174,0.5);--hlscrollbar-bg:#dce4eb;--hlexpand-bg:linear-gradient(180deg, rgba(246,248,250,0.6), rgba(246,248,250,0.9))}[data-theme=dark]{--hl-color:rgba(255,255,255,0.7);--hl-bg:#171717;--hltools-bg:#1a1a1a;--hltools-color:#90a4ae;--hlnumber-bg:#171717;--hlnumber-color:rgba(255,255,255,0.4);--hlscrollbar-bg:#1f1f1f;--hlexpand-bg:linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9))}figure.highlight table{scrollbar-color:var(--hlscrollbar-bg) transparent}figure.highlight table::-webkit-scrollbar-thumb{background:var(--hlscrollbar-bg)}figure.highlight pre .deletion{color:#bf42bf}figure.highlight pre .addition{color:#105ede}figure.highlight pre .meta{color:#7c4dff}figure.highlight pre .comment{color:rgba(149,165,166,.8)}figure.highlight pre .attribute,figure.highlight pre .css .class,figure.highlight pre .css .id,figure.highlight pre .css .pseudo,figure.highlight pre .html .doctype,figure.highlight pre .regexp,figure.highlight pre .ruby .constant,figure.highlight pre .tag .name,figure.highlight pre .variable,figure.highlight pre .xml .doctype,figure.highlight pre .xml .pi,figure.highlight pre .xml .tag .title{color:#e53935}figure.highlight pre .tag{color:#39adb5}figure.highlight pre .command,figure.highlight pre .constant,figure.highlight pre .literal,figure.highlight pre .number,figure.highlight pre .params,figure.highlight pre .preprocessor{color:#f76d47}figure.highlight pre .built_in{color:#ffb62c}figure.highlight pre .css .rules .attribute,figure.highlight pre .formula,figure.highlight pre .header,figure.highlight pre .inheritance,figure.highlight pre .number,figure.highlight pre .ruby .class .title,figure.highlight pre .ruby .symbol,figure.highlight pre .special,figure.highlight pre .string,figure.highlight pre .value,figure.highlight pre .xml .cdata{color:#91b859}figure.highlight pre .css .hexcolor,figure.highlight pre .keyword,figure.highlight pre .title{color:#39adb5}figure.highlight pre .coffeescript .title,figure.highlight pre .function,figure.highlight pre .javascript .title,figure.highlight pre .perl .sub,figure.highlight pre .python .decorator,figure.highlight pre .python .title,figure.highlight pre .ruby .function .title,figure.highlight pre .ruby .title .keyword{color:#6182b8}figure.highlight pre .javascript .function,figure.highlight pre .tag .attr{color:#7c4dff}#article-container figure.highlight .line.marked{background-color:rgba(128,203,196,.251)}#article-container figure.highlight table{display:block;overflow:auto;border:none}#article-container figure.highlight table td{padding:0;border:none}#article-container figure.highlight .gutter pre{padding-right:10px;padding-left:10px;background-color:var(--hlnumber-bg);color:var(--hlnumber-color);text-align:right}#article-container figure.highlight .code pre{padding-right:10px;padding-left:10px;width:100%}#article-container figure.highlight,#article-container pre{overflow:auto;margin:0 0 20px;padding:0;background:var(--hl-bg);color:var(--hl-color);line-height:1.6}#article-container code,#article-container pre{font-size:var(--global-font-size);font-family:TXAQTJ!important}#article-container code{padding:2px 4px;background:rgba(27,31,35,.05);color:#f47466}#article-container pre{padding:10px 20px}#article-container pre code{padding:0;background:0 0;color:var(--hl-color);text-shadow:none}#article-container figure.highlight{position:relative}#article-container figure.highlight pre{margin:0;padding:8px 0;border:none}#article-container figure.highlight .caption,#article-container figure.highlight figcaption{padding:6px 0 2px 14px;font-size:var(--global-font-size);line-height:1em}#article-container figure.highlight .caption a,#article-container figure.highlight figcaption a{float:right;padding-right:10px;color:var(--hl-color)}#article-container figure.highlight .caption a:hover,#article-container figure.highlight figcaption a:hover{border-bottom-color:var(--hl-color)}#article-container figure.highlight.copy-true{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;-webkit-user-select:all}#article-container figure.highlight.copy-true>pre,#article-container figure.highlight.copy-true>table{display:block!important;opacity:0}#article-container .highlight-tools{position:relative;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;overflow:hidden;min-height:24px;height:2.15em;background:var(--hltools-bg);color:var(--hltools-color);font-size:var(--global-font-size)}#article-container .highlight-tools.closed~*{display:none}#article-container .highlight-tools.closed .expand{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:rotate(-90deg)!important;-moz-transform:rotate(-90deg)!important;-o-transform:rotate(-90deg)!important;-ms-transform:rotate(-90deg)!important;transform:rotate(-90deg)!important}#article-container .highlight-tools .expand{position:absolute;padding:.57em .7em;cursor:pointer;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#article-container .highlight-tools .expand+.code-lang{left:1.7em}#article-container .highlight-tools .code-lang{position:absolute;left:14px;text-transform:uppercase;font-weight:700;font-size:1.15em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}#article-container .highlight-tools .copy-notice{position:absolute;right:2.4em;opacity:0;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s;transition:opacity .4s}#article-container .highlight-tools .copy-button{position:absolute;right:14px;cursor:pointer;-webkit-transition:color .2s;-moz-transition:color .2s;-o-transition:color .2s;-ms-transition:color .2s;transition:color .2s}#article-container .highlight-tools .copy-button:hover{color:#49b1f5}#article-container .gutter{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}#article-container .gist table{width:auto}#article-container .gist table td{border:none}#article-container figure.highlight{margin:0 0 24px;border-radius:7px;-webkit-box-shadow:0 5px 10px 0 rgba(144,164,174,.4);box-shadow:0 5px 10px 0 rgba(144,164,174,.4);-webkit-transform:translateZ(0)}#article-container figure.highlight .highlight-tools:after{position:absolute;left:14px;width:12px;height:12px;border-radius:50%;background:#fc625d;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;content:' '}#article-container figure.highlight .highlight-tools .expand{right:0}#article-container figure.highlight .highlight-tools .expand.closed{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:rotate(90deg)!important;-moz-transform:rotate(90deg)!important;-o-transform:rotate(90deg)!important;-ms-transform:rotate(90deg)!important;transform:rotate(90deg)!important}#article-container figure.highlight .highlight-tools .expand~.copy-notice{right:3.45em}#article-container figure.highlight .highlight-tools .expand~.copy-button{right:2.1em}#article-container figure.highlight .highlight-tools .code-lang{left:75px}#article-container .code-expand-btn{position:absolute;bottom:0;z-index:10;width:100%;background:var(--hlexpand-bg);text-align:center;font-size:var(--global-font-size);cursor:pointer}#article-container .code-expand-btn i{padding:6px 0;color:var(--hlnumber-color);-webkit-animation:code-expand-key 1.2s infinite;-moz-animation:code-expand-key 1.2s infinite;-o-animation:code-expand-key 1.2s infinite;-ms-animation:code-expand-key 1.2s infinite;animation:code-expand-key 1.2s infinite}#article-container .code-expand-btn.expand-done>i{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#article-container .code-expand-btn.expand-done+pre,#article-container .code-expand-btn.expand-done+table{margin-bottom:1.8em}#article-container .code-expand-btn:not(.expand-done)~pre,#article-container .code-expand-btn:not(.expand-done)~table{overflow:hidden;height:600px}@-moz-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@-webkit-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@-o-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}.article-sort{margin-left:10px;padding-left:20px;border-left:2px solid #aadafa}.article-sort-title{position:relative;margin-left:10px;padding-bottom:20px;padding-left:20px;font-size:1.72em}.article-sort-title:hover:before{border-color:var(--pseudo-hover)}.article-sort-title:before{position:absolute;top:calc(((100% - 36px)/ 2));left:-9px;z-index:1;width:10px;height:10px;border:5px solid #49b1f5;border-radius:10px;background:var(--card-bg);content:'';line-height:10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-title:after{position:absolute;bottom:0;left:0;z-index:0;width:2px;height:1.5em;background:#aadafa;content:''}.article-sort-item{position:relative;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;margin:0 0 20px 10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-item:hover:before{border-color:var(--pseudo-hover)}.article-sort-item:before{position:absolute;left:calc(-20px - 17px);width:6px;height:6px;border:3px solid #49b1f5;border-radius:6px;background:var(--card-bg);content:'';-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-item.no-article-cover{height:80px}.article-sort-item.no-article-cover .article-sort-item-info{padding:0}.article-sort-item.year{font-size:1.43em}.article-sort-item.year:hover:before{border-color:#49b1f5}.article-sort-item.year:before{border-color:var(--pseudo-hover)}.article-sort-item-time{color:#858585;font-size:95%}.article-sort-item-time time{padding-left:6px;cursor:default}.article-sort-item-title{color:var(--font-color);font-size:1.1em;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-line-clamp:2}.article-sort-item-title:hover{color:#49b1f5;-webkit-transform:translateX(10px);-moz-transform:translateX(10px);-o-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}.article-sort-item-img{overflow:hidden;width:80px;height:80px}.article-sort-item-info{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 16px}.category-lists .category-title{font-size:2.57em}@media screen and (max-width:768px){.category-lists .category-title{font-size:2em}}.category-lists .category-list{margin-bottom:0}.category-lists .category-list a{color:var(--font-color)}.category-lists .category-list a:hover{color:#49b1f5}.category-lists .category-list .category-list-count{margin-left:8px;color:#858585}.category-lists .category-list .category-list-count:before{content:'('}.category-lists .category-list .category-list-count:after{content:')'}.category-lists ul{padding:0 0 0 20px}.category-lists ul ul{padding-left:4px}.category-lists ul li{position:relative;margin:6px 0;padding:.12em .4em .12em 1.4em}#body-wrap{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100vh}.layout{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;margin:0 auto;padding:40px 15px;max-width:1200px;width:100%}@media screen and (max-width:900px){.layout{-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:768px){.layout{padding:20px 5px}}@media screen and (min-width:2000px){.layout{max-width:70%}}.layout>div:first-child:not(.recent-posts){-webkit-align-self:flex-start;align-self:flex-start;-ms-flex-item-align:start;padding:50px 40px}@media screen and (max-width:768px){.layout>div:first-child:not(.recent-posts){padding:36px 14px}}.layout>div:first-child{width:74%;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}@media screen and (max-width:900px){.layout>div:first-child{width:100%!important}}.layout.hide-aside{max-width:1000px}@media screen and (min-width:2000px){.layout.hide-aside{max-width:1300px}}.layout.hide-aside>div{width:100%!important}.apple #page-header.full_page{background-attachment:scroll!important}.apple .avatar-img,.apple .flink-item-icon,.apple .recent-post-item{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-o-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}#article-container .flink{margin-bottom:20px}#article-container .flink .flink-list{overflow:auto;padding:10px 10px 0;text-align:center}#article-container .flink .flink-list>.flink-list-item{position:relative;float:left;overflow:hidden;margin:15px 7px;width:calc(100% / 3 - 15px);height:90px;border-radius:8px;line-height:17px;-webkit-transform:translateZ(0)}@media screen and (max-width:1024px){#article-container .flink .flink-list>.flink-list-item{width:calc(50% - 15px)!important}}@media screen and (max-width:600px){#article-container .flink .flink-list>.flink-list-item{width:calc(100% - 15px)!important}}#article-container .flink .flink-list>.flink-list-item:hover .flink-item-icon{margin-left:-10px;width:0}#article-container .flink .flink-list>.flink-list-item:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:var(--text-bg-hover);content:'';-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;-ms-transition:-ms-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}#article-container .flink .flink-list>.flink-list-item:active:before,#article-container .flink .flink-list>.flink-list-item:focus:before,#article-container .flink .flink-list>.flink-list-item:hover:before{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}#article-container .flink .flink-list>.flink-list-item a{color:var(--font-color);text-decoration:none}#article-container .flink .flink-list>.flink-list-item a .flink-item-icon{float:left;overflow:hidden;margin:15px 10px;width:60px;height:60px;border-radius:35px;-webkit-transition:width .3s ease-out;-moz-transition:width .3s ease-out;-o-transition:width .3s ease-out;-ms-transition:width .3s ease-out;transition:width .3s ease-out}#article-container .flink .flink-list>.flink-list-item a .flink-item-icon img{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .3s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .3s;-o-transition:filter 375ms ease-in .2s,-o-transform .3s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .3s;transition:filter 375ms ease-in .2s,transform .3s;object-fit:cover}#article-container .flink .flink-list>.flink-list-item a .img-alt{display:none}#article-container .flink .flink-item-name{padding:16px 10px 0 0;height:40px;font-weight:700;font-size:1.43em}#article-container .flink .flink-item-desc{padding:16px 10px 16px 0;height:50px;font-size:.93em}#article-container .flink .flink-name{margin-bottom:5px;font-weight:700;font-size:1.5em}#recent-posts>.recent-post-item:not(:first-child){margin-top:20px}#recent-posts>.recent-post-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-o-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;overflow:hidden;height:16.8em}@media screen and (max-width:768px){#recent-posts>.recent-post-item{-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:auto}}#recent-posts>.recent-post-item:hover img.post-bg{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#recent-posts>.recent-post-item.ads-wrap{display:block!important;height:auto!important}#recent-posts>.recent-post-item .post_cover{overflow:hidden;width:42%;height:100%}@media screen and (max-width:768px){#recent-posts>.recent-post-item .post_cover{width:100%;height:230px}}#recent-posts>.recent-post-item .post_cover.right{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-o-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1}@media screen and (max-width:768px){#recent-posts>.recent-post-item .post_cover.right{-webkit-box-ordinal-group:0;-moz-box-ordinal-group:0;-o-box-ordinal-group:0;-ms-flex-order:0;-webkit-order:0;order:0}}#recent-posts>.recent-post-item>.recent-post-info{padding:0 40px;width:58%}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info{padding:20px 20px 30px;width:100%}}#recent-posts>.recent-post-item>.recent-post-info.no-cover{width:100%}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info.no-cover{padding:30px 20px}}#recent-posts>.recent-post-item>.recent-post-info>.article-title{color:var(--text-highlight-color);font-size:1.55em;line-height:1.4;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-line-clamp:2}#recent-posts>.recent-post-item>.recent-post-info>.article-title .sticky{margin-right:10px;color:#ff7242;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info>.article-title{font-size:1.43em}}#recent-posts>.recent-post-item>.recent-post-info>.article-title:hover{color:#49b1f5}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap{margin:6px 0;color:#858585;font-size:.9em}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap>.post-meta-date{cursor:default}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap i{margin:0 4px 0 0}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .fa-spinner{margin:0}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-label{padding-right:4px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-separator{margin:0 6px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-link{margin:0 4px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a{color:#858585}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a:hover{color:#49b1f5;text-decoration:underline}#recent-posts>.recent-post-item>.recent-post-info>.content{-webkit-line-clamp:2}.tag-cloud-list a{display:inline-block;padding:0 8px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}.tag-cloud-list a:hover{color:#49b1f5!important;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}@media screen and (max-width:768px){.tag-cloud-list a{zoom:.85}}.tag-cloud-title{font-size:2.57em}@media screen and (max-width:768px){.tag-cloud-title{font-size:2em}}h1.page-title+.tag-cloud-list{text-align:left}#aside-content{width:26%}@media screen and (min-width:900px){#aside-content{padding-left:15px}}@media screen and (max-width:900px){#aside-content{width:100%}}#aside-content>.card-widget:first-child{margin-top:0}@media screen and (max-width:900px){#aside-content>.card-widget:first-child{margin-top:20px}}#aside-content .card-widget{position:relative;overflow:hidden;margin-top:20px;padding:20px 24px}#aside-content .card-info .author-info__name{font-weight:500;font-size:1.57em}#aside-content .card-info .author-info__description{margin-top:-.42em}#aside-content .card-info .card-info-data{margin:14px 0 4px}#aside-content .card-info .card-info-social-icons{margin:6px 0 -6px}#aside-content .card-info .card-info-social-icons .social-icon{margin:0 10px;color:var(--font-color);font-size:1.4em}#aside-content .card-info .card-info-social-icons i{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#aside-content .card-info .card-info-social-icons i:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}#aside-content .card-info #card-info-btn{display:block;margin-top:14px;background-color:var(--btn-bg);color:var(--btn-color);text-align:center;line-height:2.4}#aside-content .card-info #card-info-btn:hover{background-color:var(--btn-hover-color)}#aside-content .card-info #card-info-btn span{padding-left:10px}#aside-content .item-headline{padding-bottom:6px;font-size:1.2em}#aside-content .item-headline span{margin-left:6px}@media screen and (min-width:900px){#aside-content .sticky_layout{position:sticky;position:-webkit-sticky;top:20px;-webkit-transition:top .3s;-moz-transition:top .3s;-o-transition:top .3s;-ms-transition:top .3s;transition:top .3s}}#aside-content .card-tag-cloud a{display:inline-block;padding:0 4px}#aside-content .card-tag-cloud a:hover{color:#49b1f5!important}#aside-content .aside-list>span{display:block;margin-bottom:10px;text-align:center}#aside-content .aside-list>.aside-list-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:6px 0}#aside-content .aside-list>.aside-list-item:first-child{padding-top:0}#aside-content .aside-list>.aside-list-item:not(:last-child){border-bottom:1px dashed #f5f5f5}#aside-content .aside-list>.aside-list-item:last-child{padding-bottom:0}#aside-content .aside-list>.aside-list-item .thumbnail{overflow:hidden;width:4.2em;height:4.2em}#aside-content .aside-list>.aside-list-item .content{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:10px;word-break:break-all}#aside-content .aside-list>.aside-list-item .content>.name{-webkit-line-clamp:1}#aside-content .aside-list>.aside-list-item .content>.name,#aside-content .aside-list>.aside-list-item .content>time{display:block;color:#858585;font-size:85%}#aside-content .aside-list>.aside-list-item .content>.comment,#aside-content .aside-list>.aside-list-item .content>.title{color:var(--font-color);font-size:95%;line-height:1.5;-webkit-line-clamp:2}#aside-content .aside-list>.aside-list-item .content>.comment:hover,#aside-content .aside-list>.aside-list-item .content>.title:hover{color:#49b1f5}#aside-content .aside-list>.aside-list-item.no-cover{min-height:4.4em}#aside-content .card-archives ul.card-archive-list,#aside-content .card-categories ul.card-category-list{margin:0;padding:0;list-style:none}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a,#aside-content .card-categories ul.card-category-list>.card-category-list-item a{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-o-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:3px 10px;color:var(--font-color);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;-ms-transition:all .4s;transition:all .4s}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{padding:3px 17px;background-color:var(--text-bg-hover)}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:first-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:first-child{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#aside-content .card-categories .card-category-list.child{padding:0 0 0 16px}#aside-content .card-categories .card-category-list>.parent>a.expand i{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}#aside-content .card-categories .card-category-list>.parent>a.expand+.child{display:block}#aside-content .card-categories .card-category-list>.parent>a .card-category-list-name{width:70%!important}#aside-content .card-categories .card-category-list>.parent>a .card-category-list-count{width:calc(100% - 70% - 20px);text-align:right}#aside-content .card-categories .card-category-list>.parent>a i{float:right;margin-right:-.5em;padding:.5em;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}#aside-content .card-webinfo .webinfo .webinfo-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:2px 10px 0}#aside-content .card-webinfo .webinfo .webinfo-item div:first-child{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding-right:20px}@media screen and (min-width:901px){#aside-content #card-toc{right:0!important}}@media screen and (max-width:900px){#aside-content #card-toc{position:fixed;right:55px;bottom:30px;z-index:100;max-width:380px;max-height:calc(100% - 60px);width:calc(100% - 80px);-webkit-transition:none;-moz-transition:none;-o-transition:none;-ms-transition:none;transition:none;-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-o-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}#aside-content #card-toc.open{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}#aside-content #card-toc .toc-percentage{float:right;margin-top:-9px;color:#a9a9a9;font-style:italic;font-size:140%}#aside-content #card-toc .toc-content{overflow-y:scroll;overflow-y:overlay;margin:0 -24px;max-height:calc(100vh - 120px);width:calc(100% + 48px)}@media screen and (max-width:900px){#aside-content #card-toc .toc-content{max-height:calc(100vh - 140px)}}#aside-content #card-toc .toc-content>*{margin:0 20px!important}#aside-content #card-toc .toc-content>*>.toc-item>.toc-child{margin-left:10px;padding-left:10px;border-left:1px solid var(--dark-grey)}#aside-content #card-toc .toc-content:not(.is-expand) .toc-child{display:none}@media screen and (max-width:900px){#aside-content #card-toc .toc-content:not(.is-expand) .toc-child{display:block!important}}#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child{display:block}#aside-content #card-toc .toc-content li,#aside-content #card-toc .toc-content ol{list-style:none}#aside-content #card-toc .toc-content>ol{padding:0!important}#aside-content #card-toc .toc-content ol{margin:0;padding-left:18px}#aside-content #card-toc .toc-content .toc-link{display:block;margin:4px 0;padding:1px 6px;color:var(--toc-link-color);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#aside-content #card-toc .toc-content .toc-link:hover{color:#49b1f5}#aside-content #card-toc .toc-content .toc-link.active{background:#00c4b6;color:#fff}#aside-content .sticky_layout:only-child>:first-child{margin-top:0}#aside-content .card-more-btn{float:right;color:inherit}#aside-content .card-more-btn:hover{-webkit-animation:more-btn-move 1s infinite;-moz-animation:more-btn-move 1s infinite;-o-animation:more-btn-move 1s infinite;-ms-animation:more-btn-move 1s infinite;animation:more-btn-move 1s infinite}#aside-content .card-announcement .item-headline i{color:red}.avatar-img{overflow:hidden;margin:0 auto;width:110px;height:110px;border-radius:70px}.avatar-img img{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .3s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .3s;-o-transition:filter 375ms ease-in .2s,-o-transform .3s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .3s;transition:filter 375ms ease-in .2s,transform .3s;object-fit:cover}.avatar-img img:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}.site-data{display:table;width:100%;table-layout:fixed}.site-data>a{display:table-cell}.site-data>a div{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}.site-data>a:hover div{color:#49b1f5!important}.site-data>a .headline{color:var(--font-color)}.site-data>a .length-num{margin-top:-.32em;color:var(--text-highlight-color);font-size:1.4em}@media screen and (min-width:900px){html.hide-aside .layout{-webkit-box-pack:center;-moz-box-pack:center;-o-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}html.hide-aside .layout>.aside-content{display:none}html.hide-aside .layout>div:first-child{width:80%}}.page .sticky_layout{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@-moz-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-webkit-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-o-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-moz-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-o-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-webkit-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-o-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}#post-comment .comment-head{margin-bottom:20px}#post-comment .comment-head:after{display:block;clear:both;content:''}#post-comment .comment-head .comment-headline{display:inline-block;vertical-align:middle;font-weight:700;font-size:1.43em}#post-comment .comment-head .comment-switch{display:inline-block;float:right;margin:2px auto 0;padding:4px 16px;width:max-content;border-radius:8px;background:#f6f8fa}#post-comment .comment-head .comment-switch .first-comment{color:#49b1f5}#post-comment .comment-head .comment-switch .second-comment{color:#ff7242}#post-comment .comment-head .comment-switch #switch-btn{position:relative;display:inline-block;margin:-4px 8px 0;width:42px;height:22px;border-radius:34px;background-color:#49b1f5;vertical-align:middle;cursor:pointer;-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;-ms-transition:.4s;transition:.4s}#post-comment .comment-head .comment-switch #switch-btn:before{position:absolute;bottom:4px;left:4px;width:14px;height:14px;border-radius:50%;background-color:#fff;content:'';-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;-ms-transition:.4s;transition:.4s}#post-comment .comment-wrap>div{-webkit-animation:tabshow .5s;-moz-animation:tabshow .5s;-o-animation:tabshow .5s;-ms-animation:tabshow .5s;animation:tabshow .5s}#post-comment .comment-wrap>div:nth-child(2){display:none}#post-comment.move #switch-btn{background-color:#ff7242}#post-comment.move #switch-btn:before{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-o-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}#post-comment.move .comment-wrap>div:first-child{display:none}#post-comment.move .comment-wrap>div:last-child{display:block}#footer{position:relative;background-color:#49b1f5;background-attachment:scroll;background-position:bottom;background-size:cover}#footer-wrap{position:relative;padding:40px 20px;color:var(--light-grey);text-align:center}#footer-wrap a{color:var(--light-grey)}#footer-wrap a:hover{text-decoration:underline}#footer-wrap .footer-separator{margin:0 4px}#footer-wrap .icp-icon{padding:0 4px;max-height:1.4em;width:auto;vertical-align:text-bottom}#page-header{position:relative;width:100%;background-color:#49b1f5;background-position:center center;background-size:cover;background-repeat:no-repeat;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header:not(.not-top-img):before{position:absolute;width:100%;height:100%;background-color:var(--mark-bg);content:''}#page-header.full_page{height:100vh;background-attachment:fixed}#page-header.full_page #site-info{position:absolute;top:43%;padding:0 10px;width:100%}#page-header #scroll-down .scroll-down-effects,#page-header #site-subtitle,#page-header #site-title{text-align:center;text-shadow:2px 2px 4px rgba(0,0,0,.15);line-height:1.5}#page-header #site-title{margin:0;color:var(--white);font-size:1.85em}@media screen and (min-width:768px){#page-header #site-title{font-size:2.85em}}#page-header #site-subtitle{color:var(--light-grey);font-size:1.15em}@media screen and (min-width:768px){#page-header #site-subtitle{font-size:1.72em}}#page-header #site_social_icons{display:none;margin:0 auto;text-align:center}@media screen and (max-width:768px){#page-header #site_social_icons{display:block}}#page-header #site_social_icons .social-icon{margin:0 10px;color:var(--light-grey);text-shadow:2px 2px 4px rgba(0,0,0,.15);font-size:1.43em}#page-header #scroll-down{position:absolute;bottom:10px;width:100%;cursor:pointer}#page-header #scroll-down .scroll-down-effects{position:relative;width:100%;color:var(--light-grey);font-size:20px}#page-header.not-home-page{height:400px}@media screen and (max-width:768px){#page-header.not-home-page{height:280px}}#page-header #page-site-info{position:absolute;top:200px;padding:0 10px;width:100%}@media screen and (max-width:768px){#page-header #page-site-info{top:140px}}#page-header.post-bg{height:400px}@media screen and (max-width:768px){#page-header.post-bg{height:360px}}#page-header #post-info{position:absolute;bottom:100px;padding:0 8%;width:100%;text-align:center}@media screen and (max-width:900px){#page-header #post-info{bottom:30px;text-align:left}}@media screen and (max-width:768px){#page-header #post-info{bottom:22px;padding:0 22px}}#page-header.not-top-img{margin-bottom:10px;height:60px;background:0}#page-header.not-top-img #nav{background:rgba(255,255,255,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}#page-header.not-top-img #nav .site-name,#page-header.not-top-img #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav{position:fixed;top:-60px;z-index:91;background:rgba(255,255,255,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6);-webkit-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:-moz-transform .2s ease-in-out,opacity .2s ease-in-out;-o-transition:-o-transform .2s ease-in-out,opacity .2s ease-in-out;-ms-transition:-ms-transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform .2s ease-in-out,opacity .2s ease-in-out}#page-header.nav-fixed #nav #blog-info{color:var(--font-color)}#page-header.nav-fixed #nav #blog-info:hover{color:#49b1f5}#page-header.nav-fixed #nav #blog-info .site-name{text-shadow:none}#page-header.nav-fixed #nav #toggle-menu,#page-header.nav-fixed #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav #toggle-menu:hover,#page-header.nav-fixed #nav a:hover{color:#49b1f5}#page-header.nav-fixed.fixed #nav{top:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header.nav-visible:not(.fixed) #nav{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}#page-header.nav-visible:not(.fixed)+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page-header.fixed #nav{position:fixed}#page-header.fixed+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page-header.fixed+.layout #card-toc .toc-content{max-height:calc(100vh - 170px)}#page h1.page-title{margin:8px 0 20px}#post>#post-info{margin-bottom:30px}#post>#post-info .post-title{padding-bottom:4px;border-bottom:1px solid var(--light-grey);color:var(--text-highlight-color)}#post>#post-info .post-title .post-edit-link{float:right}#post>#post-info #post-meta,#post>#post-info #post-meta a{color:#78818a}#post-info .post-title{margin-bottom:8px;color:var(--white);font-weight:400;font-size:2.5em;line-height:1.5;-webkit-line-clamp:3}@media screen and (max-width:768px){#post-info .post-title{font-size:2.1em}}#post-info .post-title .post-edit-link{padding-left:10px}#post-info #post-meta{color:var(--light-grey);font-size:95%}@media screen and (min-width:768px){#post-info #post-meta>.meta-secondline>span:first-child{display:none}}@media screen and (max-width:768px){#post-info #post-meta{font-size:90%}#post-info #post-meta>.meta-firstline,#post-info #post-meta>.meta-secondline{display:inline}}#post-info #post-meta .post-meta-separator{margin:0 5px}#post-info #post-meta .post-meta-icon{margin-right:4px}#post-info #post-meta .post-meta-label{margin-right:4px}#post-info #post-meta a{color:var(--light-grey);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#post-info #post-meta a:hover{color:#49b1f5;text-decoration:underline}#nav{position:absolute;top:0;z-index:90;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:0 36px;width:100%;height:60px;font-size:1.3em;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}@media screen and (max-width:768px){#nav{padding:0 16px}}#nav.show{opacity:1;-ms-filter:none;filter:none}#nav #blog-info{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;color:var(--light-grey)}#nav #blog-info .site-icon{margin-right:6px;height:36px;vertical-align:middle}#nav #toggle-menu{display:none;padding:2px 0 0 6px;vertical-align:top}#nav #toggle-menu:hover{color:var(--white)}#nav a{color:var(--light-grey)}#nav a:hover{color:var(--white)}#nav .site-name{text-shadow:2px 2px 4px rgba(0,0,0,.15);font-weight:700}#nav .menus_items{display:inline}#nav .menus_items .menus_item{position:relative;display:inline-block;padding:0 0 0 14px}#nav .menus_items .menus_item:hover .menus_item_child{display:block}#nav .menus_items .menus_item:hover>a>i:last-child{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#nav .menus_items .menus_item>a>i:last-child{padding:4px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#nav .menus_items .menus_item .menus_item_child{position:absolute;right:0;display:none;margin-top:8px;padding:0;width:max-content;border-radius:5px;background-color:var(--sidebar-bg);-webkit-box-shadow:0 5px 20px -4px rgba(0,0,0,.5);box-shadow:0 5px 20px -4px rgba(0,0,0,.5);-webkit-animation:sub_menus .3s .1s ease both;-moz-animation:sub_menus .3s .1s ease both;-o-animation:sub_menus .3s .1s ease both;-ms-animation:sub_menus .3s .1s ease both;animation:sub_menus .3s .1s ease both}#nav .menus_items .menus_item .menus_item_child:before{position:absolute;top:-8px;left:0;width:100%;height:20px;content:''}#nav .menus_items .menus_item .menus_item_child li{list-style:none}#nav .menus_items .menus_item .menus_item_child li:hover{background:var(--text-bg-hover)}#nav .menus_items .menus_item .menus_item_child li:first-child{border-top-left-radius:5px;border-top-right-radius:5px}#nav .menus_items .menus_item .menus_item_child li:last-child{border-bottom-right-radius:5px;border-bottom-left-radius:5px}#nav .menus_items .menus_item .menus_item_child li a{display:inline-block;padding:8px 16px;width:100%;color:var(--font-color)!important;text-shadow:none!important}#nav.hide-menu #toggle-menu{display:inline-block!important}#nav.hide-menu #toggle-menu .site-page{font-size:inherit}#nav.hide-menu .menus_items{display:none}#nav.hide-menu #search-button span{display:none}#nav #search-button{display:inline;padding:0 0 0 14px}#nav .site-page{position:relative;padding-bottom:6px;text-shadow:1px 1px 2px rgba(0,0,0,.3);font-size:.78em;cursor:pointer}#nav .site-page:not(.child):after{position:absolute;bottom:0;left:0;z-index:-1;width:0;height:3px;background-color:#80c8f8;content:'';-webkit-transition:all .3s ease-in-out;-moz-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;-ms-transition:all .3s ease-in-out;transition:all .3s ease-in-out}#nav .site-page:not(.child):hover:after{width:100%}#page-header{position:relative;width:100%;background-color:#49b1f5;background-position:center center;background-size:cover;background-repeat:no-repeat;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header:not(.not-top-img):before{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.3);content:''}#page-header.full_page{height:100vh;background-attachment:fixed}#page-header.full_page #site-info{position:absolute;top:43%;padding:0 10px;width:100%}#page-header #scroll-down .scroll-down-effects,#page-header #site-subtitle,#page-header #site-title{text-align:center;text-shadow:2px 2px 4px rgba(0,0,0,.15);line-height:1.5}#page-header #site-title{margin:0;color:var(--white);font-size:1.85em}@media screen and (min-width:768px){#page-header #site-title{font-size:2.85em}}#page-header #site-subtitle{color:var(--light-grey);font-size:1.15em}@media screen and (min-width:768px){#page-header #site-subtitle{font-size:1.72em}}#page-header #site_social_icons{display:none;margin:0 auto;width:300px;text-align:center}@media screen and (max-width:768px){#page-header #site_social_icons{display:block}}#page-header #site_social_icons .social-icon{margin:0 10px;color:var(--light-grey);text-shadow:2px 2px 4px rgba(0,0,0,.15);font-size:1.43em}#page-header #scroll-down{position:absolute;bottom:0;width:100%;cursor:pointer}#page-header #scroll-down .scroll-down-effects{position:relative;width:100%;color:var(--light-grey);font-size:30px}#page-header.not-home-page{height:400px}@media screen and (max-width:768px){#page-header.not-home-page{height:280px}}#page-header #page-site-info{position:absolute;top:200px;padding:0 10px;width:100%}@media screen and (max-width:768px){#page-header #page-site-info{top:140px}}#page-header.post-bg{height:400px}@media screen and (max-width:768px){#page-header.post-bg{height:360px}}#page-header.post-bg:before{background-color:rgba(0,0,0,.5)}#page-header #post-info{position:absolute;bottom:100px;padding:0 8%;width:100%;text-align:center}@media screen and (max-width:900px){#page-header #post-info{bottom:30px;text-align:left}}@media screen and (max-width:768px){#page-header #post-info{bottom:22px;padding:0 22px}}#page-header.not-top-img{margin-bottom:10px;height:60px;background:0}#page-header.not-top-img #nav{background:rgba(255,255,255,.6);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}#page-header.not-top-img #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav{position:fixed;top:-60px;z-index:91;background:rgba(255,255,255,.6);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6);-webkit-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:-moz-transform .2s ease-in-out,opacity .2s ease-in-out;-o-transition:-o-transform .2s ease-in-out,opacity .2s ease-in-out;-ms-transition:-ms-transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform .2s ease-in-out,opacity .2s ease-in-out}#page-header.nav-fixed #nav #site-name,#page-header.nav-fixed #nav #toggle-menu,#page-header.nav-fixed #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav #site-name:hover,#page-header.nav-fixed #nav #toggle-menu:hover,#page-header.nav-fixed #nav a:hover{color:#49b1f5}#page-header.nav-visible #nav{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}#page-header.nav-visible+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page h1.page-title{margin:8px 0 20px}#post>#post-info{margin-bottom:30px}#post>#post-info .post-title{padding-bottom:4px;border-bottom:1px solid var(--light-grey);color:var(--text-highlight-color)}#post>#post-info .post-title .post-edit-link{float:right}#post>#post-info #post-meta,#post>#post-info #post-meta a{color:#78818a}#post-info .post-title{margin-bottom:8px;color:var(--white);font-weight:400;font-size:2.5em;line-height:1.5;-webkit-line-clamp:3}@media screen and (max-width:768px){#post-info .post-title{font-size:2.1em}}#post-info .post-title .post-edit-link{padding-left:10px}#post-info #post-meta{color:var(--light-grey);font-size:95%}@media screen and (min-width:768px){#post-info #post-meta>.meta-secondline>span:first-child{display:none}}@media screen and (max-width:768px){#post-info #post-meta{font-size:90%}#post-info #post-meta>.meta-firstline,#post-info #post-meta>.meta-secondline{display:inline}}#post-info #post-meta .post-meta-separator{margin:0 5px}#post-info #post-meta .post-meta-icon{margin-right:4px}#post-info #post-meta .post-meta-label{margin-right:4px}#post-info #post-meta a{color:var(--light-grey);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#post-info #post-meta a:hover{color:#49b1f5;text-decoration:underline}#nav{position:absolute;top:0;z-index:90;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:0 36px;width:100%;height:60px;font-size:1.3em;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}@media screen and (max-width:768px){#nav{padding:0 16px}}#nav.show{opacity:1;-ms-filter:none;filter:none}#nav #blog_name{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#nav #toggle-menu{display:none;padding:2px 0 0 6px;vertical-align:top}#nav #toggle-menu:hover{color:var(--white)}#nav a{color:var(--light-grey)}#nav a:hover{color:var(--white)}#nav #site-name{text-shadow:2px 2px 4px rgba(0,0,0,.15);font-weight:700;cursor:pointer}#nav .menus_items{display:inline}#nav .menus_items .menus_item{position:relative;display:inline-block;padding:0 0 0 14px}#nav .menus_items .menus_item:hover .menus_item_child{display:block}#nav .menus_items .menus_item:hover>a>i:last-child{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#nav .menus_items .menus_item>a>i:last-child{padding:4px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#nav .menus_items .menus_item .menus_item_child{position:absolute;right:0;display:none;margin-top:8px;padding:0;width:max-content;background-color:var(--sidebar-bg);-webkit-box-shadow:0 5px 20px -4px rgba(0,0,0,.5);box-shadow:0 5px 20px -4px rgba(0,0,0,.5);-webkit-animation:sub_menus .3s .1s ease both;-moz-animation:sub_menus .3s .1s ease both;-o-animation:sub_menus .3s .1s ease both;-ms-animation:sub_menus .3s .1s ease both;animation:sub_menus .3s .1s ease both;border-radius:5px}#nav .menus_items .menus_item .menus_item_child:before{position:absolute;top:-8px;left:0;width:100%;height:20px;content:''}#nav.hide-menu #toggle-menu{display:inline-block!important}#nav.hide-menu #toggle-menu .site-page{font-size:inherit}#nav.hide-menu .menus_items{display:none}#nav.hide-menu #search-button span{display:none}#nav #search-button{display:inline;padding:0 0 0 14px}#nav .site-page{position:relative;padding-bottom:6px;text-shadow:1px 1px 2px rgba(0,0,0,.3);font-size:.78em;cursor:pointer}#pagination .pagination{margin-top:20px;text-align:center}#pagination .page-number.current{background:#00c4b6;color:var(--white)}#pagination .pagination-info{position:absolute;top:50%;padding:20px 40px;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}#pagination .next_info,#pagination .prev_info{color:var(--white);font-weight:500}#pagination .next-post .pagination-info{text-align:right}#pagination .pull-full{width:100%!important}#pagination .next-post .label,#pagination .prev-post .label{color:var(--light-grey);text-transform:uppercase;font-size:90%}#pagination .next-post,#pagination .prev-post{width:50%}@media screen and (max-width:768px){#pagination .next-post,#pagination .prev-post{width:100%}}#pagination .next-post a,#pagination .prev-post a{position:relative;display:block;overflow:hidden;height:150px}#pagination.pagination-post{overflow:hidden;margin-top:40px;width:100%;background:#000}.layout>.recent-posts .pagination>*{display:inline-block;margin:0 6px;width:2.5em;height:2.5em;line-height:2.5em}.layout>.recent-posts .pagination>:not(.space):hover{background:var(--btn-hover-color);color:var(--btn-color)}.layout>div:not(.recent-posts) .pagination .page-number{display:inline-block;margin:0 4px;min-width:24px;height:24px;text-align:center;line-height:24px;cursor:pointer}#article-container{word-wrap:break-word;overflow-wrap:break-word}#article-container a{color:#49b1f5}#article-container a:hover{text-decoration:underline}#article-container img{display:block;margin:0 auto 20px;max-width:100%;-webkit-transition:filter 375ms ease-in .2s;-moz-transition:filter 375ms ease-in .2s;-o-transition:filter 375ms ease-in .2s;-ms-transition:filter 375ms ease-in .2s;transition:filter 375ms ease-in .2s}#article-container p{margin:0 0 16px}#article-container iframe{margin:0 0 20px}#article-container kbd{margin:0 3px;padding:3px 5px;border:1px solid #b4b4b4;border-radius:3px;background-color:#f8f8f8;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25),0 2px 1px 0 rgba(255,255,255,.6) inset;box-shadow:0 1px 3px rgba(0,0,0,.25),0 2px 1px 0 rgba(255,255,255,.6) inset;color:#34495e;white-space:nowrap;font-weight:600;font-size:.9em;font-family:Monaco,'Ubuntu Mono',monospace;line-height:1em}#article-container ol ol,#article-container ol ul,#article-container ul ol,#article-container ul ul{padding-left:20px}#article-container ol li,#article-container ul li{margin:4px 0}#article-container ol p,#article-container ul p{margin:0 0 8px}#article-container>:last-child{margin-bottom:0!important}#article-container hr{margin:20px 0}#article-container.post-content h1,#article-container.post-content h2,#article-container.post-content h3,#article-container.post-content h4,#article-container.post-content h5,#article-container.post-content h6{-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;-ms-transition:all .2s ease-out;transition:all .2s ease-out}#article-container.post-content h1:before,#article-container.post-content h2:before,#article-container.post-content h3:before,#article-container.post-content h4:before,#article-container.post-content h5:before,#article-container.post-content h6:before{position:absolute;top:calc(50% - 7px);color:#f47466;content:'\f863';left:0;line-height:1;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;-ms-transition:all .2s ease-out;transition:all .2s ease-out}#article-container.post-content h1:hover:before,#article-container.post-content h2:hover:before,#article-container.post-content h3:hover:before,#article-container.post-content h4:hover:before,#article-container.post-content h5:hover:before,#article-container.post-content h6:hover:before{color:#49b1f5}#article-container.post-content h1{padding-left:28px}#article-container.post-content h1:before{font-size:18px}#article-container.post-content h1:hover{padding-left:32px}#article-container.post-content h2{padding-left:26px}#article-container.post-content h2:before{font-size:16px}#article-container.post-content h2:hover{padding-left:30px}#article-container.post-content h3{padding-left:24px}#article-container.post-content h3:before{font-size:14px}#article-container.post-content h3:hover{padding-left:28px}#article-container.post-content h4{padding-left:22px}#article-container.post-content h4:before{font-size:12px}#article-container.post-content h4:hover{padding-left:26px}#article-container.post-content h5{padding-left:20px}#article-container.post-content h5:before{font-size:10px}#article-container.post-content h5:hover{padding-left:24px}#article-container.post-content h6{padding-left:20px}#article-container.post-content h6:before{font-size:10px}#article-container.post-content h6:hover{padding-left:24px}#article-container.post-content ol p,#article-container.post-content ul p{margin:0 0 8px}#article-container.post-content li::marker{color:#49b1f5;font-weight:600;font-size:1.05em}#article-container.post-content li:hover::marker{color:var(--pseudo-hover)}#article-container.post-content ul>li{list-style-type:circle}#post .tag_share:after{display:block;clear:both;content:''}#post .tag_share .post-meta__tag-list{display:inline-block}#post .tag_share .post-meta__tags{display:inline-block;margin:8px 8px 8px 0;padding:0 12px;width:fit-content;border:1px solid #49b1f5;border-radius:12px;color:#49b1f5;font-size:.85em;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#post .tag_share .post-meta__tags:hover{background:#49b1f5;color:var(--white)}#post .tag_share .post_share{display:inline-block;float:right;margin:8px 0 0;width:fit-content}#post .tag_share .post_share .social-share{font-size:.85em}#post .tag_share .post_share .social-share .social-share-icon{margin:0 4px;width:1.85em;height:1.85em;font-size:1.2em;line-height:1.85em}#post .post-copyright{position:relative;margin:40px 0 10px;padding:10px 16px;border:1px solid var(--light-grey);-webkit-transition:box-shadow .3s ease-in-out;-moz-transition:box-shadow .3s ease-in-out;-o-transition:box-shadow .3s ease-in-out;-ms-transition:box-shadow .3s ease-in-out;transition:box-shadow .3s ease-in-out}#post .post-copyright:before{position:absolute;top:2px;right:12px;color:#49b1f5;content:'\f1f9';font-size:1.3em}#post .post-copyright:hover{-webkit-box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5);box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5)}#post .post-copyright .post-copyright-meta{color:#49b1f5;font-weight:700}#post .post-copyright .post-copyright-meta i{margin-right:3px}#post .post-copyright .post-copyright-info{padding-left:6px}#post .post-copyright .post-copyright-info a{text-decoration:underline;word-break:break-word}#post .post-copyright .post-copyright-info a:hover{text-decoration:none}#post .post-outdate-notice{position:relative;margin:0 0 20px;padding:.5em 1.2em;border-radius:3px;background-color:#ffe6e6;color:#f66;padding:.5em 1em .5em 2.6em;border-left:5px solid #ff8080}#post .post-outdate-notice:before{position:absolute;top:50%;left:.9em;color:#ff8080;content:'\f071';-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-o-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#post .ads-wrap{margin:40px 0}.relatedPosts{margin-top:40px}.relatedPosts>.headline{margin-bottom:5px;font-weight:700;font-size:1.43em}.relatedPosts>.relatedPosts-list>div{position:relative;display:inline-block;overflow:hidden;margin:3px;width:calc(33.333% - 6px);height:200px;background:#000;vertical-align:bottom}@media screen and (max-width:768px){.relatedPosts>.relatedPosts-list>div{margin:2px;width:calc(50% - 4px);height:150px}}@media screen and (max-width:600px){.relatedPosts>.relatedPosts-list>div{width:calc(100% - 4px)}}.relatedPosts>.relatedPosts-list .content{position:absolute;top:50%;padding:0 20px;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.relatedPosts>.relatedPosts-list .content .date{color:var(--light-grey);font-size:90%}.relatedPosts>.relatedPosts-list .content .title{color:var(--white);-webkit-line-clamp:2}.post-reward{position:relative;margin-top:80px;width:100%;text-align:center;pointer-events:none}.post-reward>*{pointer-events:auto}.post-reward .reward-button{display:inline-block;padding:4px 24px;background:var(--btn-bg);color:var(--btn-color);cursor:pointer}.post-reward .reward-button i{margin-right:5px}.post-reward:hover .reward-button{background:var(--btn-hover-color)}.post-reward:hover>.reward-main{display:block}.post-reward .reward-main{position:absolute;bottom:40px;left:0;z-index:100;display:none;padding:0 0 15px;width:100%}.post-reward .reward-main .reward-all{display:inline-block;margin:0;padding:20px 10px;border-radius:4px;background:var(--reward-pop)}.post-reward .reward-main .reward-all:before{position:absolute;bottom:-10px;left:0;width:100%;height:20px;content:''}.post-reward .reward-main .reward-all:after{position:absolute;right:0;bottom:2px;left:0;margin:0 auto;width:0;height:0;border-top:13px solid var(--reward-pop);border-right:13px solid transparent;border-left:13px solid transparent;content:''}.post-reward .reward-main .reward-all .reward-item{display:inline-block;padding:0 8px;list-style-type:none;vertical-align:top}.post-reward .reward-main .reward-all .reward-item img{width:130px;height:130px}.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc{width:130px;color:#858585}#rightside{position:fixed;right:-48px;bottom:40px;z-index:100;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#rightside.rightside-show{opacity:.8;-webkit-transform:translate(-58px,0);-moz-transform:translate(-58px,0);-o-transform:translate(-58px,0);-ms-transform:translate(-58px,0);transform:translate(-58px,0)}#rightside #rightside-config-hide{height:0;opacity:0;-webkit-transition:-webkit-transform .4s;-moz-transition:-moz-transform .4s;-o-transition:-o-transform .4s;-ms-transition:-ms-transform .4s;transition:transform .4s;-webkit-transform:translate(45px,0);-moz-transform:translate(45px,0);-o-transform:translate(45px,0);-ms-transform:translate(45px,0);transform:translate(45px,0)}#rightside #rightside-config-hide.show{height:auto;opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#rightside #rightside-config-hide.status{height:auto;opacity:1;-ms-filter:none;filter:none}#rightside>div>a,#rightside>div>button{display:block;margin-bottom:5px;width:35px;height:35px;border-radius:5px;background-color:var(--btn-bg);color:var(--btn-color);text-align:center;font-size:16px;line-height:35px}#rightside>div>a:hover,#rightside>div>button:hover{background-color:var(--btn-hover-color)}#rightside #mobile-toc-button{display:none}@media screen and (max-width:900px){#rightside #mobile-toc-button{display:block}}@media screen and (max-width:900px){#rightside #hide-aside-btn{display:none}}#rightside #go-up .scroll-percent{display:none}#rightside #go-up.show-percent .scroll-percent{display:block}#rightside #go-up.show-percent .scroll-percent+i{display:none}#rightside #go-up:hover .scroll-percent{display:none}#rightside #go-up:hover .scroll-percent+i{display:block}#sidebar #menu-mask{position:fixed;z-index:102;display:none;width:100%;height:100%;background:rgba(0,0,0,.8)}#sidebar #sidebar-menus{position:fixed;top:0;right:-300px;z-index:103;overflow-x:hidden;overflow-y:scroll;padding-left:5px;width:300px;height:100%;background:var(--sidebar-bg);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#sidebar #sidebar-menus.open{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-o-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}#sidebar #sidebar-menus>.avatar-img{margin:20px auto}#sidebar #sidebar-menus .sidebar-site-data{padding:0 10px}#sidebar #sidebar-menus hr{margin:20px auto}#sidebar #sidebar-menus .menus_items{padding:0 10px}#sidebar #sidebar-menus .menus_items .site-page{position:relative;display:block;padding:3px 28px 3px 20px;color:var(--font-color);font-size:1.15em;border-radius:6px}#sidebar #sidebar-menus .menus_items .site-page:hover{background:var(--text-bg-hover)}#sidebar #sidebar-menus .menus_items .site-page i:first-child{width:15%;text-align:left}#sidebar #sidebar-menus .menus_items .site-page.group>i:last-child{position:absolute;top:.78em;right:13px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#sidebar #sidebar-menus .menus_items .site-page.group.hide>i:last-child{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}#sidebar #sidebar-menus .menus_items .site-page.group.hide+.menus_item_child{display:none}#sidebar #sidebar-menus .menus_items .menus_item_child{margin:0;padding-left:25px;list-style:none}#vcomment{font-size:1.1em}#vcomment .vbtn{border:none;background:var(--btn-bg);color:var(--btn-color)}#vcomment .vbtn:hover{background:var(--btn-hover-color)}#vcomment .vimg{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#vcomment .vimg:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}#vcomment .vcards .vcard .vcontent.expand:after,#vcomment .vcards .vcard .vcontent.expand:before{z-index:22}#waline-wrap{--waline-font-size:1.1em;--waline-theme-color:#49b1f5;--waline-active-color:#ff7242}#waline-wrap .wl-comment-actions>button:not(last-child){padding-right:4px}.fireworks{position:fixed;top:0;left:0;z-index:9999;pointer-events:none}.medium-zoom-image--opened{z-index:99999!important;margin:0!important}.medium-zoom-overlay{z-index:99999!important}.mermaid-wrap{margin:0 0 20px;text-align:center}.mermaid-wrap>svg{height:100%}.fb-comments iframe,.utterances{width:100%!important}#gitalk-container .gt-meta{margin:0 0 .8em;padding:6px 0 16px}.katex-wrap{overflow:auto}.katex-wrap::-webkit-scrollbar{display:none}mjx-container{overflow-x:auto;overflow-y:hidden;padding-bottom:4px;max-width:100%}mjx-container[display]{display:block!important;min-width:auto!important}mjx-container:not([display]){display:inline-grid!important}mjx-assistive-mml{right:0;bottom:0}.aplayer{color:#4c4948}#article-container .aplayer{margin:0 0 20px}#article-container .aplayer ol,#article-container .aplayer ul{margin:0;padding:0}#article-container .aplayer ol li,#article-container .aplayer ul li{margin:0;padding:0 15px}#article-container .aplayer ol li:before,#article-container .aplayer ul li:before{content:none}.snackbar-css{border-radius:5px!important}.abc-music-sheet{margin:0 0 20px;opacity:0;-webkit-transition:opacity .3s;-moz-transition:opacity .3s;-o-transition:opacity .3s;-ms-transition:opacity .3s;transition:opacity .3s}.abc-music-sheet.abcjs-container{opacity:1;-ms-filter:none;filter:none}@media screen and (max-width:768px){.fancybox__toolbar__column.is-middle{display:none}}#article-container .btn-center{margin:0 0 20px;text-align:center}#article-container .btn-beautify{display:inline-block;margin:0 4px 6px;padding:0 15px;background-color:var(--btn-beautify-color,#777);color:#fff;line-height:2}#article-container .btn-beautify.blue{--btn-beautify-color:#428bca}#article-container .btn-beautify.pink{--btn-beautify-color:#ff69b4}#article-container .btn-beautify.red{--btn-beautify-color:#f00}#article-container .btn-beautify.purple{--btn-beautify-color:#6f42c1}#article-container .btn-beautify.orange{--btn-beautify-color:#ff8c00}#article-container .btn-beautify.green{--btn-beautify-color:#5cb85c}#article-container .btn-beautify:hover{background-color:var(--btn-hover-color)}#article-container .btn-beautify i+span{margin-left:6px}#article-container .btn-beautify:not(.block)+.btn-beautify:not(.block){margin:0 4px 20px}#article-container .btn-beautify.block{display:block;margin:0 0 20px;width:fit-content;width:-moz-fit-content}#article-container .btn-beautify.block.center{margin:0 auto 20px}#article-container .btn-beautify.block.right{margin:0 0 20px auto}#article-container .btn-beautify.larger{padding:6px 15px}#article-container .btn-beautify:hover{text-decoration:none}#article-container .btn-beautify.outline{border:1px solid transparent;border-color:var(--btn-beautify-color,#777);background-color:transparent;color:var(--btn-beautify-color,#777)}#article-container .btn-beautify.outline:hover{background-color:var(--btn-beautify-color,#777)}#article-container .btn-beautify.outline:hover{color:#fff!important}#article-container figure.gallery-group{position:relative;float:left;overflow:hidden;margin:6px 4px;width:calc(50% - 8px);height:250px;border-radius:8px;background:#000;-webkit-transform:translate3d(0,0,0)}@media screen and (max-width:600px){#article-container figure.gallery-group{width:calc(100% - 8px)}}#article-container figure.gallery-group:hover img{opacity:.4;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group:hover .gallery-group-name::after{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group:hover p{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group img{position:relative;margin:0;max-width:none;width:calc(100% + 20px);height:250px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;opacity:.8;-webkit-transition:all .3s,filter 375ms ease-in .2s;-moz-transition:all .3s,filter 375ms ease-in .2s;-o-transition:all .3s,filter 375ms ease-in .2s;-ms-transition:all .3s,filter 375ms ease-in .2s;transition:all .3s,filter 375ms ease-in .2s;-webkit-transform:translate3d(-10px,0,0);-moz-transform:translate3d(-10px,0,0);-o-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);object-fit:cover}#article-container figure.gallery-group figcaption{position:absolute;top:0;left:0;padding:30px;width:100%;height:100%;color:#fff;text-transform:uppercase;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}#article-container figure.gallery-group figcaption>a{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000;opacity:0}#article-container figure.gallery-group p{margin:0;padding:8px 0 0;letter-spacing:1px;font-size:1.1em;line-height:1.5;opacity:0;-webkit-transition:opacity .35s,-webkit-transform .35s;-moz-transition:opacity .35s,-moz-transform .35s;-o-transition:opacity .35s,-o-transform .35s;-ms-transition:opacity .35s,-ms-transform .35s;transition:opacity .35s,transform .35s;-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);-o-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-line-clamp:4}#article-container figure.gallery-group .gallery-group-name{position:relative;margin:0;padding:8px 0;font-weight:700;font-size:1.65em;line-height:1.5;-webkit-line-clamp:2}#article-container figure.gallery-group .gallery-group-name:after{position:absolute;bottom:0;left:0;width:100%;height:2px;background:#fff;content:'';-webkit-transition:-webkit-transform .35s;-moz-transition:-moz-transform .35s;-o-transition:-o-transform .35s;-ms-transition:-ms-transform .35s;transition:transform .35s;-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-o-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}#article-container .gallery-group-main{overflow:auto;padding:0 0 16px}#article-container .gallery-container{margin:0 0 16px;text-align:center}#article-container .gallery-container img{display:initial;margin:0;width:100%;height:100%}#article-container .gallery-container .gallery-data{display:none}#article-container .gallery-container button{margin-top:25px;padding:10px;width:9em;border-radius:5px;background:var(--btn-bg);color:var(--btn-color);font-weight:700;font-size:1.1em;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#article-container .gallery-container button:hover{background:var(--btn-hover-color)}#article-container .loading-container{display:inline-block;overflow:hidden;width:154px;height:154px}#article-container .loading-container .loading-item{position:relative;width:100%;height:100%;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0) scale(1);-moz-transform:translateZ(0) scale(1);-o-transform:translateZ(0) scale(1);-ms-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1);-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}#article-container .loading-container .loading-item div{position:absolute;width:30.8px;height:30.8px;border-radius:50%;background:#e15b64;-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1);-webkit-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);-moz-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);-o-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);-ms-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1)}#article-container .loading-container .loading-item div:nth-child(1){background:#f47e60;-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1);-webkit-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;-moz-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;-o-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;-ms-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start}#article-container .loading-container .loading-item div:nth-child(2){background:#e15b64;-webkit-animation-delay:-.48s;-moz-animation-delay:-.48s;-o-animation-delay:-.48s;-ms-animation-delay:-.48s;animation-delay:-.48s}#article-container .loading-container .loading-item div:nth-child(3){background:#f47e60;-webkit-animation-delay:-.96s;-moz-animation-delay:-.96s;-o-animation-delay:-.96s;-ms-animation-delay:-.96s;animation-delay:-.96s}#article-container .loading-container .loading-item div:nth-child(4){background:#f8b26a;-webkit-animation-delay:-1.44s;-moz-animation-delay:-1.44s;-o-animation-delay:-1.44s;-ms-animation-delay:-1.44s;animation-delay:-1.44s}#article-container .loading-container .loading-item div:nth-child(5){background:#abbd81;-webkit-animation-delay:-1.92s;-moz-animation-delay:-1.92s;-o-animation-delay:-1.92s;-ms-animation-delay:-1.92s;animation-delay:-1.92s}@-moz-keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@-webkit-keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@-o-keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@-moz-keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@-webkit-keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@-o-keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@-moz-keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}@-webkit-keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}@-o-keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}@keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}blockquote.pullquote{position:relative;max-width:45%;font-size:110%}blockquote.pullquote.left{float:left;margin:1em .5em 0 0}blockquote.pullquote.right{float:right;margin:1em 0 0 .5em}.video-container{position:relative;overflow:hidden;margin-bottom:16px;padding-top:56.25%;height:0}.video-container iframe{position:absolute;top:0;left:0;margin-top:0;width:100%;height:100%}.hide-block>.hide-button,.hide-inline>.hide-button{display:inline-block;padding:5px 18px;background:#49b1f5;color:var(--white)}.hide-block>.hide-button:hover,.hide-inline>.hide-button:hover{background-color:var(--btn-hover-color)}.hide-block>.hide-button.open,.hide-inline>.hide-button.open{display:none}.hide-block>.hide-button.open+div,.hide-inline>.hide-button.open+div{display:block}.hide-block>.hide-button.open+span,.hide-inline>.hide-button.open+span{display:inline}.hide-block>.hide-content,.hide-inline>.hide-content{display:none}.hide-inline>.hide-button{margin:0 6px}.hide-inline>.hide-content{margin:0 6px}.hide-block{margin:0 0 16px}.toggle{margin-bottom:20px;border:1px solid #f0f0f0}.toggle>.toggle-button{padding:6px 15px;background:#f0f0f0;color:#1f2d3d;cursor:pointer}.toggle>.toggle-content{margin:30px 24px}#article-container .inline-img{display:inline;margin:0 3px;height:1.1em;vertical-align:text-bottom}.hl-label{padding:2px 4px;border-radius:3px;color:#fff}.hl-label.default{background-color:#777}.hl-label.blue{background-color:#428bca}.hl-label.pink{background-color:#ff69b4}.hl-label.red{background-color:red}.hl-label.purple{background-color:#6f42c1}.hl-label.orange{background-color:#ff8c00}.hl-label.green{background-color:#5cb85c}.note{position:relative;margin:0 0 20px;padding:15px;border-radius:3px}.note.icon-padding{padding-left:3em}.note>.note-icon{position:absolute;top:calc(50% - .5em);left:.8em;font-size:larger}.note.blue:not(.disabled){border-left-color:#428bca!important}.note.blue:not(.disabled).modern{border-left-color:transparent!important;color:#428bca}.note.blue:not(.disabled):not(.simple){background:#e3eef7!important}.note.blue>.note-icon{color:#428bca}.note.pink:not(.disabled){border-left-color:#ff69b4!important}.note.pink:not(.disabled).modern{border-left-color:transparent!important;color:#ff69b4}.note.pink:not(.disabled):not(.simple){background:#ffe9f4!important}.note.pink>.note-icon{color:#ff69b4}.note.red:not(.disabled){border-left-color:red!important}.note.red:not(.disabled).modern{border-left-color:transparent!important;color:red}.note.red:not(.disabled):not(.simple){background:#ffd9d9!important}.note.red>.note-icon{color:red}.note.purple:not(.disabled){border-left-color:#6f42c1!important}.note.purple:not(.disabled).modern{border-left-color:transparent!important;color:#6f42c1}.note.purple:not(.disabled):not(.simple){background:#e9e3f6!important}.note.purple>.note-icon{color:#6f42c1}.note.orange:not(.disabled){border-left-color:#ff8c00!important}.note.orange:not(.disabled).modern{border-left-color:transparent!important;color:#ff8c00}.note.orange:not(.disabled):not(.simple){background:#ffeed9!important}.note.orange>.note-icon{color:#ff8c00}.note.green:not(.disabled){border-left-color:#5cb85c!important}.note.green:not(.disabled).modern{border-left-color:transparent!important;color:#5cb85c}.note.green:not(.disabled):not(.simple){background:#e7f4e7!important}.note.green>.note-icon{color:#5cb85c}.note.simple{border:1px solid #eee;border-left-width:5px}.note.modern{border:1px solid transparent!important;background-color:#f5f5f5;color:#4c4948}.note.flat{border:initial;border-left:5px solid #eee;background-color:#f9f9f9;color:#4c4948}.note h2,.note h3,.note h4,.note h5,.note h6{margin-top:3px;margin-bottom:0;padding-top:0!important;border-bottom:initial}.note blockquote:first-child,.note img:first-child,.note ol:first-child,.note p:first-child,.note pre:first-child,.note table:first-child,.note ul:first-child{margin-top:0!important}.note blockquote:last-child,.note img:last-child,.note ol:last-child,.note p:last-child,.note pre:last-child,.note table:last-child,.note ul:last-child{margin-bottom:0!important}.note .img-alt{margin:5px 0 10px}.note:not(.no-icon){padding-left:3em}.note:not(.no-icon)::before{position:absolute;top:calc(50% - .95em);left:.8em;font-size:larger}.note.default.flat{background:#f7f7f7}.note.default.modern{border-color:#e1e1e1;background:#f3f3f3;color:#666}.note.default.modern a:not(.btn){color:#666}.note.default.modern a:not(.btn):hover{color:#454545}.note.default:not(.modern){border-left-color:#777}.note.default:not(.modern) h2,.note.default:not(.modern) h3,.note.default:not(.modern) h4,.note.default:not(.modern) h5,.note.default:not(.modern) h6{color:#777}.note.default:not(.no-icon)::before{content:'\f0a9'}.note.default:not(.no-icon):not(.modern)::before{color:#777}.note.primary.flat{background:#f5f0fa}.note.primary.modern{border-color:#e1c2ff;background:#f3daff;color:#6f42c1}.note.primary.modern a:not(.btn){color:#6f42c1}.note.primary.modern a:not(.btn):hover{color:#453298}.note.primary:not(.modern){border-left-color:#6f42c1}.note.primary:not(.modern) h2,.note.primary:not(.modern) h3,.note.primary:not(.modern) h4,.note.primary:not(.modern) h5,.note.primary:not(.modern) h6{color:#6f42c1}.note.primary:not(.no-icon)::before{content:'\f055'}.note.primary:not(.no-icon):not(.modern)::before{color:#6f42c1}.note.info.flat{background:#eef7fa}.note.info.modern{border-color:#b3e5ef;background:#d9edf7;color:#31708f}.note.info.modern a:not(.btn){color:#31708f}.note.info.modern a:not(.btn):hover{color:#215761}.note.info:not(.modern){border-left-color:#428bca}.note.info:not(.modern) h2,.note.info:not(.modern) h3,.note.info:not(.modern) h4,.note.info:not(.modern) h5,.note.info:not(.modern) h6{color:#428bca}.note.info:not(.no-icon)::before{content:'\f05a'}.note.info:not(.no-icon):not(.modern)::before{color:#428bca}.note.success.flat{background:#eff8f0}.note.success.modern{border-color:#d0e6be;background:#dff0d8;color:#3c763d}.note.success.modern a:not(.btn){color:#3c763d}.note.success.modern a:not(.btn):hover{color:#32562c}.note.success:not(.modern){border-left-color:#5cb85c}.note.success:not(.modern) h2,.note.success:not(.modern) h3,.note.success:not(.modern) h4,.note.success:not(.modern) h5,.note.success:not(.modern) h6{color:#5cb85c}.note.success:not(.no-icon)::before{content:'\f058'}.note.success:not(.no-icon):not(.modern)::before{color:#5cb85c}.note.warning.flat{background:#fdf8ea}.note.warning.modern{border-color:#fae4cd;background:#fcf4e3;color:#8a6d3b}.note.warning.modern a:not(.btn){color:#8a6d3b}.note.warning.modern a:not(.btn):hover{color:#714f30}.note.warning:not(.modern){border-left-color:#f0ad4e}.note.warning:not(.modern) h2,.note.warning:not(.modern) h3,.note.warning:not(.modern) h4,.note.warning:not(.modern) h5,.note.warning:not(.modern) h6{color:#f0ad4e}.note.warning:not(.no-icon)::before{content:'\f06a'}.note.warning:not(.no-icon):not(.modern)::before{color:#f0ad4e}.note.danger.flat{background:#fcf1f2}.note.danger.modern{border-color:#ebcdd2;background:#f2dfdf;color:#a94442}.note.danger.modern a:not(.btn){color:#a94442}.note.danger.modern a:not(.btn):hover{color:#84333f}.note.danger:not(.modern){border-left-color:#d9534f}.note.danger:not(.modern) h2,.note.danger:not(.modern) h3,.note.danger:not(.modern) h4,.note.danger:not(.modern) h5,.note.danger:not(.modern) h6{color:#d9534f}.note.danger:not(.no-icon)::before{content:'\f056'}.note.danger:not(.no-icon):not(.modern)::before{color:#d9534f}#article-container .tabs{position:relative;margin:0 0 20px;border-right:1px solid var(--tab-border-color);border-bottom:1px solid var(--tab-border-color);border-left:1px solid var(--tab-border-color)}#article-container .tabs>.nav-tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-lines:multiple;-moz-box-lines:multiple;-o-box-lines:multiple;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;background:var(--tab-botton-bg)}#article-container .tabs>.nav-tabs>.tab{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;-ms-box-flex:1;box-flex:1;-webkit-flex-grow:1;flex-grow:1;padding:8px 18px;border-top:2px solid var(--tab-border-color);background:var(--tab-botton-bg);color:var(--tab-botton-color);line-height:2;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;-ms-transition:all .4s;transition:all .4s}#article-container .tabs>.nav-tabs>.tab i{width:1.5em}#article-container .tabs>.nav-tabs>.tab.active{border-top:2px solid #49b1f5;background:var(--tab-button-active-bg);cursor:default}#article-container .tabs>.nav-tabs>.tab:not(.active):hover{border-top:2px solid var(--tab-button-hover-bg);background:var(--tab-button-hover-bg)}#article-container .tabs>.nav-tabs.no-default~.tab-to-top{display:none}#article-container .tabs>.tab-contents .tab-item-content{position:relative;display:none;padding:36px 24px 10px}@media screen and (max-width:768px){#article-container .tabs>.tab-contents .tab-item-content{padding:24px 14px}}#article-container .tabs>.tab-contents .tab-item-content.active{display:block;-webkit-animation:tabshow .5s;-moz-animation:tabshow .5s;-o-animation:tabshow .5s;-ms-animation:tabshow .5s;animation:tabshow .5s}#article-container .tabs>.tab-contents .tab-item-content>:last-child{margin-bottom:0}#article-container .tabs>.tab-to-top{padding:0 16px 10px 0;width:100%;text-align:right}#article-container .tabs>.tab-to-top button{color:#99a9bf}#article-container .tabs>.tab-to-top button:hover{color:#49b1f5}@-moz-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}#article-container .timeline{margin:0 0 20px 10px;padding:14px 20px 5px;border-left:2px solid var(--timeline-color,#49b1f5)}#article-container .timeline.blue{--timeline-color:#428bca;--timeline-bg:rgba(66,139,202, 0.2)}#article-container .timeline.pink{--timeline-color:#ff69b4;--timeline-bg:rgba(255,105,180, 0.2)}#article-container .timeline.red{--timeline-color:#f00;--timeline-bg:rgba(255,0,0, 0.2)}#article-container .timeline.purple{--timeline-color:#6f42c1;--timeline-bg:rgba(111,66,193, 0.2)}#article-container .timeline.orange{--timeline-color:#ff8c00;--timeline-bg:rgba(255,140,0, 0.2)}#article-container .timeline.green{--timeline-color:#5cb85c;--timeline-bg:rgba(92,184,92, 0.2)}#article-container .timeline .timeline-item{margin:0 0 15px}#article-container .timeline .timeline-item:hover .item-circle:before{border-color:var(--timeline-color,#49b1f5)}#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle>p{font-weight:600;font-size:1.2em}#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before{left:-28px;border:4px solid var(--timeline-color,#49b1f5)}#article-container .timeline .timeline-item.headline:hover .item-circle:before{border-color:var(--pseudo-hover)}#article-container .timeline .timeline-item .timeline-item-title{position:relative}#article-container .timeline .timeline-item .item-circle:before{position:absolute;top:50%;left:-27px;width:6px;height:6px;border:3px solid var(--pseudo-hover);border-radius:50%;background:var(--card-bg);content:'';-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}#article-container .timeline .timeline-item .item-circle>p{margin:0 0 8px;font-weight:500}#article-container .timeline .timeline-item .timeline-item-content{position:relative;padding:12px 15px;border-radius:8px;background:var(--timeline-bg,#e4f3fd);font-size:.93em}#article-container .timeline .timeline-item .timeline-item-content>:last-child{margin-bottom:0}#article-container .timeline+.timeline{margin-top:-20px}[data-theme=dark]{--global-bg:#0d0d0d;--font-color:rgba(255,255,255,0.7);--hr-border:rgba(255,255,255,0.4);--hr-before-color:rgba(255,255,255,0.7);--search-bg:#121212;--search-input-color:rgba(255,255,255,0.7);--search-a-color:rgba(255,255,255,0.7);--preloader-bg:#0d0d0d;--preloader-color:rgba(255,255,255,0.7);--tab-border-color:#2c2c2c;--tab-botton-bg:#2c2c2c;--tab-botton-color:rgba(255,255,255,0.7);--tab-button-hover-bg:#383838;--tab-button-active-bg:#121212;--card-bg:#121212;--sidebar-bg:#121212;--btn-hover-color:#787878;--btn-color:rgba(255,255,255,0.7);--btn-bg:#1f1f1f;--text-bg-hover:#383838;--light-grey:rgba(255,255,255,0.7);--dark-grey:rgba(255,255,255,0.2);--white:rgba(255,255,255,0.9);--text-highlight-color:rgba(255,255,255,0.9);--blockquote-color:rgba(255,255,255,0.7);--blockquote-bg:#2c2c2c;--reward-pop:#2c2c2c;--toc-link-color:rgba(255,255,255,0.6);--scrollbar-color:#525252;--timeline-bg:#1f1f1f;--zoom-bg:#121212;--mark-bg:rgba(0,0,0,0.6)}[data-theme=dark] #web_bg:before{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.7);content:''}[data-theme=dark] #article-container code{background:#2c2c2c}[data-theme=dark] #article-container pre>code{background:#171717}[data-theme=dark] #article-container figure.highlight{-webkit-box-shadow:none;box-shadow:none}[data-theme=dark] #article-container .note code{background:rgba(27,31,35,.05)}[data-theme=dark] #article-container .aplayer{filter:brightness(.8)}[data-theme=dark] #article-container kbd{border-color:#696969;background-color:#525252;color:#e2f1ff}[data-theme=dark] #page-header.nav-fixed>#nav,[data-theme=dark] #page-header.not-top-img>#nav{background:rgba(18,18,18,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,0);box-shadow:0 5px 6px -5px rgba(133,133,133,0)}[data-theme=dark] #post-comment .comment-switch{background:#2c2c2c!important}[data-theme=dark] #post-comment .comment-switch #switch-btn{filter:brightness(.8)}[data-theme=dark] .note{filter:brightness(.8)}[data-theme=dark] #article-container iframe,[data-theme=dark] .ads-wrap,[data-theme=dark] .btn-beautify,[data-theme=dark] .error-img,[data-theme=dark] .gist,[data-theme=dark] .hide-button,[data-theme=dark] .hl-label,[data-theme=dark] .post-outdate-notice{filter:brightness(.8)}[data-theme=dark] img{filter:brightness(.8)}[data-theme=dark] #aside-content .aside-list>.aside-list-item:not(:last-child){border-bottom:1px dashed rgba(255,255,255,.1)}[data-theme=dark] #gitalk-container{filter:brightness(.8)}[data-theme=dark] #gitalk-container svg{fill:rgba(255,255,255,.9)!important}[data-theme=dark] #disqusjs #dsqjs .dsqjs-no-comment,[data-theme=dark] #disqusjs #dsqjs .dsqjs-tab-active,[data-theme=dark] #disqusjs #dsqjs:focus,[data-theme=dark] #disqusjs #dsqjs:hover{color:rgba(255,255,255,.7)}[data-theme=dark] #disqusjs #dsqjs .dsqjs-order-label{background-color:#1f1f1f}[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body{color:rgba(255,255,255,.7)}[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body code,[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body pre{background:#2c2c2c}[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body blockquote{color:rgba(255,255,255,.7)}[data-theme=dark] #artitalk_main #lazy{background:#121212}[data-theme=dark] #operare_artitalk .c2{background:#121212}@media screen and (max-width:900px){[data-theme=dark] #card-toc{background:#1f1f1f}}.read-mode{--font-color:#4c4948;--readmode-light-color:#fff;--white:#4c4948;--light-grey:#4c4948;--gray:#d6dbdf;--hr-border:#d6dbdf;--hr-before-color:#b9c2c9;--highlight-bg:#f7f7f7;--exit-btn-bg:#c0c0c0;--exit-btn-color:#fff;--exit-btn-hover:#8d8d8d;--pseudo-hover:none}[data-theme=dark] .read-mode{--font-color:rgba(255,255,255,0.7);--readmode-light-color:#0d0d0d;--white:rgba(255,255,255,0.9);--light-grey:rgba(255,255,255,0.7);--gray:rgba(255,255,255,0.7);--hr-border:rgba(255,255,255,0.5);--hr-before-color:rgba(255,255,255,0.7);--highlight-bg:#171717;--exit-btn-bg:#1f1f1f;--exit-btn-color:rgba(255,255,255,0.9);--exit-btn-hover:#525252}.read-mode{background:var(--readmode-light-color)}.read-mode .exit-readmode{position:fixed;top:30px;right:30px;z-index:100;width:40px;height:40px;border-radius:8px;background:var(--exit-btn-bg);color:var(--exit-btn-color);font-size:16px;-webkit-transition:background .3s;-moz-transition:background .3s;-o-transition:background .3s;-ms-transition:background .3s;transition:background .3s}@media screen and (max-width:768px){.read-mode .exit-readmode{top:initial;bottom:30px}}.read-mode .exit-readmode:hover{background:var(--exit-btn-hover)}.read-mode #aside-content{display:none}.read-mode #page-header.post-bg{background:0 0!important}.read-mode #page-header.post-bg:before{opacity:0}.read-mode #page-header.post-bg>#post-info{text-align:center}.read-mode #post{margin:0 auto;background:0 0;-webkit-box-shadow:none;box-shadow:none}.read-mode #post:hover{-webkit-box-shadow:none;box-shadow:none}.read-mode>canvas{display:none!important}.read-mode #footer,.read-mode #nav,.read-mode #post>:not(#post-info):not(.post-content),.read-mode #rightside,.read-mode #web_bg,.read-mode .highlight-tools,.read-mode .not-top-img,.read-mode .post-outdate-notice{display:none!important}.read-mode #article-container a{color:#99a9bf}.read-mode #article-container .highlight:not(.js-file-line-container),.read-mode #article-container pre{background:var(--highlight-bg)!important}.read-mode #article-container .highlight:not(.js-file-line-container) *,.read-mode #article-container pre *{color:var(--font-color)!important}.read-mode #article-container figure.highlight{border-radius:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.read-mode #article-container figure.highlight>:not(.highlight-tools){display:block!important}.read-mode #article-container figure.highlight .line:before{color:var(--font-color)!important}.read-mode #article-container figure.highlight .hljs{background:var(--highlight-bg)!important}.read-mode #article-container h1,.read-mode #article-container h2,.read-mode #article-container h3,.read-mode #article-container h4,.read-mode #article-container h5,.read-mode #article-container h6{padding:0}.read-mode #article-container h1:before,.read-mode #article-container h2:before,.read-mode #article-container h3:before,.read-mode #article-container h4:before,.read-mode #article-container h5:before,.read-mode #article-container h6:before{content:''}.read-mode #article-container h1:hover,.read-mode #article-container h2:hover,.read-mode #article-container h3:hover,.read-mode #article-container h4:hover,.read-mode #article-container h5:hover,.read-mode #article-container h6:hover{padding:0}.read-mode #article-container li:hover:before,.read-mode #article-container ol:hover:before,.read-mode #article-container ul:hover:before{-webkit-transform:none!important;-moz-transform:none!important;-o-transform:none!important;-ms-transform:none!important;transform:none!important}.read-mode #article-container li:before,.read-mode #article-container ol:before{background:0 0!important;color:var(--font-color)!important}.read-mode #article-container ul>li:before{border-color:var(--gray)!important}.read-mode #article-container .tabs{border:2px solid var(--tab-border-color)}.read-mode #article-container .tabs>.nav-tabs{background:0 0}.read-mode #article-container .tabs>.nav-tabs>.tab{border-top:none!important}.read-mode #article-container .tabs>.tab-contents .tab-item-content.active{-webkit-animation:none;-moz-animation:none;-o-animation:none;-ms-animation:none;animation:none}.read-mode #article-container code{color:var(--font-color)}.read-mode #article-container blockquote{border-color:var(--gray);background-color:var(--readmode-light-color)}.read-mode #article-container kbd{border:1px solid var(--gray);background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:var(--font-color)}.read-mode #article-container .hide-toggle{border:1px solid var(--gray)!important}.read-mode #article-container .btn-beautify,.read-mode #article-container .hide-button,.read-mode #article-container .hl-label{border:1px solid var(--gray)!important;background:var(--readmode-light-color)!important;color:var(--font-color)!important}.read-mode #article-container .note{border:2px solid var(--gray);border-left-color:var(--gray)!important;filter:none;background-color:var(--readmode-light-color)!important;color:var(--font-color)}.read-mode #article-container .note .note-icon,.read-mode #article-container .note:before{color:var(--font-color)}.search-dialog{position:fixed;top:10%;left:50%;z-index:1001;display:none;margin-left:-300px;padding:20px;width:600px;border-radius:8px;background:var(--search-bg);--search-height:100vh}@media screen and (max-width:768px){.search-dialog{top:0;left:0;margin:0;width:100%;height:100%;border-radius:0}}.search-dialog hr{margin:20px auto}.search-dialog .search-nav{margin:0 0 14px;color:#49b1f5;font-size:1.4em;line-height:1}.search-dialog .search-nav .search-dialog-title{margin-right:10px}.search-dialog .search-nav .search-close-button{float:right;color:#858585;-webkit-transition:color .2s ease-in-out;-moz-transition:color .2s ease-in-out;-o-transition:color .2s ease-in-out;-ms-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.search-dialog .search-nav .search-close-button:hover{color:#49b1f5}.search-dialog hr{margin:20px auto}#search-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none;background:rgba(0,0,0,.6)}#local-search .search-dialog .local-search-box{margin:0 auto;max-width:100%;width:100%}#local-search .search-dialog .local-search-box input{padding:5px 14px;width:100%;outline:0;border:2px solid #49b1f5;border-radius:40px;background:var(--search-bg);color:var(--search-input-color);-webkit-appearance:none}#local-search .search-dialog .search-wrap{display:none}#local-search .search-dialog .local-search-hit-item{position:relative;padding-left:24px;line-height:1.7}#local-search .search-dialog .local-search-hit-item:hover:before{border-color:var(--pseudo-hover)}#local-search .search-dialog .local-search-hit-item:before{position:absolute;top:.45em;left:0;width:.5em;height:.5em;border:3px solid #49b1f5;border-radius:.5em;background:0 0;content:'';line-height:.5em;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#local-search .search-dialog .local-search-hit-item a{display:block;color:var(--search-a-color)}#local-search .search-dialog .local-search-hit-item a:hover{color:#49b1f5}#local-search .search-dialog .local-search-hit-item .search-result-title{font-weight:600}#local-search .search-dialog .local-search-hit-item .search-result{margin:0 0 8px}#local-search .search-dialog .search-result-list{overflow-y:overlay;margin:0 -20px;padding:0 22px;max-height:calc(80vh - 200px)}@media screen and (max-width:768px){#local-search .search-dialog .search-result-list{max-height:calc(var(--search-height) - 220px)!important}}.search-keyword{background:0 0;color:#f47466;font-weight:700} \ No newline at end of file +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}#article-container .flink .flink-item-desc,#article-container .flink .flink-item-name,#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span,#nav #blog-info,#pagination .next_info,#pagination .prev_info,#sidebar #sidebar-menus .menus_items .site-page,.limit-one-line,.site-data>a .headline{overflow:hidden;-o-text-overflow:ellipsis;text-overflow:ellipsis;white-space:nowrap}#article-container figure.gallery-group .gallery-group-name,#article-container figure.gallery-group p,#aside-content .aside-list>.aside-list-item .content>.comment,#aside-content .aside-list>.aside-list-item .content>.name,#aside-content .aside-list>.aside-list-item .content>.title,#post-info .post-title,#recent-posts>.recent-post-item>.recent-post-info>.article-title,#recent-posts>.recent-post-item>.recent-post-info>.content,.article-sort-item-title,.limit-more-line,.relatedPosts>.relatedPosts-list .content .title{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical}#article-container.post-content h1:before,#article-container.post-content h2:before,#article-container.post-content h3:before,#article-container.post-content h4:before,#article-container.post-content h5:before,#article-container.post-content h6:before,#article-container.post-content hr:before,#post .post-copyright:before,#post .post-outdate-notice:before,.custom-hr:before,.fontawesomeIcon,.note:not(.no-icon)::before,.search-dialog hr:before{display:inline-block;font-weight:600;font-family:'Font Awesome 6 Free';text-rendering:auto;-webkit-font-smoothing:antialiased}#aside-content .card-widget,#recent-posts>.recent-post-item,.cardHover,.layout>.recent-posts .pagination>:not(.space),.layout>div:first-child:not(.recent-posts){border-radius:8px;background:var(--card-bg);-webkit-box-shadow:var(--card-box-shadow);box-shadow:var(--card-box-shadow);-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#aside-content .card-widget:hover,#recent-posts>.recent-post-item:hover,.cardHover:hover,.layout>.recent-posts .pagination>:not(.space):hover,.layout>div:first-child:not(.recent-posts):hover{-webkit-box-shadow:var(--card-hover-box-shadow);box-shadow:var(--card-hover-box-shadow)}#aside-content .aside-list>.aside-list-item .thumbnail :first-child,#recent-posts>.recent-post-item .post_cover .post-bg,.article-sort-item-img :first-child,.imgHover{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .6s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .6s;-o-transition:filter 375ms ease-in .2s,-o-transform .6s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .6s;transition:filter 375ms ease-in .2s,transform .6s;object-fit:cover}#aside-content .aside-list>.aside-list-item .thumbnail :first-child:hover,#recent-posts>.recent-post-item .post_cover .post-bg:hover,.article-sort-item-img :first-child:hover,.imgHover:hover{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#pagination .next-post:hover .cover,#pagination .prev-post:hover .cover,.postImgHover:hover .cover,.relatedPosts>.relatedPosts-list>div:hover .cover{opacity:.8;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#pagination .next-post .cover,#pagination .prev-post .cover,.postImgHover .cover,.relatedPosts>.relatedPosts-list>div .cover{position:absolute;width:100%;height:100%;opacity:.4;-webkit-transition:all .6s,filter 375ms ease-in .2s;-moz-transition:all .6s,filter 375ms ease-in .2s;-o-transition:all .6s,filter 375ms ease-in .2s;-ms-transition:all .6s,filter 375ms ease-in .2s;transition:all .6s,filter 375ms ease-in .2s;object-fit:cover}.category-lists ul,.list-beauty{list-style:none}.category-lists ul li,.list-beauty li{position:relative;padding:.12em .4em .12em 1.4em}.category-lists ul li:hover:before,.list-beauty li:hover:before{border-color:var(--pseudo-hover)}.category-lists ul li:before,.list-beauty li:before{position:absolute;top:.67em;left:0;width:.43em;height:.43em;border:.215em solid #49b1f5;border-radius:.43em;background:0 0;content:'';cursor:pointer;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#article-container.post-content hr,.custom-hr,.search-dialog hr{position:relative;margin:40px auto;border:2px dashed var(--hr-border);width:calc(100% - 4px)}#article-container.post-content hr:hover:before,.custom-hr:hover:before,.search-dialog hr:hover:before{left:calc(95% - 20px)}#article-container.post-content hr:before,.custom-hr:before,.search-dialog hr:before{position:absolute;top:-10px;left:5%;z-index:1;color:var(--hr-before-color);content:'\f0c4';font-size:20px;line-height:1;-webkit-transition:all 1s ease-in-out;-moz-transition:all 1s ease-in-out;-o-transition:all 1s ease-in-out;-ms-transition:all 1s ease-in-out;transition:all 1s ease-in-out}#content-inner,#footer{-webkit-animation:bottom-top 1s;-moz-animation:bottom-top 1s;-o-animation:bottom-top 1s;-ms-animation:bottom-top 1s;animation:bottom-top 1s}#page-header:not(.full_page){-webkit-animation:header-effect 1s;-moz-animation:header-effect 1s;-o-animation:header-effect 1s;-ms-animation:header-effect 1s;animation:header-effect 1s}#site-subtitle,#site-title{-webkit-animation:titleScale 1s;-moz-animation:titleScale 1s;-o-animation:titleScale 1s;-ms-animation:titleScale 1s;animation:titleScale 1s}#nav.show{-webkit-animation:headerNoOpacity 1s;-moz-animation:headerNoOpacity 1s;-o-animation:headerNoOpacity 1s;-ms-animation:headerNoOpacity 1s;animation:headerNoOpacity 1s}#web_bg,canvas:not(#ribbon-canvas){-webkit-animation:to_show 4s;-moz-animation:to_show 4s;-o-animation:to_show 4s;-ms-animation:to_show 4s;animation:to_show 4s}#ribbon-canvas{-webkit-animation:ribbon_to_show 4s;-moz-animation:ribbon_to_show 4s;-o-animation:ribbon_to_show 4s;-ms-animation:ribbon_to_show 4s;animation:ribbon_to_show 4s}#sidebar-menus.open>:nth-child(1){-webkit-animation:sidebarItem .2s;-moz-animation:sidebarItem .2s;-o-animation:sidebarItem .2s;-ms-animation:sidebarItem .2s;animation:sidebarItem .2s}#sidebar-menus.open>:nth-child(2){-webkit-animation:sidebarItem .4s;-moz-animation:sidebarItem .4s;-o-animation:sidebarItem .4s;-ms-animation:sidebarItem .4s;animation:sidebarItem .4s}#sidebar-menus.open>:nth-child(3){-webkit-animation:sidebarItem .6s;-moz-animation:sidebarItem .6s;-o-animation:sidebarItem .6s;-ms-animation:sidebarItem .6s;animation:sidebarItem .6s}#sidebar-menus.open>:nth-child(4){-webkit-animation:sidebarItem .8s;-moz-animation:sidebarItem .8s;-o-animation:sidebarItem .8s;-ms-animation:sidebarItem .8s;animation:sidebarItem .8s}.scroll-down-effects{-webkit-animation:scroll-down-effect 1.5s infinite;-moz-animation:scroll-down-effect 1.5s infinite;-o-animation:scroll-down-effect 1.5s infinite;-ms-animation:scroll-down-effect 1.5s infinite;animation:scroll-down-effect 1.5s infinite}.reward-main{-webkit-animation:donate_effcet .3s .1s ease both;-moz-animation:donate_effcet .3s .1s ease both;-o-animation:donate_effcet .3s .1s ease both;-ms-animation:donate_effcet .3s .1s ease both;animation:donate_effcet .3s .1s ease both}@-moz-keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@-o-keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@keyframes scroll-down-effect{0%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}50%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,-16px);-moz-transform:translate(0,-16px);-o-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}100%{opacity:.4;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}}@-moz-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes header-effect{0%{opacity:0;-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes headerNoOpacity{0%{-webkit-transform:translateY(-50px);-moz-transform:translateY(-50px);-o-transform:translateY(-50px);-ms-transform:translateY(-50px);transform:translateY(-50px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes bottom-top{0%{opacity:0;-webkit-transform:translateY(50px);-moz-transform:translateY(50px);-o-transform:translateY(50px);-ms-transform:translateY(50px);transform:translateY(50px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-o-keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes titleScale{0%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-webkit-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-o-keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@keyframes search_close{0%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-moz-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-webkit-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-o-keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@keyframes to_show{0%{opacity:0}100%{opacity:1;-ms-filter:none;filter:none}}@-moz-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-webkit-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-o-keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@keyframes to_hide{0%{opacity:1;-ms-filter:none;filter:none}100%{opacity:0}}@-moz-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-webkit-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-o-keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@keyframes ribbon_to_show{0%{opacity:0}100%{opacity:.6}}@-moz-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes avatar_turn_around{from{-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes sub_menus{0%{opacity:0;-webkit-transform:translateY(10px);-moz-transform:translateY(10px);-o-transform:translateY(10px);-ms-transform:translateY(10px);transform:translateY(10px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes donate_effcet{0%{opacity:0;-webkit-transform:translateY(-20px);-moz-transform:translateY(-20px);-o-transform:translateY(-20px);-ms-transform:translateY(-20px);transform:translateY(-20px)}100%{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-moz-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@-o-keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}@keyframes sidebarItem{0%{-webkit-transform:translateX(200px);-moz-transform:translateX(200px);-o-transform:translateX(200px);-ms-transform:translateX(200px);transform:translateX(200px)}100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}}:root{--global-font-size:14px;--global-bg:#fff;--font-color:#4c4948;--hr-border:#a4d8fa;--hr-before-color:#80c8f8;--search-bg:#f6f8fa;--search-input-color:#4c4948;--search-a-color:#4c4948;--preloader-bg:#37474f;--preloader-color:#fff;--tab-border-color:#f0f0f0;--tab-botton-bg:#f0f0f0;--tab-botton-color:#1f2d3d;--tab-button-hover-bg:#dcdcdc;--tab-button-active-bg:#fff;--card-bg:#fff;--sidebar-bg:#f6f8fa;--btn-hover-color:#ff7242;--btn-color:#fff;--btn-bg:#49b1f5;--text-bg-hover:rgba(73,177,245,0.7);--light-grey:#eee;--dark-grey:#cacaca;--white:#fff;--text-highlight-color:#1f2d3d;--blockquote-color:#6a737d;--blockquote-bg:rgba(73,177,245,0.1);--reward-pop:#f5f5f5;--toc-link-color:#666261;--card-box-shadow:0 3px 8px 6px rgba(7,17,27,0.05);--card-hover-box-shadow:0 3px 8px 6px rgba(7,17,27,0.09);--pseudo-hover:#ff7242;--headline-presudo:#a0a0a0;--scrollbar-color:#49b1f5;--default-bg-color:#49b1f5;--zoom-bg:#fff;--mark-bg:rgba(0,0,0,0.3)}body{position:relative;min-height:100%;background:var(--global-bg);color:var(--font-color);font-size:var(--global-font-size);font-family:ZQKJYT;line-height:2;-webkit-tap-highlight-color:transparent}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-thumb{background:var(--scrollbar-color)}::-webkit-scrollbar-track{background-color:transparent}*{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color) transparent}input::placeholder{color:var(--font-color)}#web_bg{position:fixed;z-index:-999;width:100%;height:100%;background:0 0;background-attachment:local;background-position:center;background-size:cover;background-repeat:no-repeat}h1,h2,h3,h4,h5,h6{position:relative;margin:20px 0 14px;color:var(--text-highlight-color);font-weight:700}h1 code,h2 code,h3 code,h4 code,h5 code,h6 code{font-size:inherit!important}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.table-wrap{overflow-x:scroll;margin:0 0 20px}table{display:table;width:100%;border-spacing:0;border-collapse:collapse;empty-cells:show}table thead{background:rgba(153,169,191,.1)}table td,table th{padding:6px 12px;border:1px solid var(--light-grey);vertical-align:middle}::selection{background:#00c4b6;color:#f7f7f7}button{padding:0;outline:0;border:none;background:0 0;cursor:pointer;touch-action:manipulation}a{color:#99a9bf;text-decoration:none;word-wrap:break-word;-webkit-transition:all .2s;-moz-transition:all .2s;-o-transition:all .2s;-ms-transition:all .2s;transition:all .2s;overflow-wrap:break-word}a:hover{color:#49b1f5}#aside-content .author-info__description,#aside-content .author-info__name,#site-subtitle,#site-title,.site-name{font-family:ZQKJYT}.is-center{text-align:center}.pull-left{float:left}.pull-right{float:right}img:not([src]),img[src='']{opacity:0}.img-alt{margin:-10px 0 10px;color:#858585}.img-alt:hover{text-decoration:none!important}blockquote{margin:0 0 20px;padding:12px 15px;border-left:3px solid #49b1f5;background-color:var(--blockquote-bg);color:var(--blockquote-color)}blockquote footer cite:before{padding:0 5px;content:'—'}blockquote>:last-child{margin-bottom:0!important}:root{--hl-color:#90a4ae;--hl-bg:#f6f8fa;--hltools-bg:#e6ebf1;--hltools-color:#90a4ae;--hlnumber-bg:#f6f8fa;--hlnumber-color:rgba(144,164,174,0.5);--hlscrollbar-bg:#dce4eb;--hlexpand-bg:linear-gradient(180deg, rgba(246,248,250,0.6), rgba(246,248,250,0.9))}[data-theme=dark]{--hl-color:rgba(255,255,255,0.7);--hl-bg:#171717;--hltools-bg:#1a1a1a;--hltools-color:#90a4ae;--hlnumber-bg:#171717;--hlnumber-color:rgba(255,255,255,0.4);--hlscrollbar-bg:#1f1f1f;--hlexpand-bg:linear-gradient(180deg, rgba(23,23,23,0.6), rgba(23,23,23,0.9))}figure.highlight table{scrollbar-color:var(--hlscrollbar-bg) transparent}figure.highlight table::-webkit-scrollbar-thumb{background:var(--hlscrollbar-bg)}figure.highlight pre .deletion{color:#bf42bf}figure.highlight pre .addition{color:#105ede}figure.highlight pre .meta{color:#7c4dff}figure.highlight pre .comment{color:rgba(149,165,166,.8)}figure.highlight pre .attribute,figure.highlight pre .css .class,figure.highlight pre .css .id,figure.highlight pre .css .pseudo,figure.highlight pre .html .doctype,figure.highlight pre .regexp,figure.highlight pre .ruby .constant,figure.highlight pre .tag .name,figure.highlight pre .variable,figure.highlight pre .xml .doctype,figure.highlight pre .xml .pi,figure.highlight pre .xml .tag .title{color:#e53935}figure.highlight pre .tag{color:#39adb5}figure.highlight pre .command,figure.highlight pre .constant,figure.highlight pre .literal,figure.highlight pre .number,figure.highlight pre .params,figure.highlight pre .preprocessor{color:#f76d47}figure.highlight pre .built_in{color:#ffb62c}figure.highlight pre .css .rules .attribute,figure.highlight pre .formula,figure.highlight pre .header,figure.highlight pre .inheritance,figure.highlight pre .number,figure.highlight pre .ruby .class .title,figure.highlight pre .ruby .symbol,figure.highlight pre .special,figure.highlight pre .string,figure.highlight pre .value,figure.highlight pre .xml .cdata{color:#91b859}figure.highlight pre .css .hexcolor,figure.highlight pre .keyword,figure.highlight pre .title{color:#39adb5}figure.highlight pre .coffeescript .title,figure.highlight pre .function,figure.highlight pre .javascript .title,figure.highlight pre .perl .sub,figure.highlight pre .python .decorator,figure.highlight pre .python .title,figure.highlight pre .ruby .function .title,figure.highlight pre .ruby .title .keyword{color:#6182b8}figure.highlight pre .javascript .function,figure.highlight pre .tag .attr{color:#7c4dff}#article-container figure.highlight .line.marked{background-color:rgba(128,203,196,.251)}#article-container figure.highlight table{display:block;overflow:auto;border:none}#article-container figure.highlight table td{padding:0;border:none}#article-container figure.highlight .gutter pre{padding-right:10px;padding-left:10px;background-color:var(--hlnumber-bg);color:var(--hlnumber-color);text-align:right}#article-container figure.highlight .code pre{padding-right:10px;padding-left:10px;width:100%}#article-container figure.highlight,#article-container pre{overflow:auto;margin:0 0 20px;padding:0;background:var(--hl-bg);color:var(--hl-color);line-height:1.6}#article-container code,#article-container pre{font-size:var(--global-font-size);font-family:TXAQTJ!important}#article-container code{padding:2px 4px;background:rgba(27,31,35,.05);color:#f47466}#article-container pre{padding:10px 20px}#article-container pre code{padding:0;background:0 0;color:var(--hl-color);text-shadow:none}#article-container figure.highlight{position:relative}#article-container figure.highlight pre{margin:0;padding:8px 0;border:none}#article-container figure.highlight .caption,#article-container figure.highlight figcaption{padding:6px 0 2px 14px;font-size:var(--global-font-size);line-height:1em}#article-container figure.highlight .caption a,#article-container figure.highlight figcaption a{float:right;padding-right:10px;color:var(--hl-color)}#article-container figure.highlight .caption a:hover,#article-container figure.highlight figcaption a:hover{border-bottom-color:var(--hl-color)}#article-container figure.highlight.copy-true{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all;-webkit-user-select:all}#article-container figure.highlight.copy-true>pre,#article-container figure.highlight.copy-true>table{display:block!important;opacity:0}#article-container .highlight-tools{position:relative;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;overflow:hidden;min-height:24px;height:2.15em;background:var(--hltools-bg);color:var(--hltools-color);font-size:var(--global-font-size)}#article-container .highlight-tools.closed~*{display:none}#article-container .highlight-tools.closed .expand{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:rotate(-90deg)!important;-moz-transform:rotate(-90deg)!important;-o-transform:rotate(-90deg)!important;-ms-transform:rotate(-90deg)!important;transform:rotate(-90deg)!important}#article-container .highlight-tools .expand{position:absolute;padding:.57em .7em;cursor:pointer;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#article-container .highlight-tools .expand+.code-lang{left:1.7em}#article-container .highlight-tools .code-lang{position:absolute;left:14px;text-transform:uppercase;font-weight:700;font-size:1.15em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}#article-container .highlight-tools .copy-notice{position:absolute;right:2.4em;opacity:0;-webkit-transition:opacity .4s;-moz-transition:opacity .4s;-o-transition:opacity .4s;-ms-transition:opacity .4s;transition:opacity .4s}#article-container .highlight-tools .copy-button{position:absolute;right:14px;cursor:pointer;-webkit-transition:color .2s;-moz-transition:color .2s;-o-transition:color .2s;-ms-transition:color .2s;transition:color .2s}#article-container .highlight-tools .copy-button:hover{color:#49b1f5}#article-container .gutter{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}#article-container .gist table{width:auto}#article-container .gist table td{border:none}#article-container figure.highlight{margin:0 0 24px;border-radius:7px;-webkit-box-shadow:0 5px 10px 0 rgba(144,164,174,.4);box-shadow:0 5px 10px 0 rgba(144,164,174,.4);-webkit-transform:translateZ(0)}#article-container figure.highlight .highlight-tools:after{position:absolute;left:14px;width:12px;height:12px;border-radius:50%;background:#fc625d;-webkit-box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;box-shadow:20px 0 #fdbc40,40px 0 #35cd4b;content:' '}#article-container figure.highlight .highlight-tools .expand{right:0}#article-container figure.highlight .highlight-tools .expand.closed{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:rotate(90deg)!important;-moz-transform:rotate(90deg)!important;-o-transform:rotate(90deg)!important;-ms-transform:rotate(90deg)!important;transform:rotate(90deg)!important}#article-container figure.highlight .highlight-tools .expand~.copy-notice{right:3.45em}#article-container figure.highlight .highlight-tools .expand~.copy-button{right:2.1em}#article-container figure.highlight .highlight-tools .code-lang{left:75px}#article-container .code-expand-btn{position:absolute;bottom:0;z-index:10;width:100%;background:var(--hlexpand-bg);text-align:center;font-size:var(--global-font-size);cursor:pointer}#article-container .code-expand-btn i{padding:6px 0;color:var(--hlnumber-color);-webkit-animation:code-expand-key 1.2s infinite;-moz-animation:code-expand-key 1.2s infinite;-o-animation:code-expand-key 1.2s infinite;-ms-animation:code-expand-key 1.2s infinite;animation:code-expand-key 1.2s infinite}#article-container .code-expand-btn.expand-done>i{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#article-container .code-expand-btn.expand-done+pre,#article-container .code-expand-btn.expand-done+table{margin-bottom:1.8em}#article-container .code-expand-btn:not(.expand-done)~pre,#article-container .code-expand-btn:not(.expand-done)~table{overflow:hidden;height:600px}@-moz-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@-webkit-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@-o-keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}@keyframes code-expand-key{0%{opacity:.6}50%{opacity:.1}100%{opacity:.6}}.article-sort{margin-left:10px;padding-left:20px;border-left:2px solid #aadafa}.article-sort-title{position:relative;margin-left:10px;padding-bottom:20px;padding-left:20px;font-size:1.72em}.article-sort-title:hover:before{border-color:var(--pseudo-hover)}.article-sort-title:before{position:absolute;top:calc(((100% - 36px)/ 2));left:-9px;z-index:1;width:10px;height:10px;border:5px solid #49b1f5;border-radius:10px;background:var(--card-bg);content:'';line-height:10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-title:after{position:absolute;bottom:0;left:0;z-index:0;width:2px;height:1.5em;background:#aadafa;content:''}.article-sort-item{position:relative;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;margin:0 0 20px 10px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-item:hover:before{border-color:var(--pseudo-hover)}.article-sort-item:before{position:absolute;left:calc(-20px - 17px);width:6px;height:6px;border:3px solid #49b1f5;border-radius:6px;background:var(--card-bg);content:'';-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.article-sort-item.no-article-cover{height:80px}.article-sort-item.no-article-cover .article-sort-item-info{padding:0}.article-sort-item.year{font-size:1.43em}.article-sort-item.year:hover:before{border-color:#49b1f5}.article-sort-item.year:before{border-color:var(--pseudo-hover)}.article-sort-item-time{color:#858585;font-size:95%}.article-sort-item-time time{padding-left:6px;cursor:default}.article-sort-item-title{color:var(--font-color);font-size:1.1em;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-line-clamp:2}.article-sort-item-title:hover{color:#49b1f5;-webkit-transform:translateX(10px);-moz-transform:translateX(10px);-o-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}.article-sort-item-img{overflow:hidden;width:80px;height:80px}.article-sort-item-info{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 16px}.category-lists .category-title{font-size:2.57em}@media screen and (max-width:768px){.category-lists .category-title{font-size:2em}}.category-lists .category-list{margin-bottom:0}.category-lists .category-list a{color:var(--font-color)}.category-lists .category-list a:hover{color:#49b1f5}.category-lists .category-list .category-list-count{margin-left:8px;color:#858585}.category-lists .category-list .category-list-count:before{content:'('}.category-lists .category-list .category-list-count:after{content:')'}.category-lists ul{padding:0 0 0 20px}.category-lists ul ul{padding-left:4px}.category-lists ul li{position:relative;margin:6px 0;padding:.12em .4em .12em 1.4em}#body-wrap{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;min-height:100vh}.layout{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1 auto;-ms-flex:1 auto;flex:1 auto;margin:0 auto;padding:40px 15px;max-width:1200px;width:100%}@media screen and (max-width:900px){.layout{-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}}@media screen and (max-width:768px){.layout{padding:20px 5px}}@media screen and (min-width:2000px){.layout{max-width:70%}}.layout>div:first-child:not(.recent-posts){-webkit-align-self:flex-start;align-self:flex-start;-ms-flex-item-align:start;padding:50px 40px}@media screen and (max-width:768px){.layout>div:first-child:not(.recent-posts){padding:36px 14px}}.layout>div:first-child{width:74%;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}@media screen and (max-width:900px){.layout>div:first-child{width:100%!important}}.layout.hide-aside{max-width:1000px}@media screen and (min-width:2000px){.layout.hide-aside{max-width:1300px}}.layout.hide-aside>div{width:100%!important}.apple #page-header.full_page{background-attachment:scroll!important}.apple .avatar-img,.apple .flink-item-icon,.apple .recent-post-item{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-o-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}#article-container .flink{margin-bottom:20px}#article-container .flink .flink-list{overflow:auto;padding:10px 10px 0;text-align:center}#article-container .flink .flink-list>.flink-list-item{position:relative;float:left;overflow:hidden;margin:15px 7px;width:calc(100% / 3 - 15px);height:90px;border-radius:8px;line-height:17px;-webkit-transform:translateZ(0)}@media screen and (max-width:1024px){#article-container .flink .flink-list>.flink-list-item{width:calc(50% - 15px)!important}}@media screen and (max-width:600px){#article-container .flink .flink-list>.flink-list-item{width:calc(100% - 15px)!important}}#article-container .flink .flink-list>.flink-list-item:hover .flink-item-icon{margin-left:-10px;width:0}#article-container .flink .flink-list>.flink-list-item:before{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;background:var(--text-bg-hover);content:'';-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;-ms-transition:-ms-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0)}#article-container .flink .flink-list>.flink-list-item:active:before,#article-container .flink .flink-list>.flink-list-item:focus:before,#article-container .flink .flink-list>.flink-list-item:hover:before{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}#article-container .flink .flink-list>.flink-list-item a{color:var(--font-color);text-decoration:none}#article-container .flink .flink-list>.flink-list-item a .flink-item-icon{float:left;overflow:hidden;margin:15px 10px;width:60px;height:60px;border-radius:35px;-webkit-transition:width .3s ease-out;-moz-transition:width .3s ease-out;-o-transition:width .3s ease-out;-ms-transition:width .3s ease-out;transition:width .3s ease-out}#article-container .flink .flink-list>.flink-list-item a .flink-item-icon img{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .3s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .3s;-o-transition:filter 375ms ease-in .2s,-o-transform .3s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .3s;transition:filter 375ms ease-in .2s,transform .3s;object-fit:cover}#article-container .flink .flink-list>.flink-list-item a .img-alt{display:none}#article-container .flink .flink-item-name{padding:16px 10px 0 0;height:40px;font-weight:700;font-size:1.43em}#article-container .flink .flink-item-desc{padding:16px 10px 16px 0;height:50px;font-size:.93em}#article-container .flink .flink-name{margin-bottom:5px;font-weight:700;font-size:1.5em}#recent-posts>.recent-post-item:not(:first-child){margin-top:20px}#recent-posts>.recent-post-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-o-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;overflow:hidden;height:16.8em}@media screen and (max-width:768px){#recent-posts>.recent-post-item{-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:auto}}#recent-posts>.recent-post-item:hover img.post-bg{-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}#recent-posts>.recent-post-item.ads-wrap{display:block!important;height:auto!important}#recent-posts>.recent-post-item .post_cover{overflow:hidden;width:42%;height:100%}@media screen and (max-width:768px){#recent-posts>.recent-post-item .post_cover{width:100%;height:230px}}#recent-posts>.recent-post-item .post_cover.right{-webkit-box-ordinal-group:1;-moz-box-ordinal-group:1;-o-box-ordinal-group:1;-ms-flex-order:1;-webkit-order:1;order:1}@media screen and (max-width:768px){#recent-posts>.recent-post-item .post_cover.right{-webkit-box-ordinal-group:0;-moz-box-ordinal-group:0;-o-box-ordinal-group:0;-ms-flex-order:0;-webkit-order:0;order:0}}#recent-posts>.recent-post-item>.recent-post-info{padding:0 40px;width:58%}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info{padding:20px 20px 30px;width:100%}}#recent-posts>.recent-post-item>.recent-post-info.no-cover{width:100%}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info.no-cover{padding:30px 20px}}#recent-posts>.recent-post-item>.recent-post-info>.article-title{color:var(--text-highlight-color);font-size:1.55em;line-height:1.4;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-line-clamp:2}#recent-posts>.recent-post-item>.recent-post-info>.article-title .sticky{margin-right:10px;color:#ff7242;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}@media screen and (max-width:768px){#recent-posts>.recent-post-item>.recent-post-info>.article-title{font-size:1.43em}}#recent-posts>.recent-post-item>.recent-post-info>.article-title:hover{color:#49b1f5}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap{margin:6px 0;color:#858585;font-size:.9em}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap>.post-meta-date{cursor:default}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap i{margin:0 4px 0 0}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .fa-spinner{margin:0}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-label{padding-right:4px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-separator{margin:0 6px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap .article-meta-link{margin:0 4px}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a{color:#858585}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a:hover{color:#49b1f5;text-decoration:underline}#recent-posts>.recent-post-item>.recent-post-info>.content{-webkit-line-clamp:2}.tag-cloud-list a{display:inline-block;padding:0 8px;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}.tag-cloud-list a:hover{color:#49b1f5!important;-webkit-transform:scale(1.1);-moz-transform:scale(1.1);-o-transform:scale(1.1);-ms-transform:scale(1.1);transform:scale(1.1)}@media screen and (max-width:768px){.tag-cloud-list a{zoom:.85}}.tag-cloud-title{font-size:2.57em}@media screen and (max-width:768px){.tag-cloud-title{font-size:2em}}h1.page-title+.tag-cloud-list{text-align:left}#aside-content{width:26%}@media screen and (min-width:900px){#aside-content{padding-left:15px}}@media screen and (max-width:900px){#aside-content{width:100%}}#aside-content>.card-widget:first-child{margin-top:0}@media screen and (max-width:900px){#aside-content>.card-widget:first-child{margin-top:20px}}#aside-content .card-widget{position:relative;overflow:hidden;margin-top:20px;padding:20px 24px}@media screen and (max-width:768px){#aside-content .card-widget:not(#card-toc){display:none}}#aside-content .card-info .author-info__name{font-weight:500;font-size:1.57em}#aside-content .card-info .author-info__description{margin-top:-.42em}#aside-content .card-info .card-info-data{margin:14px 0 4px}#aside-content .card-info .card-info-social-icons{margin:6px 0 -6px}#aside-content .card-info .card-info-social-icons .social-icon{margin:0 10px;color:var(--font-color);font-size:1.4em}#aside-content .card-info .card-info-social-icons i{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#aside-content .card-info .card-info-social-icons i:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}#aside-content .card-info #card-info-btn{display:block;margin-top:14px;background-color:var(--btn-bg);color:var(--btn-color);text-align:center;line-height:2.4}#aside-content .card-info #card-info-btn:hover{background-color:var(--btn-hover-color)}#aside-content .card-info #card-info-btn span{padding-left:10px}#aside-content .item-headline{padding-bottom:6px;font-size:1.2em}#aside-content .item-headline span{margin-left:6px}@media screen and (min-width:900px){#aside-content .sticky_layout{position:sticky;position:-webkit-sticky;top:20px;-webkit-transition:top .3s;-moz-transition:top .3s;-o-transition:top .3s;-ms-transition:top .3s;transition:top .3s}}#aside-content .card-tag-cloud a{display:inline-block;padding:0 4px}#aside-content .card-tag-cloud a:hover{color:#49b1f5!important}#aside-content .aside-list>span{display:block;margin-bottom:10px;text-align:center}#aside-content .aside-list>.aside-list-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:6px 0}#aside-content .aside-list>.aside-list-item:first-child{padding-top:0}#aside-content .aside-list>.aside-list-item:not(:last-child){border-bottom:1px dashed #f5f5f5}#aside-content .aside-list>.aside-list-item:last-child{padding-bottom:0}#aside-content .aside-list>.aside-list-item .thumbnail{overflow:hidden;width:4.2em;height:4.2em}#aside-content .aside-list>.aside-list-item .content{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding-left:10px;word-break:break-all}#aside-content .aside-list>.aside-list-item .content>.name{-webkit-line-clamp:1}#aside-content .aside-list>.aside-list-item .content>.name,#aside-content .aside-list>.aside-list-item .content>time{display:block;color:#858585;font-size:85%}#aside-content .aside-list>.aside-list-item .content>.comment,#aside-content .aside-list>.aside-list-item .content>.title{color:var(--font-color);font-size:95%;line-height:1.5;-webkit-line-clamp:2}#aside-content .aside-list>.aside-list-item .content>.comment:hover,#aside-content .aside-list>.aside-list-item .content>.title:hover{color:#49b1f5}#aside-content .aside-list>.aside-list-item.no-cover{min-height:4.4em}#aside-content .card-archives ul.card-archive-list,#aside-content .card-categories ul.card-category-list{margin:0;padding:0;list-style:none}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a,#aside-content .card-categories ul.card-category-list>.card-category-list-item a{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:horizontal;-moz-box-orient:horizontal;-o-box-orient:horizontal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;padding:3px 10px;color:var(--font-color);-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;-ms-transition:all .4s;transition:all .4s}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{padding:3px 17px;background-color:var(--text-bg-hover)}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:first-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:first-child{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#aside-content .card-categories .card-category-list.child{padding:0 0 0 16px}#aside-content .card-categories .card-category-list>.parent>a.expand i{-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-o-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}#aside-content .card-categories .card-category-list>.parent>a.expand+.child{display:block}#aside-content .card-categories .card-category-list>.parent>a .card-category-list-name{width:70%!important}#aside-content .card-categories .card-category-list>.parent>a .card-category-list-count{width:calc(100% - 70% - 20px);text-align:right}#aside-content .card-categories .card-category-list>.parent>a i{float:right;margin-right:-.5em;padding:.5em;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s;-webkit-transform:rotate(0);-moz-transform:rotate(0);-o-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0)}#aside-content .card-webinfo .webinfo .webinfo-item{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:2px 10px 0}#aside-content .card-webinfo .webinfo .webinfo-item div:first-child{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding-right:20px}@media screen and (min-width:901px){#aside-content #card-toc{right:0!important}}@media screen and (max-width:900px){#aside-content #card-toc{position:fixed;right:55px;bottom:30px;z-index:100;max-width:380px;max-height:calc(100% - 60px);width:calc(100% - 80px);-webkit-transition:none;-moz-transition:none;-o-transition:none;-ms-transition:none;transition:none;-webkit-transform:scale(0);-moz-transform:scale(0);-o-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:right bottom;-moz-transform-origin:right bottom;-o-transform-origin:right bottom;-ms-transform-origin:right bottom;transform-origin:right bottom}#aside-content #card-toc.open{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}#aside-content #card-toc .toc-percentage{float:right;margin-top:-9px;color:#a9a9a9;font-style:italic;font-size:140%}#aside-content #card-toc .toc-content{overflow-y:scroll;overflow-y:overlay;margin:0 -24px;max-height:calc(100vh - 120px);width:calc(100% + 48px)}@media screen and (max-width:900px){#aside-content #card-toc .toc-content{max-height:calc(100vh - 140px)}}#aside-content #card-toc .toc-content>*{margin:0 20px!important}#aside-content #card-toc .toc-content>*>.toc-item>.toc-child{margin-left:10px;padding-left:10px;border-left:1px solid var(--dark-grey)}#aside-content #card-toc .toc-content:not(.is-expand) .toc-child{display:none}@media screen and (max-width:900px){#aside-content #card-toc .toc-content:not(.is-expand) .toc-child{display:block!important}}#aside-content #card-toc .toc-content:not(.is-expand) .toc-item.active .toc-child{display:block}#aside-content #card-toc .toc-content li,#aside-content #card-toc .toc-content ol{list-style:none}#aside-content #card-toc .toc-content>ol{padding:0!important}#aside-content #card-toc .toc-content ol{margin:0;padding-left:18px}#aside-content #card-toc .toc-content .toc-link{display:block;margin:4px 0;padding:1px 6px;color:var(--toc-link-color);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#aside-content #card-toc .toc-content .toc-link:hover{color:#49b1f5}#aside-content #card-toc .toc-content .toc-link.active{background:#00c4b6;color:#fff}#aside-content .sticky_layout:only-child>:first-child{margin-top:0}#aside-content .card-more-btn{float:right;color:inherit}#aside-content .card-more-btn:hover{-webkit-animation:more-btn-move 1s infinite;-moz-animation:more-btn-move 1s infinite;-o-animation:more-btn-move 1s infinite;-ms-animation:more-btn-move 1s infinite;animation:more-btn-move 1s infinite}#aside-content .card-announcement .item-headline i{color:red}.avatar-img{overflow:hidden;margin:0 auto;width:110px;height:110px;border-radius:70px}.avatar-img img{width:100%;height:100%;-webkit-transition:filter 375ms ease-in .2s,-webkit-transform .3s;-moz-transition:filter 375ms ease-in .2s,-moz-transform .3s;-o-transition:filter 375ms ease-in .2s,-o-transform .3s;-ms-transition:filter 375ms ease-in .2s,-ms-transform .3s;transition:filter 375ms ease-in .2s,transform .3s;object-fit:cover}.avatar-img img:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}.site-data{display:table;width:100%;table-layout:fixed}.site-data>a{display:table-cell}.site-data>a div{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}.site-data>a:hover div{color:#49b1f5!important}.site-data>a .headline{color:var(--font-color)}.site-data>a .length-num{margin-top:-.32em;color:var(--text-highlight-color);font-size:1.4em}@media screen and (min-width:900px){html.hide-aside .layout{-webkit-box-pack:center;-moz-box-pack:center;-o-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}html.hide-aside .layout>.aside-content{display:none}html.hide-aside .layout>div:first-child{width:80%}}.page .sticky_layout{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-orient:vertical;-moz-box-orient:vertical;-o-box-orient:vertical;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}@-moz-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-webkit-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-o-keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@keyframes more-btn-move{0%,100%{-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}50%{-webkit-transform:translateX(3px);-moz-transform:translateX(3px);-o-transform:translateX(3px);-ms-transform:translateX(3px);transform:translateX(3px)}}@-moz-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-webkit-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-o-keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@keyframes toc-open{0%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}100%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}@-moz-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-webkit-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@-o-keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}@keyframes toc-close{0%{-webkit-transform:scale(1);-moz-transform:scale(1);-o-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}100%{-webkit-transform:scale(.7);-moz-transform:scale(.7);-o-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}}#post-comment .comment-head{margin-bottom:20px}#post-comment .comment-head:after{display:block;clear:both;content:''}#post-comment .comment-head .comment-headline{display:inline-block;vertical-align:middle;font-weight:700;font-size:1.43em}#post-comment .comment-head .comment-switch{display:inline-block;float:right;margin:2px auto 0;padding:4px 16px;width:max-content;border-radius:8px;background:#f6f8fa}#post-comment .comment-head .comment-switch .first-comment{color:#49b1f5}#post-comment .comment-head .comment-switch .second-comment{color:#ff7242}#post-comment .comment-head .comment-switch #switch-btn{position:relative;display:inline-block;margin:-4px 8px 0;width:42px;height:22px;border-radius:34px;background-color:#49b1f5;vertical-align:middle;cursor:pointer;-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;-ms-transition:.4s;transition:.4s}#post-comment .comment-head .comment-switch #switch-btn:before{position:absolute;bottom:4px;left:4px;width:14px;height:14px;border-radius:50%;background-color:#fff;content:'';-webkit-transition:.4s;-moz-transition:.4s;-o-transition:.4s;-ms-transition:.4s;transition:.4s}#post-comment .comment-wrap>div{-webkit-animation:tabshow .5s;-moz-animation:tabshow .5s;-o-animation:tabshow .5s;-ms-animation:tabshow .5s;animation:tabshow .5s}#post-comment .comment-wrap>div:nth-child(2){display:none}#post-comment.move #switch-btn{background-color:#ff7242}#post-comment.move #switch-btn:before{-webkit-transform:translateX(20px);-moz-transform:translateX(20px);-o-transform:translateX(20px);-ms-transform:translateX(20px);transform:translateX(20px)}#post-comment.move .comment-wrap>div:first-child{display:none}#post-comment.move .comment-wrap>div:last-child{display:block}.fixed-card-widget:not(#card-toc){visibility:visible!important;display:block!important;position:fixed!important;bottom:0;left:0;top:0;right:0;margin:auto;margin-bottom:auto!important;margin-top:auto!important;max-width:300px;max-height:500px;width:auto;height:auto;overflow-y:scroll;z-index:999;-webkit-animation:rotateX .5s ease;-moz-animation:rotateX .5s ease;-o-animation:rotateX .5s ease;-ms-animation:rotateX .5s ease;animation:rotateX .5s ease;-webkit-animation-fill-mode:forwards;-moz-animation-fill-mode:forwards;-o-animation-fill-mode:forwards;-ms-animation-fill-mode:forwards;animation-fill-mode:forwards}.fixed-card-widget:not(#card-toc)::-webkit-scrollbar{width:0}.card-shuo.fixed-card-widget #artitalk_main{max-height:460px;overflow:scroll}.card-shuo.fixed-card-widget #artitalk_main::-webkit-scrollbar{display:none}.card-shuo.fixed-card-widget #operare_artitalk .c2{z-index:1000}.card-tags.fixed-card-widget .card-tag-cloud{max-height:460px;overflow:scroll}.card-tags.fixed-card-widget .card-tag-cloud::-webkit-scrollbar{display:none}@media screen and (max-width:768px){div#fixedcard-dashboard{display:-webkit-box!important;display:-moz-box!important;display:-webkit-flex!important;display:-ms-flexbox!important;display:box!important;display:flex!important}}div#fixedcard-dashboard{position:fixed;top:150px;width:fit-content;height:40px;opacity:.3;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;display:none;background:rgba(255,255,255,.9);padding:5px 10px;border-top-right-radius:20px;border-bottom-right-radius:20px;z-index:1000}div#fixedcard-dashboard:hover{opacity:1;-ms-filter:none;filter:none}div#fixedcard-dashboard:hover button.fixedcard-activebtn{width:30px;opacity:1;-ms-filter:none;filter:none;pointer-events:all}button.fixedcard-activebtn{width:0;height:30px;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;opacity:0;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:distribute;-moz-box-pack:distribute;-o-box-pack:distribute;-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around;pointer-events:none;color:#757273}.fixedcard-user-avatar{display:inline-block}.fixedcard-user-avatar img.fixedcard-user-avatar-img{width:30px;height:30px;border-radius:50%}[data-theme=dark] div#fixedcard-dashboard{background:rgba(55,55,55,.9)}[data-theme=dark] button.fixedcard-activebtn{color:#bcbdbd}div#quit-box{position:fixed;display:block;left:0;top:0;width:100vh;height:100vh;z-index:99;background:rgba(25,25,25,.3)}[data-theme=dark] div#quit-box{background:rgba(147,146,128,.3)}@-moz-keyframes rotateX{from{-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-o-transform:rotateX(90deg);-ms-transform:rotateX(90deg);transform:rotateX(90deg)}to{-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-o-transform:rotateX(0);-ms-transform:rotateX(0);transform:rotateX(0)}}@-webkit-keyframes rotateX{from{-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-o-transform:rotateX(90deg);-ms-transform:rotateX(90deg);transform:rotateX(90deg)}to{-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-o-transform:rotateX(0);-ms-transform:rotateX(0);transform:rotateX(0)}}@-o-keyframes rotateX{from{-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-o-transform:rotateX(90deg);-ms-transform:rotateX(90deg);transform:rotateX(90deg)}to{-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-o-transform:rotateX(0);-ms-transform:rotateX(0);transform:rotateX(0)}}@keyframes rotateX{from{-webkit-transform:rotateX(90deg);-moz-transform:rotateX(90deg);-o-transform:rotateX(90deg);-ms-transform:rotateX(90deg);transform:rotateX(90deg)}to{-webkit-transform:rotateX(0);-moz-transform:rotateX(0);-o-transform:rotateX(0);-ms-transform:rotateX(0);transform:rotateX(0)}}#footer{position:relative;background-color:#49b1f5;background-attachment:scroll;background-position:bottom;background-size:cover}#footer-wrap{position:relative;padding:40px 20px;color:var(--light-grey);text-align:center}#footer-wrap a{color:var(--light-grey)}#footer-wrap a:hover{text-decoration:underline}#footer-wrap .footer-separator{margin:0 4px}#footer-wrap .icp-icon{padding:0 4px;max-height:1.4em;width:auto;vertical-align:text-bottom}#page-header{position:relative;width:100%;background-color:#49b1f5;background-position:center center;background-size:cover;background-repeat:no-repeat;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header:not(.not-top-img):before{position:absolute;width:100%;height:100%;background-color:var(--mark-bg);content:''}#page-header.full_page{height:100vh;background-attachment:fixed}#page-header.full_page #site-info{position:absolute;top:43%;padding:0 10px;width:100%}#page-header #scroll-down .scroll-down-effects,#page-header #site-subtitle,#page-header #site-title{text-align:center;text-shadow:2px 2px 4px rgba(0,0,0,.15);line-height:1.5}#page-header #site-title{margin:0;color:var(--white);font-size:1.85em}@media screen and (min-width:768px){#page-header #site-title{font-size:2.85em}}#page-header #site-subtitle{color:var(--light-grey);font-size:1.15em}@media screen and (min-width:768px){#page-header #site-subtitle{font-size:1.72em}}#page-header #site_social_icons{display:none;margin:0 auto;text-align:center}@media screen and (max-width:768px){#page-header #site_social_icons{display:block}}#page-header #site_social_icons .social-icon{margin:0 10px;color:var(--light-grey);text-shadow:2px 2px 4px rgba(0,0,0,.15);font-size:1.43em}#page-header #scroll-down{position:absolute;bottom:10px;width:100%;cursor:pointer}#page-header #scroll-down .scroll-down-effects{position:relative;width:100%;color:var(--light-grey);font-size:20px}#page-header.not-home-page{height:400px}@media screen and (max-width:768px){#page-header.not-home-page{height:280px}}#page-header #page-site-info{position:absolute;top:200px;padding:0 10px;width:100%}@media screen and (max-width:768px){#page-header #page-site-info{top:140px}}#page-header.post-bg{height:400px}@media screen and (max-width:768px){#page-header.post-bg{height:360px}}#page-header #post-info{position:absolute;bottom:100px;padding:0 8%;width:100%;text-align:center}@media screen and (max-width:900px){#page-header #post-info{bottom:30px;text-align:left}}@media screen and (max-width:768px){#page-header #post-info{bottom:22px;padding:0 22px}}#page-header.not-top-img{margin-bottom:10px;height:60px;background:0}#page-header.not-top-img #nav{background:rgba(255,255,255,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}#page-header.not-top-img #nav .site-name,#page-header.not-top-img #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav{position:fixed;top:-60px;z-index:91;background:rgba(255,255,255,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6);-webkit-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:-moz-transform .2s ease-in-out,opacity .2s ease-in-out;-o-transition:-o-transform .2s ease-in-out,opacity .2s ease-in-out;-ms-transition:-ms-transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform .2s ease-in-out,opacity .2s ease-in-out}#page-header.nav-fixed #nav #blog-info{color:var(--font-color)}#page-header.nav-fixed #nav #blog-info:hover{color:#49b1f5}#page-header.nav-fixed #nav #blog-info .site-name{text-shadow:none}#page-header.nav-fixed #nav #toggle-menu,#page-header.nav-fixed #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav #toggle-menu:hover,#page-header.nav-fixed #nav a:hover{color:#49b1f5}#page-header.nav-fixed.fixed #nav{top:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header.nav-visible:not(.fixed) #nav{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}#page-header.nav-visible:not(.fixed)+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page-header.fixed #nav{position:fixed}#page-header.fixed+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page-header.fixed+.layout #card-toc .toc-content{max-height:calc(100vh - 170px)}#page h1.page-title{margin:8px 0 20px}#post>#post-info{margin-bottom:30px}#post>#post-info .post-title{padding-bottom:4px;border-bottom:1px solid var(--light-grey);color:var(--text-highlight-color)}#post>#post-info .post-title .post-edit-link{float:right}#post>#post-info #post-meta,#post>#post-info #post-meta a{color:#78818a}#post-info .post-title{margin-bottom:8px;color:var(--white);font-weight:400;font-size:2.5em;line-height:1.5;-webkit-line-clamp:3}@media screen and (max-width:768px){#post-info .post-title{font-size:2.1em}}#post-info .post-title .post-edit-link{padding-left:10px}#post-info #post-meta{color:var(--light-grey);font-size:95%}@media screen and (min-width:768px){#post-info #post-meta>.meta-secondline>span:first-child{display:none}}@media screen and (max-width:768px){#post-info #post-meta{font-size:90%}#post-info #post-meta>.meta-firstline,#post-info #post-meta>.meta-secondline{display:inline}}#post-info #post-meta .post-meta-separator{margin:0 5px}#post-info #post-meta .post-meta-icon{margin-right:4px}#post-info #post-meta .post-meta-label{margin-right:4px}#post-info #post-meta a{color:var(--light-grey);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#post-info #post-meta a:hover{color:#49b1f5;text-decoration:underline}#nav{position:absolute;top:0;z-index:90;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:0 36px;width:100%;height:60px;font-size:1.3em;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}@media screen and (max-width:768px){#nav{padding:0 16px}}#nav.show{opacity:1;-ms-filter:none;filter:none}#nav #blog-info{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;color:var(--light-grey)}#nav #blog-info .site-icon{margin-right:6px;height:36px;vertical-align:middle}#nav #toggle-menu{display:none;padding:2px 0 0 6px;vertical-align:top}#nav #toggle-menu:hover{color:var(--white)}#nav a{color:var(--light-grey)}#nav a:hover{color:var(--white)}#nav .site-name{text-shadow:2px 2px 4px rgba(0,0,0,.15);font-weight:700}#nav .menus_items{display:inline}#nav .menus_items .menus_item{position:relative;display:inline-block;padding:0 0 0 14px}#nav .menus_items .menus_item:hover .menus_item_child{display:block}#nav .menus_items .menus_item:hover>a>i:last-child{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#nav .menus_items .menus_item>a>i:last-child{padding:4px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#nav .menus_items .menus_item .menus_item_child{position:absolute;right:0;display:none;margin-top:8px;padding:0;width:max-content;border-radius:5px;background-color:var(--sidebar-bg);-webkit-box-shadow:0 5px 20px -4px rgba(0,0,0,.5);box-shadow:0 5px 20px -4px rgba(0,0,0,.5);-webkit-animation:sub_menus .3s .1s ease both;-moz-animation:sub_menus .3s .1s ease both;-o-animation:sub_menus .3s .1s ease both;-ms-animation:sub_menus .3s .1s ease both;animation:sub_menus .3s .1s ease both}#nav .menus_items .menus_item .menus_item_child:before{position:absolute;top:-8px;left:0;width:100%;height:20px;content:''}#nav .menus_items .menus_item .menus_item_child li{list-style:none}#nav .menus_items .menus_item .menus_item_child li:hover{background:var(--text-bg-hover)}#nav .menus_items .menus_item .menus_item_child li:first-child{border-top-left-radius:5px;border-top-right-radius:5px}#nav .menus_items .menus_item .menus_item_child li:last-child{border-bottom-right-radius:5px;border-bottom-left-radius:5px}#nav .menus_items .menus_item .menus_item_child li a{display:inline-block;padding:8px 16px;width:100%;color:var(--font-color)!important;text-shadow:none!important}#nav.hide-menu #toggle-menu{display:inline-block!important}#nav.hide-menu #toggle-menu .site-page{font-size:inherit}#nav.hide-menu .menus_items{display:none}#nav.hide-menu #search-button span{display:none}#nav #search-button{display:inline;padding:0 0 0 14px}#nav .site-page{position:relative;padding-bottom:6px;text-shadow:1px 1px 2px rgba(0,0,0,.3);font-size:.78em;cursor:pointer}#nav .site-page:not(.child):after{position:absolute;bottom:0;left:0;z-index:-1;width:0;height:3px;background-color:#80c8f8;content:'';-webkit-transition:all .3s ease-in-out;-moz-transition:all .3s ease-in-out;-o-transition:all .3s ease-in-out;-ms-transition:all .3s ease-in-out;transition:all .3s ease-in-out}#nav .site-page:not(.child):hover:after{width:100%}#page-header{position:relative;width:100%;background-color:#49b1f5;background-position:center center;background-size:cover;background-repeat:no-repeat;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#page-header:not(.not-top-img):before{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.3);content:''}#page-header.full_page{height:100vh;background-attachment:fixed}#page-header.full_page #site-info{position:absolute;top:43%;padding:0 10px;width:100%}#page-header #scroll-down .scroll-down-effects,#page-header #site-subtitle,#page-header #site-title{text-align:center;text-shadow:2px 2px 4px rgba(0,0,0,.15);line-height:1.5}#page-header #site-title{margin:0;color:var(--white);font-size:1.85em}@media screen and (min-width:768px){#page-header #site-title{font-size:2.85em}}#page-header #site-subtitle{color:var(--light-grey);font-size:1.15em}@media screen and (min-width:768px){#page-header #site-subtitle{font-size:1.72em}}#page-header #site_social_icons{display:none;margin:0 auto;width:300px;text-align:center}@media screen and (max-width:768px){#page-header #site_social_icons{display:block}}#page-header #site_social_icons .social-icon{margin:0 10px;color:var(--light-grey);text-shadow:2px 2px 4px rgba(0,0,0,.15);font-size:1.43em}#page-header #scroll-down{position:absolute;bottom:0;width:100%;cursor:pointer}#page-header #scroll-down .scroll-down-effects{position:relative;width:100%;color:var(--light-grey);font-size:30px}#page-header.not-home-page{height:400px}@media screen and (max-width:768px){#page-header.not-home-page{height:280px}}#page-header #page-site-info{position:absolute;top:200px;padding:0 10px;width:100%}@media screen and (max-width:768px){#page-header #page-site-info{top:140px}}#page-header.post-bg{height:400px}@media screen and (max-width:768px){#page-header.post-bg{height:360px}}#page-header.post-bg:before{background-color:rgba(0,0,0,.5)}#page-header #post-info{position:absolute;bottom:100px;padding:0 8%;width:100%;text-align:center}@media screen and (max-width:900px){#page-header #post-info{bottom:30px;text-align:left}}@media screen and (max-width:768px){#page-header #post-info{bottom:22px;padding:0 22px}}#page-header.not-top-img{margin-bottom:10px;height:60px;background:0}#page-header.not-top-img #nav{background:rgba(255,255,255,.6);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}#page-header.not-top-img #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav{position:fixed;top:-60px;z-index:91;background:rgba(255,255,255,.6);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6);-webkit-transition:-webkit-transform .2s ease-in-out,opacity .2s ease-in-out;-moz-transition:-moz-transform .2s ease-in-out,opacity .2s ease-in-out;-o-transition:-o-transform .2s ease-in-out,opacity .2s ease-in-out;-ms-transition:-ms-transform .2s ease-in-out,opacity .2s ease-in-out;transition:transform .2s ease-in-out,opacity .2s ease-in-out}#page-header.nav-fixed #nav #site-name,#page-header.nav-fixed #nav #toggle-menu,#page-header.nav-fixed #nav a{color:var(--font-color);text-shadow:none}#page-header.nav-fixed #nav #site-name:hover,#page-header.nav-fixed #nav #toggle-menu:hover,#page-header.nav-fixed #nav a:hover{color:#49b1f5}#page-header.nav-visible #nav{-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s;-webkit-transform:translate3d(0,100%,0);-moz-transform:translate3d(0,100%,0);-o-transform:translate3d(0,100%,0);-ms-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}#page-header.nav-visible+.layout>.aside-content>.sticky_layout{top:70px;-webkit-transition:top .5s;-moz-transition:top .5s;-o-transition:top .5s;-ms-transition:top .5s;transition:top .5s}#page h1.page-title{margin:8px 0 20px}#post>#post-info{margin-bottom:30px}#post>#post-info .post-title{padding-bottom:4px;border-bottom:1px solid var(--light-grey);color:var(--text-highlight-color)}#post>#post-info .post-title .post-edit-link{float:right}#post>#post-info #post-meta,#post>#post-info #post-meta a{color:#78818a}#post-info .post-title{margin-bottom:8px;color:var(--white);font-weight:400;font-size:2.5em;line-height:1.5;-webkit-line-clamp:3}@media screen and (max-width:768px){#post-info .post-title{font-size:2.1em}}#post-info .post-title .post-edit-link{padding-left:10px}#post-info #post-meta{color:var(--light-grey);font-size:95%}@media screen and (min-width:768px){#post-info #post-meta>.meta-secondline>span:first-child{display:none}}@media screen and (max-width:768px){#post-info #post-meta{font-size:90%}#post-info #post-meta>.meta-firstline,#post-info #post-meta>.meta-secondline{display:inline}}#post-info #post-meta .post-meta-separator{margin:0 5px}#post-info #post-meta .post-meta-icon{margin-right:4px}#post-info #post-meta .post-meta-label{margin-right:4px}#post-info #post-meta a{color:var(--light-grey);-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;-ms-transition:all .3s ease-out;transition:all .3s ease-out}#post-info #post-meta a:hover{color:#49b1f5;text-decoration:underline}#nav{position:absolute;top:0;z-index:90;display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-align:center;-moz-box-align:center;-o-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;padding:0 36px;width:100%;height:60px;font-size:1.3em;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}@media screen and (max-width:768px){#nav{padding:0 16px}}#nav.show{opacity:1;-ms-filter:none;filter:none}#nav #blog_name{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}#nav #toggle-menu{display:none;padding:2px 0 0 6px;vertical-align:top}#nav #toggle-menu:hover{color:var(--white)}#nav a{color:var(--light-grey)}#nav a:hover{color:var(--white)}#nav #site-name{text-shadow:2px 2px 4px rgba(0,0,0,.15);font-weight:700;cursor:pointer}#nav .menus_items{display:inline}#nav .menus_items .menus_item{position:relative;display:inline-block;padding:0 0 0 14px}#nav .menus_items .menus_item:hover .menus_item_child{display:block}#nav .menus_items .menus_item:hover>a>i:last-child{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-o-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}#nav .menus_items .menus_item>a>i:last-child{padding:4px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#nav .menus_items .menus_item .menus_item_child{position:absolute;right:0;display:none;margin-top:8px;padding:0;width:max-content;background-color:var(--sidebar-bg);-webkit-box-shadow:0 5px 20px -4px rgba(0,0,0,.5);box-shadow:0 5px 20px -4px rgba(0,0,0,.5);-webkit-animation:sub_menus .3s .1s ease both;-moz-animation:sub_menus .3s .1s ease both;-o-animation:sub_menus .3s .1s ease both;-ms-animation:sub_menus .3s .1s ease both;animation:sub_menus .3s .1s ease both;border-radius:5px}#nav .menus_items .menus_item .menus_item_child:before{position:absolute;top:-8px;left:0;width:100%;height:20px;content:''}#nav.hide-menu #toggle-menu{display:inline-block!important}#nav.hide-menu #toggle-menu .site-page{font-size:inherit}#nav.hide-menu .menus_items{display:none}#nav.hide-menu #search-button span{display:none}#nav #search-button{display:inline;padding:0 0 0 14px}#nav .site-page{position:relative;padding-bottom:6px;text-shadow:1px 1px 2px rgba(0,0,0,.3);font-size:.78em;cursor:pointer}#pagination .pagination{margin-top:20px;text-align:center}#pagination .page-number.current{background:#00c4b6;color:var(--white)}#pagination .pagination-info{position:absolute;top:50%;padding:20px 40px;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}#pagination .next_info,#pagination .prev_info{color:var(--white);font-weight:500}#pagination .next-post .pagination-info{text-align:right}#pagination .pull-full{width:100%!important}#pagination .next-post .label,#pagination .prev-post .label{color:var(--light-grey);text-transform:uppercase;font-size:90%}#pagination .next-post,#pagination .prev-post{width:50%}@media screen and (max-width:768px){#pagination .next-post,#pagination .prev-post{width:100%}}#pagination .next-post a,#pagination .prev-post a{position:relative;display:block;overflow:hidden;height:150px}#pagination.pagination-post{overflow:hidden;margin-top:40px;width:100%;background:#000}.layout>.recent-posts .pagination>*{display:inline-block;margin:0 6px;width:2.5em;height:2.5em;line-height:2.5em}.layout>.recent-posts .pagination>:not(.space):hover{background:var(--btn-hover-color);color:var(--btn-color)}.layout>div:not(.recent-posts) .pagination .page-number{display:inline-block;margin:0 4px;min-width:24px;height:24px;text-align:center;line-height:24px;cursor:pointer}#article-container{word-wrap:break-word;overflow-wrap:break-word}#article-container a{color:#49b1f5}#article-container a:hover{text-decoration:underline}#article-container img{display:block;margin:0 auto 20px;max-width:100%;-webkit-transition:filter 375ms ease-in .2s;-moz-transition:filter 375ms ease-in .2s;-o-transition:filter 375ms ease-in .2s;-ms-transition:filter 375ms ease-in .2s;transition:filter 375ms ease-in .2s}#article-container p{margin:0 0 16px}#article-container iframe{margin:0 0 20px}#article-container kbd{margin:0 3px;padding:3px 5px;border:1px solid #b4b4b4;border-radius:3px;background-color:#f8f8f8;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.25),0 2px 1px 0 rgba(255,255,255,.6) inset;box-shadow:0 1px 3px rgba(0,0,0,.25),0 2px 1px 0 rgba(255,255,255,.6) inset;color:#34495e;white-space:nowrap;font-weight:600;font-size:.9em;font-family:Monaco,'Ubuntu Mono',monospace;line-height:1em}#article-container ol ol,#article-container ol ul,#article-container ul ol,#article-container ul ul{padding-left:20px}#article-container ol li,#article-container ul li{margin:4px 0}#article-container ol p,#article-container ul p{margin:0 0 8px}#article-container>:last-child{margin-bottom:0!important}#article-container hr{margin:20px 0}#article-container.post-content h1,#article-container.post-content h2,#article-container.post-content h3,#article-container.post-content h4,#article-container.post-content h5,#article-container.post-content h6{-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;-ms-transition:all .2s ease-out;transition:all .2s ease-out}#article-container.post-content h1:before,#article-container.post-content h2:before,#article-container.post-content h3:before,#article-container.post-content h4:before,#article-container.post-content h5:before,#article-container.post-content h6:before{position:absolute;top:calc(50% - 7px);color:#f47466;content:'\f863';left:0;line-height:1;-webkit-transition:all .2s ease-out;-moz-transition:all .2s ease-out;-o-transition:all .2s ease-out;-ms-transition:all .2s ease-out;transition:all .2s ease-out}#article-container.post-content h1:hover:before,#article-container.post-content h2:hover:before,#article-container.post-content h3:hover:before,#article-container.post-content h4:hover:before,#article-container.post-content h5:hover:before,#article-container.post-content h6:hover:before{color:#49b1f5}#article-container.post-content h1{padding-left:28px}#article-container.post-content h1:before{font-size:18px}#article-container.post-content h1:hover{padding-left:32px}#article-container.post-content h2{padding-left:26px}#article-container.post-content h2:before{font-size:16px}#article-container.post-content h2:hover{padding-left:30px}#article-container.post-content h3{padding-left:24px}#article-container.post-content h3:before{font-size:14px}#article-container.post-content h3:hover{padding-left:28px}#article-container.post-content h4{padding-left:22px}#article-container.post-content h4:before{font-size:12px}#article-container.post-content h4:hover{padding-left:26px}#article-container.post-content h5{padding-left:20px}#article-container.post-content h5:before{font-size:10px}#article-container.post-content h5:hover{padding-left:24px}#article-container.post-content h6{padding-left:20px}#article-container.post-content h6:before{font-size:10px}#article-container.post-content h6:hover{padding-left:24px}#article-container.post-content ol p,#article-container.post-content ul p{margin:0 0 8px}#article-container.post-content li::marker{color:#49b1f5;font-weight:600;font-size:1.05em}#article-container.post-content li:hover::marker{color:var(--pseudo-hover)}#article-container.post-content ul>li{list-style-type:circle}#post .tag_share:after{display:block;clear:both;content:''}#post .tag_share .post-meta__tag-list{display:inline-block}#post .tag_share .post-meta__tags{display:inline-block;margin:8px 8px 8px 0;padding:0 12px;width:fit-content;border:1px solid #49b1f5;border-radius:12px;color:#49b1f5;font-size:.85em;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#post .tag_share .post-meta__tags:hover{background:#49b1f5;color:var(--white)}#post .tag_share .post_share{display:inline-block;float:right;margin:8px 0 0;width:fit-content}#post .tag_share .post_share .social-share{font-size:.85em}#post .tag_share .post_share .social-share .social-share-icon{margin:0 4px;width:1.85em;height:1.85em;font-size:1.2em;line-height:1.85em}#post .post-copyright{position:relative;margin:40px 0 10px;padding:10px 16px;border:1px solid var(--light-grey);-webkit-transition:box-shadow .3s ease-in-out;-moz-transition:box-shadow .3s ease-in-out;-o-transition:box-shadow .3s ease-in-out;-ms-transition:box-shadow .3s ease-in-out;transition:box-shadow .3s ease-in-out}#post .post-copyright:before{position:absolute;top:2px;right:12px;color:#49b1f5;content:'\f1f9';font-size:1.3em}#post .post-copyright:hover{-webkit-box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5);box-shadow:0 0 8px 0 rgba(232,237,250,.6),0 2px 4px 0 rgba(232,237,250,.5)}#post .post-copyright .post-copyright-meta{color:#49b1f5;font-weight:700}#post .post-copyright .post-copyright-meta i{margin-right:3px}#post .post-copyright .post-copyright-info{padding-left:6px}#post .post-copyright .post-copyright-info a{text-decoration:underline;word-break:break-word}#post .post-copyright .post-copyright-info a:hover{text-decoration:none}#post .post-outdate-notice{position:relative;margin:0 0 20px;padding:.5em 1.2em;border-radius:3px;background-color:#ffe6e6;color:#f66;padding:.5em 1em .5em 2.6em;border-left:5px solid #ff8080}#post .post-outdate-notice:before{position:absolute;top:50%;left:.9em;color:#ff8080;content:'\f071';-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-o-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#post .ads-wrap{margin:40px 0}.relatedPosts{margin-top:40px}.relatedPosts>.headline{margin-bottom:5px;font-weight:700;font-size:1.43em}.relatedPosts>.relatedPosts-list>div{position:relative;display:inline-block;overflow:hidden;margin:3px;width:calc(33.333% - 6px);height:200px;background:#000;vertical-align:bottom}@media screen and (max-width:768px){.relatedPosts>.relatedPosts-list>div{margin:2px;width:calc(50% - 4px);height:150px}}@media screen and (max-width:600px){.relatedPosts>.relatedPosts-list>div{width:calc(100% - 4px)}}.relatedPosts>.relatedPosts-list .content{position:absolute;top:50%;padding:0 20px;width:100%;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}.relatedPosts>.relatedPosts-list .content .date{color:var(--light-grey);font-size:90%}.relatedPosts>.relatedPosts-list .content .title{color:var(--white);-webkit-line-clamp:2}.post-reward{position:relative;margin-top:80px;width:100%;text-align:center;pointer-events:none}.post-reward>*{pointer-events:auto}.post-reward .reward-button{display:inline-block;padding:4px 24px;background:var(--btn-bg);color:var(--btn-color);cursor:pointer}.post-reward .reward-button i{margin-right:5px}.post-reward:hover .reward-button{background:var(--btn-hover-color)}.post-reward:hover>.reward-main{display:block}.post-reward .reward-main{position:absolute;bottom:40px;left:0;z-index:100;display:none;padding:0 0 15px;width:100%}.post-reward .reward-main .reward-all{display:inline-block;margin:0;padding:20px 10px;border-radius:4px;background:var(--reward-pop)}.post-reward .reward-main .reward-all:before{position:absolute;bottom:-10px;left:0;width:100%;height:20px;content:''}.post-reward .reward-main .reward-all:after{position:absolute;right:0;bottom:2px;left:0;margin:0 auto;width:0;height:0;border-top:13px solid var(--reward-pop);border-right:13px solid transparent;border-left:13px solid transparent;content:''}.post-reward .reward-main .reward-all .reward-item{display:inline-block;padding:0 8px;list-style-type:none;vertical-align:top}.post-reward .reward-main .reward-all .reward-item img{width:130px;height:130px}.post-reward .reward-main .reward-all .reward-item .post-qr-code-desc{width:130px;color:#858585}#rightside{position:fixed;right:-48px;bottom:40px;z-index:100;opacity:0;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#rightside.rightside-show{opacity:.8;-webkit-transform:translate(-58px,0);-moz-transform:translate(-58px,0);-o-transform:translate(-58px,0);-ms-transform:translate(-58px,0);transform:translate(-58px,0)}#rightside #rightside-config-hide{height:0;opacity:0;-webkit-transition:-webkit-transform .4s;-moz-transition:-moz-transform .4s;-o-transition:-o-transform .4s;-ms-transition:-ms-transform .4s;transition:transform .4s;-webkit-transform:translate(45px,0);-moz-transform:translate(45px,0);-o-transform:translate(45px,0);-ms-transform:translate(45px,0);transform:translate(45px,0)}#rightside #rightside-config-hide.show{height:auto;opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate(0,0);-moz-transform:translate(0,0);-o-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}#rightside #rightside-config-hide.status{height:auto;opacity:1;-ms-filter:none;filter:none}#rightside>div>a,#rightside>div>button{display:block;margin-bottom:5px;width:35px;height:35px;border-radius:5px;background-color:var(--btn-bg);color:var(--btn-color);text-align:center;font-size:16px;line-height:35px}#rightside>div>a:hover,#rightside>div>button:hover{background-color:var(--btn-hover-color)}#rightside #mobile-toc-button{display:none}@media screen and (max-width:900px){#rightside #mobile-toc-button{display:block}}@media screen and (max-width:900px){#rightside #hide-aside-btn{display:none}}#rightside #go-up .scroll-percent{display:none}#rightside #go-up.show-percent .scroll-percent{display:block}#rightside #go-up.show-percent .scroll-percent+i{display:none}#rightside #go-up:hover .scroll-percent{display:none}#rightside #go-up:hover .scroll-percent+i{display:block}#sidebar #menu-mask{position:fixed;z-index:102;display:none;width:100%;height:100%;background:rgba(0,0,0,.8)}#sidebar #sidebar-menus{position:fixed;top:0;right:-300px;z-index:103;overflow-x:hidden;overflow-y:scroll;padding-left:5px;width:300px;height:100%;background:var(--sidebar-bg);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#sidebar #sidebar-menus.open{-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-o-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}#sidebar #sidebar-menus>.avatar-img{margin:20px auto}#sidebar #sidebar-menus .sidebar-site-data{padding:0 10px}#sidebar #sidebar-menus hr{margin:20px auto}#sidebar #sidebar-menus .menus_items{padding:0 10px}#sidebar #sidebar-menus .menus_items .site-page{position:relative;display:block;padding:3px 28px 3px 20px;color:var(--font-color);font-size:1.15em;border-radius:6px}#sidebar #sidebar-menus .menus_items .site-page:hover{background:var(--text-bg-hover)}#sidebar #sidebar-menus .menus_items .site-page i:first-child{width:15%;text-align:left}#sidebar #sidebar-menus .menus_items .site-page.group>i:last-child{position:absolute;top:.78em;right:13px;-webkit-transition:-webkit-transform .3s;-moz-transition:-moz-transform .3s;-o-transition:-o-transform .3s;-ms-transition:-ms-transform .3s;transition:transform .3s}#sidebar #sidebar-menus .menus_items .site-page.group.hide>i:last-child{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-o-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}#sidebar #sidebar-menus .menus_items .site-page.group.hide+.menus_item_child{display:none}#sidebar #sidebar-menus .menus_items .menus_item_child{margin:0;padding-left:25px;list-style:none}#vcomment{font-size:1.1em}#vcomment .vbtn{border:none;background:var(--btn-bg);color:var(--btn-color)}#vcomment .vbtn:hover{background:var(--btn-hover-color)}#vcomment .vimg{-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#vcomment .vimg:hover{-webkit-transform:rotate(360deg);-moz-transform:rotate(360deg);-o-transform:rotate(360deg);-ms-transform:rotate(360deg);transform:rotate(360deg)}#vcomment .vcards .vcard .vcontent.expand:after,#vcomment .vcards .vcard .vcontent.expand:before{z-index:22}#waline-wrap{--waline-font-size:1.1em;--waline-theme-color:#49b1f5;--waline-active-color:#ff7242}#waline-wrap .wl-comment-actions>button:not(last-child){padding-right:4px}.fireworks{position:fixed;top:0;left:0;z-index:9999;pointer-events:none}.medium-zoom-image--opened{z-index:99999!important;margin:0!important}.medium-zoom-overlay{z-index:99999!important}.mermaid-wrap{margin:0 0 20px;text-align:center}.mermaid-wrap>svg{height:100%}.fb-comments iframe,.utterances{width:100%!important}#gitalk-container .gt-meta{margin:0 0 .8em;padding:6px 0 16px}.katex-wrap{overflow:auto}.katex-wrap::-webkit-scrollbar{display:none}mjx-container{overflow-x:auto;overflow-y:hidden;padding-bottom:4px;max-width:100%}mjx-container[display]{display:block!important;min-width:auto!important}mjx-container:not([display]){display:inline-grid!important}mjx-assistive-mml{right:0;bottom:0}.aplayer{color:#4c4948}#article-container .aplayer{margin:0 0 20px}#article-container .aplayer ol,#article-container .aplayer ul{margin:0;padding:0}#article-container .aplayer ol li,#article-container .aplayer ul li{margin:0;padding:0 15px}#article-container .aplayer ol li:before,#article-container .aplayer ul li:before{content:none}.snackbar-css{border-radius:5px!important}.abc-music-sheet{margin:0 0 20px;opacity:0;-webkit-transition:opacity .3s;-moz-transition:opacity .3s;-o-transition:opacity .3s;-ms-transition:opacity .3s;transition:opacity .3s}.abc-music-sheet.abcjs-container{opacity:1;-ms-filter:none;filter:none}@media screen and (max-width:768px){.fancybox__toolbar__column.is-middle{display:none}}#article-container .btn-center{margin:0 0 20px;text-align:center}#article-container .btn-beautify{display:inline-block;margin:0 4px 6px;padding:0 15px;background-color:var(--btn-beautify-color,#777);color:#fff;line-height:2}#article-container .btn-beautify.blue{--btn-beautify-color:#428bca}#article-container .btn-beautify.pink{--btn-beautify-color:#ff69b4}#article-container .btn-beautify.red{--btn-beautify-color:#f00}#article-container .btn-beautify.purple{--btn-beautify-color:#6f42c1}#article-container .btn-beautify.orange{--btn-beautify-color:#ff8c00}#article-container .btn-beautify.green{--btn-beautify-color:#5cb85c}#article-container .btn-beautify:hover{background-color:var(--btn-hover-color)}#article-container .btn-beautify i+span{margin-left:6px}#article-container .btn-beautify:not(.block)+.btn-beautify:not(.block){margin:0 4px 20px}#article-container .btn-beautify.block{display:block;margin:0 0 20px;width:fit-content;width:-moz-fit-content}#article-container .btn-beautify.block.center{margin:0 auto 20px}#article-container .btn-beautify.block.right{margin:0 0 20px auto}#article-container .btn-beautify.larger{padding:6px 15px}#article-container .btn-beautify:hover{text-decoration:none}#article-container .btn-beautify.outline{border:1px solid transparent;border-color:var(--btn-beautify-color,#777);background-color:transparent;color:var(--btn-beautify-color,#777)}#article-container .btn-beautify.outline:hover{background-color:var(--btn-beautify-color,#777)}#article-container .btn-beautify.outline:hover{color:#fff!important}#article-container figure.gallery-group{position:relative;float:left;overflow:hidden;margin:6px 4px;width:calc(50% - 8px);height:250px;border-radius:8px;background:#000;-webkit-transform:translate3d(0,0,0)}@media screen and (max-width:600px){#article-container figure.gallery-group{width:calc(100% - 8px)}}#article-container figure.gallery-group:hover img{opacity:.4;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group:hover .gallery-group-name::after{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group:hover p{opacity:1;-ms-filter:none;filter:none;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}#article-container figure.gallery-group img{position:relative;margin:0;max-width:none;width:calc(100% + 20px);height:250px;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;opacity:.8;-webkit-transition:all .3s,filter 375ms ease-in .2s;-moz-transition:all .3s,filter 375ms ease-in .2s;-o-transition:all .3s,filter 375ms ease-in .2s;-ms-transition:all .3s,filter 375ms ease-in .2s;transition:all .3s,filter 375ms ease-in .2s;-webkit-transform:translate3d(-10px,0,0);-moz-transform:translate3d(-10px,0,0);-o-transform:translate3d(-10px,0,0);-ms-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0);object-fit:cover}#article-container figure.gallery-group figcaption{position:absolute;top:0;left:0;padding:30px;width:100%;height:100%;color:#fff;text-transform:uppercase;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}#article-container figure.gallery-group figcaption>a{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1000;opacity:0}#article-container figure.gallery-group p{margin:0;padding:8px 0 0;letter-spacing:1px;font-size:1.1em;line-height:1.5;opacity:0;-webkit-transition:opacity .35s,-webkit-transform .35s;-moz-transition:opacity .35s,-moz-transform .35s;-o-transition:opacity .35s,-o-transform .35s;-ms-transition:opacity .35s,-ms-transform .35s;transition:opacity .35s,transform .35s;-webkit-transform:translate3d(100%,0,0);-moz-transform:translate3d(100%,0,0);-o-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);-webkit-line-clamp:4}#article-container figure.gallery-group .gallery-group-name{position:relative;margin:0;padding:8px 0;font-weight:700;font-size:1.65em;line-height:1.5;-webkit-line-clamp:2}#article-container figure.gallery-group .gallery-group-name:after{position:absolute;bottom:0;left:0;width:100%;height:2px;background:#fff;content:'';-webkit-transition:-webkit-transform .35s;-moz-transition:-moz-transform .35s;-o-transition:-o-transform .35s;-ms-transition:-ms-transform .35s;transition:transform .35s;-webkit-transform:translate3d(-100%,0,0);-moz-transform:translate3d(-100%,0,0);-o-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}#article-container .gallery-group-main{overflow:auto;padding:0 0 16px}#article-container .gallery-container{margin:0 0 16px;text-align:center}#article-container .gallery-container img{display:initial;margin:0;width:100%;height:100%}#article-container .gallery-container .gallery-data{display:none}#article-container .gallery-container button{margin-top:25px;padding:10px;width:9em;border-radius:5px;background:var(--btn-bg);color:var(--btn-color);font-weight:700;font-size:1.1em;-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s}#article-container .gallery-container button:hover{background:var(--btn-hover-color)}#article-container .loading-container{display:inline-block;overflow:hidden;width:154px;height:154px}#article-container .loading-container .loading-item{position:relative;width:100%;height:100%;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0) scale(1);-moz-transform:translateZ(0) scale(1);-o-transform:translateZ(0) scale(1);-ms-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1);-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}#article-container .loading-container .loading-item div{position:absolute;width:30.8px;height:30.8px;border-radius:50%;background:#e15b64;-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1);-webkit-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);-moz-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);-o-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);-ms-animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1);animation:loading-ball 1.92s infinite cubic-bezier(0,.5,.5,1)}#article-container .loading-container .loading-item div:nth-child(1){background:#f47e60;-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1);-webkit-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;-moz-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;-o-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;-ms-animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start;animation:loading-ball-r .48s infinite cubic-bezier(0,.5,.5,1),loading-ball-c 1.92s infinite step-start}#article-container .loading-container .loading-item div:nth-child(2){background:#e15b64;-webkit-animation-delay:-.48s;-moz-animation-delay:-.48s;-o-animation-delay:-.48s;-ms-animation-delay:-.48s;animation-delay:-.48s}#article-container .loading-container .loading-item div:nth-child(3){background:#f47e60;-webkit-animation-delay:-.96s;-moz-animation-delay:-.96s;-o-animation-delay:-.96s;-ms-animation-delay:-.96s;animation-delay:-.96s}#article-container .loading-container .loading-item div:nth-child(4){background:#f8b26a;-webkit-animation-delay:-1.44s;-moz-animation-delay:-1.44s;-o-animation-delay:-1.44s;-ms-animation-delay:-1.44s;animation-delay:-1.44s}#article-container .loading-container .loading-item div:nth-child(5){background:#abbd81;-webkit-animation-delay:-1.92s;-moz-animation-delay:-1.92s;-o-animation-delay:-1.92s;-ms-animation-delay:-1.92s;animation-delay:-1.92s}@-moz-keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@-webkit-keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@-o-keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@keyframes loading-ball{0%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}25%{-webkit-transform:translate(9.24px,61.6px) scale(0);-moz-transform:translate(9.24px,61.6px) scale(0);-o-transform:translate(9.24px,61.6px) scale(0);-ms-transform:translate(9.24px,61.6px) scale(0);transform:translate(9.24px,61.6px) scale(0)}50%{-webkit-transform:translate(9.24px,61.6px) scale(1);-moz-transform:translate(9.24px,61.6px) scale(1);-o-transform:translate(9.24px,61.6px) scale(1);-ms-transform:translate(9.24px,61.6px) scale(1);transform:translate(9.24px,61.6px) scale(1)}75%{-webkit-transform:translate(61.6px,61.6px) scale(1);-moz-transform:translate(61.6px,61.6px) scale(1);-o-transform:translate(61.6px,61.6px) scale(1);-ms-transform:translate(61.6px,61.6px) scale(1);transform:translate(61.6px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}}@-moz-keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@-webkit-keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@-o-keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@keyframes loading-ball-r{0%{-webkit-transform:translate(113.96px,61.6px) scale(1);-moz-transform:translate(113.96px,61.6px) scale(1);-o-transform:translate(113.96px,61.6px) scale(1);-ms-transform:translate(113.96px,61.6px) scale(1);transform:translate(113.96px,61.6px) scale(1)}100%{-webkit-transform:translate(113.96px,61.6px) scale(0);-moz-transform:translate(113.96px,61.6px) scale(0);-o-transform:translate(113.96px,61.6px) scale(0);-ms-transform:translate(113.96px,61.6px) scale(0);transform:translate(113.96px,61.6px) scale(0)}}@-moz-keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}@-webkit-keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}@-o-keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}@keyframes loading-ball-c{0%{background:#e15b64}25%{background:#abbd81}50%{background:#f8b26a}75%{background:#f47e60}100%{background:#e15b64}}blockquote.pullquote{position:relative;max-width:45%;font-size:110%}blockquote.pullquote.left{float:left;margin:1em .5em 0 0}blockquote.pullquote.right{float:right;margin:1em 0 0 .5em}.video-container{position:relative;overflow:hidden;margin-bottom:16px;padding-top:56.25%;height:0}.video-container iframe{position:absolute;top:0;left:0;margin-top:0;width:100%;height:100%}.hide-block>.hide-button,.hide-inline>.hide-button{display:inline-block;padding:5px 18px;background:#49b1f5;color:var(--white)}.hide-block>.hide-button:hover,.hide-inline>.hide-button:hover{background-color:var(--btn-hover-color)}.hide-block>.hide-button.open,.hide-inline>.hide-button.open{display:none}.hide-block>.hide-button.open+div,.hide-inline>.hide-button.open+div{display:block}.hide-block>.hide-button.open+span,.hide-inline>.hide-button.open+span{display:inline}.hide-block>.hide-content,.hide-inline>.hide-content{display:none}.hide-inline>.hide-button{margin:0 6px}.hide-inline>.hide-content{margin:0 6px}.hide-block{margin:0 0 16px}.toggle{margin-bottom:20px;border:1px solid #f0f0f0}.toggle>.toggle-button{padding:6px 15px;background:#f0f0f0;color:#1f2d3d;cursor:pointer}.toggle>.toggle-content{margin:30px 24px}#article-container .inline-img{display:inline;margin:0 3px;height:1.1em;vertical-align:text-bottom}.hl-label{padding:2px 4px;border-radius:3px;color:#fff}.hl-label.default{background-color:#777}.hl-label.blue{background-color:#428bca}.hl-label.pink{background-color:#ff69b4}.hl-label.red{background-color:red}.hl-label.purple{background-color:#6f42c1}.hl-label.orange{background-color:#ff8c00}.hl-label.green{background-color:#5cb85c}.note{position:relative;margin:0 0 20px;padding:15px;border-radius:3px}.note.icon-padding{padding-left:3em}.note>.note-icon{position:absolute;top:calc(50% - .5em);left:.8em;font-size:larger}.note.blue:not(.disabled){border-left-color:#428bca!important}.note.blue:not(.disabled).modern{border-left-color:transparent!important;color:#428bca}.note.blue:not(.disabled):not(.simple){background:#e3eef7!important}.note.blue>.note-icon{color:#428bca}.note.pink:not(.disabled){border-left-color:#ff69b4!important}.note.pink:not(.disabled).modern{border-left-color:transparent!important;color:#ff69b4}.note.pink:not(.disabled):not(.simple){background:#ffe9f4!important}.note.pink>.note-icon{color:#ff69b4}.note.red:not(.disabled){border-left-color:red!important}.note.red:not(.disabled).modern{border-left-color:transparent!important;color:red}.note.red:not(.disabled):not(.simple){background:#ffd9d9!important}.note.red>.note-icon{color:red}.note.purple:not(.disabled){border-left-color:#6f42c1!important}.note.purple:not(.disabled).modern{border-left-color:transparent!important;color:#6f42c1}.note.purple:not(.disabled):not(.simple){background:#e9e3f6!important}.note.purple>.note-icon{color:#6f42c1}.note.orange:not(.disabled){border-left-color:#ff8c00!important}.note.orange:not(.disabled).modern{border-left-color:transparent!important;color:#ff8c00}.note.orange:not(.disabled):not(.simple){background:#ffeed9!important}.note.orange>.note-icon{color:#ff8c00}.note.green:not(.disabled){border-left-color:#5cb85c!important}.note.green:not(.disabled).modern{border-left-color:transparent!important;color:#5cb85c}.note.green:not(.disabled):not(.simple){background:#e7f4e7!important}.note.green>.note-icon{color:#5cb85c}.note.simple{border:1px solid #eee;border-left-width:5px}.note.modern{border:1px solid transparent!important;background-color:#f5f5f5;color:#4c4948}.note.flat{border:initial;border-left:5px solid #eee;background-color:#f9f9f9;color:#4c4948}.note h2,.note h3,.note h4,.note h5,.note h6{margin-top:3px;margin-bottom:0;padding-top:0!important;border-bottom:initial}.note blockquote:first-child,.note img:first-child,.note ol:first-child,.note p:first-child,.note pre:first-child,.note table:first-child,.note ul:first-child{margin-top:0!important}.note blockquote:last-child,.note img:last-child,.note ol:last-child,.note p:last-child,.note pre:last-child,.note table:last-child,.note ul:last-child{margin-bottom:0!important}.note .img-alt{margin:5px 0 10px}.note:not(.no-icon){padding-left:3em}.note:not(.no-icon)::before{position:absolute;top:calc(50% - .95em);left:.8em;font-size:larger}.note.default.flat{background:#f7f7f7}.note.default.modern{border-color:#e1e1e1;background:#f3f3f3;color:#666}.note.default.modern a:not(.btn){color:#666}.note.default.modern a:not(.btn):hover{color:#454545}.note.default:not(.modern){border-left-color:#777}.note.default:not(.modern) h2,.note.default:not(.modern) h3,.note.default:not(.modern) h4,.note.default:not(.modern) h5,.note.default:not(.modern) h6{color:#777}.note.default:not(.no-icon)::before{content:'\f0a9'}.note.default:not(.no-icon):not(.modern)::before{color:#777}.note.primary.flat{background:#f5f0fa}.note.primary.modern{border-color:#e1c2ff;background:#f3daff;color:#6f42c1}.note.primary.modern a:not(.btn){color:#6f42c1}.note.primary.modern a:not(.btn):hover{color:#453298}.note.primary:not(.modern){border-left-color:#6f42c1}.note.primary:not(.modern) h2,.note.primary:not(.modern) h3,.note.primary:not(.modern) h4,.note.primary:not(.modern) h5,.note.primary:not(.modern) h6{color:#6f42c1}.note.primary:not(.no-icon)::before{content:'\f055'}.note.primary:not(.no-icon):not(.modern)::before{color:#6f42c1}.note.info.flat{background:#eef7fa}.note.info.modern{border-color:#b3e5ef;background:#d9edf7;color:#31708f}.note.info.modern a:not(.btn){color:#31708f}.note.info.modern a:not(.btn):hover{color:#215761}.note.info:not(.modern){border-left-color:#428bca}.note.info:not(.modern) h2,.note.info:not(.modern) h3,.note.info:not(.modern) h4,.note.info:not(.modern) h5,.note.info:not(.modern) h6{color:#428bca}.note.info:not(.no-icon)::before{content:'\f05a'}.note.info:not(.no-icon):not(.modern)::before{color:#428bca}.note.success.flat{background:#eff8f0}.note.success.modern{border-color:#d0e6be;background:#dff0d8;color:#3c763d}.note.success.modern a:not(.btn){color:#3c763d}.note.success.modern a:not(.btn):hover{color:#32562c}.note.success:not(.modern){border-left-color:#5cb85c}.note.success:not(.modern) h2,.note.success:not(.modern) h3,.note.success:not(.modern) h4,.note.success:not(.modern) h5,.note.success:not(.modern) h6{color:#5cb85c}.note.success:not(.no-icon)::before{content:'\f058'}.note.success:not(.no-icon):not(.modern)::before{color:#5cb85c}.note.warning.flat{background:#fdf8ea}.note.warning.modern{border-color:#fae4cd;background:#fcf4e3;color:#8a6d3b}.note.warning.modern a:not(.btn){color:#8a6d3b}.note.warning.modern a:not(.btn):hover{color:#714f30}.note.warning:not(.modern){border-left-color:#f0ad4e}.note.warning:not(.modern) h2,.note.warning:not(.modern) h3,.note.warning:not(.modern) h4,.note.warning:not(.modern) h5,.note.warning:not(.modern) h6{color:#f0ad4e}.note.warning:not(.no-icon)::before{content:'\f06a'}.note.warning:not(.no-icon):not(.modern)::before{color:#f0ad4e}.note.danger.flat{background:#fcf1f2}.note.danger.modern{border-color:#ebcdd2;background:#f2dfdf;color:#a94442}.note.danger.modern a:not(.btn){color:#a94442}.note.danger.modern a:not(.btn):hover{color:#84333f}.note.danger:not(.modern){border-left-color:#d9534f}.note.danger:not(.modern) h2,.note.danger:not(.modern) h3,.note.danger:not(.modern) h4,.note.danger:not(.modern) h5,.note.danger:not(.modern) h6{color:#d9534f}.note.danger:not(.no-icon)::before{content:'\f056'}.note.danger:not(.no-icon):not(.modern)::before{color:#d9534f}#article-container .tabs{position:relative;margin:0 0 20px;border-right:1px solid var(--tab-border-color);border-bottom:1px solid var(--tab-border-color);border-left:1px solid var(--tab-border-color)}#article-container .tabs>.nav-tabs{display:-webkit-box;display:-moz-box;display:-webkit-flex;display:-ms-flexbox;display:box;display:flex;-webkit-box-lines:multiple;-moz-box-lines:multiple;-o-box-lines:multiple;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0;padding:0;background:var(--tab-botton-bg)}#article-container .tabs>.nav-tabs>.tab{-webkit-box-flex:1;-moz-box-flex:1;-o-box-flex:1;-ms-box-flex:1;box-flex:1;-webkit-flex-grow:1;flex-grow:1;padding:8px 18px;border-top:2px solid var(--tab-border-color);background:var(--tab-botton-bg);color:var(--tab-botton-color);line-height:2;-webkit-transition:all .4s;-moz-transition:all .4s;-o-transition:all .4s;-ms-transition:all .4s;transition:all .4s}#article-container .tabs>.nav-tabs>.tab i{width:1.5em}#article-container .tabs>.nav-tabs>.tab.active{border-top:2px solid #49b1f5;background:var(--tab-button-active-bg);cursor:default}#article-container .tabs>.nav-tabs>.tab:not(.active):hover{border-top:2px solid var(--tab-button-hover-bg);background:var(--tab-button-hover-bg)}#article-container .tabs>.nav-tabs.no-default~.tab-to-top{display:none}#article-container .tabs>.tab-contents .tab-item-content{position:relative;display:none;padding:36px 24px 10px}@media screen and (max-width:768px){#article-container .tabs>.tab-contents .tab-item-content{padding:24px 14px}}#article-container .tabs>.tab-contents .tab-item-content.active{display:block;-webkit-animation:tabshow .5s;-moz-animation:tabshow .5s;-o-animation:tabshow .5s;-ms-animation:tabshow .5s;animation:tabshow .5s}#article-container .tabs>.tab-contents .tab-item-content>:last-child{margin-bottom:0}#article-container .tabs>.tab-to-top{padding:0 16px 10px 0;width:100%;text-align:right}#article-container .tabs>.tab-to-top button{color:#99a9bf}#article-container .tabs>.tab-to-top button:hover{color:#49b1f5}@-moz-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@-o-keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}@keyframes tabshow{0%{-webkit-transform:translateY(15px);-moz-transform:translateY(15px);-o-transform:translateY(15px);-ms-transform:translateY(15px);transform:translateY(15px)}100%{-webkit-transform:translateY(0);-moz-transform:translateY(0);-o-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}#article-container .timeline{margin:0 0 20px 10px;padding:14px 20px 5px;border-left:2px solid var(--timeline-color,#49b1f5)}#article-container .timeline.blue{--timeline-color:#428bca;--timeline-bg:rgba(66,139,202, 0.2)}#article-container .timeline.pink{--timeline-color:#ff69b4;--timeline-bg:rgba(255,105,180, 0.2)}#article-container .timeline.red{--timeline-color:#f00;--timeline-bg:rgba(255,0,0, 0.2)}#article-container .timeline.purple{--timeline-color:#6f42c1;--timeline-bg:rgba(111,66,193, 0.2)}#article-container .timeline.orange{--timeline-color:#ff8c00;--timeline-bg:rgba(255,140,0, 0.2)}#article-container .timeline.green{--timeline-color:#5cb85c;--timeline-bg:rgba(92,184,92, 0.2)}#article-container .timeline .timeline-item{margin:0 0 15px}#article-container .timeline .timeline-item:hover .item-circle:before{border-color:var(--timeline-color,#49b1f5)}#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle>p{font-weight:600;font-size:1.2em}#article-container .timeline .timeline-item.headline .timeline-item-title .item-circle:before{left:-28px;border:4px solid var(--timeline-color,#49b1f5)}#article-container .timeline .timeline-item.headline:hover .item-circle:before{border-color:var(--pseudo-hover)}#article-container .timeline .timeline-item .timeline-item-title{position:relative}#article-container .timeline .timeline-item .item-circle:before{position:absolute;top:50%;left:-27px;width:6px;height:6px;border:3px solid var(--pseudo-hover);border-radius:50%;background:var(--card-bg);content:'';-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;-ms-transition:all .3s;transition:all .3s;-webkit-transform:translate(0,-50%);-moz-transform:translate(0,-50%);-o-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%)}#article-container .timeline .timeline-item .item-circle>p{margin:0 0 8px;font-weight:500}#article-container .timeline .timeline-item .timeline-item-content{position:relative;padding:12px 15px;border-radius:8px;background:var(--timeline-bg,#e4f3fd);font-size:.93em}#article-container .timeline .timeline-item .timeline-item-content>:last-child{margin-bottom:0}#article-container .timeline+.timeline{margin-top:-20px}[data-theme=dark]{--global-bg:#0d0d0d;--font-color:rgba(255,255,255,0.7);--hr-border:rgba(255,255,255,0.4);--hr-before-color:rgba(255,255,255,0.7);--search-bg:#121212;--search-input-color:rgba(255,255,255,0.7);--search-a-color:rgba(255,255,255,0.7);--preloader-bg:#0d0d0d;--preloader-color:rgba(255,255,255,0.7);--tab-border-color:#2c2c2c;--tab-botton-bg:#2c2c2c;--tab-botton-color:rgba(255,255,255,0.7);--tab-button-hover-bg:#383838;--tab-button-active-bg:#121212;--card-bg:#121212;--sidebar-bg:#121212;--btn-hover-color:#787878;--btn-color:rgba(255,255,255,0.7);--btn-bg:#1f1f1f;--text-bg-hover:#383838;--light-grey:rgba(255,255,255,0.7);--dark-grey:rgba(255,255,255,0.2);--white:rgba(255,255,255,0.9);--text-highlight-color:rgba(255,255,255,0.9);--blockquote-color:rgba(255,255,255,0.7);--blockquote-bg:#2c2c2c;--reward-pop:#2c2c2c;--toc-link-color:rgba(255,255,255,0.6);--scrollbar-color:#525252;--timeline-bg:#1f1f1f;--zoom-bg:#121212;--mark-bg:rgba(0,0,0,0.6)}[data-theme=dark] #web_bg:before{position:absolute;width:100%;height:100%;background-color:rgba(0,0,0,.7);content:''}[data-theme=dark] #article-container code{background:#2c2c2c}[data-theme=dark] #article-container pre>code{background:#171717}[data-theme=dark] #article-container figure.highlight{-webkit-box-shadow:none;box-shadow:none}[data-theme=dark] #article-container .note code{background:rgba(27,31,35,.05)}[data-theme=dark] #article-container .aplayer{filter:brightness(.8)}[data-theme=dark] #article-container kbd{border-color:#696969;background-color:#525252;color:#e2f1ff}[data-theme=dark] #page-header.nav-fixed>#nav,[data-theme=dark] #page-header.not-top-img>#nav{background:rgba(18,18,18,.8);-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,0);box-shadow:0 5px 6px -5px rgba(133,133,133,0)}[data-theme=dark] #post-comment .comment-switch{background:#2c2c2c!important}[data-theme=dark] #post-comment .comment-switch #switch-btn{filter:brightness(.8)}[data-theme=dark] .note{filter:brightness(.8)}[data-theme=dark] #article-container iframe,[data-theme=dark] .ads-wrap,[data-theme=dark] .btn-beautify,[data-theme=dark] .error-img,[data-theme=dark] .gist,[data-theme=dark] .hide-button,[data-theme=dark] .hl-label,[data-theme=dark] .post-outdate-notice{filter:brightness(.8)}[data-theme=dark] img{filter:brightness(.8)}[data-theme=dark] #aside-content .aside-list>.aside-list-item:not(:last-child){border-bottom:1px dashed rgba(255,255,255,.1)}[data-theme=dark] #gitalk-container{filter:brightness(.8)}[data-theme=dark] #gitalk-container svg{fill:rgba(255,255,255,.9)!important}[data-theme=dark] #disqusjs #dsqjs .dsqjs-no-comment,[data-theme=dark] #disqusjs #dsqjs .dsqjs-tab-active,[data-theme=dark] #disqusjs #dsqjs:focus,[data-theme=dark] #disqusjs #dsqjs:hover{color:rgba(255,255,255,.7)}[data-theme=dark] #disqusjs #dsqjs .dsqjs-order-label{background-color:#1f1f1f}[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body{color:rgba(255,255,255,.7)}[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body code,[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body pre{background:#2c2c2c}[data-theme=dark] #disqusjs #dsqjs .dsqjs-post-body blockquote{color:rgba(255,255,255,.7)}[data-theme=dark] #artitalk_main #lazy{background:#121212}[data-theme=dark] #operare_artitalk .c2{background:#121212}@media screen and (max-width:900px){[data-theme=dark] #card-toc{background:#1f1f1f}}.read-mode{--font-color:#4c4948;--readmode-light-color:#fff;--white:#4c4948;--light-grey:#4c4948;--gray:#d6dbdf;--hr-border:#d6dbdf;--hr-before-color:#b9c2c9;--highlight-bg:#f7f7f7;--exit-btn-bg:#c0c0c0;--exit-btn-color:#fff;--exit-btn-hover:#8d8d8d;--pseudo-hover:none}[data-theme=dark] .read-mode{--font-color:rgba(255,255,255,0.7);--readmode-light-color:#0d0d0d;--white:rgba(255,255,255,0.9);--light-grey:rgba(255,255,255,0.7);--gray:rgba(255,255,255,0.7);--hr-border:rgba(255,255,255,0.5);--hr-before-color:rgba(255,255,255,0.7);--highlight-bg:#171717;--exit-btn-bg:#1f1f1f;--exit-btn-color:rgba(255,255,255,0.9);--exit-btn-hover:#525252}.read-mode{background:var(--readmode-light-color)}.read-mode .exit-readmode{position:fixed;top:30px;right:30px;z-index:100;width:40px;height:40px;border-radius:8px;background:var(--exit-btn-bg);color:var(--exit-btn-color);font-size:16px;-webkit-transition:background .3s;-moz-transition:background .3s;-o-transition:background .3s;-ms-transition:background .3s;transition:background .3s}@media screen and (max-width:768px){.read-mode .exit-readmode{top:initial;bottom:30px}}.read-mode .exit-readmode:hover{background:var(--exit-btn-hover)}.read-mode #aside-content{display:none}.read-mode #page-header.post-bg{background:0 0!important}.read-mode #page-header.post-bg:before{opacity:0}.read-mode #page-header.post-bg>#post-info{text-align:center}.read-mode #post{margin:0 auto;background:0 0;-webkit-box-shadow:none;box-shadow:none}.read-mode #post:hover{-webkit-box-shadow:none;box-shadow:none}.read-mode>canvas{display:none!important}.read-mode #footer,.read-mode #nav,.read-mode #post>:not(#post-info):not(.post-content),.read-mode #rightside,.read-mode #web_bg,.read-mode .highlight-tools,.read-mode .not-top-img,.read-mode .post-outdate-notice{display:none!important}.read-mode #article-container a{color:#99a9bf}.read-mode #article-container .highlight:not(.js-file-line-container),.read-mode #article-container pre{background:var(--highlight-bg)!important}.read-mode #article-container .highlight:not(.js-file-line-container) *,.read-mode #article-container pre *{color:var(--font-color)!important}.read-mode #article-container figure.highlight{border-radius:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.read-mode #article-container figure.highlight>:not(.highlight-tools){display:block!important}.read-mode #article-container figure.highlight .line:before{color:var(--font-color)!important}.read-mode #article-container figure.highlight .hljs{background:var(--highlight-bg)!important}.read-mode #article-container h1,.read-mode #article-container h2,.read-mode #article-container h3,.read-mode #article-container h4,.read-mode #article-container h5,.read-mode #article-container h6{padding:0}.read-mode #article-container h1:before,.read-mode #article-container h2:before,.read-mode #article-container h3:before,.read-mode #article-container h4:before,.read-mode #article-container h5:before,.read-mode #article-container h6:before{content:''}.read-mode #article-container h1:hover,.read-mode #article-container h2:hover,.read-mode #article-container h3:hover,.read-mode #article-container h4:hover,.read-mode #article-container h5:hover,.read-mode #article-container h6:hover{padding:0}.read-mode #article-container li:hover:before,.read-mode #article-container ol:hover:before,.read-mode #article-container ul:hover:before{-webkit-transform:none!important;-moz-transform:none!important;-o-transform:none!important;-ms-transform:none!important;transform:none!important}.read-mode #article-container li:before,.read-mode #article-container ol:before{background:0 0!important;color:var(--font-color)!important}.read-mode #article-container ul>li:before{border-color:var(--gray)!important}.read-mode #article-container .tabs{border:2px solid var(--tab-border-color)}.read-mode #article-container .tabs>.nav-tabs{background:0 0}.read-mode #article-container .tabs>.nav-tabs>.tab{border-top:none!important}.read-mode #article-container .tabs>.tab-contents .tab-item-content.active{-webkit-animation:none;-moz-animation:none;-o-animation:none;-ms-animation:none;animation:none}.read-mode #article-container code{color:var(--font-color)}.read-mode #article-container blockquote{border-color:var(--gray);background-color:var(--readmode-light-color)}.read-mode #article-container kbd{border:1px solid var(--gray);background-color:transparent;-webkit-box-shadow:none;box-shadow:none;color:var(--font-color)}.read-mode #article-container .hide-toggle{border:1px solid var(--gray)!important}.read-mode #article-container .btn-beautify,.read-mode #article-container .hide-button,.read-mode #article-container .hl-label{border:1px solid var(--gray)!important;background:var(--readmode-light-color)!important;color:var(--font-color)!important}.read-mode #article-container .note{border:2px solid var(--gray);border-left-color:var(--gray)!important;filter:none;background-color:var(--readmode-light-color)!important;color:var(--font-color)}.read-mode #article-container .note .note-icon,.read-mode #article-container .note:before{color:var(--font-color)}.search-dialog{position:fixed;top:10%;left:50%;z-index:1001;display:none;margin-left:-300px;padding:20px;width:600px;border-radius:8px;background:var(--search-bg);--search-height:100vh}@media screen and (max-width:768px){.search-dialog{top:0;left:0;margin:0;width:100%;height:100%;border-radius:0}}.search-dialog hr{margin:20px auto}.search-dialog .search-nav{margin:0 0 14px;color:#49b1f5;font-size:1.4em;line-height:1}.search-dialog .search-nav .search-dialog-title{margin-right:10px}.search-dialog .search-nav .search-close-button{float:right;color:#858585;-webkit-transition:color .2s ease-in-out;-moz-transition:color .2s ease-in-out;-o-transition:color .2s ease-in-out;-ms-transition:color .2s ease-in-out;transition:color .2s ease-in-out}.search-dialog .search-nav .search-close-button:hover{color:#49b1f5}.search-dialog hr{margin:20px auto}#search-mask{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none;background:rgba(0,0,0,.6)}#local-search .search-dialog .local-search-box{margin:0 auto;max-width:100%;width:100%}#local-search .search-dialog .local-search-box input{padding:5px 14px;width:100%;outline:0;border:2px solid #49b1f5;border-radius:40px;background:var(--search-bg);color:var(--search-input-color);-webkit-appearance:none}#local-search .search-dialog .search-wrap{display:none}#local-search .search-dialog .local-search-hit-item{position:relative;padding-left:24px;line-height:1.7}#local-search .search-dialog .local-search-hit-item:hover:before{border-color:var(--pseudo-hover)}#local-search .search-dialog .local-search-hit-item:before{position:absolute;top:.45em;left:0;width:.5em;height:.5em;border:3px solid #49b1f5;border-radius:.5em;background:0 0;content:'';line-height:.5em;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;-ms-transition:all .2s ease-in-out;transition:all .2s ease-in-out}#local-search .search-dialog .local-search-hit-item a{display:block;color:var(--search-a-color)}#local-search .search-dialog .local-search-hit-item a:hover{color:#49b1f5}#local-search .search-dialog .local-search-hit-item .search-result-title{font-weight:600}#local-search .search-dialog .local-search-hit-item .search-result{margin:0 0 8px}#local-search .search-dialog .search-result-list{overflow-y:overlay;margin:0 -20px;padding:0 22px;max-height:calc(80vh - 200px)}@media screen and (max-width:768px){#local-search .search-dialog .search-result-list{max-height:calc(var(--search-height) - 220px)!important}}.search-keyword{background:0 0;color:#f47466;font-weight:700} \ No newline at end of file diff --git a/essay/index.html b/essay/index.html index edf2f4a23..bf6c703d8 100644 --- a/essay/index.html +++ b/essay/index.html @@ -1 +1 @@ -哔哔一下 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +哔哔一下 | GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/index.html b/index.html index 46338b94b..f6258955a 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
english one
python自动化配置参数
自动获取driver
Hello World
Butterfly美化记录五
考研进度实况
Butterfly美化记录四
Butterfly美化记录三
Butterfly美化记录一
Butterfly美化记录二
长难句一
2023立的flag
包装类
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
english one
python自动化配置参数
自动获取driver
Hello World
Butterfly美化记录五
考研进度实况
Butterfly美化记录四
Butterfly美化记录三
Butterfly美化记录二
Butterfly美化记录一
长难句一
2023立的flag
包装类
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/js/custom/fixed_card_widget.js b/js/custom/fixed_card_widget.js new file mode 100644 index 000000000..5b69856ad --- /dev/null +++ b/js/custom/fixed_card_widget.js @@ -0,0 +1 @@ +function FixedCardWidget(e,d,i){if("id"===e)var t=document.getElementById(d);else t=document.getElementsByClassName(d)[i];t&&(t.className.indexOf("fixed-card-widget")>-1?RemoveFixedCardWidget():(RemoveFixedCardWidget(),CreateQuitBox(),t.classList.add("fixed-card-widget")))}function CreateQuitBox(){document.getElementById("aside-content").insertAdjacentHTML("beforebegin",'
')}function RemoveFixedCardWidget(){var e=document.querySelectorAll(".fixed-card-widget");if(e)for(i=0;iGGLSS - Research • 呓语
字符串
抽象类与接口
继承、重写与重载
硬件性能监控平台
Gaussian Random Timer定时器
Regular Expression Extractor正则表达式处理器
Groovy编写方法
Constant Throughput Timer定时器
Arrivals Thread Group的使用
Ultimate Thread Group的使用
Constant Timer定时器
循环控制器Loop Controller
Modeule Controller和Include Controller
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
字符串
抽象类与接口
继承、重写与重载
硬件性能监控平台
Constant Throughput Timer定时器
Regular Expression Extractor正则表达式处理器
Gaussian Random Timer定时器
Groovy编写方法
Arrivals Thread Group的使用
Ultimate Thread Group的使用
循环控制器Loop Controller
Constant Timer定时器
Modeule Controller和Include Controller
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/page/3/index.html b/page/3/index.html index 28febbce8..1706a4399 100644 --- a/page/3/index.html +++ b/page/3/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
随机控制器Random Controller和Random Order Controller
逻辑控制器Simple Controller
逻辑控制器If Controller
事务控制器Transcation Controller
使用moko编写Get和Post测试接口(二)
使用moko编写测试接口(无)
使用moko编写测试接口(一)
使用moko编写包含cookie信息的测试接口(二)
使用moko编写测试接口(五)
使用moko编写重定向测试接口(四)
jmeter对数据库进行增删改查
jmeter自动化压力测试
Jmeter之json数据提取和参数传递
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
逻辑控制器If Controller
逻辑控制器Simple Controller
随机控制器Random Controller和Random Order Controller
事务控制器Transcation Controller
使用moko编写测试接口(无)
使用moko编写包含cookie信息的测试接口(二)
使用moko编写Get和Post测试接口(二)
使用moko编写重定向测试接口(四)
使用moko编写测试接口(一)
使用moko编写测试接口(五)
jmeter对数据库进行增删改查
jmeter自动化压力测试
Jmeter之json数据提取和参数传递
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/page/4/index.html b/page/4/index.html index 9d5beacff..bdb2916a7 100644 --- a/page/4/index.html +++ b/page/4/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
Jmeter之全局参数设置和csv数据导入
Jmeter之静默压测
Jmeter之断言和聚合报告
测试必会的sql基本操作
开发获得cookie的Post登录接口
开发获取用户列表的Post接口
返回cookie的Get接口开发
开发时遇到端口冲突解决办法
接口开发环境部署
需要参数才能访问的get请求
需要cookie访问的Get接口开发
性能监控平台
使用docker的ubuntu容器安装code-server
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
Jmeter之全局参数设置和csv数据导入
Jmeter之静默压测
Jmeter之断言和聚合报告
测试必会的sql基本操作
开发获得cookie的Post登录接口
开发获取用户列表的Post接口
开发时遇到端口冲突解决办法
接口开发环境部署
需要cookie访问的Get接口开发
需要参数才能访问的get请求
返回cookie的Get接口开发
使用docker的ubuntu容器安装code-server
性能监控平台
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/page/5/index.html b/page/5/index.html index bd815eefa..111c40922 100644 --- a/page/5/index.html +++ b/page/5/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
git提示Timed out的解决办法
使用Java解析Properties文件
java基础之方法和函数
关闭chrome浏览器自动更新
自动化基础之Xpath定位
使用Postman如何做接口测试
解析Excel用于数据驱动
解析ini文件用于数据驱动
如何使用pyyaml获取yaml里面的数据
Shell工具(一)
Shell条件判断
Shell函数
Shell流程控制
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
git提示Timed out的解决办法
使用Java解析Properties文件
java基础之方法和函数
关闭chrome浏览器自动更新
自动化基础之Xpath定位
使用Postman如何做接口测试
解析ini文件用于数据驱动
解析Excel用于数据驱动
Shell函数
Shell条件判断
Shell运算符
Shell流程控制
如何使用pyyaml获取yaml里面的数据
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/page/6/index.html b/page/6/index.html index 0bbd411f0..c4c6d1dc2 100644 --- a/page/6/index.html +++ b/page/6/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
Shell运算符
Shell工具(二)
Shell脚本入门
Shell变量
Shell脚本初探
css教程一
_3主3从的`Redis集群`搭建(下)
_mysql主从复制docker版
_3主3从的`Redis集群`搭建(上)
_3主3从的`Redis集群`搭建之哈希槽算法
_dockerfile
_主从容错切换迁移
docker 帮助启动类命令(一)
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
Shell工具(二)
Shell工具(一)
Shell脚本初探
Shell脚本入门
Shell变量
使用pip install报错的解决办法
css教程一
_3主3从的`Redis集群`搭建(下)
_3主3从的`Redis集群`搭建之哈希槽算法
_3主3从的`Redis集群`搭建(上)
_主从容错切换迁移
docker 帮助启动类命令(一)
docker 帮助启动类命令(二)
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/page/7/index.html b/page/7/index.html index 546683148..9725e4a8f 100644 --- a/page/7/index.html +++ b/page/7/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
docker 帮助启动类命令(二)
docker 镜像(一)
docker 镜像(二)
redis的4主4从缩容
redis的3主3从扩容
使用docker安装常用软件:mysql
容器数据卷
使用docker安装常用软件:redis
使用docker安装常用软件:tomcat
容器(一)
本地镜像发布到私有库
容器(二)
本地镜像发布到阿里云
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
docker 镜像(二)
_mysql主从复制docker版
redis的3主3从扩容
使用docker安装常用软件:mysql
_dockerfile
redis的4主4从缩容
使用docker安装常用软件:redis
使用docker安装常用软件:tomcat
容器(一)
容器(三)
容器数据卷
docker 镜像(一)
本地镜像发布到私有库
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/page/8/index.html b/page/8/index.html index c3af51812..9db3acf58 100644 --- a/page/8/index.html +++ b/page/8/index.html @@ -1 +1 @@ -GGLSS - Research • 呓语
镜像
容器(三)
使用pip install报错的解决办法
Yaml的使用
性能测试主要关注点
使用jmeter录制压测
马哲
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS - Research • 呓语
容器(二)
本地镜像发布到阿里云
镜像
使用jmeter录制压测
Yaml的使用
性能测试主要关注点
马哲
高数一
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/1.html b/posts/1.html index bcb73fa45..79f0a752f 100644 --- a/posts/1.html +++ b/posts/1.html @@ -1 +1 @@ -自动获取driver | GGLSS

自动获取driver

自动获取driver

chrome

下载驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
@staticmethod
def down_driver(option):
'''
return: 返回driver,可以直接使用
'''
driver = webdriver.Chrome(
ChromeDriverManager(
url="https://registry.npmmirror.com/-/binary/chromedriver",
latest_release_url="https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE",
cache_valid_range=365).install(),
options=option)
driver.delete_all_cookies()
return driver

下载2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@staticmethod
def determin_chrome_driver():

chrome_path = r'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'


# 指定谷歌驱动目标位置
folder_path = os.path.join(ROOT_DIR, "env_setting")
# 驱动名称
file_name = 'chromedriver.exe'
# 路径拼接
file_path = os.path.join(folder_path, file_name)

if os.path.exists(file_path):
# 获取chromedriver.exe版本(谷歌浏览器驱动)
result = subprocess.run([file_path, '--version'], capture_output=True, text=True)
driverversion = '.'.join(result.stdout.strip().split(' ')[1].split('.')[:-1])

# 获取chrome.exe版本(谷歌浏览器)
command = f'wmic datafile where name="{chrome_path}" get Version /value'
result_a = subprocess.run(command, capture_output=True, text=True, shell=True)
output = result_a.stdout.strip()
chromeversion = '.'.join(output.split('=')[1].split('.')[0:3])

# 判断版本是否一致,不一致就重新下载
if driverversion != chromeversion:
# 使用ChromeDriverManager安装ChromeDriver,并获取驱动程序的路径
download_driver_path = ChromeDriverManager().install()
# 复制文件到目标位置
shutil.copy(download_driver_path, folder_path)
else:
print("版本一致,无需重新下载!")

else:
download_driver_path = ChromeDriverManager().install()
shutil.copy(download_driver_path, folder_path)

return file_path

edge

下载驱动

1
2
3
4
5
6
7
8
9
10
11
from webdriver_manager.microsoft import EdgeChromiumDriverManager

@staticmethod
def download_edgedriver():
'''
function:下载edge浏览器驱动
return: 返回一个下载的路径
'''
folder_path = EdgeChromiumDriverManager().install()
shutil.copy(folder_path, webDriver) # 拷贝folder_path到webDriver目录下
return folder_path

使用

1
2
# driver = webdriver.Edge(service=Service(下载路径))
driver = webdriver.Edge(service=Service(ddDriver.download_edgedriver()))

firefox

下载驱动

1
2
3
4
5
6
7
8
9
10
@staticmethod
def down_driver(option):
driver = webdriver.Firefox
(
service=FirefoxService(GeckoDriverManager(url="https://github.com/mozilla/geckodriver/releases/download",
latest_release_url="https://api.github.com/repos/mozilla/geckodriver/"
"releases/latest",
cache_valid_range=365).install(),
options=option))
return driver
文章作者: gglss
文章链接: http://example.com/posts/1.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +自动获取driver | GGLSS

自动获取driver

自动获取driver

chrome

下载驱动

1
2
3
4
5
6
7
8
9
10
11
12
13
@staticmethod
def down_driver(option):
'''
return: 返回driver,可以直接使用
'''
driver = webdriver.Chrome(
ChromeDriverManager(
url="https://registry.npmmirror.com/-/binary/chromedriver",
latest_release_url="https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE",
cache_valid_range=365).install(),
options=option)
driver.delete_all_cookies()
return driver

下载2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
@staticmethod
def determin_chrome_driver():

chrome_path = r'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'


# 指定谷歌驱动目标位置
folder_path = os.path.join(ROOT_DIR, "env_setting")
# 驱动名称
file_name = 'chromedriver.exe'
# 路径拼接
file_path = os.path.join(folder_path, file_name)

if os.path.exists(file_path):
# 获取chromedriver.exe版本(谷歌浏览器驱动)
result = subprocess.run([file_path, '--version'], capture_output=True, text=True)
driverversion = '.'.join(result.stdout.strip().split(' ')[1].split('.')[:-1])

# 获取chrome.exe版本(谷歌浏览器)
command = f'wmic datafile where name="{chrome_path}" get Version /value'
result_a = subprocess.run(command, capture_output=True, text=True, shell=True)
output = result_a.stdout.strip()
chromeversion = '.'.join(output.split('=')[1].split('.')[0:3])

# 判断版本是否一致,不一致就重新下载
if driverversion != chromeversion:
# 使用ChromeDriverManager安装ChromeDriver,并获取驱动程序的路径
download_driver_path = ChromeDriverManager().install()
# 复制文件到目标位置
shutil.copy(download_driver_path, folder_path)
else:
print("版本一致,无需重新下载!")

else:
download_driver_path = ChromeDriverManager().install()
shutil.copy(download_driver_path, folder_path)

return file_path

edge

下载驱动

1
2
3
4
5
6
7
8
9
10
11
from webdriver_manager.microsoft import EdgeChromiumDriverManager

@staticmethod
def download_edgedriver():
'''
function:下载edge浏览器驱动
return: 返回一个下载的路径
'''
folder_path = EdgeChromiumDriverManager().install()
shutil.copy(folder_path, webDriver) # 拷贝folder_path到webDriver目录下
return folder_path

使用

1
2
# driver = webdriver.Edge(service=Service(下载路径))
driver = webdriver.Edge(service=Service(ddDriver.download_edgedriver()))

firefox

下载驱动

1
2
3
4
5
6
7
8
9
10
@staticmethod
def down_driver(option):
driver = webdriver.Firefox
(
service=FirefoxService(GeckoDriverManager(url="https://github.com/mozilla/geckodriver/releases/download",
latest_release_url="https://api.github.com/repos/mozilla/geckodriver/"
"releases/latest",
cache_valid_range=365).install(),
options=option))
return driver
文章作者: gglss
文章链接: http://example.com/posts/1.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/10988.html b/posts/10988.html index 695d6f749..c38c84b3e 100644 --- a/posts/10988.html +++ b/posts/10988.html @@ -1 +1 @@ -使用moko编写Get和Post测试接口(二) | GGLSS

使用moko编写Get和Post测试接口(二)

上一节已经写了规则,这次直接来编写Get和Post请求

模拟一个没有参数的get请求

1
2
3
4
5
6
7
8
9
10
{
"description": "模拟一个没有参数的get请求",
"request": {
"uri": "/getdemo",
"method": "get"
},
"response": {
"text": "这是一个没有参数的get请求"
}
}

模拟一个带参数的请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"description": "模拟一个带参数的请求",
"request": {
"uri": "getwithparam",
"method": "get",
"queries": {
"name": "胡汉三",
"age": "18"
}
},
"response": {
"text": "我胡汉三又回来了!!!!!"
}
}

模拟一个Post请求

1
2
3
4
5
6
7
8
9
10
{
"description": "模拟一个Post请求",
"request": {
"uri": "/postdemo",
"method": "post"
},
"response": {
"text": "这是我的第一个mosk的post请求"
}
}

这是一个带参数的post请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"description": "这是一个带参数的post请求",
"request": {
"uri": "/postwithparam",
"method": "post",
"forms": {
"name": "胡汉三",
"sex": "男人"
}
},
"response": {
"text": "我胡汉三带着参数来了!!!!"
}
}
文章作者: gglss
文章链接: http://example.com/posts/10988.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用moko编写Get和Post测试接口(二) | GGLSS

使用moko编写Get和Post测试接口(二)

上一节已经写了规则,这次直接来编写Get和Post请求

模拟一个没有参数的get请求

1
2
3
4
5
6
7
8
9
10
{
"description": "模拟一个没有参数的get请求",
"request": {
"uri": "/getdemo",
"method": "get"
},
"response": {
"text": "这是一个没有参数的get请求"
}
}

模拟一个带参数的请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"description": "模拟一个带参数的请求",
"request": {
"uri": "getwithparam",
"method": "get",
"queries": {
"name": "胡汉三",
"age": "18"
}
},
"response": {
"text": "我胡汉三又回来了!!!!!"
}
}

模拟一个Post请求

1
2
3
4
5
6
7
8
9
10
{
"description": "模拟一个Post请求",
"request": {
"uri": "/postdemo",
"method": "post"
},
"response": {
"text": "这是我的第一个mosk的post请求"
}
}

这是一个带参数的post请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"description": "这是一个带参数的post请求",
"request": {
"uri": "/postwithparam",
"method": "post",
"forms": {
"name": "胡汉三",
"sex": "男人"
}
},
"response": {
"text": "我胡汉三带着参数来了!!!!"
}
}
文章作者: gglss
文章链接: http://example.com/posts/10988.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/11643.html b/posts/11643.html index 4f83dd4f0..defab45d6 100644 --- a/posts/11643.html +++ b/posts/11643.html @@ -1 +1 @@ -Butterfly美化记录四 | GGLSS

Butterfly美化记录四

文章页H1-H6添加小风车

使用的安知鱼

修改主题配置文件

1
2
3
4
5
6
beautify:
enable: true
field: post # site/post
# title-prefix-icon: '\f0c1' 原内容
title-prefix-icon: '\f863'
title-prefix-icon-color: "#F47466"

让小风车转起来

在自定义 [blog]/source/self/css/custom.css 文件中,加入以下代码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* 文章页H1-H6图标样式效果 */
h1::before,
h2::before,
h3::before,
h4::before,
h5::before,
h6::before {
-webkit-animation: ccc 1.6s linear infinite;
animation: ccc 1.6s linear infinite;
}
@-webkit-keyframes ccc {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(-1turn);
transform: rotate(-1turn);
}
}
@keyframes ccc {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(-1turn);
transform: rotate(-1turn);
}
}

小风车的颜色和大小

修改小风车的颜色和大小,加入下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#content-inner.layout h1::before {
color: #ef50a8;
margin-left: -1.55rem;
font-size: 1.3rem;
margin-top: -0.23rem;
}
#content-inner.layout h2::before {
color: #fb7061;
margin-left: -1.35rem;
font-size: 1.1rem;
margin-top: -0.12rem;
}
#content-inner.layout h3::before {
color: #ffbf00;
margin-left: -1.22rem;
font-size: 0.95rem;
margin-top: -0.09rem;
}
#content-inner.layout h4::before {
color: #a9e000;
margin-left: -1.05rem;
font-size: 0.8rem;
margin-top: -0.09rem;
}
#content-inner.layout h5::before {
color: #57c850;
margin-left: -0.9rem;
font-size: 0.7rem;
margin-top: 0rem;
}
#content-inner.layout h6::before {
color: #5ec1e0;
margin-left: -0.9rem;
font-size: 0.66rem;
margin-top: 0rem;
}

小风车hover效果

设置鼠标碰到标题时,小风车跟随标题变色,且像是被光标阻碍了,转速变慢。鼠标离开恢复转速。也可以设置为 none 鼠标碰到停止转动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#content-inner.layout h1:hover,
#content-inner.layout h2:hover,
#content-inner.layout h3:hover,
#content-inner.layout h4:hover,
#content-inner.layout h5:hover,
#content-inner.layout h6:hover {
color: #3b70fc;
}
#content-inner.layout h1:hover::before,
#content-inner.layout h2:hover::before,
#content-inner.layout h3:hover::before,
#content-inner.layout h4:hover::before,
#content-inner.layout h5:hover::before,
#content-inner.layout h6:hover::before {
color: #3b70fc;
-webkit-animation: ccc 3.2s linear infinite;
animation: ccc 3.2s linear infinite;
}

右下角设置 icon 转的太快了,让它慢一点吧。继续添加:

1
2
3
4
/* 页面设置icon转动速度调整 */
#rightside_config i.fas.fa-cog.fa-spin {
animation: fa-spin 5s linear infinite;
}

文章加密

安装插件

通过插件,实现文章输入密码才能浏览

1
npm install hexo-blog-encrypt --save

修改文章

在文章头部加入

1
2
3
4
5
---
title: 加密文章测试,输入test即可查看
password: test
message: 测试加密,这里的密码是:test
---

https://blog.bywind.xyz/posts/ab6e072d.html#%E6%B7%BB%E5%8A%A0css%E6%A0%B7%E5%BC%8F

https://www.qcqx.cn/article/dbde845d.html

网站加速压缩

  • hexo g

  • gulp

  • hexo d

文章作者: gglss
文章链接: http://example.com/posts/11643.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Butterfly美化记录四 | GGLSS

Butterfly美化记录四

文章页H1-H6添加小风车

使用的安知鱼

修改主题配置文件

1
2
3
4
5
6
beautify:
enable: true
field: post # site/post
# title-prefix-icon: '\f0c1' 原内容
title-prefix-icon: '\f863'
title-prefix-icon-color: "#F47466"

让小风车转起来

在自定义 [blog]/source/self/css/custom.css 文件中,加入以下代码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* 文章页H1-H6图标样式效果 */
h1::before,
h2::before,
h3::before,
h4::before,
h5::before,
h6::before {
-webkit-animation: ccc 1.6s linear infinite;
animation: ccc 1.6s linear infinite;
}
@-webkit-keyframes ccc {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(-1turn);
transform: rotate(-1turn);
}
}
@keyframes ccc {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(-1turn);
transform: rotate(-1turn);
}
}

小风车的颜色和大小

修改小风车的颜色和大小,加入下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#content-inner.layout h1::before {
color: #ef50a8;
margin-left: -1.55rem;
font-size: 1.3rem;
margin-top: -0.23rem;
}
#content-inner.layout h2::before {
color: #fb7061;
margin-left: -1.35rem;
font-size: 1.1rem;
margin-top: -0.12rem;
}
#content-inner.layout h3::before {
color: #ffbf00;
margin-left: -1.22rem;
font-size: 0.95rem;
margin-top: -0.09rem;
}
#content-inner.layout h4::before {
color: #a9e000;
margin-left: -1.05rem;
font-size: 0.8rem;
margin-top: -0.09rem;
}
#content-inner.layout h5::before {
color: #57c850;
margin-left: -0.9rem;
font-size: 0.7rem;
margin-top: 0rem;
}
#content-inner.layout h6::before {
color: #5ec1e0;
margin-left: -0.9rem;
font-size: 0.66rem;
margin-top: 0rem;
}

小风车hover效果

设置鼠标碰到标题时,小风车跟随标题变色,且像是被光标阻碍了,转速变慢。鼠标离开恢复转速。也可以设置为 none 鼠标碰到停止转动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#content-inner.layout h1:hover,
#content-inner.layout h2:hover,
#content-inner.layout h3:hover,
#content-inner.layout h4:hover,
#content-inner.layout h5:hover,
#content-inner.layout h6:hover {
color: #3b70fc;
}
#content-inner.layout h1:hover::before,
#content-inner.layout h2:hover::before,
#content-inner.layout h3:hover::before,
#content-inner.layout h4:hover::before,
#content-inner.layout h5:hover::before,
#content-inner.layout h6:hover::before {
color: #3b70fc;
-webkit-animation: ccc 3.2s linear infinite;
animation: ccc 3.2s linear infinite;
}

右下角设置 icon 转的太快了,让它慢一点吧。继续添加:

1
2
3
4
/* 页面设置icon转动速度调整 */
#rightside_config i.fas.fa-cog.fa-spin {
animation: fa-spin 5s linear infinite;
}

文章加密

安装插件

通过插件,实现文章输入密码才能浏览

1
npm install hexo-blog-encrypt --save

修改文章

在文章头部加入

1
2
3
4
5
---
title: 加密文章测试,输入test即可查看
password: test
message: 测试加密,这里的密码是:test
---

https://blog.bywind.xyz/posts/ab6e072d.html#%E6%B7%BB%E5%8A%A0css%E6%A0%B7%E5%BC%8F

https://www.qcqx.cn/article/dbde845d.html

网站加速压缩

  • hexo g

  • gulp

  • hexo d

文章作者: gglss
文章链接: http://example.com/posts/11643.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/11783.html b/posts/11783.html index eaf17821a..4744d0325 100644 --- a/posts/11783.html +++ b/posts/11783.html @@ -1 +1 @@ -测试必会的sql基本操作 | GGLSS

测试必会的sql基本操作

1、创建数据库
1
2
create database 数据库名;
create database 数据库名 character set 字符集;
2、查看全部的数据库
1
show databases;   

3、查看某个数据库的定义的信息:

1
show create database 数据库名;         
4、删除数据库
1
drop database 数据库名称;

5、切换数据库:

1
use 数据库名;

6、查看正在使用的数据库:

1
select database();          

7、查看数据库中的所有表:

1
show tables;

8、查看表结构:

1
desc 表名;    

9、修改表删除列.

1
alter table 表名 drop 列名;            

10、修改表名

1
rename table 表名 to 新表名;              

11、修改表的字符集

1
alter table 表名 character set 字符集;

12、数据类型与约束

  • int :整数 有符号和无符号,长度不受限制
  • varchar:字符串 中文/数字/字母都是一字字符,受长度限制
  • decimal :小数 decimal(5,2)总长度5位,整数3位,小数2位
  • 主键 id :int unsigned primary key auto_increment
  • 非空 :not null
  • 唯一 :unique
  • 默认 :default

SQL中表的操作

1、创建表

1
create table 表名(字段名 类型 约束,.....)

2、删除表

1
2
drop table 表名
drop table if exists 表名

3、表数据操作

3.1、添加数据
1
2
insert into 表名 values(值1,值2...)给表中所有字段插入数据
insert into 表名(字段2,字段1values(值2,值1
3.2、修改数据
1
2
update 表名 set 字段1=1,字段2=2 where 条件
isdelete 逻辑删除
3.3、删除数据
1
delete from 表名 where 条件
3.4、查询数据
  • 3.4.1、查询表中所有信息
    1
    select * from 表名 where 条件
  • 3.4.2、查询表中指定字段
    1
    select 字段1,字段2,字段3...from 表名 where 条件
  • 3.4.3、给字段取别名
    1
    select 字段1as) 别名,字段2 别名 from 表名 where 条件
  • 3.4.4、去重
    1
    select distinct 字段 from 表名 where 条件
  • 3.4.5、比较运算符
    1
    select * from 表名 where age>20
  • 3.4.6、逻辑运算符
    • and 满足所有条件

    • or 满足其中任意一个条件

    • not 不满足条件

  • 3.4.7、模糊查询
    • like
    • % 0到任意多个字符
    • _表示任意一个字符
  • 3.4.8、范围查询
    • in 在一个非连续的范围内
    • between and 在一个连续的范围内 闭区间 小的数据在前
  • 3.4.9、空查询
    • is null
    • ‘’空字符串
3.5、多表查询
  • 3.5.1、排序

    1
    2
    select * from 表名 where 条件 order by1asc|desc,列2 asc|desc
    select * from student where 条件 order by convert(字段 using gbk)asc|desc 纯中文转换后排序
  • 3.5.2、聚合函数

    1
    2
    3
    4
    5
    6
    count: 总数 select count(*/字段)from 表名 where 条件 
    max: 最大值 select max(age) from 表名 where 条件
    min: 最小值 select min(age) from 表名 where 条件
    avg: 平均值 select avg(grade) from 表名 where 条件
    sum: 求和 select sum(grade) from 表名 where 条件
    select avg(age)as 平均年龄,max(age)最大年龄,min(age)最小年龄 from 表名 where 条件
  • 3.5.3、分组

    1
    select * from 表名 group by 字段,字段2 having 条件
  • 3.5.4、分页

    1
    2
    select * from 表名 limit 05 从第一行数据开始,显示5
    select * from 表名 limit (n-1*m,m n代表第几页,m代表每页显示多少条数据
  • 3.5.5、等值连接

    1
    2
    3
    4
    方式一 :
    select * from1,表2,表3 where1.=2.and2.=3.where 条件
    方式二 内连接 取交集:
    select * from1 inner join2 on1.=2.inner join3 on2.=3.where 条件
  • 3.5.6、左连接

    左边的表全显示,右边表能匹配的上的数据连接显示,匹配不上(没有的)以null补充

    1
    select * from1 left join2 on1.=2.left join3 on2.=3.where 条件
  • 3.5.7、右连接

    右边的表全显示,左边表能匹配上的数据连接显示,匹配不上(没有的)以null补充

    1
    select * from1 right join2 on1.=2.right join3 on2.=3.where 条件
  • 3.5.8、自关联

    1
    select * from 表 别名1 inner join 表 别名2 on 别名1.aid=别名2.pid
  • 3.5.9、子查询
    • 标量子查询

    子查询结果输出的是一行一列

    1
    select * from student where age>(select avg(age) from student)
    • 列子查询

    子查询的结果输出的是一列多行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    in:  
    select * from student where age in
    (select age from student where age=18)

    any/some: >:大于最小的; <: 小于最大的
    select * from student where age>/< any
    (select age from student where age between 18 and 22)

    all: >:大于最大的; <: 小于最小的
    select * from student where age>/<all
    (select age from student where age between 18 and 22
    • 行子查询

    子查询的结果输出的是一行多列

    1
    select * from student where(name,sex)=select name,sex from student where sex='男' order by age desc limit 1
    • 表子查询

    子查询的输出结果是一个表

    1
    select * from scores inner joinselect cno from courses where cname in('数据库',‘系统测试’) as c on scores.cno=c.cno
3.6、数据分表
1
2
3
4
5
insert into goods_cate(cate_name) select distinct cate from goods;

create table goods_cate (id int unsigned primary key auto_incremen,cate varchar(10)) select distinct cate from goods;

update goods inner join goods_cate on goods_cate.cate=goods.cate set goods.cate=goods_cate.id
文章作者: gglss
文章链接: http://example.com/posts/11783.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +测试必会的sql基本操作 | GGLSS

测试必会的sql基本操作

1、创建数据库
1
2
create database 数据库名;
create database 数据库名 character set 字符集;
2、查看全部的数据库
1
show databases;   

3、查看某个数据库的定义的信息:

1
show create database 数据库名;         
4、删除数据库
1
drop database 数据库名称;

5、切换数据库:

1
use 数据库名;

6、查看正在使用的数据库:

1
select database();          

7、查看数据库中的所有表:

1
show tables;

8、查看表结构:

1
desc 表名;    

9、修改表删除列.

1
alter table 表名 drop 列名;            

10、修改表名

1
rename table 表名 to 新表名;              

11、修改表的字符集

1
alter table 表名 character set 字符集;

12、数据类型与约束

  • int :整数 有符号和无符号,长度不受限制
  • varchar:字符串 中文/数字/字母都是一字字符,受长度限制
  • decimal :小数 decimal(5,2)总长度5位,整数3位,小数2位
  • 主键 id :int unsigned primary key auto_increment
  • 非空 :not null
  • 唯一 :unique
  • 默认 :default

SQL中表的操作

1、创建表

1
create table 表名(字段名 类型 约束,.....)

2、删除表

1
2
drop table 表名
drop table if exists 表名

3、表数据操作

3.1、添加数据
1
2
insert into 表名 values(值1,值2...)给表中所有字段插入数据
insert into 表名(字段2,字段1values(值2,值1
3.2、修改数据
1
2
update 表名 set 字段1=1,字段2=2 where 条件
isdelete 逻辑删除
3.3、删除数据
1
delete from 表名 where 条件
3.4、查询数据
  • 3.4.1、查询表中所有信息
    1
    select * from 表名 where 条件
  • 3.4.2、查询表中指定字段
    1
    select 字段1,字段2,字段3...from 表名 where 条件
  • 3.4.3、给字段取别名
    1
    select 字段1as) 别名,字段2 别名 from 表名 where 条件
  • 3.4.4、去重
    1
    select distinct 字段 from 表名 where 条件
  • 3.4.5、比较运算符
    1
    select * from 表名 where age>20
  • 3.4.6、逻辑运算符
    • and 满足所有条件

    • or 满足其中任意一个条件

    • not 不满足条件

  • 3.4.7、模糊查询
    • like
    • % 0到任意多个字符
    • _表示任意一个字符
  • 3.4.8、范围查询
    • in 在一个非连续的范围内
    • between and 在一个连续的范围内 闭区间 小的数据在前
  • 3.4.9、空查询
    • is null
    • ‘’空字符串
3.5、多表查询
  • 3.5.1、排序

    1
    2
    select * from 表名 where 条件 order by1asc|desc,列2 asc|desc
    select * from student where 条件 order by convert(字段 using gbk)asc|desc 纯中文转换后排序
  • 3.5.2、聚合函数

    1
    2
    3
    4
    5
    6
    count: 总数 select count(*/字段)from 表名 where 条件 
    max: 最大值 select max(age) from 表名 where 条件
    min: 最小值 select min(age) from 表名 where 条件
    avg: 平均值 select avg(grade) from 表名 where 条件
    sum: 求和 select sum(grade) from 表名 where 条件
    select avg(age)as 平均年龄,max(age)最大年龄,min(age)最小年龄 from 表名 where 条件
  • 3.5.3、分组

    1
    select * from 表名 group by 字段,字段2 having 条件
  • 3.5.4、分页

    1
    2
    select * from 表名 limit 05 从第一行数据开始,显示5
    select * from 表名 limit (n-1*m,m n代表第几页,m代表每页显示多少条数据
  • 3.5.5、等值连接

    1
    2
    3
    4
    方式一 :
    select * from1,表2,表3 where1.=2.and2.=3.where 条件
    方式二 内连接 取交集:
    select * from1 inner join2 on1.=2.inner join3 on2.=3.where 条件
  • 3.5.6、左连接

    左边的表全显示,右边表能匹配的上的数据连接显示,匹配不上(没有的)以null补充

    1
    select * from1 left join2 on1.=2.left join3 on2.=3.where 条件
  • 3.5.7、右连接

    右边的表全显示,左边表能匹配上的数据连接显示,匹配不上(没有的)以null补充

    1
    select * from1 right join2 on1.=2.right join3 on2.=3.where 条件
  • 3.5.8、自关联

    1
    select * from 表 别名1 inner join 表 别名2 on 别名1.aid=别名2.pid
  • 3.5.9、子查询
    • 标量子查询

    子查询结果输出的是一行一列

    1
    select * from student where age>(select avg(age) from student)
    • 列子查询

    子查询的结果输出的是一列多行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    in:  
    select * from student where age in
    (select age from student where age=18)

    any/some: >:大于最小的; <: 小于最大的
    select * from student where age>/< any
    (select age from student where age between 18 and 22)

    all: >:大于最大的; <: 小于最小的
    select * from student where age>/<all
    (select age from student where age between 18 and 22
    • 行子查询

    子查询的结果输出的是一行多列

    1
    select * from student where(name,sex)=select name,sex from student where sex='男' order by age desc limit 1
    • 表子查询

    子查询的输出结果是一个表

    1
    select * from scores inner joinselect cno from courses where cname in('数据库',‘系统测试’) as c on scores.cno=c.cno
3.6、数据分表
1
2
3
4
5
insert into goods_cate(cate_name) select distinct cate from goods;

create table goods_cate (id int unsigned primary key auto_incremen,cate varchar(10)) select distinct cate from goods;

update goods inner join goods_cate on goods_cate.cate=goods.cate set goods.cate=goods_cate.id
文章作者: gglss
文章链接: http://example.com/posts/11783.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/12080.html b/posts/12080.html index 8ca9688e0..c3a0068b0 100644 --- a/posts/12080.html +++ b/posts/12080.html @@ -1 +1 @@ -解析Excel用于数据驱动 | GGLSS

解析Excel用于数据驱动

新建Excel

创建Excel数据表:learn.xlsx

解析excel

使用python的openpyxl模块来解析Excel

1、读取Excel文件

openpyxl.load_workbook(‘文件路径’)

1
excel = openpyxl.load_workbook('learn.xlsx')

2、获取sheet页里面的数据

1
2
3
4
5
6
# 获取当前活动的表单
sheet = excel.active
# 获取指定的表单
for sheets in excel.sheetnames: #获取所有表单的名称
print(sheets)
sheet = excel[sheets] #获取指定表单

3、获取单元格里面的内容

1
2
3
for values in sheet.values:
if type(value[0]) == int: #从第二行开始
print(values)

运行代码:

把Excel表里面的数据以字典格式展示:

1
2
3
4
data = {}
data["name"] = values[0]
data["value"] = values[1]
print(data)

运行代码:

文章作者: gglss
文章链接: http://example.com/posts/12080.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +解析Excel用于数据驱动 | GGLSS

解析Excel用于数据驱动

新建Excel

创建Excel数据表:learn.xlsx

解析excel

使用python的openpyxl模块来解析Excel

1、读取Excel文件

openpyxl.load_workbook(‘文件路径’)

1
excel = openpyxl.load_workbook('learn.xlsx')

2、获取sheet页里面的数据

1
2
3
4
5
6
# 获取当前活动的表单
sheet = excel.active
# 获取指定的表单
for sheets in excel.sheetnames: #获取所有表单的名称
print(sheets)
sheet = excel[sheets] #获取指定表单

3、获取单元格里面的内容

1
2
3
for values in sheet.values:
if type(value[0]) == int: #从第二行开始
print(values)

运行代码:

把Excel表里面的数据以字典格式展示:

1
2
3
4
data = {}
data["name"] = values[0]
data["value"] = values[1]
print(data)

运行代码:

文章作者: gglss
文章链接: http://example.com/posts/12080.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/12932.html b/posts/12932.html index 7706a8b9b..431cfca8c 100644 --- a/posts/12932.html +++ b/posts/12932.html @@ -1 +1 @@ -逻辑控制器If Controller | GGLSS

逻辑控制器If Controller

逻辑控制器If Controller

文章作者: gglss
文章链接: http://example.com/posts/12932.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +逻辑控制器If Controller | GGLSS

逻辑控制器If Controller

逻辑控制器If Controller

文章作者: gglss
文章链接: http://example.com/posts/12932.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/1351.html b/posts/1351.html index 58503a2b1..68f01a1a2 100644 --- a/posts/1351.html +++ b/posts/1351.html @@ -1 +1 @@ -容器数据卷 | GGLSS

容器数据卷

容器数据卷

运行带有容器数据卷的容器实例

1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

举个栗子

宿主vs容器之间映射添加容器卷

  • 使用docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 添加
1
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=ui ubuntu
  • 查看数据卷是否挂载成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
`在容器内部创建一个dockerin.txt文件
root@48955acecd79:/tmp/docker_data# touch dockerin.txt
root@48955acecd79:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 28 09:21 ./
drwxrwxrwt 1 root root 4096 Apr 28 09:18 ../
-rw-r--r-- 1 root root 0 Apr 28 09:21 dockerin.txt
`在宿主机目录下查看该文件
root@48955acecd79:/tmp/docker_data# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /tmp/host_data/
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# ll
total 0
-rw-r--r-- 1 root root 0 Apr 28 17:21 dockerin.txt
`在宿主机创建一个文件
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# touch host.txt

`在容器查看文件
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# docker exec -it 48955acecd79 bash
root@48955acecd79:/# cd /tmp/docker_data/

+ 容器和宿主机之间数据共享

[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell

+ 主机修改,docker同步获得

+ docker容器stop,主机修改,docker容器重启数据同步

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d

+ 默认是可读可写的

```shell
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
  • 修改成容器只读
1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

卷的继承和共享

  • 容器1完成和宿主机的映射
    • 容器2继承容器1,则容器2操作后同步到容器1和宿主机
    • 宿主机操作同步到容器1,容器2
    • 容器1操作同步到宿主机,容器2
1
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
文章作者: gglss
文章链接: http://example.com/posts/1351.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +容器数据卷 | GGLSS

容器数据卷

容器数据卷

运行带有容器数据卷的容器实例

1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名

举个栗子

宿主vs容器之间映射添加容器卷

  • 使用docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 添加
1
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=ui ubuntu
  • 查看数据卷是否挂载成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
`在容器内部创建一个dockerin.txt文件
root@48955acecd79:/tmp/docker_data# touch dockerin.txt
root@48955acecd79:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 28 09:21 ./
drwxrwxrwt 1 root root 4096 Apr 28 09:18 ../
-rw-r--r-- 1 root root 0 Apr 28 09:21 dockerin.txt
`在宿主机目录下查看该文件
root@48955acecd79:/tmp/docker_data# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /tmp/host_data/
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# ll
total 0
-rw-r--r-- 1 root root 0 Apr 28 17:21 dockerin.txt
`在宿主机创建一个文件
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# touch host.txt

`在容器查看文件
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# docker exec -it 48955acecd79 bash
root@48955acecd79:/# cd /tmp/docker_data/

+ 容器和宿主机之间数据共享

[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell

+ 主机修改,docker同步获得

+ docker容器stop,主机修改,docker容器重启数据同步

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d

+ 默认是可读可写的

```shell
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
  • 修改成容器只读
1
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

卷的继承和共享

  • 容器1完成和宿主机的映射
    • 容器2继承容器1,则容器2操作后同步到容器1和宿主机
    • 宿主机操作同步到容器1,容器2
    • 容器1操作同步到宿主机,容器2
1
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
文章作者: gglss
文章链接: http://example.com/posts/1351.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/13844.html b/posts/13844.html index 45bf13dbb..2dd0d7a11 100644 --- a/posts/13844.html +++ b/posts/13844.html @@ -1 +1 @@ -_dockerfile | GGLSS

_dockerfile

_dockerfile

以dockerfile的方法来进行对centos的具有vim,ifconfig和jdk8的镜像

创建myfile文件夹

创建Dockerfile文件

注意:jdk8需要和Dockerfile放到同一个文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM centos:7												
MAINTAINER zzyy<zzyybs@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

创建好Dockerfile后,运行docker build -t 新镜像名称:Tag .

注意:Tag后面有个空格,有个点

虚悬镜像

仓库名和标签名全部为的镜像

碰到它还是进行删除的好

使用docker image ls -f dangling=true查找虚悬镜像

使用docker image prune删除镜像

文章作者: gglss
文章链接: http://example.com/posts/13844.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +_dockerfile | GGLSS

_dockerfile

_dockerfile

以dockerfile的方法来进行对centos的具有vim,ifconfig和jdk8的镜像

创建myfile文件夹

创建Dockerfile文件

注意:jdk8需要和Dockerfile放到同一个文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM centos:7												
MAINTAINER zzyy<zzyybs@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

创建好Dockerfile后,运行docker build -t 新镜像名称:Tag .

注意:Tag后面有个空格,有个点

虚悬镜像

仓库名和标签名全部为的镜像

碰到它还是进行删除的好

使用docker image ls -f dangling=true查找虚悬镜像

使用docker image prune删除镜像

文章作者: gglss
文章链接: http://example.com/posts/13844.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/13923.html b/posts/13923.html index 3afd2eb8f..b9147c45c 100644 --- a/posts/13923.html +++ b/posts/13923.html @@ -1,2 +1,2 @@ 长难句一 | GGLSS

长难句一

原句

1
2
3
4
5
6
7
		Curbs on business-method claims would be a dramatic about-face, because it was the 

Federal Circuit itself that introduced such patents with its 1998 decision in the so-called

State Street Bank case, approving a patent on a way of pooling mutual-fund assets.

【2010英语一Text2】

提取单词

business: 商业

claim: 宣称,声称,断言

dramatic: 巨大而广阔的

about-face: n. (思想、态度、行为等)彻底改变; v. 向后转(同 about-turn)

federal: adj. 联邦的,政府的

分割

Curbs on business-method claims would be a dramatic about-face, because it was the Federal Circuit itself that introduced such patents with its 1998 decision in the so-called State Street Bank case,

1
<span style="font-size:2rem; background:yellow; color:red;">**Bang! Bang! Banki Banki Seiki Banki!**</span>

State Street Bank case,

 Curbs on business-method <font color=#0d26e5>claims</font> would be a dramatic about-face, because it was the  Federal Circuit 
-

itself that introduced such patents with its 1998 decision in the so-called

State Street Bank case, approving a patent on a way of pooling mutual-fund assets.

文章作者: gglss
文章链接: http://example.com/posts/13923.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +

itself that introduced such patents with its 1998 decision in the so-called

State Street Bank case, approving a patent on a way of pooling mutual-fund assets.

文章作者: gglss
文章链接: http://example.com/posts/13923.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/15488.html b/posts/15488.html index 2025f9f94..0fada82b6 100644 --- a/posts/15488.html +++ b/posts/15488.html @@ -1 +1 @@ -事务控制器Transcation Controller | GGLSS

事务控制器Transcation Controller

作用

一个事务会包含并请求,然后查看一个事务的QPS等性能指标

指标

QPS:每秒处理完请求的次数,具体指1s内发出请求到服务器处理完成并返回结果的次数

TPS:每秒处理完的事务次数,一般TPS是对整个系统来讲的,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能对应多个请求,对于衡量单个接口服务的处理能力,一般使用QPS

参数

  • Generate Parent sample:生成父样例,就是控制器里面的请求不展示

没有选中Generate Parent sample,运行后的结果是

选中后`Generate Parent sample`,运行后的结果是
文章作者: gglss
文章链接: http://example.com/posts/15488.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +事务控制器Transcation Controller | GGLSS

事务控制器Transcation Controller

作用

一个事务会包含并请求,然后查看一个事务的QPS等性能指标

指标

QPS:每秒处理完请求的次数,具体指1s内发出请求到服务器处理完成并返回结果的次数

TPS:每秒处理完的事务次数,一般TPS是对整个系统来讲的,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能对应多个请求,对于衡量单个接口服务的处理能力,一般使用QPS

参数

  • Generate Parent sample:生成父样例,就是控制器里面的请求不展示

没有选中Generate Parent sample,运行后的结果是

选中后`Generate Parent sample`,运行后的结果是
文章作者: gglss
文章链接: http://example.com/posts/15488.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/15521.html b/posts/15521.html index 179cc16f0..85b9f9d6f 100644 --- a/posts/15521.html +++ b/posts/15521.html @@ -1 +1 @@ -需要cookie访问的Get接口开发 | GGLSS

需要cookie访问的Get接口开发

编写需要cookie才能访问的接口

这个接口还是在MyGetMethod类里面编写方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 要求客户端携带cookie访问
* 这是一个需要携带cookies信息才能访问的get请求
*/
@RequestMapping(value = "/get/with/cookies", method = RequestMethod.GET)
@ApiOperation(value = "要求客户端携带cookie访问", httpMethod = "GET")
public String getWithCookies(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(Objects.isNull(cookies)){
return "你必须携带cookies信息来";
}
for(Cookie cookie : cookies){
if(cookie.getName().equals("login") && cookie.getValue().equals("True")){
return "恭喜你,访问成功!,这是一个需要携带cookies信息才能访问的get请求";
}
}
return "你必须携带cookies信息来";
}
文章作者: gglss
文章链接: http://example.com/posts/15521.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +需要cookie访问的Get接口开发 | GGLSS

需要cookie访问的Get接口开发

编写需要cookie才能访问的接口

这个接口还是在MyGetMethod类里面编写方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 要求客户端携带cookie访问
* 这是一个需要携带cookies信息才能访问的get请求
*/
@RequestMapping(value = "/get/with/cookies", method = RequestMethod.GET)
@ApiOperation(value = "要求客户端携带cookie访问", httpMethod = "GET")
public String getWithCookies(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(Objects.isNull(cookies)){
return "你必须携带cookies信息来";
}
for(Cookie cookie : cookies){
if(cookie.getName().equals("login") && cookie.getValue().equals("True")){
return "恭喜你,访问成功!,这是一个需要携带cookies信息才能访问的get请求";
}
}
return "你必须携带cookies信息来";
}
文章作者: gglss
文章链接: http://example.com/posts/15521.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/16107.html b/posts/16107.html index 736596ac7..3e886c06e 100644 --- a/posts/16107.html +++ b/posts/16107.html @@ -1 +1 @@ -Hello World | GGLSS

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

文章作者: gglss
文章链接: http://example.com/posts/16107.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Hello World | GGLSS

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

文章作者: gglss
文章链接: http://example.com/posts/16107.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/16468.html b/posts/16468.html index 2b1561ea6..3814d256d 100644 --- a/posts/16468.html +++ b/posts/16468.html @@ -1 +1 @@ -包装类 | GGLSS

包装类

  • 基本数据类型对应的包装类
基本数据类型包装类大小(字节)
byteByte1–(-128~127)
shortShort2–(-32768~32767)
intInteger4
longLong8
floatFloat4
doubleDouble8
charCharacter2
booleanBoolean1

包装类方法

  • Integer的作用主要是对int、Integer、String几种类型的数据进行转换,还能获取一些常量
方法描述
compareTo()用于将对象与方法的参数进行比较(相同类型)
decode()将方法的参数转为包装类对象
equals()判断对象是否与参数相等
Integer.parseInt(“字符串’)将字符串转为Int类型
Integer.toString(int数据)将Int类型转为字符串

compareTo()方法

  • 如果指定的数与参数相等返回 0。
  • 如果指定的数小于参数返回 -1。
  • 如果指定的数大于参数返回 1。
文章作者: gglss
文章链接: http://example.com/posts/16468.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +包装类 | GGLSS

包装类

  • 基本数据类型对应的包装类
基本数据类型包装类大小(字节)
byteByte1–(-128~127)
shortShort2–(-32768~32767)
intInteger4
longLong8
floatFloat4
doubleDouble8
charCharacter2
booleanBoolean1

包装类方法

  • Integer的作用主要是对int、Integer、String几种类型的数据进行转换,还能获取一些常量
方法描述
compareTo()用于将对象与方法的参数进行比较(相同类型)
decode()将方法的参数转为包装类对象
equals()判断对象是否与参数相等
Integer.parseInt(“字符串’)将字符串转为Int类型
Integer.toString(int数据)将Int类型转为字符串

compareTo()方法

  • 如果指定的数与参数相等返回 0。
  • 如果指定的数小于参数返回 -1。
  • 如果指定的数大于参数返回 1。
文章作者: gglss
文章链接: http://example.com/posts/16468.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/16766.html b/posts/16766.html index 40dc866b4..e8d06d723 100644 --- a/posts/16766.html +++ b/posts/16766.html @@ -1 +1 @@ -docker 帮助启动类命令(一) | GGLSS

docker 帮助启动类命令(一)

docker 帮助启动类命令(一)

启动docker

systemctl start docker

停止docker

systemctl stop docker

查看docker状态

systemctl status docker

重启 docker,没有任何提示说明启动成功

systemctl restart docker

文章作者: gglss
文章链接: http://example.com/posts/16766.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +docker 帮助启动类命令(一) | GGLSS

docker 帮助启动类命令(一)

docker 帮助启动类命令(一)

启动docker

systemctl start docker

停止docker

systemctl stop docker

查看docker状态

systemctl status docker

重启 docker,没有任何提示说明启动成功

systemctl restart docker

文章作者: gglss
文章链接: http://example.com/posts/16766.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/16785.html b/posts/16785.html index 8d3114b02..f75ddd75f 100644 --- a/posts/16785.html +++ b/posts/16785.html @@ -1 +1 @@ -开发获取用户列表的Post接口 | GGLSS

开发获取用户列表的Post接口

开发获取用户列表的post请求

开发添加人员信息时需要的字段数据

首先,写一个User类,这将是添加时的字段数据

1
2
3
4
5
6
7
8
@Data
public class User {
private String userName;
private String password;
private String name;
private String age;
private String sex;
}

然后开始写怎么获取用户列表,相当于添加用户

@RequestBody User u请求post接口时,在Body填写上传的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RequestMapping(value = "/getUserList", method = RequestMethod.POST)
@ApiOperation(value = "获取用户列表", httpMethod = "POST")
public String getUserList(HttpServletRequest request,
@RequestBody User u){
User user;
// 获取cookies
Cookie[] cookies= request.getCookies();
// 验证cookies是否合法
for(Cookie c:cookies){
if (c.getName().equals("login")
&& c.getValue().equals("true")
&& u.getUserName().equals("zhangsan")
&& u.getPassword().equals("123456")){
user = new User();
user.setName("lisi");
user.setAge("18");
user.setSex("man");
return user.toString();
}
}
return "参数不合法";
}
文章作者: gglss
文章链接: http://example.com/posts/16785.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +开发获取用户列表的Post接口 | GGLSS

开发获取用户列表的Post接口

开发获取用户列表的post请求

开发添加人员信息时需要的字段数据

首先,写一个User类,这将是添加时的字段数据

1
2
3
4
5
6
7
8
@Data
public class User {
private String userName;
private String password;
private String name;
private String age;
private String sex;
}

然后开始写怎么获取用户列表,相当于添加用户

@RequestBody User u请求post接口时,在Body填写上传的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RequestMapping(value = "/getUserList", method = RequestMethod.POST)
@ApiOperation(value = "获取用户列表", httpMethod = "POST")
public String getUserList(HttpServletRequest request,
@RequestBody User u){
User user;
// 获取cookies
Cookie[] cookies= request.getCookies();
// 验证cookies是否合法
for(Cookie c:cookies){
if (c.getName().equals("login")
&& c.getValue().equals("true")
&& u.getUserName().equals("zhangsan")
&& u.getPassword().equals("123456")){
user = new User();
user.setName("lisi");
user.setAge("18");
user.setSex("man");
return user.toString();
}
}
return "参数不合法";
}
文章作者: gglss
文章链接: http://example.com/posts/16785.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/18767.html b/posts/18767.html index 6e079d458..92f958172 100644 --- a/posts/18767.html +++ b/posts/18767.html @@ -1,4 +1,4 @@ -docker 镜像(二) | GGLSS

docker 镜像(二)

镜像(二)

查看 镜像/容器/数据 卷所占的空间

docker system df

1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 3 1.173GB 921.1MB (78%)
Containers 6 0 4.517MB 4.517MB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

删除镜像

docker rmi 镜像ID

#### 如果提示报错
+docker 镜像(二) | GGLSS

docker 镜像(二)

镜像(二)

查看 镜像/容器/数据 卷所占的空间

docker system df

1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 3 1.173GB 921.1MB (78%)
Containers 6 0 4.517MB 4.517MB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

删除镜像

docker rmi 镜像ID

#### 如果提示报错
 Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 13111f725991
 
 说明之前运行过这个镜像,生成了容器,需要先删除容器,再删除镜像
@@ -11,4 +11,4 @@
 
 #### 使用 -f 删除全部
 > docker rmi -f $(docker images -qa)
-
文章作者: gglss
文章链接: http://example.com/posts/18767.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +
文章作者: gglss
文章链接: http://example.com/posts/18767.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/20480.html b/posts/20480.html index c185ca03e..fb614933c 100644 --- a/posts/20480.html +++ b/posts/20480.html @@ -1 +1 @@ -使用Postman如何做接口测试 | GGLSS

使用Postman如何做接口测试

Postman安装

Postman下载:https://www.postman.com/downloads/

image
下载后双击即可安装,安装后需要创建账号,登录后可以在不同平台同步数据。

postman主要功能说明

postman主要模块功能介绍

image
点击最上面的测试集的添加目录图标,来新增一个根目录,这样等于新建了一个项目.可以将一个项目或一个模块的用例都存放在这个目录之下,并且在根目录下还可以创建子目录进行用例的细分.
image
image
image
image
创建了目录后可以进行用例的新建,具体是通过测试集右侧区域中的三个点来新增一个空的用例模板,当然也可以通过复制一个已有的用例来达到新建用例的目的.
image
image

发送http请求和分析响应数据

在postman中新建用例对应即将要执行的一次请求,默认为空,测试人员需要添加相应的请求信息,需要添加的信息包括:
请求的方法:get或post
请求的URL:协议+域名/IP+端口+资源路径

不带参数的请求:
image
发送需要认证的get接口:
image

------------恢复内容开始------------

## Postman安装 > Postman下载:https://www.postman.com/downloads/

image
下载后双击即可安装,安装后需要创建账号,登录后可以在不同平台同步数据。

postman主要功能说明

1、postman主要模块功能介绍

image
点击最上面的测试集的添加目录图标,来新增一个根目录,这样等于新建了一个项目.可以将一个项目或一个模块的用例都存放在这个目录之下,并且在根目录下还可以创建子目录进行用例的细分.
image
image
image
image
创建了目录后可以进行用例的新建,具体是通过测试集右侧区域中的三个点来新增一个空的用例模板,当然也可以通过复制一个已有的用例来达到新建用例的目的.
image
image

发送http请求和分析响应数据

在postman中新建用例对应即将要执行的一次请求,默认为空,测试人员需要添加相应的请求信息,需要添加的信息包括:
请求的方法:get或post
请求的URL:协议+域名/IP+端口+资源路径

get请求

不带参数的请求:
image
发送需要认证的get接口:
image

post请求

选择请求格式为post
传参:

  • Body中raw:支持任意格式的数据编辑,选json(也可xml或html传参)
  • Body中Form-data:以表单的方式进行数据编辑
  • Body中x-www-form-urlencoded:与form-data类似,也是以表单的方式进行数据编辑,但是表单中的每一条数据只能是键值对.
  • Body中Binary:用来上传文件.并且由于没有键值,因此一次只能上传一个文件.

Pre-request Scrip

image

Tests

image

postman保存测试用例

image

postman批量运行

image
image

选择文件进行参数化

json文件

image

txt文件

image
使用参数时,变量名称要与文件里的变量名保持一致

postman环境管理

image
image
引用环境信息:

postman全局变量

image
也可以用javascript写变量:
image
引用全局变量信息:
image
image
Cookie用途:一个请求需要用到用户的登录状态(sessionid或token),一般 登录状态会记录在cookie ,postman会自动记录登录状态写入cookies.所以执行非登录接口的请求前,需要先执行登录接口请求。
image

关联

------------恢复内容结束------------

------------恢复内容开始------------

## Postman安装 > Postman下载:https://www.postman.com/downloads/

image
下载后双击即可安装,安装后需要创建账号,登录后可以在不同平台同步数据。

postman主要功能说明

1、postman主要模块功能介绍

image
点击最上面的测试集的添加目录图标,来新增一个根目录,这样等于新建了一个项目.可以将一个项目或一个模块的用例都存放在这个目录之下,并且在根目录下还可以创建子目录进行用例的细分.
image
image
image
image
创建了目录后可以进行用例的新建,具体是通过测试集右侧区域中的三个点来新增一个空的用例模板,当然也可以通过复制一个已有的用例来达到新建用例的目的.
image
image

发送http请求和分析响应数据

在postman中新建用例对应即将要执行的一次请求,默认为空,测试人员需要添加相应的请求信息,需要添加的信息包括:
请求的方法:get或post
请求的URL:协议+域名/IP+端口+资源路径

get请求

不带参数的请求:
image
发送需要认证的get接口:
image

post请求

选择请求格式为post
传参:

  • Body中raw:支持任意格式的数据编辑,选json(也可xml或html传参)
  • Body中Form-data:以表单的方式进行数据编辑
  • Body中x-www-form-urlencoded:与form-data类似,也是以表单的方式进行数据编辑,但是表单中的每一条数据只能是键值对.
  • Body中Binary:用来上传文件.并且由于没有键值,因此一次只能上传一个文件.

Pre-request Scrip

image

Tests

image

postman保存测试用例

image

postman批量运行

image
image

选择文件进行参数化

json文件

image

txt文件

image
使用参数时,变量名称要与文件里的变量名保持一致

postman环境管理

image
image
引用环境信息:

postman全局变量

image
也可以用javascript写变量:
image
引用全局变量信息:
image
image
Cookie用途:一个请求需要用到用户的登录状态(sessionid或token),一般 登录状态会记录在cookie ,postman会自动记录登录状态写入cookies.所以执行非登录接口的请求前,需要先执行登录接口请求。
image

关联

断言

Postman通过tests插入断言
image

关联

把上一个接口的返回数据作为下一个参数的输入参数使用

  • 先发送一个接口,查看返回值
  • 在上一个接口的tests里面添加js脚本
    • 获取上一个接口返回值并赋值给变量
    • 定义全局变量,并获取要作为下一个接口输入的数据字段
  • 引用全局变量

生成并导出接口脚本

导出接口测试脚本

image

导出测试集

image
image

导入测试集

image

文章作者: gglss
文章链接: http://example.com/posts/20480.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用Postman如何做接口测试 | GGLSS

使用Postman如何做接口测试

Postman安装

Postman下载:https://www.postman.com/downloads/

image
下载后双击即可安装,安装后需要创建账号,登录后可以在不同平台同步数据。

postman主要功能说明

postman主要模块功能介绍

image
点击最上面的测试集的添加目录图标,来新增一个根目录,这样等于新建了一个项目.可以将一个项目或一个模块的用例都存放在这个目录之下,并且在根目录下还可以创建子目录进行用例的细分.
image
image
image
image
创建了目录后可以进行用例的新建,具体是通过测试集右侧区域中的三个点来新增一个空的用例模板,当然也可以通过复制一个已有的用例来达到新建用例的目的.
image
image

发送http请求和分析响应数据

在postman中新建用例对应即将要执行的一次请求,默认为空,测试人员需要添加相应的请求信息,需要添加的信息包括:
请求的方法:get或post
请求的URL:协议+域名/IP+端口+资源路径

不带参数的请求:
image
发送需要认证的get接口:
image

------------恢复内容开始------------

## Postman安装 > Postman下载:https://www.postman.com/downloads/

image
下载后双击即可安装,安装后需要创建账号,登录后可以在不同平台同步数据。

postman主要功能说明

1、postman主要模块功能介绍

image
点击最上面的测试集的添加目录图标,来新增一个根目录,这样等于新建了一个项目.可以将一个项目或一个模块的用例都存放在这个目录之下,并且在根目录下还可以创建子目录进行用例的细分.
image
image
image
image
创建了目录后可以进行用例的新建,具体是通过测试集右侧区域中的三个点来新增一个空的用例模板,当然也可以通过复制一个已有的用例来达到新建用例的目的.
image
image

发送http请求和分析响应数据

在postman中新建用例对应即将要执行的一次请求,默认为空,测试人员需要添加相应的请求信息,需要添加的信息包括:
请求的方法:get或post
请求的URL:协议+域名/IP+端口+资源路径

get请求

不带参数的请求:
image
发送需要认证的get接口:
image

post请求

选择请求格式为post
传参:

  • Body中raw:支持任意格式的数据编辑,选json(也可xml或html传参)
  • Body中Form-data:以表单的方式进行数据编辑
  • Body中x-www-form-urlencoded:与form-data类似,也是以表单的方式进行数据编辑,但是表单中的每一条数据只能是键值对.
  • Body中Binary:用来上传文件.并且由于没有键值,因此一次只能上传一个文件.

Pre-request Scrip

image

Tests

image

postman保存测试用例

image

postman批量运行

image
image

选择文件进行参数化

json文件

image

txt文件

image
使用参数时,变量名称要与文件里的变量名保持一致

postman环境管理

image
image
引用环境信息:

postman全局变量

image
也可以用javascript写变量:
image
引用全局变量信息:
image
image
Cookie用途:一个请求需要用到用户的登录状态(sessionid或token),一般 登录状态会记录在cookie ,postman会自动记录登录状态写入cookies.所以执行非登录接口的请求前,需要先执行登录接口请求。
image

关联

------------恢复内容结束------------

------------恢复内容开始------------

## Postman安装 > Postman下载:https://www.postman.com/downloads/

image
下载后双击即可安装,安装后需要创建账号,登录后可以在不同平台同步数据。

postman主要功能说明

1、postman主要模块功能介绍

image
点击最上面的测试集的添加目录图标,来新增一个根目录,这样等于新建了一个项目.可以将一个项目或一个模块的用例都存放在这个目录之下,并且在根目录下还可以创建子目录进行用例的细分.
image
image
image
image
创建了目录后可以进行用例的新建,具体是通过测试集右侧区域中的三个点来新增一个空的用例模板,当然也可以通过复制一个已有的用例来达到新建用例的目的.
image
image

发送http请求和分析响应数据

在postman中新建用例对应即将要执行的一次请求,默认为空,测试人员需要添加相应的请求信息,需要添加的信息包括:
请求的方法:get或post
请求的URL:协议+域名/IP+端口+资源路径

get请求

不带参数的请求:
image
发送需要认证的get接口:
image

post请求

选择请求格式为post
传参:

  • Body中raw:支持任意格式的数据编辑,选json(也可xml或html传参)
  • Body中Form-data:以表单的方式进行数据编辑
  • Body中x-www-form-urlencoded:与form-data类似,也是以表单的方式进行数据编辑,但是表单中的每一条数据只能是键值对.
  • Body中Binary:用来上传文件.并且由于没有键值,因此一次只能上传一个文件.

Pre-request Scrip

image

Tests

image

postman保存测试用例

image

postman批量运行

image
image

选择文件进行参数化

json文件

image

txt文件

image
使用参数时,变量名称要与文件里的变量名保持一致

postman环境管理

image
image
引用环境信息:

postman全局变量

image
也可以用javascript写变量:
image
引用全局变量信息:
image
image
Cookie用途:一个请求需要用到用户的登录状态(sessionid或token),一般 登录状态会记录在cookie ,postman会自动记录登录状态写入cookies.所以执行非登录接口的请求前,需要先执行登录接口请求。
image

关联

断言

Postman通过tests插入断言
image

关联

把上一个接口的返回数据作为下一个参数的输入参数使用

  • 先发送一个接口,查看返回值
  • 在上一个接口的tests里面添加js脚本
    • 获取上一个接口返回值并赋值给变量
    • 定义全局变量,并获取要作为下一个接口输入的数据字段
  • 引用全局变量

生成并导出接口脚本

导出接口测试脚本

image

导出测试集

image
image

导入测试集

image

文章作者: gglss
文章链接: http://example.com/posts/20480.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/2166.html b/posts/2166.html index 70585c241..d1ba276ae 100644 --- a/posts/2166.html +++ b/posts/2166.html @@ -1 +1 @@ -硬件性能监控平台 | GGLSS

硬件性能监控平台

拉取prometheus镜像

1
docker pull prom/prometheus

创建prometheus容器并启动

1
docker run -itd --name=docker_prometheus --restart=always -p 3090:9090 -v /opt/prometheus:/ prom/prometheus

验证

通过浏览器访问http://ip:3090进行访问

方法一:服务器上直接安装node_export

首先,用浏览器访问:node_export 下载,然后上传到被监控的服务器并解压
进入解压文件夹,直接启动./node_exporter

方法二:拉取docker node_export镜像

1
docker pull prom/node-exporter

创建node_export容器并启动

1
2
3
4
5
6
7
docker run -itd --name=node-exporter \
--restart=always \
-p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter

验证

在浏览器访问http://ip:9100/metrics进行访问

配置prometheus + node_export

node_export的作用收集硬件数据

使用vim修改yum文件容器内:/etc/prometheus/prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus

- job_name: linux
static_configs:
- targets: ['被监控的服务器ip:9100']
labels:
instance: localhost

重启prometheus容器

1
docker restart docker_prometheus

配置Grafana

使用Grafana下载版本

配置数据源

  • 数据源:选择prometheus

  • URL输入http://prometheus机器ip:3090

  • 点击Save & Test保存

添加仪表盘

使用官方仪表盘进行下载仪表盘
导入仪表盘
import via grafana.com输入框输入模板ID12884

ID:12633也可以使用。

点击 load,然后底部选择刚弄的数据源,点击import

注意:
点击json下载12884的json文件

文章作者: gglss
文章链接: http://example.com/posts/2166.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +硬件性能监控平台 | GGLSS

硬件性能监控平台

拉取prometheus镜像

1
docker pull prom/prometheus

创建prometheus容器并启动

1
docker run -itd --name=docker_prometheus --restart=always -p 3090:9090 -v /opt/prometheus:/ prom/prometheus

验证

通过浏览器访问http://ip:3090进行访问

方法一:服务器上直接安装node_export

首先,用浏览器访问:node_export 下载,然后上传到被监控的服务器并解压
进入解压文件夹,直接启动./node_exporter

方法二:拉取docker node_export镜像

1
docker pull prom/node-exporter

创建node_export容器并启动

1
2
3
4
5
6
7
docker run -itd --name=node-exporter \
--restart=always \
-p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter

验证

在浏览器访问http://ip:9100/metrics进行访问

配置prometheus + node_export

node_export的作用收集硬件数据

使用vim修改yum文件容器内:/etc/prometheus/prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus

- job_name: linux
static_configs:
- targets: ['被监控的服务器ip:9100']
labels:
instance: localhost

重启prometheus容器

1
docker restart docker_prometheus

配置Grafana

使用Grafana下载版本

配置数据源

  • 数据源:选择prometheus

  • URL输入http://prometheus机器ip:3090

  • 点击Save & Test保存

添加仪表盘

使用官方仪表盘进行下载仪表盘
导入仪表盘
import via grafana.com输入框输入模板ID12884

ID:12633也可以使用。

点击 load,然后底部选择刚弄的数据源,点击import

注意:
点击json下载12884的json文件

文章作者: gglss
文章链接: http://example.com/posts/2166.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/22551.html b/posts/22551.html index bc71130c6..e2ca67d08 100644 --- a/posts/22551.html +++ b/posts/22551.html @@ -1 +1 @@ -Groovy编写方法 | GGLSS

Groovy编写方法

关键字:

  • **log**:写入信息到jmeterlog文件,使用方法:log.info(*Thisisloginfo
  • **ctx**:该变量引用了当前线程的上下文,使用方法可参考:org.apache.imeter.threads.JMeterContext。
  • vars-(JMeterVariables):操作imeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,
    常用方法:
    • a)vars.get(Stringkey):从imeter中获得变量值
    • b)vars.put(Stringkey,Stringvalue):数据存到imeter变量中
      更多方法可参考:org.apache.imeter.threads.JMeterVariables
  • props-(JMeterProperties-classjava.util.Properties):操作imeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。
    对应于iava.util.Properties。
    • a)props.get(“START.HMS”); 注:START.HMS为属性名,在文件imeter.properties中定义
    • b)props.put(“PROP1”,”1234”);

  • prey-(SampleResult):获取前面的sample返回的信息,
    常用方法:
    • a)getResponseDataAsString():获取响应信息
    • b)getResponseCode():获取响应code
      更多方法可参考:org.apache.imeter.samplers.SampleResult
  • sampler-(Sampler):gives access to the current sampler
文章作者: gglss
文章链接: http://example.com/posts/22551.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Groovy编写方法 | GGLSS

Groovy编写方法

关键字:

  • **log**:写入信息到jmeterlog文件,使用方法:log.info(*Thisisloginfo
  • **ctx**:该变量引用了当前线程的上下文,使用方法可参考:org.apache.imeter.threads.JMeterContext。
  • vars-(JMeterVariables):操作imeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,
    常用方法:
    • a)vars.get(Stringkey):从imeter中获得变量值
    • b)vars.put(Stringkey,Stringvalue):数据存到imeter变量中
      更多方法可参考:org.apache.imeter.threads.JMeterVariables
  • props-(JMeterProperties-classjava.util.Properties):操作imeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。
    对应于iava.util.Properties。
    • a)props.get(“START.HMS”); 注:START.HMS为属性名,在文件imeter.properties中定义
    • b)props.put(“PROP1”,”1234”);

  • prey-(SampleResult):获取前面的sample返回的信息,
    常用方法:
    • a)getResponseDataAsString():获取响应信息
    • b)getResponseCode():获取响应code
      更多方法可参考:org.apache.imeter.samplers.SampleResult
  • sampler-(Sampler):gives access to the current sampler
文章作者: gglss
文章链接: http://example.com/posts/22551.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/23767.html b/posts/23767.html index ff05dc61f..31af6c701 100644 --- a/posts/23767.html +++ b/posts/23767.html @@ -1,4 +1,4 @@ -性能监控平台 | GGLSS

性能监控平台

搭建容器

拉取CentOS7镜像,下载安装Grafana和Influxdb


+性能监控平台 | GGLSS

性能监控平台

搭建容器

拉取CentOS7镜像,下载安装Grafana和Influxdb


         # 拉取阿里云的centos7镜像
         git pull registry.cn-zhangjiakou.aliyuncs.com/ggls/centos:7.1
         # 运行镜像生成容器
@@ -11,4 +11,4 @@
         # 进入容器
         docker exec -it centos7-influx bash
     
-

端口说明:

  • 8083:InfluxDB的UI界面展示的端口
  • 8086:Grafana用来从数据库取数据的端口
  • 2003:Jmeter往数据库发数据的端口
  • 3000:本地访问服务器内部docker容器的端口

安装Influxdb

  1. 下载influxDB

新版本可以点击influxDB官网进行下载

# 下载安装包 wget https://dl.influxdata.com/influxdb/releases/influxdb-1.6.3.x86_64.rpm # 安装运行 yum localinstall influxdb-1.6.3.x86_64.rpm
  1. influxDB配置

安装运行后,然后对influxDB进行配置,主要是配置Jmeter连接的数据库和端口号

vim /etc/influxdb/influxdb.conf

找到graphite并且修改它的库与端口

1
2
3
4
5
6
enabled = true
database = "jmeter"
retention-policy = ""
bind-address = ":2003"
protocol = "tcp"
consistency-level = "one"
  1. 找到[http],将前面的#号去掉
  1. 配置成功,启动influxDB
  • 启动命令: systemctl start influxdb.service
  • 查看状态命令: systemctl status influxdb.service

安装Grafana

新版本下载位置:Grafana官网下载:https://grafana.com/grafana/download

1
2
3
wget https://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpm

sudo yum localinstall grafana-6.5.2-1.x86_64.rpm

然后启动

启动命令: systemctl start grafana-server.service

查看状态命令: systemctl status grafana-server.service

然后在浏览器访问登录http://ip:3000

配置Jmeter

一、添加监听器:Backend Listener

  • 右键点击Thread Group
  • 点击Add -> Listener -> Backend Listener

二、配置监听器:Backend Listener

Backend Listener implementation 默认选择GraphiteBackendListenerClient

  • graphiteHost:InfluxDB安装的服务器的ip
  • graphitePort:端口;默认就是2003,除非你自己安装InfluxDB时设置了其他端口是哦(可见上面安装InfluxDB后关于graphite的配置)
  • rootMetricsPrefix:指标的根前缀;将测试结果存入数据库时,不同指标会生成不同表,但这些表都最好要有一个共同的前缀,这个就是了;后面会讲到不同的指标的含义(重点哦)
  • summaryOnly:当你线程组有多个请求又想知道每个请求的结果数据时,最好填false,因为true只会返回所有请求的集合数据报告,不会输出每条请求的数据报告
  • samplersList:取样器列表;想收集哪些请求就填哪些,最好用正则去匹配,减轻工作量
  • useRegexpForSamplersList:是否使用正则;如果true则使用,samplersList里可以匹配正则表达式
  • percentiles:百分比;即类似聚合报告里90% Line,95% Line,99% Line的数据;倘若想要99.9时,需要写成【99_9】,用下划线代替点

三:运行Jmeter脚本,查看数据库

数据库里面有两个库,jmeter库就是jmeter运行生成表的数据库

可以看到生成了三类前缀的表,分别是: jmeter.all 、 jmeter.[请求名称];最后还有 jmeter.test 开头的表,这个后面会单独拿出来说

前缀的含义

  • jmeter.all :代表了所有请求;当summaryOnly=true时,就只有samplerName=all的表了
  • jmeter.[请求名称]:代表了HTTP请求,即samplerName=[请求名称]

Thread/Virtual Users metrics - 线程/虚拟用户指标
跟线程组设置相关的

指标全称含义
jmeter.test.minATMin active threads最小活跃线程数
jmeter.test.maxATMax active threads最大活跃线程数
jmeter.test.meanATMean active threads平均活跃线程数
jmeter.test.startedTStarted threads启动线程数
jmeter.test.endedTFinished threads结束线程数

Response times metrics - 响应时间指标

划重点:每个sampler(请求)都包含了所有响应时间指标,每个sampler(请求)的每个指标都会有单独的一个表存储结果数据

指标含义
.ok.countsampler的成功响应数
.h.count服务器每秒命中次数(每秒点击数,即TPS)
.ok.minsampler响应成功的最短响应时间
.ok.maxsampler响应成功的最长响应时间
.ok.avgsampler响应成功的平均响应时间
.ok.pctsampler响应成功的所占百分比
.ko.countsampler的失败响应数
.ko.minsampler响应失败的最短响应时间
.ko.maxsampler响应失败的最长响应时间
.ko.avgsampler响应失败的平均响应时间
.ko.pctsampler响应失败的所占百分比
.a.countsampler响应数(ok.count+ko.count)
.sb.bytes已发送字节
.rb.bytes已接收字节
.a.minsampler响应的最短响应时间(ok.count和ko.count的最小值)
.a.maxsampler响应的最长响应时间(ok.count和ko.count的最大值)
.a.avgsampler响应的平均响应时间(ok.count和ko.count的平均值)
.a.pctsampler响应的百分比(根据成功和失败的总数来计算)

四、配置Grafana

步骤:

  • 配置数据源

  • 创建数据面板

配置数据源

点击首页的Create your first data source,然后进行配置

点击选择influxDB

配置数据面板

选择Add Query,然后进行配置

当我们只想看数据而不想看数据趋势图的话,可以改变它的类型;

在同一个界面,点击左侧列表选中第二个icon,然后选择Singlestat即可

基本的配置完成,Jmeter使用GraphiteBackendListenerClient来采集数据的,因为请求多起来的时候会有非常多的表,维护成本也会增加;后面将会介绍如何通过InfluxDBBackendListenerClient来采集数据

给Jmeter的Backend Listener配置为InfluxDBBackendListenerClient

首先来看看每个配置项的含义

  1. influxdbUrl:安装influxdb的路径;主要格式:http://主机地址:8086/write?db=数据库名
  2. application:应用名称;在 events 表中对应的字段是 application
  3. measurement:表名;数据存储到哪个表,默认是jmeter,不用改即可
  4. summaryOnly:同GraphiteBackendListenerClient
  5. samplersRegex:同GraphiteBackendListenerClient
  6. percentiles:同GraphiteBackendListenerClient
  7. testTitle:测试名称;在 events 表中对应的字段是 text ,JMeter在测试的开始和结束时自动生成注释,该注释的值以’start’和’end’结尾
  8. eventTags:Grafana允许为每个注释显示标签;在 events 表中对应的字段是 tags

inDB数据库
使用InfluxDBBackendListenerClient好处就是,再多的请求也只会生成两张表:

events :主要拿存事件的

jmeter :存测试结果数据的,Grafana也是从这个表获取数据再展示

配置数据面板

首先,进入官方模板库: https://grafana.com/dashboards ,然后跟着图片导入模板并初始化即可

然后jmeter再次执行一下测试计划

模板自带了三个下拉筛选框

  1. data_source:数据源,在Grafana配置了多少个就显示多少个

  2. application:在Jmeter配置好的application,如果每次测试计划执行时的application都不一样,你就可以通过这个筛选出对应测试时机的结果数据了

  3. transaction:在Jmeter配置好的sampleList,譬如我只发了get、post请求,这里就只会给你选get、post;可以滑到页面下面看到针对某个请求的数据展示

卸载Grafana

停止Grafana服务。

1
systemctl stop grafana-server.service
1
systemctl disable grafana-server.service

查看要卸载的包的名称

1
yum list installed

输入命令行卸载Grafana

1
yum remove grafana.x86_64
文章作者: gglss
文章链接: http://example.com/posts/23767.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +

端口说明:

  • 8083:InfluxDB的UI界面展示的端口
  • 8086:Grafana用来从数据库取数据的端口
  • 2003:Jmeter往数据库发数据的端口
  • 3000:本地访问服务器内部docker容器的端口

安装Influxdb

  1. 下载influxDB

新版本可以点击influxDB官网进行下载

# 下载安装包 wget https://dl.influxdata.com/influxdb/releases/influxdb-1.6.3.x86_64.rpm # 安装运行 yum localinstall influxdb-1.6.3.x86_64.rpm
  1. influxDB配置

安装运行后,然后对influxDB进行配置,主要是配置Jmeter连接的数据库和端口号

vim /etc/influxdb/influxdb.conf

找到graphite并且修改它的库与端口

1
2
3
4
5
6
enabled = true
database = "jmeter"
retention-policy = ""
bind-address = ":2003"
protocol = "tcp"
consistency-level = "one"
  1. 找到[http],将前面的#号去掉
  1. 配置成功,启动influxDB
  • 启动命令: systemctl start influxdb.service
  • 查看状态命令: systemctl status influxdb.service

安装Grafana

新版本下载位置:Grafana官网下载:https://grafana.com/grafana/download

1
2
3
wget https://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpm

sudo yum localinstall grafana-6.5.2-1.x86_64.rpm

然后启动

启动命令: systemctl start grafana-server.service

查看状态命令: systemctl status grafana-server.service

然后在浏览器访问登录http://ip:3000

配置Jmeter

一、添加监听器:Backend Listener

  • 右键点击Thread Group
  • 点击Add -> Listener -> Backend Listener

二、配置监听器:Backend Listener

Backend Listener implementation 默认选择GraphiteBackendListenerClient

  • graphiteHost:InfluxDB安装的服务器的ip
  • graphitePort:端口;默认就是2003,除非你自己安装InfluxDB时设置了其他端口是哦(可见上面安装InfluxDB后关于graphite的配置)
  • rootMetricsPrefix:指标的根前缀;将测试结果存入数据库时,不同指标会生成不同表,但这些表都最好要有一个共同的前缀,这个就是了;后面会讲到不同的指标的含义(重点哦)
  • summaryOnly:当你线程组有多个请求又想知道每个请求的结果数据时,最好填false,因为true只会返回所有请求的集合数据报告,不会输出每条请求的数据报告
  • samplersList:取样器列表;想收集哪些请求就填哪些,最好用正则去匹配,减轻工作量
  • useRegexpForSamplersList:是否使用正则;如果true则使用,samplersList里可以匹配正则表达式
  • percentiles:百分比;即类似聚合报告里90% Line,95% Line,99% Line的数据;倘若想要99.9时,需要写成【99_9】,用下划线代替点

三:运行Jmeter脚本,查看数据库

数据库里面有两个库,jmeter库就是jmeter运行生成表的数据库

可以看到生成了三类前缀的表,分别是: jmeter.all 、 jmeter.[请求名称];最后还有 jmeter.test 开头的表,这个后面会单独拿出来说

前缀的含义

  • jmeter.all :代表了所有请求;当summaryOnly=true时,就只有samplerName=all的表了
  • jmeter.[请求名称]:代表了HTTP请求,即samplerName=[请求名称]

Thread/Virtual Users metrics - 线程/虚拟用户指标
跟线程组设置相关的

指标全称含义
jmeter.test.minATMin active threads最小活跃线程数
jmeter.test.maxATMax active threads最大活跃线程数
jmeter.test.meanATMean active threads平均活跃线程数
jmeter.test.startedTStarted threads启动线程数
jmeter.test.endedTFinished threads结束线程数

Response times metrics - 响应时间指标

划重点:每个sampler(请求)都包含了所有响应时间指标,每个sampler(请求)的每个指标都会有单独的一个表存储结果数据

指标含义
.ok.countsampler的成功响应数
.h.count服务器每秒命中次数(每秒点击数,即TPS)
.ok.minsampler响应成功的最短响应时间
.ok.maxsampler响应成功的最长响应时间
.ok.avgsampler响应成功的平均响应时间
.ok.pctsampler响应成功的所占百分比
.ko.countsampler的失败响应数
.ko.minsampler响应失败的最短响应时间
.ko.maxsampler响应失败的最长响应时间
.ko.avgsampler响应失败的平均响应时间
.ko.pctsampler响应失败的所占百分比
.a.countsampler响应数(ok.count+ko.count)
.sb.bytes已发送字节
.rb.bytes已接收字节
.a.minsampler响应的最短响应时间(ok.count和ko.count的最小值)
.a.maxsampler响应的最长响应时间(ok.count和ko.count的最大值)
.a.avgsampler响应的平均响应时间(ok.count和ko.count的平均值)
.a.pctsampler响应的百分比(根据成功和失败的总数来计算)

四、配置Grafana

步骤:

  • 配置数据源

  • 创建数据面板

配置数据源

点击首页的Create your first data source,然后进行配置

点击选择influxDB

配置数据面板

选择Add Query,然后进行配置

当我们只想看数据而不想看数据趋势图的话,可以改变它的类型;

在同一个界面,点击左侧列表选中第二个icon,然后选择Singlestat即可

基本的配置完成,Jmeter使用GraphiteBackendListenerClient来采集数据的,因为请求多起来的时候会有非常多的表,维护成本也会增加;后面将会介绍如何通过InfluxDBBackendListenerClient来采集数据

给Jmeter的Backend Listener配置为InfluxDBBackendListenerClient

首先来看看每个配置项的含义

  1. influxdbUrl:安装influxdb的路径;主要格式:http://主机地址:8086/write?db=数据库名
  2. application:应用名称;在 events 表中对应的字段是 application
  3. measurement:表名;数据存储到哪个表,默认是jmeter,不用改即可
  4. summaryOnly:同GraphiteBackendListenerClient
  5. samplersRegex:同GraphiteBackendListenerClient
  6. percentiles:同GraphiteBackendListenerClient
  7. testTitle:测试名称;在 events 表中对应的字段是 text ,JMeter在测试的开始和结束时自动生成注释,该注释的值以’start’和’end’结尾
  8. eventTags:Grafana允许为每个注释显示标签;在 events 表中对应的字段是 tags

inDB数据库
使用InfluxDBBackendListenerClient好处就是,再多的请求也只会生成两张表:

events :主要拿存事件的

jmeter :存测试结果数据的,Grafana也是从这个表获取数据再展示

配置数据面板

首先,进入官方模板库: https://grafana.com/dashboards ,然后跟着图片导入模板并初始化即可

然后jmeter再次执行一下测试计划

模板自带了三个下拉筛选框

  1. data_source:数据源,在Grafana配置了多少个就显示多少个

  2. application:在Jmeter配置好的application,如果每次测试计划执行时的application都不一样,你就可以通过这个筛选出对应测试时机的结果数据了

  3. transaction:在Jmeter配置好的sampleList,譬如我只发了get、post请求,这里就只会给你选get、post;可以滑到页面下面看到针对某个请求的数据展示

卸载Grafana

停止Grafana服务。

1
systemctl stop grafana-server.service
1
systemctl disable grafana-server.service

查看要卸载的包的名称

1
yum list installed

输入命令行卸载Grafana

1
yum remove grafana.x86_64
文章作者: gglss
文章链接: http://example.com/posts/23767.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/24951.html b/posts/24951.html index 6c0c6c52b..2646346f5 100644 --- a/posts/24951.html +++ b/posts/24951.html @@ -1 +1 @@ -返回cookie的Get接口开发 | GGLSS

返回cookie的Get接口开发

位置布局

1
2
3
4
5
6
7
- java
- com.course.server
- intertype
MyGetMethod
Application
- resources
- application.properties

Application 类

创建Application.java类,用来运行接口,类名只能是Application,不能自定义

1
2
3
4
5
6
7
8
@SpringBootApplication
@Controller("com.course.server.intertype")
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
  • @SpringBootApplication 作用是给当前类标明是运行的主类,相当于被SpringBoot托管了
  • @Controller("com.course.server.intertype") 钩子标识符,扫描包下面的类,被Springboot托管

编写Get接口

创建MyGetMethod

类名上有修饰符@RestController@Api(value = "/")

  • @RestController 标识该类会被扫描到,然后被SpringBoot托管
  • @Api(value = "/") 可加可不加
  • @RequestMapping(value = "访问路径", method = 访问方法) 定义接口的访问路径及访问方法
  • @ApiOperation(value = "接口信息", httpMethod = "接口的请求方法") 展示接口的基本信息和它的请求方法,可加可不加

下面是代码信息,之后的所有GET接口都在该类里面写接口方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
@Api(value = "/", tags = {SwaggerConfig.TagGet} )
public class MyGetMethod {

@RequestMapping(value = "/getCookies", method = RequestMethod.GET)
@ApiOperation(value = "通过这个方法可以获得cookies", httpMethod = "GET")
public String getCookies(HttpServletResponse response){

// HttpServerletRequest 装请求信息类
// HttpServerletResponse 装响应信息类

Cookie cookie = new Cookie("login", "True");

response.addCookie(cookie);

return "恭喜获得cookies信息成功";
}
}

上面就是返回cookie的get接口开发,接下来就是 需要携带cookies信息才能访问的get请求

文章作者: gglss
文章链接: http://example.com/posts/24951.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +返回cookie的Get接口开发 | GGLSS

返回cookie的Get接口开发

位置布局

1
2
3
4
5
6
7
- java
- com.course.server
- intertype
MyGetMethod
Application
- resources
- application.properties

Application 类

创建Application.java类,用来运行接口,类名只能是Application,不能自定义

1
2
3
4
5
6
7
8
@SpringBootApplication
@Controller("com.course.server.intertype")
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
  • @SpringBootApplication 作用是给当前类标明是运行的主类,相当于被SpringBoot托管了
  • @Controller("com.course.server.intertype") 钩子标识符,扫描包下面的类,被Springboot托管

编写Get接口

创建MyGetMethod

类名上有修饰符@RestController@Api(value = "/")

  • @RestController 标识该类会被扫描到,然后被SpringBoot托管
  • @Api(value = "/") 可加可不加
  • @RequestMapping(value = "访问路径", method = 访问方法) 定义接口的访问路径及访问方法
  • @ApiOperation(value = "接口信息", httpMethod = "接口的请求方法") 展示接口的基本信息和它的请求方法,可加可不加

下面是代码信息,之后的所有GET接口都在该类里面写接口方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RestController
@Api(value = "/", tags = {SwaggerConfig.TagGet} )
public class MyGetMethod {

@RequestMapping(value = "/getCookies", method = RequestMethod.GET)
@ApiOperation(value = "通过这个方法可以获得cookies", httpMethod = "GET")
public String getCookies(HttpServletResponse response){

// HttpServerletRequest 装请求信息类
// HttpServerletResponse 装响应信息类

Cookie cookie = new Cookie("login", "True");

response.addCookie(cookie);

return "恭喜获得cookies信息成功";
}
}

上面就是返回cookie的get接口开发,接下来就是 需要携带cookies信息才能访问的get请求

文章作者: gglss
文章链接: http://example.com/posts/24951.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/25343.html b/posts/25343.html index a3b429f8e..f4e48ae75 100644 --- a/posts/25343.html +++ b/posts/25343.html @@ -1 +1 @@ -本地镜像发布到阿里云 | GGLSS

本地镜像发布到阿里云

本地镜像发布到阿里云


使用docker进行对docker镜像功能的新增后,需要发布到阿里云上对镜像进行同步,下次pull镜像就不要pull缩减版的镜像,直接pull更新后的镜像,方便后续使用

执行顺序

  • 阿里云开发者平台
  • 点击镜像容器服务
  • 创建镜像仓库
    • 创建命名空间
    • 创建镜像仓库

然后在基本信息上面就可以看到仓库指南

根据指南进行操作

文章作者: gglss
文章链接: http://example.com/posts/25343.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +本地镜像发布到阿里云 | GGLSS

本地镜像发布到阿里云

本地镜像发布到阿里云


使用docker进行对docker镜像功能的新增后,需要发布到阿里云上对镜像进行同步,下次pull镜像就不要pull缩减版的镜像,直接pull更新后的镜像,方便后续使用

执行顺序

  • 阿里云开发者平台
  • 点击镜像容器服务
  • 创建镜像仓库
    • 创建命名空间
    • 创建镜像仓库

然后在基本信息上面就可以看到仓库指南

根据指南进行操作

文章作者: gglss
文章链接: http://example.com/posts/25343.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/26527.html b/posts/26527.html index 44bcc2855..ec0a12a82 100644 --- a/posts/26527.html +++ b/posts/26527.html @@ -1 +1 @@ -css教程一 | GGLSS

css教程一

css选择器

元素选择器(Element Selector)

通过元素名称选择 HTML 元素。

1
2
3
4
5
// 如下代码,p 选择器将选择所有 <p> 元素:

p {
color: blue;
}

类选择器(Class Selector)

通过类别名称选择具有特定类别的 HTML 元素。

1
2
3
4
5
6
// 类选择器以 . 开头,后面跟着类别名称。
// 如下代码,.highlight 选择器将选择所有具有类别为 "highlight" 的元素。

.highlight {
background-color: yellow;
}

ID 选择器(ID Selector)

通过元素的唯一标识符(ID)选择 HTML 元素。

1
2
3
4
5
6
// ID 选择器以 # 开头,后面跟着 ID 名称。
// 如下代码,#runoob 选择器将选择具有 ID 为 "runoob" 的元素。

#runoob {
width: 200px;
}

属性选择器(Attribute Selector)

通过元素的属性选择 HTML 元素。属性选择器可以根据属性名和属性值进行选择。

1
2
3
4
5
// 如下代码,input[type="text"] 选择器将选择所有 type 属性为 "text" 的 <input> 元素。

input[type="text"] {
border: 1px solid gray;
}

后代选择器(Descendant Selector)

通过指定元素的后代关系选择 HTML 元素。

1
2
3
4
5
6
// 后代选择器使用空格分隔元素名称。
// 如下代码,div p 选择器将选择所有在 <div> 元素内的 <p> 元素。

div p {
font-weight: bold;
}

背景: background 属性

文章作者: gglss
文章链接: http://example.com/posts/26527.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +css教程一 | GGLSS

css教程一

css选择器

元素选择器(Element Selector)

通过元素名称选择 HTML 元素。

1
2
3
4
5
// 如下代码,p 选择器将选择所有 <p> 元素:

p {
color: blue;
}

类选择器(Class Selector)

通过类别名称选择具有特定类别的 HTML 元素。

1
2
3
4
5
6
// 类选择器以 . 开头,后面跟着类别名称。
// 如下代码,.highlight 选择器将选择所有具有类别为 "highlight" 的元素。

.highlight {
background-color: yellow;
}

ID 选择器(ID Selector)

通过元素的唯一标识符(ID)选择 HTML 元素。

1
2
3
4
5
6
// ID 选择器以 # 开头,后面跟着 ID 名称。
// 如下代码,#runoob 选择器将选择具有 ID 为 "runoob" 的元素。

#runoob {
width: 200px;
}

属性选择器(Attribute Selector)

通过元素的属性选择 HTML 元素。属性选择器可以根据属性名和属性值进行选择。

1
2
3
4
5
// 如下代码,input[type="text"] 选择器将选择所有 type 属性为 "text" 的 <input> 元素。

input[type="text"] {
border: 1px solid gray;
}

后代选择器(Descendant Selector)

通过指定元素的后代关系选择 HTML 元素。

1
2
3
4
5
6
// 后代选择器使用空格分隔元素名称。
// 如下代码,div p 选择器将选择所有在 <div> 元素内的 <p> 元素。

div p {
font-weight: bold;
}

背景: background 属性

文章作者: gglss
文章链接: http://example.com/posts/26527.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/26691.html b/posts/26691.html index 65e0b6b8a..e6b3d54a3 100644 --- a/posts/26691.html +++ b/posts/26691.html @@ -1 +1 @@ -Jmeter之json数据提取和参数传递 | GGLSS

Jmeter之json数据提取和参数传递

安装组件JSON Extractor

  • 右键Http Request
  • 点击Add -> Post Processors -> JSON Extractor

组件安装成功

组件配置

  • Names of created variables : 参数变量名称,提取出来的json使用这个变量
  • Json Path expressions : JSON提取的正则 比如:$.access_token这个是提取response里面的token
  • Match NO.(0 for Random):这个是写提取出json的第几条, 比如使用正则能匹配多条,使用这个输入数字就可以匹配对应的
引用json变量
  • Jmeter中引用变量的方法${变量名}

调试脚本 Debug Sampler

帮助检查变量值,调试脚本

  • 右键Thread Group
  • 点击Add -> Sampler -> Debug Sampler

注意:把Debug放到所有请求的最底下,运行的后可以查看变量参数,方便调试

文章作者: gglss
文章链接: http://example.com/posts/26691.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Jmeter之json数据提取和参数传递 | GGLSS

Jmeter之json数据提取和参数传递

安装组件JSON Extractor

  • 右键Http Request
  • 点击Add -> Post Processors -> JSON Extractor

组件安装成功

组件配置

  • Names of created variables : 参数变量名称,提取出来的json使用这个变量
  • Json Path expressions : JSON提取的正则 比如:$.access_token这个是提取response里面的token
  • Match NO.(0 for Random):这个是写提取出json的第几条, 比如使用正则能匹配多条,使用这个输入数字就可以匹配对应的
引用json变量
  • Jmeter中引用变量的方法${变量名}

调试脚本 Debug Sampler

帮助检查变量值,调试脚本

  • 右键Thread Group
  • 点击Add -> Sampler -> Debug Sampler

注意:把Debug放到所有请求的最底下,运行的后可以查看变量参数,方便调试

文章作者: gglss
文章链接: http://example.com/posts/26691.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/26726.html b/posts/26726.html index 9d06cc28b..37392c563 100644 --- a/posts/26726.html +++ b/posts/26726.html @@ -1 +1 @@ -容器(一) | GGLSS

容器(一)

容器(一)

新建和启动容器

OPTIONS说明:

  • – name = “容器新名称” 为容器制定一个名称
  • -d 后台运行容器并返回容器id, 即启动守护式容器(后台运行)
  • -i 以交互模式运行容器,通常与 -t 同时使用
  • -t 为容器重新分配一个伪输入终端,通常与 -i 连用,也就是启动交互式容器
  • -P 随机端口映射
  • -p 指定端口映射

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu:15.10 /bin/bash
root@4fb757f69adb:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:26 pts/0 00:00:00 /bin/bash
root 11 1 0 03:26 pts/0 00:00:00 ps -ef
root@4fb757f69adb:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4fb757f69adb:/# exit
exit
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

docker run -it ubuntu:15.10 /bin/bash
/bin/bash 希望有交互式shell 就用/bin/bash

查询正在运行的容器

docker ps [OPTIONS]

1
2
3
4
5
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdee90a8c77d ubuntu "bash" 3 minutes ago Exited (0) 3 minutes ago ubuntu
0dcaa91afc0e ubuntu "/bin/bush" 5 minutes ago Created myubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

OPTIONS:

  • -a 展示所有容器,包含历史用过容器
  • -d 只展示容器id
  • -l 显示最近创建的容器
  • -n 展示最近创建的前n个容器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    List containers
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -n 1
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 1
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 2
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    0dcaa91afc0e ubuntu "/bin/bush" 19 minutes ago Created myubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

退出容器

  • exit

run进入容器,exit退出容器, 容器停止

  • ctrl + p + q

run进入容器,exit退出容器, 容器不停止

1
2
3
4
5
6
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu bash
root@562278524cda:/# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 16 seconds ago Up 15 seconds loving_dewdney
文章作者: gglss
文章链接: http://example.com/posts/26726.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +容器(一) | GGLSS

容器(一)

容器(一)

新建和启动容器

OPTIONS说明:

  • – name = “容器新名称” 为容器制定一个名称
  • -d 后台运行容器并返回容器id, 即启动守护式容器(后台运行)
  • -i 以交互模式运行容器,通常与 -t 同时使用
  • -t 为容器重新分配一个伪输入终端,通常与 -i 连用,也就是启动交互式容器
  • -P 随机端口映射
  • -p 指定端口映射

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu:15.10 /bin/bash
root@4fb757f69adb:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:26 pts/0 00:00:00 /bin/bash
root 11 1 0 03:26 pts/0 00:00:00 ps -ef
root@4fb757f69adb:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4fb757f69adb:/# exit
exit
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

docker run -it ubuntu:15.10 /bin/bash
/bin/bash 希望有交互式shell 就用/bin/bash

查询正在运行的容器

docker ps [OPTIONS]

1
2
3
4
5
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdee90a8c77d ubuntu "bash" 3 minutes ago Exited (0) 3 minutes ago ubuntu
0dcaa91afc0e ubuntu "/bin/bush" 5 minutes ago Created myubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

OPTIONS:

  • -a 展示所有容器,包含历史用过容器
  • -d 只展示容器id
  • -l 显示最近创建的容器
  • -n 展示最近创建的前n个容器
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    List containers
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -n 1
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 1
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 2
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    0dcaa91afc0e ubuntu "/bin/bush" 19 minutes ago Created myubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

退出容器

  • exit

run进入容器,exit退出容器, 容器停止

  • ctrl + p + q

run进入容器,exit退出容器, 容器不停止

1
2
3
4
5
6
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu bash
root@562278524cda:/# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 16 seconds ago Up 15 seconds loving_dewdney
文章作者: gglss
文章链接: http://example.com/posts/26726.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/27832.html b/posts/27832.html index bb0307ecf..1ed4f2621 100644 --- a/posts/27832.html +++ b/posts/27832.html @@ -1 +1 @@ -Shell函数 | GGLSS

Shell函数

系统函数
basename基本语法
1
basename [string/ pathname][文件后缀] 

basename命令会删掉所有的前缀,只留一个文件名

选项:

如果指定后缀,basename会将pathname或string中的文件后缀去掉

举个栗子

截取该/opt/banzhang.txt路径的文件名称

1
2
3
4
5
[root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt
banzhang.txt
[root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt .txt
banzhang
[root@b09ed0cc2c9d opt]#
dirname基本语法
1
dirname 文件绝对路径

从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录部分)

举个栗子
1
2
3
[root@b09ed0cc2c9d opt]# dirname /opt/banzhang.txt
/opt
[root@b09ed0cc2c9d opt]#
自定义函数
基本语法
1
2
3
4
5
6
7
[function] funname[()]
{
Action;
[retion int;]
}

funname
举个栗子
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

function sum()
{
s=0;
s=$[$1+$2]
echo $s
}

read -p "input your paratemer1:" p1
read -p "input your oaeayemer2:" p2

sum $p1 $p2
文章作者: gglss
文章链接: http://example.com/posts/27832.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell函数 | GGLSS

Shell函数

系统函数
basename基本语法
1
basename [string/ pathname][文件后缀] 

basename命令会删掉所有的前缀,只留一个文件名

选项:

如果指定后缀,basename会将pathname或string中的文件后缀去掉

举个栗子

截取该/opt/banzhang.txt路径的文件名称

1
2
3
4
5
[root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt
banzhang.txt
[root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt .txt
banzhang
[root@b09ed0cc2c9d opt]#
dirname基本语法
1
dirname 文件绝对路径

从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录部分)

举个栗子
1
2
3
[root@b09ed0cc2c9d opt]# dirname /opt/banzhang.txt
/opt
[root@b09ed0cc2c9d opt]#
自定义函数
基本语法
1
2
3
4
5
6
7
[function] funname[()]
{
Action;
[retion int;]
}

funname
举个栗子
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

function sum()
{
s=0;
s=$[$1+$2]
echo $s
}

read -p "input your paratemer1:" p1
read -p "input your oaeayemer2:" p2

sum $p1 $p2
文章作者: gglss
文章链接: http://example.com/posts/27832.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/28702.html b/posts/28702.html index 884508a5e..a6c2a6bcf 100644 --- a/posts/28702.html +++ b/posts/28702.html @@ -1 +1 @@ -如何使用pyyaml获取yaml里面的数据 | GGLSS

如何使用pyyaml获取yaml里面的数据

准备数据

在config目录下创建environment.yaml文件

1
2
username: 周杰伦
password: 123456
使用pyyaml获取yaml中的数据
解析yaml文件

首先创建yaml_config文件,为了方便自动化后面的引用,需要创建一个类,在__init__里面打开yaml文件,使用yaml.load(文件名称, Loader=yaml.FullLoader )方法获取数据

打印出字典格式的数据{'username': '周杰伦', 'password': 123456}

1
2
3
4
5
6
7
8
9
import yaml
from common.tools import get_project_path, sep


class GetConf:
def __init__(self):
with open(../config.environment.yaml), "r", encoding="utf-8")\
as env_file:
self.env = yaml.load(env_file, Loader=yaml.FullLoader)

现在使用的是相对路径,后期如果换系统,或者更换文件位置,就需要自己获得文件路径,下面对代码进行优化

优化项:获得项目名称的url地址

创建get_project_path方法,获取项目根目录的绝对路径

首先定义一个变量,变量的值是项目的名称project_name = "trading_system_autotest"

获取当前文件的所在目录的绝对路径,需要使用python的os模块file_path=os.path.dirname(__file__)

在绝对路径中找到项目名称的下标位置file_path.find(project_name)

找到项目所在目录的绝对路径下标+项目名称的长度=项目根目录的绝对路径的下标file_path.find(project_name)+len(project_name)

然后对所在目录的绝对路径file_path进行切片获得项目根目录的绝对路径

file_path[: file_path.find(project_name)+len(project_name)]

1
2
3
4
5
6
7
8
9
10
11
12
13
def get_project_path():
"""
获取项目根目录的绝对路径
:return:
"""
project_name = "trading_system_autotest"
# 获取当前文件的所在目录的绝对路径
file_path = os.path.dirname(__file__)
# # 在绝对路径中找到项目名称的下标位置
# print(file_path.find(project_name))
# 找到项目所在目录的绝对路径+项目名称的长度=项目的绝对路径
# print(len(project_name))
return file_path[: file_path.find(project_name)+len(project_name)]
优化项:获得拼接后的目录和文件

创建sep(path, add_sep_before=False, add_sep_after=False)方法,获得文件和目录的拼接

变量

path变量需要传输一个列表,列表里面是文件所在目录和文件名称,如[文件所在目录,文件名称]

首先使用os.sep.join对列表的字段进行拼接all_path = os.sep.join(path)

add_sep_before进行判断,如果是True,就在前面添加拼接符all_path = os.sep + all_path

add_sep_after进行判断,如果是True,就在后面添加拼接符all_path = all_path + os.sep

windows格式拼接符有可能错误,就要对拼接符转换格式all_path = all_path.replace('\\', '/'),就算没有这个代码,也可以运行出来,只是调试该代码看起来不好看

然后返回all_path

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def sep(path, add_sep_before=False, add_sep_after=False):
"""
:param path: is list format:[Current directory , Current file]
:param add_sep_before: Add before directory "/"
:param add_sep_after: Add after directory "/"
:return: Current directory/Current file
"""
all_path = os.sep.join(path)
# 在前面添加\
if add_sep_before:
all_path = os.sep + all_path
# 在后面添加\
if add_sep_after:
all_path = all_path + os.sep
# 转换格式 把\转换为/
all_path = all_path.replace('\\', '/')
return all_path
优化后的代码
1
2
3
4
5
6
7
8
9
class GetConf:
def __init__(self):
with open(get_project_path()+sep(["config", "environment.yaml"], add_sep_before=True), "r", encoding="utf-8")\
as env_file:
self.env = yaml.load(env_file, Loader=yaml.FullLoader)
print(self.env)

def get_username_password(self):
return self.env["username"], self.env["password"]
文章作者: gglss
文章链接: http://example.com/posts/28702.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +如何使用pyyaml获取yaml里面的数据 | GGLSS

如何使用pyyaml获取yaml里面的数据

准备数据

在config目录下创建environment.yaml文件

1
2
username: 周杰伦
password: 123456
使用pyyaml获取yaml中的数据
解析yaml文件

首先创建yaml_config文件,为了方便自动化后面的引用,需要创建一个类,在__init__里面打开yaml文件,使用yaml.load(文件名称, Loader=yaml.FullLoader )方法获取数据

打印出字典格式的数据{'username': '周杰伦', 'password': 123456}

1
2
3
4
5
6
7
8
9
import yaml
from common.tools import get_project_path, sep


class GetConf:
def __init__(self):
with open(../config.environment.yaml), "r", encoding="utf-8")\
as env_file:
self.env = yaml.load(env_file, Loader=yaml.FullLoader)

现在使用的是相对路径,后期如果换系统,或者更换文件位置,就需要自己获得文件路径,下面对代码进行优化

优化项:获得项目名称的url地址

创建get_project_path方法,获取项目根目录的绝对路径

首先定义一个变量,变量的值是项目的名称project_name = "trading_system_autotest"

获取当前文件的所在目录的绝对路径,需要使用python的os模块file_path=os.path.dirname(__file__)

在绝对路径中找到项目名称的下标位置file_path.find(project_name)

找到项目所在目录的绝对路径下标+项目名称的长度=项目根目录的绝对路径的下标file_path.find(project_name)+len(project_name)

然后对所在目录的绝对路径file_path进行切片获得项目根目录的绝对路径

file_path[: file_path.find(project_name)+len(project_name)]

1
2
3
4
5
6
7
8
9
10
11
12
13
def get_project_path():
"""
获取项目根目录的绝对路径
:return:
"""
project_name = "trading_system_autotest"
# 获取当前文件的所在目录的绝对路径
file_path = os.path.dirname(__file__)
# # 在绝对路径中找到项目名称的下标位置
# print(file_path.find(project_name))
# 找到项目所在目录的绝对路径+项目名称的长度=项目的绝对路径
# print(len(project_name))
return file_path[: file_path.find(project_name)+len(project_name)]
优化项:获得拼接后的目录和文件

创建sep(path, add_sep_before=False, add_sep_after=False)方法,获得文件和目录的拼接

变量

path变量需要传输一个列表,列表里面是文件所在目录和文件名称,如[文件所在目录,文件名称]

首先使用os.sep.join对列表的字段进行拼接all_path = os.sep.join(path)

add_sep_before进行判断,如果是True,就在前面添加拼接符all_path = os.sep + all_path

add_sep_after进行判断,如果是True,就在后面添加拼接符all_path = all_path + os.sep

windows格式拼接符有可能错误,就要对拼接符转换格式all_path = all_path.replace('\\', '/'),就算没有这个代码,也可以运行出来,只是调试该代码看起来不好看

然后返回all_path

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def sep(path, add_sep_before=False, add_sep_after=False):
"""
:param path: is list format:[Current directory , Current file]
:param add_sep_before: Add before directory "/"
:param add_sep_after: Add after directory "/"
:return: Current directory/Current file
"""
all_path = os.sep.join(path)
# 在前面添加\
if add_sep_before:
all_path = os.sep + all_path
# 在后面添加\
if add_sep_after:
all_path = all_path + os.sep
# 转换格式 把\转换为/
all_path = all_path.replace('\\', '/')
return all_path
优化后的代码
1
2
3
4
5
6
7
8
9
class GetConf:
def __init__(self):
with open(get_project_path()+sep(["config", "environment.yaml"], add_sep_before=True), "r", encoding="utf-8")\
as env_file:
self.env = yaml.load(env_file, Loader=yaml.FullLoader)
print(self.env)

def get_username_password(self):
return self.env["username"], self.env["password"]
文章作者: gglss
文章链接: http://example.com/posts/28702.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/28863.html b/posts/28863.html index c680034ba..9dbf72463 100644 --- a/posts/28863.html +++ b/posts/28863.html @@ -1 +1 @@ -使用moko编写测试接口(无) | GGLSS

使用moko编写测试接口(无)

测试

测试

测试moko


测试

🐱

❄️

文章作者: gglss
文章链接: http://example.com/posts/28863.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用moko编写测试接口(无) | GGLSS

使用moko编写测试接口(无)

测试

测试

测试moko


测试

🐱

❄️

文章作者: gglss
文章链接: http://example.com/posts/28863.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/29537.html b/posts/29537.html index 03aa6bb9a..a924eb4a6 100644 --- a/posts/29537.html +++ b/posts/29537.html @@ -1 +1 @@ -随机控制器Random Controller和Random Order Controller | GGLSS

随机控制器Random Controller和Random Order Controller

作用

  • Random Controller:控制器子节点随机运行一个请求
    • lgnore sub-controller blocks:忽略子控制器块
  • Random Order Controller:控制器子节点随机运行全部请求
文章作者: gglss
文章链接: http://example.com/posts/29537.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
目录
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +随机控制器Random Controller和Random Order Controller | GGLSS

随机控制器Random Controller和Random Order Controller

作用

  • Random Controller:控制器子节点随机运行一个请求
    • lgnore sub-controller blocks:忽略子控制器块
  • Random Order Controller:控制器子节点随机运行全部请求
文章作者: gglss
文章链接: http://example.com/posts/29537.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
目录
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/31621.html b/posts/31621.html index a8969aeb9..74a425469 100644 --- a/posts/31621.html +++ b/posts/31621.html @@ -1 +1 @@ -Yaml的使用 | GGLSS

Yaml的使用

编写字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#字符串
#单行
username: admin
username1: "周杰\n伦" #双引号不转义
username2: '周杰\n伦' ##单引号转义
#多行
william:



william2: |




william3: >



回显的结果是:

1
2
3
4
5
6
{ username: 'admin',
username1: '周杰\n伦',
username2: '周杰\\n伦',
william: '一 二 三',
william2: '一\n二\n三\n',
william3: '一 二 三\n' }
强制转换
1
2
3
forceStr: !!str 123
forceBoll: !!str true
forceInt: !!int "123"

回显的结果是:

1
2
3
forceStr: '123',
forceBoll: 'true',
forceInt: 123 }
编写数组
1
2
3
4
5
6
#数组
myFavourite:
- backaetball
- football

myFavourite2: ["bass","bahddd"]

回显的结果是:

1
2
myFavourite: [ 'backaetball', 'football' ],
myFavourite2: [ 'bass', 'bahddd' ],
编写对象
1
2
3
4
5
6
7
8
#对象
autotest:
username: root
password: root
age: 18
male: true

autotest2: [{username: admin, password: root, age: 22, male: false}]

回显的结果是:

1
2
autotest: { username: 'root', password: 'root', age: 18, male: true },
autotest2: [ { username: 'admin', password: 'root', age: 22, male: false } ],
编写复合结构的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#复合结构
companies:
-
id: 1
name: zhangsan
value: 10e+11

-
id: 2
name: lisi
value: 10e+12


websites:
baidu: www.baidu.com
google: www.google.com

回显的结果是:

1
2
3
4
companies: 
[ { id: 1, name: 'zhangsan', value: 1000000000000 },
{ id: 2, name: 'lisi', value: 10000000000000 } ],
websites: { baidu: 'www.baidu.com', google: 'www.google.com' } }
引用
1
2
3
4
5
6
7
8
#引用
father: &father_lastName
lastName:

son:
<<: *father_lastName
firstName:
age: 18

回显的结果是:

1
2
father: { lastName: '周' },
son: { lastName: '周', firstName: '董', age: 18 } }
文章作者: gglss
文章链接: http://example.com/posts/31621.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Yaml的使用 | GGLSS

Yaml的使用

编写字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#字符串
#单行
username: admin
username1: "周杰\n伦" #双引号不转义
username2: '周杰\n伦' ##单引号转义
#多行
william:



william2: |




william3: >



回显的结果是:

1
2
3
4
5
6
{ username: 'admin',
username1: '周杰\n伦',
username2: '周杰\\n伦',
william: '一 二 三',
william2: '一\n二\n三\n',
william3: '一 二 三\n' }
强制转换
1
2
3
forceStr: !!str 123
forceBoll: !!str true
forceInt: !!int "123"

回显的结果是:

1
2
3
forceStr: '123',
forceBoll: 'true',
forceInt: 123 }
编写数组
1
2
3
4
5
6
#数组
myFavourite:
- backaetball
- football

myFavourite2: ["bass","bahddd"]

回显的结果是:

1
2
myFavourite: [ 'backaetball', 'football' ],
myFavourite2: [ 'bass', 'bahddd' ],
编写对象
1
2
3
4
5
6
7
8
#对象
autotest:
username: root
password: root
age: 18
male: true

autotest2: [{username: admin, password: root, age: 22, male: false}]

回显的结果是:

1
2
autotest: { username: 'root', password: 'root', age: 18, male: true },
autotest2: [ { username: 'admin', password: 'root', age: 22, male: false } ],
编写复合结构的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#复合结构
companies:
-
id: 1
name: zhangsan
value: 10e+11

-
id: 2
name: lisi
value: 10e+12


websites:
baidu: www.baidu.com
google: www.google.com

回显的结果是:

1
2
3
4
companies: 
[ { id: 1, name: 'zhangsan', value: 1000000000000 },
{ id: 2, name: 'lisi', value: 10000000000000 } ],
websites: { baidu: 'www.baidu.com', google: 'www.google.com' } }
引用
1
2
3
4
5
6
7
8
#引用
father: &father_lastName
lastName:

son:
<<: *father_lastName
firstName:
age: 18

回显的结果是:

1
2
father: { lastName: '周' },
son: { lastName: '周', firstName: '董', age: 18 } }
文章作者: gglss
文章链接: http://example.com/posts/31621.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/31868.html b/posts/31868.html index a56bf02f6..98913dea1 100644 --- a/posts/31868.html +++ b/posts/31868.html @@ -1 +1 @@ -逻辑控制器Simple Controller | GGLSS

逻辑控制器Simple Controller

作用

把多个请求放入Simple Controller,可以多个请求进行同时操作

文章作者: gglss
文章链接: http://example.com/posts/31868.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
目录
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +逻辑控制器Simple Controller | GGLSS

逻辑控制器Simple Controller

作用

把多个请求放入Simple Controller,可以多个请求进行同时操作

文章作者: gglss
文章链接: http://example.com/posts/31868.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
目录
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/32161.html b/posts/32161.html index 8a8732adf..b9e0f7f3b 100644 --- a/posts/32161.html +++ b/posts/32161.html @@ -1 +1 @@ -使用docker安装常用软件:redis | GGLSS

使用docker安装常用软件:redis

使用docker安装常用软件:redis

使用docker pull redis:6.0.8 拉取redis:6.0.8镜像

创建容器

容器卷要加入--privileged=true

在宿主机下新建目录mkdir -p /app/redis

文章作者: gglss
文章链接: http://example.com/posts/32161.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用docker安装常用软件:redis | GGLSS

使用docker安装常用软件:redis

使用docker安装常用软件:redis

使用docker pull redis:6.0.8 拉取redis:6.0.8镜像

创建容器

容器卷要加入--privileged=true

在宿主机下新建目录mkdir -p /app/redis

文章作者: gglss
文章链接: http://example.com/posts/32161.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/3219.html b/posts/3219.html index 1e603398c..c1be469da 100644 --- a/posts/3219.html +++ b/posts/3219.html @@ -1 +1 @@ -Jmeter之静默压测 | GGLSS

Jmeter之静默压测

静默压测

jmeter -n -t $jmx_file -l $jtl_file

如: jmeter -n -t HTTP代理服务器luzhi.jmx -l result.jtl

jmx: Jmeter压测程序脚本文件
jtl: Jmeter压测请求响应数据的原始文件,查看结果树和聚合报告可以导入该文件查看

文章作者: gglss
文章链接: http://example.com/posts/3219.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Jmeter之静默压测 | GGLSS

Jmeter之静默压测

静默压测

jmeter -n -t $jmx_file -l $jtl_file

如: jmeter -n -t HTTP代理服务器luzhi.jmx -l result.jtl

jmx: Jmeter压测程序脚本文件
jtl: Jmeter压测请求响应数据的原始文件,查看结果树和聚合报告可以导入该文件查看

文章作者: gglss
文章链接: http://example.com/posts/3219.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/32473.html b/posts/32473.html index ae7e2ba3a..925a0fcd5 100644 --- a/posts/32473.html +++ b/posts/32473.html @@ -1 +1 @@ -性能测试主要关注点 | GGLSS

性能测试主要关注点

性能关注点

接口响应时间

吞吐量

TPS: 事务处理能力,每秒处理事务数(打开页面、登录、选择商品、加入购物车、下单、付款)

注意:“日活” 每日活跃用户数,是运营数据,与性能无关

八二原则

计算QPS/TPS

相信80%会集中在20%时间内,24小时的流量集中在白天8小时内,同时在午高峰达到高峰

举个栗子

根据相应耗时计算公式预估所需并发,一次请求100ms

根据 QPS = Vue * Rt

1000000 * 80% / 8 * 3600 * 20% = 277 QPS

需要27个并发

文章作者: gglss
文章链接: http://example.com/posts/32473.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +性能测试主要关注点 | GGLSS

性能测试主要关注点

性能关注点

接口响应时间

吞吐量

TPS: 事务处理能力,每秒处理事务数(打开页面、登录、选择商品、加入购物车、下单、付款)

注意:“日活” 每日活跃用户数,是运营数据,与性能无关

八二原则

计算QPS/TPS

相信80%会集中在20%时间内,24小时的流量集中在白天8小时内,同时在午高峰达到高峰

举个栗子

根据相应耗时计算公式预估所需并发,一次请求100ms

根据 QPS = Vue * Rt

1000000 * 80% / 8 * 3600 * 20% = 277 QPS

需要27个并发

文章作者: gglss
文章链接: http://example.com/posts/32473.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/34250.html b/posts/34250.html index 4e7ef089f..eacc7b2dd 100644 --- a/posts/34250.html +++ b/posts/34250.html @@ -1 +1 @@ -Modeule Controller和Include Controller | GGLSS

Modeule Controller和Include Controller

Modeule Controller介绍

文章作者: gglss
文章链接: http://example.com/posts/34250.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Modeule Controller和Include Controller | GGLSS

Modeule Controller和Include Controller

Modeule Controller介绍

文章作者: gglss
文章链接: http://example.com/posts/34250.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/34655.html b/posts/34655.html index 39c13821d..a9049f262 100644 --- a/posts/34655.html +++ b/posts/34655.html @@ -1 +1 @@ -抽象类与接口 | GGLSS

抽象类与接口

抽象类

使用abstract修饰一个类,把这个类变成抽象类,抽象类不能直接创建对象,需要其他类进行继承该抽象类

  • 抽象方法不能有方法体
  • 抽象方法必须使用abstract进行修饰,不能有方法体
  • 子类必须实现父抽象类的方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public abstract class Ahsse {
    String name;
    int age;

    //普通方法
    public String aaa(){
    return name;
    };
    // 抽象方法
    public abstract String bbb();
    }

    class sss extends Ahsse{

    @Override
    public String bbb() {
    System.out.println("实现抽象类的抽象方法");
    return "ces ";
    }
    }

接口

使用interface定义接口,相当于class

  • 接口可以多继承
  • 变量全部默认使用public static final修饰,使用之前必须赋值
  • 类里面全部是抽象方法(默认使用public abstract修饰,没有方法体)需要被实现类进行实现
  • 接口可以被多实现–implements
文章作者: gglss
文章链接: http://example.com/posts/34655.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +抽象类与接口 | GGLSS

抽象类与接口

抽象类

使用abstract修饰一个类,把这个类变成抽象类,抽象类不能直接创建对象,需要其他类进行继承该抽象类

  • 抽象方法不能有方法体
  • 抽象方法必须使用abstract进行修饰,不能有方法体
  • 子类必须实现父抽象类的方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public abstract class Ahsse {
    String name;
    int age;

    //普通方法
    public String aaa(){
    return name;
    };
    // 抽象方法
    public abstract String bbb();
    }

    class sss extends Ahsse{

    @Override
    public String bbb() {
    System.out.println("实现抽象类的抽象方法");
    return "ces ";
    }
    }

接口

使用interface定义接口,相当于class

  • 接口可以多继承
  • 变量全部默认使用public static final修饰,使用之前必须赋值
  • 类里面全部是抽象方法(默认使用public abstract修饰,没有方法体)需要被实现类进行实现
  • 接口可以被多实现–implements
文章作者: gglss
文章链接: http://example.com/posts/34655.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/36554.html b/posts/36554.html index d315504c9..b0d8a8295 100644 --- a/posts/36554.html +++ b/posts/36554.html @@ -1 +1 @@ -_3主3从的`Redis集群`搭建(下) | GGLSS

_3主3从的`Redis集群`搭建(下)

_3主3从的Redis集群搭建(下)

进入主机6381

redis-cli -p 6381

查看集群信息

cluster info

查看主机和从机之间的主从关系

cluster nodes

image-20220509101455220

文章作者: gglss
文章链接: http://example.com/posts/36554.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +_3主3从的`Redis集群`搭建(下) | GGLSS

_3主3从的`Redis集群`搭建(下)

_3主3从的Redis集群搭建(下)

进入主机6381

redis-cli -p 6381

查看集群信息

cluster info

查看主机和从机之间的主从关系

cluster nodes

image-20220509101455220

文章作者: gglss
文章链接: http://example.com/posts/36554.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/37984.html b/posts/37984.html index 2b37ea202..3dfa73abe 100644 --- a/posts/37984.html +++ b/posts/37984.html @@ -1 +1 @@ -使用moko编写测试接口(一) | GGLSS

使用moko编写测试接口(一)

编写规则

  • []包裹着以{}包起来的接口脚本

  • description:接口简介

  • request:使用{}包含接口的请求信息

    • uri:接口的地址名称
    • method:请求方法
    • queries:get请求参数
    • forms:post请求参数
    • headers:请求头信息
  • response:返回的数据,使用{}

    • text:返回的文字数据
    • cookies:返回的cookie信息
    • status:返回的响应码

举个栗子demo

1
2
3
4
5
6
7
8
9
10
11
[
{
"description": "这是我们的第一个mock栗子",
"request": {
"uri": "/demo"
},
"response": {
"text": "第一个mock响应demo"
}
}
]

get请求demo

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"description": "接口的get请求",
"request": {
"uri": "/#/test/xml",
"method": "get"
},
"response": {
"text": "get请求接口"
}
}
]
文章作者: gglss
文章链接: http://example.com/posts/37984.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用moko编写测试接口(一) | GGLSS

使用moko编写测试接口(一)

编写规则

  • []包裹着以{}包起来的接口脚本

  • description:接口简介

  • request:使用{}包含接口的请求信息

    • uri:接口的地址名称
    • method:请求方法
    • queries:get请求参数
    • forms:post请求参数
    • headers:请求头信息
  • response:返回的数据,使用{}

    • text:返回的文字数据
    • cookies:返回的cookie信息
    • status:返回的响应码

举个栗子demo

1
2
3
4
5
6
7
8
9
10
11
[
{
"description": "这是我们的第一个mock栗子",
"request": {
"uri": "/demo"
},
"response": {
"text": "第一个mock响应demo"
}
}
]

get请求demo

1
2
3
4
5
6
7
8
9
10
11
12
[
{
"description": "接口的get请求",
"request": {
"uri": "/#/test/xml",
"method": "get"
},
"response": {
"text": "get请求接口"
}
}
]
文章作者: gglss
文章链接: http://example.com/posts/37984.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/38168.html b/posts/38168.html index 08d1fadd6..a8de30377 100644 --- a/posts/38168.html +++ b/posts/38168.html @@ -1 +1 @@ -Shell脚本初探 | GGLSS

Shell脚本初探

编写shell脚本时,必须以 #! /bin/bash 开头

在linux创建helloworld.sh文件,在文件内输入:

1
2
3
#!/bin/bash
#################
echo "hello World"

然后保存该文件

运行.sh文件时,有两种方法可以运行

第一种是给该文件添加可执行权限
1
chmod +x ./helloworld.sh

运行文件:./ 不能省略

1
./helloworld.sh
第二种是使用bash或sh 文件路径运行该文件
1
2
3
bash helloworld.sh
#
sh helloworld.sh
文章作者: gglss
文章链接: http://example.com/posts/38168.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell脚本初探 | GGLSS

Shell脚本初探

编写shell脚本时,必须以 #! /bin/bash 开头

在linux创建helloworld.sh文件,在文件内输入:

1
2
3
#!/bin/bash
#################
echo "hello World"

然后保存该文件

运行.sh文件时,有两种方法可以运行

第一种是给该文件添加可执行权限
1
chmod +x ./helloworld.sh

运行文件:./ 不能省略

1
./helloworld.sh
第二种是使用bash或sh 文件路径运行该文件
1
2
3
bash helloworld.sh
#
sh helloworld.sh
文章作者: gglss
文章链接: http://example.com/posts/38168.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/40953.html b/posts/40953.html index 0891f1534..1a768ec32 100644 --- a/posts/40953.html +++ b/posts/40953.html @@ -1 +1 @@ -Gaussian Random Timer定时器 | GGLSS

Gaussian Random Timer定时器

作用

生成随机等待时间

参数

  • Deviation(in milliseconds) :高斯定时器参数,随机的
  • Constant Delay Offset(in milliseconds):固定等待时长

生成的时长是Deviation + Constant Delay Offset

文章作者: gglss
文章链接: http://example.com/posts/40953.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Gaussian Random Timer定时器 | GGLSS

Gaussian Random Timer定时器

作用

生成随机等待时间

参数

  • Deviation(in milliseconds) :高斯定时器参数,随机的
  • Constant Delay Offset(in milliseconds):固定等待时长

生成的时长是Deviation + Constant Delay Offset

文章作者: gglss
文章链接: http://example.com/posts/40953.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/41091.html b/posts/41091.html index bd420ef19..be1190453 100644 --- a/posts/41091.html +++ b/posts/41091.html @@ -1 +1 @@ -Shell脚本入门 | GGLSS

Shell脚本入门

创建txt文件并向txt文件追加数据

首先创建test_shell.sh文件

1
touch test_shell.sh

test_shell.sh文件输入shell脚本

  • 使用shell创建banzhang.txt文件

  • 在文件中追加数据echo "aabbccdd" >> banzhang.txt

1
2
3
4
5
6
7
#!/bin/bash
# 指定目录
cd /opt/
# 创建文件
touch banzhang.txt
# 向文件追加数据
echo "touch banzhang" >> banzhang.txt
文章作者: gglss
文章链接: http://example.com/posts/41091.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell脚本入门 | GGLSS

Shell脚本入门

创建txt文件并向txt文件追加数据

首先创建test_shell.sh文件

1
touch test_shell.sh

test_shell.sh文件输入shell脚本

  • 使用shell创建banzhang.txt文件

  • 在文件中追加数据echo "aabbccdd" >> banzhang.txt

1
2
3
4
5
6
7
#!/bin/bash
# 指定目录
cd /opt/
# 创建文件
touch banzhang.txt
# 向文件追加数据
echo "touch banzhang" >> banzhang.txt
文章作者: gglss
文章链接: http://example.com/posts/41091.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/42012.html b/posts/42012.html index 58677c9dc..afa7139bc 100644 --- a/posts/42012.html +++ b/posts/42012.html @@ -1 +1 @@ -使用moko编写测试接口(五) | GGLSS

使用moko编写测试接口(五)

下载jar包

点击moke选择版本进行下载,我下载的的是moco-runner-0.11.0-standalone.jar

使用命令启动测试脚本

1
java -jar jar包的存放路径 http -p 端口 -c json文件路径
文章作者: gglss
文章链接: http://example.com/posts/42012.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用moko编写测试接口(五) | GGLSS

使用moko编写测试接口(五)

下载jar包

点击moke选择版本进行下载,我下载的的是moco-runner-0.11.0-standalone.jar

使用命令启动测试脚本

1
java -jar jar包的存放路径 http -p 端口 -c json文件路径
文章作者: gglss
文章链接: http://example.com/posts/42012.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/42075.html b/posts/42075.html index 366f6833b..eb3d4bc46 100644 --- a/posts/42075.html +++ b/posts/42075.html @@ -1 +1 @@ -开发获得cookie的Post登录接口 | GGLSS

开发获得cookie的Post登录接口

开发获得cookie的Post登录接口

@RequestMapping(value = "/v1")的作用是把这个value和方法上的登录地址进行拼接,比如:/v1/login

@RestController标识该接口可以被托管

方法参数@RequestParam(value = "userName", required = true) String userName,代码中的required = true起到必填的作用

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RestController
@Api(value = "/", tags = {SwaggerConfig.TagPost})
@RequestMapping(value = "/v1")
public class MyPostMethod {

//这个变量用来装cookie信息的
private static Cookie cookie;

//用户登录成功获取到cookies,然后访问其他接口获取到列表
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ApiOperation(value = "登录接口,成功后获取到cookies信息",httpMethod = "POST")
public String login(HttpServletResponse response,
@RequestParam(value = "userName", required = true) String userName,
@RequestParam(value = "password", required = true) String password){
if (userName.equals("zhangsan") && password.equals("123456")){
cookie = new Cookie("login","true");
response.addCookie(cookie);
return "恭喜你登录成功!";
}
return "用户名或密码错误!";

}
文章作者: gglss
文章链接: http://example.com/posts/42075.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +开发获得cookie的Post登录接口 | GGLSS

开发获得cookie的Post登录接口

开发获得cookie的Post登录接口

@RequestMapping(value = "/v1")的作用是把这个value和方法上的登录地址进行拼接,比如:/v1/login

@RestController标识该接口可以被托管

方法参数@RequestParam(value = "userName", required = true) String userName,代码中的required = true起到必填的作用

举个栗子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@RestController
@Api(value = "/", tags = {SwaggerConfig.TagPost})
@RequestMapping(value = "/v1")
public class MyPostMethod {

//这个变量用来装cookie信息的
private static Cookie cookie;

//用户登录成功获取到cookies,然后访问其他接口获取到列表
@RequestMapping(value = "/login",method = RequestMethod.POST)
@ApiOperation(value = "登录接口,成功后获取到cookies信息",httpMethod = "POST")
public String login(HttpServletResponse response,
@RequestParam(value = "userName", required = true) String userName,
@RequestParam(value = "password", required = true) String password){
if (userName.equals("zhangsan") && password.equals("123456")){
cookie = new Cookie("login","true");
response.addCookie(cookie);
return "恭喜你登录成功!";
}
return "用户名或密码错误!";

}
文章作者: gglss
文章链接: http://example.com/posts/42075.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/42174.html b/posts/42174.html index 33a66a72d..72ea30518 100644 --- a/posts/42174.html +++ b/posts/42174.html @@ -36,4 +36,4 @@ if __name__ == "__init__": pass -

举个栗子:

栗子1

image

运行结果:

image

栗子2

image

运行结果:

image

文章作者: gglss
文章链接: http://example.com/posts/42174.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +

举个栗子:

栗子1

image

运行结果:

image

栗子2

image

运行结果:

image

文章作者: gglss
文章链接: http://example.com/posts/42174.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/42395.html b/posts/42395.html index 9c8c0f177..b9c02b7ef 100644 --- a/posts/42395.html +++ b/posts/42395.html @@ -1 +1 @@ -本地镜像发布到私有库 | GGLSS

本地镜像发布到私有库

本地镜像发布到私有库

步骤

  • 下载Docker Registry
1
docker pull registry
  • 运行私有库 Registry,相当于本地有Docker Registry
1
docker run -d -p 5000:5000 -v/ggls/myregistry/:/tmp/registry --privileged=true registry
  • 新启动ubuntu容器,新增ifconfig命令

    • ​ 进入容器中输入apt-get update命令
    • ​ 输入apt-get install net-tools命令
    • xxxxxxxxxx [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker psCONTAINER ID   IMAGE               COMMAND   CREATED       STATUS       PORTS     NAMES356e32244966   mytest/ubuntu:3.5   “bash”    2 hours ago   Up 2 hours             elated_aryabhata[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m=”vim cmd add ok” -a=”ggls” 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker imagesREPOSITORY     TAG       IMAGE ID       CREATED         SIZEggls/ubuntu     1.5       87e99e19eeef   7 seconds ago   176MBmytest/ubuntu   3.5       a92a27affdde   2 hours ago     72.8MBtomcat          9.0       b8e65a4d736d   4 months ago   680MBubuntu         latest   ba6acccedd29   6 months ago    72.8MBredis           6.0.8     16ecd2772934   18 months ago   104MB[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell
  • 容器外部执行docker commit -m="ifconfig cmd add" -a="ggls" ffcc5edf5071 ubuntu:1.6命令

  • curl验证私服库上有什么镜像

1
curl -XGET http://8.142.144.75:5000/v2/_catalog
  • 将新镜像修改为符合私服库格式的镜像
1
2
3
docker tag 镜像:Tag Host:Port/Repository:Tag
#
docker tag ubuntu:1.6 8.142.144.75:5000/ubuntu:1.3
  • 修改配置文件使之支持http

    docker 默认不允许http方式推送镜像,通过此配置取消这个限制,若不生效,重启docker

    • 使用命令vim /etc/docker/daemon.json打开配置文件
    • 在阿里云加速后面新增一个json
    1
    2
    3
    4
    {
    "registry-mirrors": ["https://qp747t9w.mirror.aliyuncs.com"],
    "insecure-registries": ["8.142.144.75:5000"]
    }
    • 重启docker,重启docker私服仓库
  • push推送到私服库

1
docker push 符合私服库格式的镜像名称:tag
  • curl验证私服库上有什么镜像
  • pull到本地并运行
1
docker pull 8.142.144.75:5000/ubuntu:1.6
文章作者: gglss
文章链接: http://example.com/posts/42395.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +本地镜像发布到私有库 | GGLSS

本地镜像发布到私有库

本地镜像发布到私有库

步骤

  • 下载Docker Registry
1
docker pull registry
  • 运行私有库 Registry,相当于本地有Docker Registry
1
docker run -d -p 5000:5000 -v/ggls/myregistry/:/tmp/registry --privileged=true registry
  • 新启动ubuntu容器,新增ifconfig命令

    • ​ 进入容器中输入apt-get update命令
    • ​ 输入apt-get install net-tools命令
    • xxxxxxxxxx [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker psCONTAINER ID   IMAGE               COMMAND   CREATED       STATUS       PORTS     NAMES356e32244966   mytest/ubuntu:3.5   “bash”    2 hours ago   Up 2 hours             elated_aryabhata[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m=”vim cmd add ok” -a=”ggls” 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker imagesREPOSITORY     TAG       IMAGE ID       CREATED         SIZEggls/ubuntu     1.5       87e99e19eeef   7 seconds ago   176MBmytest/ubuntu   3.5       a92a27affdde   2 hours ago     72.8MBtomcat          9.0       b8e65a4d736d   4 months ago   680MBubuntu         latest   ba6acccedd29   6 months ago    72.8MBredis           6.0.8     16ecd2772934   18 months ago   104MB[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell
  • 容器外部执行docker commit -m="ifconfig cmd add" -a="ggls" ffcc5edf5071 ubuntu:1.6命令

  • curl验证私服库上有什么镜像

1
curl -XGET http://8.142.144.75:5000/v2/_catalog
  • 将新镜像修改为符合私服库格式的镜像
1
2
3
docker tag 镜像:Tag Host:Port/Repository:Tag
#
docker tag ubuntu:1.6 8.142.144.75:5000/ubuntu:1.3
  • 修改配置文件使之支持http

    docker 默认不允许http方式推送镜像,通过此配置取消这个限制,若不生效,重启docker

    • 使用命令vim /etc/docker/daemon.json打开配置文件
    • 在阿里云加速后面新增一个json
    1
    2
    3
    4
    {
    "registry-mirrors": ["https://qp747t9w.mirror.aliyuncs.com"],
    "insecure-registries": ["8.142.144.75:5000"]
    }
    • 重启docker,重启docker私服仓库
  • push推送到私服库

1
docker push 符合私服库格式的镜像名称:tag
  • curl验证私服库上有什么镜像
  • pull到本地并运行
1
docker pull 8.142.144.75:5000/ubuntu:1.6
文章作者: gglss
文章链接: http://example.com/posts/42395.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/42656.html b/posts/42656.html index 5e33069f5..cf86edbf5 100644 --- a/posts/42656.html +++ b/posts/42656.html @@ -1 +1 @@ -_mysql主从复制docker版 | GGLSS

_mysql主从复制docker版

_mysql主从复制docker版

安装mysql主从复制(一主一从)

新建主服务器容器实例3307

1
docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log/:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-master/conf目录下新建my.cnf把下面内容粘贴到my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改完配置后重启master容器

master容器实例内创建数据同步用户

1
2
3
4
# 建立一个用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 对新建的用户进行授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

新建从服务器实例3308

1
docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log/:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-slave/conf目录下新建my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

重启从机实例docker restart mysql-slave

在主数据库中查看主从同步状态show master status;

进入mysql-slave从机容器

在从数据库中配置主从复制change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

1
2
3
4
5
6
7
8
# 说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

在从数据库中查看主从同步状态show slave status \G;

在从数据库中开启主从同步start slave

查看从数据库状态发现已经同步

主从复制测试

主机创建数据库,创建表,插入数据,搜索表的数据

从机直接搜索标的数据

文章作者: gglss
文章链接: http://example.com/posts/42656.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +_mysql主从复制docker版 | GGLSS

_mysql主从复制docker版

_mysql主从复制docker版

安装mysql主从复制(一主一从)

新建主服务器容器实例3307

1
docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log/:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-master/conf目录下新建my.cnf把下面内容粘贴到my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改完配置后重启master容器

master容器实例内创建数据同步用户

1
2
3
4
# 建立一个用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 对新建的用户进行授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

新建从服务器实例3308

1
docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log/:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-slave/conf目录下新建my.cnf

1
2
3
4
5
6
7
8
9
10
11
12
13
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1

重启从机实例docker restart mysql-slave

在主数据库中查看主从同步状态show master status;

进入mysql-slave从机容器

在从数据库中配置主从复制change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

1
2
3
4
5
6
7
8
# 说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

在从数据库中查看主从同步状态show slave status \G;

在从数据库中开启主从同步start slave

查看从数据库状态发现已经同步

主从复制测试

主机创建数据库,创建表,插入数据,搜索表的数据

从机直接搜索标的数据

文章作者: gglss
文章链接: http://example.com/posts/42656.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/43612.html b/posts/43612.html index a1596f175..a680b744a 100644 --- a/posts/43612.html +++ b/posts/43612.html @@ -1 +1 @@ -关闭chrome浏览器自动更新 | GGLSS

关闭chrome浏览器自动更新

屏蔽谷歌的更新服务器

1
修改 "C:\Windows\System32\drivers\etc\host 文件,在最后增加

修改C:\Windows\System32\drivers\etc\hosts文件,在最后增加

1
127.0.0.1 update.googleapis.com

保存后win+r,输入CMD,输入ipconfig /flushdns刷新DNS

然后重启浏览器

文章作者: gglss
文章链接: http://example.com/posts/43612.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +关闭chrome浏览器自动更新 | GGLSS

关闭chrome浏览器自动更新

屏蔽谷歌的更新服务器

1
修改 "C:\Windows\System32\drivers\etc\host 文件,在最后增加

修改C:\Windows\System32\drivers\etc\hosts文件,在最后增加

1
127.0.0.1 update.googleapis.com

保存后win+r,输入CMD,输入ipconfig /flushdns刷新DNS

然后重启浏览器

文章作者: gglss
文章链接: http://example.com/posts/43612.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/43613.html b/posts/43613.html index 769957951..aa3c05fe9 100644 --- a/posts/43613.html +++ b/posts/43613.html @@ -1 +1 @@ -自动化基础之Xpath定位 | GGLSS

自动化基础之Xpath定位

常用函数定位
定位函数position
//*contains(text(),’文字’)/li[position()=3]找到第三个 li
//*contains(text(),’文字’)/li[position()<=2]找到前两个 li
Xpath函数进行定位
定位方式描述实例
contains匹配在元素文本中查找包含 ‘文字’ 的元素//*contains(text(),’文字’)
starts-with匹配所有id开头为 ‘s’ 的元素//*[starts-with(@id,’s’)]
ends-with匹配所有id结尾头为 ‘s’ 的元素//*[ends-with(@id,”s”)]
following-sibling匹配和 ‘ul’ 元素同级别的下一个元素//div/following-sibling::ul
preceding-sibling匹配当前节点之前的所有同级节点
ancestor匹配当前节点的所有父级,祖父级还有更高级//div/ancestor::li[@role=”menuitem”]
parent匹配当前节点的父节点,相当于 ..//div/parent::button
文章作者: gglss
文章链接: http://example.com/posts/43613.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +自动化基础之Xpath定位 | GGLSS

自动化基础之Xpath定位

常用函数定位
定位函数position
//*contains(text(),’文字’)/li[position()=3]找到第三个 li
//*contains(text(),’文字’)/li[position()<=2]找到前两个 li
Xpath函数进行定位
定位方式描述实例
contains匹配在元素文本中查找包含 ‘文字’ 的元素//*contains(text(),’文字’)
starts-with匹配所有id开头为 ‘s’ 的元素//*[starts-with(@id,’s’)]
ends-with匹配所有id结尾头为 ‘s’ 的元素//*[ends-with(@id,”s”)]
following-sibling匹配和 ‘ul’ 元素同级别的下一个元素//div/following-sibling::ul
preceding-sibling匹配当前节点之前的所有同级节点
ancestor匹配当前节点的所有父级,祖父级还有更高级//div/ancestor::li[@role=”menuitem”]
parent匹配当前节点的父节点,相当于 ..//div/parent::button
文章作者: gglss
文章链接: http://example.com/posts/43613.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/44160.html b/posts/44160.html index 1df29654d..e5c4af56c 100644 --- a/posts/44160.html +++ b/posts/44160.html @@ -1 +1 @@ -english one | GGLSS

english one

记录的目的

想学习英语,目前的一个目标也可能是因为考研吧,在学校的时候专升本考试真是没有重视,导致面临了这个一个尴尬的局面(当时考虑的是学历不重要,结果刚出学校社会就给出一个巴掌),还是要有一个学历,英语在工作中也是要使用的,加油!

学习进程

目前在使用不背单词软件背单词,但是心里总想偷懒,特意做记录一下,学习长难句也会在这个博客上进行记录

原文

Curbs on business-method claims would be a dramatic about-face, because it was the

Federal Circuit itself that introduced such patents with its 1998 decision in the so-called

State Street Bank case, approving a patent on a way of pooling mutual-fund assets.

【2010英语一Text2】

分析过程

  1. 找动词
  2. 划分主从句
  3. 进行翻译

curb:控制

about-face (about turn):重大转变

business-method:商业方法

claim:声称、要求拥有

dramatic:戏剧化的、喜剧的

patent:专利,专利权

circuit:环行、电路、巡回

文章作者: gglss
文章链接: http://example.com/posts/44160.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +english one | GGLSS

english one

记录的目的

想学习英语,目前的一个目标也可能是因为考研吧,在学校的时候专升本考试真是没有重视,导致面临了这个一个尴尬的局面(当时考虑的是学历不重要,结果刚出学校社会就给出一个巴掌),还是要有一个学历,英语在工作中也是要使用的,加油!

学习进程

目前在使用不背单词软件背单词,但是心里总想偷懒,特意做记录一下,学习长难句也会在这个博客上进行记录

原文

Curbs on business-method claims would be a dramatic about-face, because it was the

Federal Circuit itself that introduced such patents with its 1998 decision in the so-called

State Street Bank case, approving a patent on a way of pooling mutual-fund assets.

【2010英语一Text2】

分析过程

  1. 找动词
  2. 划分主从句
  3. 进行翻译

curb:控制

about-face (about turn):重大转变

business-method:商业方法

claim:声称、要求拥有

dramatic:戏剧化的、喜剧的

patent:专利,专利权

circuit:环行、电路、巡回

文章作者: gglss
文章链接: http://example.com/posts/44160.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/44161.html b/posts/44161.html index 84a494cfa..e1f4c8e09 100644 --- a/posts/44161.html +++ b/posts/44161.html @@ -1 +1 @@ -2023立的flag | GGLSS

2023立的flag

目前所拥有的进度

  • 考研恋练有词必背词全部背锅一边

  • 自动化测试已部署

文章作者: gglss
文章链接: http://example.com/posts/44161.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +2023立的flag | GGLSS

2023立的flag

目前所拥有的进度

  • 考研恋练有词必背词全部背锅一边

  • 自动化测试已部署

文章作者: gglss
文章链接: http://example.com/posts/44161.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/45938.html b/posts/45938.html index 486c1c149..21c46ca59 100644 --- a/posts/45938.html +++ b/posts/45938.html @@ -1 +1 @@ -Butterfly美化记录二 | GGLSS

Butterfly美化记录二

侧边栏分类归档美化

修改 aside_archives文件

打开 [you_blog]\themes\butterfly\scripts\helpers\aside_archives.js 修改第 92 行左右。

1
2
3
4
5
6
7
8
9
10
result += transform ? transform(item.name) : item.name
result += '</span>'

if (showCount) {
- result += `<span class="card-archive-list-count">${item.count}</span>`
+ result += `<div class="card-archive-list-count-group"><span class="card-archive-list-count">${item.count}</span><span>篇</span></div>`
}
result += '</a>'
result += '</li>'

增加css

在自定义[blogRoot]/self/css/meihua.css文件中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* 侧栏归档样式start */
span.card-archive-list-count {
width: auto;
text-align: left;
font-size: 1.5rem;
line-height: 0.9;
font-weight: 700;
}
.card-archive-list-count-group {
display: flex;
flex-direction: row;
align-items: baseline;
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:last-child,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:last-child {
width: fit-content;
margin-left: 4px;
}
span.card-archive-list-count {
width: auto;
text-align: left;
font-size: 1.1rem;
line-height: 0.9;
font-weight: 700;
}
.card-archive-list-date {
font-size: 14px;
opacity: 0.6;
}
li.card-category-list-item {
flex: 0 0 31%;
}
li.card-archive-list-item {
flex: 0 0 48%;
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover {
color: #fff;
/* background-color: #3b70fc; */
background-color: #49B1F5; /*侧边栏的鼠标悬浮颜色*/
box-shadow: 0 8px 12px -3px #4259ef23;
border-radius: 8px;
padding-left: 0.5rem;
padding-right: 0.5rem;
}
@media screen and (min-width: 1300px) {
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover {
transform: scale(1.03);
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:active,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a:active {
transform: scale(0.97);
}
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a {
border-radius: 8px;
margin: 4px 0;
display: flex;
flex-direction: column;
align-content: space-between;
border: 1px solid #e3e8f7;
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child {
width: auto;
flex: inherit;
}
#aside-content .card-archives ul.card-archive-list,
#aside-content .card-categories ul.card-category-list {
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
}
/* 侧栏归档样式end */

添加夜间模式的转换动画

转自雷雷屋头

新建 sun_moon.pug

[you_blog]\themes\butterfly\layout\includes\custom\ 文件夹下,新建 sun_moon.pug 文件

1
2
3
4
5
6
7
8
9
10
11
svg(aria-hidden='true', style='position:absolute; overflow:hidden; width:0; height:0')
symbol#icon-sun(viewBox='0 0 1024 1024')
path(d='M960 512l-128 128v192h-192l-128 128-128-128H192v-192l-128-128 128-128V192h192l128-128 128 128h192v192z', fill='#FFD878', p-id='8420')
path(d='M736 512a224 224 0 1 0-448 0 224 224 0 1 0 448 0z', fill='#FFE4A9', p-id='8421')
path(d='M512 109.248L626.752 224H800v173.248L914.752 512 800 626.752V800h-173.248L512 914.752 397.248 800H224v-173.248L109.248 512 224 397.248V224h173.248L512 109.248M512 64l-128 128H192v192l-128 128 128 128v192h192l128 128 128-128h192v-192l128-128-128-128V192h-192l-128-128z', fill='#4D5152', p-id='8422')
path(d='M512 320c105.888 0 192 86.112 192 192s-86.112 192-192 192-192-86.112-192-192 86.112-192 192-192m0-32a224 224 0 1 0 0 448 224 224 0 0 0 0-448z', fill='#4D5152', p-id='8423')
symbol#icon-moon(viewBox='0 0 1024 1024')
path(d='M611.370667 167.082667a445.013333 445.013333 0 0 1-38.4 161.834666 477.824 477.824 0 0 1-244.736 244.394667 445.141333 445.141333 0 0 1-161.109334 38.058667 85.077333 85.077333 0 0 0-65.066666 135.722666A462.08 462.08 0 1 0 747.093333 102.058667a85.077333 85.077333 0 0 0-135.722666 65.024z', fill='#FFB531', p-id='11345')
path(d='M329.728 274.133333l35.157333-35.157333a21.333333 21.333333 0 1 0-30.165333-30.165333l-35.157333 35.157333-35.114667-35.157333a21.333333 21.333333 0 0 0-30.165333 30.165333l35.114666 35.157333-35.114666 35.157334a21.333333 21.333333 0 1 0 30.165333 30.165333l35.114667-35.157333 35.157333 35.157333a21.333333 21.333333 0 1 0 30.165333-30.165333z', fill='#030835', p-id='11346')


新建css

[blogRoot]/self/css/新建sun_moon.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* 白天夜晚切换动画start */
.Cuteen_DarkSky, .Cuteen_DarkSky:before {
content: '';
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 88888888;
}
.Cuteen_DarkSky {
background: linear-gradient(#feb8b0, #fef9db);
}
.Cuteen_DarkSky:before {
transition: 2s ease all;
opacity: 0;
background: linear-gradient(#4c3f6d, #6c62bb, #93b1ed);
}
.DarkMode .Cuteen_DarkSky:before {
opacity: 1;
}
.Cuteen_DarkPlanet {
z-index: 99999999;
position: fixed;
left: -50%;
top: -50%;
width: 200%;
height: 200%;
-webkit-animation: CuteenPlanetMove 2s cubic-bezier(0.7, 0, 0, 1);
animation: CuteenPlanetMove 2s cubic-bezier(0.7, 0, 0, 1);
transform-origin: center bottom;
}
@-webkit-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
.Cuteen_DarkPlanet:after {
position: absolute;
left: 35%;
top: 40%;
width: 9.375rem;
height: 9.375rem;
border-radius: 50%;
content: '';
background: linear-gradient(#fefefe, #fffbe8);
}
.search span {
display: none;
}
.menus_item a {
text-decoration: none !important;
}
.icon-V {
padding: 5px;
}
@-moz-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-webkit-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-o-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
/* 白天夜晚切换动画end */


新建js

[blogRoot]/self/js/新建`sun_moon.js,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 白天夜晚切换动画start
function switchNightMode() {
document.querySelector('body').insertAdjacentHTML('beforeend', '<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>'),
setTimeout(function() {
document.querySelector('body').classList.contains('DarkMode') ? (document.querySelector('body').classList.remove('DarkMode'), localStorage.setItem('isDark', '0'), document.getElementById('modeicon').setAttribute('xlink:href', '#icon-moon')) : (document.querySelector('body').classList.add('DarkMode'), localStorage.setItem('isDark', '1'), document.getElementById('modeicon').setAttribute('xlink:href', '#icon-sun')),
setTimeout(function() {
document.getElementsByClassName('Cuteen_DarkSky')[0].style.transition = 'opacity 3s';
document.getElementsByClassName('Cuteen_DarkSky')[0].style.opacity = '0';
setTimeout(function() {
document.getElementsByClassName('Cuteen_DarkSky')[0].remove();
}, 1e3);
}, 2e3)
})
const nowMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
if (nowMode === 'light') {
activateDarkMode()
saveToLocal.set('theme', 'dark', 2)
GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night)
document.getElementById('modeicon').setAttribute('xlink:href', '#icon-sun')
} else {
activateLightMode()
saveToLocal.set('theme', 'light', 2)
document.querySelector('body').classList.add('DarkMode'), document.getElementById('modeicon').setAttribute('xlink:href', '#icon-moon')
}
// handle some cases
typeof utterancesTheme === 'function' && utterancesTheme()
typeof FB === 'object' && window.loadFBComment()
window.DISQUS && document.getElementById('disqus_thread').children.length && setTimeout(() => window.disqusReset(), 200)
}
// 白天夜晚切换动画end


引用 sun_moon.pug

修改 [you_blog]\themes\butterfly\layout\includes\head.pug, 在文件末位增加以下代码:

1
2
3
4
5
6
7
8
9
10
11
  //- global config
!=partial('includes/head/config', {}, {cache: true})

include ./head/config_site.pug
include ./head/noscript.pug

!=fragment_cache('injectHeadJs', function(){return inject_head_js()})

!=fragment_cache('injectHead', function(){return injectHtml(theme.inject.head)})
+ include ./custom/sun_moon.pug

替换昼夜切换按钮

修改[you_blog]\themes\butterfly\layout\includes\rightside.pug, 替换原本的昼夜切换按钮

1
2
3
4
5
6
7
8
9
10
11
  when 'translate'
if translate.enable
button#translateLink(type="button" title=_p('rightside.translate_title'))= translate.default
when 'darkmode'
if darkmode.enable && darkmode.button
- button#darkmode(type="button" title=_p('rightside.night_mode_title'))
- i.fas.fa-adjust
+ a.icon-V.hidden(onclick='switchNightMode()', title=_p('rightside.night_mode_title'))
+ svg(width='25', height='25', viewBox='0 0 1024 1024')
+ use#modeicon(xlink:href='#icon-moon')

为博客添加波浪效果

修改index.pug文件

修改themes/butterfly/layout/includes/header/index.pug,在第 38 行左右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if top_img !== false
if is_post()
include ./post-info.pug
+ section.main-hero-waves-area.waves-area
+ svg.waves-svg(xmlns='http://www.w3.org/2000/svg', xlink='http://www.w3.org/1999/xlink', viewBox='0 24 150 28', preserveAspectRatio='none', shape-rendering='auto')
+ defs
+ path#gentle-wave(d='M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z')
+ g.parallax
+ use(href='#gentle-wave', x='48', y='0')
+ use(href='#gentle-wave', x='48', y='3')
+ use(href='#gentle-wave', x='48', y='5')
+ use(href='#gentle-wave', x='48', y='7')
#post-top-cover
img#post-top-bg(class='nolazyload' src=bg_img)
else if is_home()
#site-info
h1#site-title=site_title
if theme.subtitle.enable

添加css

[blogRoot]/self/css/meihua.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* 波浪css */
.main-hero-waves-area {
width: 100%;
position: absolute;
left: 0;
bottom: -11px;
z-index: 5;
}
.waves-area .waves-svg {
width: 100%;
height: 5rem;
}
/* Animation */

.parallax > use {
animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite;
}
.parallax > use:nth-child(1) {
animation-delay: -2s;
animation-duration: 7s;
fill: #f7f9febd;
}
.parallax > use:nth-child(2) {
animation-delay: -3s;
animation-duration: 10s;
fill: #f7f9fe82;
}
.parallax > use:nth-child(3) {
animation-delay: -4s;
animation-duration: 13s;
fill: #f7f9fe36;
}
.parallax > use:nth-child(4) {
animation-delay: -5s;
animation-duration: 20s;
fill: #f7f9fe;
}
/* 黑色模式背景 */
[data-theme="dark"] .parallax > use:nth-child(1) {
animation-delay: -2s;
animation-duration: 7s;
fill: #18171dc8;
}
[data-theme="dark"] .parallax > use:nth-child(2) {
animation-delay: -3s;
animation-duration: 10s;
fill: #18171d80;
}
[data-theme="dark"] .parallax > use:nth-child(3) {
animation-delay: -4s;
animation-duration: 13s;
fill: #18171d3e;
}
[data-theme="dark"] .parallax > use:nth-child(4) {
animation-delay: -5s;
animation-duration: 20s;
fill: #18171d;
}

@keyframes move-forever {
0% {
transform: translate3d(-90px, 0, 0);
}
100% {
transform: translate3d(85px, 0, 0);
}
}
/*Shrinking for mobile*/
@media (max-width: 768px) {
.waves-area .waves-svg {
height: 40px;
min-height: 40px;
}
}

注意: 的是 css 中fill属性可以控制波浪颜色

页脚透明

[blogRoot]/self/css/meihua.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 页脚透明start */
#footer {
background: var(--icat-footer-background);
}

#footer #footer-wrap {
color: var(--font-color)
}

#footer #footer-wrap a {
color: var(--font-color)
}

/* 页脚透明end */

文章页版权样式美化

[blogRoot]/self/css/meihua.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 版权样式调整start */
#post .post-copyright {
background: var(--icat-card-bg);
padding: 1rem 1.3rem;
overflow: hidden;
border: var(--style-border);
border-width: 1px;
transition: 0.3s;
position: relative;
margin: 1.5rem 0px 0.5rem;
border-radius: 8px;
}
#post .post-copyright:before {
position: absolute;
right: 22px;
top: -77px;
content: "\e039";
font-size: 180px;
font-family: "iconfont";
color: var(--icat-fontcolor);
opacity: 0.1;
filter: blur(7px);
}
/* 版权样式调整end */
文章作者: gglss
文章链接: http://example.com/posts/45938.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Butterfly美化记录二 | GGLSS

Butterfly美化记录二

侧边栏分类归档美化

修改 aside_archives文件

打开 [you_blog]\themes\butterfly\scripts\helpers\aside_archives.js 修改第 92 行左右。

1
2
3
4
5
6
7
8
9
10
result += transform ? transform(item.name) : item.name
result += '</span>'

if (showCount) {
- result += `<span class="card-archive-list-count">${item.count}</span>`
+ result += `<div class="card-archive-list-count-group"><span class="card-archive-list-count">${item.count}</span><span>篇</span></div>`
}
result += '</a>'
result += '</li>'

增加css

在自定义[blogRoot]/self/css/meihua.css文件中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/* 侧栏归档样式start */
span.card-archive-list-count {
width: auto;
text-align: left;
font-size: 1.5rem;
line-height: 0.9;
font-weight: 700;
}
.card-archive-list-count-group {
display: flex;
flex-direction: row;
align-items: baseline;
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:last-child,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:last-child {
width: fit-content;
margin-left: 4px;
}
span.card-archive-list-count {
width: auto;
text-align: left;
font-size: 1.1rem;
line-height: 0.9;
font-weight: 700;
}
.card-archive-list-date {
font-size: 14px;
opacity: 0.6;
}
li.card-category-list-item {
flex: 0 0 31%;
}
li.card-archive-list-item {
flex: 0 0 48%;
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover {
color: #fff;
/* background-color: #3b70fc; */
background-color: #49B1F5; /*侧边栏的鼠标悬浮颜色*/
box-shadow: 0 8px 12px -3px #4259ef23;
border-radius: 8px;
padding-left: 0.5rem;
padding-right: 0.5rem;
}
@media screen and (min-width: 1300px) {
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:hover,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a:hover {
transform: scale(1.03);
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a:active,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a:active {
transform: scale(0.97);
}
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a {
border-radius: 8px;
margin: 4px 0;
display: flex;
flex-direction: column;
align-content: space-between;
border: 1px solid #e3e8f7;
}
#aside-content .card-archives ul.card-archive-list > .card-archive-list-item a span:first-child,
#aside-content .card-categories ul.card-category-list > .card-category-list-item a span:first-child {
width: auto;
flex: inherit;
}
#aside-content .card-archives ul.card-archive-list,
#aside-content .card-categories ul.card-category-list {
display: flex;
flex-direction: row;
justify-content: space-between;
flex-wrap: wrap;
}
/* 侧栏归档样式end */

添加夜间模式的转换动画

转自雷雷屋头

新建 sun_moon.pug

[you_blog]\themes\butterfly\layout\includes\custom\ 文件夹下,新建 sun_moon.pug 文件

1
2
3
4
5
6
7
8
9
10
11
svg(aria-hidden='true', style='position:absolute; overflow:hidden; width:0; height:0')
symbol#icon-sun(viewBox='0 0 1024 1024')
path(d='M960 512l-128 128v192h-192l-128 128-128-128H192v-192l-128-128 128-128V192h192l128-128 128 128h192v192z', fill='#FFD878', p-id='8420')
path(d='M736 512a224 224 0 1 0-448 0 224 224 0 1 0 448 0z', fill='#FFE4A9', p-id='8421')
path(d='M512 109.248L626.752 224H800v173.248L914.752 512 800 626.752V800h-173.248L512 914.752 397.248 800H224v-173.248L109.248 512 224 397.248V224h173.248L512 109.248M512 64l-128 128H192v192l-128 128 128 128v192h192l128 128 128-128h192v-192l128-128-128-128V192h-192l-128-128z', fill='#4D5152', p-id='8422')
path(d='M512 320c105.888 0 192 86.112 192 192s-86.112 192-192 192-192-86.112-192-192 86.112-192 192-192m0-32a224 224 0 1 0 0 448 224 224 0 0 0 0-448z', fill='#4D5152', p-id='8423')
symbol#icon-moon(viewBox='0 0 1024 1024')
path(d='M611.370667 167.082667a445.013333 445.013333 0 0 1-38.4 161.834666 477.824 477.824 0 0 1-244.736 244.394667 445.141333 445.141333 0 0 1-161.109334 38.058667 85.077333 85.077333 0 0 0-65.066666 135.722666A462.08 462.08 0 1 0 747.093333 102.058667a85.077333 85.077333 0 0 0-135.722666 65.024z', fill='#FFB531', p-id='11345')
path(d='M329.728 274.133333l35.157333-35.157333a21.333333 21.333333 0 1 0-30.165333-30.165333l-35.157333 35.157333-35.114667-35.157333a21.333333 21.333333 0 0 0-30.165333 30.165333l35.114666 35.157333-35.114666 35.157334a21.333333 21.333333 0 1 0 30.165333 30.165333l35.114667-35.157333 35.157333 35.157333a21.333333 21.333333 0 1 0 30.165333-30.165333z', fill='#030835', p-id='11346')


新建css

[blogRoot]/self/css/新建sun_moon.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* 白天夜晚切换动画start */
.Cuteen_DarkSky, .Cuteen_DarkSky:before {
content: '';
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 88888888;
}
.Cuteen_DarkSky {
background: linear-gradient(#feb8b0, #fef9db);
}
.Cuteen_DarkSky:before {
transition: 2s ease all;
opacity: 0;
background: linear-gradient(#4c3f6d, #6c62bb, #93b1ed);
}
.DarkMode .Cuteen_DarkSky:before {
opacity: 1;
}
.Cuteen_DarkPlanet {
z-index: 99999999;
position: fixed;
left: -50%;
top: -50%;
width: 200%;
height: 200%;
-webkit-animation: CuteenPlanetMove 2s cubic-bezier(0.7, 0, 0, 1);
animation: CuteenPlanetMove 2s cubic-bezier(0.7, 0, 0, 1);
transform-origin: center bottom;
}
@-webkit-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
.Cuteen_DarkPlanet:after {
position: absolute;
left: 35%;
top: 40%;
width: 9.375rem;
height: 9.375rem;
border-radius: 50%;
content: '';
background: linear-gradient(#fefefe, #fffbe8);
}
.search span {
display: none;
}
.menus_item a {
text-decoration: none !important;
}
.icon-V {
padding: 5px;
}
@-moz-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-webkit-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@-o-keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
@keyframes CuteenPlanetMove {
0% {
transform: rotate(0);
}
to {
transform: rotate(360deg);
}
}
/* 白天夜晚切换动画end */


新建js

[blogRoot]/self/js/新建`sun_moon.js,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 白天夜晚切换动画start
function switchNightMode() {
document.querySelector('body').insertAdjacentHTML('beforeend', '<div class="Cuteen_DarkSky"><div class="Cuteen_DarkPlanet"></div></div>'),
setTimeout(function() {
document.querySelector('body').classList.contains('DarkMode') ? (document.querySelector('body').classList.remove('DarkMode'), localStorage.setItem('isDark', '0'), document.getElementById('modeicon').setAttribute('xlink:href', '#icon-moon')) : (document.querySelector('body').classList.add('DarkMode'), localStorage.setItem('isDark', '1'), document.getElementById('modeicon').setAttribute('xlink:href', '#icon-sun')),
setTimeout(function() {
document.getElementsByClassName('Cuteen_DarkSky')[0].style.transition = 'opacity 3s';
document.getElementsByClassName('Cuteen_DarkSky')[0].style.opacity = '0';
setTimeout(function() {
document.getElementsByClassName('Cuteen_DarkSky')[0].remove();
}, 1e3);
}, 2e3)
})
const nowMode = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark' : 'light'
if (nowMode === 'light') {
activateDarkMode()
saveToLocal.set('theme', 'dark', 2)
GLOBAL_CONFIG.Snackbar !== undefined && btf.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night)
document.getElementById('modeicon').setAttribute('xlink:href', '#icon-sun')
} else {
activateLightMode()
saveToLocal.set('theme', 'light', 2)
document.querySelector('body').classList.add('DarkMode'), document.getElementById('modeicon').setAttribute('xlink:href', '#icon-moon')
}
// handle some cases
typeof utterancesTheme === 'function' && utterancesTheme()
typeof FB === 'object' && window.loadFBComment()
window.DISQUS && document.getElementById('disqus_thread').children.length && setTimeout(() => window.disqusReset(), 200)
}
// 白天夜晚切换动画end


引用 sun_moon.pug

修改 [you_blog]\themes\butterfly\layout\includes\head.pug, 在文件末位增加以下代码:

1
2
3
4
5
6
7
8
9
10
11
  //- global config
!=partial('includes/head/config', {}, {cache: true})

include ./head/config_site.pug
include ./head/noscript.pug

!=fragment_cache('injectHeadJs', function(){return inject_head_js()})

!=fragment_cache('injectHead', function(){return injectHtml(theme.inject.head)})
+ include ./custom/sun_moon.pug

替换昼夜切换按钮

修改[you_blog]\themes\butterfly\layout\includes\rightside.pug, 替换原本的昼夜切换按钮

1
2
3
4
5
6
7
8
9
10
11
  when 'translate'
if translate.enable
button#translateLink(type="button" title=_p('rightside.translate_title'))= translate.default
when 'darkmode'
if darkmode.enable && darkmode.button
- button#darkmode(type="button" title=_p('rightside.night_mode_title'))
- i.fas.fa-adjust
+ a.icon-V.hidden(onclick='switchNightMode()', title=_p('rightside.night_mode_title'))
+ svg(width='25', height='25', viewBox='0 0 1024 1024')
+ use#modeicon(xlink:href='#icon-moon')

为博客添加波浪效果

修改index.pug文件

修改themes/butterfly/layout/includes/header/index.pug,在第 38 行左右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if top_img !== false
if is_post()
include ./post-info.pug
+ section.main-hero-waves-area.waves-area
+ svg.waves-svg(xmlns='http://www.w3.org/2000/svg', xlink='http://www.w3.org/1999/xlink', viewBox='0 24 150 28', preserveAspectRatio='none', shape-rendering='auto')
+ defs
+ path#gentle-wave(d='M -160 44 c 30 0 58 -18 88 -18 s 58 18 88 18 s 58 -18 88 -18 s 58 18 88 18 v 44 h -352 Z')
+ g.parallax
+ use(href='#gentle-wave', x='48', y='0')
+ use(href='#gentle-wave', x='48', y='3')
+ use(href='#gentle-wave', x='48', y='5')
+ use(href='#gentle-wave', x='48', y='7')
#post-top-cover
img#post-top-bg(class='nolazyload' src=bg_img)
else if is_home()
#site-info
h1#site-title=site_title
if theme.subtitle.enable

添加css

[blogRoot]/self/css/meihua.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* 波浪css */
.main-hero-waves-area {
width: 100%;
position: absolute;
left: 0;
bottom: -11px;
z-index: 5;
}
.waves-area .waves-svg {
width: 100%;
height: 5rem;
}
/* Animation */

.parallax > use {
animation: move-forever 25s cubic-bezier(0.55, 0.5, 0.45, 0.5) infinite;
}
.parallax > use:nth-child(1) {
animation-delay: -2s;
animation-duration: 7s;
fill: #f7f9febd;
}
.parallax > use:nth-child(2) {
animation-delay: -3s;
animation-duration: 10s;
fill: #f7f9fe82;
}
.parallax > use:nth-child(3) {
animation-delay: -4s;
animation-duration: 13s;
fill: #f7f9fe36;
}
.parallax > use:nth-child(4) {
animation-delay: -5s;
animation-duration: 20s;
fill: #f7f9fe;
}
/* 黑色模式背景 */
[data-theme="dark"] .parallax > use:nth-child(1) {
animation-delay: -2s;
animation-duration: 7s;
fill: #18171dc8;
}
[data-theme="dark"] .parallax > use:nth-child(2) {
animation-delay: -3s;
animation-duration: 10s;
fill: #18171d80;
}
[data-theme="dark"] .parallax > use:nth-child(3) {
animation-delay: -4s;
animation-duration: 13s;
fill: #18171d3e;
}
[data-theme="dark"] .parallax > use:nth-child(4) {
animation-delay: -5s;
animation-duration: 20s;
fill: #18171d;
}

@keyframes move-forever {
0% {
transform: translate3d(-90px, 0, 0);
}
100% {
transform: translate3d(85px, 0, 0);
}
}
/*Shrinking for mobile*/
@media (max-width: 768px) {
.waves-area .waves-svg {
height: 40px;
min-height: 40px;
}
}

注意: 的是 css 中fill属性可以控制波浪颜色

页脚透明

[blogRoot]/self/css/meihua.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/* 页脚透明start */
#footer {
background: var(--icat-footer-background);
}

#footer #footer-wrap {
color: var(--font-color)
}

#footer #footer-wrap a {
color: var(--font-color)
}

/* 页脚透明end */

文章页版权样式美化

[blogRoot]/self/css/meihua.css,增加下面的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 版权样式调整start */
#post .post-copyright {
background: var(--icat-card-bg);
padding: 1rem 1.3rem;
overflow: hidden;
border: var(--style-border);
border-width: 1px;
transition: 0.3s;
position: relative;
margin: 1.5rem 0px 0.5rem;
border-radius: 8px;
}
#post .post-copyright:before {
position: absolute;
right: 22px;
top: -77px;
content: "\e039";
font-size: 180px;
font-family: "iconfont";
color: var(--icat-fontcolor);
opacity: 0.1;
filter: blur(7px);
}
/* 版权样式调整end */
文章作者: gglss
文章链接: http://example.com/posts/45938.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/4654.html b/posts/4654.html index c7f13f001..a948df5ad 100644 --- a/posts/4654.html +++ b/posts/4654.html @@ -1 +1 @@ -Shell变量 | GGLSS

Shell变量

shell变量分为系统变量和自定义变量,变量默认字符串类型

系统变量

$HOME 获取当前用户的家目录

$PWD 获取当前目录的路径

$SHELL 获取shell的执行引擎

$USER 获取当前用户的名称

自定义变量

在linux系统中定义变量A=1,等号两边不能有空格,使用echo $A显示A的值

使用unset A命令,撤销变量

定义只读变量readonly b=3,使用echo $b显示b的值,不能unset

export命令进行设置全局变量,可以让其他shell命令进行使用

特殊变量:**$n**

定义

n表示数字,范围是09,$0表示脚本名称,$19表示1~9个参数,10以上的参数要用花括号包裹,如${10}

运行apple.sh文件时可以传递参数

举个栗子

1
2
3
4
5
6
7
8
#!/bin/bash
#
echo "filename:" $0
echo "filename_1:" $1
echo "filename_2:" $2
echo "filename_3:" $3
echo "filename_4:" $4
echo "filename_5:" $5

运行后传递参数bash apple.sh 001 002 test "test sss" "hsgd_dee"

特殊变量:$#

定义

获取所有输入参数的个数,常用于循环

举个栗子

1
2
3
4
5
6
7
8
#!/bin/bash
#
echo "filename:" $0
echo "filename_1:" $1
echo "filename_2:" $2
echo "filename_3:" $3
#
echo $#
特殊变量:$#,$*

定义

$*代表命令行中所有参数,把参数作为一个整体

$@代表命令行中所有参数,把参数区分对待

特殊变量:$?

定义

最后一次命令的返回状态,如果返回变量的值为0,则表示最后一次命令执行正确,如果变量的值非0,则证明上一条变量返回不正确

举个栗子

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# $?
bash: 0: command not found
[root@b09ed0cc2c9d opt]# echo $?
127
[root@b09ed0cc2c9d opt]# echo $?
0
[root@b09ed0cc2c9d opt]#
文章作者: gglss
文章链接: http://example.com/posts/4654.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell变量 | GGLSS

Shell变量

shell变量分为系统变量和自定义变量,变量默认字符串类型

系统变量

$HOME 获取当前用户的家目录

$PWD 获取当前目录的路径

$SHELL 获取shell的执行引擎

$USER 获取当前用户的名称

自定义变量

在linux系统中定义变量A=1,等号两边不能有空格,使用echo $A显示A的值

使用unset A命令,撤销变量

定义只读变量readonly b=3,使用echo $b显示b的值,不能unset

export命令进行设置全局变量,可以让其他shell命令进行使用

特殊变量:**$n**

定义

n表示数字,范围是09,$0表示脚本名称,$19表示1~9个参数,10以上的参数要用花括号包裹,如${10}

运行apple.sh文件时可以传递参数

举个栗子

1
2
3
4
5
6
7
8
#!/bin/bash
#
echo "filename:" $0
echo "filename_1:" $1
echo "filename_2:" $2
echo "filename_3:" $3
echo "filename_4:" $4
echo "filename_5:" $5

运行后传递参数bash apple.sh 001 002 test "test sss" "hsgd_dee"

特殊变量:$#

定义

获取所有输入参数的个数,常用于循环

举个栗子

1
2
3
4
5
6
7
8
#!/bin/bash
#
echo "filename:" $0
echo "filename_1:" $1
echo "filename_2:" $2
echo "filename_3:" $3
#
echo $#
特殊变量:$#,$*

定义

$*代表命令行中所有参数,把参数作为一个整体

$@代表命令行中所有参数,把参数区分对待

特殊变量:$?

定义

最后一次命令的返回状态,如果返回变量的值为0,则表示最后一次命令执行正确,如果变量的值非0,则证明上一条变量返回不正确

举个栗子

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# $?
bash: 0: command not found
[root@b09ed0cc2c9d opt]# echo $?
127
[root@b09ed0cc2c9d opt]# echo $?
0
[root@b09ed0cc2c9d opt]#
文章作者: gglss
文章链接: http://example.com/posts/4654.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/47474.html b/posts/47474.html index d5689d535..8d682f878 100644 --- a/posts/47474.html +++ b/posts/47474.html @@ -1 +1 @@ -Butterfly美化记录五 | GGLSS

Butterfly美化记录五

文章增加最新文章标识

转载于云端

修改page.js

在js文件里面添加一段js

1
2
3
4
5
6
7
8
9
// 最新文章
hexo.extend.helper.register('newPost', function() {
let name, time;
hexo.locals.get('posts').map((item, index) => {
if (index == 0) name = item.title, time = item.date
else if (item.date > time) { name = item.title, time = item.date }
});
return name
})

修改post-ui.pug

themes\butterfly\layout\includes\mixins\post-ui.pug 添加代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mixin postUI(posts)
+ - let newTitle= newPost()
each article , index in page.posts.data
.recent-post-item
-
let link = article.link || article.path
let title = article.title || _p('no_title')
const position = theme.cover.position
let leftOrRight = position === 'both'
? index%2 == 0 ? 'left' : 'right'
: position === 'left' ? 'left' : 'right'
let post_cover = article.cover
let no_cover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : ''
-
if post_cover && theme.cover.index_enable
.post_cover(class=leftOrRight)
a(href=url_for(link) title=title)
img.post_bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title)
.recent-post-info(class=no_cover)
+ if newTitle == title
+ span(class=`newPost-${leftOrRight=='left'?'right':'left'}`) 最新

添加自定义CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#recent-posts>.recent-post-item {
position: relative;
}

/* 最新文章图标 */
.newPost-left,
.newPost-right {
position: absolute;
top: 0;
color: white;
padding: 0 15px;
background-color: #49b1f5;
border-radius: 0 0 10px 10px;
}

.newPost-left {
left: 15px;
}

.newPost-right {
right: 15px;
}

hexo加速

使用[akilar](使用gulp压缩博客静态资源 | Akilarの糖果屋)教程

安装Gulp插件

在博客根目录[Blogroot]打开终端,输入:

1
2
npm install --global gulp-cli #全局安装gulp指令集
npm install gulp --save #安装gulp插件

安装各个下属插件以实现对各类静态资源的压缩

  • 压缩HTML:
1
2
3
npm install gulp-htmlclean --save-dev
npm install gulp-html-minifier-terser --save-dev
# 用gulp-html-minifier-terser可以压缩HTML中的ES6语法
  • 压缩CSS:
1
npm install gulp-clean-css --save-dev
  • 压缩JS:
1
npm install gulp-terser --save-dev
  • 压缩字体包:
1
npm install gulp-fontmin --save-dev

为Gulp创建gulpfile.js任务脚本

在博客根目录[Blogroot]下新建gulpfile.js,打开[Blogroot]\gulpfile.js,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//用到的各个插件
var gulp = require('gulp');
var cleanCSS = require('gulp-clean-css');
var htmlmin = require('gulp-html-minifier-terser');
var htmlclean = require('gulp-htmlclean');
var fontmin = require('gulp-fontmin');
// gulp-tester
var terser = require('gulp-terser');
// 压缩js
gulp.task('compress', async() =>{
gulp.src(['./public/**/*.js', '!./public/**/*.min.js'])
.pipe(terser())
.pipe(gulp.dest('./public'))
});
//压缩css
gulp.task('minify-css', () => {
return gulp.src(['./public/**/*.css'])
.pipe(cleanCSS({
compatibility: 'ie11'
}))
.pipe(gulp.dest('./public'));
});
//压缩html
gulp.task('minify-html', () => {
return gulp.src('./public/**/*.html')
.pipe(htmlclean())
.pipe(htmlmin({
removeComments: true, //清除html注释
collapseWhitespace: true, //压缩html
collapseBooleanAttributes: true,
//省略布尔属性的值,例如:<input checked="true"/> ==> <input />
removeEmptyAttributes: true,
//删除所有空格作属性值,例如:<input id="" /> ==> <input />
removeScriptTypeAttributes: true,
//删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true,
//删除<style>和<link>的 type="text/css"
minifyJS: true, //压缩页面 JS
minifyCSS: true, //压缩页面 CSS
minifyURLs: true //压缩页面URL
}))
.pipe(gulp.dest('./public'))
});
//压缩字体
function minifyFont(text, cb) {
gulp
.src('./public/fonts/*.ttf') //原字体所在目录
.pipe(fontmin({
text: text
}))
.pipe(gulp.dest('./public/fontsdest/')) //压缩后的输出目录
.on('end', cb);
}

gulp.task('mini-font', (cb) => {
var buffers = [];
gulp
.src(['./public/**/*.html']) //HTML文件所在目录请根据自身情况修改
.on('data', function(file) {
buffers.push(file.contents);
})
.on('end', function() {
var text = Buffer.concat(buffers).toString('utf-8');
minifyFont(text, cb);
});
});
// 运行gulp命令时依次执行以下任务
gulp.task('default', gulp.parallel(
'compress', 'minify-css', 'minify-html','mini-font'
##))

在每次运行完hexo generate生成静态页面后,运行gulp对其进行压缩。指令流程如下:

1
2
3
4
hexo clean
hexo generate
gulp
hexo server 或 hexo deploy
文章作者: gglss
文章链接: http://example.com/posts/47474.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Butterfly美化记录五 | GGLSS

Butterfly美化记录五

文章增加最新文章标识

转载于云端

修改page.js

在js文件里面添加一段js

1
2
3
4
5
6
7
8
9
// 最新文章
hexo.extend.helper.register('newPost', function() {
let name, time;
hexo.locals.get('posts').map((item, index) => {
if (index == 0) name = item.title, time = item.date
else if (item.date > time) { name = item.title, time = item.date }
});
return name
})

修改post-ui.pug

themes\butterfly\layout\includes\mixins\post-ui.pug 添加代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mixin postUI(posts)
+ - let newTitle= newPost()
each article , index in page.posts.data
.recent-post-item
-
let link = article.link || article.path
let title = article.title || _p('no_title')
const position = theme.cover.position
let leftOrRight = position === 'both'
? index%2 == 0 ? 'left' : 'right'
: position === 'left' ? 'left' : 'right'
let post_cover = article.cover
let no_cover = article.cover === false || !theme.cover.index_enable ? 'no-cover' : ''
-
if post_cover && theme.cover.index_enable
.post_cover(class=leftOrRight)
a(href=url_for(link) title=title)
img.post_bg(src=url_for(post_cover) onerror=`this.onerror=null;this.src='`+ url_for(theme.error_img.post_page) + `'` alt=title)
.recent-post-info(class=no_cover)
+ if newTitle == title
+ span(class=`newPost-${leftOrRight=='left'?'right':'left'}`) 最新

添加自定义CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#recent-posts>.recent-post-item {
position: relative;
}

/* 最新文章图标 */
.newPost-left,
.newPost-right {
position: absolute;
top: 0;
color: white;
padding: 0 15px;
background-color: #49b1f5;
border-radius: 0 0 10px 10px;
}

.newPost-left {
left: 15px;
}

.newPost-right {
right: 15px;
}

hexo加速

使用[akilar](使用gulp压缩博客静态资源 | Akilarの糖果屋)教程

安装Gulp插件

在博客根目录[Blogroot]打开终端,输入:

1
2
npm install --global gulp-cli #全局安装gulp指令集
npm install gulp --save #安装gulp插件

安装各个下属插件以实现对各类静态资源的压缩

  • 压缩HTML:
1
2
3
npm install gulp-htmlclean --save-dev
npm install gulp-html-minifier-terser --save-dev
# 用gulp-html-minifier-terser可以压缩HTML中的ES6语法
  • 压缩CSS:
1
npm install gulp-clean-css --save-dev
  • 压缩JS:
1
npm install gulp-terser --save-dev
  • 压缩字体包:
1
npm install gulp-fontmin --save-dev

为Gulp创建gulpfile.js任务脚本

在博客根目录[Blogroot]下新建gulpfile.js,打开[Blogroot]\gulpfile.js,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//用到的各个插件
var gulp = require('gulp');
var cleanCSS = require('gulp-clean-css');
var htmlmin = require('gulp-html-minifier-terser');
var htmlclean = require('gulp-htmlclean');
var fontmin = require('gulp-fontmin');
// gulp-tester
var terser = require('gulp-terser');
// 压缩js
gulp.task('compress', async() =>{
gulp.src(['./public/**/*.js', '!./public/**/*.min.js'])
.pipe(terser())
.pipe(gulp.dest('./public'))
});
//压缩css
gulp.task('minify-css', () => {
return gulp.src(['./public/**/*.css'])
.pipe(cleanCSS({
compatibility: 'ie11'
}))
.pipe(gulp.dest('./public'));
});
//压缩html
gulp.task('minify-html', () => {
return gulp.src('./public/**/*.html')
.pipe(htmlclean())
.pipe(htmlmin({
removeComments: true, //清除html注释
collapseWhitespace: true, //压缩html
collapseBooleanAttributes: true,
//省略布尔属性的值,例如:<input checked="true"/> ==> <input />
removeEmptyAttributes: true,
//删除所有空格作属性值,例如:<input id="" /> ==> <input />
removeScriptTypeAttributes: true,
//删除<script>的type="text/javascript"
removeStyleLinkTypeAttributes: true,
//删除<style>和<link>的 type="text/css"
minifyJS: true, //压缩页面 JS
minifyCSS: true, //压缩页面 CSS
minifyURLs: true //压缩页面URL
}))
.pipe(gulp.dest('./public'))
});
//压缩字体
function minifyFont(text, cb) {
gulp
.src('./public/fonts/*.ttf') //原字体所在目录
.pipe(fontmin({
text: text
}))
.pipe(gulp.dest('./public/fontsdest/')) //压缩后的输出目录
.on('end', cb);
}

gulp.task('mini-font', (cb) => {
var buffers = [];
gulp
.src(['./public/**/*.html']) //HTML文件所在目录请根据自身情况修改
.on('data', function(file) {
buffers.push(file.contents);
})
.on('end', function() {
var text = Buffer.concat(buffers).toString('utf-8');
minifyFont(text, cb);
});
});
// 运行gulp命令时依次执行以下任务
gulp.task('default', gulp.parallel(
'compress', 'minify-css', 'minify-html','mini-font'
##))

在每次运行完hexo generate生成静态页面后,运行gulp对其进行压缩。指令流程如下:

1
2
3
4
hexo clean
hexo generate
gulp
hexo server 或 hexo deploy

手机端悬浮窗

使用akilar教程

新建[Blogroot]\themes\butterfly\source\js\custom\fixed_card_widget.js,用来控制显隐逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 固定卡片点击动作
function FixedCardWidget(type,name,index){
// 根据id或class选择元素
if (type === "id"){
var tempcard = document.getElementById(name);
}
else{
var tempcard = document.getElementsByClassName(name)[index];
}
// 若元素存在
if (tempcard) {
// 首先判断是否存在fixed-card-widget类
if (tempcard.className.indexOf('fixed-card-widget') > -1){
// 存在则移除
RemoveFixedCardWidget();
}
else{
// 不存在则先初始化防止卡片叠加
RemoveFixedCardWidget();
//新建退出蒙版
CreateQuitBox();
// 再添加固定卡片样式
tempcard.classList.add('fixed-card-widget');
}
}
}
//创建一个蒙版,作为退出键使用
function CreateQuitBox(){
var quitBox = `<div id="quit-box" onclick="RemoveFixedCardWidget()"></div>`
var asideContent = document.getElementById('aside-content');
asideContent.insertAdjacentHTML("beforebegin",quitBox)
}
// 移除卡片方法
function RemoveFixedCardWidget(){
var activedItems = document.querySelectorAll('.fixed-card-widget');
if (activedItems) {
for (i = 0; i < activedItems.length; i++) {
activedItems[i].classList.remove('fixed-card-widget');
}
}
//移除退出蒙版
var quitBox = document.getElementById('quit-box');
if (quitBox) quitBox.remove();
}
// 常规先初始化,确保切换页面后不会有固定卡片留存
RemoveFixedCardWidget()

新建[Blogroot]\themes\butterfly\source\css\_layout\fixed_card_widget.styl,此处使用stylus交给插件编译,能够更快捷的适配多种内核样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// 垂直居中卡片样式(排除toc目录卡片)
.fixed-card-widget
&:not(#card-toc)
visibility visible!important
display block!important
position fixed!important
bottom 0
left 0
top 0
right 0
margin auto
margin-bottom auto!important
margin-top auto!important
max-width 300px
max-height 500px
width auto
height auto
overflow-y: scroll
z-index 999
animation rotateX 0.5s ease
animation-fill-mode forwards
&::-webkit-scrollbar
width: 0
// 针对说说卡片做样式兼容适配
.card-shuo
&.fixed-card-widget
#artitalk_main
max-height 460px
overflow scroll
&::-webkit-scrollbar
display: none
#operare_artitalk
.c2
z-index 1000
// 针对标签卡片做样式兼容适配
.card-tags
&.fixed-card-widget
.card-tag-cloud
max-height 460px
overflow scroll
&::-webkit-scrollbar
display: none
// 控制手机端可见
@media screen and (max-width: 768px)
div#fixedcard-dashboard
display flex!important
// 侧栏悬浮按钮样式
div#fixedcard-dashboard
position fixed
top 150px
width fit-content
height 40px
opacity 0.3
transition all 0.5s
display none
background rgba(255,255,255,0.9)
padding 5px 10px
border-top-right-radius 20px
border-bottom-right-radius 20px
z-index 1000
&:hover
opacity 1
button
&.fixedcard-activebtn
width 30px
opacity 1
pointer-events all
// 按钮样式
button
&.fixedcard-activebtn
width 0px
height 30px
transition all .5s
display flex
opacity 0
align-items center
justify-content space-around
pointer-events none
color #757273
// 悬浮按钮头像
.fixedcard-user-avatar
display inline-block
img
&.fixedcard-user-avatar-img
width 30px
height 30px
border-radius 50%
// 悬浮按钮夜间模式适配
[data-theme="dark"]
div#fixedcard-dashboard
background rgba(55,55,55,0.9)
button
&.fixedcard-activebtn
color #bcbdbd

// 卡片开启动画效果
@keyframes rotateX
from
transform rotateX(90deg)
to
transform rotateX(0deg)
// 退出蒙版效果
div#quit-box
position fixed
display block
left 0
top 0
width 100vh
height 100vh
z-index 99
background rgba(25,25,25,0.3)


[data-theme="dark"]
div#quit-box
background rgba(147, 146, 128, 0.3)

新建[Blogroot]\themes\butterfly\layout\includes\custom\fixed_card_widget.pug,以后的源码魔改教程都会尽量将改动文件归纳到带custom字样的文件夹里,便于管理魔改文件。

1
2
3
4
5
6
7
8
9
10
11
12
#fixedcard-dashboard
if is_post()
each poitem in theme.fixed_card_widget.post
button.fixedcard-activebtn(type="button" title=poitem.title onclick=`FixedCardWidget("` + poitem.type + `","` + poitem.name + `","` + poitem.index + `")`)
i(class=poitem.icon)
else
each paitem in theme.fixed_card_widget.page
button.fixedcard-activebtn(type="button" title=paitem.title onclick=`FixedCardWidget("` + paitem.type + `","` + paitem.name + `","` + paitem.index + `")`)
i(class=paitem.icon)
.fixedcard-user-avatar.fixedcard-activebtn(onclick="RemoveFixedCardWidget()")
img.fixedcard-user-avatar-img(src=url_for(theme.avatar.img) title=config.author)

修改[Blogroot]\themes\butterfly\layout\includes\additional-js.pug,直接加在文件末尾即可,但是注意缩进!

1
2
3
4
  if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv
script(async data-pjax src=url_for(theme.CDN.busuanzi))
+ if !theme.aside.mobile && theme.fixed_card_widget.enable
+ include ./custom/fixed_card_widget.pug

因为还做了page和post页面不同悬浮按钮的配置,为了让它能够自动切换而不是惰性加载,需要修改[Blogroot]\themes\butterfly\layout\includes\third-party\pjax.pug大约第十四行的位置,在pjax选择器中加入悬浮按钮的id。

1
2
3
4
5
6
7
8
9
10
  script.
let pjaxSelectors = [
'title',
'#config-diff',
'#body-wrap',
'#rightside-config-hide',
'#rightside-config-show',
+ "#fixedcard-dashboard",
'.js-pjax'
]

修改[Blogroot]\_config.butterfly.yml,新增配置项,此处的选择器其实就是提取了document.getElementsByClassName("name")[index]document.getElementById("name")这两个方法中的参数来确保能够找到侧栏卡片。原本其实是可以做成自动根据侧栏生成的,但是考虑到还有插件挂载和自定义卡片,以及还有部分用户会刻意隐藏一些侧栏卡片,所以干脆还是让用户自己去配置想要加到菜单的卡片好了。
找id或者class的办法很简单,用F12开启控制台,用左上角的元素选择器点选想要的侧栏卡片,在源码栏找到对应的class或者id。因为class是可以重名的,所以还存在一个序列问题,从0开始计数。此处为了避免语意混乱,建议还是用特征明显的class或者id来选择对应卡片。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#侧栏悬浮卡片控制按钮
#https://akilar.top/posts/451ac5f8/
fixed_card_widget:
enable: true
page: #页面显示按钮
- type: class #侧栏卡片选择器类型
name: card-info #侧栏卡片选择器名称
index: 0 #侧栏卡片选择器序列
icon: fas fa-address-book #图标
title: 用户信息 #悬停显示提示
- type: class
name: card-clock
index: 0
icon: fas fa-cloud-sun
title: 电子钟
- type: class
name: card-shuo
index: 0
icon: fas fa-comments
title: 碎碎念
- type: class
name: card-recent-post
index: 0
icon: fas fa-history
title: 最新文章
- type: id
name: card-newest-comments
index: 0
icon: fas fa-comment-dots
title: 最新评论
- type: class
name: card-tags
index: 0
icon: fas fa-tags
title: 标签
- type: class
name: card-webinfo
index: 0
icon: fas fa-chart-line
title: 网站咨询
post: #文章页显示按钮
- type: class
name: card-info
index: 0
icon: fas fa-address-book
title: 用户信息
- type: class
name: card-clock
index: 0
icon: fas fa-cloud-sun
title: 电子钟
- type: class
name: card-recent-post
index: 0
icon: fas fa-history
title: 最新文章

修改[Blogroot]_config.butterfly.yml的inject配置项

1
2
3
4
5
 inject:
head:

bottom:
+ - <script data-pjax defer src="/js/custom/fixed_card_widget.js"></script>

注意要关闭手机端显示侧栏卡片才能启用fixed卡片样式。

1
2
3
4
5
6
7
  aside:
enable: true
hide: false
button: true
- mobile: true # display on mobile
+ mobile: false # display on mobile
position: right # left or right
文章作者: gglss
文章链接: http://example.com/posts/47474.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/47564.html b/posts/47564.html index 4c4bce6b6..862b50158 100644 --- a/posts/47564.html +++ b/posts/47564.html @@ -1 +1 @@ -字符串 | GGLSS

字符串

字符串的方法

方法描述
str.concat()将参数拼接到字符串上
trim()去除字符串两端的字符串,不能去除中间
replace(oldChar, newChar)将字符串的old参数替换为new参数
length()返回此字符串的长度
isEmpty()判断字符串是否为空

concat()方法

  • 返回字符串类型
  • 字符串在后面拼接
    1
    2
    3
    String str = "床前明月光";
    String str1 = str.concat("疑是地上霜。");
    System.out.println(str1);

trim()方法

1
2
3
String str = "    床  前明   月光   ";
String str1 = str.trim();
System.out.println(str1);

replace(oldChar, newChar)方法

1
2
3
String str = "床前明月光";
String str1 = str.replace("床", "llll");
System.out.println(str1);

length()方法

  • 返回int类型
    1
    2
    3
    String str = "床前明月光";
    int str1 = str.length();
    System.out.println(str1);

isEmpty()方法

  • 返回布尔类型
    1
    2
    3
    String str = "床前明月光";
    boolean str1 = str.isEmpty();
    System.out.println(str1);
文章作者: gglss
文章链接: http://example.com/posts/47564.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +字符串 | GGLSS

字符串

字符串的方法

方法描述
str.concat()将参数拼接到字符串上
trim()去除字符串两端的字符串,不能去除中间
replace(oldChar, newChar)将字符串的old参数替换为new参数
length()返回此字符串的长度
isEmpty()判断字符串是否为空

concat()方法

  • 返回字符串类型
  • 字符串在后面拼接
    1
    2
    3
    String str = "床前明月光";
    String str1 = str.concat("疑是地上霜。");
    System.out.println(str1);

trim()方法

1
2
3
String str = "    床  前明   月光   ";
String str1 = str.trim();
System.out.println(str1);

replace(oldChar, newChar)方法

1
2
3
String str = "床前明月光";
String str1 = str.replace("床", "llll");
System.out.println(str1);

length()方法

  • 返回int类型
    1
    2
    3
    String str = "床前明月光";
    int str1 = str.length();
    System.out.println(str1);

isEmpty()方法

  • 返回布尔类型
    1
    2
    3
    String str = "床前明月光";
    boolean str1 = str.isEmpty();
    System.out.println(str1);
文章作者: gglss
文章链接: http://example.com/posts/47564.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/4851.html b/posts/4851.html index 96acb125d..9528d06ba 100644 --- a/posts/4851.html +++ b/posts/4851.html @@ -1 +1 @@ -使用pip install报错的解决办法 | GGLSS

使用pip install报错的解决办法

报错提示

今天使用PyCharm下载一个模块pip.exe install locust,有错误提示

1
2
3
4
5
6
7
8
9
10
11
https://visualstudio.microsoft.com/visual-cpp-build-tools/
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
// 报错位置
ERROR: Failed building wheel for psutil

ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)

原因

缺少对应的whl文件

解决办法

碰到了这个错误ERROR: Failed building wheel for psutil,就需要下载psutil.whl

下载网站点击进入网站

下载psutil-5.9.0-cp38-cp38-win_amd64.whl文件

然后使用(pip install 文件的绝对路径)进行安装,然后使用pip.exe install locust正常安装

1
2
3
4
5

pip.exe install D:\Appium\psutil-5.9.0-cp38-cp38-win_amd64.whl

pip.exe install locust

文章作者: gglss
文章链接: http://example.com/posts/4851.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用pip install报错的解决办法 | GGLSS

使用pip install报错的解决办法

报错提示

今天使用PyCharm下载一个模块pip.exe install locust,有错误提示

1
2
3
4
5
6
7
8
9
10
11
https://visualstudio.microsoft.com/visual-cpp-build-tools/
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
// 报错位置
ERROR: Failed building wheel for psutil

ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)

原因

缺少对应的whl文件

解决办法

碰到了这个错误ERROR: Failed building wheel for psutil,就需要下载psutil.whl

下载网站点击进入网站

下载psutil-5.9.0-cp38-cp38-win_amd64.whl文件

然后使用(pip install 文件的绝对路径)进行安装,然后使用pip.exe install locust正常安装

1
2
3
4
5

pip.exe install D:\Appium\psutil-5.9.0-cp38-cp38-win_amd64.whl

pip.exe install locust

文章作者: gglss
文章链接: http://example.com/posts/4851.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/48785.html b/posts/48785.html index d5935f156..78651393e 100644 --- a/posts/48785.html +++ b/posts/48785.html @@ -1 +1 @@ -使用moko编写包含cookie信息的测试接口(二) | GGLSS

使用moko编写包含cookie信息的测试接口(二)

上一节已经写了规则,这次直接来编写Get和Post请求

这是一个会返回cookie的get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"description": "这是一个会返回cookie的get请求",
"request": {
"uri": "/getCookies",
"method": "get"
},
"response": {
"cookies": {
"login": "true"
},
"text": "恭喜你获得cookies信息成功",
"status": 200,
"msg": "成功"
}
}

这是一个携带cookies信息的get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"description": "这是一个带cookies信息的get请求",
"request": {
"uri": "/get/with/cookies",
"method": "get",
"cookies": {
"login": "true"
}
},
"response": {
"text": "这是一个需要携带cookies信息才能访问的get请求"
}
}

这是一个携带cookies信息的post请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"description": "这是一个带cookies信息的post请求",
"request": {
"uri": "/post/with/cookies",
"method": "post",
"cookies": {
"login": "true"
},
"json": {
"name": "huhansan",
"age": "18"
}
},
"response": {
"status": 200,
"json": {
"huhansan": "success",
"status": "1"
}
}
}
文章作者: gglss
文章链接: http://example.com/posts/48785.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用moko编写包含cookie信息的测试接口(二) | GGLSS

使用moko编写包含cookie信息的测试接口(二)

上一节已经写了规则,这次直接来编写Get和Post请求

这是一个会返回cookie的get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"description": "这是一个会返回cookie的get请求",
"request": {
"uri": "/getCookies",
"method": "get"
},
"response": {
"cookies": {
"login": "true"
},
"text": "恭喜你获得cookies信息成功",
"status": 200,
"msg": "成功"
}
}

这是一个携带cookies信息的get请求

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"description": "这是一个带cookies信息的get请求",
"request": {
"uri": "/get/with/cookies",
"method": "get",
"cookies": {
"login": "true"
}
},
"response": {
"text": "这是一个需要携带cookies信息才能访问的get请求"
}
}

这是一个携带cookies信息的post请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"description": "这是一个带cookies信息的post请求",
"request": {
"uri": "/post/with/cookies",
"method": "post",
"cookies": {
"login": "true"
},
"json": {
"name": "huhansan",
"age": "18"
}
},
"response": {
"status": 200,
"json": {
"huhansan": "success",
"status": "1"
}
}
}
文章作者: gglss
文章链接: http://example.com/posts/48785.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/48851.html b/posts/48851.html index 5a50076dd..efdc94ceb 100644 --- a/posts/48851.html +++ b/posts/48851.html @@ -1 +1 @@ -Constant Throughput Timer定时器 | GGLSS

Constant Throughput Timer定时器

作用

限制整个运行过程中的生成的吞吐量不要超过某一个值,防止压死系统

参数

  • Target throughput(in samples per minute):目标吞吐量,指的是每分钟发送的请求数,对应测试要求的20 QPS,这里应该输入1200
  • Calculate Throughput based on:有5个选项
    • This Thread only:控制每个线程的吞吐量,这个模式的作用是:总的吞吐量=Target throughput * 线程的数量
    • All active threads:设置的Target throughput将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理时间后再次运行。活跃线程指的是同一时刻同时运行的线程
    • All active threads in current thread group:设置的`Target throughput将分配在当前线程祖的每一个活跃线程上,当测试计划只有一个线程组,这个模式作用和All active threads一样
    • All active threads(shared):与All active threads选项基本一致,唯一区别是,每一个活跃线程都会在所有活跃线程上一次运行结束后等待合理时间再次运行
    • All active threads in current thread group(shared):与All active threads in current thread group选项基本一致,唯一区别是,每个活跃线程都会在所有活跃线程的上一次运行结束等待合理的时间后再次运行
文章作者: gglss
文章链接: http://example.com/posts/48851.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Constant Throughput Timer定时器 | GGLSS

Constant Throughput Timer定时器

作用

限制整个运行过程中的生成的吞吐量不要超过某一个值,防止压死系统

参数

  • Target throughput(in samples per minute):目标吞吐量,指的是每分钟发送的请求数,对应测试要求的20 QPS,这里应该输入1200
  • Calculate Throughput based on:有5个选项
    • This Thread only:控制每个线程的吞吐量,这个模式的作用是:总的吞吐量=Target throughput * 线程的数量
    • All active threads:设置的Target throughput将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理时间后再次运行。活跃线程指的是同一时刻同时运行的线程
    • All active threads in current thread group:设置的`Target throughput将分配在当前线程祖的每一个活跃线程上,当测试计划只有一个线程组,这个模式作用和All active threads一样
    • All active threads(shared):与All active threads选项基本一致,唯一区别是,每一个活跃线程都会在所有活跃线程上一次运行结束后等待合理时间再次运行
    • All active threads in current thread group(shared):与All active threads in current thread group选项基本一致,唯一区别是,每个活跃线程都会在所有活跃线程的上一次运行结束等待合理的时间后再次运行
文章作者: gglss
文章链接: http://example.com/posts/48851.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/48990.html b/posts/48990.html index a4bb90ac9..357e3fbe4 100644 --- a/posts/48990.html +++ b/posts/48990.html @@ -1 +1 @@ -循环控制器Loop Controller | GGLSS

循环控制器Loop Controller

作用

指定子节点运行的次数,使用变量或数值进行控制

  • Infinite:表示一直循环
  • 如果同时设置线程组循环次数和循环控制器的循环次数,那控制器子节点运行的次数为两个数值相乘的结果

添加

文章作者: gglss
文章链接: http://example.com/posts/48990.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +循环控制器Loop Controller | GGLSS

循环控制器Loop Controller

作用

指定子节点运行的次数,使用变量或数值进行控制

  • Infinite:表示一直循环
  • 如果同时设置线程组循环次数和循环控制器的循环次数,那控制器子节点运行的次数为两个数值相乘的结果

添加

文章作者: gglss
文章链接: http://example.com/posts/48990.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/49262.html b/posts/49262.html index 0c91313df..7976ddfe6 100644 --- a/posts/49262.html +++ b/posts/49262.html @@ -1 +1 @@ -Jmeter之全局参数设置和csv数据导入 | GGLSS

Jmeter之全局参数设置和csv数据导入

全局参数设置

添加组件
  • 右键Thread Group
  • 点击Add -> Config Element -> User Defined Variables
添加对应的变量
  • hostname:localhost
  • port:9090
  • protocol:http

然后再请求参数中使用对应的参数变量名

  • ${hostname}
  • ${port}
  • ${protocol}

csv数据导入

创建csv文件
  • 使用Excel创建csv文件
  • csv数据之间使用英文逗号来分割
  • 保存成.csv文件
添加csv导入组件
  • 右键Thread Group
  • 点击Add -> Config Element -> CSV Data Set Config
配置
  • Filename:文件位置
  • File encoding:编码格式
  • Variable Names(comma-delimited):数据参数 如:no,username,password
  • lgnore first lline (only user if Variable Names is not empty):是否忽略第一行(表头)
  • Delimiter(use "\t" for tab):分隔符
  • Allow quoted data?:是否允许双引号括住数据
  • Recycle on EOF?:到了文件结尾是否循环
  • Stop thread on EOF?:到了文件结尾是否停止
  • Sharinng mode:共享模式

注意:把请求的参数修改为:${变量}

文章作者: gglss
文章链接: http://example.com/posts/49262.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Jmeter之全局参数设置和csv数据导入 | GGLSS

Jmeter之全局参数设置和csv数据导入

全局参数设置

添加组件
  • 右键Thread Group
  • 点击Add -> Config Element -> User Defined Variables
添加对应的变量
  • hostname:localhost
  • port:9090
  • protocol:http

然后再请求参数中使用对应的参数变量名

  • ${hostname}
  • ${port}
  • ${protocol}

csv数据导入

创建csv文件
  • 使用Excel创建csv文件
  • csv数据之间使用英文逗号来分割
  • 保存成.csv文件
添加csv导入组件
  • 右键Thread Group
  • 点击Add -> Config Element -> CSV Data Set Config
配置
  • Filename:文件位置
  • File encoding:编码格式
  • Variable Names(comma-delimited):数据参数 如:no,username,password
  • lgnore first lline (only user if Variable Names is not empty):是否忽略第一行(表头)
  • Delimiter(use "\t" for tab):分隔符
  • Allow quoted data?:是否允许双引号括住数据
  • Recycle on EOF?:到了文件结尾是否循环
  • Stop thread on EOF?:到了文件结尾是否停止
  • Sharinng mode:共享模式

注意:把请求的参数修改为:${变量}

文章作者: gglss
文章链接: http://example.com/posts/49262.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/50013.html b/posts/50013.html index 431f47377..f7cd52cfe 100644 --- a/posts/50013.html +++ b/posts/50013.html @@ -1 +1 @@ -Shell条件判断 | GGLSS

Shell条件判断

基本语法

[ condition ] (注意,condition 前后要有空格

注意:条件非空即为 true,[ atguigu ]返回 true, [] 返回 false.

常用条件判断
两个整数之间进行比较
1
2
3
4
5
6
7
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

举个栗子

1
2
[23 -lt 80]
echo $? # 判断上一步操作是不是正确
按照文件权限进行判断
1
2
3
-r 读
-w 写
-x 执行

举个栗子

1
2
[ -w 1.sh ]
echo $?
文件类型判断
1
2
3
-f 文件存在且是一个常规文件
-e 文件存在
-d 文件存在且是一个目录

举个栗子

1
2
[ -e 2.sh ]
echo $?
多条件判断

$$ 与 ,前对,才执行后

||

文章作者: gglss
文章链接: http://example.com/posts/50013.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell条件判断 | GGLSS

Shell条件判断

基本语法

[ condition ] (注意,condition 前后要有空格

注意:条件非空即为 true,[ atguigu ]返回 true, [] 返回 false.

常用条件判断
两个整数之间进行比较
1
2
3
4
5
6
7
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于

举个栗子

1
2
[23 -lt 80]
echo $? # 判断上一步操作是不是正确
按照文件权限进行判断
1
2
3
-r 读
-w 写
-x 执行

举个栗子

1
2
[ -w 1.sh ]
echo $?
文件类型判断
1
2
3
-f 文件存在且是一个常规文件
-e 文件存在
-d 文件存在且是一个目录

举个栗子

1
2
[ -e 2.sh ]
echo $?
多条件判断

$$ 与 ,前对,才执行后

||

文章作者: gglss
文章链接: http://example.com/posts/50013.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/50070.html b/posts/50070.html index 3aee47b59..3f0b4ba65 100644 --- a/posts/50070.html +++ b/posts/50070.html @@ -1 +1 @@ -马哲 | GGLSS

马哲

马哲的基本特征

  • 实践性
  • 阶级性
  • 革命性
  • 科学性

【主观题】主观能动性与规律的统一

  • 尊重客观规律是正确发挥主观能动性的提前
  • 认识和利用客观规律必须充分发挥人的主观能动性
  • 在社会主义现代化建设中,必须把发挥人的主观能动性和尊重客观规律相结合

唯物辩证法的基本特征

联系的观点和发展的观点

世界联系和发展的三个普遍规律

  • 对立统一规律(唯物辩证法的实质和核心): 揭示事物发展的动力和源泉

    矛盾的同一性和斗争性

  • 质量互变规律: 揭示事物发展的状态和形式
  • 否定之否定规律: 揭示事物发展的趋势和道路

【主观题】实践对认识的决定作用

  • 实践是认识的来源
  • 实践是认识发展的动力
  • 实践是认识的目的
  • 实践是检验真理的唯一标准
文章作者: gglss
文章链接: http://example.com/posts/50070.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +马哲 | GGLSS

马哲

马哲的基本特征

  • 实践性
  • 阶级性
  • 革命性
  • 科学性

【主观题】主观能动性与规律的统一

  • 尊重客观规律是正确发挥主观能动性的提前
  • 认识和利用客观规律必须充分发挥人的主观能动性
  • 在社会主义现代化建设中,必须把发挥人的主观能动性和尊重客观规律相结合

唯物辩证法的基本特征

联系的观点和发展的观点

世界联系和发展的三个普遍规律

  • 对立统一规律(唯物辩证法的实质和核心): 揭示事物发展的动力和源泉

    矛盾的同一性和斗争性

  • 质量互变规律: 揭示事物发展的状态和形式
  • 否定之否定规律: 揭示事物发展的趋势和道路

【主观题】实践对认识的决定作用

  • 实践是认识的来源
  • 实践是认识发展的动力
  • 实践是认识的目的
  • 实践是检验真理的唯一标准
文章作者: gglss
文章链接: http://example.com/posts/50070.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/50581.html b/posts/50581.html index 20aced163..915717aeb 100644 --- a/posts/50581.html +++ b/posts/50581.html @@ -1 +1 @@ -使用Java解析Properties文件 | GGLSS

使用Java解析Properties文件

主要函数

文件后缀函数方法
.Propertiesload加载文件
setProperty设置
getProperty获取

编写逻辑

创建加载文件的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 加载文件
* @return Properties 对象
* @throws IOException I/O输入异常
*/
private Properties readProperties() throws IOException{
// 实例化,创建 Properties 对象
Properties properties = new Properties();
try {
// 创建文件输入对象 FileInputStream("testpro.properties")
InputStream inputStream = new FileInputStream(filepath);
// 把文件输入对象放入缓存输入对象 new BufferedInputStream 里面
BufferedInputStream in = new BufferedInputStream(inputStream);
// 加载文件 in = ParseProperties.class.getResourceAsStream("testpro.properties"),自动获取 resources 文件夹下路径
properties.load(in);
}catch (IOException e){
e.printStackTrace();
}
return properties;
}

获取key后面的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 获取数据
* @param key 数据名称
* @return 数据等号右边的值
* @throws Exception 异常
*/
public String getPro(String key) throws Exception {
// 判断文件里面有没有这个 Key
if (prop.containsKey(key)) {
// 获得key后面的value值
return prop.getProperty(key);
}else {
System.out.println("你获取的key值不对");
return "";
}
}

获取定位类型或者定位表达式

1
2
3
4
5
6
7
8
9
/**
* 返回定位类型或者定位表达式
* @param key 数据名称
* @param num 输入0/1
* @return num=0时,返回定位类型,num=1时,返回定位表达式
*/
public String get_pro_element(String key, int num){
return (num!=0 & num!=1) ? "num:参数输入错误" : prop.getProperty(key).split("->")[num];
}
文章作者: gglss
文章链接: http://example.com/posts/50581.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用Java解析Properties文件 | GGLSS

使用Java解析Properties文件

主要函数

文件后缀函数方法
.Propertiesload加载文件
setProperty设置
getProperty获取

编写逻辑

创建加载文件的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 加载文件
* @return Properties 对象
* @throws IOException I/O输入异常
*/
private Properties readProperties() throws IOException{
// 实例化,创建 Properties 对象
Properties properties = new Properties();
try {
// 创建文件输入对象 FileInputStream("testpro.properties")
InputStream inputStream = new FileInputStream(filepath);
// 把文件输入对象放入缓存输入对象 new BufferedInputStream 里面
BufferedInputStream in = new BufferedInputStream(inputStream);
// 加载文件 in = ParseProperties.class.getResourceAsStream("testpro.properties"),自动获取 resources 文件夹下路径
properties.load(in);
}catch (IOException e){
e.printStackTrace();
}
return properties;
}

获取key后面的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 获取数据
* @param key 数据名称
* @return 数据等号右边的值
* @throws Exception 异常
*/
public String getPro(String key) throws Exception {
// 判断文件里面有没有这个 Key
if (prop.containsKey(key)) {
// 获得key后面的value值
return prop.getProperty(key);
}else {
System.out.println("你获取的key值不对");
return "";
}
}

获取定位类型或者定位表达式

1
2
3
4
5
6
7
8
9
/**
* 返回定位类型或者定位表达式
* @param key 数据名称
* @param num 输入0/1
* @return num=0时,返回定位类型,num=1时,返回定位表达式
*/
public String get_pro_element(String key, int num){
return (num!=0 & num!=1) ? "num:参数输入错误" : prop.getProperty(key).split("->")[num];
}
文章作者: gglss
文章链接: http://example.com/posts/50581.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/50699.html b/posts/50699.html index f5125c270..e522dd3ff 100644 --- a/posts/50699.html +++ b/posts/50699.html @@ -1 +1 @@ -使用docker安装常用软件:tomcat | GGLSS

使用docker安装常用软件:tomcat

使用docker安装常用软件:tomcat

安装流程

首先把tomcat在镜像源中pull下来,使用docker images 查看镜像

使用docker run -d -p 8080:8080 tomcat:9.0 新建容器运行tomcat

运行后使用本地PC使用阿里云的ip和端口访问docker上面的tomcat

这是什么原因呢

使用docker ps查询到容器编号,docker exec -it 容器编号 bash 打开容器

1
2
3
4
5
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c52ab6b8b8df b8e65a4d736d "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp inspiring_bohr
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker exec -it c52ab6b8b8df bash
root@c52ab6b8b8df:/usr/local/tomcat#

使用ls-l查看文件列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@c52ab6b8b8df:/usr/local/tomcat# ls -l
total 156
-rw-r--r-- 1 root root 18970 Dec 2 14:30 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 14:30 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Dec 2 14:30 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 14:30 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 14:30 README.md
-rw-r--r-- 1 root root 6898 Dec 2 14:30 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Dec 2 14:30 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 17:16 bin
drwxr-xr-x 1 root root 4096 Apr 29 01:48 conf
drwxr-xr-x 2 root root 4096 Dec 22 17:16 lib
drwxrwxrwx 1 root root 4096 Apr 29 01:48 logs
drwxr-xr-x 2 root root 4096 Dec 22 17:16 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 17:16 temp
drwxr-xr-x 2 root root 4096 Dec 22 17:16 webapps
drwxr-xr-x 7 root root 4096 Dec 2 14:30 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 14:30 work
root@c52ab6b8b8df:/usr/local/tomcat#

从列表可以看到有两个文件夹webappswebapps.dist,数据全部在webapps.dist里面,需要将webapps删除,把webapps.dist重命名成webapps即可访问

使用rm -rf webapps删除webapps文件夹

使用mv webapps.dist webapps 重命名

再次使用本地访问

使用免修改版的tomcat

docker pull billygoo/tomcat8-jdk8

docker run -d -p 8080:8080 –name tomcat8 billygoo/tomcat8-jdk8

文章作者: gglss
文章链接: http://example.com/posts/50699.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用docker安装常用软件:tomcat | GGLSS

使用docker安装常用软件:tomcat

使用docker安装常用软件:tomcat

安装流程

首先把tomcat在镜像源中pull下来,使用docker images 查看镜像

使用docker run -d -p 8080:8080 tomcat:9.0 新建容器运行tomcat

运行后使用本地PC使用阿里云的ip和端口访问docker上面的tomcat

这是什么原因呢

使用docker ps查询到容器编号,docker exec -it 容器编号 bash 打开容器

1
2
3
4
5
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c52ab6b8b8df b8e65a4d736d "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp inspiring_bohr
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker exec -it c52ab6b8b8df bash
root@c52ab6b8b8df:/usr/local/tomcat#

使用ls-l查看文件列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
root@c52ab6b8b8df:/usr/local/tomcat# ls -l
total 156
-rw-r--r-- 1 root root 18970 Dec 2 14:30 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 14:30 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Dec 2 14:30 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 14:30 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 14:30 README.md
-rw-r--r-- 1 root root 6898 Dec 2 14:30 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Dec 2 14:30 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 17:16 bin
drwxr-xr-x 1 root root 4096 Apr 29 01:48 conf
drwxr-xr-x 2 root root 4096 Dec 22 17:16 lib
drwxrwxrwx 1 root root 4096 Apr 29 01:48 logs
drwxr-xr-x 2 root root 4096 Dec 22 17:16 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 17:16 temp
drwxr-xr-x 2 root root 4096 Dec 22 17:16 webapps
drwxr-xr-x 7 root root 4096 Dec 2 14:30 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 14:30 work
root@c52ab6b8b8df:/usr/local/tomcat#

从列表可以看到有两个文件夹webappswebapps.dist,数据全部在webapps.dist里面,需要将webapps删除,把webapps.dist重命名成webapps即可访问

使用rm -rf webapps删除webapps文件夹

使用mv webapps.dist webapps 重命名

再次使用本地访问

使用免修改版的tomcat

docker pull billygoo/tomcat8-jdk8

docker run -d -p 8080:8080 –name tomcat8 billygoo/tomcat8-jdk8

文章作者: gglss
文章链接: http://example.com/posts/50699.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/51796.html b/posts/51796.html index 1085a835a..11d0f4aa6 100644 --- a/posts/51796.html +++ b/posts/51796.html @@ -1 +1 @@ -redis的3主3从扩容 | GGLSS

redis的3主3从扩容

redis的3主3从扩容

首先添加两个redis

1
2
3
4
# 创建redis-node-7
docler run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
# 创建redis-node-8
docler run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

注:在阿里云的安全组和防火墙上添加6387,16387 6388,16388四个端口

配置步骤:

执行docker exec -it redis-node-1 bash 进入redis-node-1里面
执行redis-cli --cluster add-node 8.142.144.75:6387 8.142.144.75:6381

6387 新加入的节点

6381 相当于6387的领路人

使用redis-cli --cluster check 8.142.144.75:6381检查
重新分配槽号

redis-cli –cluster reshard IP地址:端口号

注:上图的1指的是:对主机数平分16384个节点,16384/主机数(包含想要添加的主机)

注:上图的2指的是:新加入的6387节点的ID

all:表示全部进行重新分配

在重新加载过程会碰到Do you want to proceed with the proposed reshard plan (yes/no)?一句话,选择yes就可以

检查集群情况
为主节点6387分配从节点6388

redis-cli –cluster add-node ip:新slave端口 ip:新master端口 –cluster-slave –cluster-master-id 新主机节点ID

检查集群情况
文章作者: gglss
文章链接: http://example.com/posts/51796.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +redis的3主3从扩容 | GGLSS

redis的3主3从扩容

redis的3主3从扩容

首先添加两个redis

1
2
3
4
# 创建redis-node-7
docler run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
# 创建redis-node-8
docler run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

注:在阿里云的安全组和防火墙上添加6387,16387 6388,16388四个端口

配置步骤:

执行docker exec -it redis-node-1 bash 进入redis-node-1里面
执行redis-cli --cluster add-node 8.142.144.75:6387 8.142.144.75:6381

6387 新加入的节点

6381 相当于6387的领路人

使用redis-cli --cluster check 8.142.144.75:6381检查
重新分配槽号

redis-cli –cluster reshard IP地址:端口号

注:上图的1指的是:对主机数平分16384个节点,16384/主机数(包含想要添加的主机)

注:上图的2指的是:新加入的6387节点的ID

all:表示全部进行重新分配

在重新加载过程会碰到Do you want to proceed with the proposed reshard plan (yes/no)?一句话,选择yes就可以

检查集群情况
为主节点6387分配从节点6388

redis-cli –cluster add-node ip:新slave端口 ip:新master端口 –cluster-slave –cluster-master-id 新主机节点ID

检查集群情况
文章作者: gglss
文章链接: http://example.com/posts/51796.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/52630.html b/posts/52630.html index 6b95fd717..8f0e285b1 100644 --- a/posts/52630.html +++ b/posts/52630.html @@ -1 +1 @@ -考研进度实况 | GGLSS

考研进度实况

考研实况

文章作者: gglss
文章链接: http://example.com/posts/52630.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +考研进度实况 | GGLSS

考研进度实况

考研实况

文章作者: gglss
文章链接: http://example.com/posts/52630.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/527.html b/posts/527.html index be0082b27..71f1b5657 100644 --- a/posts/527.html +++ b/posts/527.html @@ -1 +1 @@ -Constant Timer定时器 | GGLSS

Constant Timer定时器

作用

就是loadrunner上面的思考时间,就是模拟真实用户操作过程的等待时间

生效范围

定时器的父节点和子节点,如果想让一个请求强制停止一段时间,就把定时器放在这个请求的下面

单位是以ms为单位,1s=1000ms

文章作者: gglss
文章链接: http://example.com/posts/527.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Constant Timer定时器 | GGLSS

Constant Timer定时器

作用

就是loadrunner上面的思考时间,就是模拟真实用户操作过程的等待时间

生效范围

定时器的父节点和子节点,如果想让一个请求强制停止一段时间,就把定时器放在这个请求的下面

单位是以ms为单位,1s=1000ms

文章作者: gglss
文章链接: http://example.com/posts/527.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/52845.html b/posts/52845.html index c6cc8419a..f82850070 100644 --- a/posts/52845.html +++ b/posts/52845.html @@ -1 +1 @@ -使用jmeter录制压测 | GGLSS

使用jmeter录制压测

业务

  • 压测对象:http://news.baidu.com
  • 压测页面:首页、国际频道、财经频道
  • 步骤
    • 访问首页
    • 单击“国际”(频道)
    • 单击“财经”(频道)
  • 操作手段:录制回放

操作步骤

  • 添加录制器“HTTP(S) Test Script Recorder”

    • 右键Test Plan,点击add
    • 点击Non-Test Elements
    • 点击HTTP(S) Test Script Recorder
  • 添加线程组“Thread Group”

  • 添加录制控制器“Recording Controller”,

    • 右键线程组,点击and
    • 点击Logic Controller
    • 点击Recording Controller
  • 录制脚本的配置(Test Plan Creation)

    • Port=8088
    • Target Controller = TestPlan > Tread Group > Recording Controller
    • 其他的配置保持默认
  • 录制脚本的配置(Requests Filtering 请求过滤器)

    • URl Patterns to Include上添加正则.*\.(baidu\.com).*;表示只抓取百度URL的内容,不抓取其他网站的
    • URl Patterns to Exclude上添加正则.*\.(js|css|PNG|jpg|jpeg|ico|png|gif).*;去掉一些静态请求
    • 目的是:避免录制过多没必要的请求
  • 单击保存按钮,将Jmeter脚本存储

  • 打开浏览器,设置代理,将浏览器的代理服务地址指向http://localhost:8088,然后就可以进行访问录制了

  • 访问百度新闻的首页、国际、财经页面

  • 查看jmeter,录制结果在Recording Controller下面看到,然后停止录制

校验

录制结束后,要对录制的代码进行校验

  • 添加查看结果树组件

运行录制的代码,在查看结果树上查看运行的结果

文章作者: gglss
文章链接: http://example.com/posts/52845.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用jmeter录制压测 | GGLSS

使用jmeter录制压测

业务

  • 压测对象:http://news.baidu.com
  • 压测页面:首页、国际频道、财经频道
  • 步骤
    • 访问首页
    • 单击“国际”(频道)
    • 单击“财经”(频道)
  • 操作手段:录制回放

操作步骤

  • 添加录制器“HTTP(S) Test Script Recorder”

    • 右键Test Plan,点击add
    • 点击Non-Test Elements
    • 点击HTTP(S) Test Script Recorder
  • 添加线程组“Thread Group”

  • 添加录制控制器“Recording Controller”,

    • 右键线程组,点击and
    • 点击Logic Controller
    • 点击Recording Controller
  • 录制脚本的配置(Test Plan Creation)

    • Port=8088
    • Target Controller = TestPlan > Tread Group > Recording Controller
    • 其他的配置保持默认
  • 录制脚本的配置(Requests Filtering 请求过滤器)

    • URl Patterns to Include上添加正则.*\.(baidu\.com).*;表示只抓取百度URL的内容,不抓取其他网站的
    • URl Patterns to Exclude上添加正则.*\.(js|css|PNG|jpg|jpeg|ico|png|gif).*;去掉一些静态请求
    • 目的是:避免录制过多没必要的请求
  • 单击保存按钮,将Jmeter脚本存储

  • 打开浏览器,设置代理,将浏览器的代理服务地址指向http://localhost:8088,然后就可以进行访问录制了

  • 访问百度新闻的首页、国际、财经页面

  • 查看jmeter,录制结果在Recording Controller下面看到,然后停止录制

校验

录制结束后,要对录制的代码进行校验

  • 添加查看结果树组件

运行录制的代码,在查看结果树上查看运行的结果

文章作者: gglss
文章链接: http://example.com/posts/52845.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/53299.html b/posts/53299.html index ed46a229e..cf278bc83 100644 --- a/posts/53299.html +++ b/posts/53299.html @@ -1 +1 @@ -_3主3从的`Redis集群`搭建之哈希槽算法 | GGLSS

_3主3从的`Redis集群`搭建之哈希槽算法

_3主3从的Redis集群搭建之哈希槽算法

目的

解决一致性哈希算法数据倾斜问题

实质

是一个数组,数组[0,2^14-1]形成hash slot空间

作用

解决均匀分配问题,在数据和节点之间加入一层(哈希槽slot)用于管理数据和节点之间的关系,现在相当于节点里放槽,槽里放数据

方便数据移动

哈希解决的映射问题,使用key的哈希值来计算所在的槽,便于数据分配

多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)

这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。

接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384

以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

举个栗子

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

首先有几个redis就把0-16383分成几个

文章作者: gglss
文章链接: http://example.com/posts/53299.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +_3主3从的`Redis集群`搭建之哈希槽算法 | GGLSS

_3主3从的`Redis集群`搭建之哈希槽算法

_3主3从的Redis集群搭建之哈希槽算法

目的

解决一致性哈希算法数据倾斜问题

实质

是一个数组,数组[0,2^14-1]形成hash slot空间

作用

解决均匀分配问题,在数据和节点之间加入一层(哈希槽slot)用于管理数据和节点之间的关系,现在相当于节点里放槽,槽里放数据

方便数据移动

哈希解决的映射问题,使用key的哈希值来计算所在的槽,便于数据分配

多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)

这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。

接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384

以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

举个栗子

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

首先有几个redis就把0-16383分成几个

文章作者: gglss
文章链接: http://example.com/posts/53299.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/53427.html b/posts/53427.html index ef7f16004..b88ded5bc 100644 --- a/posts/53427.html +++ b/posts/53427.html @@ -1 +1 @@ -Butterfly美化记录三 | GGLSS

Butterfly美化记录三

分类页和标签页面添加Bar条

使用justlovesmile

新增pug文件

新增categoryBar.pug文件

首先是分类条,在themes/butterfly/layout/includes/处新建文件categoryBar.pug

1
2
3
4
#category-bar
.category-bar-items#category-bar-items
!=getarray_bar("category")
a.category-bar-more(href="/categories/") 更多

新增tarsBar.pug文件

其次是标签条,在themes/butterfly/layout/includes/处新建文件tagBar.pug,因为样式一样,所以没有更改id和class名称。

1
2
3
4
#category-bar
.category-bar-items#category-bar-items
!=getarray_bar("tag")
a.category-bar-more(href="/tags/") 更多

新建Hexo辅助函数

theme/butterfly/scripts/helpers/中创建get_arrays.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
hexo.extend.helper.register('getarray_bar', function (types) {
if (!types) {
types = "category"
}
const categoriesBar = function (categories) {
if (!categories || !categories.length) return ``
const categoryArr = []
hexo.locals.get('categories').map(function (category) {
categoryArr.push({ name: category.name, value: category.length })
})
categoryArr.sort((a, b) => { return b.value - a.value })
let strCategoriesBar = ``
for (let i = 0; i < categories.length; i++) {
strTemp=`
<div class="category-bar-item" id="${categoryArr[i].name}">
<a href="/categories/${categoryArr[i].name}/">${categoryArr[i].name}</a>
</div>`
strCategoriesBar+=strTemp
}
return strCategoriesBar
}
const tagsBar = function(tags) {
if (!tags || !tags.length) return ``
const tagArr = []
hexo.locals.get('tags').map(function (tag) {
tagArr.push({ name: tag.name, value: tag.length })
})
tagArr.sort((a, b) => { return b.value - a.value })
let strTagsBar = ``
for (let i = 0; i < tags.length; i++) {
strTemp=`
<div class="category-bar-item" id="${tagArr[i].name}">
<a href="/tags/${tagArr[i].name}/">${tagArr[i].name}</a>
</div>`
strTagsBar+=strTemp
}
return strTagsBar
}
if (types == "category"){
return categoriesBar(this.site.categories)
}
if (types == "tag"){
return tagsBar(this.site.tags)
}
})

在页面引用模块

在分类页面引用:找到theme/butterfly/layout/category.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extends includes/layout.pug

block content
if theme.category_ui == 'index'
include ./includes/mixins/post-ui.pug
#recent-posts.recent-posts.category_ui
+postUI
include includes/pagination.pug
else
include ./includes/mixins/article-sort.pug
#category
+ .category-in-bar
+ .category-in-bar-tips
+ i.fa-fw.fas.fa-folder-open
+ include includes/categoryBar.pug
.article-sort-title= _p('page.category') + ' - ' + page.category
+articleSort(page.posts)
include includes/pagination.pug

在标签页引用:找到theme/butterfly/layout/tag.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extends includes/layout.pug

block content
if theme.tag_ui == 'index'
include ./includes/mixins/post-ui.pug
#recent-posts.recent-posts
+postUI
include includes/pagination.pug
else
include ./includes/mixins/article-sort.pug
#tag
+ .category-in-bar
+ .category-in-bar-tips
+ i.fa-fw.fas.fa-tags
+ include includes/tagBar.pug
.article-sort-title= _p('page.tag') + ' - ' + page.tag
+articleSort(page.posts)
include includes/pagination.pug

引入js和css文件

在自定义的js里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// -----------分类条的js-----------
categoriesBarActive()
topCategoriesBarScroll()
tagsBarActive()

//分类条
function categoriesBarActive(){
var urlinfo = window.location.pathname;
urlinfo = decodeURIComponent(urlinfo)
console.log(urlinfo);
//判断是否是首页
if (urlinfo == '/'){
if (document.querySelector('#category-bar')){
document.getElementById('首页').classList.add("select")
}
}else {
// 验证是否是分类链接
var pattern = /\/categories\/.*?\//;
var patbool = pattern.test(urlinfo);
console.log(patbool);
// 获取当前的分类
if (patbool) {
var valuegroup = urlinfo.split("/");
console.log(valuegroup[2]);
// 获取当前分类
var nowCategorie = valuegroup[2];
if (document.querySelector('#category-bar')){
document.getElementById(nowCategorie).classList.add("select");
}
}
}

}

//鼠标控制横向滚动
function topCategoriesBarScroll(){
if (document.getElementById("category-bar-items")){
let xscroll = document.getElementById("category-bar-items");
xscroll.addEventListener("mousewheel", function (e) {
//计算鼠标滚轮滚动的距离
let v = -e.wheelDelta / 2;
xscroll.scrollLeft += v;
//阻止浏览器默认方法
e.preventDefault();
}, false);
}
}

// -----------标签条的js-----------
//标签条
function tagsBarActive(){
var urlinfo = window.location.pathname;
urlinfo = decodeURIComponent(urlinfo)
//console.log(urlinfo);
//判断是否是首页
if (urlinfo == '/'){
if (document.querySelector('#tags-bar')){
document.getElementById('首页').classList.add("select")
}
}else {
// 验证是否是分类链接
var pattern = /\/tags\/.*?\//;
var patbool = pattern.test(urlinfo);
//console.log(patbool);
// 获取当前的标签
if (patbool) {
var valuegroup = urlinfo.split("/");
//console.log(valuegroup[2]);
// 获取当前分类
var nowTag = valuegroup[2];
if (document.querySelector('#category-bar')){
document.getElementById(nowTag).classList.add("select");
}
}
}
}

修改导航栏一闪的问题

使用的安知鱼

修改main.js

修改顶栏一闪而过的 bug 修改本地themes/butterfly/source/js/main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  window.scrollCollect = () => {
return btf.throttle(function (e) {
const currentTop = window.scrollY || document.documentElement.scrollTop
const isDown = scrollDirection(currentTop)
if (currentTop > 56) {
+ $header.classList.add('is-top-bar')
if (isDown) {
if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible')
if (isChatBtnShow && isChatShow === true) {
chatBtnHide()
isChatShow = false
}
} else {
if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible')
if (isChatBtnHide && isChatShow === false) {
chatBtnShow()
isChatShow = true
}
}
$header.classList.add('nav-fixed')
if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') {
$rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)'
}
} else {
if (currentTop === 0) {
- $header.classList.remove('nav-fixed', 'nav-visible')
+ $header.classList.remove('is-top-bar')
}
$rightside.style.cssText = "opacity: ''; transform: ''"
}

if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)'
}
}, 200)()
}

侧边栏最近文章梅花

修改index.pug布局

去除首页最近文章显示,改为文章页显示,修改themes/butterfly/layout/includes/widget/index.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
else
//- page
!=partial('includes/widget/card_author', {}, {cache: true})
!=partial('includes/widget/card_announcement', {}, {cache: true})
!=partial('includes/widget/card_top_self', {}, {cache: true})

.sticky_layout
if showToc
include ./card_post_toc.pug

//- !=partial('includes/widget/card_recent_post', {}, {cache: true}) //- 注释掉最近文章

!=partial('includes/widget/card_ad', {}, {cache: true})
!=partial('includes/widget/card_newest_comment', {}, {cache: true})
!=partial('includes/widget/card_categories', {}, {cache: true})
!=partial('includes/widget/card_tags', {}, {cache: true})

添加css美化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#aside-content .aside-list > .aside-list-item .content > time {
display: none;
}
#aside-content .aside-list > .aside-list-item .content > .title {
-webkit-line-clamp: 3;
font-weight: 700;
padding: 2px 0;
}
#aside-content .aside-list > .aside-list-item {
padding: 8px;
padding-top: 6px !important;
padding-bottom: 6px !important;
border-radius: 12px;
transition: 0.3s;
margin: 4px 0;
cursor: pointer;
}
@media screen and (min-width: 1300px) {
#aside-content .aside-list > .aside-list-item:hover {
transform: scale(1.03);
}
#aside-content .aside-list > .aside-list-item:active {
transform: scale(0.97);
}
}
#aside-content .aside-list > .aside-list-item:hover .thumbnail > img {
transform: scale(1);
}
#aside-content .aside-list > .aside-list-item:not(:last-child) {
border-bottom: 0 dashed var(--anzhiyu-background) !important;
}
#aside-content .aside-list > .aside-list-item .thumbnail {
border-radius: 8px;
border: var(--style-border);
}
#aside-content .aside-list > .aside-list-item:hover {
background: var(--anzhiyu-blue-main);
color: var(--anzhiyu-white);
transition: 0.3s;
box-shadow: var(--anzhiyu-shadow-main);
}
#aside-content .aside-list > .aside-list-item:hover a {
color: var(--anzhiyu-white) !important;
}
.card-widget.card-recent-post {
padding: 0.4rem 0.6rem !important;
}
文章作者: gglss
文章链接: http://example.com/posts/53427.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Butterfly美化记录三 | GGLSS

Butterfly美化记录三

分类页和标签页面添加Bar条

使用justlovesmile

新增pug文件

新增categoryBar.pug文件

首先是分类条,在themes/butterfly/layout/includes/处新建文件categoryBar.pug

1
2
3
4
#category-bar
.category-bar-items#category-bar-items
!=getarray_bar("category")
a.category-bar-more(href="/categories/") 更多

新增tarsBar.pug文件

其次是标签条,在themes/butterfly/layout/includes/处新建文件tagBar.pug,因为样式一样,所以没有更改id和class名称。

1
2
3
4
#category-bar
.category-bar-items#category-bar-items
!=getarray_bar("tag")
a.category-bar-more(href="/tags/") 更多

新建Hexo辅助函数

theme/butterfly/scripts/helpers/中创建get_arrays.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
hexo.extend.helper.register('getarray_bar', function (types) {
if (!types) {
types = "category"
}
const categoriesBar = function (categories) {
if (!categories || !categories.length) return ``
const categoryArr = []
hexo.locals.get('categories').map(function (category) {
categoryArr.push({ name: category.name, value: category.length })
})
categoryArr.sort((a, b) => { return b.value - a.value })
let strCategoriesBar = ``
for (let i = 0; i < categories.length; i++) {
strTemp=`
<div class="category-bar-item" id="${categoryArr[i].name}">
<a href="/categories/${categoryArr[i].name}/">${categoryArr[i].name}</a>
</div>`
strCategoriesBar+=strTemp
}
return strCategoriesBar
}
const tagsBar = function(tags) {
if (!tags || !tags.length) return ``
const tagArr = []
hexo.locals.get('tags').map(function (tag) {
tagArr.push({ name: tag.name, value: tag.length })
})
tagArr.sort((a, b) => { return b.value - a.value })
let strTagsBar = ``
for (let i = 0; i < tags.length; i++) {
strTemp=`
<div class="category-bar-item" id="${tagArr[i].name}">
<a href="/tags/${tagArr[i].name}/">${tagArr[i].name}</a>
</div>`
strTagsBar+=strTemp
}
return strTagsBar
}
if (types == "category"){
return categoriesBar(this.site.categories)
}
if (types == "tag"){
return tagsBar(this.site.tags)
}
})

在页面引用模块

在分类页面引用:找到theme/butterfly/layout/category.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extends includes/layout.pug

block content
if theme.category_ui == 'index'
include ./includes/mixins/post-ui.pug
#recent-posts.recent-posts.category_ui
+postUI
include includes/pagination.pug
else
include ./includes/mixins/article-sort.pug
#category
+ .category-in-bar
+ .category-in-bar-tips
+ i.fa-fw.fas.fa-folder-open
+ include includes/categoryBar.pug
.article-sort-title= _p('page.category') + ' - ' + page.category
+articleSort(page.posts)
include includes/pagination.pug

在标签页引用:找到theme/butterfly/layout/tag.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
extends includes/layout.pug

block content
if theme.tag_ui == 'index'
include ./includes/mixins/post-ui.pug
#recent-posts.recent-posts
+postUI
include includes/pagination.pug
else
include ./includes/mixins/article-sort.pug
#tag
+ .category-in-bar
+ .category-in-bar-tips
+ i.fa-fw.fas.fa-tags
+ include includes/tagBar.pug
.article-sort-title= _p('page.tag') + ' - ' + page.tag
+articleSort(page.posts)
include includes/pagination.pug

引入js和css文件

在自定义的js里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// -----------分类条的js-----------
categoriesBarActive()
topCategoriesBarScroll()
tagsBarActive()

//分类条
function categoriesBarActive(){
var urlinfo = window.location.pathname;
urlinfo = decodeURIComponent(urlinfo)
console.log(urlinfo);
//判断是否是首页
if (urlinfo == '/'){
if (document.querySelector('#category-bar')){
document.getElementById('首页').classList.add("select")
}
}else {
// 验证是否是分类链接
var pattern = /\/categories\/.*?\//;
var patbool = pattern.test(urlinfo);
console.log(patbool);
// 获取当前的分类
if (patbool) {
var valuegroup = urlinfo.split("/");
console.log(valuegroup[2]);
// 获取当前分类
var nowCategorie = valuegroup[2];
if (document.querySelector('#category-bar')){
document.getElementById(nowCategorie).classList.add("select");
}
}
}

}

//鼠标控制横向滚动
function topCategoriesBarScroll(){
if (document.getElementById("category-bar-items")){
let xscroll = document.getElementById("category-bar-items");
xscroll.addEventListener("mousewheel", function (e) {
//计算鼠标滚轮滚动的距离
let v = -e.wheelDelta / 2;
xscroll.scrollLeft += v;
//阻止浏览器默认方法
e.preventDefault();
}, false);
}
}

// -----------标签条的js-----------
//标签条
function tagsBarActive(){
var urlinfo = window.location.pathname;
urlinfo = decodeURIComponent(urlinfo)
//console.log(urlinfo);
//判断是否是首页
if (urlinfo == '/'){
if (document.querySelector('#tags-bar')){
document.getElementById('首页').classList.add("select")
}
}else {
// 验证是否是分类链接
var pattern = /\/tags\/.*?\//;
var patbool = pattern.test(urlinfo);
//console.log(patbool);
// 获取当前的标签
if (patbool) {
var valuegroup = urlinfo.split("/");
//console.log(valuegroup[2]);
// 获取当前分类
var nowTag = valuegroup[2];
if (document.querySelector('#category-bar')){
document.getElementById(nowTag).classList.add("select");
}
}
}
}

修改导航栏一闪的问题

使用的安知鱼

修改main.js

修改顶栏一闪而过的 bug 修改本地themes/butterfly/source/js/main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  window.scrollCollect = () => {
return btf.throttle(function (e) {
const currentTop = window.scrollY || document.documentElement.scrollTop
const isDown = scrollDirection(currentTop)
if (currentTop > 56) {
+ $header.classList.add('is-top-bar')
if (isDown) {
if ($header.classList.contains('nav-visible')) $header.classList.remove('nav-visible')
if (isChatBtnShow && isChatShow === true) {
chatBtnHide()
isChatShow = false
}
} else {
if (!$header.classList.contains('nav-visible')) $header.classList.add('nav-visible')
if (isChatBtnHide && isChatShow === false) {
chatBtnShow()
isChatShow = true
}
}
$header.classList.add('nav-fixed')
if (window.getComputedStyle($rightside).getPropertyValue('opacity') === '0') {
$rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)'
}
} else {
if (currentTop === 0) {
- $header.classList.remove('nav-fixed', 'nav-visible')
+ $header.classList.remove('is-top-bar')
}
$rightside.style.cssText = "opacity: ''; transform: ''"
}

if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = 'opacity: 0.8; transform: translateX(-58px)'
}
}, 200)()
}

侧边栏最近文章梅花

修改index.pug布局

去除首页最近文章显示,改为文章页显示,修改themes/butterfly/layout/includes/widget/index.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
else
//- page
!=partial('includes/widget/card_author', {}, {cache: true})
!=partial('includes/widget/card_announcement', {}, {cache: true})
!=partial('includes/widget/card_top_self', {}, {cache: true})

.sticky_layout
if showToc
include ./card_post_toc.pug

//- !=partial('includes/widget/card_recent_post', {}, {cache: true}) //- 注释掉最近文章

!=partial('includes/widget/card_ad', {}, {cache: true})
!=partial('includes/widget/card_newest_comment', {}, {cache: true})
!=partial('includes/widget/card_categories', {}, {cache: true})
!=partial('includes/widget/card_tags', {}, {cache: true})

添加css美化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#aside-content .aside-list > .aside-list-item .content > time {
display: none;
}
#aside-content .aside-list > .aside-list-item .content > .title {
-webkit-line-clamp: 3;
font-weight: 700;
padding: 2px 0;
}
#aside-content .aside-list > .aside-list-item {
padding: 8px;
padding-top: 6px !important;
padding-bottom: 6px !important;
border-radius: 12px;
transition: 0.3s;
margin: 4px 0;
cursor: pointer;
}
@media screen and (min-width: 1300px) {
#aside-content .aside-list > .aside-list-item:hover {
transform: scale(1.03);
}
#aside-content .aside-list > .aside-list-item:active {
transform: scale(0.97);
}
}
#aside-content .aside-list > .aside-list-item:hover .thumbnail > img {
transform: scale(1);
}
#aside-content .aside-list > .aside-list-item:not(:last-child) {
border-bottom: 0 dashed var(--anzhiyu-background) !important;
}
#aside-content .aside-list > .aside-list-item .thumbnail {
border-radius: 8px;
border: var(--style-border);
}
#aside-content .aside-list > .aside-list-item:hover {
background: var(--anzhiyu-blue-main);
color: var(--anzhiyu-white);
transition: 0.3s;
box-shadow: var(--anzhiyu-shadow-main);
}
#aside-content .aside-list > .aside-list-item:hover a {
color: var(--anzhiyu-white) !important;
}
.card-widget.card-recent-post {
padding: 0.4rem 0.6rem !important;
}
文章作者: gglss
文章链接: http://example.com/posts/53427.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/53508.html b/posts/53508.html index 20f157dd0..61dd8b488 100644 --- a/posts/53508.html +++ b/posts/53508.html @@ -1 +1 @@ -docker 帮助启动类命令(二) | GGLSS

docker 帮助启动类命令(二)

docker 帮助启动类命令(二)

docker 开机启动

systemctl enable docker

查看 docker 概要信息

docker info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
scan: Docker Scan (Docker Inc., v0.12.0)

Server:
Containers: 6
Running: 0
Paused: 0
Stopped: 6
Images: 5
Server Version: 20.10.12
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.45.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.795GiB
Name: iZ8vbfaek3x3ogtpxnpnwfZ
ID: NQOP:KCP6:LS6G:K52A:XOQX:E7FG:FEHL:K3QX:NSLP:VY5S:TFX5:UR42
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://qp747t9w.mirror.aliyuncs.com/
Live Restore Enabled: false

查看 docker 总体帮助文档

docker –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker --help

Usage: docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST
env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit

Management Commands:
app* Docker App (Docker Inc., v0.9.1-beta3)


查看 docker 命令帮助文档
> docker 具体命令 --help

```shell
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps --help

Usage: docker ps [OPTIONS]

List containers

Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

文章作者: gglss
文章链接: http://example.com/posts/53508.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +docker 帮助启动类命令(二) | GGLSS

docker 帮助启动类命令(二)

docker 帮助启动类命令(二)

docker 开机启动

systemctl enable docker

查看 docker 概要信息

docker info

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
scan: Docker Scan (Docker Inc., v0.12.0)

Server:
Containers: 6
Running: 0
Paused: 0
Stopped: 6
Images: 5
Server Version: 20.10.12
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.45.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.795GiB
Name: iZ8vbfaek3x3ogtpxnpnwfZ
ID: NQOP:KCP6:LS6G:K52A:XOQX:E7FG:FEHL:K3QX:NSLP:VY5S:TFX5:UR42
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://qp747t9w.mirror.aliyuncs.com/
Live Restore Enabled: false

查看 docker 总体帮助文档

docker –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker --help

Usage: docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST
env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit

Management Commands:
app* Docker App (Docker Inc., v0.9.1-beta3)


查看 docker 命令帮助文档
> docker 具体命令 --help

```shell
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps --help

Usage: docker ps [OPTIONS]

List containers

Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

文章作者: gglss
文章链接: http://example.com/posts/53508.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/53812.html b/posts/53812.html index bdc8c80c9..15cf90cbb 100644 --- a/posts/53812.html +++ b/posts/53812.html @@ -1 +1 @@ -git提示Timed out的解决办法 | GGLSS

git提示Timed out的解决办法

报错代码

运行git代码会提示Timed out错误

1
使用git,会发生报错:Failed to connect to github.com port 443 after 21098 ms: Timed out

解决办法

设置代理

1
git config --global https.proxy

取消代理

1
git config --global --unset https.proxy

然后输入git 命令使用

文章作者: gglss
文章链接: http://example.com/posts/53812.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +git提示Timed out的解决办法 | GGLSS

git提示Timed out的解决办法

报错代码

运行git代码会提示Timed out错误

1
使用git,会发生报错:Failed to connect to github.com port 443 after 21098 ms: Timed out

解决办法

设置代理

1
git config --global https.proxy

取消代理

1
git config --global --unset https.proxy

然后输入git 命令使用

文章作者: gglss
文章链接: http://example.com/posts/53812.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/54899.html b/posts/54899.html index 0db36a558..748832a7b 100644 --- a/posts/54899.html +++ b/posts/54899.html @@ -1 +1 @@ -Butterfly美化记录一 | GGLSS

Butterfly美化记录一

注:这个魔改转载于Ariasakaの小窝

导航栏

分离菜单栏和搜索栏

让搜索栏放在最右侧,其他的导航栏居中

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
- if (theme.algolia_search.enable || theme.local_search.enable)
- #search-button
- a.site-page.social-icon.search
- i.fas.fa-search.fa-fw
- span=' '+_p('search.title')
!=partial('includes/header/menu_item', {}, {cache: true})
#nav-right
+ if (theme.algolia_search.enable || theme.local_search.enable)
+ #search-button
+ a.site-page.social-icon.search
+ i.fas.fa-search.fa-fw
- #toggle-menu
- a.site-page
- i.fas.fa-bars.fa-fw
+ #toggle-menu
+ a.site-page
+ i.fas.fa-bars.fa-fw

修改的文件nav.pug,版本为Butterfly 4.10.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nav#nav
span#blog-info
a(href=url_for('/') title=config.title)
if theme.nav.logo
img.site-icon(src=url_for(theme.nav.logo))
if theme.nav.display_title
span.site-name=config.title

#menus
!=partial('includes/header/menu_item', {}, {cache: true})

#nav-right
if (theme.algolia_search.enable || theme.local_search.enable || theme.docsearch.enable)
#search-button
a.site-page.social-icon.search(href="javascript:void(0);")
i.fas.fa-search.fa-fw

#toggle-menu
a.site-page
i.fas.fa-bars.fa-fw

居中

使用自定义[blogRoot]/self/css/meihua.css,添加下面的代码

1
2
3
4
5
6
7
#nav-right{
flex:1 1 auto;
justify-content: flex-end;
margin-left: auto;
display: flex;
flex-wrap:nowrap;
}

去掉导航栏下的蓝色长条

在自定义[blogRoot]/self/css/meihua.css里面添加

1
2
3
#nav *::after{
background-color: transparent!important;
}

子菜单横向布局

在自定义[blogRoot]/self/css/meihua.css里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* ----------导航栏横向下拉框---------- */

.menus_item_child li:not(#sidebar-menus li){
float: left;
border-radius: 6px!important;
-webkit-border-radius: 6px!important;
-moz-border-radius: 6px!important;
-ms-border-radius: 6px!important;
-o-border-radius: 6px!important;
}
.menus_item_child:not(#sidebar-menus ul){
/*left:calc(-150%)!important;*//*这是估算值,为了保持元素居中的,如果不合适可以自己调*/
left:50%;
translate:-50%;
}

显示标题

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug

1
2
3
4
5
6
7
8
9
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
!=partial('includes/header/menu_item', {}, {cache: true})
+ center(id="name-container")
+ a(id="page-name" href="javascript:scrollToTop()") PAGE_NAME
...

[blogRoot]/self/js/创建jquery.js文件,添加以下代码

1
2
/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});

然后添加nav.js,并且按照注释修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//js有一个小问题:就是只要鼠标滚动不论哪里都会响应,即便你滚动的是子元素

//2022.9.11 已修复,需要jq,请自行引入
document.getElementById("name-container").setAttribute("style", "display:none");

var position = $(window).scrollTop();

$(window).scroll(function () {

var scroll = $(window).scrollTop();

if (scroll > position) {


document.getElementById("name-container").setAttribute("style", "");
document.getElementsByClassName("menus_items")[1].setAttribute("style", "display:none!important");

} else {


document.getElementsByClassName("menus_items")[1].setAttribute("style", "");
document.getElementById("name-container").setAttribute("style", "display:none");

}

position = scroll;

});
function scrollToTop(){
document.getElementsByClassName("menus_items")[1].setAttribute("style","");
document.getElementById("name-container").setAttribute("style","display:none");
btf.scrollToDest(0, 500);
}
//修复没有弄右键菜单的童鞋无法回顶部的问题
document.getElementById("page-name").innerText = document.title.split(" | Ariasakaの小窝")[0];
/*这里是去掉你的网站全局名称的设置,如果你不需要去掉,你可以写成:
document.getElementById("page-name").innerText=document.title

或者把你的网站的分隔符和全局网站名称加上去*/

最后添加如下css,按照注释修改参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
2022.10.4更新:
根据我发现的没有自适应,间距不合理问题进行调整,如果用了这个的朋友们建议改一改
*/
#page-name::before{
font-size:18px;
position: absolute;
width:100%;
height:100%;
border-radius: 8px;
color:white!important;
top:0;
left:0;
content:'回到顶部';
background-color: var(--lyx-theme);
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
opacity: 0;
box-shadow: 0 0 3px var(--lyx-theme);
line-height: 45px; /*如果垂直位置不居中可以微调此值,也可以删了*/
}
#page-name:hover:before{
opacity: 1;
}
@media screen and (max-width:900px){
#page-name,#menus{
display:none!important;
}
}

#name-container{
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
}
#name-container:hover{
scale:1.03
}
#page-name{
position: relative;
padding:10px 30px/*如果文字间隔不合理可以微调修改,第二个是水平方向的padding,第一个是垂直的*/
}
#nav{
padding: 0 20px;
}

导航栏显示haver颜色

在自定义[blogRoot]/self/css/meihua.css里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* ----------修改导航栏的haver---------- */

.site-page {
padding: 5px;
margin: 3px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
.site-page:hover {
background-color: var(--gglss-theme);
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 5px;
}
.site-page.child:hover {
background-color: var(--gglss-theme)!important;
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 4px;
}

/* ----------网站标题部分的增强版---------- */
#site-name::before{
opacity: 0;
background-color: var(--gglss-theme)!important;
border-radius: 8px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
-ms-border-radius: 8px;
-o-border-radius: 8px;
transition: .3s;
-webkit-transition: .3s;
-moz-transition: .3s;
-ms-transition: .3s;
-o-transition: .3s;
position:absolute;
top:0!important;
right:0!important;
width:100%;
height:100%;
content: "\f015";
box-shadow: 0 0 5px var(--gglss-theme);
font-family: "Font Awesome 6 Free";
text-align: center;
color:white;
line-height:34px;/*如果有溢出或者垂直不居中的现象微调一下这个参数*/
font-size: 18px;/*根据个人喜好*/
}
#site-name:hover::before{
opacity: 1;
scale:1.03;
}
#site-name{
position: relative;
font-size: 24px; /*一定要把字体调大点,否则效果惨不忍睹!*/
}
:root{
--gglss-theme:#49B1F5 /*我的主题色*/
}

文章作者: gglss
文章链接: http://example.com/posts/54899.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Butterfly美化记录一 | GGLSS

Butterfly美化记录一

注:这个魔改转载于Ariasakaの小窝

导航栏

分离菜单栏和搜索栏

让搜索栏放在最右侧,其他的导航栏居中

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
- if (theme.algolia_search.enable || theme.local_search.enable)
- #search-button
- a.site-page.social-icon.search
- i.fas.fa-search.fa-fw
- span=' '+_p('search.title')
!=partial('includes/header/menu_item', {}, {cache: true})
#nav-right
+ if (theme.algolia_search.enable || theme.local_search.enable)
+ #search-button
+ a.site-page.social-icon.search
+ i.fas.fa-search.fa-fw
- #toggle-menu
- a.site-page
- i.fas.fa-bars.fa-fw
+ #toggle-menu
+ a.site-page
+ i.fas.fa-bars.fa-fw

修改的文件nav.pug,版本为Butterfly 4.10.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
nav#nav
span#blog-info
a(href=url_for('/') title=config.title)
if theme.nav.logo
img.site-icon(src=url_for(theme.nav.logo))
if theme.nav.display_title
span.site-name=config.title

#menus
!=partial('includes/header/menu_item', {}, {cache: true})

#nav-right
if (theme.algolia_search.enable || theme.local_search.enable || theme.docsearch.enable)
#search-button
a.site-page.social-icon.search(href="javascript:void(0);")
i.fas.fa-search.fa-fw

#toggle-menu
a.site-page
i.fas.fa-bars.fa-fw

居中

使用自定义[blogRoot]/self/css/meihua.css,添加下面的代码

1
2
3
4
5
6
7
#nav-right{
flex:1 1 auto;
justify-content: flex-end;
margin-left: auto;
display: flex;
flex-wrap:nowrap;
}

去掉导航栏下的蓝色长条

在自定义[blogRoot]/self/css/meihua.css里面添加

1
2
3
#nav *::after{
background-color: transparent!important;
}

子菜单横向布局

在自定义[blogRoot]/self/css/meihua.css里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* ----------导航栏横向下拉框---------- */

.menus_item_child li:not(#sidebar-menus li){
float: left;
border-radius: 6px!important;
-webkit-border-radius: 6px!important;
-moz-border-radius: 6px!important;
-ms-border-radius: 6px!important;
-o-border-radius: 6px!important;
}
.menus_item_child:not(#sidebar-menus ul){
/*left:calc(-150%)!important;*//*这是估算值,为了保持元素居中的,如果不合适可以自己调*/
left:50%;
translate:-50%;
}

显示标题

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug

1
2
3
4
5
6
7
8
9
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
!=partial('includes/header/menu_item', {}, {cache: true})
+ center(id="name-container")
+ a(id="page-name" href="javascript:scrollToTop()") PAGE_NAME
...

[blogRoot]/self/js/创建jquery.js文件,添加以下代码

1
2
/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});

然后添加nav.js,并且按照注释修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//js有一个小问题:就是只要鼠标滚动不论哪里都会响应,即便你滚动的是子元素

//2022.9.11 已修复,需要jq,请自行引入
document.getElementById("name-container").setAttribute("style", "display:none");

var position = $(window).scrollTop();

$(window).scroll(function () {

var scroll = $(window).scrollTop();

if (scroll > position) {


document.getElementById("name-container").setAttribute("style", "");
document.getElementsByClassName("menus_items")[1].setAttribute("style", "display:none!important");

} else {


document.getElementsByClassName("menus_items")[1].setAttribute("style", "");
document.getElementById("name-container").setAttribute("style", "display:none");

}

position = scroll;

});
function scrollToTop(){
document.getElementsByClassName("menus_items")[1].setAttribute("style","");
document.getElementById("name-container").setAttribute("style","display:none");
btf.scrollToDest(0, 500);
}
//修复没有弄右键菜单的童鞋无法回顶部的问题
document.getElementById("page-name").innerText = document.title.split(" | Ariasakaの小窝")[0];
/*这里是去掉你的网站全局名称的设置,如果你不需要去掉,你可以写成:
document.getElementById("page-name").innerText=document.title

或者把你的网站的分隔符和全局网站名称加上去*/

最后添加如下css,按照注释修改参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/*
2022.10.4更新:
根据我发现的没有自适应,间距不合理问题进行调整,如果用了这个的朋友们建议改一改
*/
#page-name::before{
font-size:18px;
position: absolute;
width:100%;
height:100%;
border-radius: 8px;
color:white!important;
top:0;
left:0;
content:'回到顶部';
background-color: var(--lyx-theme);
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
opacity: 0;
box-shadow: 0 0 3px var(--lyx-theme);
line-height: 45px; /*如果垂直位置不居中可以微调此值,也可以删了*/
}
#page-name:hover:before{
opacity: 1;
}
@media screen and (max-width:900px){
#page-name,#menus{
display:none!important;
}
}

#name-container{
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
}
#name-container:hover{
scale:1.03
}
#page-name{
position: relative;
padding:10px 30px/*如果文字间隔不合理可以微调修改,第二个是水平方向的padding,第一个是垂直的*/
}
#nav{
padding: 0 20px;
}

导航栏显示haver颜色

在自定义[blogRoot]/self/css/meihua.css里面添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* ----------修改导航栏的haver---------- */

.site-page {
padding: 5px;
margin: 3px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
.site-page:hover {
background-color: var(--gglss-theme);
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 5px;
}
.site-page.child:hover {
background-color: var(--gglss-theme)!important;
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 4px;
}

/* ----------网站标题部分的增强版---------- */
#site-name::before{
opacity: 0;
background-color: var(--gglss-theme)!important;
border-radius: 8px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
-ms-border-radius: 8px;
-o-border-radius: 8px;
transition: .3s;
-webkit-transition: .3s;
-moz-transition: .3s;
-ms-transition: .3s;
-o-transition: .3s;
position:absolute;
top:0!important;
right:0!important;
width:100%;
height:100%;
content: "\f015";
box-shadow: 0 0 5px var(--gglss-theme);
font-family: "Font Awesome 6 Free";
text-align: center;
color:white;
line-height:34px;/*如果有溢出或者垂直不居中的现象微调一下这个参数*/
font-size: 18px;/*根据个人喜好*/
}
#site-name:hover::before{
opacity: 1;
scale:1.03;
}
#site-name{
position: relative;
font-size: 24px; /*一定要把字体调大点,否则效果惨不忍睹!*/
}
:root{
--gglss-theme:#49B1F5 /*我的主题色*/
}

文章作者: gglss
文章链接: http://example.com/posts/54899.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/55045.html b/posts/55045.html index dca4f2b4e..c14d56afc 100644 --- a/posts/55045.html +++ b/posts/55045.html @@ -1 +1 @@ -镜像 | GGLSS

镜像

镜像

背景

docker镜像是最小的,被精简过的Linux系统,是不带vim命令的

使用命令 ‘vim a.txt’ 进行新建编辑a.txt文件,就会提示找不到命令

给镜像容器新增vim命令

  1. 更新镜像

    apt-get update

  2. 下载vim功能

    apt-get -y install vim

  3. 提交副本使成为一个新镜像

    docker commit -m=”提交的描述信息” -a=”作者” 容器id 要创建的目标镜像名:[标签名]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
356e32244966 mytest/ubuntu:3.5 "bash" 2 hours ago Up 2 hours elated_aryabhata
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5
sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ggls/ubuntu 1.5 87e99e19eeef 7 seconds ago 176MB
mytest/ubuntu 3.5 a92a27affdde 2 hours ago 72.8MB
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
ubuntu latest ba6acccedd29 6 months ago 72.8MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
文章作者: gglss
文章链接: http://example.com/posts/55045.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +镜像 | GGLSS

镜像

镜像

背景

docker镜像是最小的,被精简过的Linux系统,是不带vim命令的

使用命令 ‘vim a.txt’ 进行新建编辑a.txt文件,就会提示找不到命令

给镜像容器新增vim命令

  1. 更新镜像

    apt-get update

  2. 下载vim功能

    apt-get -y install vim

  3. 提交副本使成为一个新镜像

    docker commit -m=”提交的描述信息” -a=”作者” 容器id 要创建的目标镜像名:[标签名]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
356e32244966 mytest/ubuntu:3.5 "bash" 2 hours ago Up 2 hours elated_aryabhata
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5
sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ggls/ubuntu 1.5 87e99e19eeef 7 seconds ago 176MB
mytest/ubuntu 3.5 a92a27affdde 2 hours ago 72.8MB
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
ubuntu latest ba6acccedd29 6 months ago 72.8MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
文章作者: gglss
文章链接: http://example.com/posts/55045.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/55320.html b/posts/55320.html index 4a2b25f93..cd765db44 100644 --- a/posts/55320.html +++ b/posts/55320.html @@ -1 +1 @@ -Jmeter之断言和聚合报告 | GGLSS

Jmeter之断言和聚合报告

怎么对请求进行响应断言

  • 右键 HTTP Request

  • 点击add --> Assertions --> Response Assertion

断言组件就添加成功

配置响应断言

Field to Test 下面就是断言的各种方法

  • Text Response 文本断言

Patterns to Test输入title之间包含的文字,及配置成功

  • Response Code 响应码断言

Patterns to Test输入响应码,比如 200

  • Response Message
  • Request Headers
  • URL Sampled
  • Document(text)
  • Request Data

然后运行但并发压测,验证断言添加是否正确,在View Results Tree 中查看结果

怎么使用聚合报告

  • 右键 Thread Group

  • 点击 Add --> Listener --> Aggregate Report

聚合报告就添加了

性能指标解读

  • Average: 单个请求的平均响应时间
  • Median: 中位数,也就是50%用户的响应时间
  • 90%Line: 90%用户的响应时间
  • 95%Line: 95%用户的响应时间
  • 99%Line: 99%用户的响应时间
  • Min: 最小的请求响应时间
  • Max: 最大的请求响应时间
  • Error%: 错误率
  • Throughput: 吞吐量
  • Received KB/sec: 每秒从服务器接收到的数据量
  • Sent KB/sec: 每秒从客户端发送的请求的数量
文章作者: gglss
文章链接: http://example.com/posts/55320.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Jmeter之断言和聚合报告 | GGLSS

Jmeter之断言和聚合报告

怎么对请求进行响应断言

  • 右键 HTTP Request

  • 点击add --> Assertions --> Response Assertion

断言组件就添加成功

配置响应断言

Field to Test 下面就是断言的各种方法

  • Text Response 文本断言

Patterns to Test输入title之间包含的文字,及配置成功

  • Response Code 响应码断言

Patterns to Test输入响应码,比如 200

  • Response Message
  • Request Headers
  • URL Sampled
  • Document(text)
  • Request Data

然后运行但并发压测,验证断言添加是否正确,在View Results Tree 中查看结果

怎么使用聚合报告

  • 右键 Thread Group

  • 点击 Add --> Listener --> Aggregate Report

聚合报告就添加了

性能指标解读

  • Average: 单个请求的平均响应时间
  • Median: 中位数,也就是50%用户的响应时间
  • 90%Line: 90%用户的响应时间
  • 95%Line: 95%用户的响应时间
  • 99%Line: 99%用户的响应时间
  • Min: 最小的请求响应时间
  • Max: 最大的请求响应时间
  • Error%: 错误率
  • Throughput: 吞吐量
  • Received KB/sec: 每秒从服务器接收到的数据量
  • Sent KB/sec: 每秒从客户端发送的请求的数量
文章作者: gglss
文章链接: http://example.com/posts/55320.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/55332.html b/posts/55332.html index b71eca4e6..b867ab519 100644 --- a/posts/55332.html +++ b/posts/55332.html @@ -1 +1 @@ -继承、重写与重载 | GGLSS

继承、重写与重载

继承

继承是相对于类来说,通过关键字extends来实现

  • 可以获取父类的属性和方法
  • 提高代码的复用性
  • 父类修改了内容,子类也会修改

调用

父类的属性和方法

  • this表示当前对象的引用
  • super表示父类对象的引用
  • 调用构造方法
    • this(参数列表)表示调用当前类中的构造方法
    • super(参数列表)表示调用父类的构造方法,必须放在方法中的第一行
  • 调用属性
    • this.属性表示调用当前对象的属性
    • super.属性表示调用父类的属性,可以拿到被重写之前的数据
  • 调用方法
    • this.方法表示调用当前对象的方法
    • super.方法表示调用父类的方法,可以拿到被重写之前的方法,不用放在代码的第一行

重写

重写是子类可以重写父类的方法,使用override标识

  • 方法名和参数不变,只修改方法体
  • 访问权限不能比父类的范围更小
  • 私有的方法能被子类继承,但不能使用和重写
  • 静态的方法能被子类继承,能使用但不能被重写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class testeass {

    public void aa(String name, int age){
    System.out.println(name + age);
    }
    }

    class testaaa extends testeass{

    @Override
    public void aa(String name, int age) {
    System.out.println("这是重写方法,方法名、参数和返回数据都不变,只能修改方法体");
    System.out.println(name + age);
    }
    }

重载

重载是同一个类下对方法进行重载

  • 方法名相同,参数不相同 (参数个数不同/参数类型不同/参数排列顺序不同)
  • 返回类型不限制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class jichu {

    // 原方法
    public void hello(String name, int aa){
    System.out.println("拼接起来的值是:"+ name + aa );
    }

    // 重载后的方法
    public void hello(int aa, String name){
    System.out.println("aaaaaaa:" + aa);
    }
    }
文章作者: gglss
文章链接: http://example.com/posts/55332.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +继承、重写与重载 | GGLSS

继承、重写与重载

继承

继承是相对于类来说,通过关键字extends来实现

  • 可以获取父类的属性和方法
  • 提高代码的复用性
  • 父类修改了内容,子类也会修改

调用

父类的属性和方法

  • this表示当前对象的引用
  • super表示父类对象的引用
  • 调用构造方法
    • this(参数列表)表示调用当前类中的构造方法
    • super(参数列表)表示调用父类的构造方法,必须放在方法中的第一行
  • 调用属性
    • this.属性表示调用当前对象的属性
    • super.属性表示调用父类的属性,可以拿到被重写之前的数据
  • 调用方法
    • this.方法表示调用当前对象的方法
    • super.方法表示调用父类的方法,可以拿到被重写之前的方法,不用放在代码的第一行

重写

重写是子类可以重写父类的方法,使用override标识

  • 方法名和参数不变,只修改方法体
  • 访问权限不能比父类的范围更小
  • 私有的方法能被子类继承,但不能使用和重写
  • 静态的方法能被子类继承,能使用但不能被重写
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public class testeass {

    public void aa(String name, int age){
    System.out.println(name + age);
    }
    }

    class testaaa extends testeass{

    @Override
    public void aa(String name, int age) {
    System.out.println("这是重写方法,方法名、参数和返回数据都不变,只能修改方法体");
    System.out.println(name + age);
    }
    }

重载

重载是同一个类下对方法进行重载

  • 方法名相同,参数不相同 (参数个数不同/参数类型不同/参数排列顺序不同)
  • 返回类型不限制
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class jichu {

    // 原方法
    public void hello(String name, int aa){
    System.out.println("拼接起来的值是:"+ name + aa );
    }

    // 重载后的方法
    public void hello(int aa, String name){
    System.out.println("aaaaaaa:" + aa);
    }
    }
文章作者: gglss
文章链接: http://example.com/posts/55332.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/55393.html b/posts/55393.html index 62359d008..27ce0b49c 100644 --- a/posts/55393.html +++ b/posts/55393.html @@ -1 +1 @@ -jmeter对数据库进行增删改查 | GGLSS

jmeter对数据库进行增删改查

环境

  • jmeter版本(5.1.1)
  • mysql-connector-java-8.0.15.jar

mysql.jar放在jmeter的lib目录下

配置

连接配置组件

  • 右键Thread Group
  • 点击Add -> Config Element -> JDBC Connection Configuration

参数配置

  • ==Varianle Name for created pool==:db_connnection_pool # 连接池名称
  • ==Validation Query==:select 1
  • ==Database URL==:jdbc:mysql://8.142.144.75:3306/jmeter_class?alloMultiQueries = true&useSSL=false
  • ==JDBC Driver class==:选择com.mysql.jbc.Driver
  • 输入username
  • 输入password

Jmeter数据库JDBC请求

  • 右键Thread Group
  • 点击Add -> Sampler -> JDBC Request
配置介绍

Variable Name Bound to Pool: 配置参数区
SQL Query:sql语句区
其他:变量配置区

举个栗子:通过Insert语句,向数据库添加测试数据
  • JDBC Connection Configuration: db_connnection_pool #输入连接池名称
  • Query Type:选择Prepared Updata Statement
  • Quert:输入sql语句
1
INSERT INTO jmeter_class.user (`username`,`password`) VALUES(?,?)
  • Paeameter values:testuser,aaaaaa
  • Paeameter types:varchar,varchar
  • Query timeout(s):6
  • 添加查看结果树
  • 运行

运行结果ResponseBody:

1
1 updates.

这就配置成功

文章作者: gglss
文章链接: http://example.com/posts/55393.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +jmeter对数据库进行增删改查 | GGLSS

jmeter对数据库进行增删改查

环境

  • jmeter版本(5.1.1)
  • mysql-connector-java-8.0.15.jar

mysql.jar放在jmeter的lib目录下

配置

连接配置组件

  • 右键Thread Group
  • 点击Add -> Config Element -> JDBC Connection Configuration

参数配置

  • ==Varianle Name for created pool==:db_connnection_pool # 连接池名称
  • ==Validation Query==:select 1
  • ==Database URL==:jdbc:mysql://8.142.144.75:3306/jmeter_class?alloMultiQueries = true&useSSL=false
  • ==JDBC Driver class==:选择com.mysql.jbc.Driver
  • 输入username
  • 输入password

Jmeter数据库JDBC请求

  • 右键Thread Group
  • 点击Add -> Sampler -> JDBC Request
配置介绍

Variable Name Bound to Pool: 配置参数区
SQL Query:sql语句区
其他:变量配置区

举个栗子:通过Insert语句,向数据库添加测试数据
  • JDBC Connection Configuration: db_connnection_pool #输入连接池名称
  • Query Type:选择Prepared Updata Statement
  • Quert:输入sql语句
1
INSERT INTO jmeter_class.user (`username`,`password`) VALUES(?,?)
  • Paeameter values:testuser,aaaaaa
  • Paeameter types:varchar,varchar
  • Query timeout(s):6
  • 添加查看结果树
  • 运行

运行结果ResponseBody:

1
1 updates.

这就配置成功

文章作者: gglss
文章链接: http://example.com/posts/55393.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/55605.html b/posts/55605.html index 2e8bb544d..d5b512d72 100644 --- a/posts/55605.html +++ b/posts/55605.html @@ -1 +1 @@ -docker 镜像(一) | GGLSS

docker 镜像(一)

镜像(一)

查询本地主机上的镜像

docker images
OPTIONS说明:

    • a 列出本地所有的镜像(含历史镜像)
    • q 只显示镜像ID

举个栗子

1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
tomcat latest fb5657adc892 4 months ago 680MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
tomcat latest fb5657adc892 4 months ago 680MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -q
b8e65a4d736d
fb5657adc892
feb5d9fea6a5
5d0da3dc9764
9b9cb95443b5
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

查询镜像仓库是否有该镜像

docker search 镜像名称

举个栗子

STARS 点赞数
OFFICIAL 官方认证

1
2
3
4
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker search hello-world
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
hello-world Hello World! (an example of minimal Dockeriz… 1718 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr… 151

显示前n条镜像

docker search –limit n 镜像名称

1
2
3
4
5
6
7
8
9
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker search --limit 5 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 10851 [OK]
bitnami/redis Bitnami Redis Docker Image 214 [OK]
bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 36 [OK]
circleci/redis CircleCI images for Redis 12 [OK]
bitnami/redis-exporter 6
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

下载安装镜像到本地

docker pull 镜像名称:标签版本号

没有tag就是最新版

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
bb79b6b2107f: Pull complete
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
3f806f5245c9: Pull complete
f8a4497572b2: Pull complete
eafe3b6b8d06: Pull complete
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Downloaded newer image for redis:6.0.8
docker.io/library/redis:6.0.8
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

文章作者: gglss
文章链接: http://example.com/posts/55605.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +docker 镜像(一) | GGLSS

docker 镜像(一)

镜像(一)

查询本地主机上的镜像

docker images
OPTIONS说明:

    • a 列出本地所有的镜像(含历史镜像)
    • q 只显示镜像ID

举个栗子

1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
tomcat latest fb5657adc892 4 months ago 680MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
tomcat latest fb5657adc892 4 months ago 680MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
1
2
3
4
5
6
7
8
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -q
b8e65a4d736d
fb5657adc892
feb5d9fea6a5
5d0da3dc9764
9b9cb95443b5
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

查询镜像仓库是否有该镜像

docker search 镜像名称

举个栗子

STARS 点赞数
OFFICIAL 官方认证

1
2
3
4
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker search hello-world
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
hello-world Hello World! (an example of minimal Dockeriz… 1718 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr… 151

显示前n条镜像

docker search –limit n 镜像名称

1
2
3
4
5
6
7
8
9
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker search --limit 5 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 10851 [OK]
bitnami/redis Bitnami Redis Docker Image 214 [OK]
bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 36 [OK]
circleci/redis CircleCI images for Redis 12 [OK]
bitnami/redis-exporter 6
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

下载安装镜像到本地

docker pull 镜像名称:标签版本号

没有tag就是最新版

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
bb79b6b2107f: Pull complete
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
3f806f5245c9: Pull complete
f8a4497572b2: Pull complete
eafe3b6b8d06: Pull complete
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Downloaded newer image for redis:6.0.8
docker.io/library/redis:6.0.8
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

文章作者: gglss
文章链接: http://example.com/posts/55605.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/557.html b/posts/557.html index b08eea1d9..c49aed47f 100644 --- a/posts/557.html +++ b/posts/557.html @@ -1 +1 @@ -接口开发环境部署 | GGLSS

接口开发环境部署

开发环境

  • IDEA
  • Maven
  • Spring Boot
  • JDK_86001

在idea安装SpringBoot插件

在maven下安装插件,需要在pox.xml文件输入下面的数据,然后更新文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<springboot.version>2.5.6</springboot.version>
<swagger.version>2.9.2</swagger.version>
</properties>

<dependencies>
<!-- springboot 2.5.6 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>

上面的${springboot.version}是在上面里面定义的版本信息,如果多个插件的版本一致就可以在属性上进行定义,然后使用变量进行引用

文章作者: gglss
文章链接: http://example.com/posts/557.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +接口开发环境部署 | GGLSS

接口开发环境部署

开发环境

  • IDEA
  • Maven
  • Spring Boot
  • JDK_86001

在idea安装SpringBoot插件

在maven下安装插件,需要在pox.xml文件输入下面的数据,然后更新文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<springboot.version>2.5.6</springboot.version>
<swagger.version>2.9.2</swagger.version>
</properties>

<dependencies>
<!-- springboot 2.5.6 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${springboot.version}</version>
</dependency>
</dependencies>

上面的${springboot.version}是在上面里面定义的版本信息,如果多个插件的版本一致就可以在属性上进行定义,然后使用变量进行引用

文章作者: gglss
文章链接: http://example.com/posts/557.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/55957.html b/posts/55957.html index 05d99f25f..8d7c4bdbd 100644 --- a/posts/55957.html +++ b/posts/55957.html @@ -1 +1 @@ -Shell工具(二) | GGLSS

Shell工具(二)

awk工具

强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] ‘pattern1{action1}’ filename

  • pattern:表示awk在数据中查找的内容
  • action:找到匹配内容时执行命令
选项参数功能
-F指定输入文件分隔符
-v赋值一个用户定义变量
举个栗子

数据准备的是/etc/passwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@b09ed0cc2c9d opt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

搜素passwd文件以root关键字开头的所有航,并输出该行的第7列

1
2
3
[root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $7}' passwd
/bin/bash
[root@b09ed0cc2c9d opt]#

搜素passwd文件以root关键字开头的所有航,并输出该行的第1列和第7列,输出时以逗号分隔

1
2
[root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $1","$7}' passwd
root,/bin/bash

只显示/etc/passwd的第一列和第7列,以逗号分隔,且在所有航前面添加列名 user,shell在最后一行添加 ddd, /bin/zuishuai

1
[root@b09ed0cc2c9d opt]# awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "ddd,bin/zuishuai"}' passwd

注意:BEGIN 在所有数据读取行之前执行; END 在所有数据执行之后执行

将passwd 文件中的用户id增加数值1并输出

1
[root@b09ed0cc2c9d opt]# awk -F : -v i=1 '{print $3+i}' passwd
内置变量
变量说明
filename文件名
nr已读的记录数
nf浏览记录的域的个数
举个栗子

数据准备

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# cat sed.txt
dong shen
guan zhen
wo wo
lai lai

le le

统计passwd文件名,每行的行号,每列的列数

1
[root@b09ed0cc2c9d opt]# awk -F : '{print FILENAME "," NR "," NF}' passwd

打印空行所在的行号

1
awk '/^$/ {print NR}' sed.txt
sort工具

文件排序

sort(选项)(参数)

选项说明
-n按照数值大小排序
-r以相反的顺序排序
-t设置排序使用的分隔字符
-k指定需要排序的列

参数是指定待排序文件列表

文章作者: gglss
文章链接: http://example.com/posts/55957.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell工具(二) | GGLSS

Shell工具(二)

awk工具

强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] ‘pattern1{action1}’ filename

  • pattern:表示awk在数据中查找的内容
  • action:找到匹配内容时执行命令
选项参数功能
-F指定输入文件分隔符
-v赋值一个用户定义变量
举个栗子

数据准备的是/etc/passwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@b09ed0cc2c9d opt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin

搜素passwd文件以root关键字开头的所有航,并输出该行的第7列

1
2
3
[root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $7}' passwd
/bin/bash
[root@b09ed0cc2c9d opt]#

搜素passwd文件以root关键字开头的所有航,并输出该行的第1列和第7列,输出时以逗号分隔

1
2
[root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $1","$7}' passwd
root,/bin/bash

只显示/etc/passwd的第一列和第7列,以逗号分隔,且在所有航前面添加列名 user,shell在最后一行添加 ddd, /bin/zuishuai

1
[root@b09ed0cc2c9d opt]# awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "ddd,bin/zuishuai"}' passwd

注意:BEGIN 在所有数据读取行之前执行; END 在所有数据执行之后执行

将passwd 文件中的用户id增加数值1并输出

1
[root@b09ed0cc2c9d opt]# awk -F : -v i=1 '{print $3+i}' passwd
内置变量
变量说明
filename文件名
nr已读的记录数
nf浏览记录的域的个数
举个栗子

数据准备

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# cat sed.txt
dong shen
guan zhen
wo wo
lai lai

le le

统计passwd文件名,每行的行号,每列的列数

1
[root@b09ed0cc2c9d opt]# awk -F : '{print FILENAME "," NR "," NF}' passwd

打印空行所在的行号

1
awk '/^$/ {print NR}' sed.txt
sort工具

文件排序

sort(选项)(参数)

选项说明
-n按照数值大小排序
-r以相反的顺序排序
-t设置排序使用的分隔字符
-k指定需要排序的列

参数是指定待排序文件列表

文章作者: gglss
文章链接: http://example.com/posts/55957.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/56062.html b/posts/56062.html index e3815d0e7..69ff89c2e 100644 --- a/posts/56062.html +++ b/posts/56062.html @@ -1 +1 @@ -高数一 | GGLSS

高数一

极限的等价无穷小替换

当 x->0 时

  • sinx~x

  • tanx ~ x

  • e^x-1 ~ x

  • ln(1+x) ~ x

  • 1-cosx~1/2 x²

  • a^x -1 ~ xIna

  • arcsinx ~ x

  • arctanx ~ x

  • tanx-sinx ~1/2 x³

  • (1+x)^a-1 ~ ax

导数

文章作者: gglss
文章链接: http://example.com/posts/56062.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +高数一 | GGLSS

高数一

极限的等价无穷小替换

当 x->0 时

  • sinx~x

  • tanx ~ x

  • e^x-1 ~ x

  • ln(1+x) ~ x

  • 1-cosx~1/2 x²

  • a^x -1 ~ xIna

  • arcsinx ~ x

  • arctanx ~ x

  • tanx-sinx ~1/2 x³

  • (1+x)^a-1 ~ ax

导数

文章作者: gglss
文章链接: http://example.com/posts/56062.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/56883.html b/posts/56883.html index e2f50789d..6f1b6bf2c 100644 --- a/posts/56883.html +++ b/posts/56883.html @@ -1 +1 @@ -Regular Expression Extractor正则表达式处理器 | GGLSS

Regular Expression Extractor正则表达式处理器

正则表达式规则

  • ():括起来的部分是要提取的
  • .:匹配任何字符串
  • +:一次或多次
  • ?:在找到第一个匹配项后停止

模板

用$$引用起来,如果正则表达式中有多个正则表达式,可以是$3$$2$等,表示解析到的第几个值给title,$1$表示第一个

匹配数字

0代表随机,1代表全部取值,通常使用0

缺省值

若参数没有取到值,那默认给一个值让他取

文章作者: gglss
文章链接: http://example.com/posts/56883.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Regular Expression Extractor正则表达式处理器 | GGLSS

Regular Expression Extractor正则表达式处理器

正则表达式规则

  • ():括起来的部分是要提取的
  • .:匹配任何字符串
  • +:一次或多次
  • ?:在找到第一个匹配项后停止

模板

用$$引用起来,如果正则表达式中有多个正则表达式,可以是$3$$2$等,表示解析到的第几个值给title,$1$表示第一个

匹配数字

0代表随机,1代表全部取值,通常使用0

缺省值

若参数没有取到值,那默认给一个值让他取

文章作者: gglss
文章链接: http://example.com/posts/56883.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/57578.html b/posts/57578.html index 72a1a2151..6396d217a 100644 --- a/posts/57578.html +++ b/posts/57578.html @@ -1 +1 @@ -使用moko编写重定向测试接口(四) | GGLSS

使用moko编写重定向测试接口(四)

上一节已经写了规则,这次直接来编写Get和Post请求

重定向的测试接口

  • 使用了redirectTo:目标地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[
{
"description": "重定向到百度",
"request": {
"uri": "/redirect"
},
"redirectTo": "http://www.baidu.com"
},
{
"description": "重定向到自己的网页上",
"request": {
"uri": "/redirect/topath"
},
"redirectTo": "/redirect/new"
},
{
"description": "这是被重定到的请求",
"request": {
"uri": "/redirect/new"
},
"response": {
"text": "重定向成功了"
}
}
]
文章作者: gglss
文章链接: http://example.com/posts/57578.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用moko编写重定向测试接口(四) | GGLSS

使用moko编写重定向测试接口(四)

上一节已经写了规则,这次直接来编写Get和Post请求

重定向的测试接口

  • 使用了redirectTo:目标地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[
{
"description": "重定向到百度",
"request": {
"uri": "/redirect"
},
"redirectTo": "http://www.baidu.com"
},
{
"description": "重定向到自己的网页上",
"request": {
"uri": "/redirect/topath"
},
"redirectTo": "/redirect/new"
},
{
"description": "这是被重定到的请求",
"request": {
"uri": "/redirect/new"
},
"response": {
"text": "重定向成功了"
}
}
]
文章作者: gglss
文章链接: http://example.com/posts/57578.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/58312.html b/posts/58312.html index 355266b11..ef97c8254 100644 --- a/posts/58312.html +++ b/posts/58312.html @@ -1 +1 @@ -使用docker安装常用软件:mysql | GGLSS

使用docker安装常用软件:mysql

使用docker安装常用软件:mysql

以mysql 5.7为例

使用docker pull mysql:5.7拉取mysql 5.7镜像

使用镜像创建容器

简单版

使用docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7运行镜像创建容器

因为linux系统自己装了mysql,避免端口冲突,先运行ps -ef|grep mysql查询

使用docker ps查询容器编号

使用docker exec -it 容器编号 bash进入mysql容器

使用mysql -uroot -p,输入密码,登录mysql

验证

show databases

1
2
3
4
5
6
7
8
9
10
mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
中文乱码问题
1
2
3
4
5
INSERT INTo t1 VALUES(3, "张三");
---
INSERT INTo t1 VALUES(3, "张三")
> 1366 - Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1
> 时间: 0.038s

因为docker默认编码字符集隐患

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>

解决中文乱码问题

在宿主机的/ggls/mysql/conf目录下vim my.cnf文件,通过容器卷同步给容器实例

1
2
3
4
5
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

改完后重启mysql实例

服务器输入SHOW VARIABLES LIKE 'character%';验证

docker安装好并run出容器后,先修改字符集编码在创建mysql库

删库备份问题

只要本机上面的容器卷存在,容器卷位置没有改变的情况下,就算容器被删除,重新打开后,创建的数据库,表都还存在

工作使用版启动容器方法

1
2
3
4
5
6
7
docker run -d -p 3306:3306 --privileged=true
-v /ggls/mysql/log:/var/log/mysql
-v /ggls/mysql/data:/var/lib/mysql
-v /ggls/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql
mysql:5.7
文章作者: gglss
文章链接: http://example.com/posts/58312.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用docker安装常用软件:mysql | GGLSS

使用docker安装常用软件:mysql

使用docker安装常用软件:mysql

以mysql 5.7为例

使用docker pull mysql:5.7拉取mysql 5.7镜像

使用镜像创建容器

简单版

使用docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7运行镜像创建容器

因为linux系统自己装了mysql,避免端口冲突,先运行ps -ef|grep mysql查询

使用docker ps查询容器编号

使用docker exec -it 容器编号 bash进入mysql容器

使用mysql -uroot -p,输入密码,登录mysql

验证

show databases

1
2
3
4
5
6
7
8
9
10
mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
中文乱码问题
1
2
3
4
5
INSERT INTo t1 VALUES(3, "张三");
---
INSERT INTo t1 VALUES(3, "张三")
> 1366 - Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1
> 时间: 0.038s

因为docker默认编码字符集隐患

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>

解决中文乱码问题

在宿主机的/ggls/mysql/conf目录下vim my.cnf文件,通过容器卷同步给容器实例

1
2
3
4
5
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8

改完后重启mysql实例

服务器输入SHOW VARIABLES LIKE 'character%';验证

docker安装好并run出容器后,先修改字符集编码在创建mysql库

删库备份问题

只要本机上面的容器卷存在,容器卷位置没有改变的情况下,就算容器被删除,重新打开后,创建的数据库,表都还存在

工作使用版启动容器方法

1
2
3
4
5
6
7
docker run -d -p 3306:3306 --privileged=true
-v /ggls/mysql/log:/var/log/mysql
-v /ggls/mysql/data:/var/lib/mysql
-v /ggls/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql
mysql:5.7
文章作者: gglss
文章链接: http://example.com/posts/58312.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/58345.html b/posts/58345.html index dccc36b2b..9351898f6 100644 --- a/posts/58345.html +++ b/posts/58345.html @@ -1 +1 @@ -开发时遇到端口冲突解决办法 | GGLSS

开发时遇到端口冲突解决办法

解决办法

resources下面新建文件application.properties,名称不能变,只能是这个,运行时系统会自动获取这个端口数据

在里面输入代码数据

1
server.port=${port:8888}
文章作者: gglss
文章链接: http://example.com/posts/58345.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +开发时遇到端口冲突解决办法 | GGLSS

开发时遇到端口冲突解决办法

解决办法

resources下面新建文件application.properties,名称不能变,只能是这个,运行时系统会自动获取这个端口数据

在里面输入代码数据

1
server.port=${port:8888}
文章作者: gglss
文章链接: http://example.com/posts/58345.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/58353.html b/posts/58353.html index 92af73cd1..d18989ebc 100644 --- a/posts/58353.html +++ b/posts/58353.html @@ -1 +1 @@ -_主从容错切换迁移 | GGLSS

_主从容错切换迁移

_主从容错切换迁移

进入redis集群

注意:进入集群环境后,不能使用单机版的redis-cli -p 6381

因为这样会在增加数据时有error报错出现

使用set k1 v1错误是因为1号主机里面的编号是0到5460,超过了这个范围就会报错

正确进入的方法redis-cli -p 6381 -c

-c 的作用是优化路由

注:FLUSHALL:作用是清除之前添加的记录

集群检查

redis-cli –cluster check 8.142.144.75:6381

注:可以进入任意一台主机

主从容错切换迁移

主机宕机,从机自动切换成主机

文章作者: gglss
文章链接: http://example.com/posts/58353.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +_主从容错切换迁移 | GGLSS

_主从容错切换迁移

_主从容错切换迁移

进入redis集群

注意:进入集群环境后,不能使用单机版的redis-cli -p 6381

因为这样会在增加数据时有error报错出现

使用set k1 v1错误是因为1号主机里面的编号是0到5460,超过了这个范围就会报错

正确进入的方法redis-cli -p 6381 -c

-c 的作用是优化路由

注:FLUSHALL:作用是清除之前添加的记录

集群检查

redis-cli –cluster check 8.142.144.75:6381

注:可以进入任意一台主机

主从容错切换迁移

主机宕机,从机自动切换成主机

文章作者: gglss
文章链接: http://example.com/posts/58353.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/59561.html b/posts/59561.html index 29225ef67..16d7b4a54 100644 --- a/posts/59561.html +++ b/posts/59561.html @@ -1 +1 @@ -Shell运算符 | GGLSS

Shell运算符

基本语法
  1. $((运算式)) 或 $[运算式]
  2. expr + - * /

注意,运算符号间要有空格

举个加法栗子
1
2
expr 3 + 2
5
举栗子[(2+3)*4]

需要使用键盘左上角的`,把需要提前运算的包起来

1
expr `expr 2 + 3` \* 4

或者

1
2
s=$[(2+3)*4]
echo $s
文章作者: gglss
文章链接: http://example.com/posts/59561.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell运算符 | GGLSS

Shell运算符

基本语法
  1. $((运算式)) 或 $[运算式]
  2. expr + - * /

注意,运算符号间要有空格

举个加法栗子
1
2
expr 3 + 2
5
举栗子[(2+3)*4]

需要使用键盘左上角的`,把需要提前运算的包起来

1
expr `expr 2 + 3` \* 4

或者

1
2
s=$[(2+3)*4]
echo $s
文章作者: gglss
文章链接: http://example.com/posts/59561.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/6166.html b/posts/6166.html index d970d4e9d..37130f6c0 100644 --- a/posts/6166.html +++ b/posts/6166.html @@ -1 +1 @@ -Ultimate Thread Group的使用 | GGLSS

Ultimate Thread Group的使用

前提

  • 安装插件,下载Custom Thread Groupsan插件

  • 添加Ultimate Thread Group

配置

  • Start Threads Count : 线程数
  • Initial Delay,sec : 线程延迟启动,0指的是立即启动;5代表五秒后启动
  • Startup Time,sec : 线程及时启动,0代表立即启动,5代表五秒之内启动完成
  • Hold Load For,sec : 启动后运行的时间,120代表运行120秒
  • Shutdown Time : 代表运行结束后停止的时间,0代表运行结束后立即停止,5代表运行结束后五秒内停止
文章作者: gglss
文章链接: http://example.com/posts/6166.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Ultimate Thread Group的使用 | GGLSS

Ultimate Thread Group的使用

前提

  • 安装插件,下载Custom Thread Groupsan插件

  • 添加Ultimate Thread Group

配置

  • Start Threads Count : 线程数
  • Initial Delay,sec : 线程延迟启动,0指的是立即启动;5代表五秒后启动
  • Startup Time,sec : 线程及时启动,0代表立即启动,5代表五秒之内启动完成
  • Hold Load For,sec : 启动后运行的时间,120代表运行120秒
  • Shutdown Time : 代表运行结束后停止的时间,0代表运行结束后立即停止,5代表运行结束后五秒内停止
文章作者: gglss
文章链接: http://example.com/posts/6166.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/622.html b/posts/622.html index e385fdef9..11dba7b6b 100644 --- a/posts/622.html +++ b/posts/622.html @@ -1 +1 @@ -redis的4主4从缩容 | GGLSS

redis的4主4从缩容

redis的4主4从缩容

目的:6387和6388下线
检查集群情况获得6388的节点ID

redis-cli –cluster check 8.142.144.75:6382

从集群中将4号从节点6388删除

redis-cli –cluster del-node ip:从机端口 从机6388节点ID

使用redis-cli --cluster check 8.142.144.75:6382进行集群检查

6388删除成功

将6387的槽号清空,重新分配

本例将清出来的槽号都给6381

使用redis-cli --cluster reshard ip:6381进行节点的重组

注:

上图中1输入的4096是6387主机所拥有的槽点数量,把他们全部拿出来分掉

上图的2输入的ID是接收6387主机所放出的槽点数的主机id

上图中3输入的ID是放出槽点数的6387主机的id

上图中4输入的done指的是已经输入完所有的节点

使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
删除6387节点的主机

redis-cli –cluster del-node ip:端口 6387节点ID

使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
文章作者: gglss
文章链接: http://example.com/posts/622.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +redis的4主4从缩容 | GGLSS

redis的4主4从缩容

redis的4主4从缩容

目的:6387和6388下线
检查集群情况获得6388的节点ID

redis-cli –cluster check 8.142.144.75:6382

从集群中将4号从节点6388删除

redis-cli –cluster del-node ip:从机端口 从机6388节点ID

使用redis-cli --cluster check 8.142.144.75:6382进行集群检查

6388删除成功

将6387的槽号清空,重新分配

本例将清出来的槽号都给6381

使用redis-cli --cluster reshard ip:6381进行节点的重组

注:

上图中1输入的4096是6387主机所拥有的槽点数量,把他们全部拿出来分掉

上图的2输入的ID是接收6387主机所放出的槽点数的主机id

上图中3输入的ID是放出槽点数的6387主机的id

上图中4输入的done指的是已经输入完所有的节点

使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
删除6387节点的主机

redis-cli –cluster del-node ip:端口 6387节点ID

使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
文章作者: gglss
文章链接: http://example.com/posts/622.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/62565.html b/posts/62565.html index ffd19c3a8..bb09aee9f 100644 --- a/posts/62565.html +++ b/posts/62565.html @@ -1 +1 @@ -容器(三) | GGLSS

容器(三)

容器(三)

创建后台守护式容器

(问题):使用docker run -d ubuntu命令启动后台模式的容器ubuntu,然后用docker ps 查询提示没有找到运行的容器

Docker容器后台运行就必须有一个前台进程,不然容器没事做,会自杀

解决方法:将运行的程序以前台进程的方式运行
常见方式:命令行模式

查看容器日志

docker logs 容器id

查看容器的进程

docker top 容器id

查看容器内部细节

docker inspect 容器id

重新进入

  • 进入正在运行的容器并以命令行交互

    docker exec -it 容器id bashShell

  • 重新进入

    docker attach 容器id

(区别)
attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

1
2
3
4
5
6
7
8
9
10
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAME
S562278524cda   ubuntu    "bash"    20 minutes ago   Up 20 minutes             loving_dewdn
eycdee90a8c77d   ubuntu    "bash"    45 minutes ago   Up 15 minutes             ubuntu

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#​shell

从容器内拷贝文件到主机

docker cp 容器id:容器地址 主机地址

1
2
3
4
5
6
7
8
9
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker cp 26191ecfb227:/tmp/a.txt /opt/ab.txt
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /opt/
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
total 8
-rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

导入和导出容器

  • export 导出容器的内容留作为一个tar归档文件[对应import命令]

    docker export 容器id > 自定义文件名.tar

  • import从tar包中的内容创建一个新的文件系统再导入为镜像[export]

    cat 文件名.tar | docker import - 自定义/镜像名:3.5(3.5是自定义)

1
2
3
4
5
6
7
8
9
10
11
12
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26191ecfb227 ubuntu "bash" 7 minutes ago Up 7 minutes quirky_jemison
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker export 26191ecfb227 > abcd.tar
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
total 73408
-rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
-rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
total 73408
-rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
-rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# cat abcd.tar | docker import - mytest/ubuntu:3.5
sha256:a92a27affdde8ad7f07bef2fdc0f04b8e3aeacb9d6919a77da2921d552ab940b
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest/ubuntu 3.5 a92a27affdde 11 seconds ago 72.8MB
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
ubuntu latest ba6acccedd29 6 months ago 72.8MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker run -it mytest/ubuntu:3.5 bash
root@356e32244966:/#
root@356e32244966:/# cd /tmp/
root@356e32244966:/tmp# ll
total 8
drwxrwxrwt 2 root root 4096 Apr 27 07:13 ./
drwxr-xr-x 1 root root 4096 Apr 27 07:32 ../
-rw-r--r-- 1 root root 0 Apr 27 07:13 a.txt
root@356e32244966:/tmp#

文章作者: gglss
文章链接: http://example.com/posts/62565.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +容器(三) | GGLSS

容器(三)

容器(三)

创建后台守护式容器

(问题):使用docker run -d ubuntu命令启动后台模式的容器ubuntu,然后用docker ps 查询提示没有找到运行的容器

Docker容器后台运行就必须有一个前台进程,不然容器没事做,会自杀

解决方法:将运行的程序以前台进程的方式运行
常见方式:命令行模式

查看容器日志

docker logs 容器id

查看容器的进程

docker top 容器id

查看容器内部细节

docker inspect 容器id

重新进入

  • 进入正在运行的容器并以命令行交互

    docker exec -it 容器id bashShell

  • 重新进入

    docker attach 容器id

(区别)
attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

1
2
3
4
5
6
7
8
9
10
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAME
S562278524cda   ubuntu    "bash"    20 minutes ago   Up 20 minutes             loving_dewdn
eycdee90a8c77d   ubuntu    "bash"    45 minutes ago   Up 15 minutes             ubuntu

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#​shell

从容器内拷贝文件到主机

docker cp 容器id:容器地址 主机地址

1
2
3
4
5
6
7
8
9
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker cp 26191ecfb227:/tmp/a.txt /opt/ab.txt
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /opt/
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
total 8
-rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

导入和导出容器

  • export 导出容器的内容留作为一个tar归档文件[对应import命令]

    docker export 容器id > 自定义文件名.tar

  • import从tar包中的内容创建一个新的文件系统再导入为镜像[export]

    cat 文件名.tar | docker import - 自定义/镜像名:3.5(3.5是自定义)

1
2
3
4
5
6
7
8
9
10
11
12
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
26191ecfb227 ubuntu "bash" 7 minutes ago Up 7 minutes quirky_jemison
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker export 26191ecfb227 > abcd.tar
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
total 73408
-rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
-rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
total 73408
-rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
-rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# cat abcd.tar | docker import - mytest/ubuntu:3.5
sha256:a92a27affdde8ad7f07bef2fdc0f04b8e3aeacb9d6919a77da2921d552ab940b
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest/ubuntu 3.5 a92a27affdde 11 seconds ago 72.8MB
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
ubuntu latest ba6acccedd29 6 months ago 72.8MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker run -it mytest/ubuntu:3.5 bash
root@356e32244966:/#
root@356e32244966:/# cd /tmp/
root@356e32244966:/tmp# ll
total 8
drwxrwxrwt 2 root root 4096 Apr 27 07:13 ./
drwxr-xr-x 1 root root 4096 Apr 27 07:32 ../
-rw-r--r-- 1 root root 0 Apr 27 07:13 a.txt
root@356e32244966:/tmp#

文章作者: gglss
文章链接: http://example.com/posts/62565.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/63387.html b/posts/63387.html index c2f1cbdd6..99e436e8b 100644 --- a/posts/63387.html +++ b/posts/63387.html @@ -1 +1 @@ -Arrivals Thread Group的使用 | GGLSS

Arrivals Thread Group的使用

前提

  • 安装插件,下载Custom Thread Groupsan插件

  • 添加Arrivals Thread Group

配置

  • Target Rate (arrivals/sec) : 相当于QPS, 输入10就是10QPS
  • Ramp Up Time (sec) : 在多少秒内达到最大的QPS,4代表在4秒内获得最大的QPS
  • Ramp-Up Steps Count : 代表并发数,4代表实现4次的并发
  • Hold Target Rate Time (sec) : 对系统压多长时间就输入多长时间 ,10代表压上10s
  • Concurrency Limit : 最大启动多少线程,100代表最多启动100线程
文章作者: gglss
文章链接: http://example.com/posts/63387.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Arrivals Thread Group的使用 | GGLSS

Arrivals Thread Group的使用

前提

  • 安装插件,下载Custom Thread Groupsan插件

  • 添加Arrivals Thread Group

配置

  • Target Rate (arrivals/sec) : 相当于QPS, 输入10就是10QPS
  • Ramp Up Time (sec) : 在多少秒内达到最大的QPS,4代表在4秒内获得最大的QPS
  • Ramp-Up Steps Count : 代表并发数,4代表实现4次的并发
  • Hold Target Rate Time (sec) : 对系统压多长时间就输入多长时间 ,10代表压上10s
  • Concurrency Limit : 最大启动多少线程,100代表最多启动100线程
文章作者: gglss
文章链接: http://example.com/posts/63387.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/63516.html b/posts/63516.html index 950949298..3ae39862f 100644 --- a/posts/63516.html +++ b/posts/63516.html @@ -1 +1 @@ -容器(二) | GGLSS

容器(二)

容器(二)

启动已经停止运行的容器

docker start 容器id/容器名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
9a1a43aee837 ubuntu "bush" 4 minutes ago Created admiring_wiles
cdee90a8c77d ubuntu "bash" 29 minutes ago Exited (0) 29 minutes ago ubuntu
0dcaa91afc0e ubuntu "/bin/bush" 31 minutes ago Created myubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker start cdee90a8c77d
cdee90a8c77d
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 5 minutes ago Up 5 minutes loving_dewdney
cdee90a8c77d ubuntu "bash" 30 minutes ago Up 3 seconds ubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

重启容器

docker restart 容器id/容器名

停止容器

docker stop 容器id/容器名

强制停止容器

docker kill 容器id/容器名

删除已经停止的容器

docker rm 容器id

一次性删除多个容器

  • docker rm -f $(docker ps -a -q)
  • docker ps -a -q | xargs docker rm

注:xargs是linux系统的可变参数,把分隔符前面的结果传给xargs里面,然后执行分隔符后面的命令

1
2
3
4
5
6
7
8
9
10
11
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 20 minutes ago Up 20 minutes loving_dewdney
cdee90a8c77d ubuntu "bash" 45 minutes ago Up 15 minutes ubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f
562278524cda
cdee90a8c77d
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

文章作者: gglss
文章链接: http://example.com/posts/63516.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +容器(二) | GGLSS

容器(二)

容器(二)

启动已经停止运行的容器

docker start 容器id/容器名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
9a1a43aee837 ubuntu "bush" 4 minutes ago Created admiring_wiles
cdee90a8c77d ubuntu "bash" 29 minutes ago Exited (0) 29 minutes ago ubuntu
0dcaa91afc0e ubuntu "/bin/bush" 31 minutes ago Created myubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker start cdee90a8c77d
cdee90a8c77d
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 5 minutes ago Up 5 minutes loving_dewdney
cdee90a8c77d ubuntu "bash" 30 minutes ago Up 3 seconds ubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

重启容器

docker restart 容器id/容器名

停止容器

docker stop 容器id/容器名

强制停止容器

docker kill 容器id/容器名

删除已经停止的容器

docker rm 容器id

一次性删除多个容器

  • docker rm -f $(docker ps -a -q)
  • docker ps -a -q | xargs docker rm

注:xargs是linux系统的可变参数,把分隔符前面的结果传给xargs里面,然后执行分隔符后面的命令

1
2
3
4
5
6
7
8
9
10
11
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 20 minutes ago Up 20 minutes loving_dewdney
cdee90a8c77d ubuntu "bash" 45 minutes ago Up 15 minutes ubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f
562278524cda
cdee90a8c77d
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

文章作者: gglss
文章链接: http://example.com/posts/63516.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/63722.html b/posts/63722.html index 58ad39cb9..a17e50643 100644 --- a/posts/63722.html +++ b/posts/63722.html @@ -1 +1 @@ -jmeter自动化压力测试 | GGLSS

jmeter自动化压力测试

思路

  • jmeter脚本实现压测逻辑
  • Shell控制逻辑
  • 使用jmeter进行静默压测
文章作者: gglss
文章链接: http://example.com/posts/63722.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
目录
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +jmeter自动化压力测试 | GGLSS

jmeter自动化压力测试

思路

  • jmeter脚本实现压测逻辑
  • Shell控制逻辑
  • 使用jmeter进行静默压测
文章作者: gglss
文章链接: http://example.com/posts/63722.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
公告
好好学习,天天向上
目录
最新文章
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/65365.html b/posts/65365.html index d3f439987..5ed701c49 100644 --- a/posts/65365.html +++ b/posts/65365.html @@ -1 +1 @@ -Shell流程控制 | GGLSS

Shell流程控制

if判断
基本语法
  • [ 条件判断式 ],中括号和条件判断式之间必须有空格

  • if后要有空格

1
2
3
4
5
6
7
8
if [ 条件判断式 ]:then
程序
fi
#或者
if[ 条件判断式 ]
then
程序
fi
举个栗子

输入一个数字,如果是1,则输出 banzhang zhen shuai,如果是2,则输出 cls zhen mei ,如果是其他,则什么都不输出

1
2
3
4
5
6
7
8
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "banzhang zhen shuai"
elif [ $1 -eq 2 ]
then
echo "cls zhen mei"
fi
case 语句
基本语法
  • case行尾必须是单词 “in”,每一个模式匹配必须以右括号 “)” 结束
  • 双分号 “;;” 表示命令序列结束,相当于java的break
  • 最后的 “*)” 表示默认模式,相当于java的default
1
2
3
4
5
6
7
8
9
10
case $变量名 in  
"值 1")
如果变量的值等于1,执行程序1
;;
"值 2")
如果变量的值等于2,执行程序2
;;
*)
如果变量的值不是以上的值,则执行此程序
esac
举个栗子

输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其他,输出 renyao

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
case $1 in
"1")
echo "banzhang"
;;

"2")
echo "cls"
;;

*)
echo "renyou"
esac
For循环
基本语法1
1
2
3
4
for(( 初始值;循环控制添加;变量变化 ))
do
程序
done
举个栗子1

输出从1加到100的值

1
2
3
4
5
6
7
8
#!/bin/bash

s=0
for ((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo "cong1jiadao100:$s"
基本语法2
1
2
3
4
for 变量 in 值1 值2 值3...
do
程序
done
举个栗子2

打印所有输入参数

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

for i in "$*"
do
echo "banzhang xihuan $i"
done
#-----------------------------------
for j in "$@"
do
echo "banzhang xihuan $j"
done
while 循环
基本语法
1
2
3
4
while[ 条件判断式 ]
do
程序
done
举个栗子

输出从1加到100的值

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

i=1
while [ $i -le 100 ]
do
s=$[$s + $i]
i=$[$i + 1]
done

echo $s
read 读取控制台输入
基本语法
1
2
3
4
5
6
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时的等待的时间(秒)
参数:
变量:指定读取值的变量名
举个栗子

提示7秒内,读取控制台输入的名称

1
2
3
4
5
#!/bin/bash

read -t 7 -p "input your name" NAME

echo $NAME
文章作者: gglss
文章链接: http://example.com/posts/65365.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell流程控制 | GGLSS

Shell流程控制

if判断
基本语法
  • [ 条件判断式 ],中括号和条件判断式之间必须有空格

  • if后要有空格

1
2
3
4
5
6
7
8
if [ 条件判断式 ]:then
程序
fi
#或者
if[ 条件判断式 ]
then
程序
fi
举个栗子

输入一个数字,如果是1,则输出 banzhang zhen shuai,如果是2,则输出 cls zhen mei ,如果是其他,则什么都不输出

1
2
3
4
5
6
7
8
#!/bin/bash
if [ $1 -eq 1 ]
then
echo "banzhang zhen shuai"
elif [ $1 -eq 2 ]
then
echo "cls zhen mei"
fi
case 语句
基本语法
  • case行尾必须是单词 “in”,每一个模式匹配必须以右括号 “)” 结束
  • 双分号 “;;” 表示命令序列结束,相当于java的break
  • 最后的 “*)” 表示默认模式,相当于java的default
1
2
3
4
5
6
7
8
9
10
case $变量名 in  
"值 1")
如果变量的值等于1,执行程序1
;;
"值 2")
如果变量的值等于2,执行程序2
;;
*)
如果变量的值不是以上的值,则执行此程序
esac
举个栗子

输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其他,输出 renyao

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
case $1 in
"1")
echo "banzhang"
;;

"2")
echo "cls"
;;

*)
echo "renyou"
esac
For循环
基本语法1
1
2
3
4
for(( 初始值;循环控制添加;变量变化 ))
do
程序
done
举个栗子1

输出从1加到100的值

1
2
3
4
5
6
7
8
#!/bin/bash

s=0
for ((i=1;i<=100;i++))
do
s=$[$s+$i]
done
echo "cong1jiadao100:$s"
基本语法2
1
2
3
4
for 变量 in 值1 值2 值3...
do
程序
done
举个栗子2

打印所有输入参数

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

for i in "$*"
do
echo "banzhang xihuan $i"
done
#-----------------------------------
for j in "$@"
do
echo "banzhang xihuan $j"
done
while 循环
基本语法
1
2
3
4
while[ 条件判断式 ]
do
程序
done
举个栗子

输出从1加到100的值

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

i=1
while [ $i -le 100 ]
do
s=$[$s + $i]
i=$[$i + 1]
done

echo $s
read 读取控制台输入
基本语法
1
2
3
4
5
6
read(选项)(参数)
选项:
-p:指定读取值时的提示符
-t:指定读取值时的等待的时间(秒)
参数:
变量:指定读取值的变量名
举个栗子

提示7秒内,读取控制台输入的名称

1
2
3
4
5
#!/bin/bash

read -t 7 -p "input your name" NAME

echo $NAME
文章作者: gglss
文章链接: http://example.com/posts/65365.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/6705.html b/posts/6705.html index 060449e94..f7e66ba24 100644 --- a/posts/6705.html +++ b/posts/6705.html @@ -1 +1 @@ -Shell工具(一) | GGLSS

Shell工具(一)

Cut工具

用于剪切数据

基本用法

cut[选项参数] filename

说明:默认分隔符是制表符

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列
举个栗子

准备数据

1
2
3
4
5
6
7
8
[root@b09ed0cc2c9d local]# touch cut.txt
[root@b09ed0cc2c9d local]# vim cut.txt

dong shen
guan zhen
wo wo
lai lai
le le

切割第一列数据

1
2
3
4
5
6
[root@b09ed0cc2c9d local]# cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

切割第二,三列

1
2
3
4
5
6
[root@b09ed0cc2c9d local]# cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
le

在cut.txt文件切割出guan

1
2
3
4
5
6
7
8
9
10
11
12
[root@b09ed0cc2c9d local]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@b09ed0cc2c9d local]#
[root@b09ed0cc2c9d local]# cat cut.txt | grep guan
guan zhen
[root@b09ed0cc2c9d local]# cat cut.txt | grep guan | cut -d " " -f 1
guan
[root@b09ed0cc2c9d local]#

选取系统PATH变量值,第二个“:”之后的所有路径

1
2
3
4
[root@b09ed0cc2c9d local]# echo $PATH
/usr/local/java/jdk1.8.0_181/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@b09ed0cc2c9d local]# echo $PATH | cut -d : -f 3- # 不加-表示第三列,加上-表示第三列之后
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

切割ifconfig后打印的IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@b09ed0cc2c9d local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 656 (656.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@b09ed0cc2c9d local]# ifconfig eth0 | grep "inet " | cut -d "t" -f 2 | cut -d " " -f 2
172.17.0.2
[root@b09ed0cc2c9d local]#
sed工具

一种流编辑器,一次处理一行内容

基本用法

sed [选项参数] command filename

选项参数说明

选项参数功能
-a直接在指定列模式上进行sed的动作编辑

命令功能描述

命令功能描述
a新增,a的后面可以接字串,在下一行出现
d删除
s查找并替换
举个栗子

数据准备

1
2
3
4
5
6
7
8
9
[root@b09ed0cc2c9d opt]# touch sed.txt
[root@b09ed0cc2c9d opt]# vim sed.txt

dong shen
guan zhen
wo wo
lai lai

le le

将mei nv 这个单词插入到 sed.txt 第二行下,打印

1
2
3
4
5
6
7
8
9
[root@b09ed0cc2c9d opt]# sed "2a mei nv" sed.txt
dong shen
guan zhen
mei nv
wo wo
lai lai

le le
[root@b09ed0cc2c9d opt]#

删除sed.txt文件所有包含 wo 的行

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# sed "/wo/d" sed.txt
dong shen
guan zhen
lai lai

le le
[root@b09ed0cc2c9d opt]#

将sed.txt文件中 wo 替换为 ni

1
2
3
4
5
6
7
8
[root@b09ed0cc2c9d opt]# sed "s/wo/ni/g" sed.txt
dong shen
guan zhen
ni ni
lai lai

le le
[root@b09ed0cc2c9d opt]#

注意:g表示global,全部替换

将sed.txt文件中的第二行删除并将wo替换成ni

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# sed -e "2d" -e "s/wo/ni/g" sed.txt
dong shen
ni ni
lai lai

le le
[root@b09ed0cc2c9d opt]#
文章作者: gglss
文章链接: http://example.com/posts/6705.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +Shell工具(一) | GGLSS

Shell工具(一)

Cut工具

用于剪切数据

基本用法

cut[选项参数] filename

说明:默认分隔符是制表符

选项参数功能
-f列号,提取第几列
-d分隔符,按照指定分隔符分割列
举个栗子

准备数据

1
2
3
4
5
6
7
8
[root@b09ed0cc2c9d local]# touch cut.txt
[root@b09ed0cc2c9d local]# vim cut.txt

dong shen
guan zhen
wo wo
lai lai
le le

切割第一列数据

1
2
3
4
5
6
[root@b09ed0cc2c9d local]# cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

切割第二,三列

1
2
3
4
5
6
[root@b09ed0cc2c9d local]# cut -d " " -f 2,3 cut.txt
shen
zhen
wo
lai
le

在cut.txt文件切割出guan

1
2
3
4
5
6
7
8
9
10
11
12
[root@b09ed0cc2c9d local]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@b09ed0cc2c9d local]#
[root@b09ed0cc2c9d local]# cat cut.txt | grep guan
guan zhen
[root@b09ed0cc2c9d local]# cat cut.txt | grep guan | cut -d " " -f 1
guan
[root@b09ed0cc2c9d local]#

选取系统PATH变量值,第二个“:”之后的所有路径

1
2
3
4
[root@b09ed0cc2c9d local]# echo $PATH
/usr/local/java/jdk1.8.0_181/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[root@b09ed0cc2c9d local]# echo $PATH | cut -d : -f 3- # 不加-表示第三列,加上-表示第三列之后
/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

切割ifconfig后打印的IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@b09ed0cc2c9d local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80::42:acff:fe11:2 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 656 (656.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

[root@b09ed0cc2c9d local]# ifconfig eth0 | grep "inet " | cut -d "t" -f 2 | cut -d " " -f 2
172.17.0.2
[root@b09ed0cc2c9d local]#
sed工具

一种流编辑器,一次处理一行内容

基本用法

sed [选项参数] command filename

选项参数说明

选项参数功能
-a直接在指定列模式上进行sed的动作编辑

命令功能描述

命令功能描述
a新增,a的后面可以接字串,在下一行出现
d删除
s查找并替换
举个栗子

数据准备

1
2
3
4
5
6
7
8
9
[root@b09ed0cc2c9d opt]# touch sed.txt
[root@b09ed0cc2c9d opt]# vim sed.txt

dong shen
guan zhen
wo wo
lai lai

le le

将mei nv 这个单词插入到 sed.txt 第二行下,打印

1
2
3
4
5
6
7
8
9
[root@b09ed0cc2c9d opt]# sed "2a mei nv" sed.txt
dong shen
guan zhen
mei nv
wo wo
lai lai

le le
[root@b09ed0cc2c9d opt]#

删除sed.txt文件所有包含 wo 的行

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# sed "/wo/d" sed.txt
dong shen
guan zhen
lai lai

le le
[root@b09ed0cc2c9d opt]#

将sed.txt文件中 wo 替换为 ni

1
2
3
4
5
6
7
8
[root@b09ed0cc2c9d opt]# sed "s/wo/ni/g" sed.txt
dong shen
guan zhen
ni ni
lai lai

le le
[root@b09ed0cc2c9d opt]#

注意:g表示global,全部替换

将sed.txt文件中的第二行删除并将wo替换成ni

1
2
3
4
5
6
7
[root@b09ed0cc2c9d opt]# sed -e "2d" -e "s/wo/ni/g" sed.txt
dong shen
ni ni
lai lai

le le
[root@b09ed0cc2c9d opt]#
文章作者: gglss
文章链接: http://example.com/posts/6705.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/7272.html b/posts/7272.html index 5018a3991..5b8b91b3c 100644 --- a/posts/7272.html +++ b/posts/7272.html @@ -1 +1 @@ -使用docker的ubuntu容器安装code-server | GGLSS

使用docker的ubuntu容器安装code-server

搭建code-server

拉取Ubuntu 镜像

1
2
3
4
# 拉取镜像
docker pull aliyun
# 进入镜像
docker run --name [自定义名称] -u root --privileged=true -p 3300:8881 -v /opt/testubuntu/:/opt/main_file -it [镜像id]

安装code-server

github上下载安装包,解压后剪切到/home目录

运行code-server

1
2
3
4
# 找到bin目录下的code-server*
cd /home/code-server/bin
# 输入运行命令
export PASSWORD="123456" && ./code-server --host 0.0.0.0 --port 8881

然后在浏览器输入http://ip:3000查看搭建情况

但是这样搭建有问题

使用上面方法部署的code-server,因为是http的,导致一些功能不好用,比如写md文档无法预览

下面就是配置使用https运行

配置HTTPS

使用openssl为IP签发证书

安装openssl

一般的linux系统已经内置openssl,可以输入openssl进行查看,没有的话就需要安装

创建证书请求文件

新建openssl.cnf,并编辑如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = CH
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = ZJ
localityName = Locality Name (eg, city)
localityName_default = HangZhou
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = THS
commonName = Internet Widgits Ltd
commonName_max = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]

# 改成自己的域名
# DNS.1 = your_domain_name.com

# 改成自己的ip
IP.1 = 8.142.144.75
IP.2 = 0.0.0.0

生成私钥

san_domain_com 为最终生成的文件名,一般以服务器命名,可改。

1
openssl genrsa -out san_domain_com.key 2048

生成CSR文件

1
openssl req -new -out san_domain_com.csr -key san_domain_com.key -config openssl.cnf

执行后,系统提示输入组织等信息,按[]内容提示输入如即可。

需要测试CSR文件是否生成成功

1
> openssl req -text -noout -in san_domain_com.csr

有下面的信息,说明生成成功

1
2
3
4
5
6
7
8
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=US, ST=MN, L=Minneapolis, OU=Domain Control Validated, CN=zz
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
//...

自签名并生成证书

1
openssl x509 -req -days 3650 -in san_domain_com.csr -signkey san_domain_com.key -out san_domain_com.crt -extensions v3_req -extfile openssl.cnf

在当前目录会生成三个文件

1
2
3
4
5
san_domain_com.crt

san_domain_com.csr

san_domain_com.key

在用户电脑安装证书

.crt证书发给用户,用户双击进行安装,然后重启浏览器

code server启动

在code-server的bin目录下运行如下命令,设置端口号为8881,指定对应生成的crt和key密钥文件,即可正常访问https域名

1
2
3
4
# 给ssh创建密码
export PASSWORD="123456"
# 启动ssh
nohup ./code-server --port 8881 --host 0.0.0.0 --cert ../san_domain_com.crt --cert-key ../san_domain_com.key > vscode.log 2>&1 &

然后通过浏览器访问https://ip:3000

文章作者: gglss
文章链接: http://example.com/posts/7272.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +使用docker的ubuntu容器安装code-server | GGLSS

使用docker的ubuntu容器安装code-server

搭建code-server

拉取Ubuntu 镜像

1
2
3
4
# 拉取镜像
docker pull aliyun
# 进入镜像
docker run --name [自定义名称] -u root --privileged=true -p 3300:8881 -v /opt/testubuntu/:/opt/main_file -it [镜像id]

安装code-server

github上下载安装包,解压后剪切到/home目录

运行code-server

1
2
3
4
# 找到bin目录下的code-server*
cd /home/code-server/bin
# 输入运行命令
export PASSWORD="123456" && ./code-server --host 0.0.0.0 --port 8881

然后在浏览器输入http://ip:3000查看搭建情况

但是这样搭建有问题

使用上面方法部署的code-server,因为是http的,导致一些功能不好用,比如写md文档无法预览

下面就是配置使用https运行

配置HTTPS

使用openssl为IP签发证书

安装openssl

一般的linux系统已经内置openssl,可以输入openssl进行查看,没有的话就需要安装

创建证书请求文件

新建openssl.cnf,并编辑如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req

[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = CH
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = ZJ
localityName = Locality Name (eg, city)
localityName_default = HangZhou
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = THS
commonName = Internet Widgits Ltd
commonName_max = 64

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names

[alt_names]

# 改成自己的域名
# DNS.1 = your_domain_name.com

# 改成自己的ip
IP.1 = 8.142.144.75
IP.2 = 0.0.0.0

生成私钥

san_domain_com 为最终生成的文件名,一般以服务器命名,可改。

1
openssl genrsa -out san_domain_com.key 2048

生成CSR文件

1
openssl req -new -out san_domain_com.csr -key san_domain_com.key -config openssl.cnf

执行后,系统提示输入组织等信息,按[]内容提示输入如即可。

需要测试CSR文件是否生成成功

1
> openssl req -text -noout -in san_domain_com.csr

有下面的信息,说明生成成功

1
2
3
4
5
6
7
8
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=US, ST=MN, L=Minneapolis, OU=Domain Control Validated, CN=zz
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
//...

自签名并生成证书

1
openssl x509 -req -days 3650 -in san_domain_com.csr -signkey san_domain_com.key -out san_domain_com.crt -extensions v3_req -extfile openssl.cnf

在当前目录会生成三个文件

1
2
3
4
5
san_domain_com.crt

san_domain_com.csr

san_domain_com.key

在用户电脑安装证书

.crt证书发给用户,用户双击进行安装,然后重启浏览器

code server启动

在code-server的bin目录下运行如下命令,设置端口号为8881,指定对应生成的crt和key密钥文件,即可正常访问https域名

1
2
3
4
# 给ssh创建密码
export PASSWORD="123456"
# 启动ssh
nohup ./code-server --port 8881 --host 0.0.0.0 --cert ../san_domain_com.crt --cert-key ../san_domain_com.key > vscode.log 2>&1 &

然后通过浏览器访问https://ip:3000

文章作者: gglss
文章链接: http://example.com/posts/7272.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/7388.html b/posts/7388.html index 32df3498d..b228e9f22 100644 --- a/posts/7388.html +++ b/posts/7388.html @@ -1 +1 @@ -java基础之方法和函数 | GGLSS

java基础之方法和函数

方法和函数

定义方式作用调用方式
函数public static void 函数名(){}封装指定功能的代码块函数名()
方法public [static] void 方法名(){}类的行为,对象可以执行的一些功能对象名.方法名

定义函数

使用static修饰的内容成为静态的内容

1
2
public static void function1(){
}

调用函数

1
function1()

定义方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void class className1{

String name;
//静态变量
static String age;

//静态方法
public static function1(){
}

//类方法
//非静态方法可以调用静态变量和非静态变量、静态方法和非静态方法
public function2(){
}
}

调用方法

  • 调用静态方法,不需要实例化
1
className1.function1()
  • 调用方法
1
className1的对象,需要实例化

静态方法注意事项:

  • 静态方法无法直接引用非静态的变量
  • 静态方法不能直接调用非静态的方法

代码块

  • 定义在方法内部,和局部变量处于平行的位置
  • 生命周期随着方法的调用而加载,随着方法的结束而消亡
  • 可以在局部代码块中定义一些使用范围和时间都很短的变量,用完就消失啦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void class className1{

String name;
static String age;

//类方法
//非静态方法可以调用静态变量和非静态变量、静态方法和非静态方法
public void function2(){

//定义代码块
{
int i = 100;
System.out.println("方法中的变量i=" + i);
}

}
}

构造代码块

  • 构造代码快写在和构造方法平行的位置
  • 只要创建对象,构造代码块就会执行,不论是采用有参的还是无参数的构造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void class{
//有参构造
class(String name){
}
//无参构造
class(){
}
//构造代码块
{
int i=100;
System.out.println("构造代码块i=" + i);
}

}

静态代码块

  • 被static修饰的代码块称为静态代码块
  • 随着类的加载而加载
  • 静态代码块只执行一次,在程序中可以完成加载驱动等只执行一次的操作
1
2
3
4
5
public void className1{
static{
System.out.println("我是静态代码块i=" + i);
}
}
文章作者: gglss
文章链接: http://example.com/posts/7388.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +java基础之方法和函数 | GGLSS

java基础之方法和函数

方法和函数

定义方式作用调用方式
函数public static void 函数名(){}封装指定功能的代码块函数名()
方法public [static] void 方法名(){}类的行为,对象可以执行的一些功能对象名.方法名

定义函数

使用static修饰的内容成为静态的内容

1
2
public static void function1(){
}

调用函数

1
function1()

定义方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void class className1{

String name;
//静态变量
static String age;

//静态方法
public static function1(){
}

//类方法
//非静态方法可以调用静态变量和非静态变量、静态方法和非静态方法
public function2(){
}
}

调用方法

  • 调用静态方法,不需要实例化
1
className1.function1()
  • 调用方法
1
className1的对象,需要实例化

静态方法注意事项:

  • 静态方法无法直接引用非静态的变量
  • 静态方法不能直接调用非静态的方法

代码块

  • 定义在方法内部,和局部变量处于平行的位置
  • 生命周期随着方法的调用而加载,随着方法的结束而消亡
  • 可以在局部代码块中定义一些使用范围和时间都很短的变量,用完就消失啦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void class className1{

String name;
static String age;

//类方法
//非静态方法可以调用静态变量和非静态变量、静态方法和非静态方法
public void function2(){

//定义代码块
{
int i = 100;
System.out.println("方法中的变量i=" + i);
}

}
}

构造代码块

  • 构造代码快写在和构造方法平行的位置
  • 只要创建对象,构造代码块就会执行,不论是采用有参的还是无参数的构造方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void class{
//有参构造
class(String name){
}
//无参构造
class(){
}
//构造代码块
{
int i=100;
System.out.println("构造代码块i=" + i);
}

}

静态代码块

  • 被static修饰的代码块称为静态代码块
  • 随着类的加载而加载
  • 静态代码块只执行一次,在程序中可以完成加载驱动等只执行一次的操作
1
2
3
4
5
public void className1{
static{
System.out.println("我是静态代码块i=" + i);
}
}
文章作者: gglss
文章链接: http://example.com/posts/7388.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/7613.html b/posts/7613.html index 592b714bb..063f8e975 100644 --- a/posts/7613.html +++ b/posts/7613.html @@ -1 +1 @@ -需要参数才能访问的get请求 | GGLSS

需要参数才能访问的get请求

编写需要参数才能访问的get请求

使用参数就要用到@RequestParam 参数类型 参数变量,可以有多个参数

这个接口还是在MyGetMethod类里面编写方法,有两种方法

第一种url:key=value&&key=value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 开发一个需要参数才能访问的get请求
* 模拟获取商品列表
*/
@RequestMapping(value = "/get/with/param", method = RequestMethod.GET)
@ApiOperation(value = "需要参数才能访问的get请求的第一种实现方法", httpMethod = "GET")
public Map<String, Integer> getList(@RequestParam Integer start,
@RequestParam Integer end){

Map<String, Integer> myList = new HashMap<>();

myList.put("鞋",400);
myList.put("电脑",5000);
myList.put("手机",3500);

return myList;

}

方法二url: ip:port/get/with/param/10/20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/**
* 第二种需要携带参数访问的get请求
*/

@RequestMapping(value = "/get/with/param/{start}/{end}", method = RequestMethod.GET)
@ApiOperation(value = "需要参数才能访问的get请求的第二种实现方法", httpMethod = "GET")
public Map<String,Integer> myGetList(@PathVariable Integer start,
@PathVariable Integer end){

Map<String, Integer> myList = new HashMap<>();

myList.put("鞋",400);
myList.put("电脑",5000);
myList.put("手机",3500);

return myList;
}
文章作者: gglss
文章链接: http://example.com/posts/7613.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +需要参数才能访问的get请求 | GGLSS

需要参数才能访问的get请求

编写需要参数才能访问的get请求

使用参数就要用到@RequestParam 参数类型 参数变量,可以有多个参数

这个接口还是在MyGetMethod类里面编写方法,有两种方法

第一种url:key=value&&key=value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 开发一个需要参数才能访问的get请求
* 模拟获取商品列表
*/
@RequestMapping(value = "/get/with/param", method = RequestMethod.GET)
@ApiOperation(value = "需要参数才能访问的get请求的第一种实现方法", httpMethod = "GET")
public Map<String, Integer> getList(@RequestParam Integer start,
@RequestParam Integer end){

Map<String, Integer> myList = new HashMap<>();

myList.put("鞋",400);
myList.put("电脑",5000);
myList.put("手机",3500);

return myList;

}

方法二url: ip:port/get/with/param/10/20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

/**
* 第二种需要携带参数访问的get请求
*/

@RequestMapping(value = "/get/with/param/{start}/{end}", method = RequestMethod.GET)
@ApiOperation(value = "需要参数才能访问的get请求的第二种实现方法", httpMethod = "GET")
public Map<String,Integer> myGetList(@PathVariable Integer start,
@PathVariable Integer end){

Map<String, Integer> myList = new HashMap<>();

myList.put("鞋",400);
myList.put("电脑",5000);
myList.put("手机",3500);

return myList;
}
文章作者: gglss
文章链接: http://example.com/posts/7613.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/posts/7883.html b/posts/7883.html index 7163f3f6f..38a9411e5 100644 --- a/posts/7883.html +++ b/posts/7883.html @@ -1,4 +1,4 @@ -_3主3从的`Redis集群`搭建(上) | GGLSS

_3主3从的`Redis集群`搭建(上)

_3主3从的Redis集群搭建(上)

  • 关闭防火墙,启动docker
  • 新建6个docker容器docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
    • docker run 创建并运行docker容器实例
    • –name redis-node-6 容器名字
    • –net host 使用宿主机的IP和端口,默认
    • –privileged=true 获取宿主机root用户权限
    • -v /data/redis/share/redis-node-6:/data 容器卷,宿主机地址:docker内部地址
    • redis:6.0.8 redis镜像和版本号
    • –cluster-enabled yes 开启redis集群
    • –appendonly yes 开启持久化
    • –port 6386 redis端口号
1
2
3
4
5
6
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

运行成功,使用docker ps查看

  • 进入容器redis-node-1并为6台机器构建集群关系

    • 进入一台redis进行配置docker exec -it redis-node-1 bash

    • #进入后执行
      +_3主3从的`Redis集群`搭建(上) | GGLSS

      _3主3从的`Redis集群`搭建(上)

      _3主3从的Redis集群搭建(上)

      • 关闭防火墙,启动docker
      • 新建6个docker容器docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
        • docker run 创建并运行docker容器实例
        • –name redis-node-6 容器名字
        • –net host 使用宿主机的IP和端口,默认
        • –privileged=true 获取宿主机root用户权限
        • -v /data/redis/share/redis-node-6:/data 容器卷,宿主机地址:docker内部地址
        • redis:6.0.8 redis镜像和版本号
        • –cluster-enabled yes 开启redis集群
        • –appendonly yes 开启持久化
        • –port 6386 redis端口号
      1
      2
      3
      4
      5
      6
      docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
      docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
      docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
      docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
      docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
      docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

      运行成功,使用docker ps查看

      • 进入容器redis-node-1并为6台机器构建集群关系

        • 进入一台redis进行配置docker exec -it redis-node-1 bash

        • #进入后执行
           redis-cli --cluster create 8.142.144.75:6381 8.142.144.75:6382 8.142.144.75:6383 8.142.144.75:6384 8.142.144.75:6385 8.142.144.75:6386 --cluster-replicas 1
           
            --cluster create	构建集群
          @@ -6,4 +6,4 @@
            
           --cluster-replicas 1 表示为每个master创建一个slave节点
           # 注意:上面的ip为真实IP
          -

        有下面的绿色ok字样显示运行成功

      如果运行不成功,一直显示Waiting for the cluster to join.. 一直………………………………….,则是端口没有全部开放,防火墙也要开放端口,以阿里云为例

      就是需要在安全组上面配置63816386的6个端口,还需要配置1638116386的6个端口,共12个端口都要开放,不然会一直提示等待

      • 一切OK的话,3主3从搭建搞定
      文章作者: gglss
      文章链接: http://example.com/posts/7883.html
      版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
      控制面板×

      性能设置

      禁用模糊效果
      开启帧率检测(刷新后生效)

      主题设置

      显示aplayer
      落樱特效
      明暗模式自动切换
      自动主题色(跟随文章封面)
      未完工
      固定导航栏
      ###

      主题色

      背景设置

      注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

      图片(手机)

      图片(电脑)

      渐变色

      纯色

      文章统计

      监控

      文章统计

      访问统计显示不出来请刷新页面

      关于

      Hexo-theme-Acryple v1.0.100
      Ariasaka Console v0.01
      欢迎反馈!
      \ No newline at end of file +

    有下面的绿色ok字样显示运行成功

如果运行不成功,一直显示Waiting for the cluster to join.. 一直………………………………….,则是端口没有全部开放,防火墙也要开放端口,以阿里云为例

就是需要在安全组上面配置63816386的6个端口,还需要配置1638116386的6个端口,共12个端口都要开放,不然会一直提示等待

  • 一切OK的话,3主3从搭建搞定
文章作者: gglss
文章链接: http://example.com/posts/7883.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 GGLSS
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

文章统计

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/random/random.js b/random/random.js index ed6b7b86f..6ea71a719 100644 --- a/random/random.js +++ b/random/random.js @@ -1 +1 @@ -var posts=["posts/16107.html","posts/44160.html","posts/13923.html","posts/26527.html","posts/53427.html","posts/54899.html","posts/45938.html","posts/47474.html","posts/11643.html","posts/36554.html","posts/42656.html","posts/7883.html","posts/53299.html","posts/13844.html","posts/58353.html","posts/16766.html","posts/53508.html","posts/55605.html","posts/18767.html","posts/622.html","posts/51796.html","posts/58312.html","posts/1351.html","posts/32161.html","posts/50699.html","posts/26726.html","posts/42395.html","posts/63516.html","posts/25343.html","posts/55045.html","posts/62565.html","posts/50581.html","posts/7388.html","posts/16468.html","posts/47564.html","posts/34655.html","posts/4851.html","posts/53812.html","posts/55332.html","posts/23767.html","posts/7272.html","posts/2166.html","posts/31621.html","posts/11783.html","posts/20480.html","posts/32473.html","posts/43612.html","posts/43613.html","posts/10988.html","posts/28863.html","posts/37984.html","posts/48785.html","posts/42012.html","posts/52845.html","posts/57578.html","posts/55320.html","posts/63722.html","posts/26691.html","posts/3219.html","posts/49262.html","posts/55393.html","posts/527.html","posts/48990.html","posts/34250.html","posts/29537.html","posts/31868.html","posts/12932.html","posts/15488.html","posts/40953.html","posts/56883.html","posts/22551.html","posts/12080.html","posts/48851.html","posts/28702.html","posts/42174.html","posts/1.html","posts/1.html","posts/41091.html","posts/4654.html","posts/6705.html","posts/50013.html","posts/27832.html","posts/65365.html","posts/38168.html","posts/24951.html","posts/58345.html","posts/59561.html","posts/557.html","posts/7613.html","posts/15521.html","posts/42075.html","posts/16785.html","posts/44161.html","posts/55957.html","posts/50070.html","posts/56062.html","posts/52630.html","posts/63387.html","posts/6166.html"];function toRandomPost(){pjax.loadUrl("/"+posts[Math.floor(Math.random()*posts.length)])} \ No newline at end of file +var posts=["posts/44160.html","posts/13923.html","posts/16107.html","posts/53427.html","posts/45938.html","posts/47474.html","posts/11643.html","posts/53812.html","posts/4851.html","posts/54899.html","posts/26527.html","posts/28863.html","posts/48785.html","posts/10988.html","posts/57578.html","posts/37984.html","posts/42012.html","posts/50581.html","posts/16468.html","posts/47564.html","posts/34655.html","posts/55332.html","posts/36554.html","posts/7388.html","posts/53299.html","posts/7883.html","posts/58353.html","posts/16766.html","posts/53508.html","posts/18767.html","posts/42656.html","posts/51796.html","posts/58312.html","posts/13844.html","posts/622.html","posts/32161.html","posts/50699.html","posts/26726.html","posts/62565.html","posts/1351.html","posts/55605.html","posts/42395.html","posts/63516.html","posts/25343.html","posts/55045.html","posts/52845.html","posts/63722.html","posts/55320.html","posts/3219.html","posts/26691.html","posts/49262.html","posts/55393.html","posts/48990.html","posts/527.html","posts/34250.html","posts/12932.html","posts/31868.html","posts/29537.html","posts/15488.html","posts/48851.html","posts/56883.html","posts/40953.html","posts/22551.html","posts/31621.html","posts/20480.html","posts/11783.html","posts/43612.html","posts/43613.html","posts/7272.html","posts/2166.html","posts/38168.html","posts/27832.html","posts/41091.html","posts/23767.html","posts/50013.html","posts/32473.html","posts/59561.html","posts/65365.html","posts/28702.html","posts/55957.html","posts/4654.html","posts/6705.html","posts/42174.html","posts/12080.html","posts/58345.html","posts/557.html","posts/15521.html","posts/42075.html","posts/7613.html","posts/1.html","posts/24951.html","posts/50070.html","posts/16785.html","posts/1.html","posts/56062.html","posts/44161.html","posts/52630.html","posts/63387.html","posts/6166.html"];function toRandomPost(){pjax.loadUrl("/"+posts[Math.floor(Math.random()*posts.length)])} \ No newline at end of file diff --git a/redirect/index.html b/redirect/index.html index 4814d7486..5c7ae6d93 100644 --- a/redirect/index.html +++ b/redirect/index.html @@ -1 +1 @@ -GGLSS | GGLSS
跳转
即将离开 Research • 呓语,前往第三方网站,请注意账号财产安全
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file +GGLSS | GGLSS
跳转
即将离开 Research • 呓语,前往第三方网站,请注意账号财产安全
控制面板×

性能设置

禁用模糊效果
开启帧率检测(刷新后生效)

主题设置

显示aplayer
落樱特效
明暗模式自动切换
自动主题色(跟随文章封面)
未完工
固定导航栏
###

主题色

背景设置

注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

图片(手机)

图片(电脑)

渐变色

纯色

文章统计

监控

访问统计显示不出来请刷新页面

关于

Hexo-theme-Acryple v1.0.100
Ariasaka Console v0.01
欢迎反馈!
\ No newline at end of file diff --git a/search.xml b/search.xml index 88c9f8ea3..ba6f40c30 100644 --- a/search.xml +++ b/search.xml @@ -1,23 +1,5 @@ - - Hello World - /posts/16107.html - Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

-

Quick Start

Create a new post

$ hexo new "My New Post"
- -

More info: Writing

-

Run server

$ hexo server
- -

More info: Server

-

Generate static files

$ hexo generate
- -

More info: Generating

-

Deploy to remote sites

$ hexo deploy
- -

More info: Deployment

-]]>
-
english one /posts/44160.html @@ -80,38 +62,22 @@ - css教程一 - /posts/26527.html - css选择器

元素选择器(Element Selector)

-

通过元素名称选择 HTML 元素。

-
-
// 如下代码,p 选择器将选择所有 <p> 元素:

p {
color: blue;
}
+ Hello World + /posts/16107.html + Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

+

Quick Start

Create a new post

$ hexo new "My New Post"
-

类选择器(Class Selector)

-

通过类别名称选择具有特定类别的 HTML 元素。

-
-
// 类选择器以 . 开头,后面跟着类别名称。
// 如下代码,.highlight 选择器将选择所有具有类别为 "highlight" 的元素。

.highlight {
background-color: yellow;
}
+

More info: Writing

+

Run server

$ hexo server
-

ID 选择器(ID Selector)

-

通过元素的唯一标识符(ID)选择 HTML 元素。

-
-
// ID 选择器以 # 开头,后面跟着 ID 名称。
// 如下代码,#runoob 选择器将选择具有 ID 为 "runoob" 的元素。

#runoob {
width: 200px;
}
-

属性选择器(Attribute Selector)

-

通过元素的属性选择 HTML 元素。属性选择器可以根据属性名和属性值进行选择。

-
-
// 如下代码,input[type="text"] 选择器将选择所有 type 属性为 "text" 的 <input> 元素。

input[type="text"] {
border: 1px solid gray;
}
-

后代选择器(Descendant Selector)

-

通过指定元素的后代关系选择 HTML 元素。

-
-
// 后代选择器使用空格分隔元素名称。
// 如下代码,div p 选择器将选择所有在 <div> 元素内的 <p> 元素。

div p {
font-weight: bold;
}
+

More info: Server

+

Generate static files

$ hexo generate
-

背景: background 属性

]]>
- - 工具教程 - - - css - +

More info: Generating

+

Deploy to remote sites

$ hexo deploy
+ +

More info: Deployment

+]]>
Butterfly美化记录三 @@ -150,57 +116,6 @@ -]]> - - 工具教程 - - - Butterfly - - - - Butterfly美化记录一 - /posts/54899.html - -

注:这个魔改转载于Ariasakaの小窝

- -

导航栏

分离菜单栏和搜索栏

让搜索栏放在最右侧,其他的导航栏居中

-

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug:

-
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
- if (theme.algolia_search.enable || theme.local_search.enable)
- #search-button
- a.site-page.social-icon.search
- i.fas.fa-search.fa-fw
- span=' '+_p('search.title')
!=partial('includes/header/menu_item', {}, {cache: true})
#nav-right
+ if (theme.algolia_search.enable || theme.local_search.enable)
+ #search-button
+ a.site-page.social-icon.search
+ i.fas.fa-search.fa-fw
- #toggle-menu
- a.site-page
- i.fas.fa-bars.fa-fw
+ #toggle-menu
+ a.site-page
+ i.fas.fa-bars.fa-fw
- -

修改的文件nav.pug,版本为Butterfly 4.10.0

-
nav#nav
span#blog-info
a(href=url_for('/') title=config.title)
if theme.nav.logo
img.site-icon(src=url_for(theme.nav.logo))
if theme.nav.display_title
span.site-name=config.title

#menus
!=partial('includes/header/menu_item', {}, {cache: true})

#nav-right
if (theme.algolia_search.enable || theme.local_search.enable || theme.docsearch.enable)
#search-button
a.site-page.social-icon.search(href="javascript:void(0);")
i.fas.fa-search.fa-fw

#toggle-menu
a.site-page
i.fas.fa-bars.fa-fw
- - - -

居中

使用自定义[blogRoot]/self/css/meihua.css,添加下面的代码

-
#nav-right{
flex:1 1 auto;
justify-content: flex-end;
margin-left: auto;
display: flex;
flex-wrap:nowrap;
}
- -

去掉导航栏下的蓝色长条

在自定义[blogRoot]/self/css/meihua.css里面添加

-
#nav *::after{
background-color: transparent!important;
}
- -

子菜单横向布局

在自定义[blogRoot]/self/css/meihua.css里面添加

-
/* ----------导航栏横向下拉框---------- */

.menus_item_child li:not(#sidebar-menus li){
float: left;
border-radius: 6px!important;
-webkit-border-radius: 6px!important;
-moz-border-radius: 6px!important;
-ms-border-radius: 6px!important;
-o-border-radius: 6px!important;
}
.menus_item_child:not(#sidebar-menus ul){
/*left:calc(-150%)!important;*//*这是估算值,为了保持元素居中的,如果不合适可以自己调*/
left:50%;
translate:-50%;
}
- - - -

显示标题

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug

-
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
!=partial('includes/header/menu_item', {}, {cache: true})
+ center(id="name-container")
+ a(id="page-name" href="javascript:scrollToTop()") PAGE_NAME
...
- -

[blogRoot]/self/js/创建jquery.js文件,添加以下代码

-
/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
- -

然后添加nav.js,并且按照注释修改配置

-
//js有一个小问题:就是只要鼠标滚动不论哪里都会响应,即便你滚动的是子元素

//2022.9.11 已修复,需要jq,请自行引入
document.getElementById("name-container").setAttribute("style", "display:none");

var position = $(window).scrollTop();

$(window).scroll(function () {

var scroll = $(window).scrollTop();

if (scroll > position) {


document.getElementById("name-container").setAttribute("style", "");
document.getElementsByClassName("menus_items")[1].setAttribute("style", "display:none!important");

} else {


document.getElementsByClassName("menus_items")[1].setAttribute("style", "");
document.getElementById("name-container").setAttribute("style", "display:none");

}

position = scroll;

});
function scrollToTop(){
document.getElementsByClassName("menus_items")[1].setAttribute("style","");
document.getElementById("name-container").setAttribute("style","display:none");
btf.scrollToDest(0, 500);
}
//修复没有弄右键菜单的童鞋无法回顶部的问题
document.getElementById("page-name").innerText = document.title.split(" | Ariasakaの小窝")[0];
/*这里是去掉你的网站全局名称的设置,如果你不需要去掉,你可以写成:
document.getElementById("page-name").innerText=document.title

或者把你的网站的分隔符和全局网站名称加上去*/

- -

最后添加如下css,按照注释修改参数:

-
/*
2022.10.4更新:
根据我发现的没有自适应,间距不合理问题进行调整,如果用了这个的朋友们建议改一改
*/
#page-name::before{
font-size:18px;
position: absolute;
width:100%;
height:100%;
border-radius: 8px;
color:white!important;
top:0;
left:0;
content:'回到顶部';
background-color: var(--lyx-theme);
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
opacity: 0;
box-shadow: 0 0 3px var(--lyx-theme);
line-height: 45px; /*如果垂直位置不居中可以微调此值,也可以删了*/
}
#page-name:hover:before{
opacity: 1;
}
@media screen and (max-width:900px){
#page-name,#menus{
display:none!important;
}
}

#name-container{
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
}
#name-container:hover{
scale:1.03
}
#page-name{
position: relative;
padding:10px 30px/*如果文字间隔不合理可以微调修改,第二个是水平方向的padding,第一个是垂直的*/
}
#nav{
padding: 0 20px;
}

- -

导航栏显示haver颜色

在自定义[blogRoot]/self/css/meihua.css里面添加

-
/* ----------修改导航栏的haver---------- */

.site-page {
padding: 5px;
margin: 3px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
.site-page:hover {
background-color: var(--gglss-theme);
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 5px;
}
.site-page.child:hover {
background-color: var(--gglss-theme)!important;
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 4px;
}

/* ----------网站标题部分的增强版---------- */
#site-name::before{
opacity: 0;
background-color: var(--gglss-theme)!important;
border-radius: 8px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
-ms-border-radius: 8px;
-o-border-radius: 8px;
transition: .3s;
-webkit-transition: .3s;
-moz-transition: .3s;
-ms-transition: .3s;
-o-transition: .3s;
position:absolute;
top:0!important;
right:0!important;
width:100%;
height:100%;
content: "\f015";
box-shadow: 0 0 5px var(--gglss-theme);
font-family: "Font Awesome 6 Free";
text-align: center;
color:white;
line-height:34px;/*如果有溢出或者垂直不居中的现象微调一下这个参数*/
font-size: 18px;/*根据个人喜好*/
}
#site-name:hover::before{
opacity: 1;
scale:1.03;
}
#site-name{
position: relative;
font-size: 24px; /*一定要把字体调大点,否则效果惨不忍睹!*/
}
:root{
--gglss-theme:#49B1F5 /*我的主题色*/
}

- - - ]]>
工具教程 @@ -307,7 +222,34 @@

在每次运行完hexo generate生成静态页面后,运行gulp对其进行压缩。指令流程如下:

-
hexo clean
hexo generate
gulp
hexo server 或 hexo deploy
]]> +
hexo clean
hexo generate
gulp
hexo server 或 hexo deploy
+ +

手机端悬浮窗

+

使用akilar教程

+
+

新建[Blogroot]\themes\butterfly\source\js\custom\fixed_card_widget.js,用来控制显隐逻辑

+
// 固定卡片点击动作
function FixedCardWidget(type,name,index){
// 根据id或class选择元素
if (type === "id"){
var tempcard = document.getElementById(name);
}
else{
var tempcard = document.getElementsByClassName(name)[index];
}
// 若元素存在
if (tempcard) {
// 首先判断是否存在fixed-card-widget类
if (tempcard.className.indexOf('fixed-card-widget') > -1){
// 存在则移除
RemoveFixedCardWidget();
}
else{
// 不存在则先初始化防止卡片叠加
RemoveFixedCardWidget();
//新建退出蒙版
CreateQuitBox();
// 再添加固定卡片样式
tempcard.classList.add('fixed-card-widget');
}
}
}
//创建一个蒙版,作为退出键使用
function CreateQuitBox(){
var quitBox = `<div id="quit-box" onclick="RemoveFixedCardWidget()"></div>`
var asideContent = document.getElementById('aside-content');
asideContent.insertAdjacentHTML("beforebegin",quitBox)
}
// 移除卡片方法
function RemoveFixedCardWidget(){
var activedItems = document.querySelectorAll('.fixed-card-widget');
if (activedItems) {
for (i = 0; i < activedItems.length; i++) {
activedItems[i].classList.remove('fixed-card-widget');
}
}
//移除退出蒙版
var quitBox = document.getElementById('quit-box');
if (quitBox) quitBox.remove();
}
// 常规先初始化,确保切换页面后不会有固定卡片留存
RemoveFixedCardWidget()

+ +

新建[Blogroot]\themes\butterfly\source\css\_layout\fixed_card_widget.styl,此处使用stylus交给插件编译,能够更快捷的适配多种内核样式

+
// 垂直居中卡片样式(排除toc目录卡片)
.fixed-card-widget
&:not(#card-toc)
visibility visible!important
display block!important
position fixed!important
bottom 0
left 0
top 0
right 0
margin auto
margin-bottom auto!important
margin-top auto!important
max-width 300px
max-height 500px
width auto
height auto
overflow-y: scroll
z-index 999
animation rotateX 0.5s ease
animation-fill-mode forwards
&::-webkit-scrollbar
width: 0
// 针对说说卡片做样式兼容适配
.card-shuo
&.fixed-card-widget
#artitalk_main
max-height 460px
overflow scroll
&::-webkit-scrollbar
display: none
#operare_artitalk
.c2
z-index 1000
// 针对标签卡片做样式兼容适配
.card-tags
&.fixed-card-widget
.card-tag-cloud
max-height 460px
overflow scroll
&::-webkit-scrollbar
display: none
// 控制手机端可见
@media screen and (max-width: 768px)
div#fixedcard-dashboard
display flex!important
// 侧栏悬浮按钮样式
div#fixedcard-dashboard
position fixed
top 150px
width fit-content
height 40px
opacity 0.3
transition all 0.5s
display none
background rgba(255,255,255,0.9)
padding 5px 10px
border-top-right-radius 20px
border-bottom-right-radius 20px
z-index 1000
&:hover
opacity 1
button
&.fixedcard-activebtn
width 30px
opacity 1
pointer-events all
// 按钮样式
button
&.fixedcard-activebtn
width 0px
height 30px
transition all .5s
display flex
opacity 0
align-items center
justify-content space-around
pointer-events none
color #757273
// 悬浮按钮头像
.fixedcard-user-avatar
display inline-block
img
&.fixedcard-user-avatar-img
width 30px
height 30px
border-radius 50%
// 悬浮按钮夜间模式适配
[data-theme="dark"]
div#fixedcard-dashboard
background rgba(55,55,55,0.9)
button
&.fixedcard-activebtn
color #bcbdbd

// 卡片开启动画效果
@keyframes rotateX
from
transform rotateX(90deg)
to
transform rotateX(0deg)
// 退出蒙版效果
div#quit-box
position fixed
display block
left 0
top 0
width 100vh
height 100vh
z-index 99
background rgba(25,25,25,0.3)


[data-theme="dark"]
div#quit-box
background rgba(147, 146, 128, 0.3)

+ +

新建[Blogroot]\themes\butterfly\layout\includes\custom\fixed_card_widget.pug,以后的源码魔改教程都会尽量将改动文件归纳到带custom字样的文件夹里,便于管理魔改文件。

+
#fixedcard-dashboard
if is_post()
each poitem in theme.fixed_card_widget.post
button.fixedcard-activebtn(type="button" title=poitem.title onclick=`FixedCardWidget("` + poitem.type + `","` + poitem.name + `","` + poitem.index + `")`)
i(class=poitem.icon)
else
each paitem in theme.fixed_card_widget.page
button.fixedcard-activebtn(type="button" title=paitem.title onclick=`FixedCardWidget("` + paitem.type + `","` + paitem.name + `","` + paitem.index + `")`)
i(class=paitem.icon)
.fixedcard-user-avatar.fixedcard-activebtn(onclick="RemoveFixedCardWidget()")
img.fixedcard-user-avatar-img(src=url_for(theme.avatar.img) title=config.author)

+ +

修改[Blogroot]\themes\butterfly\layout\includes\additional-js.pug,直接加在文件末尾即可,但是注意缩进!

+
  if theme.busuanzi.site_uv || theme.busuanzi.site_pv || theme.busuanzi.page_pv
script(async data-pjax src=url_for(theme.CDN.busuanzi))
+ if !theme.aside.mobile && theme.fixed_card_widget.enable
+ include ./custom/fixed_card_widget.pug
+ +

因为还做了page和post页面不同悬浮按钮的配置,为了让它能够自动切换而不是惰性加载,需要修改[Blogroot]\themes\butterfly\layout\includes\third-party\pjax.pug大约第十四行的位置,在pjax选择器中加入悬浮按钮的id。

+
  script.
let pjaxSelectors = [
'title',
'#config-diff',
'#body-wrap',
'#rightside-config-hide',
'#rightside-config-show',
+ "#fixedcard-dashboard",
'.js-pjax'
]
+ +

修改[Blogroot]\_config.butterfly.yml,新增配置项,此处的选择器其实就是提取了document.getElementsByClassName("name")[index]document.getElementById("name")这两个方法中的参数来确保能够找到侧栏卡片。原本其实是可以做成自动根据侧栏生成的,但是考虑到还有插件挂载和自定义卡片,以及还有部分用户会刻意隐藏一些侧栏卡片,所以干脆还是让用户自己去配置想要加到菜单的卡片好了。
找id或者class的办法很简单,用F12开启控制台,用左上角的元素选择器点选想要的侧栏卡片,在源码栏找到对应的class或者id。因为class是可以重名的,所以还存在一个序列问题,从0开始计数。此处为了避免语意混乱,建议还是用特征明显的class或者id来选择对应卡片。

+
#侧栏悬浮卡片控制按钮
#https://akilar.top/posts/451ac5f8/
fixed_card_widget:
enable: true
page: #页面显示按钮
- type: class #侧栏卡片选择器类型
name: card-info #侧栏卡片选择器名称
index: 0 #侧栏卡片选择器序列
icon: fas fa-address-book #图标
title: 用户信息 #悬停显示提示
- type: class
name: card-clock
index: 0
icon: fas fa-cloud-sun
title: 电子钟
- type: class
name: card-shuo
index: 0
icon: fas fa-comments
title: 碎碎念
- type: class
name: card-recent-post
index: 0
icon: fas fa-history
title: 最新文章
- type: id
name: card-newest-comments
index: 0
icon: fas fa-comment-dots
title: 最新评论
- type: class
name: card-tags
index: 0
icon: fas fa-tags
title: 标签
- type: class
name: card-webinfo
index: 0
icon: fas fa-chart-line
title: 网站咨询
post: #文章页显示按钮
- type: class
name: card-info
index: 0
icon: fas fa-address-book
title: 用户信息
- type: class
name: card-clock
index: 0
icon: fas fa-cloud-sun
title: 电子钟
- type: class
name: card-recent-post
index: 0
icon: fas fa-history
title: 最新文章
+ +

修改[Blogroot]_config.butterfly.yml的inject配置项

+
 inject:
head:

bottom:
+ - <script data-pjax defer src="/js/custom/fixed_card_widget.js"></script>
+ +

注意要关闭手机端显示侧栏卡片才能启用fixed卡片样式。

+
  aside:
enable: true
hide: false
button: true
- mobile: true # display on mobile
+ mobile: false # display on mobile
position: right # left or right
]]> 工具教程 @@ -362,946 +304,551 @@
- _3主3从的`Redis集群`搭建(下) - /posts/36554.html - _3主3从的Redis集群搭建(下)

进入主机6381

-

redis-cli -p 6381

-
-
- -
- -

查看集群信息

-

cluster info

-
-
- -
+ git提示Timed out的解决办法 + /posts/53812.html + 报错代码

运行git代码会提示Timed out错误

+
使用git,会发生报错:Failed to connect to github.com port 443 after 21098 ms: Timed out
-

查看主机和从机之间的主从关系

-
-

cluster nodes

-
-

image-20220509101455220

-
- -
+

解决办法

设置代理

+
git config --global https.proxy
+

取消代理

+
git config --global --unset https.proxy
+

然后输入git 命令使用

]]>
- 工具教程 + 经验分享 - docker + Git
- _mysql主从复制docker版 - /posts/42656.html - _mysql主从复制docker版

安装mysql主从复制(一主一从)

新建主服务器容器实例3307

-
docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log/:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
+ 使用pip install报错的解决办法 + /posts/4851.html + 报错提示

今天使用PyCharm下载一个模块pip.exe install locust,有错误提示

+
https://visualstudio.microsoft.com/visual-cpp-build-tools/
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
// 报错位置
ERROR: Failed building wheel for psutil

ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
+

原因

+

缺少对应的whl文件

+
+

解决办法

碰到了这个错误ERROR: Failed building wheel for psutil,就需要下载psutil.whl

+

下载网站点击进入网站

+

下载psutil-5.9.0-cp38-cp38-win_amd64.whl文件

+

然后使用(pip install 文件的绝对路径)进行安装,然后使用pip.exe install locust正常安装

+

pip.exe install D:\Appium\psutil-5.9.0-cp38-cp38-win_amd64.whl

pip.exe install locust

+]]>
+ + 经验分享 + + + error + +
+ + Butterfly美化记录一 + /posts/54899.html + +

注:这个魔改转载于Ariasakaの小窝

+ +

导航栏

分离菜单栏和搜索栏

让搜索栏放在最右侧,其他的导航栏居中

+

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug:

+
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
- if (theme.algolia_search.enable || theme.local_search.enable)
- #search-button
- a.site-page.social-icon.search
- i.fas.fa-search.fa-fw
- span=' '+_p('search.title')
!=partial('includes/header/menu_item', {}, {cache: true})
#nav-right
+ if (theme.algolia_search.enable || theme.local_search.enable)
+ #search-button
+ a.site-page.social-icon.search
+ i.fas.fa-search.fa-fw
- #toggle-menu
- a.site-page
- i.fas.fa-bars.fa-fw
+ #toggle-menu
+ a.site-page
+ i.fas.fa-bars.fa-fw
-

进入/mydata/mysql-master/conf目录下新建my.cnf把下面内容粘贴到my.cnf

-
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
+

修改的文件nav.pug,版本为Butterfly 4.10.0

+
nav#nav
span#blog-info
a(href=url_for('/') title=config.title)
if theme.nav.logo
img.site-icon(src=url_for(theme.nav.logo))
if theme.nav.display_title
span.site-name=config.title

#menus
!=partial('includes/header/menu_item', {}, {cache: true})

#nav-right
if (theme.algolia_search.enable || theme.local_search.enable || theme.docsearch.enable)
#search-button
a.site-page.social-icon.search(href="javascript:void(0);")
i.fas.fa-search.fa-fw

#toggle-menu
a.site-page
i.fas.fa-bars.fa-fw
-

修改完配置后重启master容器

-

master容器实例内创建数据同步用户

-
# 建立一个用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 对新建的用户进行授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
-
- -
+

居中

使用自定义[blogRoot]/self/css/meihua.css,添加下面的代码

+
#nav-right{
flex:1 1 auto;
justify-content: flex-end;
margin-left: auto;
display: flex;
flex-wrap:nowrap;
}
-

新建从服务器实例3308

-
docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log/:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
+

去掉导航栏下的蓝色长条

在自定义[blogRoot]/self/css/meihua.css里面添加

+
#nav *::after{
background-color: transparent!important;
}
-

进入/mydata/mysql-slave/conf目录下新建my.cnf

-
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
+

子菜单横向布局

在自定义[blogRoot]/self/css/meihua.css里面添加

+
/* ----------导航栏横向下拉框---------- */

.menus_item_child li:not(#sidebar-menus li){
float: left;
border-radius: 6px!important;
-webkit-border-radius: 6px!important;
-moz-border-radius: 6px!important;
-ms-border-radius: 6px!important;
-o-border-radius: 6px!important;
}
.menus_item_child:not(#sidebar-menus ul){
/*left:calc(-150%)!important;*//*这是估算值,为了保持元素居中的,如果不合适可以自己调*/
left:50%;
translate:-50%;
}
-

重启从机实例docker restart mysql-slave

-

在主数据库中查看主从同步状态show master status;

-

进入mysql-slave从机容器

-

在从数据库中配置主从复制change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

-
# 说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
-

在从数据库中查看主从同步状态show slave status \G;

-

在从数据库中开启主从同步start slave

-

查看从数据库状态发现已经同步

-
- -
+ +

显示标题

修改[blogRoot]\themes\Butterfly\layout\includes\header\nav.pug

+
nav#nav
span#blog_name
a#site-name(href=url_for('/')) #[=config.title]

#menus
!=partial('includes/header/menu_item', {}, {cache: true})
+ center(id="name-container")
+ a(id="page-name" href="javascript:scrollToTop()") PAGE_NAME
...
+ +

[blogRoot]/self/js/创建jquery.js文件,添加以下代码

+
/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+ +

然后添加nav.js,并且按照注释修改配置

+
//js有一个小问题:就是只要鼠标滚动不论哪里都会响应,即便你滚动的是子元素

//2022.9.11 已修复,需要jq,请自行引入
document.getElementById("name-container").setAttribute("style", "display:none");

var position = $(window).scrollTop();

$(window).scroll(function () {

var scroll = $(window).scrollTop();

if (scroll > position) {


document.getElementById("name-container").setAttribute("style", "");
document.getElementsByClassName("menus_items")[1].setAttribute("style", "display:none!important");

} else {


document.getElementsByClassName("menus_items")[1].setAttribute("style", "");
document.getElementById("name-container").setAttribute("style", "display:none");

}

position = scroll;

});
function scrollToTop(){
document.getElementsByClassName("menus_items")[1].setAttribute("style","");
document.getElementById("name-container").setAttribute("style","display:none");
btf.scrollToDest(0, 500);
}
//修复没有弄右键菜单的童鞋无法回顶部的问题
document.getElementById("page-name").innerText = document.title.split(" | Ariasakaの小窝")[0];
/*这里是去掉你的网站全局名称的设置,如果你不需要去掉,你可以写成:
document.getElementById("page-name").innerText=document.title

或者把你的网站的分隔符和全局网站名称加上去*/

+ +

最后添加如下css,按照注释修改参数:

+
/*
2022.10.4更新:
根据我发现的没有自适应,间距不合理问题进行调整,如果用了这个的朋友们建议改一改
*/
#page-name::before{
font-size:18px;
position: absolute;
width:100%;
height:100%;
border-radius: 8px;
color:white!important;
top:0;
left:0;
content:'回到顶部';
background-color: var(--lyx-theme);
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
opacity: 0;
box-shadow: 0 0 3px var(--lyx-theme);
line-height: 45px; /*如果垂直位置不居中可以微调此值,也可以删了*/
}
#page-name:hover:before{
opacity: 1;
}
@media screen and (max-width:900px){
#page-name,#menus{
display:none!important;
}
}

#name-container{
transition: all .3s;
-webkit-transition: all .3s;
-moz-transition: all .3s;
-ms-transition: all .3s;
-o-transition: all .3s;
}
#name-container:hover{
scale:1.03
}
#page-name{
position: relative;
padding:10px 30px/*如果文字间隔不合理可以微调修改,第二个是水平方向的padding,第一个是垂直的*/
}
#nav{
padding: 0 20px;
}

+ +

导航栏显示haver颜色

在自定义[blogRoot]/self/css/meihua.css里面添加

+
/* ----------修改导航栏的haver---------- */

.site-page {
padding: 5px;
margin: 3px;
padding-left: 10px;
padding-right: 10px;
white-space: nowrap;
}
.site-page:hover {
background-color: var(--gglss-theme);
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 5px;
}
.site-page.child:hover {
background-color: var(--gglss-theme)!important;
box-shadow: 0 0 3px var(--gglss-theme)!important;
border-radius: 4px;
}

/* ----------网站标题部分的增强版---------- */
#site-name::before{
opacity: 0;
background-color: var(--gglss-theme)!important;
border-radius: 8px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
-ms-border-radius: 8px;
-o-border-radius: 8px;
transition: .3s;
-webkit-transition: .3s;
-moz-transition: .3s;
-ms-transition: .3s;
-o-transition: .3s;
position:absolute;
top:0!important;
right:0!important;
width:100%;
height:100%;
content: "\f015";
box-shadow: 0 0 5px var(--gglss-theme);
font-family: "Font Awesome 6 Free";
text-align: center;
color:white;
line-height:34px;/*如果有溢出或者垂直不居中的现象微调一下这个参数*/
font-size: 18px;/*根据个人喜好*/
}
#site-name:hover::before{
opacity: 1;
scale:1.03;
}
#site-name{
position: relative;
font-size: 24px; /*一定要把字体调大点,否则效果惨不忍睹!*/
}
:root{
--gglss-theme:#49B1F5 /*我的主题色*/
}

+ -

主从复制测试

-

主机创建数据库,创建表,插入数据,搜索表的数据

-

从机直接搜索标的数据

]]>
工具教程 - docker + Butterfly
- _3主3从的`Redis集群`搭建(上) - /posts/7883.html - _3主3从的Redis集群搭建(上)
    -
  • 关闭防火墙,启动docker
  • -
  • 新建6个docker容器docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
      -
    • docker run 创建并运行docker容器实例
    • -
    • –name redis-node-6 容器名字
    • -
    • –net host 使用宿主机的IP和端口,默认
    • -
    • –privileged=true 获取宿主机root用户权限
    • -
    • -v /data/redis/share/redis-node-6:/data 容器卷,宿主机地址:docker内部地址
    • -
    • redis:6.0.8 redis镜像和版本号
    • -
    • –cluster-enabled yes 开启redis集群
    • -
    • –appendonly yes 开启持久化
    • -
    • –port 6386 redis端口号
    • -
    -
  • -
-
docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
- -

运行成功,使用docker ps查看

-
    -
  • 进入容器redis-node-1并为6台机器构建集群关系

    -
      -
    • 进入一台redis进行配置docker exec -it redis-node-1 bash

      -
    • -
    • #进入后执行
      -redis-cli --cluster create 8.142.144.75:6381 8.142.144.75:6382 8.142.144.75:6383 8.142.144.75:6384 8.142.144.75:6385 8.142.144.75:6386 --cluster-replicas 1
      +    css教程一
      +    /posts/26527.html
      +    css选择器

      元素选择器(Element Selector)

      +

      通过元素名称选择 HTML 元素。

      +
      +
      // 如下代码,p 选择器将选择所有 <p> 元素:

      p {
      color: blue;
      }
      - --cluster create 构建集群 - --cluster-replicas 1 集群关联一比一的关系 - ---cluster-replicas 1 表示为每个master创建一个slave节点 -# 注意:上面的ip为真实IP -
      -
    • -
    -

    有下面的绿色ok字样显示运行成功

    -
  • -
-
- -
+

类选择器(Class Selector)

+

通过类别名称选择具有特定类别的 HTML 元素。

+
+
// 类选择器以 . 开头,后面跟着类别名称。
// 如下代码,.highlight 选择器将选择所有具有类别为 "highlight" 的元素。

.highlight {
background-color: yellow;
}
-
-

如果运行不成功,一直显示Waiting for the cluster to join.. 一直………………………………….,则是端口没有全部开放,防火墙也要开放端口,以阿里云为例

+

ID 选择器(ID Selector)

+

通过元素的唯一标识符(ID)选择 HTML 元素。

-

就是需要在安全组上面配置63816386的6个端口,还需要配置1638116386的6个端口,共12个端口都要开放,不然会一直提示等待

-
    -
  • 一切OK的话,3主3从搭建搞定
  • -
-]]> - - 工具教程 - - - docker - - - - _3主3从的`Redis集群`搭建之哈希槽算法 - /posts/53299.html - _3主3从的Redis集群搭建之哈希槽算法

目的

解决一致性哈希算法数据倾斜问题

-

实质

是一个数组,数组[0,2^14-1]形成hash slot空间

-

作用

解决均匀分配问题,在数据和节点之间加入一层(哈希槽slot)用于管理数据和节点之间的关系,现在相当于节点里放槽,槽里放数据

-
- -
+
// ID 选择器以 # 开头,后面跟着 ID 名称。
// 如下代码,#runoob 选择器将选择具有 ID 为 "runoob" 的元素。

#runoob {
width: 200px;
}
+

属性选择器(Attribute Selector)

+

通过元素的属性选择 HTML 元素。属性选择器可以根据属性名和属性值进行选择。

+
+
// 如下代码,input[type="text"] 选择器将选择所有 type 属性为 "text" 的 <input> 元素。

input[type="text"] {
border: 1px solid gray;
}
+

后代选择器(Descendant Selector)

+

通过指定元素的后代关系选择 HTML 元素。

+
+
// 后代选择器使用空格分隔元素名称。
// 如下代码,div p 选择器将选择所有在 <div> 元素内的 <p> 元素。

div p {
font-weight: bold;
}
-

方便数据移动

-

哈希解决的映射问题,使用key的哈希值来计算所在的槽,便于数据分配

-

多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)

-

这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。

-

接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384

-

以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

-

举个栗子

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

-

首先有几个redis就把0-16383分成几个

-
- -
]]>
+

背景: background 属性

]]> 工具教程 - docker + css
- _dockerfile - /posts/13844.html - _dockerfile

以dockerfile的方法来进行对centos的具有vim,ifconfig和jdk8的镜像

创建myfile文件夹

创建Dockerfile文件

-

注意:jdk8需要和Dockerfile放到同一个文件夹

-
-
FROM centos:7												
MAINTAINER zzyy<zzyybs@126.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 80

CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
- -

创建好Dockerfile后,运行docker build -t 新镜像名称:Tag .

注意:Tag后面有个空格,有个点

-

虚悬镜像

-

仓库名和标签名全部为的镜像

-
-

碰到它还是进行删除的好

-

使用docker image ls -f dangling=true查找虚悬镜像

-

使用docker image prune删除镜像

+ 使用moko编写测试接口(无) + /posts/28863.html + 测试

测试

测试moko


+

测试

+

🐱

+

❄️

]]>
工具教程 - docker + java
- _主从容错切换迁移 - /posts/58353.html - _主从容错切换迁移

进入redis集群

-

注意:进入集群环境后,不能使用单机版的redis-cli -p 6381

-
-

因为这样会在增加数据时有error报错出现

-
- -
- - -

使用set k1 v1错误是因为1号主机里面的编号是0到5460,超过了这个范围就会报错

-
-

正确进入的方法redis-cli -p 6381 -c

-

-c 的作用是优化路由

-
-
- -
- + 使用moko编写包含cookie信息的测试接口(二) + /posts/48785.html + 上一节已经写了规则,这次直接来编写Get和Post请求

+

这是一个会返回cookie的get请求

{
"description": "这是一个会返回cookie的get请求",
"request": {
"uri": "/getCookies",
"method": "get"
},
"response": {
"cookies": {
"login": "true"
},
"text": "恭喜你获得cookies信息成功",
"status": 200,
"msg": "成功"
}
}
-

注:FLUSHALL:作用是清除之前添加的记录

-

集群检查

-

redis-cli –cluster check 8.142.144.75:6381

-
-

注:可以进入任意一台主机

-
- -
+

这是一个携带cookies信息的get请求

{
"description": "这是一个带cookies信息的get请求",
"request": {
"uri": "/get/with/cookies",
"method": "get",
"cookies": {
"login": "true"
}
},
"response": {
"text": "这是一个需要携带cookies信息才能访问的get请求"
}
}
+

这是一个携带cookies信息的post请求

{
"description": "这是一个带cookies信息的post请求",
"request": {
"uri": "/post/with/cookies",
"method": "post",
"cookies": {
"login": "true"
},
"json": {
"name": "huhansan",
"age": "18"
}
},
"response": {
"status": 200,
"json": {
"huhansan": "success",
"status": "1"
}
}
}
-

主从容错切换迁移

-

主机宕机,从机自动切换成主机

-
]]>
工具教程 - docker + java
- docker 帮助启动类命令(一) - /posts/16766.html - docker 帮助启动类命令(一)

启动docker

-
-

systemctl start docker

-
-

停止docker

-
-

systemctl stop docker

-
-

查看docker状态

-
-

systemctl status docker

-
-

重启 docker,没有任何提示说明启动成功

-
-

systemctl restart docker

-
-]]>
+ 使用moko编写Get和Post测试接口(二) + /posts/10988.html + 上一节已经写了规则,这次直接来编写Get和Post请求

+

模拟一个没有参数的get请求

+
{
"description": "模拟一个没有参数的get请求",
"request": {
"uri": "/getdemo",
"method": "get"
},
"response": {
"text": "这是一个没有参数的get请求"
}
}
+

模拟一个带参数的请求

+
{
"description": "模拟一个带参数的请求",
"request": {
"uri": "getwithparam",
"method": "get",
"queries": {
"name": "胡汉三",
"age": "18"
}
},
"response": {
"text": "我胡汉三又回来了!!!!!"
}
}
+ +

模拟一个Post请求

+
{
"description": "模拟一个Post请求",
"request": {
"uri": "/postdemo",
"method": "post"
},
"response": {
"text": "这是我的第一个mosk的post请求"
}
}
+ +

这是一个带参数的post请求

+
{
"description": "这是一个带参数的post请求",
"request": {
"uri": "/postwithparam",
"method": "post",
"forms": {
"name": "胡汉三",
"sex": "男人"
}
},
"response": {
"text": "我胡汉三带着参数来了!!!!"
}
}
]]>
工具教程 - docker + java
- docker 帮助启动类命令(二) - /posts/53508.html - docker 帮助启动类命令(二)

docker 开机启动

-
-

systemctl enable docker

-
-

查看 docker 概要信息

-
-

docker info

-
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
scan: Docker Scan (Docker Inc., v0.12.0)

Server:
Containers: 6
Running: 0
Paused: 0
Stopped: 6
Images: 5
Server Version: 20.10.12
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.45.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 1.795GiB
Name: iZ8vbfaek3x3ogtpxnpnwfZ
ID: NQOP:KCP6:LS6G:K52A:XOQX:E7FG:FEHL:K3QX:NSLP:VY5S:TFX5:UR42
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://qp747t9w.mirror.aliyuncs.com/
Live Restore Enabled: false

- -

查看 docker 总体帮助文档

-
-

docker –help

-
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker --help

Usage: docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST
env var and default context set with "docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket(s) to connect to
-l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit

Management Commands:
app* Docker App (Docker Inc., v0.9.1-beta3)


查看 docker 命令帮助文档
> docker 具体命令 --help

```shell
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps --help

Usage: docker ps [OPTIONS]

List containers

Options:
-a, --all Show all containers (default shows just running)
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print containers using a Go template
-n, --last int Show n last created containers (includes all states) (default -1)
-l, --latest Show the latest created container (includes all states)
--no-trunc Don't truncate output
-q, --quiet Only display container IDs
-s, --size Display total file sizes
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

+ 使用moko编写重定向测试接口(四) + /posts/57578.html + 上一节已经写了规则,这次直接来编写Get和Post请求

+

重定向的测试接口

    +
  • 使用了redirectTo:目标地址
  • +
+
[
{
"description": "重定向到百度",
"request": {
"uri": "/redirect"
},
"redirectTo": "http://www.baidu.com"
},
{
"description": "重定向到自己的网页上",
"request": {
"uri": "/redirect/topath"
},
"redirectTo": "/redirect/new"
},
{
"description": "这是被重定到的请求",
"request": {
"uri": "/redirect/new"
},
"response": {
"text": "重定向成功了"
}
}
]
]]>
工具教程 - docker + java
- docker 镜像(一) - /posts/55605.html - 镜像(一)

查询本地主机上的镜像

-

docker images
OPTIONS说明:

+ 使用moko编写测试接口(一) + /posts/37984.html + 编写规则
    +
  • []包裹着以{}包起来的接口脚本

    +
  • +
  • description:接口简介

    +
  • +
  • request:使用{}包含接口的请求信息

      -
      • -
      • a 列出本地所有的镜像(含历史镜像)
      • +
      • uri:接口的地址名称
      • +
      • method:请求方法
      • +
      • queries:get请求参数
      • +
      • forms:post请求参数
      • +
      • headers:请求头信息
    • -
      • -
      • q 只显示镜像ID
      • +
      • response:返回的数据,使用{}

        +
          +
        • text:返回的文字数据
        • +
        • cookies:返回的cookie信息
        • +
        • status:返回的响应码
      -
-

举个栗子

[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
tomcat latest fb5657adc892 4 months ago 680MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
tomcat latest fb5657adc892 4 months ago 680MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
centos latest 5d0da3dc9764 7 months ago 231MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -q
b8e65a4d736d
fb5657adc892
feb5d9fea6a5
5d0da3dc9764
9b9cb95443b5
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

- -

查询镜像仓库是否有该镜像

-

docker search 镜像名称

-
-

举个栗子

STARS 点赞数
OFFICIAL 官方认证

-
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker search hello-world
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
hello-world Hello World! (an example of minimal Dockeriz… 1718 [OK]
kitematic/hello-world-nginx A light-weight nginx container that demonstr… 151
- -

显示前n条镜像

-

docker search –limit n 镜像名称

-
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker search --limit 5 redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 10851 [OK]
bitnami/redis Bitnami Redis Docker Image 214 [OK]
bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 36 [OK]
circleci/redis CircleCI images for Redis 12 [OK]
bitnami/redis-exporter 6
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

- -

下载安装镜像到本地

-

docker pull 镜像名称:标签版本号

-
-

没有tag就是最新版

-
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker pull redis:6.0.8
6.0.8: Pulling from library/redis
bb79b6b2107f: Pull complete
1ed3521a5dcb: Pull complete
5999b99cee8f: Pull complete
3f806f5245c9: Pull complete
f8a4497572b2: Pull complete
eafe3b6b8d06: Pull complete
Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
Status: Downloaded newer image for redis:6.0.8
docker.io/library/redis:6.0.8
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

-]]>
- - 工具教程 - - - docker - -
- - docker 镜像(二) - /posts/18767.html - 镜像(二)

查看 镜像/容器/数据 卷所占的空间

-

docker system df

-
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 6 3 1.173GB 921.1MB (78%)
Containers 6 0 4.517MB 4.517MB (100%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

- -

删除镜像

-

docker rmi 镜像ID

-
-
#### 如果提示报错
-Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 13111f725991
-
-说明之前运行过这个镜像,生成了容器,需要先删除容器,再删除镜像
-
-#### 使用 -f 删除一个
-> docker rmi -f 镜像id
-
-#### 使用 -f 删除多个
-> xxxxxxxxxx # 没有任何提示说明启动成功[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# systemctl restart docker[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#shell
-
-#### 使用 -f 删除全部
-> docker rmi -f $(docker images -qa)
-
-]]>
- - 工具教程 - - - docker - -
- - redis的4主4从缩容 - /posts/622.html - redis的4主4从缩容
目的:6387和6388下线
检查集群情况获得6388的节点ID
-

redis-cli –cluster check 8.142.144.75:6382

-
-
- -
- -
从集群中将4号从节点6388删除
-

redis-cli –cluster del-node ip:从机端口 从机6388节点ID

-
-
- -
- -
使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
- -
- -

6388删除成功

-
将6387的槽号清空,重新分配

本例将清出来的槽号都给6381

-

使用redis-cli --cluster reshard ip:6381进行节点的重组

-
- -
- -

注:

-

上图中1输入的4096是6387主机所拥有的槽点数量,把他们全部拿出来分掉

-

上图的2输入的ID是接收6387主机所放出的槽点数的主机id

-

上图中3输入的ID是放出槽点数的6387主机的id

-

上图中4输入的done指的是已经输入完所有的节点

-
使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
- -
- -
删除6387节点的主机
-

redis-cli –cluster del-node ip:端口 6387节点ID

-
-
- -
- -
使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
- -
]]>
+

举个栗子demo

+
[
{
"description": "这是我们的第一个mock栗子",
"request": {
"uri": "/demo"
},
"response": {
"text": "第一个mock响应demo"
}
}
]
+

get请求demo

+
[
{
"description": "接口的get请求",
"request": {
"uri": "/#/test/xml",
"method": "get"
},
"response": {
"text": "get请求接口"
}
}
]
]]> 工具教程 - docker + java
- redis的3主3从扩容 - /posts/51796.html - redis的3主3从扩容

首先添加两个redis

# 创建redis-node-7
docler run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
# 创建redis-node-8
docler run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
- -

注:在阿里云的安全组和防火墙上添加6387,16387 6388,16388四个端口

-

配置步骤:

执行docker exec -it redis-node-1 bash 进入redis-node-1里面
执行redis-cli --cluster add-node 8.142.144.75:6387 8.142.144.75:6381
- -
- - - -

6387 新加入的节点

-

6381 相当于6387的领路人

-
使用redis-cli --cluster check 8.142.144.75:6381检查
- -
- -
重新分配槽号
-

redis-cli –cluster reshard IP地址:端口号

-
-
- -
- -

注:上图的1指的是:对主机数平分16384个节点,16384/主机数(包含想要添加的主机)

-

注:上图的2指的是:新加入的6387节点的ID

-
- -
- -

all:表示全部进行重新分配

-

在重新加载过程会碰到Do you want to proceed with the proposed reshard plan (yes/no)?一句话,选择yes就可以

-
- -
- -
检查集群情况
- -
- -
为主节点6387分配从节点6388
-

redis-cli –cluster add-node ip:新slave端口 ip:新master端口 –cluster-slave –cluster-master-id 新主机节点ID

-
-
- -
- -
检查集群情况
- -
-]]>
+ 使用moko编写测试接口(五) + /posts/42012.html + 下载jar包

点击moke选择版本进行下载,我下载的的是moco-runner-0.11.0-standalone.jar

+

使用命令启动测试脚本

java -jar jar包的存放路径 http -p 端口 -c json文件路径
]]>
工具教程 - docker + java
- 使用docker安装常用软件:mysql - /posts/58312.html - 使用docker安装常用软件:mysql

以mysql 5.7为例

使用docker pull mysql:5.7拉取mysql 5.7镜像

-

使用镜像创建容器

简单版

使用docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7运行镜像创建容器

-
-

因为linux系统自己装了mysql,避免端口冲突,先运行ps -ef|grep mysql查询

-
-

使用docker ps查询容器编号

-

使用docker exec -it 容器编号 bash进入mysql容器

-

使用mysql -uroot -p,输入密码,登录mysql

-
验证

show databases

-
mysql> show databases
-> ;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
- -
中文乱码问题
INSERT INTo t1 VALUES(3, "张三");
---
INSERT INTo t1 VALUES(3, "张三")
> 1366 - Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1
> 时间: 0.038s
- -

因为docker默认编码字符集隐患

-
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql>
- -

解决中文乱码问题

在宿主机的/ggls/mysql/conf目录下vim my.cnf文件,通过容器卷同步给容器实例

-
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
- -

改完后重启mysql实例

-
服务器输入SHOW VARIABLES LIKE 'character%';验证

docker安装好并run出容器后,先修改字符集编码在创建mysql库

-
删库备份问题

只要本机上面的容器卷存在,容器卷位置没有改变的情况下,就算容器被删除,重新打开后,创建的数据库,表都还存在

-

工作使用版启动容器方法

-
docker run -d -p 3306:3306 --privileged=true
-v /ggls/mysql/log:/var/log/mysql
-v /ggls/mysql/data:/var/lib/mysql
-v /ggls/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=123456
--name mysql
mysql:5.7
+ 使用Java解析Properties文件 + /posts/50581.html + 主要函数 + + + + + + + + + + + + + + + + + + + + + + +
文件后缀函数方法
.Propertiesload加载文件
setProperty设置
getProperty获取
+

编写逻辑

创建加载文件的方法

+
/**
* 加载文件
* @return Properties 对象
* @throws IOException I/O输入异常
*/
private Properties readProperties() throws IOException{
// 实例化,创建 Properties 对象
Properties properties = new Properties();
try {
// 创建文件输入对象 FileInputStream("testpro.properties")
InputStream inputStream = new FileInputStream(filepath);
// 把文件输入对象放入缓存输入对象 new BufferedInputStream 里面
BufferedInputStream in = new BufferedInputStream(inputStream);
// 加载文件 in = ParseProperties.class.getResourceAsStream("testpro.properties"),自动获取 resources 文件夹下路径
properties.load(in);
}catch (IOException e){
e.printStackTrace();
}
return properties;
}
+

获取key后面的数据

+
/**
* 获取数据
* @param key 数据名称
* @return 数据等号右边的值
* @throws Exception 异常
*/
public String getPro(String key) throws Exception {
// 判断文件里面有没有这个 Key
if (prop.containsKey(key)) {
// 获得key后面的value值
return prop.getProperty(key);
}else {
System.out.println("你获取的key值不对");
return "";
}
}
+

获取定位类型或者定位表达式

+
/**
* 返回定位类型或者定位表达式
* @param key 数据名称
* @param num 输入0/1
* @return num=0时,返回定位类型,num=1时,返回定位表达式
*/
public String get_pro_element(String key, int num){
return (num!=0 & num!=1) ? "num:参数输入错误" : prop.getProperty(key).split("->")[num];
}
]]>
工具教程 - docker + java + Properties
- 容器数据卷 - /posts/1351.html - 容器数据卷

运行带有容器数据卷的容器实例

docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
- -

举个栗子

-

宿主vs容器之间映射添加容器卷

-
-
    -
  • 使用docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 添加
  • -
-
docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=ui ubuntu
- -
    -
  • 查看数据卷是否挂载成功
  • -
-
`在容器内部创建一个dockerin.txt文件
root@48955acecd79:/tmp/docker_data# touch dockerin.txt
root@48955acecd79:/tmp/docker_data# ll
total 8
drwxr-xr-x 2 root root 4096 Apr 28 09:21 ./
drwxrwxrwt 1 root root 4096 Apr 28 09:18 ../
-rw-r--r-- 1 root root 0 Apr 28 09:21 dockerin.txt
`在宿主机目录下查看该文件
root@48955acecd79:/tmp/docker_data# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /tmp/host_data/
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# ll
total 0
-rw-r--r-- 1 root root 0 Apr 28 17:21 dockerin.txt
`在宿主机创建一个文件
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# touch host.txt

`在容器查看文件
[root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# docker exec -it 48955acecd79 bash
root@48955acecd79:/# cd /tmp/docker_data/

+ 容器和宿主机之间数据共享

[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell

+ 主机修改,docker同步获得

+ docker容器stop,主机修改,docker容器重启数据同步

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d

+ 默认是可读可写的

```shell
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
- - - -
    -
  • 修改成容器只读
  • -
-
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
- -
-

卷的继承和共享

-
-
    -
  • 容器1完成和宿主机的映射
      -
    • 容器2继承容器1,则容器2操作后同步到容器1和宿主机
    • -
    • 宿主机操作同步到容器1,容器2
    • -
    • 容器1操作同步到宿主机,容器2
    • -
    -
  • + 包装类 + /posts/16468.html + +
  • 基本数据类型对应的包装类
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
基本数据类型包装类大小(字节)
byteByte1–(-128~127)
shortShort2–(-32768~32767)
intInteger4
longLong8
floatFloat4
doubleDouble8
charCharacter2
booleanBoolean1
+

包装类方法

    +
  • Integer的作用主要是对int、Integer、String几种类型的数据进行转换,还能获取一些常量
  • +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
方法描述
compareTo()用于将对象与方法的参数进行比较(相同类型)
decode()将方法的参数转为包装类对象
equals()判断对象是否与参数相等
Integer.parseInt(“字符串’)将字符串转为Int类型
Integer.toString(int数据)将Int类型转为字符串
+

compareTo()方法

    +
  • 如果指定的数与参数相等返回 0。
  • +
  • 如果指定的数小于参数返回 -1。
  • +
  • 如果指定的数大于参数返回 1。
-
docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
- - - -]]>
- - 工具教程 - - - docker - -
- - 使用docker安装常用软件:redis - /posts/32161.html - 使用docker安装常用软件:redis

使用docker pull redis:6.0.8 拉取redis:6.0.8镜像

-

创建容器

-
-

容器卷要加入--privileged=true

-
-

在宿主机下新建目录mkdir -p /app/redis

]]>
工具教程 - docker + java
- 使用docker安装常用软件:tomcat - /posts/50699.html - 使用docker安装常用软件:tomcat

安装流程

首先把tomcat在镜像源中pull下来,使用docker images 查看镜像

-

使用docker run -d -p 8080:8080 tomcat:9.0 新建容器运行tomcat

-
-

运行后使用本地PC使用阿里云的ip和端口访问docker上面的tomcat

-
-
- -
- - - -

这是什么原因呢

使用docker ps查询到容器编号,docker exec -it 容器编号 bash 打开容器

-
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c52ab6b8b8df b8e65a4d736d "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp inspiring_bohr
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker exec -it c52ab6b8b8df bash
root@c52ab6b8b8df:/usr/local/tomcat#
- -

使用ls-l查看文件列表

-
root@c52ab6b8b8df:/usr/local/tomcat# ls -l
total 156
-rw-r--r-- 1 root root 18970 Dec 2 14:30 BUILDING.txt
-rw-r--r-- 1 root root 6210 Dec 2 14:30 CONTRIBUTING.md
-rw-r--r-- 1 root root 57092 Dec 2 14:30 LICENSE
-rw-r--r-- 1 root root 2333 Dec 2 14:30 NOTICE
-rw-r--r-- 1 root root 3378 Dec 2 14:30 README.md
-rw-r--r-- 1 root root 6898 Dec 2 14:30 RELEASE-NOTES
-rw-r--r-- 1 root root 16507 Dec 2 14:30 RUNNING.txt
drwxr-xr-x 2 root root 4096 Dec 22 17:16 bin
drwxr-xr-x 1 root root 4096 Apr 29 01:48 conf
drwxr-xr-x 2 root root 4096 Dec 22 17:16 lib
drwxrwxrwx 1 root root 4096 Apr 29 01:48 logs
drwxr-xr-x 2 root root 4096 Dec 22 17:16 native-jni-lib
drwxrwxrwx 2 root root 4096 Dec 22 17:16 temp
drwxr-xr-x 2 root root 4096 Dec 22 17:16 webapps
drwxr-xr-x 7 root root 4096 Dec 2 14:30 webapps.dist
drwxrwxrwx 2 root root 4096 Dec 2 14:30 work
root@c52ab6b8b8df:/usr/local/tomcat#
- -

从列表可以看到有两个文件夹webappswebapps.dist,数据全部在webapps.dist里面,需要将webapps删除,把webapps.dist重命名成webapps即可访问

-

使用rm -rf webapps删除webapps文件夹

-

使用mv webapps.dist webapps 重命名

-

再次使用本地访问

-
- -
- - -

使用免修改版的tomcat

-

docker pull billygoo/tomcat8-jdk8

-

docker run -d -p 8080:8080 –name tomcat8 billygoo/tomcat8-jdk8

-
+ 字符串 + /posts/47564.html + 字符串的方法 + + + + + + + + + + + + + + + + + + + + + + + + + + +
方法描述
str.concat()将参数拼接到字符串上
trim()去除字符串两端的字符串,不能去除中间
replace(oldChar, newChar)将字符串的old参数替换为new参数
length()返回此字符串的长度
isEmpty()判断字符串是否为空
+

concat()方法

    +
  • 返回字符串类型
  • +
  • 字符串在后面拼接
    String str = "床前明月光";
    String str1 = str.concat("疑是地上霜。");
    System.out.println(str1);
  • +
+

trim()方法

String str = "    床  前明   月光   ";
String str1 = str.trim();
System.out.println(str1);
+

replace(oldChar, newChar)方法

String str = "床前明月光";
String str1 = str.replace("床", "llll");
System.out.println(str1);
+

length()方法

    +
  • 返回int类型
    String str = "床前明月光";
    int str1 = str.length();
    System.out.println(str1);
  • +
+

isEmpty()方法

    +
  • 返回布尔类型
    String str = "床前明月光";
    boolean str1 = str.isEmpty();
    System.out.println(str1);
  • +
]]>
工具教程 - docker + java
- 容器(一) - /posts/26726.html - 容器(一)

新建和启动容器

OPTIONS说明:

    -
  • – name = “容器新名称” 为容器制定一个名称
  • -
  • -d 后台运行容器并返回容器id, 即启动守护式容器(后台运行)
  • -
  • -i 以交互模式运行容器,通常与 -t 同时使用
  • -
  • -t 为容器重新分配一个伪输入终端,通常与 -i 连用,也就是启动交互式容器
  • -
  • -P 随机端口映射
  • -
  • -p 指定端口映射
  • -
-

举个栗子

[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 9.0 b8e65a4d736d 4 months ago 680MB
redis 6.0.8 16ecd2772934 18 months ago 104MB
ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu:15.10 /bin/bash
root@4fb757f69adb:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 03:26 pts/0 00:00:00 /bin/bash
root 11 1 0 03:26 pts/0 00:00:00 ps -ef
root@4fb757f69adb:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4fb757f69adb:/# exit
exit
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
-

docker run -it ubuntu:15.10 /bin/bash
/bin/bash 希望有交互式shell 就用/bin/bash

-

查询正在运行的容器

-

docker ps [OPTIONS]

-
-
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cdee90a8c77d ubuntu "bash" 3 minutes ago Exited (0) 3 minutes ago ubuntu
0dcaa91afc0e ubuntu "/bin/bush" 5 minutes ago Created myubuntu
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
-

OPTIONS:

+ 抽象类与接口 + /posts/34655.html + 抽象类

使用abstract修饰一个类,把这个类变成抽象类,抽象类不能直接创建对象,需要其他类进行继承该抽象类

    -
  • -a 展示所有容器,包含历史用过容器
  • -
  • -d 只展示容器id
  • -
  • -l 显示最近创建的容器
  • -
  • -n 展示最近创建的前n个容器
    List containers
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -n 1
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 1
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 2
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
    0dcaa91afc0e ubuntu "/bin/bush" 19 minutes ago Created myubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

  • -
-

退出容器

    -
  • exit
  • +
  • 抽象方法不能有方法体
  • +
  • 抽象方法必须使用abstract进行修饰,不能有方法体
  • +
  • 子类必须实现父抽象类的方法
    public abstract class Ahsse {
    String name;
    int age;

    //普通方法
    public String aaa(){
    return name;
    };
    // 抽象方法
    public abstract String bbb();
    }

    class sss extends Ahsse{

    @Override
    public String bbb() {
    System.out.println("实现抽象类的抽象方法");
    return "ces ";
    }
    }
-

run进入容器,exit退出容器, 容器停止

+

接口

使用interface定义接口,相当于class

    -
  • ctrl + p + q
  • +
  • 接口可以多继承
  • +
  • 变量全部默认使用public static final修饰,使用之前必须赋值
  • +
  • 类里面全部是抽象方法(默认使用public abstract修饰,没有方法体)需要被实现类进行实现
  • +
  • 接口可以被多实现–implements
-

run进入容器,exit退出容器, 容器不停止

-
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu bash
root@562278524cda:/# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
[root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
562278524cda ubuntu "bash" 16 seconds ago Up 15 seconds loving_dewdney
]]>
工具教程 - docker + java
- 本地镜像发布到私有库 - /posts/42395.html - 本地镜像发布到私有库
-

步骤

-
-
    -
  • 下载Docker Registry
  • -
-
docker pull registry
- + 继承、重写与重载 + /posts/55332.html + 继承

继承是相对于类来说,通过关键字extends来实现

    -
  • 运行私有库 Registry,相当于本地有Docker Registry
  • +
  • 可以获取父类的属性和方法
  • +
  • 提高代码的复用性
  • +
  • 父类修改了内容,子类也会修改
-
docker run -d -p 5000:5000 -v/ggls/myregistry/:/tmp/registry --privileged=true registry
- -
    -
  • 新启动ubuntu容器,新增ifconfig命令

    +

    调用

    父类的属性和方法

      -
    • ​ 进入容器中输入apt-get update命令
    • -
    • ​ 输入apt-get install net-tools命令
    • -
    • xxxxxxxxxx [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker psCONTAINER ID   IMAGE               COMMAND   CREATED       STATUS       PORTS     NAMES356e32244966   mytest/ubuntu:3.5   “bash”    2 hours ago   Up 2 hours             elated_aryabhata[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m=”vim cmd add ok” -a=”ggls” 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker imagesREPOSITORY     TAG       IMAGE ID       CREATED         SIZEggls/ubuntu     1.5       87e99e19eeef   7 seconds ago   176MBmytest/ubuntu   3.5       a92a27affdde   2 hours ago     72.8MBtomcat          9.0       b8e65a4d736d   4 months ago   680MBubuntu         latest   ba6acccedd29   6 months ago    72.8MBredis           6.0.8     16ecd2772934   18 months ago   104MB[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell
    • +
    • this表示当前对象的引用
    • +
    • super表示父类对象的引用
    • +
    • 调用构造方法
        +
      • this(参数列表)表示调用当前类中的构造方法
      • +
      • super(参数列表)表示调用父类的构造方法,必须放在方法中的第一行
    • -
    • 容器外部执行docker commit -m="ifconfig cmd add" -a="ggls" ffcc5edf5071 ubuntu:1.6命令

      +
    • 调用属性
        +
      • this.属性表示调用当前对象的属性
      • +
      • super.属性表示调用父类的属性,可以拿到被重写之前的数据
      • +
    • -
    • curl验证私服库上有什么镜像

      +
    • 调用方法
        +
      • this.方法表示调用当前对象的方法
      • +
      • super.方法表示调用父类的方法,可以拿到被重写之前的方法,不用放在代码的第一行
      • +
    -
    curl -XGET http://8.142.144.75:5000/v2/_catalog
    - -
      -
    • 将新镜像修改为符合私服库格式的镜像
    • -
    -
    docker tag 镜像:Tag Host:Port/Repository:Tag
    #
    docker tag ubuntu:1.6 8.142.144.75:5000/ubuntu:1.3
    - -
      -
    • 修改配置文件使之支持http

      -
      -

      docker 默认不允许http方式推送镜像,通过此配置取消这个限制,若不生效,重启docker

      -
      -
        -
      • 使用命令vim /etc/docker/daemon.json打开配置文件
      • -
      • 在阿里云加速后面新增一个json
      • -
      -
      {
      "registry-mirrors": ["https://qp747t9w.mirror.aliyuncs.com"],
      "insecure-registries": ["8.142.144.75:5000"]
      }
      - +

      重写

      重写是子类可以重写父类的方法,使用override标识

        -
      • 重启docker,重启docker私服仓库
      • -
      -
    • -
    • push推送到私服库

      -
    • +
    • 方法名和参数不变,只修改方法体
    • +
    • 访问权限不能比父类的范围更小
    • +
    • 私有的方法能被子类继承,但不能使用和重写
    • +
    • 静态的方法能被子类继承,能使用但不能被重写
      public class testeass {

      public void aa(String name, int age){
      System.out.println(name + age);
      }
      }

      class testaaa extends testeass{

      @Override
      public void aa(String name, int age) {
      System.out.println("这是重写方法,方法名、参数和返回数据都不变,只能修改方法体");
      System.out.println(name + age);
      }
      }
    -
    docker push 符合私服库格式的镜像名称:tag
    - +

    重载

    重载是同一个类下对方法进行重载

      -
    • curl验证私服库上有什么镜像
    • -
    • pull到本地并运行
    • -
    -
    docker pull 8.142.144.75:5000/ubuntu:1.6
    - - - -]]> - - 工具教程 - - - docker - - - - 容器(二) - /posts/63516.html - 容器(二)

    启动已经停止运行的容器

    -

    docker start 容器id/容器名

    -
    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
    9a1a43aee837 ubuntu "bush" 4 minutes ago Created admiring_wiles
    cdee90a8c77d ubuntu "bash" 29 minutes ago Exited (0) 29 minutes ago ubuntu
    0dcaa91afc0e ubuntu "/bin/bush" 31 minutes ago Created myubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker start cdee90a8c77d
    cdee90a8c77d
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    562278524cda ubuntu "bash" 5 minutes ago Up 5 minutes loving_dewdney
    cdee90a8c77d ubuntu "bash" 30 minutes ago Up 3 seconds ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
    - -

    重启容器

    -

    docker restart 容器id/容器名

    -
    -

    停止容器

    -

    docker stop 容器id/容器名

    -
    -

    强制停止容器

    -

    docker kill 容器id/容器名

    -
    -

    删除已经停止的容器

    -

    docker rm 容器id

    -
    -

    一次性删除多个容器

      -
    • docker rm -f $(docker ps -a -q)
    • -
    • docker ps -a -q | xargs docker rm
    • +
    • 方法名相同,参数不相同 (参数个数不同/参数类型不同/参数排列顺序不同)
    • +
    • 返回类型不限制
      public class jichu {

      // 原方法
      public void hello(String name, int aa){
      System.out.println("拼接起来的值是:"+ name + aa );
      }

      // 重载后的方法
      public void hello(int aa, String name){
      System.out.println("aaaaaaa:" + aa);
      }
      }
    -

    注:xargs是linux系统的可变参数,把分隔符前面的结果传给xargs里面,然后执行分隔符后面的命令

    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    562278524cda ubuntu "bash" 20 minutes ago Up 20 minutes loving_dewdney
    cdee90a8c77d ubuntu "bash" 45 minutes ago Up 15 minutes ubuntu
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f
    562278524cda
    cdee90a8c77d
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

    ]]>
    工具教程 - docker + java
    - 本地镜像发布到阿里云 - /posts/25343.html - 本地镜像发布到阿里云
    -

    使用docker进行对docker镜像功能的新增后,需要发布到阿里云上对镜像进行同步,下次pull镜像就不要pull缩减版的镜像,直接pull更新后的镜像,方便后续使用

    -

    执行顺序

      -
    • 阿里云开发者平台
    • -
    • 点击镜像容器服务
    • -
    • 创建镜像仓库
        -
      • 创建命名空间
      • -
      • 创建镜像仓库
      • -
      -
    • -
    -

    然后在基本信息上面就可以看到仓库指南

    -
    -

    根据指南进行操作

    + _3主3从的`Redis集群`搭建(下) + /posts/36554.html + _3主3从的Redis集群搭建(下)

    进入主机6381

    +

    redis-cli -p 6381

    - -
    - -
    - +
    +

    查看集群信息

    +

    cluster info

    +
    - +
    -]]>
    - - 工具教程 - - - docker - - - - 镜像 - /posts/55045.html - 镜像

    背景

    docker镜像是最小的,被精简过的Linux系统,是不带vim命令的

    -
    -

    使用命令 ‘vim a.txt’ 进行新建编辑a.txt文件,就会提示找不到命令

    -
    -

    给镜像容器新增vim命令

      -
    1. 更新镜像

      -
      -

      apt-get update

      -
      -
    2. -
    3. 下载vim功能

      -
      -

      apt-get -y install vim

      -
      -
    4. -
    5. 提交副本使成为一个新镜像

      -
      -

      docker commit -m=”提交的描述信息” -a=”作者” 容器id 要创建的目标镜像名:[标签名]

      -
      -
    6. -
    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    356e32244966 mytest/ubuntu:3.5 "bash" 2 hours ago Up 2 hours elated_aryabhata
    [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
    [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5
    sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16
    [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ggls/ubuntu 1.5 87e99e19eeef 7 seconds ago 176MB
    mytest/ubuntu 3.5 a92a27affdde 2 hours ago 72.8MB
    tomcat 9.0 b8e65a4d736d 4 months ago 680MB
    ubuntu latest ba6acccedd29 6 months ago 72.8MB
    redis 6.0.8 16ecd2772934 18 months ago 104MB
    [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
    -]]>
    - - 工具教程 - - - docker - -
    - - 容器(三) - /posts/62565.html - 容器(三)

    创建后台守护式容器

    (问题):使用docker run -d ubuntu命令启动后台模式的容器ubuntu,然后用docker ps 查询提示没有找到运行的容器

    -
    -

    Docker容器后台运行就必须有一个前台进程,不然容器没事做,会自杀

    -
    -

    解决方法:将运行的程序以前台进程的方式运行
    常见方式:命令行模式

    -

    查看容器日志

    -

    docker logs 容器id

    -
    -

    查看容器的进程

    -

    docker top 容器id

    -
    -

    查看容器内部细节

    -

    docker inspect 容器id

    -
    -

    重新进入

      -
    • 进入正在运行的容器并以命令行交互

      -
      -

      docker exec -it 容器id bashShell

      -
      -
    • -
    • 重新进入

      -
      -

      docker attach 容器id

      -
      -
    • -
    -

    (区别)
    attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
    exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAME
    S562278524cda   ubuntu    "bash"    20 minutes ago   Up 20 minutes             loving_dewdn
    eycdee90a8c77d   ubuntu    "bash"    45 minutes ago   Up 15 minutes             ubuntu

    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
    CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES

    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#​shell
    -

    从容器内拷贝文件到主机

    -

    docker cp 容器id:容器地址 主机地址

    -
    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker cp 26191ecfb227:/tmp/a.txt /opt/ab.txt
    [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /opt/
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
    total 8
    -rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
    drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
    drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

    -

    导入和导出容器

      -
    • export 导出容器的内容留作为一个tar归档文件[对应import命令]

      -
      -

      docker export 容器id > 自定义文件名.tar

      -
      -
    • -
    • import从tar包中的内容创建一个新的文件系统再导入为镜像[export]

      +

      查看主机和从机之间的主从关系

      -

      cat 文件名.tar | docker import - 自定义/镜像名:3.5(3.5是自定义)

      +

      cluster nodes

      -
    • -
    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    26191ecfb227 ubuntu "bash" 7 minutes ago Up 7 minutes quirky_jemison
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker export 26191ecfb227 > abcd.tar
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
    total 73408
    -rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
    -rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
    drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
    drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

    -
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
    total 73408
    -rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
    -rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
    drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
    drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# cat abcd.tar | docker import - mytest/ubuntu:3.5
    sha256:a92a27affdde8ad7f07bef2fdc0f04b8e3aeacb9d6919a77da2921d552ab940b
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    mytest/ubuntu 3.5 a92a27affdde 11 seconds ago 72.8MB
    tomcat 9.0 b8e65a4d736d 4 months ago 680MB
    ubuntu latest ba6acccedd29 6 months ago 72.8MB
    redis 6.0.8 16ecd2772934 18 months ago 104MB
    [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker run -it mytest/ubuntu:3.5 bash
    root@356e32244966:/#
    root@356e32244966:/# cd /tmp/
    root@356e32244966:/tmp# ll
    total 8
    drwxrwxrwt 2 root root 4096 Apr 27 07:13 ./
    drwxr-xr-x 1 root root 4096 Apr 27 07:32 ../
    -rw-r--r-- 1 root root 0 Apr 27 07:13 a.txt
    root@356e32244966:/tmp#

    ]]>
    - - 工具教程 - - - docker - -
    - - 使用Java解析Properties文件 - /posts/50581.html - 主要函数 - - - - - - - - - - - - - - - - - - - - - - -
    文件后缀函数方法
    .Propertiesload加载文件
    setProperty设置
    getProperty获取
    -

    编写逻辑

    创建加载文件的方法

    -
    /**
    * 加载文件
    * @return Properties 对象
    * @throws IOException I/O输入异常
    */
    private Properties readProperties() throws IOException{
    // 实例化,创建 Properties 对象
    Properties properties = new Properties();
    try {
    // 创建文件输入对象 FileInputStream("testpro.properties")
    InputStream inputStream = new FileInputStream(filepath);
    // 把文件输入对象放入缓存输入对象 new BufferedInputStream 里面
    BufferedInputStream in = new BufferedInputStream(inputStream);
    // 加载文件 in = ParseProperties.class.getResourceAsStream("testpro.properties"),自动获取 resources 文件夹下路径
    properties.load(in);
    }catch (IOException e){
    e.printStackTrace();
    }
    return properties;
    }
    - -

    获取key后面的数据

    -
    /**
    * 获取数据
    * @param key 数据名称
    * @return 数据等号右边的值
    * @throws Exception 异常
    */
    public String getPro(String key) throws Exception {
    // 判断文件里面有没有这个 Key
    if (prop.containsKey(key)) {
    // 获得key后面的value值
    return prop.getProperty(key);
    }else {
    System.out.println("你获取的key值不对");
    return "";
    }
    }
    +

    image-20220509101455220

    +
    + +
    -

    获取定位类型或者定位表达式

    -
    /**
    * 返回定位类型或者定位表达式
    * @param key 数据名称
    * @param num 输入0/1
    * @return num=0时,返回定位类型,num=1时,返回定位表达式
    */
    public String get_pro_element(String key, int num){
    return (num!=0 & num!=1) ? "num:参数输入错误" : prop.getProperty(key).split("->")[num];
    }
    ]]>
    工具教程 - java - Properties + docker
    @@ -1378,670 +925,1362 @@ Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be for - 包装类 - /posts/16468.html - -
  • 基本数据类型对应的包装类
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
基本数据类型包装类大小(字节)
byteByte1–(-128~127)
shortShort2–(-32768~32767)
intInteger4
longLong8
floatFloat4
doubleDouble8
charCharacter2
booleanBoolean1
-

包装类方法

    -
  • Integer的作用主要是对int、Integer、String几种类型的数据进行转换,还能获取一些常量
  • -
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
方法描述
compareTo()用于将对象与方法的参数进行比较(相同类型)
decode()将方法的参数转为包装类对象
equals()判断对象是否与参数相等
Integer.parseInt(“字符串’)将字符串转为Int类型
Integer.toString(int数据)将Int类型转为字符串
-

compareTo()方法

    -
  • 如果指定的数与参数相等返回 0。
  • -
  • 如果指定的数小于参数返回 -1。
  • -
  • 如果指定的数大于参数返回 1。
  • -
-]]>
+ _3主3从的`Redis集群`搭建之哈希槽算法 + /posts/53299.html + _3主3从的Redis集群搭建之哈希槽算法

目的

解决一致性哈希算法数据倾斜问题

+

实质

是一个数组,数组[0,2^14-1]形成hash slot空间

+

作用

解决均匀分配问题,在数据和节点之间加入一层(哈希槽slot)用于管理数据和节点之间的关系,现在相当于节点里放槽,槽里放数据

+
+ +
+ +

方便数据移动

+

哈希解决的映射问题,使用key的哈希值来计算所在的槽,便于数据分配

+

多少个hash槽

一个集群只能有16384个槽,编号0-16383(0-2^14-1)

+

这些槽会分配给集群中的所有主节点,分配策略没有要求。可以指定哪些编号的槽分配给哪个主节点。集群会记录节点和槽的对应关系。

+

接下来就需要对key求哈希值,然后对16384取余,余数是几key就落入对应的槽里。slot = CRC16(key) % 16384

+

以槽为单位移动数据,因为槽的数目是固定的,处理起来比较容易,这样数据移动问题就解决了。

+

举个栗子

Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。如下代码,key之A 、B在Node2, key之C落在Node3上

+

首先有几个redis就把0-16383分成几个

+
+ +
]]>
工具教程 - java + docker
- 字符串 - /posts/47564.html - 字符串的方法 - - - - - - - - - - - - - - - - - - - - - - - - - - -
方法描述
str.concat()将参数拼接到字符串上
trim()去除字符串两端的字符串,不能去除中间
replace(oldChar, newChar)将字符串的old参数替换为new参数
length()返回此字符串的长度
isEmpty()判断字符串是否为空
-

concat()方法

    -
  • 返回字符串类型
  • -
  • 字符串在后面拼接
    String str = "床前明月光";
    String str1 = str.concat("疑是地上霜。");
    System.out.println(str1);
  • -
-

trim()方法

String str = "    床  前明   月光   ";
String str1 = str.trim();
System.out.println(str1);
-

replace(oldChar, newChar)方法

String str = "床前明月光";
String str1 = str.replace("床", "llll");
System.out.println(str1);
-

length()方法

    -
  • 返回int类型
    String str = "床前明月光";
    int str1 = str.length();
    System.out.println(str1);
  • + _3主3从的`Redis集群`搭建(上) + /posts/7883.html + _3主3从的Redis集群搭建(上)
      +
    • 关闭防火墙,启动docker
    • +
    • 新建6个docker容器docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
        +
      • docker run 创建并运行docker容器实例
      • +
      • –name redis-node-6 容器名字
      • +
      • –net host 使用宿主机的IP和端口,默认
      • +
      • –privileged=true 获取宿主机root用户权限
      • +
      • -v /data/redis/share/redis-node-6:/data 容器卷,宿主机地址:docker内部地址
      • +
      • redis:6.0.8 redis镜像和版本号
      • +
      • –cluster-enabled yes 开启redis集群
      • +
      • –appendonly yes 开启持久化
      • +
      • –port 6386 redis端口号
      -

      isEmpty()方法

        -
      • 返回布尔类型
        String str = "床前明月光";
        boolean str1 = str.isEmpty();
        System.out.println(str1);
      • +
      -]]> - - 工具教程 - - - java - - - - 抽象类与接口 - /posts/34655.html - 抽象类

      使用abstract修饰一个类,把这个类变成抽象类,抽象类不能直接创建对象,需要其他类进行继承该抽象类

      +
      docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
      docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
      docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
      docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
      docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
      docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
      + +

      运行成功,使用docker ps查看

        -
      • 抽象方法不能有方法体
      • -
      • 抽象方法必须使用abstract进行修饰,不能有方法体
      • -
      • 子类必须实现父抽象类的方法
        public abstract class Ahsse {
        String name;
        int age;

        //普通方法
        public String aaa(){
        return name;
        };
        // 抽象方法
        public abstract String bbb();
        }

        class sss extends Ahsse{

        @Override
        public String bbb() {
        System.out.println("实现抽象类的抽象方法");
        return "ces ";
        }
        }
      • +
      • 进入容器redis-node-1并为6台机器构建集群关系

        +
          +
        • 进入一台redis进行配置docker exec -it redis-node-1 bash

          +
        • +
        • #进入后执行
          +redis-cli --cluster create 8.142.144.75:6381 8.142.144.75:6382 8.142.144.75:6383 8.142.144.75:6384 8.142.144.75:6385 8.142.144.75:6386 --cluster-replicas 1
          +
          + --cluster create	构建集群
          + --cluster-replicas 1	集群关联一比一的关系
          + 
          +--cluster-replicas 1 表示为每个master创建一个slave节点
          +# 注意:上面的ip为真实IP
          +
          +
        -

        接口

        使用interface定义接口,相当于class

        +

        有下面的绿色ok字样显示运行成功

        +
      • +
      +
      + +
      + +
      +

      如果运行不成功,一直显示Waiting for the cluster to join.. 一直………………………………….,则是端口没有全部开放,防火墙也要开放端口,以阿里云为例

      +
      +

      就是需要在安全组上面配置63816386的6个端口,还需要配置1638116386的6个端口,共12个端口都要开放,不然会一直提示等待

        -
      • 接口可以多继承
      • -
      • 变量全部默认使用public static final修饰,使用之前必须赋值
      • -
      • 类里面全部是抽象方法(默认使用public abstract修饰,没有方法体)需要被实现类进行实现
      • -
      • 接口可以被多实现–implements
      • +
      • 一切OK的话,3主3从搭建搞定
      ]]>
      工具教程 - java + docker
      - 使用pip install报错的解决办法 - /posts/4851.html - 报错提示

      今天使用PyCharm下载一个模块pip.exe install locust,有错误提示

      -
      https://visualstudio.microsoft.com/visual-cpp-build-tools/
      [end of output]

      note: This error originates from a subprocess, and is likely not a problem with pip.
      // 报错位置
      ERROR: Failed building wheel for psutil

      ERROR: Could not build wheels for psutil, which is required to install pyproject.toml-based projects
      WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
      WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
      WARNING: Ignoring invalid distribution -ip (d:\work software\python3.8\lib\site-packages)
      -

      原因

      -

      缺少对应的whl文件

      + _主从容错切换迁移 + /posts/58353.html + _主从容错切换迁移

      进入redis集群

      +

      注意:进入集群环境后,不能使用单机版的redis-cli -p 6381

      +
      +

      因为这样会在增加数据时有error报错出现

      +
      + +
      + + +

      使用set k1 v1错误是因为1号主机里面的编号是0到5460,超过了这个范围就会报错

      +
      +

      正确进入的方法redis-cli -p 6381 -c

      +

      -c 的作用是优化路由

      +
      +
      + +
      + + +

      注:FLUSHALL:作用是清除之前添加的记录

      +

      集群检查

      +

      redis-cli –cluster check 8.142.144.75:6381

      +
      +

      注:可以进入任意一台主机

      +
      + +
      + + +

      主从容错切换迁移

      +

      主机宕机,从机自动切换成主机

      -

      解决办法

      碰到了这个错误ERROR: Failed building wheel for psutil,就需要下载psutil.whl

      -

      下载网站点击进入网站

      -

      下载psutil-5.9.0-cp38-cp38-win_amd64.whl文件

      -

      然后使用(pip install 文件的绝对路径)进行安装,然后使用pip.exe install locust正常安装

      -

      pip.exe install D:\Appium\psutil-5.9.0-cp38-cp38-win_amd64.whl

      pip.exe install locust

      ]]>
      - 经验分享 + 工具教程 - error + docker - git提示Timed out的解决办法 - /posts/53812.html - 报错代码

      运行git代码会提示Timed out错误

      -
      使用git,会发生报错:Failed to connect to github.com port 443 after 21098 ms: Timed out
      + docker 帮助启动类命令(一) + /posts/16766.html + docker 帮助启动类命令(一)

      启动docker

      +
      +

      systemctl start docker

      +
      +

      停止docker

      +
      +

      systemctl stop docker

      +
      +

      查看docker状态

      +
      +

      systemctl status docker

      +
      +

      重启 docker,没有任何提示说明启动成功

      +
      +

      systemctl restart docker

      +
      +]]>
      + + 工具教程 + + + docker + +
      + + docker 帮助启动类命令(二) + /posts/53508.html + docker 帮助启动类命令(二)

      docker 开机启动

      +
      +

      systemctl enable docker

      +
      +

      查看 docker 概要信息

      +
      +

      docker info

      +
      +
      [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker info
      Client:
      Context: default
      Debug Mode: false
      Plugins:
      app: Docker App (Docker Inc., v0.9.1-beta3)
      buildx: Docker Buildx (Docker Inc., v0.7.1-docker)
      scan: Docker Scan (Docker Inc., v0.12.0)

      Server:
      Containers: 6
      Running: 0
      Paused: 0
      Stopped: 6
      Images: 5
      Server Version: 20.10.12
      Storage Driver: overlay2
      Backing Filesystem: extfs
      Supports d_type: true
      Native Overlay Diff: true
      userxattr: false
      Logging Driver: json-file
      Cgroup Driver: cgroupfs
      Cgroup Version: 1
      Plugins:
      Volume: local
      Network: bridge host ipvlan macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
      Swarm: inactive
      Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
      Default Runtime: runc
      Init Binary: docker-init
      containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
      runc version: v1.0.2-0-g52b36a2
      init version: de40ad0
      Security Options:
      seccomp
      Profile: default
      Kernel Version: 3.10.0-1160.45.1.el7.x86_64
      Operating System: CentOS Linux 7 (Core)
      OSType: linux
      Architecture: x86_64
      CPUs: 1
      Total Memory: 1.795GiB
      Name: iZ8vbfaek3x3ogtpxnpnwfZ
      ID: NQOP:KCP6:LS6G:K52A:XOQX:E7FG:FEHL:K3QX:NSLP:VY5S:TFX5:UR42
      Docker Root Dir: /var/lib/docker
      Debug Mode: false
      Registry: https://index.docker.io/v1/
      Labels:
      Experimental: false
      Insecure Registries:
      127.0.0.0/8
      Registry Mirrors:
      https://qp747t9w.mirror.aliyuncs.com/
      Live Restore Enabled: false

      -

      解决办法

      设置代理

      -
      git config --global https.proxy
      +

      查看 docker 总体帮助文档

      +
      +

      docker –help

      +
      +
      [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker --help

      Usage: docker [OPTIONS] COMMAND

      A self-sufficient runtime for containers

      Options:
      --config string Location of client config files (default "/root/.docker")
      -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST
      env var and default context set with "docker context use")
      -D, --debug Enable debug mode
      -H, --host list Daemon socket(s) to connect to
      -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls Use TLS; implied by --tlsverify
      --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify Use TLS and verify the remote
      -v, --version Print version information and quit

      Management Commands:
      app* Docker App (Docker Inc., v0.9.1-beta3)


      查看 docker 命令帮助文档
      > docker 具体命令 --help

      ```shell
      [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps --help

      Usage: docker ps [OPTIONS]

      List containers

      Options:
      -a, --all Show all containers (default shows just running)
      -f, --filter filter Filter output based on conditions provided
      --format string Pretty-print containers using a Go template
      -n, --last int Show n last created containers (includes all states) (default -1)
      -l, --latest Show the latest created container (includes all states)
      --no-trunc Don't truncate output
      -q, --quiet Only display container IDs
      -s, --size Display total file sizes
      [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

      +]]>
      + + 工具教程 + + + docker + +
      + + docker 镜像(二) + /posts/18767.html + 镜像(二)

      查看 镜像/容器/数据 卷所占的空间

      +

      docker system df

      +
      +
      [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker system df
      TYPE TOTAL ACTIVE SIZE RECLAIMABLE
      Images 6 3 1.173GB 921.1MB (78%)
      Containers 6 0 4.517MB 4.517MB (100%)
      Local Volumes 0 0 0B 0B
      Build Cache 0 0 0B 0B
      [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

      -

      取消代理

      -
      git config --global --unset https.proxy
      +

      删除镜像

      +

      docker rmi 镜像ID

      +
      +
      #### 如果提示报错
      +Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be forced) - image is being used by stopped container 13111f725991
       
      -

      然后输入git 命令使用

      +说明之前运行过这个镜像,生成了容器,需要先删除容器,再删除镜像 + +#### 使用 -f 删除一个 +> docker rmi -f 镜像id + +#### 使用 -f 删除多个 +> xxxxxxxxxx # 没有任何提示说明启动成功[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# systemctl restart docker[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#shell + +#### 使用 -f 删除全部 +> docker rmi -f $(docker images -qa) +
      ]]>
      - 经验分享 + 工具教程 - Git + docker
      - 继承、重写与重载 - /posts/55332.html - 继承

      继承是相对于类来说,通过关键字extends来实现

      -
        -
      • 可以获取父类的属性和方法
      • -
      • 提高代码的复用性
      • -
      • 父类修改了内容,子类也会修改
      • -
      -

      调用

      父类的属性和方法

      -
        -
      • this表示当前对象的引用
      • -
      • super表示父类对象的引用
      • -
      • 调用构造方法
          -
        • this(参数列表)表示调用当前类中的构造方法
        • -
        • super(参数列表)表示调用父类的构造方法,必须放在方法中的第一行
        • -
        -
      • -
      • 调用属性
          -
        • this.属性表示调用当前对象的属性
        • -
        • super.属性表示调用父类的属性,可以拿到被重写之前的数据
        • -
        -
      • -
      • 调用方法
          -
        • this.方法表示调用当前对象的方法
        • -
        • super.方法表示调用父类的方法,可以拿到被重写之前的方法,不用放在代码的第一行
        • -
        -
      • -
      -

      重写

      重写是子类可以重写父类的方法,使用override标识

      -
        -
      • 方法名和参数不变,只修改方法体
      • -
      • 访问权限不能比父类的范围更小
      • -
      • 私有的方法能被子类继承,但不能使用和重写
      • -
      • 静态的方法能被子类继承,能使用但不能被重写
        public class testeass {

        public void aa(String name, int age){
        System.out.println(name + age);
        }
        }

        class testaaa extends testeass{

        @Override
        public void aa(String name, int age) {
        System.out.println("这是重写方法,方法名、参数和返回数据都不变,只能修改方法体");
        System.out.println(name + age);
        }
        }
      • -
      -

      重载

      重载是同一个类下对方法进行重载

      -
        -
      • 方法名相同,参数不相同 (参数个数不同/参数类型不同/参数排列顺序不同)
      • -
      • 返回类型不限制
        public class jichu {

        // 原方法
        public void hello(String name, int aa){
        System.out.println("拼接起来的值是:"+ name + aa );
        }

        // 重载后的方法
        public void hello(int aa, String name){
        System.out.println("aaaaaaa:" + aa);
        }
        }
      • -
      + _mysql主从复制docker版 + /posts/42656.html + _mysql主从复制docker版

      安装mysql主从复制(一主一从)

      新建主服务器容器实例3307

      +
      docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log/:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
      + +

      进入/mydata/mysql-master/conf目录下新建my.cnf把下面内容粘贴到my.cnf

      +
      [mysqld]
      ## 设置server_id,同一局域网中需要唯一
      server_id=101
      ## 指定不需要同步的数据库名称
      binlog-ignore-db=mysql
      ## 开启二进制日志功能
      log-bin=mall-mysql-bin
      ## 设置二进制日志使用内存大小(事务)
      binlog_cache_size=1M
      ## 设置使用的二进制日志格式(mixed,statement,row)
      binlog_format=mixed
      ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
      expire_logs_days=7
      ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
      ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
      slave_skip_errors=1062
      + +

      修改完配置后重启master容器

      +

      master容器实例内创建数据同步用户

      +
      # 建立一个用户
      CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
      # 对新建的用户进行授权
      GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
      + +
      + +
      + + +

      新建从服务器实例3308

      +
      docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log/:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
      + +

      进入/mydata/mysql-slave/conf目录下新建my.cnf

      +
      ## 设置使用的二进制日志格式(mixed,statement,row)
      binlog_format=mixed
      ## 二进制日志过期清理时间。默认值为0,表示不自动清理。
      expire_logs_days=7
      ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
      ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
      slave_skip_errors=1062
      ## relay_log配置中继日志
      relay_log=mall-mysql-relay-bin
      ## log_slave_updates表示slave将复制事件写进自己的二进制日志
      log_slave_updates=1
      ## slave设置为只读(具有super权限的用户除外)
      read_only=1
      + +

      重启从机实例docker restart mysql-slave

      +

      在主数据库中查看主从同步状态show master status;

      +

      进入mysql-slave从机容器

      +

      在从数据库中配置主从复制change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

      +
      # 说明:
      master_host:主数据库的IP地址;
      master_port:主数据库的运行端口;
      master_user:在主数据库创建的用于同步数据的用户账号;
      master_password:在主数据库创建的用于同步数据的用户密码;
      master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
      master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
      master_connect_retry:连接失败重试的时间间隔,单位为秒。
      + +

      在从数据库中查看主从同步状态show slave status \G;

      +

      在从数据库中开启主从同步start slave

      +

      查看从数据库状态发现已经同步

      +
      + +
      + + +

      主从复制测试

      +

      主机创建数据库,创建表,插入数据,搜索表的数据

      +

      从机直接搜索标的数据

      ]]>
      工具教程 - java + docker
      - 性能监控平台 - /posts/23767.html - 搭建容器
      -

      拉取CentOS7镜像,下载安装Grafana和Influxdb

      -
      -
      
      -        # 拉取阿里云的centos7镜像
      -        git pull registry.cn-zhangjiakou.aliyuncs.com/ggls/centos:7.1
      -        # 运行镜像生成容器
      -        docker run -itd --name centos7-influx 
      -        -p 8083:8083 -p 8086:8086 
      -        -p 2003:2003 -p 3000:3000 
      -        -v /opt/centos7_influx:/opt 
      -        --privileged=true 
      -        registry.cn-zhangjiakou.aliyuncs.com/ggls/centos:7.1 /usr/sbin/init
      -        # 进入容器
      -        docker exec -it centos7-influx bash
      -    
      -
      -

      端口说明:

      -
        -
      • 8083:InfluxDB的UI界面展示的端口
      • -
      • 8086:Grafana用来从数据库取数据的端口
      • -
      • 2003:Jmeter往数据库发数据的端口
      • -
      • 3000:本地访问服务器内部docker容器的端口
      • -
      -

      安装Influxdb

        -
      1. 下载influxDB
      2. -
      -

      新版本可以点击influxDB官网进行下载

      + redis的3主3从扩容 + /posts/51796.html + redis的3主3从扩容

      首先添加两个redis

      # 创建redis-node-7
      docler run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
      # 创建redis-node-8
      docler run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
      - # 下载安装包 - wget https://dl.influxdata.com/influxdb/releases/influxdb-1.6.3.x86_64.rpm - # 安装运行 - yum localinstall influxdb-1.6.3.x86_64.rpm +

      注:在阿里云的安全组和防火墙上添加6387,16387 6388,16388四个端口

      +

      配置步骤:

      执行docker exec -it redis-node-1 bash 进入redis-node-1里面
      执行redis-cli --cluster add-node 8.142.144.75:6387 8.142.144.75:6381
      + +
      -
        -
      1. influxDB配置
      2. -
      -

      安装运行后,然后对influxDB进行配置,主要是配置Jmeter连接的数据库和端口号

      +

      6387 新加入的节点

      +

      6381 相当于6387的领路人

      +
      使用redis-cli --cluster check 8.142.144.75:6381检查
      + +
      - vim /etc/influxdb/influxdb.conf +
      重新分配槽号
      +

      redis-cli –cluster reshard IP地址:端口号

      +
      +
      + +
      +

      注:上图的1指的是:对主机数平分16384个节点,16384/主机数(包含想要添加的主机)

      +

      注:上图的2指的是:新加入的6387节点的ID

      +
      + +
      -

      找到graphite并且修改它的库与端口

      -
      enabled = true
      database = "jmeter"
      retention-policy = ""
      bind-address = ":2003"
      protocol = "tcp"
      consistency-level = "one"
      -
        -
      1. 找到[http],将前面的#号去掉
      2. -
      +

      all:表示全部进行重新分配

      +

      在重新加载过程会碰到Do you want to proceed with the proposed reshard plan (yes/no)?一句话,选择yes就可以

      - +
      -
        -
      1. 配置成功,启动influxDB
      2. -
      -
        -
      • 启动命令: systemctl start influxdb.service
      • -
      • 查看状态命令: systemctl status influxdb.service
      • -
      +
      检查集群情况
      + +
      + +
      为主节点6387分配从节点6388
      +

      redis-cli –cluster add-node ip:新slave端口 ip:新master端口 –cluster-slave –cluster-master-id 新主机节点ID

      +
      - +
      -

      安装Grafana

      新版本下载位置:Grafana官网下载:https://grafana.com/grafana/download

      -
      wget https://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpm

      sudo yum localinstall grafana-6.5.2-1.x86_64.rpm
      -

      然后启动

      启动命令: systemctl start grafana-server.service

      -

      查看状态命令: systemctl status grafana-server.service

      -

      然后在浏览器访问登录http://ip:3000

      -

      配置Jmeter

      一、添加监听器:Backend Listener

        -
      • 右键点击Thread Group
      • -
      • 点击Add -> Listener -> Backend Listener
      • +
        检查集群情况
        + +
        +]]> + + 工具教程 + + + docker + + + + 使用docker安装常用软件:mysql + /posts/58312.html + 使用docker安装常用软件:mysql

        以mysql 5.7为例

        使用docker pull mysql:5.7拉取mysql 5.7镜像

        +

        使用镜像创建容器

        简单版

        使用docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7运行镜像创建容器

        +
        +

        因为linux系统自己装了mysql,避免端口冲突,先运行ps -ef|grep mysql查询

        +
        +

        使用docker ps查询容器编号

        +

        使用docker exec -it 容器编号 bash进入mysql容器

        +

        使用mysql -uroot -p,输入密码,登录mysql

        +
        验证

        show databases

        +
        mysql> show databases
        -> ;
        +--------------------+
        | Database |
        +--------------------+
        | information_schema |
        | mysql |
        | performance_schema |
        | sys |
        +--------------------+
        + +
        中文乱码问题
        INSERT INTo t1 VALUES(3, "张三");
        ---
        INSERT INTo t1 VALUES(3, "张三")
        > 1366 - Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' at row 1
        > 时间: 0.038s
        + +

        因为docker默认编码字符集隐患

        +
        mysql> SHOW VARIABLES LIKE 'character%';
        +--------------------------+----------------------------+
        | Variable_name | Value |
        +--------------------------+----------------------------+
        | character_set_client | latin1 |
        | character_set_connection | latin1 |
        | character_set_database | latin1 |
        | character_set_filesystem | binary |
        | character_set_results | latin1 |
        | character_set_server | latin1 |
        | character_set_system | utf8 |
        | character_sets_dir | /usr/share/mysql/charsets/ |
        +--------------------------+----------------------------+
        8 rows in set (0.00 sec)
        mysql>
        + +

        解决中文乱码问题

        在宿主机的/ggls/mysql/conf目录下vim my.cnf文件,通过容器卷同步给容器实例

        +
        [client]
        default_character_set=utf8
        [mysqld]
        collation_server = utf8_general_ci
        character_set_server = utf8
        + +

        改完后重启mysql实例

        +
        服务器输入SHOW VARIABLES LIKE 'character%';验证

        docker安装好并run出容器后,先修改字符集编码在创建mysql库

        +
        删库备份问题

        只要本机上面的容器卷存在,容器卷位置没有改变的情况下,就算容器被删除,重新打开后,创建的数据库,表都还存在

        +

        工作使用版启动容器方法

        +
        docker run -d -p 3306:3306 --privileged=true
        -v /ggls/mysql/log:/var/log/mysql
        -v /ggls/mysql/data:/var/lib/mysql
        -v /ggls/mysql/conf:/etc/mysql/conf.d
        -e MYSQL_ROOT_PASSWORD=123456
        --name mysql
        mysql:5.7
        + + + +]]>
        + + 工具教程 + + + docker + +
        + + _dockerfile + /posts/13844.html + _dockerfile

        以dockerfile的方法来进行对centos的具有vim,ifconfig和jdk8的镜像

        创建myfile文件夹

        创建Dockerfile文件

        +

        注意:jdk8需要和Dockerfile放到同一个文件夹

        +
        +
        FROM centos:7												
        MAINTAINER zzyy<zzyybs@126.com>

        ENV MYPATH /usr/local
        WORKDIR $MYPATH

        #安装vim编辑器
        RUN yum -y install vim
        #安装ifconfig命令查看网络IP
        RUN yum -y install net-tools
        #安装java8及lib库
        RUN yum -y install glibc.i686
        RUN mkdir /usr/local/java
        #ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
        ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
        #配置java环境变量
        ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
        ENV JRE_HOME $JAVA_HOME/jre
        ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
        ENV PATH $JAVA_HOME/bin:$PATH

        EXPOSE 80

        CMD echo $MYPATH
        CMD echo "success--------------ok"
        CMD /bin/bash
        + +

        创建好Dockerfile后,运行docker build -t 新镜像名称:Tag .

        注意:Tag后面有个空格,有个点

        +

        虚悬镜像

        +

        仓库名和标签名全部为的镜像

        +
        +

        碰到它还是进行删除的好

        +

        使用docker image ls -f dangling=true查找虚悬镜像

        +

        使用docker image prune删除镜像

        +]]>
        + + 工具教程 + + + docker + +
        + + redis的4主4从缩容 + /posts/622.html + redis的4主4从缩容
        目的:6387和6388下线
        检查集群情况获得6388的节点ID
        +

        redis-cli –cluster check 8.142.144.75:6382

        +
        +
        + +
        + +
        从集群中将4号从节点6388删除
        +

        redis-cli –cluster del-node ip:从机端口 从机6388节点ID

        +
        +
        + +
        + +
        使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
        + +
        + +

        6388删除成功

        +
        将6387的槽号清空,重新分配

        本例将清出来的槽号都给6381

        +

        使用redis-cli --cluster reshard ip:6381进行节点的重组

        +
        + +
        + +

        注:

        +

        上图中1输入的4096是6387主机所拥有的槽点数量,把他们全部拿出来分掉

        +

        上图的2输入的ID是接收6387主机所放出的槽点数的主机id

        +

        上图中3输入的ID是放出槽点数的6387主机的id

        +

        上图中4输入的done指的是已经输入完所有的节点

        +
        使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
        + +
        + +
        删除6387节点的主机
        +

        redis-cli –cluster del-node ip:端口 6387节点ID

        +
        +
        + +
        + +
        使用redis-cli --cluster check 8.142.144.75:6382进行集群检查
        + +
        ]]>
        + + 工具教程 + + + docker + +
        + + 使用docker安装常用软件:redis + /posts/32161.html + 使用docker安装常用软件:redis

        使用docker pull redis:6.0.8 拉取redis:6.0.8镜像

        +

        创建容器

        +
        +

        容器卷要加入--privileged=true

        +
        +

        在宿主机下新建目录mkdir -p /app/redis

        +]]>
        + + 工具教程 + + + docker + +
        + + 使用docker安装常用软件:tomcat + /posts/50699.html + 使用docker安装常用软件:tomcat

        安装流程

        首先把tomcat在镜像源中pull下来,使用docker images 查看镜像

        +

        使用docker run -d -p 8080:8080 tomcat:9.0 新建容器运行tomcat

        +
        +

        运行后使用本地PC使用阿里云的ip和端口访问docker上面的tomcat

        +
        +
        + +
        + + + +

        这是什么原因呢

        使用docker ps查询到容器编号,docker exec -it 容器编号 bash 打开容器

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        c52ab6b8b8df b8e65a4d736d "catalina.sh run" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp inspiring_bohr
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker exec -it c52ab6b8b8df bash
        root@c52ab6b8b8df:/usr/local/tomcat#
        + +

        使用ls-l查看文件列表

        +
        root@c52ab6b8b8df:/usr/local/tomcat# ls -l
        total 156
        -rw-r--r-- 1 root root 18970 Dec 2 14:30 BUILDING.txt
        -rw-r--r-- 1 root root 6210 Dec 2 14:30 CONTRIBUTING.md
        -rw-r--r-- 1 root root 57092 Dec 2 14:30 LICENSE
        -rw-r--r-- 1 root root 2333 Dec 2 14:30 NOTICE
        -rw-r--r-- 1 root root 3378 Dec 2 14:30 README.md
        -rw-r--r-- 1 root root 6898 Dec 2 14:30 RELEASE-NOTES
        -rw-r--r-- 1 root root 16507 Dec 2 14:30 RUNNING.txt
        drwxr-xr-x 2 root root 4096 Dec 22 17:16 bin
        drwxr-xr-x 1 root root 4096 Apr 29 01:48 conf
        drwxr-xr-x 2 root root 4096 Dec 22 17:16 lib
        drwxrwxrwx 1 root root 4096 Apr 29 01:48 logs
        drwxr-xr-x 2 root root 4096 Dec 22 17:16 native-jni-lib
        drwxrwxrwx 2 root root 4096 Dec 22 17:16 temp
        drwxr-xr-x 2 root root 4096 Dec 22 17:16 webapps
        drwxr-xr-x 7 root root 4096 Dec 2 14:30 webapps.dist
        drwxrwxrwx 2 root root 4096 Dec 2 14:30 work
        root@c52ab6b8b8df:/usr/local/tomcat#
        + +

        从列表可以看到有两个文件夹webappswebapps.dist,数据全部在webapps.dist里面,需要将webapps删除,把webapps.dist重命名成webapps即可访问

        +

        使用rm -rf webapps删除webapps文件夹

        +

        使用mv webapps.dist webapps 重命名

        +

        再次使用本地访问

        +
        + +
        + + +

        使用免修改版的tomcat

        +

        docker pull billygoo/tomcat8-jdk8

        +

        docker run -d -p 8080:8080 –name tomcat8 billygoo/tomcat8-jdk8

        +
        +]]>
        + + 工具教程 + + + docker + +
        + + 容器(一) + /posts/26726.html + 容器(一)

        新建和启动容器

        OPTIONS说明:

          +
        • – name = “容器新名称” 为容器制定一个名称
        • +
        • -d 后台运行容器并返回容器id, 即启动守护式容器(后台运行)
        • +
        • -i 以交互模式运行容器,通常与 -t 同时使用
        • +
        • -t 为容器重新分配一个伪输入终端,通常与 -i 连用,也就是启动交互式容器
        • +
        • -P 随机端口映射
        • +
        • -p 指定端口映射
        • +
        +

        举个栗子

        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker images
        REPOSITORY TAG IMAGE ID CREATED SIZE
        tomcat 9.0 b8e65a4d736d 4 months ago 680MB
        redis 6.0.8 16ecd2772934 18 months ago 104MB
        ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu:15.10 /bin/bash
        root@4fb757f69adb:/# ps -ef
        UID PID PPID C STIME TTY TIME CMD
        root 1 0 0 03:26 pts/0 00:00:00 /bin/bash
        root 11 1 0 03:26 pts/0 00:00:00 ps -ef
        root@4fb757f69adb:/# ls
        bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
        root@4fb757f69adb:/# exit
        exit
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        +

        docker run -it ubuntu:15.10 /bin/bash
        /bin/bash 希望有交互式shell 就用/bin/bash

        +

        查询正在运行的容器

        +

        docker ps [OPTIONS]

        +
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        cdee90a8c77d ubuntu "bash" 3 minutes ago Exited (0) 3 minutes ago ubuntu
        0dcaa91afc0e ubuntu "/bin/bush" 5 minutes ago Created myubuntu
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        +

        OPTIONS:

        +
          +
        • -a 展示所有容器,包含历史用过容器
        • +
        • -d 只展示容器id
        • +
        • -l 显示最近创建的容器
        • +
        • -n 展示最近创建的前n个容器
          List containers
          [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -n 1
          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
          cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
          [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
          [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 1
          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
          cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
          [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -an 2
          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
          cdee90a8c77d ubuntu "bash" 17 minutes ago Exited (0) 17 minutes ago ubuntu
          0dcaa91afc0e ubuntu "/bin/bush" 19 minutes ago Created myubuntu
          [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

        • +
        +

        退出容器

          +
        • exit
        • +
        +

        run进入容器,exit退出容器, 容器停止

        +
          +
        • ctrl + p + q
        • +
        +

        run进入容器,exit退出容器, 容器不停止

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker run -it ubuntu bash
        root@562278524cda:/# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        562278524cda ubuntu "bash" 16 seconds ago Up 15 seconds loving_dewdney
        +]]>
        + + 工具教程 + + + docker + +
        + + 容器(三) + /posts/62565.html + 容器(三)

        创建后台守护式容器

        (问题):使用docker run -d ubuntu命令启动后台模式的容器ubuntu,然后用docker ps 查询提示没有找到运行的容器

        +
        +

        Docker容器后台运行就必须有一个前台进程,不然容器没事做,会自杀

        +
        +

        解决方法:将运行的程序以前台进程的方式运行
        常见方式:命令行模式

        +

        查看容器日志

        +

        docker logs 容器id

        +
        +

        查看容器的进程

        +

        docker top 容器id

        +
        +

        查看容器内部细节

        +

        docker inspect 容器id

        +
        +

        重新进入

          +
        • 进入正在运行的容器并以命令行交互

          +
          +

          docker exec -it 容器id bashShell

          +
          +
        • +
        • 重新进入

          +
          +

          docker attach 容器id

          +
          +
        • +
        +

        (区别)
        attach直接进入容器启动命令的终端,不会启动新的进程,用exit退出,会导致容器的停止
        exec是在容器中打开新的终端,并且可以启动新的进程,用exit退出,不会导致容器的停止

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAME
        S562278524cda   ubuntu    "bash"    20 minutes ago   Up 20 minutes             loving_dewdn
        eycdee90a8c77d   ubuntu    "bash"    45 minutes ago   Up 15 minutes             ubuntu

        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS   PORTS     NAMES

        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#​shell
        + +

        从容器内拷贝文件到主机

        +

        docker cp 容器id:容器地址 主机地址

        +
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker cp 26191ecfb227:/tmp/a.txt /opt/ab.txt
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /opt/
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
        total 8
        -rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
        drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
        drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

        +

        导入和导出容器

          +
        • export 导出容器的内容留作为一个tar归档文件[对应import命令]

          +
          +

          docker export 容器id > 自定义文件名.tar

          +
          +
        • +
        • import从tar包中的内容创建一个新的文件系统再导入为镜像[export]

          +
          +

          cat 文件名.tar | docker import - 自定义/镜像名:3.5(3.5是自定义)

          +
          +
        • +
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        26191ecfb227 ubuntu "bash" 7 minutes ago Up 7 minutes quirky_jemison
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker export 26191ecfb227 > abcd.tar
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
        total 73408
        -rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
        -rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
        drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
        drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]#

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# ll
        total 73408
        -rw-r--r-- 1 root root 75158016 Apr 27 15:21 abcd.tar
        -rw-r--r-- 1 root root 0 Apr 27 15:13 ab.txt
        drwx--x--x 4 root root 4096 Dec 28 16:17 containerd
        drwxr-xr-x 4 root root 4096 Dec 8 16:49 downfile
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# cat abcd.tar | docker import - mytest/ubuntu:3.5
        sha256:a92a27affdde8ad7f07bef2fdc0f04b8e3aeacb9d6919a77da2921d552ab940b
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker images
        REPOSITORY TAG IMAGE ID CREATED SIZE
        mytest/ubuntu 3.5 a92a27affdde 11 seconds ago 72.8MB
        tomcat 9.0 b8e65a4d736d 4 months ago 680MB
        ubuntu latest ba6acccedd29 6 months ago 72.8MB
        redis 6.0.8 16ecd2772934 18 months ago 104MB
        [root@iZ8vbfaek3x3ogtpxnpnwfZ opt]# docker run -it mytest/ubuntu:3.5 bash
        root@356e32244966:/#
        root@356e32244966:/# cd /tmp/
        root@356e32244966:/tmp# ll
        total 8
        drwxrwxrwt 2 root root 4096 Apr 27 07:13 ./
        drwxr-xr-x 1 root root 4096 Apr 27 07:32 ../
        -rw-r--r-- 1 root root 0 Apr 27 07:13 a.txt
        root@356e32244966:/tmp#

        ]]>
        + + 工具教程 + + + docker + +
        + + 容器数据卷 + /posts/1351.html + 容器数据卷

        运行带有容器数据卷的容器实例

        docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
        + +

        举个栗子

        +

        宿主vs容器之间映射添加容器卷

        +
        +
          +
        • 使用docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名 添加
        • +
        +
        docker run -it --privileged=true -v /tmp/host_data:/tmp/docker_data --name=ui ubuntu
        + +
          +
        • 查看数据卷是否挂载成功
        • +
        +
        `在容器内部创建一个dockerin.txt文件
        root@48955acecd79:/tmp/docker_data# touch dockerin.txt
        root@48955acecd79:/tmp/docker_data# ll
        total 8
        drwxr-xr-x 2 root root 4096 Apr 28 09:21 ./
        drwxrwxrwt 1 root root 4096 Apr 28 09:18 ../
        -rw-r--r-- 1 root root 0 Apr 28 09:21 dockerin.txt
        `在宿主机目录下查看该文件
        root@48955acecd79:/tmp/docker_data# [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# cd /tmp/host_data/
        [root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# ll
        total 0
        -rw-r--r-- 1 root root 0 Apr 28 17:21 dockerin.txt
        `在宿主机创建一个文件
        [root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# touch host.txt

        `在容器查看文件
        [root@iZ8vbfaek3x3ogtpxnpnwfZ host_data]# docker exec -it 48955acecd79 bash
        root@48955acecd79:/# cd /tmp/docker_data/

        + 容器和宿主机之间数据共享

        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell

        + 主机修改,docker同步获得

        + docker容器stop,主机修改,docker容器重启数据同步

        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f562278524cdacdee90a8c77d

        + 默认是可读可写的

        ```shell
        docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
        + + + +
          +
        • 修改成容器只读
        • +
        +
        docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
        + +
        +

        卷的继承和共享

        +
        +
          +
        • 容器1完成和宿主机的映射
            +
          • 容器2继承容器1,则容器2操作后同步到容器1和宿主机
          • +
          • 宿主机操作同步到容器1,容器2
          • +
          • 容器1操作同步到宿主机,容器2
          • +
          +
        • +
        +
        docker run -it --privileged=true --volumes-from 父类 --name u2 ubuntu
        + + + +]]>
        + + 工具教程 + + + docker + +
        + + docker 镜像(一) + /posts/55605.html + 镜像(一)

        查询本地主机上的镜像

        +

        docker images
        OPTIONS说明:

        +
          +
          • +
          • a 列出本地所有的镜像(含历史镜像)
          • +
          +
        • +
          • +
          • q 只显示镜像ID
          • +
          +
        • +
        +
        +

        举个栗子

        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
        REPOSITORY TAG IMAGE ID CREATED SIZE
        tomcat 9.0 b8e65a4d736d 4 months ago 680MB
        tomcat latest fb5657adc892 4 months ago 680MB
        hello-world latest feb5d9fea6a5 7 months ago 13.3kB
        centos latest 5d0da3dc9764 7 months ago 231MB
        ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -a
        REPOSITORY TAG IMAGE ID CREATED SIZE
        tomcat 9.0 b8e65a4d736d 4 months ago 680MB
        tomcat latest fb5657adc892 4 months ago 680MB
        hello-world latest feb5d9fea6a5 7 months ago 13.3kB
        centos latest 5d0da3dc9764 7 months ago 231MB
        ubuntu 15.10 9b9cb95443b5 5 years ago 137MB
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images -q
        b8e65a4d736d
        fb5657adc892
        feb5d9fea6a5
        5d0da3dc9764
        9b9cb95443b5
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#

        + +

        查询镜像仓库是否有该镜像

        +

        docker search 镜像名称

        +
        +

        举个栗子

        STARS 点赞数
        OFFICIAL 官方认证

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker search hello-world
        NAME DESCRIPTION STARS OFFICIAL AUTOMATED
        hello-world Hello World! (an example of minimal Dockeriz… 1718 [OK]
        kitematic/hello-world-nginx A light-weight nginx container that demonstr… 151
        + +

        显示前n条镜像

        +

        docker search –limit n 镜像名称

        +
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker search --limit 5 redis
        NAME DESCRIPTION STARS OFFICIAL AUTOMATED
        redis Redis is an open source key-value store that… 10851 [OK]
        bitnami/redis Bitnami Redis Docker Image 214 [OK]
        bitnami/redis-sentinel Bitnami Docker Image for Redis Sentinel 36 [OK]
        circleci/redis CircleCI images for Redis 12 [OK]
        bitnami/redis-exporter 6
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

        + +

        下载安装镜像到本地

        +

        docker pull 镜像名称:标签版本号

        +
        +

        没有tag就是最新版

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker pull redis:6.0.8
        6.0.8: Pulling from library/redis
        bb79b6b2107f: Pull complete
        1ed3521a5dcb: Pull complete
        5999b99cee8f: Pull complete
        3f806f5245c9: Pull complete
        f8a4497572b2: Pull complete
        eafe3b6b8d06: Pull complete
        Digest: sha256:21db12e5ab3cc343e9376d655e8eabbdbe5516801373e95a8a9e66010c5b8819
        Status: Downloaded newer image for redis:6.0.8
        docker.io/library/redis:6.0.8
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

        +]]>
        + + 工具教程 + + + docker + +
        + + 本地镜像发布到私有库 + /posts/42395.html + 本地镜像发布到私有库
        +

        步骤

        +
        +
          +
        • 下载Docker Registry
        • +
        +
        docker pull registry
        + +
          +
        • 运行私有库 Registry,相当于本地有Docker Registry
        • +
        +
        docker run -d -p 5000:5000 -v/ggls/myregistry/:/tmp/registry --privileged=true registry
        + +
          +
        • 新启动ubuntu容器,新增ifconfig命令

          +
            +
          • ​ 进入容器中输入apt-get update命令
          • +
          • ​ 输入apt-get install net-tools命令
          • +
          • xxxxxxxxxx [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker psCONTAINER ID   IMAGE               COMMAND   CREATED       STATUS       PORTS     NAMES356e32244966   mytest/ubuntu:3.5   “bash”    2 hours ago   Up 2 hours             elated_aryabhata[root@iZ8vbfaek3x3ogtpxnpnwfZ /]#[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m=”vim cmd add ok” -a=”ggls” 356e32244966 ggls/ubuntu:1.5sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker imagesREPOSITORY     TAG       IMAGE ID       CREATED         SIZEggls/ubuntu     1.5       87e99e19eeef   7 seconds ago   176MBmytest/ubuntu   3.5       a92a27affdde   2 hours ago     72.8MBtomcat          9.0       b8e65a4d736d   4 months ago   680MBubuntu         latest   ba6acccedd29   6 months ago    72.8MBredis           6.0.8     16ecd2772934   18 months ago   104MB[root@iZ8vbfaek3x3ogtpxnpnwfZ /]# shell
          • +
          +
        • +
        • 容器外部执行docker commit -m="ifconfig cmd add" -a="ggls" ffcc5edf5071 ubuntu:1.6命令

          +
        • +
        • curl验证私服库上有什么镜像

          +
        • +
        +
        curl -XGET http://8.142.144.75:5000/v2/_catalog
        + +
          +
        • 将新镜像修改为符合私服库格式的镜像
        • +
        +
        docker tag 镜像:Tag Host:Port/Repository:Tag
        #
        docker tag ubuntu:1.6 8.142.144.75:5000/ubuntu:1.3
        + +
          +
        • 修改配置文件使之支持http

          +
          +

          docker 默认不允许http方式推送镜像,通过此配置取消这个限制,若不生效,重启docker

          +
          +
            +
          • 使用命令vim /etc/docker/daemon.json打开配置文件
          • +
          • 在阿里云加速后面新增一个json
          • +
          +
          {
          "registry-mirrors": ["https://qp747t9w.mirror.aliyuncs.com"],
          "insecure-registries": ["8.142.144.75:5000"]
          }
          + +
            +
          • 重启docker,重启docker私服仓库
          • +
          +
        • +
        • push推送到私服库

          +
        • +
        +
        docker push 符合私服库格式的镜像名称:tag
        + +
          +
        • curl验证私服库上有什么镜像
        • +
        • pull到本地并运行
        • +
        +
        docker pull 8.142.144.75:5000/ubuntu:1.6
        + + + +]]>
        + + 工具教程 + + + docker + +
        + + 容器(二) + /posts/63516.html + 容器(二)

        启动已经停止运行的容器

        +

        docker start 容器id/容器名

        +
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
        9a1a43aee837 ubuntu "bush" 4 minutes ago Created admiring_wiles
        cdee90a8c77d ubuntu "bash" 29 minutes ago Exited (0) 29 minutes ago ubuntu
        0dcaa91afc0e ubuntu "/bin/bush" 31 minutes ago Created myubuntu
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        562278524cda ubuntu "bash" 4 minutes ago Up 4 minutes loving_dewdney
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker start cdee90a8c77d
        cdee90a8c77d
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        562278524cda ubuntu "bash" 5 minutes ago Up 5 minutes loving_dewdney
        cdee90a8c77d ubuntu "bash" 30 minutes ago Up 3 seconds ubuntu
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#
        + +

        重启容器

        +

        docker restart 容器id/容器名

        +
        +

        停止容器

        +

        docker stop 容器id/容器名

        +
        +

        强制停止容器

        +

        docker kill 容器id/容器名

        +
        +

        删除已经停止的容器

        +

        docker rm 容器id

        +
        +

        一次性删除多个容器

          +
        • docker rm -f $(docker ps -a -q)
        • +
        • docker ps -a -q | xargs docker rm
        • +
        +

        注:xargs是linux系统的可变参数,把分隔符前面的结果传给xargs里面,然后执行分隔符后面的命令

        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        562278524cda ubuntu "bash" 20 minutes ago Up 20 minutes loving_dewdney
        cdee90a8c77d ubuntu "bash" 45 minutes ago Up 15 minutes ubuntu
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps -a -q | xargs docker rm -f
        562278524cda
        cdee90a8c77d
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        [root@iZ8vbfaek3x3ogtpxnpnwfZ ~]#

        +]]>
        + + 工具教程 + + + docker + +
        + + 本地镜像发布到阿里云 + /posts/25343.html + 本地镜像发布到阿里云
        +

        使用docker进行对docker镜像功能的新增后,需要发布到阿里云上对镜像进行同步,下次pull镜像就不要pull缩减版的镜像,直接pull更新后的镜像,方便后续使用

        +

        执行顺序

          +
        • 阿里云开发者平台
        • +
        • 点击镜像容器服务
        • +
        • 创建镜像仓库
            +
          • 创建命名空间
          • +
          • 创建镜像仓库
          • +
          +
        • +
        +

        然后在基本信息上面就可以看到仓库指南

        +
        +

        根据指南进行操作

        +
        +
        + +
        + +
        + +
        + +
        + +
        +]]>
        + + 工具教程 + + + docker + +
        + + 镜像 + /posts/55045.html + 镜像

        背景

        docker镜像是最小的,被精简过的Linux系统,是不带vim命令的

        +
        +

        使用命令 ‘vim a.txt’ 进行新建编辑a.txt文件,就会提示找不到命令

        +
        +

        给镜像容器新增vim命令

          +
        1. 更新镜像

          +
          +

          apt-get update

          +
          +
        2. +
        3. 下载vim功能

          +
          +

          apt-get -y install vim

          +
          +
        4. +
        5. 提交副本使成为一个新镜像

          +
          +

          docker commit -m=”提交的描述信息” -a=”作者” 容器id 要创建的目标镜像名:[标签名]

          +
          +
        6. +
        +
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker ps
        CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
        356e32244966 mytest/ubuntu:3.5 "bash" 2 hours ago Up 2 hours elated_aryabhata
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker commit -m="vim cmd add ok" -a="ggls" 356e32244966 ggls/ubuntu:1.5
        sha256:87e99e19eeef47d4f0daaffc8498690614e0d95eae60ef61b439abe97b62fd16
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]# docker images
        REPOSITORY TAG IMAGE ID CREATED SIZE
        ggls/ubuntu 1.5 87e99e19eeef 7 seconds ago 176MB
        mytest/ubuntu 3.5 a92a27affdde 2 hours ago 72.8MB
        tomcat 9.0 b8e65a4d736d 4 months ago 680MB
        ubuntu latest ba6acccedd29 6 months ago 72.8MB
        redis 6.0.8 16ecd2772934 18 months ago 104MB
        [root@iZ8vbfaek3x3ogtpxnpnwfZ /]#
        +]]>
        + + 工具教程 + + + docker + +
        + + 使用jmeter录制压测 + /posts/52845.html + 业务
          +
        • 压测对象:http://news.baidu.com
        • +
        • 压测页面:首页、国际频道、财经频道
        • +
        • 步骤
            +
          • 访问首页
          • +
          • 单击“国际”(频道)
          • +
          • 单击“财经”(频道)
          • +
          +
        • +
        • 操作手段:录制回放
        • +
        +

        操作步骤

          +
        • 添加录制器“HTTP(S) Test Script Recorder”

          +
            +
          • 右键Test Plan,点击add
          • +
          • 点击Non-Test Elements
          • +
          • 点击HTTP(S) Test Script Recorder
          • +
          +
        • +
        • 添加线程组“Thread Group”

          +
        • +
        • 添加录制控制器“Recording Controller”,

          +
            +
          • 右键线程组,点击and
          • +
          • 点击Logic Controller
          • +
          • 点击Recording Controller
          • +
          +
        • +
        • 录制脚本的配置(Test Plan Creation)

          +
            +
          • Port=8088
          • +
          • Target Controller = TestPlan > Tread Group > Recording Controller
          • +
          • 其他的配置保持默认
          • +
          +
        • +
        • 录制脚本的配置(Requests Filtering 请求过滤器)

          +
            +
          • URl Patterns to Include上添加正则.*\.(baidu\.com).*;表示只抓取百度URL的内容,不抓取其他网站的
          • +
          • URl Patterns to Exclude上添加正则.*\.(js|css|PNG|jpg|jpeg|ico|png|gif).*;去掉一些静态请求
          • +
          • 目的是:避免录制过多没必要的请求
          • +
          +
        • +
        • 单击保存按钮,将Jmeter脚本存储

          +
        • +
        • +
        • 打开浏览器,设置代理,将浏览器的代理服务地址指向http://localhost:8088,然后就可以进行访问录制了

          +
        • +
        • +
        • 访问百度新闻的首页、国际、财经页面

          +
        • +
        • +
        • 查看jmeter,录制结果在Recording Controller下面看到,然后停止录制

          +
        • +
        +

        校验

        录制结束后,要对录制的代码进行校验

        +
          +
        • 添加查看结果树组件
        • +
        +

        运行录制的代码,在查看结果树上查看运行的结果

        +]]>
        + + 工具教程 + + + jmeter + +
        + + jmeter自动化压力测试 + /posts/63722.html + 思路
          +
        • jmeter脚本实现压测逻辑
        • +
        • Shell控制逻辑
        • +
        • 使用jmeter进行静默压测
        • +
        +]]>
        + + 工具教程 + + + jmeter + +
        + + Jmeter之断言和聚合报告 + /posts/55320.html + 怎么对请求进行响应断言
          +
        • 右键 HTTP Request

          +
        • +
        • 点击add --> Assertions --> Response Assertion

          +
        • +
        +

        断言组件就添加成功

        +

        配置响应断言

        Field to Test 下面就是断言的各种方法

        +
          +
        • Text Response 文本断言
        • +
        +
        +

        Patterns to Test输入title之间包含的文字,及配置成功

        +
        +
          +
        • Response Code 响应码断言
        • +
        +
        +

        Patterns to Test输入响应码,比如 200

        +
        +
          +
        • Response Message
        • +
        • Request Headers
        • +
        • URL Sampled
        • +
        • Document(text)
        • +
        • Request Data
        -

        二、配置监听器:Backend Listener

        Backend Listener implementation 默认选择GraphiteBackendListenerClient

        +

        然后运行但并发压测,验证断言添加是否正确,在View Results Tree 中查看结果

        +

        怎么使用聚合报告

          +
        • 右键 Thread Group

          +
        • +
        • 点击 Add --> Listener --> Aggregate Report

          +
        • +
        +

        聚合报告就添加了

        +

        性能指标解读

          +
        • Average: 单个请求的平均响应时间
        • +
        • Median: 中位数,也就是50%用户的响应时间
        • +
        • 90%Line: 90%用户的响应时间
        • +
        • 95%Line: 95%用户的响应时间
        • +
        • 99%Line: 99%用户的响应时间
        • +
        • Min: 最小的请求响应时间
        • +
        • Max: 最大的请求响应时间
        • +
        • Error%: 错误率
        • +
        • Throughput: 吞吐量
        • +
        • Received KB/sec: 每秒从服务器接收到的数据量
        • +
        • Sent KB/sec: 每秒从客户端发送的请求的数量
        • +
        +]]>
        + + 工具教程 + + + jmeter + +
        + + Jmeter之静默压测 + /posts/3219.html + 静默压测
        +

        jmeter -n -t $jmx_file -l $jtl_file

        +
        +

        如: jmeter -n -t HTTP代理服务器luzhi.jmx -l result.jtl

        +

        jmx: Jmeter压测程序脚本文件
        jtl: Jmeter压测请求响应数据的原始文件,查看结果树和聚合报告可以导入该文件查看

        +]]>
        + + 工具教程 + + + jmeter + +
        + + Jmeter之json数据提取和参数传递 + /posts/26691.html + 安装组件JSON Extractor
          +
        • 右键Http Request
        • +
        • 点击Add -> Post Processors -> JSON Extractor
        • +
        +

        组件安装成功

        +

        组件配置

          +
        • Names of created variables : 参数变量名称,提取出来的json使用这个变量
        • +
        • Json Path expressions : JSON提取的正则 比如:$.access_token这个是提取response里面的token
        • +
        • Match NO.(0 for Random):这个是写提取出json的第几条, 比如使用正则能匹配多条,使用这个输入数字就可以匹配对应的
        • +
        +
        引用json变量
          +
        • Jmeter中引用变量的方法${变量名}
        • +
        +

        调试脚本 Debug Sampler

        +

        帮助检查变量值,调试脚本

        +
          -
        • graphiteHost:InfluxDB安装的服务器的ip
        • -
        • graphitePort:端口;默认就是2003,除非你自己安装InfluxDB时设置了其他端口是哦(可见上面安装InfluxDB后关于graphite的配置)
        • -
        • rootMetricsPrefix:指标的根前缀;将测试结果存入数据库时,不同指标会生成不同表,但这些表都最好要有一个共同的前缀,这个就是了;后面会讲到不同的指标的含义(重点哦)
        • -
        • summaryOnly:当你线程组有多个请求又想知道每个请求的结果数据时,最好填false,因为true只会返回所有请求的集合数据报告,不会输出每条请求的数据报告
        • -
        • samplersList:取样器列表;想收集哪些请求就填哪些,最好用正则去匹配,减轻工作量
        • -
        • useRegexpForSamplersList:是否使用正则;如果true则使用,samplersList里可以匹配正则表达式
        • -
        • percentiles:百分比;即类似聚合报告里90% Line,95% Line,99% Line的数据;倘若想要99.9时,需要写成【99_9】,用下划线代替点
        • +
        • 右键Thread Group
        • +
        • 点击Add -> Sampler -> Debug Sampler
        -

        三:运行Jmeter脚本,查看数据库

        数据库里面有两个库,jmeter库就是jmeter运行生成表的数据库

        -

        可以看到生成了三类前缀的表,分别是: jmeter.all 、 jmeter.[请求名称];最后还有 jmeter.test 开头的表,这个后面会单独拿出来说

        -

        前缀的含义

        +

        注意:把Debug放到所有请求的最底下,运行的后可以查看变量参数,方便调试

        +]]>
        + + 工具教程 + + + jmeter + +
        + + Jmeter之全局参数设置和csv数据导入 + /posts/49262.html + 全局参数设置
        添加组件
          +
        • 右键Thread Group
        • +
        • 点击Add -> Config Element -> User Defined Variables
        • +
        +
        添加对应的变量
          +
        • hostname:localhost
        • +
        • port:9090
        • +
        • protocol:http
        • +
        +

        然后再请求参数中使用对应的参数变量名

          -
        • jmeter.all :代表了所有请求;当summaryOnly=true时,就只有samplerName=all的表了
        • -
        • jmeter.[请求名称]:代表了HTTP请求,即samplerName=[请求名称]
        • +
        • ${hostname}
        • +
        • ${port}
        • +
        • ${protocol}
        -

        Thread/Virtual Users metrics - 线程/虚拟用户指标
        跟线程组设置相关的

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        指标全称含义
        jmeter.test.minATMin active threads最小活跃线程数
        jmeter.test.maxATMax active threads最大活跃线程数
        jmeter.test.meanATMean active threads平均活跃线程数
        jmeter.test.startedTStarted threads启动线程数
        jmeter.test.endedTFinished threads结束线程数
        -

        Response times metrics - 响应时间指标

        -

        划重点:每个sampler(请求)都包含了所有响应时间指标,每个sampler(请求)的每个指标都会有单独的一个表存储结果数据

        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        指标含义
        .ok.countsampler的成功响应数
        .h.count服务器每秒命中次数(每秒点击数,即TPS)
        .ok.minsampler响应成功的最短响应时间
        .ok.maxsampler响应成功的最长响应时间
        .ok.avgsampler响应成功的平均响应时间
        .ok.pctsampler响应成功的所占百分比
        .ko.countsampler的失败响应数
        .ko.minsampler响应失败的最短响应时间
        .ko.maxsampler响应失败的最长响应时间
        .ko.avgsampler响应失败的平均响应时间
        .ko.pctsampler响应失败的所占百分比
        .a.countsampler响应数(ok.count+ko.count)
        .sb.bytes已发送字节
        .rb.bytes已接收字节
        .a.minsampler响应的最短响应时间(ok.count和ko.count的最小值)
        .a.maxsampler响应的最长响应时间(ok.count和ko.count的最大值)
        .a.avgsampler响应的平均响应时间(ok.count和ko.count的平均值)
        .a.pctsampler响应的百分比(根据成功和失败的总数来计算)
        -

        四、配置Grafana

        步骤:

        +

        csv数据导入

        创建csv文件
          +
        • 使用Excel创建csv文件
        • +
        • csv数据之间使用英文逗号来分割
        • +
        • 保存成.csv文件
        • +
        +
        添加csv导入组件
          +
        • 右键Thread Group
        • +
        • 点击Add -> Config Element -> CSV Data Set Config
        • +
        +
        配置
          +
        • Filename:文件位置
        • +
        • File encoding:编码格式
        • +
        • Variable Names(comma-delimited):数据参数 如:no,username,password
        • +
        • lgnore first lline (only user if Variable Names is not empty):是否忽略第一行(表头)
        • +
        • Delimiter(use "\t" for tab):分隔符
        • +
        • Allow quoted data?:是否允许双引号括住数据
        • +
        • Recycle on EOF?:到了文件结尾是否循环
        • +
        • Stop thread on EOF?:到了文件结尾是否停止
        • +
        • Sharinng mode:共享模式
        • +
        +

        注意:把请求的参数修改为:${变量}

        +]]>
        + + 工具教程 + + + jmeter + +
        + + jmeter对数据库进行增删改查 + /posts/55393.html + 环境
          +
        • jmeter版本(5.1.1)
        • +
        • mysql-connector-java-8.0.15.jar
        • +
        +

        mysql.jar放在jmeter的lib目录下

        +

        配置

        连接配置组件

          +
        • 右键Thread Group
        • +
        • 点击Add -> Config Element -> JDBC Connection Configuration
        • +
        +

        参数配置

          +
        • ==Varianle Name for created pool==:db_connnection_pool # 连接池名称
        • +
        • ==Validation Query==:select 1
        • +
        • ==Database URL==:jdbc:mysql://8.142.144.75:3306/jmeter_class?alloMultiQueries = true&useSSL=false
        • +
        • ==JDBC Driver class==:选择com.mysql.jbc.Driver
        • +
        • 输入username
        • +
        • 输入password
        • +
        +

        Jmeter数据库JDBC请求

          +
        • 右键Thread Group
        • +
        • 点击Add -> Sampler -> JDBC Request
        • +
        +
        配置介绍

        Variable Name Bound to Pool: 配置参数区
        SQL Query:sql语句区
        其他:变量配置区

        +
        举个栗子:通过Insert语句,向数据库添加测试数据
          +
        • JDBC Connection Configuration: db_connnection_pool #输入连接池名称
        • +
        • Query Type:选择Prepared Updata Statement
        • +
        • Quert:输入sql语句
        • +
        +
        INSERT INTO jmeter_class.user (`username`,`password`) VALUES(?,?)
          -
        • 配置数据源

          -
        • -
        • 创建数据面板

          +
        • Paeameter values:testuser,aaaaaa
        • +
        • Paeameter types:varchar,varchar
        • +
        • Query timeout(s):6
        • +
        • 添加查看结果树
        • +
        • 运行
        • +
        +

        运行结果ResponseBody:

        +
        1 updates.
        +

        这就配置成功

        +]]>
        + + 工具教程 + + + jmeter + +
        + + 循环控制器Loop Controller + /posts/48990.html + 作用

        指定子节点运行的次数,使用变量或数值进行控制

        +
          +
        • Infinite:表示一直循环
        • +
        • 如果同时设置线程组循环次数和循环控制器的循环次数,那控制器子节点运行的次数为两个数值相乘的结果
        • +
        +

        添加

        ]]>
        + + 工具教程 + + + jmeter + +
        + + Constant Timer定时器 + /posts/527.html + 作用

        就是loadrunner上面的思考时间,就是模拟真实用户操作过程的等待时间

        +

        生效范围

        定时器的父节点和子节点,如果想让一个请求强制停止一段时间,就把定时器放在这个请求的下面

        +

        单位是以ms为单位,1s=1000ms

        +]]>
        + + 工具教程 + + + jmeter + +
        + + Modeule Controller和Include Controller + /posts/34250.html + Modeule Controller介绍]]> + + 工具教程 + + + jmeter + + + + 逻辑控制器If Controller + /posts/12932.html + 逻辑控制器If Controller]]> + + 工具教程 + + + jmeter + + + + 逻辑控制器Simple Controller + /posts/31868.html + 作用

        把多个请求放入Simple Controller,可以多个请求进行同时操作

        +]]>
        + + 工具教程 + + + jmeter + +
        + + 随机控制器Random Controller和Random Order Controller + /posts/29537.html + 作用
          +
        • Random Controller:控制器子节点随机运行一个请求
            +
          • lgnore sub-controller blocks:忽略子控制器块
          • +
        • +
        • Random Order Controller:控制器子节点随机运行全部请求
        +]]>
        + + 工具教程 + + + jmeter + +
        + + 事务控制器Transcation Controller + /posts/15488.html + 作用

        一个事务会包含并请求,然后查看一个事务的QPS等性能指标

        +

        指标

        QPS:每秒处理完请求的次数,具体指1s内发出请求到服务器处理完成并返回结果的次数

        +

        TPS:每秒处理完的事务次数,一般TPS是对整个系统来讲的,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能对应多个请求,对于衡量单个接口服务的处理能力,一般使用QPS

        +

        参数

          +
        • Generate Parent sample:生成父样例,就是控制器里面的请求不展示
        • +
        +

        没有选中Generate Parent sample,运行后的结果是

        - -
        - -

        配置数据源

        点击首页的Create your first data source,然后进行配置

        -
        - -
        - -

        点击选择influxDB

        -
        - -
        - -
        - -
        - -

        配置数据面板

        - -
        - -

        选择Add Query,然后进行配置

        -
        - -
        - -

        当我们只想看数据而不想看数据趋势图的话,可以改变它的类型;

        -

        在同一个界面,点击左侧列表选中第二个icon,然后选择Singlestat即可

        -
        - -
        - -

        基本的配置完成,Jmeter使用GraphiteBackendListenerClient来采集数据的,因为请求多起来的时候会有非常多的表,维护成本也会增加;后面将会介绍如何通过InfluxDBBackendListenerClient来采集数据

        -

        给Jmeter的Backend Listener配置为InfluxDBBackendListenerClient

        -

        首先来看看每个配置项的含义

        -
          -
        1. influxdbUrl:安装influxdb的路径;主要格式:http://主机地址:8086/write?db=数据库名
        2. -
        3. application:应用名称;在 events 表中对应的字段是 application
        4. -
        5. measurement:表名;数据存储到哪个表,默认是jmeter,不用改即可
        6. -
        7. summaryOnly:同GraphiteBackendListenerClient
        8. -
        9. samplersRegex:同GraphiteBackendListenerClient
        10. -
        11. percentiles:同GraphiteBackendListenerClient
        12. -
        13. testTitle:测试名称;在 events 表中对应的字段是 text ,JMeter在测试的开始和结束时自动生成注释,该注释的值以’start’和’end’结尾
        14. -
        15. eventTags:Grafana允许为每个注释显示标签;在 events 表中对应的字段是 tags
        16. -
        -

        inDB数据库
        使用InfluxDBBackendListenerClient好处就是,再多的请求也只会生成两张表:

        -

        events :主要拿存事件的

        -

        jmeter :存测试结果数据的,Grafana也是从这个表获取数据再展示

        -

        配置数据面板

        -

        首先,进入官方模板库: https://grafana.com/dashboards ,然后跟着图片导入模板并初始化即可

        -
        - +
        -
        - +
        - +选中后`Generate Parent sample`,运行后的结果是
        - +
        -
        - +
        -

        然后jmeter再次执行一下测试计划

        -
        - -
        -

        模板自带了三个下拉筛选框

        -
          -
        1. data_source:数据源,在Grafana配置了多少个就显示多少个

          -
        2. -
        3. application:在Jmeter配置好的application,如果每次测试计划执行时的application都不一样,你就可以通过这个筛选出对应测试时机的结果数据了

          -
        4. -
        5. transaction:在Jmeter配置好的sampleList,譬如我只发了get、post请求,这里就只会给你选get、post;可以滑到页面下面看到针对某个请求的数据展示

          +]]> + + 工具教程 + + + jmeter + + + + Constant Throughput Timer定时器 + /posts/48851.html + 作用

          限制整个运行过程中的生成的吞吐量不要超过某一个值,防止压死系统

          +

          参数

            +
          • Target throughput(in samples per minute):目标吞吐量,指的是每分钟发送的请求数,对应测试要求的20 QPS,这里应该输入1200
          • +
          • Calculate Throughput based on:有5个选项
              +
            • This Thread only:控制每个线程的吞吐量,这个模式的作用是:总的吞吐量=Target throughput * 线程的数量
            • +
            • All active threads:设置的Target throughput将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理时间后再次运行。活跃线程指的是同一时刻同时运行的线程
            • +
            • All active threads in current thread group:设置的`Target throughput将分配在当前线程祖的每一个活跃线程上,当测试计划只有一个线程组,这个模式作用和All active threads一样
            • +
            • All active threads(shared):与All active threads选项基本一致,唯一区别是,每一个活跃线程都会在所有活跃线程上一次运行结束后等待合理时间再次运行
            • +
            • All active threads in current thread group(shared):与All active threads in current thread group选项基本一致,唯一区别是,每个活跃线程都会在所有活跃线程的上一次运行结束等待合理的时间后再次运行
            • +
          • -
        -

        卸载Grafana

        停止Grafana服务。

        -
        systemctl stop grafana-server.service
        -
        systemctl disable grafana-server.service
        -

        查看要卸载的包的名称

        -
        yum list installed
        -

        输入命令行卸载Grafana

        -
        yum remove grafana.x86_64
        - +
      +]]>
      + + 工具教程 + + + jmeter + +
      + + Regular Expression Extractor正则表达式处理器 + /posts/56883.html + 正则表达式规则
        +
      • ():括起来的部分是要提取的
      • +
      • .:匹配任何字符串
      • +
      • +:一次或多次
      • +
      • ?:在找到第一个匹配项后停止
      • +
      +

      模板

      用$$引用起来,如果正则表达式中有多个正则表达式,可以是$3$$2$等,表示解析到的第几个值给title,$1$表示第一个

      +

      匹配数字

      0代表随机,1代表全部取值,通常使用0

      +

      缺省值

      若参数没有取到值,那默认给一个值让他取

      ]]>
      工具教程 - 监控 + jmeter
      - 使用docker的ubuntu容器安装code-server - /posts/7272.html - 搭建code-server

      拉取Ubuntu 镜像

      # 拉取镜像
      docker pull aliyun
      # 进入镜像
      docker run --name [自定义名称] -u root --privileged=true -p 3300:8881 -v /opt/testubuntu/:/opt/main_file -it [镜像id]
      -

      安装code-server

      github上下载安装包,解压后剪切到/home目录

      -

      运行code-server

      # 找到bin目录下的code-server*
      cd /home/code-server/bin
      # 输入运行命令
      export PASSWORD="123456" && ./code-server --host 0.0.0.0 --port 8881
      - -

      然后在浏览器输入http://ip:3000查看搭建情况

      -

      但是这样搭建有问题

      -
      -

      使用上面方法部署的code-server,因为是http的,导致一些功能不好用,比如写md文档无法预览

      -
      -

      下面就是配置使用https运行

      -

      配置HTTPS

      -

      使用openssl为IP签发证书

      -
      -

      安装openssl

      一般的linux系统已经内置openssl,可以输入openssl进行查看,没有的话就需要安装

      -

      创建证书请求文件

      新建openssl.cnf,并编辑如下内容

      -
      [req]
      distinguished_name = req_distinguished_name
      req_extensions = v3_req

      [req_distinguished_name]
      countryName = Country Name (2 letter code)
      countryName_default = CH
      stateOrProvinceName = State or Province Name (full name)
      stateOrProvinceName_default = ZJ
      localityName = Locality Name (eg, city)
      localityName_default = HangZhou
      organizationalUnitName = Organizational Unit Name (eg, section)
      organizationalUnitName_default = THS
      commonName = Internet Widgits Ltd
      commonName_max = 64

      [ v3_req ]
      # Extensions to add to a certificate request
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName = @alt_names

      [alt_names]

      # 改成自己的域名
      # DNS.1 = your_domain_name.com

      # 改成自己的ip
      IP.1 = 8.142.144.75
      IP.2 = 0.0.0.0
      - -

      生成私钥

      san_domain_com 为最终生成的文件名,一般以服务器命名,可改。

      -
      openssl genrsa -out san_domain_com.key 2048
      - -

      生成CSR文件

      openssl req -new -out san_domain_com.csr -key san_domain_com.key -config openssl.cnf
      - -

      执行后,系统提示输入组织等信息,按[]内容提示输入如即可。

      -

      需要测试CSR文件是否生成成功

      -
      > openssl req -text -noout -in san_domain_com.csr
      -

      有下面的信息,说明生成成功

      -
      Certificate Request:
      Data:
      Version: 0 (0x0)
      Subject: C=US, ST=MN, L=Minneapolis, OU=Domain Control Validated, CN=zz
      Subject Public Key Info:
      Public Key Algorithm: rsaEncryption
      Public-Key: (2048 bit)
      //...
      - -

      自签名并生成证书

      openssl x509 -req -days 3650 -in san_domain_com.csr -signkey san_domain_com.key -out san_domain_com.crt -extensions v3_req -extfile openssl.cnf
      -

      在当前目录会生成三个文件

      -
      san_domain_com.crt

      san_domain_com.csr

      san_domain_com.key
      - -

      在用户电脑安装证书

      .crt证书发给用户,用户双击进行安装,然后重启浏览器

      -

      code server启动

      在code-server的bin目录下运行如下命令,设置端口号为8881,指定对应生成的crt和key密钥文件,即可正常访问https域名

      -
      # 给ssh创建密码
      export PASSWORD="123456"
      # 启动ssh
      nohup ./code-server --port 8881 --host 0.0.0.0 --cert ../san_domain_com.crt --cert-key ../san_domain_com.key > vscode.log 2>&1 &
      -

      然后通过浏览器访问https://ip:3000

      + Gaussian Random Timer定时器 + /posts/40953.html + 作用

      生成随机等待时间

      +

      参数

        +
      • Deviation(in milliseconds) :高斯定时器参数,随机的
      • +
      • Constant Delay Offset(in milliseconds):固定等待时长
      • +
      +

      生成的时长是Deviation + Constant Delay Offset

      ]]>
      工具教程 - ubuntu + jmeter
      - 硬件性能监控平台 - /posts/2166.html - 拉取prometheus镜像
      docker pull prom/prometheus
      -

      创建prometheus容器并启动

      docker run -itd --name=docker_prometheus --restart=always -p 3090:9090 -v /opt/prometheus:/ prom/prometheus
      -

      验证

      -

      通过浏览器访问http://ip:3090进行访问

      -

      方法一:服务器上直接安装node_export

      首先,用浏览器访问:node_export 下载,然后上传到被监控的服务器并解压
      进入解压文件夹,直接启动./node_exporter

      -

      方法二:拉取docker node_export镜像

      docker pull prom/node-exporter
      - -

      创建node_export容器并启动

      docker run -itd --name=node-exporter \
      --restart=always \
      -p 9100:9100 \
      -v "/proc:/host/proc:ro" \
      -v "/sys:/host/sys:ro" \
      -v "/:/rootfs:ro" \
      prom/node-exporter
      - -

      验证

      -

      在浏览器访问http://ip:9100/metrics进行访问

      -

      配置prometheus + node_export

      node_export的作用收集硬件数据

      -

      使用vim修改yum文件容器内:/etc/prometheus/prometheus.yml

      -
      scrape_configs:
      - job_name: prometheus
      static_configs:
      - targets: ['localhost:9090']
      labels:
      instance: prometheus

      - job_name: linux
      static_configs:
      - targets: ['被监控的服务器ip:9100']
      labels:
      instance: localhost
      - -

      重启prometheus容器

      docker restart docker_prometheus
      - -

      配置Grafana

      使用Grafana下载版本

      -

      配置数据源

        -
      • 数据源:选择prometheus

        + Groovy编写方法 + /posts/22551.html + 关键字:
          +
        • **log**:写入信息到jmeterlog文件,使用方法:log.info(*Thisisloginfo
        • +
        • **ctx**:该变量引用了当前线程的上下文,使用方法可参考:org.apache.imeter.threads.JMeterContext。
        • +
        • vars-(JMeterVariables):操作imeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,
          常用方法:
            +
          • a)vars.get(Stringkey):从imeter中获得变量值
          • +
          • b)vars.put(Stringkey,Stringvalue):数据存到imeter变量中
            更多方法可参考:org.apache.imeter.threads.JMeterVariables
          • +
        • -
        • URL输入http://prometheus机器ip:3090

          +
        • props-(JMeterProperties-classjava.util.Properties):操作imeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。
          对应于iava.util.Properties。
            +
          • a)props.get(“START.HMS”); 注:START.HMS为属性名,在文件imeter.properties中定义
          • +
          • b)props.put(“PROP1”,”1234”);
          • +
          +

        • -
        • 点击Save & Test保存

          +
        • prey-(SampleResult):获取前面的sample返回的信息,
          常用方法:
            +
          • a)getResponseDataAsString():获取响应信息
          • +
          • b)getResponseCode():获取响应code
            更多方法可参考:org.apache.imeter.samplers.SampleResult
          • +
        • +
        • sampler-(Sampler):gives access to the current sampler
        -

        添加仪表盘

        使用官方仪表盘进行下载仪表盘
        导入仪表盘
        import via grafana.com输入框输入模板ID12884

        -

        ID:12633也可以使用。

        -

        点击 load,然后底部选择刚弄的数据源,点击import

        -

        注意:
        点击json下载12884的json文件

        ]]>
        工具教程 - 监控 + jmeter @@ -2064,186 +2303,25 @@ Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be for
        编写对象
        #对象
        autotest:
        username: root
        password: root
        age: 18
        male: true

        autotest2: [{username: admin, password: root, age: 22, male: false}]
        -

        回显的结果是:

        -
        autotest: { username: 'root', password: 'root', age: 18, male: true },
        autotest2: [ { username: 'admin', password: 'root', age: 22, male: false } ],
        - -
        编写复合结构的
        #复合结构
        companies:
        -
        id: 1
        name: zhangsan
        value: 10e+11

        -
        id: 2
        name: lisi
        value: 10e+12


        websites:
        baidu: www.baidu.com
        google: www.google.com
        - -

        回显的结果是:

        -
        companies: 
        [ { id: 1, name: 'zhangsan', value: 1000000000000 },
        { id: 2, name: 'lisi', value: 10000000000000 } ],
        websites: { baidu: 'www.baidu.com', google: 'www.google.com' } }
        - -
        引用
        #引用
        father: &father_lastName
        lastName:

        son:
        <<: *father_lastName
        firstName:
        age: 18
        - -

        回显的结果是:

        -
        father: { lastName: '周' },
        son: { lastName: '周', firstName: '董', age: 18 } }
        - -]]> - - 工具教程 - - - yaml - -
        - - 测试必会的sql基本操作 - /posts/11783.html - 1、创建数据库
        create database 数据库名;
        create database 数据库名 character set 字符集;
        - -
        2、查看全部的数据库
        show databases;   
        - -

        3、查看某个数据库的定义的信息:

        -
        show create database 数据库名;         
        - -
        4、删除数据库
        drop database 数据库名称;
        - -

        5、切换数据库:

        -
        use 数据库名;
        - -

        6、查看正在使用的数据库:

        -
        select database();          
        - -

        7、查看数据库中的所有表:

        -
        show tables;
        - -

        8、查看表结构:

        -
        desc 表名;    
        - -

        9、修改表删除列.

        -
        alter table 表名 drop 列名;            
        - -

        10、修改表名

        -
        rename table 表名 to 新表名;              
        - -

        11、修改表的字符集

        -
        alter table 表名 character set 字符集;
        - -

        12、数据类型与约束

        -
          -
        • int :整数 有符号和无符号,长度不受限制
        • -
        • varchar:字符串 中文/数字/字母都是一字字符,受长度限制
        • -
        • decimal :小数 decimal(5,2)总长度5位,整数3位,小数2位
        • -
        • 主键 id :int unsigned primary key auto_increment
        • -
        • 非空 :not null
        • -
        • 唯一 :unique
        • -
        • 默认 :default
        • -
        -

        SQL中表的操作

        1、创建表

        create table 表名(字段名 类型 约束,.....)
        - -

        2、删除表

        drop table 表名
        drop table if exists 表名
        - -

        3、表数据操作

        3.1、添加数据
        insert into 表名 values(值1,值2...)给表中所有字段插入数据
        insert into 表名(字段2,字段1values(值2,值1
        - -
        3.2、修改数据
        update 表名 set 字段1=1,字段2=2 where 条件
        isdelete 逻辑删除
        - -
        3.3、删除数据
        delete from 表名 where 条件
        - -
        3.4、查询数据
          -
        • 3.4.1、查询表中所有信息
          select * from 表名 where 条件
          -
        • -
        • 3.4.2、查询表中指定字段
          select 字段1,字段2,字段3...from 表名 where 条件
          -
        • -
        • 3.4.3、给字段取别名
          select 字段1as) 别名,字段2 别名 from 表名 where 条件
          -
        • -
        • 3.4.4、去重
          select distinct 字段 from 表名 where 条件
          -
        • -
        • 3.4.5、比较运算符
          select * from 表名 where age>20
          -
        • -
        • 3.4.6、逻辑运算符
            -
          • and 满足所有条件

            -
          • -
          • or 满足其中任意一个条件

            -
          • -
          • not 不满足条件

            -
          • -
          -
        • -
        • 3.4.7、模糊查询
            -
          • like
          • -
          • % 0到任意多个字符
          • -
          • _表示任意一个字符
          • -
          -
        • -
        • 3.4.8、范围查询
            -
          • in 在一个非连续的范围内
          • -
          • between and 在一个连续的范围内 闭区间 小的数据在前
          • -
          -
        • -
        • 3.4.9、空查询
            -
          • is null
          • -
          • ‘’空字符串
          • -
          -
        • -
        -
        3.5、多表查询
          -
        • 3.5.1、排序

          -
          select * from 表名 where 条件 order by1asc|desc,列2 asc|desc
          select * from student where 条件 order by convert(字段 using gbk)asc|desc 纯中文转换后排序
          -
        • -
        • 3.5.2、聚合函数

          -
          count: 总数 select count(*/字段)from 表名 where 条件 
          max: 最大值 select max(age) from 表名 where 条件
          min: 最小值 select min(age) from 表名 where 条件
          avg: 平均值 select avg(grade) from 表名 where 条件
          sum: 求和 select sum(grade) from 表名 where 条件
          select avg(age)as 平均年龄,max(age)最大年龄,min(age)最小年龄 from 表名 where 条件
          -
        • -
        • 3.5.3、分组

          -
          select * from 表名 group by 字段,字段2 having 条件
          -
        • -
        • 3.5.4、分页

          -
          select * from 表名 limit 05 从第一行数据开始,显示5
          select * from 表名 limit (n-1*m,m n代表第几页,m代表每页显示多少条数据
          -
        • -
        • 3.5.5、等值连接

          -
          方式一 :
          select * from1,表2,表3 where1.=2.and2.=3.where 条件
          方式二 内连接 取交集:
          select * from1 inner join2 on1.=2.inner join3 on2.=3.where 条件
          -
        • -
        • 3.5.6、左连接

          -
          -

          左边的表全显示,右边表能匹配的上的数据连接显示,匹配不上(没有的)以null补充

          -
          -
          select * from1 left join2 on1.=2.left join3 on2.=3.where 条件
          -
        • -
        • 3.5.7、右连接

          -
          -

          右边的表全显示,左边表能匹配上的数据连接显示,匹配不上(没有的)以null补充

          -
          -
          select * from1 right join2 on1.=2.right join3 on2.=3.where 条件
          -
        • -
        • 3.5.8、自关联

          -
          select * from 表 别名1 inner join 表 别名2 on 别名1.aid=别名2.pid
          -
        • -
        • 3.5.9、子查询
            -
          • 标量子查询
          • -
          -
          -

          子查询结果输出的是一行一列

          -
          -
          select * from student where age>(select avg(age) from student)
          - -
            -
          • 列子查询
          • -
          -
          -

          子查询的结果输出的是一列多行

          -
          -
          in:  
          select * from student where age in
          (select age from student where age=18)

          any/some: >:大于最小的; <: 小于最大的
          select * from student where age>/< any
          (select age from student where age between 18 and 22)

          all: >:大于最大的; <: 小于最小的
          select * from student where age>/<all
          (select age from student where age between 18 and 22
          +

          回显的结果是:

          +
          autotest: { username: 'root', password: 'root', age: 18, male: true },
          autotest2: [ { username: 'admin', password: 'root', age: 22, male: false } ],
          -
            -
          • 行子查询
          • -
          -
          -

          子查询的结果输出的是一行多列

          -
          -
          select * from student where(name,sex)=select name,sex from student where sex='男' order by age desc limit 1
          +
          编写复合结构的
          #复合结构
          companies:
          -
          id: 1
          name: zhangsan
          value: 10e+11

          -
          id: 2
          name: lisi
          value: 10e+12


          websites:
          baidu: www.baidu.com
          google: www.google.com
          -
            -
          • 表子查询
          • -
          -
          -

          子查询的输出结果是一个表

          -
          -
          select * from scores inner joinselect cno from courses where cname in('数据库',‘系统测试’) as c on scores.cno=c.cno
        • -
        -
        3.6、数据分表
        insert into goods_cate(cate_name) select distinct cate from goods;

        create table goods_cate (id int unsigned primary key auto_incremen,cate varchar(10)) select distinct cate from goods;

        update goods inner join goods_cate on goods_cate.cate=goods.cate set goods.cate=goods_cate.id
        ]]>
        +

        回显的结果是:

        +
        companies: 
        [ { id: 1, name: 'zhangsan', value: 1000000000000 },
        { id: 2, name: 'lisi', value: 10000000000000 } ],
        websites: { baidu: 'www.baidu.com', google: 'www.google.com' } }
        + +
        引用
        #引用
        father: &father_lastName
        lastName:

        son:
        <<: *father_lastName
        firstName:
        age: 18
        + +

        回显的结果是:

        +
        father: { lastName: '周' },
        son: { lastName: '周', firstName: '董', age: 18 } }
        + +]]> 工具教程 - sql + yaml
        @@ -2332,999 +2410,892 @@ Error response from daemon: conflict: unable to delete feb5d9fea6a5 (must be for - 性能测试主要关注点 - /posts/32473.html - 性能关注点

        接口响应时间

        -

        吞吐量

        -

        TPS: 事务处理能力,每秒处理事务数(打开页面、登录、选择商品、加入购物车、下单、付款)

        -

        注意:“日活” 每日活跃用户数,是运营数据,与性能无关

        -

        八二原则

        -
        -

        计算QPS/TPS

        -
        -

        相信80%会集中在20%时间内,24小时的流量集中在白天8小时内,同时在午高峰达到高峰

        -

        举个栗子

        根据相应耗时计算公式预估所需并发,一次请求100ms

        -

        根据 QPS = Vue * Rt

        -

        1000000 * 80% / 8 * 3600 * 20% = 277 QPS

        -

        需要27个并发

        -]]>
        - - 经验分享 - - - 性能测试 - -
        - - 关闭chrome浏览器自动更新 - /posts/43612.html - 屏蔽谷歌的更新服务器
        修改 "C:\Windows\System32\drivers\etc\host 文件,在最后增加
        + 测试必会的sql基本操作 + /posts/11783.html + 1、创建数据库
        create database 数据库名;
        create database 数据库名 character set 字符集;
        -

        修改C:\Windows\System32\drivers\etc\hosts文件,在最后增加

        -
        127.0.0.1 update.googleapis.com
        +
        2、查看全部的数据库
        show databases;   
        -

        保存后win+r,输入CMD,输入ipconfig /flushdns刷新DNS

        -

        然后重启浏览器

        -]]>
        - - 工具教程 - -
        - - 自动化基础之Xpath定位 - /posts/43613.html - 常用函数定位 - - - - - - - - - - - - - - -
        定位函数position
        //*contains(text(),’文字’)/li[position()=3]找到第三个 li
        //*contains(text(),’文字’)/li[position()<=2]找到前两个 li
        -
        Xpath函数进行定位
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        定位方式描述实例
        contains匹配在元素文本中查找包含 ‘文字’ 的元素//*contains(text(),’文字’)
        starts-with匹配所有id开头为 ‘s’ 的元素//*[starts-with(@id,’s’)]
        ends-with匹配所有id结尾头为 ‘s’ 的元素//*[ends-with(@id,”s”)]
        following-sibling匹配和 ‘ul’ 元素同级别的下一个元素//div/following-sibling::ul
        preceding-sibling匹配当前节点之前的所有同级节点
        ancestor匹配当前节点的所有父级,祖父级还有更高级//div/ancestor::li[@role=”menuitem”]
        parent匹配当前节点的父节点,相当于 ..//div/parent::button
        -]]>
        - - 工具教程 - - - xpath - -
        - - 使用moko编写Get和Post测试接口(二) - /posts/10988.html - 上一节已经写了规则,这次直接来编写Get和Post请求

        -

        模拟一个没有参数的get请求

        -
        {
        "description": "模拟一个没有参数的get请求",
        "request": {
        "uri": "/getdemo",
        "method": "get"
        },
        "response": {
        "text": "这是一个没有参数的get请求"
        }
        }
        -

        模拟一个带参数的请求

        -
        {
        "description": "模拟一个带参数的请求",
        "request": {
        "uri": "getwithparam",
        "method": "get",
        "queries": {
        "name": "胡汉三",
        "age": "18"
        }
        },
        "response": {
        "text": "我胡汉三又回来了!!!!!"
        }
        }
        +

        3、查看某个数据库的定义的信息:

        +
        show create database 数据库名;         
        -

        模拟一个Post请求

        -
        {
        "description": "模拟一个Post请求",
        "request": {
        "uri": "/postdemo",
        "method": "post"
        },
        "response": {
        "text": "这是我的第一个mosk的post请求"
        }
        }
        +
        4、删除数据库
        drop database 数据库名称;
        -

        这是一个带参数的post请求

        -
        {
        "description": "这是一个带参数的post请求",
        "request": {
        "uri": "/postwithparam",
        "method": "post",
        "forms": {
        "name": "胡汉三",
        "sex": "男人"
        }
        },
        "response": {
        "text": "我胡汉三带着参数来了!!!!"
        }
        }
        ]]>
        - - 工具教程 - - - java - -
        - - 使用moko编写测试接口(无) - /posts/28863.html - 测试

        测试

        测试moko


        -

        测试

        -

        🐱

        -

        ❄️

        -]]>
        - - 工具教程 - - - java - -
        - - 使用moko编写测试接口(一) - /posts/37984.html - 编写规则
          -
        • []包裹着以{}包起来的接口脚本

          -
        • -
        • description:接口简介

          -
        • -
        • request:使用{}包含接口的请求信息

          -
            -
          • uri:接口的地址名称
          • -
          • method:请求方法
          • -
          • queries:get请求参数
          • -
          • forms:post请求参数
          • -
          • headers:请求头信息
          • -
          -
        • -
        • response:返回的数据,使用{}

          +

          5、切换数据库:

          +
          use 数据库名;
          + +

          6、查看正在使用的数据库:

          +
          select database();          
          + +

          7、查看数据库中的所有表:

          +
          show tables;
          + +

          8、查看表结构:

          +
          desc 表名;    
          + +

          9、修改表删除列.

          +
          alter table 表名 drop 列名;            
          + +

          10、修改表名

          +
          rename table 表名 to 新表名;              
          + +

          11、修改表的字符集

          +
          alter table 表名 character set 字符集;
          + +

          12、数据类型与约束

            -
          • text:返回的文字数据
          • -
          • cookies:返回的cookie信息
          • -
          • status:返回的响应码
          • -
          -
        • +
        • int :整数 有符号和无符号,长度不受限制
        • +
        • varchar:字符串 中文/数字/字母都是一字字符,受长度限制
        • +
        • decimal :小数 decimal(5,2)总长度5位,整数3位,小数2位
        • +
        • 主键 id :int unsigned primary key auto_increment
        • +
        • 非空 :not null
        • +
        • 唯一 :unique
        • +
        • 默认 :default
        -

        举个栗子demo

        -
        [
        {
        "description": "这是我们的第一个mock栗子",
        "request": {
        "uri": "/demo"
        },
        "response": {
        "text": "第一个mock响应demo"
        }
        }
        ]
        -

        get请求demo

        -
        [
        {
        "description": "接口的get请求",
        "request": {
        "uri": "/#/test/xml",
        "method": "get"
        },
        "response": {
        "text": "get请求接口"
        }
        }
        ]
        ]]>
        - - 工具教程 - - - java - -
        - - 使用moko编写包含cookie信息的测试接口(二) - /posts/48785.html - 上一节已经写了规则,这次直接来编写Get和Post请求

        -

        这是一个会返回cookie的get请求

        {
        "description": "这是一个会返回cookie的get请求",
        "request": {
        "uri": "/getCookies",
        "method": "get"
        },
        "response": {
        "cookies": {
        "login": "true"
        },
        "text": "恭喜你获得cookies信息成功",
        "status": 200,
        "msg": "成功"
        }
        }
        +

        SQL中表的操作

        1、创建表

        create table 表名(字段名 类型 约束,.....)
        + +

        2、删除表

        drop table 表名
        drop table if exists 表名
        -

        这是一个携带cookies信息的get请求

        {
        "description": "这是一个带cookies信息的get请求",
        "request": {
        "uri": "/get/with/cookies",
        "method": "get",
        "cookies": {
        "login": "true"
        }
        },
        "response": {
        "text": "这是一个需要携带cookies信息才能访问的get请求"
        }
        }
        +

        3、表数据操作

        3.1、添加数据
        insert into 表名 values(值1,值2...)给表中所有字段插入数据
        insert into 表名(字段2,字段1values(值2,值1
        -

        这是一个携带cookies信息的post请求

        {
        "description": "这是一个带cookies信息的post请求",
        "request": {
        "uri": "/post/with/cookies",
        "method": "post",
        "cookies": {
        "login": "true"
        },
        "json": {
        "name": "huhansan",
        "age": "18"
        }
        },
        "response": {
        "status": 200,
        "json": {
        "huhansan": "success",
        "status": "1"
        }
        }
        }
        +
        3.2、修改数据
        update 表名 set 字段1=1,字段2=2 where 条件
        isdelete 逻辑删除
        -]]>
        - - 工具教程 - - - java - -
        - - 使用moko编写测试接口(五) - /posts/42012.html - 下载jar包

        点击moke选择版本进行下载,我下载的的是moco-runner-0.11.0-standalone.jar

        -

        使用命令启动测试脚本

        java -jar jar包的存放路径 http -p 端口 -c json文件路径
        ]]>
        - - 工具教程 - - - java - -
        - - 使用jmeter录制压测 - /posts/52845.html - 业务
          -
        • 压测对象:http://news.baidu.com
        • -
        • 压测页面:首页、国际频道、财经频道
        • -
        • 步骤
            -
          • 访问首页
          • -
          • 单击“国际”(频道)
          • -
          • 单击“财经”(频道)
          • -
          +
          3.3、删除数据
          delete from 表名 where 条件
          + +
          3.4、查询数据
            +
          • 3.4.1、查询表中所有信息
            select * from 表名 where 条件
            +
          • +
          • 3.4.2、查询表中指定字段
            select 字段1,字段2,字段3...from 表名 where 条件
            +
          • +
          • 3.4.3、给字段取别名
            select 字段1as) 别名,字段2 别名 from 表名 where 条件
            +
          • +
          • 3.4.4、去重
            select distinct 字段 from 表名 where 条件
            +
          • +
          • 3.4.5、比较运算符
            select * from 表名 where age>20
            +
          • +
          • 3.4.6、逻辑运算符
              +
            • and 满足所有条件

              +
            • +
            • or 满足其中任意一个条件

              +
            • +
            • not 不满足条件

            • -
            • 操作手段:录制回放
            • -
            -

            操作步骤

              -
            • 添加录制器“HTTP(S) Test Script Recorder”

              -
                -
              • 右键Test Plan,点击add
              • -
              • 点击Non-Test Elements
              • -
              • 点击HTTP(S) Test Script Recorder
            • -
            • 添加线程组“Thread Group”

              +
            • 3.4.7、模糊查询
                +
              • like
              • +
              • % 0到任意多个字符
              • +
              • _表示任意一个字符
              • +
            • -
            • 添加录制控制器“Recording Controller”,

              -
                -
              • 右键线程组,点击and
              • -
              • 点击Logic Controller
              • -
              • 点击Recording Controller
              • +
              • 3.4.8、范围查询
                  +
                • in 在一个非连续的范围内
                • +
                • between and 在一个连续的范围内 闭区间 小的数据在前
              • -
              • 录制脚本的配置(Test Plan Creation)

                -
                  -
                • Port=8088
                • -
                • Target Controller = TestPlan > Tread Group > Recording Controller
                • -
                • 其他的配置保持默认
                • +
                • 3.4.9、空查询
                    +
                  • is null
                  • +
                  • ‘’空字符串
                • -
                • 录制脚本的配置(Requests Filtering 请求过滤器)

                  -
                    -
                  • URl Patterns to Include上添加正则.*\.(baidu\.com).*;表示只抓取百度URL的内容,不抓取其他网站的
                  • -
                  • URl Patterns to Exclude上添加正则.*\.(js|css|PNG|jpg|jpeg|ico|png|gif).*;去掉一些静态请求
                  • -
                  • 目的是:避免录制过多没必要的请求
                  +
                  3.5、多表查询
                    +
                  • 3.5.1、排序

                    +
                    select * from 表名 where 条件 order by1asc|desc,列2 asc|desc
                    select * from student where 条件 order by convert(字段 using gbk)asc|desc 纯中文转换后排序
                  • -
                  • 单击保存按钮,将Jmeter脚本存储

                    +
                  • 3.5.2、聚合函数

                    +
                    count: 总数 select count(*/字段)from 表名 where 条件 
                    max: 最大值 select max(age) from 表名 where 条件
                    min: 最小值 select min(age) from 表名 where 条件
                    avg: 平均值 select avg(grade) from 表名 where 条件
                    sum: 求和 select sum(grade) from 表名 where 条件
                    select avg(age)as 平均年龄,max(age)最大年龄,min(age)最小年龄 from 表名 where 条件
                  • -
                  • -
                  • 打开浏览器,设置代理,将浏览器的代理服务地址指向http://localhost:8088,然后就可以进行访问录制了

                    +
                  • 3.5.3、分组

                    +
                    select * from 表名 group by 字段,字段2 having 条件
                  • -
                  • -
                  • 访问百度新闻的首页、国际、财经页面

                    +
                  • 3.5.4、分页

                    +
                    select * from 表名 limit 05 从第一行数据开始,显示5
                    select * from 表名 limit (n-1*m,m n代表第几页,m代表每页显示多少条数据
                  • -
                  • -
                  • 查看jmeter,录制结果在Recording Controller下面看到,然后停止录制

                    +
                  • 3.5.5、等值连接

                    +
                    方式一 :
                    select * from1,表2,表3 where1.=2.and2.=3.where 条件
                    方式二 内连接 取交集:
                    select * from1 inner join2 on1.=2.inner join3 on2.=3.where 条件
                  • -
                  -

                  校验

                  录制结束后,要对录制的代码进行校验

                  -
                    -
                  • 添加查看结果树组件
                  • -
                  -

                  运行录制的代码,在查看结果树上查看运行的结果

                  -]]> - - 工具教程 - - - jmeter - - - - 使用moko编写重定向测试接口(四) - /posts/57578.html - 上一节已经写了规则,这次直接来编写Get和Post请求

                  -

                  重定向的测试接口

                    -
                  • 使用了redirectTo:目标地址
                  • -
                  -
                  [
                  {
                  "description": "重定向到百度",
                  "request": {
                  "uri": "/redirect"
                  },
                  "redirectTo": "http://www.baidu.com"
                  },
                  {
                  "description": "重定向到自己的网页上",
                  "request": {
                  "uri": "/redirect/topath"
                  },
                  "redirectTo": "/redirect/new"
                  },
                  {
                  "description": "这是被重定到的请求",
                  "request": {
                  "uri": "/redirect/new"
                  },
                  "response": {
                  "text": "重定向成功了"
                  }
                  }
                  ]
                  -]]>
                  - - 工具教程 - - - java - -
                  - - Jmeter之断言和聚合报告 - /posts/55320.html - 怎么对请求进行响应断言
                    -
                  • 右键 HTTP Request

                    +
                  • 3.5.6、左连接

                    +
                    +

                    左边的表全显示,右边表能匹配的上的数据连接显示,匹配不上(没有的)以null补充

                    +
                    +
                    select * from1 left join2 on1.=2.left join3 on2.=3.where 条件
                  • -
                  • 点击add --> Assertions --> Response Assertion

                    +
                  • 3.5.7、右连接

                    +
                    +

                    右边的表全显示,左边表能匹配上的数据连接显示,匹配不上(没有的)以null补充

                    +
                    +
                    select * from1 right join2 on1.=2.right join3 on2.=3.where 条件
                    +
                  • +
                  • 3.5.8、自关联

                    +
                    select * from 表 别名1 inner join 表 别名2 on 别名1.aid=别名2.pid
                  • +
                  • 3.5.9、子查询
                      +
                    • 标量子查询
                    -

                    断言组件就添加成功

                    -

                    配置响应断言

                    Field to Test 下面就是断言的各种方法

                    +
                    +

                    子查询结果输出的是一行一列

                    +
                    +
                    select * from student where age>(select avg(age) from student)
                    +
                      -
                    • Text Response 文本断言
                    • +
                    • 列子查询
                    -

                    Patterns to Test输入title之间包含的文字,及配置成功

                    +

                    子查询的结果输出的是一列多行

                    +
                    in:  
                    select * from student where age in
                    (select age from student where age=18)

                    any/some: >:大于最小的; <: 小于最大的
                    select * from student where age>/< any
                    (select age from student where age between 18 and 22)

                    all: >:大于最大的; <: 小于最小的
                    select * from student where age>/<all
                    (select age from student where age between 18 and 22
                    +
                      -
                    • Response Code 响应码断言
                    • +
                    • 行子查询
                    -

                    Patterns to Test输入响应码,比如 200

                    +

                    子查询的结果输出的是一行多列

                    +
                    select * from student where(name,sex)=select name,sex from student where sex='男' order by age desc limit 1
                    +
                      -
                    • Response Message
                    • -
                    • Request Headers
                    • -
                    • URL Sampled
                    • -
                    • Document(text)
                    • -
                    • Request Data
                    • -
                    -

                    然后运行但并发压测,验证断言添加是否正确,在View Results Tree 中查看结果

                    -

                    怎么使用聚合报告

                      -
                    • 右键 Thread Group

                      -
                    • -
                    • 点击 Add --> Listener --> Aggregate Report

                      -
                    • +
                    • 表子查询
                    -

                    聚合报告就添加了

                    -

                    性能指标解读

                      -
                    • Average: 单个请求的平均响应时间
                    • -
                    • Median: 中位数,也就是50%用户的响应时间
                    • -
                    • 90%Line: 90%用户的响应时间
                    • -
                    • 95%Line: 95%用户的响应时间
                    • -
                    • 99%Line: 99%用户的响应时间
                    • -
                    • Min: 最小的请求响应时间
                    • -
                    • Max: 最大的请求响应时间
                    • -
                    • Error%: 错误率
                    • -
                    • Throughput: 吞吐量
                    • -
                    • Received KB/sec: 每秒从服务器接收到的数据量
                    • -
                    • Sent KB/sec: 每秒从客户端发送的请求的数量
                    • +
                      +

                      子查询的输出结果是一个表

                      +
                      +
                      select * from scores inner joinselect cno from courses where cname in('数据库',‘系统测试’) as c on scores.cno=c.cno
                    -]]> +
                    3.6、数据分表
                    insert into goods_cate(cate_name) select distinct cate from goods;

                    create table goods_cate (id int unsigned primary key auto_incremen,cate varchar(10)) select distinct cate from goods;

                    update goods inner join goods_cate on goods_cate.cate=goods.cate set goods.cate=goods_cate.id
                    ]]> 工具教程 - jmeter + sql - jmeter自动化压力测试 - /posts/63722.html - 思路
                      -
                    • jmeter脚本实现压测逻辑
                    • -
                    • Shell控制逻辑
                    • -
                    • 使用jmeter进行静默压测
                    • -
                    + 关闭chrome浏览器自动更新 + /posts/43612.html + 屏蔽谷歌的更新服务器
                    修改 "C:\Windows\System32\drivers\etc\host 文件,在最后增加
                    + +

                    修改C:\Windows\System32\drivers\etc\hosts文件,在最后增加

                    +
                    127.0.0.1 update.googleapis.com
                    + +

                    保存后win+r,输入CMD,输入ipconfig /flushdns刷新DNS

                    +

                    然后重启浏览器

                    +]]>
                    + + 工具教程 + +
                    + + 自动化基础之Xpath定位 + /posts/43613.html + 常用函数定位 + + + + + + + + + + + + + + +
                    定位函数position
                    //*contains(text(),’文字’)/li[position()=3]找到第三个 li
                    //*contains(text(),’文字’)/li[position()<=2]找到前两个 li
                    +
                    Xpath函数进行定位
                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                    定位方式描述实例
                    contains匹配在元素文本中查找包含 ‘文字’ 的元素//*contains(text(),’文字’)
                    starts-with匹配所有id开头为 ‘s’ 的元素//*[starts-with(@id,’s’)]
                    ends-with匹配所有id结尾头为 ‘s’ 的元素//*[ends-with(@id,”s”)]
                    following-sibling匹配和 ‘ul’ 元素同级别的下一个元素//div/following-sibling::ul
                    preceding-sibling匹配当前节点之前的所有同级节点
                    ancestor匹配当前节点的所有父级,祖父级还有更高级//div/ancestor::li[@role=”menuitem”]
                    parent匹配当前节点的父节点,相当于 ..//div/parent::button
                    ]]>
                    工具教程 - jmeter + xpath
                    - Jmeter之json数据提取和参数传递 - /posts/26691.html - 安装组件JSON Extractor
                      -
                    • 右键Http Request
                    • -
                    • 点击Add -> Post Processors -> JSON Extractor
                    • -
                    -

                    组件安装成功

                    -

                    组件配置

                      -
                    • Names of created variables : 参数变量名称,提取出来的json使用这个变量
                    • -
                    • Json Path expressions : JSON提取的正则 比如:$.access_token这个是提取response里面的token
                    • -
                    • Match NO.(0 for Random):这个是写提取出json的第几条, 比如使用正则能匹配多条,使用这个输入数字就可以匹配对应的
                    • -
                    -
                    引用json变量
                      -
                    • Jmeter中引用变量的方法${变量名}
                    • -
                    -

                    调试脚本 Debug Sampler

                    -

                    帮助检查变量值,调试脚本

                    + 使用docker的ubuntu容器安装code-server + /posts/7272.html + 搭建code-server

                    拉取Ubuntu 镜像

                    # 拉取镜像
                    docker pull aliyun
                    # 进入镜像
                    docker run --name [自定义名称] -u root --privileged=true -p 3300:8881 -v /opt/testubuntu/:/opt/main_file -it [镜像id]
                    +

                    安装code-server

                    github上下载安装包,解压后剪切到/home目录

                    +

                    运行code-server

                    # 找到bin目录下的code-server*
                    cd /home/code-server/bin
                    # 输入运行命令
                    export PASSWORD="123456" && ./code-server --host 0.0.0.0 --port 8881
                    + +

                    然后在浏览器输入http://ip:3000查看搭建情况

                    +

                    但是这样搭建有问题

                    +
                    +

                    使用上面方法部署的code-server,因为是http的,导致一些功能不好用,比如写md文档无法预览

                    -
                      -
                    • 右键Thread Group
                    • -
                    • 点击Add -> Sampler -> Debug Sampler
                    • -
                    -

                    注意:把Debug放到所有请求的最底下,运行的后可以查看变量参数,方便调试

                    +

                    下面就是配置使用https运行

                    +

                    配置HTTPS

                    +

                    使用openssl为IP签发证书

                    +
                    +

                    安装openssl

                    一般的linux系统已经内置openssl,可以输入openssl进行查看,没有的话就需要安装

                    +

                    创建证书请求文件

                    新建openssl.cnf,并编辑如下内容

                    +
                    [req]
                    distinguished_name = req_distinguished_name
                    req_extensions = v3_req

                    [req_distinguished_name]
                    countryName = Country Name (2 letter code)
                    countryName_default = CH
                    stateOrProvinceName = State or Province Name (full name)
                    stateOrProvinceName_default = ZJ
                    localityName = Locality Name (eg, city)
                    localityName_default = HangZhou
                    organizationalUnitName = Organizational Unit Name (eg, section)
                    organizationalUnitName_default = THS
                    commonName = Internet Widgits Ltd
                    commonName_max = 64

                    [ v3_req ]
                    # Extensions to add to a certificate request
                    basicConstraints = CA:FALSE
                    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
                    subjectAltName = @alt_names

                    [alt_names]

                    # 改成自己的域名
                    # DNS.1 = your_domain_name.com

                    # 改成自己的ip
                    IP.1 = 8.142.144.75
                    IP.2 = 0.0.0.0
                    + +

                    生成私钥

                    san_domain_com 为最终生成的文件名,一般以服务器命名,可改。

                    +
                    openssl genrsa -out san_domain_com.key 2048
                    + +

                    生成CSR文件

                    openssl req -new -out san_domain_com.csr -key san_domain_com.key -config openssl.cnf
                    + +

                    执行后,系统提示输入组织等信息,按[]内容提示输入如即可。

                    +

                    需要测试CSR文件是否生成成功

                    +
                    > openssl req -text -noout -in san_domain_com.csr
                    +

                    有下面的信息,说明生成成功

                    +
                    Certificate Request:
                    Data:
                    Version: 0 (0x0)
                    Subject: C=US, ST=MN, L=Minneapolis, OU=Domain Control Validated, CN=zz
                    Subject Public Key Info:
                    Public Key Algorithm: rsaEncryption
                    Public-Key: (2048 bit)
                    //...
                    + +

                    自签名并生成证书

                    openssl x509 -req -days 3650 -in san_domain_com.csr -signkey san_domain_com.key -out san_domain_com.crt -extensions v3_req -extfile openssl.cnf
                    +

                    在当前目录会生成三个文件

                    +
                    san_domain_com.crt

                    san_domain_com.csr

                    san_domain_com.key
                    + +

                    在用户电脑安装证书

                    .crt证书发给用户,用户双击进行安装,然后重启浏览器

                    +

                    code server启动

                    在code-server的bin目录下运行如下命令,设置端口号为8881,指定对应生成的crt和key密钥文件,即可正常访问https域名

                    +
                    # 给ssh创建密码
                    export PASSWORD="123456"
                    # 启动ssh
                    nohup ./code-server --port 8881 --host 0.0.0.0 --cert ../san_domain_com.crt --cert-key ../san_domain_com.key > vscode.log 2>&1 &
                    +

                    然后通过浏览器访问https://ip:3000

                    ]]>
                    工具教程 - jmeter + ubuntu - Jmeter之静默压测 - /posts/3219.html - 静默压测
                    -

                    jmeter -n -t $jmx_file -l $jtl_file

                    -
                    -

                    如: jmeter -n -t HTTP代理服务器luzhi.jmx -l result.jtl

                    -

                    jmx: Jmeter压测程序脚本文件
                    jtl: Jmeter压测请求响应数据的原始文件,查看结果树和聚合报告可以导入该文件查看

                    + 硬件性能监控平台 + /posts/2166.html + 拉取prometheus镜像
                    docker pull prom/prometheus
                    +

                    创建prometheus容器并启动

                    docker run -itd --name=docker_prometheus --restart=always -p 3090:9090 -v /opt/prometheus:/ prom/prometheus
                    +

                    验证

                    +

                    通过浏览器访问http://ip:3090进行访问

                    +

                    方法一:服务器上直接安装node_export

                    首先,用浏览器访问:node_export 下载,然后上传到被监控的服务器并解压
                    进入解压文件夹,直接启动./node_exporter

                    +

                    方法二:拉取docker node_export镜像

                    docker pull prom/node-exporter
                    + +

                    创建node_export容器并启动

                    docker run -itd --name=node-exporter \
                    --restart=always \
                    -p 9100:9100 \
                    -v "/proc:/host/proc:ro" \
                    -v "/sys:/host/sys:ro" \
                    -v "/:/rootfs:ro" \
                    prom/node-exporter
                    + +

                    验证

                    +

                    在浏览器访问http://ip:9100/metrics进行访问

                    +

                    配置prometheus + node_export

                    node_export的作用收集硬件数据

                    +

                    使用vim修改yum文件容器内:/etc/prometheus/prometheus.yml

                    +
                    scrape_configs:
                    - job_name: prometheus
                    static_configs:
                    - targets: ['localhost:9090']
                    labels:
                    instance: prometheus

                    - job_name: linux
                    static_configs:
                    - targets: ['被监控的服务器ip:9100']
                    labels:
                    instance: localhost
                    + +

                    重启prometheus容器

                    docker restart docker_prometheus
                    + +

                    配置Grafana

                    使用Grafana下载版本

                    +

                    配置数据源

                      +
                    • 数据源:选择prometheus

                      +
                    • +
                    • URL输入http://prometheus机器ip:3090

                      +
                    • +
                    • 点击Save & Test保存

                      +
                    • +
                    +

                    添加仪表盘

                    使用官方仪表盘进行下载仪表盘
                    导入仪表盘
                    import via grafana.com输入框输入模板ID12884

                    +

                    ID:12633也可以使用。

                    +

                    点击 load,然后底部选择刚弄的数据源,点击import

                    +

                    注意:
                    点击json下载12884的json文件

                    ]]>
                    工具教程 - jmeter + 监控
                    - Jmeter之全局参数设置和csv数据导入 - /posts/49262.html - 全局参数设置
                    添加组件
                      -
                    • 右键Thread Group
                    • -
                    • 点击Add -> Config Element -> User Defined Variables
                    • -
                    -
                    添加对应的变量
                      -
                    • hostname:localhost
                    • -
                    • port:9090
                    • -
                    • protocol:http
                    • -
                    -

                    然后再请求参数中使用对应的参数变量名

                    -
                      -
                    • ${hostname}
                    • -
                    • ${port}
                    • -
                    • ${protocol}
                    • -
                    -

                    csv数据导入

                    创建csv文件
                      -
                    • 使用Excel创建csv文件
                    • -
                    • csv数据之间使用英文逗号来分割
                    • -
                    • 保存成.csv文件
                    • -
                    -
                    添加csv导入组件
                      -
                    • 右键Thread Group
                    • -
                    • 点击Add -> Config Element -> CSV Data Set Config
                    • -
                    -
                    配置
                      -
                    • Filename:文件位置
                    • -
                    • File encoding:编码格式
                    • -
                    • Variable Names(comma-delimited):数据参数 如:no,username,password
                    • -
                    • lgnore first lline (only user if Variable Names is not empty):是否忽略第一行(表头)
                    • -
                    • Delimiter(use "\t" for tab):分隔符
                    • -
                    • Allow quoted data?:是否允许双引号括住数据
                    • -
                    • Recycle on EOF?:到了文件结尾是否循环
                    • -
                    • Stop thread on EOF?:到了文件结尾是否停止
                    • -
                    • Sharinng mode:共享模式
                    • -
                    -

                    注意:把请求的参数修改为:${变量}

                    + Shell脚本初探 + /posts/38168.html + 编写shell脚本时,必须以 #! /bin/bash 开头

                    在linux创建helloworld.sh文件,在文件内输入:

                    +
                    #!/bin/bash
                    #################
                    echo "hello World"
                    + +

                    然后保存该文件

                    +

                    运行.sh文件时,有两种方法可以运行

                    +
                    第一种是给该文件添加可执行权限
                    chmod +x ./helloworld.sh
                    + +

                    运行文件:./ 不能省略

                    +
                    ./helloworld.sh
                    + +
                    第二种是使用bash或sh 文件路径运行该文件
                    bash helloworld.sh
                    #
                    sh helloworld.sh
                    ]]>
                    工具教程 - jmeter + shell
                    - jmeter对数据库进行增删改查 - /posts/55393.html - 环境
                      -
                    • jmeter版本(5.1.1)
                    • -
                    • mysql-connector-java-8.0.15.jar
                    • -
                    -

                    mysql.jar放在jmeter的lib目录下

                    -

                    配置

                    连接配置组件

                      -
                    • 右键Thread Group
                    • -
                    • 点击Add -> Config Element -> JDBC Connection Configuration
                    • -
                    -

                    参数配置

                      -
                    • ==Varianle Name for created pool==:db_connnection_pool # 连接池名称
                    • -
                    • ==Validation Query==:select 1
                    • -
                    • ==Database URL==:jdbc:mysql://8.142.144.75:3306/jmeter_class?alloMultiQueries = true&useSSL=false
                    • -
                    • ==JDBC Driver class==:选择com.mysql.jbc.Driver
                    • -
                    • 输入username
                    • -
                    • 输入password
                    • -
                    -

                    Jmeter数据库JDBC请求

                      -
                    • 右键Thread Group
                    • -
                    • 点击Add -> Sampler -> JDBC Request
                    • -
                    -
                    配置介绍

                    Variable Name Bound to Pool: 配置参数区
                    SQL Query:sql语句区
                    其他:变量配置区

                    -
                    举个栗子:通过Insert语句,向数据库添加测试数据
                      -
                    • JDBC Connection Configuration: db_connnection_pool #输入连接池名称
                    • -
                    • Query Type:选择Prepared Updata Statement
                    • -
                    • Quert:输入sql语句
                    • -
                    -
                    INSERT INTO jmeter_class.user (`username`,`password`) VALUES(?,?)
                    -
                      -
                    • Paeameter values:testuser,aaaaaa
                    • -
                    • Paeameter types:varchar,varchar
                    • -
                    • Query timeout(s):6
                    • -
                    • 添加查看结果树
                    • -
                    • 运行
                    • -
                    -

                    运行结果ResponseBody:

                    -
                    1 updates.
                    -

                    这就配置成功

                    + Shell函数 + /posts/27832.html + 系统函数
                    basename基本语法
                    basename [string/ pathname][文件后缀] 
                    + +

                    basename命令会删掉所有的前缀,只留一个文件名

                    +

                    选项:

                    +

                    如果指定后缀,basename会将pathname或string中的文件后缀去掉

                    +
                    举个栗子

                    截取该/opt/banzhang.txt路径的文件名称

                    +
                    [root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt
                    banzhang.txt
                    [root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt .txt
                    banzhang
                    [root@b09ed0cc2c9d opt]#
                    + +
                    dirname基本语法
                    dirname 文件绝对路径
                    + +

                    从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录部分)

                    +
                    举个栗子
                    [root@b09ed0cc2c9d opt]# dirname /opt/banzhang.txt
                    /opt
                    [root@b09ed0cc2c9d opt]#
                    + +
                    自定义函数
                    基本语法
                    [function] funname[()]
                    {
                    Action;
                    [retion int;]
                    }

                    funname
                    + +
                    举个栗子
                    #!/bin/bash

                    function sum()
                    {
                    s=0;
                    s=$[$1+$2]
                    echo $s
                    }

                    read -p "input your paratemer1:" p1
                    read -p "input your oaeayemer2:" p2

                    sum $p1 $p2
                    + + + + + ]]>
                    工具教程 - jmeter + shell
                    - Constant Timer定时器 - /posts/527.html - 作用

                    就是loadrunner上面的思考时间,就是模拟真实用户操作过程的等待时间

                    -

                    生效范围

                    定时器的父节点和子节点,如果想让一个请求强制停止一段时间,就把定时器放在这个请求的下面

                    -

                    单位是以ms为单位,1s=1000ms

                    + Shell脚本入门 + /posts/41091.html + 创建txt文件并向txt文件追加数据

                    首先创建test_shell.sh文件

                    +
                    touch test_shell.sh
                    + +

                    test_shell.sh文件输入shell脚本

                    +
                      +
                    • 使用shell创建banzhang.txt文件

                      +
                    • +
                    • 在文件中追加数据echo "aabbccdd" >> banzhang.txt

                      +
                    • +
                    +
                    #!/bin/bash
                    # 指定目录
                    cd /opt/
                    # 创建文件
                    touch banzhang.txt
                    # 向文件追加数据
                    echo "touch banzhang" >> banzhang.txt
                    + ]]>
                    工具教程 - jmeter + shell
                    - 循环控制器Loop Controller - /posts/48990.html - 作用

                    指定子节点运行的次数,使用变量或数值进行控制

                    + 性能监控平台 + /posts/23767.html + 搭建容器
                    +

                    拉取CentOS7镜像,下载安装Grafana和Influxdb

                    +
                    +
                    
                    +        # 拉取阿里云的centos7镜像
                    +        git pull registry.cn-zhangjiakou.aliyuncs.com/ggls/centos:7.1
                    +        # 运行镜像生成容器
                    +        docker run -itd --name centos7-influx 
                    +        -p 8083:8083 -p 8086:8086 
                    +        -p 2003:2003 -p 3000:3000 
                    +        -v /opt/centos7_influx:/opt 
                    +        --privileged=true 
                    +        registry.cn-zhangjiakou.aliyuncs.com/ggls/centos:7.1 /usr/sbin/init
                    +        # 进入容器
                    +        docker exec -it centos7-influx bash
                    +    
                    +
                    +

                    端口说明:

                      -
                    • Infinite:表示一直循环
                    • -
                    • 如果同时设置线程组循环次数和循环控制器的循环次数,那控制器子节点运行的次数为两个数值相乘的结果
                    • +
                    • 8083:InfluxDB的UI界面展示的端口
                    • +
                    • 8086:Grafana用来从数据库取数据的端口
                    • +
                    • 2003:Jmeter往数据库发数据的端口
                    • +
                    • 3000:本地访问服务器内部docker容器的端口
                    -

                    添加

                    ]]>
                    - - 工具教程 - - - jmeter - -
                    - - Modeule Controller和Include Controller - /posts/34250.html - Modeule Controller介绍]]> - - 工具教程 - - - jmeter - - - - 随机控制器Random Controller和Random Order Controller - /posts/29537.html - 作用
                      -
                    • Random Controller:控制器子节点随机运行一个请求
                        -
                      • lgnore sub-controller blocks:忽略子控制器块
                      • +

                        安装Influxdb

                          +
                        1. 下载influxDB
                        2. +
                        +

                        新版本可以点击influxDB官网进行下载

                        + + # 下载安装包 + wget https://dl.influxdata.com/influxdb/releases/influxdb-1.6.3.x86_64.rpm + # 安装运行 + yum localinstall influxdb-1.6.3.x86_64.rpm + + + +
                          +
                        1. influxDB配置
                        2. +
                        +

                        安装运行后,然后对influxDB进行配置,主要是配置Jmeter连接的数据库和端口号

                        + + vim /etc/influxdb/influxdb.conf + + +

                        找到graphite并且修改它的库与端口

                        +
                        enabled = true
                        database = "jmeter"
                        retention-policy = ""
                        bind-address = ":2003"
                        protocol = "tcp"
                        consistency-level = "one"
                        +
                          +
                        1. 找到[http],将前面的#号去掉
                        2. +
                        +
                        + +
                        + +
                          +
                        1. 配置成功,启动influxDB
                        2. +
                        +
                          +
                        • 启动命令: systemctl start influxdb.service
                        • +
                        • 查看状态命令: systemctl status influxdb.service
                        • +
                        +
                        + +
                        + +

                        安装Grafana

                        新版本下载位置:Grafana官网下载:https://grafana.com/grafana/download

                        +
                        wget https://dl.grafana.com/oss/release/grafana-6.5.2-1.x86_64.rpm

                        sudo yum localinstall grafana-6.5.2-1.x86_64.rpm
                        +

                        然后启动

                        启动命令: systemctl start grafana-server.service

                        +

                        查看状态命令: systemctl status grafana-server.service

                        +

                        然后在浏览器访问登录http://ip:3000

                        +

                        配置Jmeter

                        一、添加监听器:Backend Listener

                          +
                        • 右键点击Thread Group
                        • +
                        • 点击Add -> Listener -> Backend Listener
                        +

                        二、配置监听器:Backend Listener

                        Backend Listener implementation 默认选择GraphiteBackendListenerClient

                        +
                          +
                        • graphiteHost:InfluxDB安装的服务器的ip
                        • +
                        • graphitePort:端口;默认就是2003,除非你自己安装InfluxDB时设置了其他端口是哦(可见上面安装InfluxDB后关于graphite的配置)
                        • +
                        • rootMetricsPrefix:指标的根前缀;将测试结果存入数据库时,不同指标会生成不同表,但这些表都最好要有一个共同的前缀,这个就是了;后面会讲到不同的指标的含义(重点哦)
                        • +
                        • summaryOnly:当你线程组有多个请求又想知道每个请求的结果数据时,最好填false,因为true只会返回所有请求的集合数据报告,不会输出每条请求的数据报告
                        • +
                        • samplersList:取样器列表;想收集哪些请求就填哪些,最好用正则去匹配,减轻工作量
                        • +
                        • useRegexpForSamplersList:是否使用正则;如果true则使用,samplersList里可以匹配正则表达式
                        • +
                        • percentiles:百分比;即类似聚合报告里90% Line,95% Line,99% Line的数据;倘若想要99.9时,需要写成【99_9】,用下划线代替点
                        • +
                        +

                        三:运行Jmeter脚本,查看数据库

                        数据库里面有两个库,jmeter库就是jmeter运行生成表的数据库

                        +

                        可以看到生成了三类前缀的表,分别是: jmeter.all 、 jmeter.[请求名称];最后还有 jmeter.test 开头的表,这个后面会单独拿出来说

                        +

                        前缀的含义

                        +
                          +
                        • jmeter.all :代表了所有请求;当summaryOnly=true时,就只有samplerName=all的表了
                        • +
                        • jmeter.[请求名称]:代表了HTTP请求,即samplerName=[请求名称]
                        • +
                        +

                        Thread/Virtual Users metrics - 线程/虚拟用户指标
                        跟线程组设置相关的

                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        指标全称含义
                        jmeter.test.minATMin active threads最小活跃线程数
                        jmeter.test.maxATMax active threads最大活跃线程数
                        jmeter.test.meanATMean active threads平均活跃线程数
                        jmeter.test.startedTStarted threads启动线程数
                        jmeter.test.endedTFinished threads结束线程数
                        +

                        Response times metrics - 响应时间指标

                        +

                        划重点:每个sampler(请求)都包含了所有响应时间指标,每个sampler(请求)的每个指标都会有单独的一个表存储结果数据

                        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
                        指标含义
                        .ok.countsampler的成功响应数
                        .h.count服务器每秒命中次数(每秒点击数,即TPS)
                        .ok.minsampler响应成功的最短响应时间
                        .ok.maxsampler响应成功的最长响应时间
                        .ok.avgsampler响应成功的平均响应时间
                        .ok.pctsampler响应成功的所占百分比
                        .ko.countsampler的失败响应数
                        .ko.minsampler响应失败的最短响应时间
                        .ko.maxsampler响应失败的最长响应时间
                        .ko.avgsampler响应失败的平均响应时间
                        .ko.pctsampler响应失败的所占百分比
                        .a.countsampler响应数(ok.count+ko.count)
                        .sb.bytes已发送字节
                        .rb.bytes已接收字节
                        .a.minsampler响应的最短响应时间(ok.count和ko.count的最小值)
                        .a.maxsampler响应的最长响应时间(ok.count和ko.count的最大值)
                        .a.avgsampler响应的平均响应时间(ok.count和ko.count的平均值)
                        .a.pctsampler响应的百分比(根据成功和失败的总数来计算)
                        +

                        四、配置Grafana

                        步骤:

                        +
                          +
                        • 配置数据源

                          +
                        • +
                        • 创建数据面板

                        • -
                        • Random Order Controller:控制器子节点随机运行全部请求
                        • -
                        -]]> - - 工具教程 - - - jmeter - - - - 逻辑控制器Simple Controller - /posts/31868.html - 作用

                        把多个请求放入Simple Controller,可以多个请求进行同时操作

                        -]]>
                        - - 工具教程 - - - jmeter - -
                        - - 逻辑控制器If Controller - /posts/12932.html - 逻辑控制器If Controller]]> - - 工具教程 - - - jmeter - - - - 事务控制器Transcation Controller - /posts/15488.html - 作用

                        一个事务会包含并请求,然后查看一个事务的QPS等性能指标

                        -

                        指标

                        QPS:每秒处理完请求的次数,具体指1s内发出请求到服务器处理完成并返回结果的次数

                        -

                        TPS:每秒处理完的事务次数,一般TPS是对整个系统来讲的,一个应用系统1s能完成多少事务处理,一个事务在分布式处理中,可能对应多个请求,对于衡量单个接口服务的处理能力,一般使用QPS

                        -

                        参数

                          -
                        • Generate Parent sample:生成父样例,就是控制器里面的请求不展示
                        -

                        没有选中Generate Parent sample,运行后的结果是

                        - +
                        + +

                        配置数据源

                        点击首页的Create your first data source,然后进行配置

                        - +
                        -选中后`Generate Parent sample`,运行后的结果是 + +

                        点击选择influxDB

                        - +
                        +
                        - +
                        +

                        配置数据面板

                        + +
                        -]]>
                        - - 工具教程 - - - jmeter - -
                        - - Gaussian Random Timer定时器 - /posts/40953.html - 作用

                        生成随机等待时间

                        -

                        参数

                          -
                        • Deviation(in milliseconds) :高斯定时器参数,随机的
                        • -
                        • Constant Delay Offset(in milliseconds):固定等待时长
                        • -
                        -

                        生成的时长是Deviation + Constant Delay Offset

                        -]]>
                        - - 工具教程 - - - jmeter - -
                        - - Regular Expression Extractor正则表达式处理器 - /posts/56883.html - 正则表达式规则
                          -
                        • ():括起来的部分是要提取的
                        • -
                        • .:匹配任何字符串
                        • -
                        • +:一次或多次
                        • -
                        • ?:在找到第一个匹配项后停止
                        • -
                        -

                        模板

                        用$$引用起来,如果正则表达式中有多个正则表达式,可以是$3$$2$等,表示解析到的第几个值给title,$1$表示第一个

                        -

                        匹配数字

                        0代表随机,1代表全部取值,通常使用0

                        -

                        缺省值

                        若参数没有取到值,那默认给一个值让他取

                        -]]>
                        - - 工具教程 - - - jmeter - -
                        - - Groovy编写方法 - /posts/22551.html - 关键字:
                          -
                        • **log**:写入信息到jmeterlog文件,使用方法:log.info(*Thisisloginfo
                        • -
                        • **ctx**:该变量引用了当前线程的上下文,使用方法可参考:org.apache.imeter.threads.JMeterContext。
                        • -
                        • vars-(JMeterVariables):操作imeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,
                          常用方法:
                            -
                          • a)vars.get(Stringkey):从imeter中获得变量值
                          • -
                          • b)vars.put(Stringkey,Stringvalue):数据存到imeter变量中
                            更多方法可参考:org.apache.imeter.threads.JMeterVariables
                          • -
                          -
                        • -
                        • props-(JMeterProperties-classjava.util.Properties):操作imeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。
                          对应于iava.util.Properties。
                            -
                          • a)props.get(“START.HMS”); 注:START.HMS为属性名,在文件imeter.properties中定义
                          • -
                          • b)props.put(“PROP1”,”1234”);
                          • -
                          -

                          -
                        • -
                        • prey-(SampleResult):获取前面的sample返回的信息,
                          常用方法:
                            -
                          • a)getResponseDataAsString():获取响应信息
                          • -
                          • b)getResponseCode():获取响应code
                            更多方法可参考:org.apache.imeter.samplers.SampleResult
                          • -
                          -
                        • -
                        • sampler-(Sampler):gives access to the current sampler
                        • -
                        -]]>
                        - - 工具教程 - - - jmeter - -
                        - - 解析Excel用于数据驱动 - /posts/12080.html - 新建Excel
                        -

                        创建Excel数据表:learn.xlsx

                        -
                        +

                        选择Add Query,然后进行配置

                        - +
                        -

                        解析excel

                        -

                        使用python的openpyxl模块来解析Excel

                        -
                        -

                        1、读取Excel文件

                        -

                        openpyxl.load_workbook(‘文件路径’)

                        -
                        -
                        excel = openpyxl.load_workbook('learn.xlsx')
                        -

                        2、获取sheet页里面的数据

                        # 获取当前活动的表单
                        sheet = excel.active
                        # 获取指定的表单
                        for sheets in excel.sheetnames: #获取所有表单的名称
                        print(sheets)
                        sheet = excel[sheets] #获取指定表单
                        -

                        3、获取单元格里面的内容

                        for values in sheet.values:
                        if type(value[0]) == int: #从第二行开始
                        print(values)
                        -

                        运行代码:

                        +

                        当我们只想看数据而不想看数据趋势图的话,可以改变它的类型;

                        +

                        在同一个界面,点击左侧列表选中第二个icon,然后选择Singlestat即可

                        - +
                        -

                        把Excel表里面的数据以字典格式展示:

                        -
                        data = {}
                        data["name"] = values[0]
                        data["value"] = values[1]
                        print(data)
                        -

                        运行代码:

                        +

                        基本的配置完成,Jmeter使用GraphiteBackendListenerClient来采集数据的,因为请求多起来的时候会有非常多的表,维护成本也会增加;后面将会介绍如何通过InfluxDBBackendListenerClient来采集数据

                        +

                        给Jmeter的Backend Listener配置为InfluxDBBackendListenerClient

                        +

                        首先来看看每个配置项的含义

                        +
                          +
                        1. influxdbUrl:安装influxdb的路径;主要格式:http://主机地址:8086/write?db=数据库名
                        2. +
                        3. application:应用名称;在 events 表中对应的字段是 application
                        4. +
                        5. measurement:表名;数据存储到哪个表,默认是jmeter,不用改即可
                        6. +
                        7. summaryOnly:同GraphiteBackendListenerClient
                        8. +
                        9. samplersRegex:同GraphiteBackendListenerClient
                        10. +
                        11. percentiles:同GraphiteBackendListenerClient
                        12. +
                        13. testTitle:测试名称;在 events 表中对应的字段是 text ,JMeter在测试的开始和结束时自动生成注释,该注释的值以’start’和’end’结尾
                        14. +
                        15. eventTags:Grafana允许为每个注释显示标签;在 events 表中对应的字段是 tags
                        16. +
                        +

                        inDB数据库
                        使用InfluxDBBackendListenerClient好处就是,再多的请求也只会生成两张表:

                        +

                        events :主要拿存事件的

                        +

                        jmeter :存测试结果数据的,Grafana也是从这个表获取数据再展示

                        +

                        配置数据面板

                        +

                        首先,进入官方模板库: https://grafana.com/dashboards ,然后跟着图片导入模板并初始化即可

                        - +
                        -]]>
                        - - 工具教程 - - - python - -
                        - - Constant Throughput Timer定时器 - /posts/48851.html - 作用

                        限制整个运行过程中的生成的吞吐量不要超过某一个值,防止压死系统

                        -

                        参数

                          -
                        • Target throughput(in samples per minute):目标吞吐量,指的是每分钟发送的请求数,对应测试要求的20 QPS,这里应该输入1200
                        • -
                        • Calculate Throughput based on:有5个选项
                            -
                          • This Thread only:控制每个线程的吞吐量,这个模式的作用是:总的吞吐量=Target throughput * 线程的数量
                          • -
                          • All active threads:设置的Target throughput将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理时间后再次运行。活跃线程指的是同一时刻同时运行的线程
                          • -
                          • All active threads in current thread group:设置的`Target throughput将分配在当前线程祖的每一个活跃线程上,当测试计划只有一个线程组,这个模式作用和All active threads一样
                          • -
                          • All active threads(shared):与All active threads选项基本一致,唯一区别是,每一个活跃线程都会在所有活跃线程上一次运行结束后等待合理时间再次运行
                          • -
                          • All active threads in current thread group(shared):与All active threads in current thread group选项基本一致,唯一区别是,每个活跃线程都会在所有活跃线程的上一次运行结束等待合理的时间后再次运行
                          • -
                          -
                        • -
                        -]]>
                        - - 工具教程 - - - jmeter - -
                        - - 如何使用pyyaml获取yaml里面的数据 - /posts/28702.html - 准备数据

                        在config目录下创建environment.yaml文件

                        -
                        username: 周杰伦
                        password: 123456
                        -
                        使用pyyaml获取yaml中的数据
                        解析yaml文件

                        首先创建yaml_config文件,为了方便自动化后面的引用,需要创建一个类,在__init__里面打开yaml文件,使用yaml.load(文件名称, Loader=yaml.FullLoader )方法获取数据

                        -

                        打印出字典格式的数据{'username': '周杰伦', 'password': 123456}

                        -
                        import yaml
                        from common.tools import get_project_path, sep


                        class GetConf:
                        def __init__(self):
                        with open(../config.environment.yaml), "r", encoding="utf-8")\
                        as env_file:
                        self.env = yaml.load(env_file, Loader=yaml.FullLoader)
                        +
                        + +
                        -

                        现在使用的是相对路径,后期如果换系统,或者更换文件位置,就需要自己获得文件路径,下面对代码进行优化

                        -
                        优化项:获得项目名称的url地址

                        创建get_project_path方法,获取项目根目录的绝对路径

                        -

                        首先定义一个变量,变量的值是项目的名称project_name = "trading_system_autotest"

                        -

                        获取当前文件的所在目录的绝对路径,需要使用python的os模块file_path=os.path.dirname(__file__)

                        -

                        在绝对路径中找到项目名称的下标位置file_path.find(project_name)

                        -

                        找到项目所在目录的绝对路径下标+项目名称的长度=项目根目录的绝对路径的下标file_path.find(project_name)+len(project_name)

                        -

                        然后对所在目录的绝对路径file_path进行切片获得项目根目录的绝对路径

                        -

                        file_path[: file_path.find(project_name)+len(project_name)]

                        -
                        def get_project_path():
                        """
                        获取项目根目录的绝对路径
                        :return:
                        """
                        project_name = "trading_system_autotest"
                        # 获取当前文件的所在目录的绝对路径
                        file_path = os.path.dirname(__file__)
                        # # 在绝对路径中找到项目名称的下标位置
                        # print(file_path.find(project_name))
                        # 找到项目所在目录的绝对路径+项目名称的长度=项目的绝对路径
                        # print(len(project_name))
                        return file_path[: file_path.find(project_name)+len(project_name)]
                        +
                        + +
                        -
                        优化项:获得拼接后的目录和文件

                        创建sep(path, add_sep_before=False, add_sep_after=False)方法,获得文件和目录的拼接

                        -

                        变量

                        -

                        path变量需要传输一个列表,列表里面是文件所在目录和文件名称,如[文件所在目录,文件名称]

                        -

                        首先使用os.sep.join对列表的字段进行拼接all_path = os.sep.join(path)

                        -

                        add_sep_before进行判断,如果是True,就在前面添加拼接符all_path = os.sep + all_path

                        -

                        add_sep_after进行判断,如果是True,就在后面添加拼接符all_path = all_path + os.sep

                        -

                        windows格式拼接符有可能错误,就要对拼接符转换格式all_path = all_path.replace('\\', '/'),就算没有这个代码,也可以运行出来,只是调试该代码看起来不好看

                        -

                        然后返回all_path

                        -
                        def sep(path, add_sep_before=False, add_sep_after=False):
                        """
                        :param path: is list format:[Current directory , Current file]
                        :param add_sep_before: Add before directory "/"
                        :param add_sep_after: Add after directory "/"
                        :return: Current directory/Current file
                        """
                        all_path = os.sep.join(path)
                        # 在前面添加\
                        if add_sep_before:
                        all_path = os.sep + all_path
                        # 在后面添加\
                        if add_sep_after:
                        all_path = all_path + os.sep
                        # 转换格式 把\转换为/
                        all_path = all_path.replace('\\', '/')
                        return all_path
                        +
                        + +
                        -
                        优化后的代码
                        class GetConf:
                        def __init__(self):
                        with open(get_project_path()+sep(["config", "environment.yaml"], add_sep_before=True), "r", encoding="utf-8")\
                        as env_file:
                        self.env = yaml.load(env_file, Loader=yaml.FullLoader)
                        print(self.env)

                        def get_username_password(self):
                        return self.env["username"], self.env["password"]
                        +

                        然后jmeter再次执行一下测试计划

                        +
                        + +
                        + +

                        模板自带了三个下拉筛选框

                        +
                          +
                        1. data_source:数据源,在Grafana配置了多少个就显示多少个

                          +
                        2. +
                        3. application:在Jmeter配置好的application,如果每次测试计划执行时的application都不一样,你就可以通过这个筛选出对应测试时机的结果数据了

                          +
                        4. +
                        5. transaction:在Jmeter配置好的sampleList,譬如我只发了get、post请求,这里就只会给你选get、post;可以滑到页面下面看到针对某个请求的数据展示

                          +
                        6. +
                        +

                        卸载Grafana

                        停止Grafana服务。

                        +
                        systemctl stop grafana-server.service
                        +
                        systemctl disable grafana-server.service
                        +

                        查看要卸载的包的名称

                        +
                        yum list installed
                        +

                        输入命令行卸载Grafana

                        +
                        yum remove grafana.x86_64
                        ]]>
                        工具教程 - python + 监控
                        - 解析ini文件用于数据驱动 - /posts/42174.html - 背景
                          -
                        • PO设计模式是selenum自动化测试中比较好的设计模式
                        • -
                        • 在项目的开发过程中,UI界面上的元素不确定,会经常变化
                        • -
                        -

                        过程解析

                          -
                        • 在PyCharm创建ini文件
                        • -
                        • 创建一个可以解析ini文件的python模块(parse_ini)
                        • -
                        • 其他模块引用parse_ini文件里面的方法把ini文件解析出来
                        • -
                        -

                        创建ini文件

                        image

                        -

                        创建parse_ini模块

                        import configparser
                        -
                        -class Parse_Ini(object):
                        +    Shell条件判断
                        +    /posts/50013.html
                        +    基本语法

                        [ condition ] (注意,condition 前后要有空格

                        +

                        注意:条件非空即为 true,[ atguigu ]返回 true, [] 返回 false.

                        +
                        常用条件判断
                        两个整数之间进行比较
                        = 字符串比较
                        -lt 小于
                        -le 小于等于
                        -eq 等于
                        -gt 大于
                        -ge 大于等于
                        -ne 不等于
                        - def __init__(self): - self.file = r"D:\dingdang_project\test\config.ini" - self.parse = configparser.ConfigParser() - self.parse.read(self.file, encoding="utf-8") +

                        举个栗子

                        +
                        [23 -lt 80]
                        echo $? # 判断上一步操作是不是正确
                        - def get_sections(self): - """ - :return: 由sections组成的列表 - """ - return self.parse.sections() +
                        按照文件权限进行判断
                        -r 读
                        -w 写
                        -x 执行
                        - def get_options(self, sections): - """ - :return: 返回指定 section 中可用选项的列表。 - """ - return self.parse.options(sections) +

                        举个栗子

                        +
                        [ -w 1.sh ]
                        echo $?
                        - def get_sections_options(self, sections, options): - """ - :param sections: 元素名称 - :param options: 元素地址 - :return: 指定sections下的options - """ - try: - option = self.parse.get(sections, options) - if ("-->" in option): - option = tuple(option.split("-->")) - return option - except configparser.NoOptionError as e: - return 'error: No option "{}" in section: "{}"'.format(options, sections) +
                        文件类型判断
                        -f 文件存在且是一个常规文件
                        -e 文件存在
                        -d 文件存在且是一个目录
                        +

                        举个栗子

                        +
                        [ -e 2.sh ]
                        echo $?
                        -if __name__ == "__init__": - pass -
                        -

                        举个栗子:

                        栗子1

                        image

                        -
                        运行结果:

                        image

                        -
                        栗子2

                        image

                        -
                        运行结果:

                        image

                        +
                        多条件判断

                        $$ 与 ,前对,才执行后

                        +

                        ||

                        ]]>
                        工具教程 - python + shell
                        - python自动化配置参数 - /posts/1.html - selenium 配置参数

                        每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有历史记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器

                        -

                        selenium启动配置参数接收是ChromeOptions类,创建方式如下 :

                        -
                        from selenium import webdriver
                        option = webdriver.ChromeOptions()
                        driver = webdriver.Chrome(chrome_options=option)
                        创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目
                        - -
                        from selenium import webdriver
                        option = webdriver.ChromeOptions()
                        -

                        添加启动参数

                        option.add_argument()
                        - -

                        添加扩展应用

                        option.add_extension()
                        option.add_encoded_extension()
                        - -

                        添加实验性质的设置参数

                        option.add_experimental_option()
                        - -

                        设置调试器地址

                        option.debugger_address()
                        - -

                        常用配置参数:

                        from selenium import webdriver
                        option = webdriver.ChromeOptions()

                        -

                        添加UA

                        options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
                        - -

                        指定浏览器分辨率

                        options.add_argument('window-size=1920x3000')
                        - -

                        谷歌文档提到需要加上这个属性来规避bug

                        chrome_options.add_argument('--disable-gpu')
                        - -

                        隐藏滚动条, 应对一些特殊页面

                        options.add_argument('--hide-scrollbars')
                        - -

                        不加载图片, 提升速度

                        options.add_argument('blink-settings=imagesEnabled=false')
                        - -

                        浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

                        options.add_argument('--headless')
                        - -

                        以最高权限运行

                        options.add_argument('--no-sandbox')
                        - -

                        手动指定使用的浏览器位置

                        options.binary_location = r"C:Program Files (x86)GoogleChromeApplicationchrome.exe"
                        - -

                        添加crx插件

                        option.add_extension('d:crxAdBlock_v2.17.crx')
                        - -

                        禁用JavaScript

                        option.add_argument("--disable-javascript")
                        - -

                        设置开发者模式启动,该模式下webdriver属性为正常值

                        options.add_experimental_option('excludeSwitches', ['enable-automation'])
                        - -

                        禁用浏览器弹窗

                        prefs = { 
                        'profile.default_content_setting_values' : {
                        'notifications' : 2
                        }
                        }
                        options.add_experimental_option('prefs',prefs)
                        - -

                        添加代理 ip

                        options.add_argument("--proxy-server=http://XXXXX.com:80")

                        driver = webdriver.Chrome(chrome_options=chrome_options)
                        - -

                        其他配置项目参数

                        指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区

                        --user-data-dir=[PATH]
                        - -

                        指定缓存Cache路径

                        –disk-cache-dir=[PATH]
                        - -

                        指定Cache大小,单位Byte

                        –disk-cache-size=
                        - -

                        重置到初始状态,第一次运行

                        –first run
                        - -

                        隐身模式启动

                        –incognito
                        - -

                        禁用Javascript

                        –disable-javascript
                        - -

                        将地址栏弹出的提示菜单数量改为num个

                        --omnibox-popup-count="num"
                        - -

                        修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果

                        --user-agent="xxxxxxxx"
                        - -

                        禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果

                        --disable-plugins
                        - -

                        禁用JavaScript,如果觉得速度慢在加上这个

                        --disable-javascript
                        - -

                        禁用java

                        --disable-java
                        - -

                        启动就最大化

                        --start-maximized
                        - -

                        取消沙盒模式

                        --no-sandbox
                        - -

                        单进程运行

                        --single-process
                        - -

                        每个标签使用单独进程

                        --process-per-tab
                        - -

                        每个站点使用单独进程

                        --process-per-site
                        + 性能测试主要关注点 + /posts/32473.html + 性能关注点

                        接口响应时间

                        +

                        吞吐量

                        +

                        TPS: 事务处理能力,每秒处理事务数(打开页面、登录、选择商品、加入购物车、下单、付款)

                        +

                        注意:“日活” 每日活跃用户数,是运营数据,与性能无关

                        +

                        八二原则

                        +
                        +

                        计算QPS/TPS

                        +
                        +

                        相信80%会集中在20%时间内,24小时的流量集中在白天8小时内,同时在午高峰达到高峰

                        +

                        举个栗子

                        根据相应耗时计算公式预估所需并发,一次请求100ms

                        +

                        根据 QPS = Vue * Rt

                        +

                        1000000 * 80% / 8 * 3600 * 20% = 277 QPS

                        +

                        需要27个并发

                        +]]>
                        + + 经验分享 + + + 性能测试 + +
                        + + Shell运算符 + /posts/59561.html + 基本语法
                          +
                        1. $((运算式)) 或 $[运算式]
                        2. +
                        3. expr + - * /
                        4. +
                        +

                        注意,运算符号间要有空格

                        +
                        举个加法栗子
                        expr 3 + 2
                        5
                        -

                        插件不启用单独进程

                        --in-process-plugins
                        +
                        举栗子[(2+3)*4]

                        需要使用键盘左上角的`,把需要提前运算的包起来

                        +
                        expr `expr 2 + 3` \* 4
                        -

                        禁用弹出拦截

                        --disable-popup-blocking
                        +

                        或者

                        +
                        s=$[(2+3)*4]
                        echo $s
                        -

                        禁用插件

                        --disable-plugins
                        +]]>
                        + + 工具教程 + + + shell + +
                        + + Shell流程控制 + /posts/65365.html + if判断
                        基本语法
                          +
                        • [ 条件判断式 ],中括号和条件判断式之间必须有空格

                          +
                        • +
                        • if后要有空格

                          +
                        • +
                        +
                        if [ 条件判断式 ]:then
                        程序
                        fi
                        #或者
                        if[ 条件判断式 ]
                        then
                        程序
                        fi
                        -

                        禁用图像

                        --disable-images
                        +
                        举个栗子

                        输入一个数字,如果是1,则输出 banzhang zhen shuai,如果是2,则输出 cls zhen mei ,如果是其他,则什么都不输出

                        +
                        #!/bin/bash
                        if [ $1 -eq 1 ]
                        then
                        echo "banzhang zhen shuai"
                        elif [ $1 -eq 2 ]
                        then
                        echo "cls zhen mei"
                        fi
                        -

                        启动进入隐身模式

                        --incognito
                        +
                        case 语句
                        基本语法
                          +
                        • case行尾必须是单词 “in”,每一个模式匹配必须以右括号 “)” 结束
                        • +
                        • 双分号 “;;” 表示命令序列结束,相当于java的break
                        • +
                        • 最后的 “*)” 表示默认模式,相当于java的default
                        • +
                        +
                        case $变量名 in  
                        "值 1")
                        如果变量的值等于1,执行程序1
                        ;;
                        "值 2")
                        如果变量的值等于2,执行程序2
                        ;;
                        *)
                        如果变量的值不是以上的值,则执行此程序
                        esac
                        -

                        启用账户切换菜单

                        --enable-udd-profiles
                        +
                        举个栗子

                        输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其他,输出 renyao

                        +
                        #!/bin/bash
                        case $1 in
                        "1")
                        echo "banzhang"
                        ;;

                        "2")
                        echo "cls"
                        ;;

                        *)
                        echo "renyou"
                        esac
                        -

                        使用pac代理 [via 1/2]

                        --proxy-pac-url
                        +
                        For循环
                        基本语法1
                        for(( 初始值;循环控制添加;变量变化 ))
                        do
                        程序
                        done
                        -

                        设置语言为简体中文

                        --lang=zh-CN
                        +
                        举个栗子1

                        输出从1加到100的值

                        +
                        #!/bin/bash

                        s=0
                        for ((i=1;i<=100;i++))
                        do
                        s=$[$s+$i]
                        done
                        echo "cong1jiadao100:$s"
                        -

                        自定义缓存目录

                        --disk-cache-dir
                        +
                        基本语法2
                        for 变量 in 值1 值2 值3...
                        do
                        程序
                        done
                        -

                        自定义缓存最大值(单位byte)

                        --disk-cache-size
                        +
                        举个栗子2

                        打印所有输入参数

                        +
                        #!/bin/bash

                        for i in "$*"
                        do
                        echo "banzhang xihuan $i"
                        done
                        #-----------------------------------
                        for j in "$@"
                        do
                        echo "banzhang xihuan $j"
                        done
                        -

                        自定义多媒体缓存最大值(单位byte)

                        --media-cache-size
                        +
                        while 循环
                        基本语法
                        while[ 条件判断式 ]
                        do
                        程序
                        done
                        -

                        在工具 栏增加一个书签按钮

                        --bookmark-menu
                        +
                        举个栗子

                        输出从1加到100的值

                        +
                        #!/bin/bash

                        i=1
                        while [ $i -le 100 ]
                        do
                        s=$[$s + $i]
                        i=$[$i + 1]
                        done

                        echo $s
                        -

                        启用书签同步

                        --enable-sync
                        +
                        read 读取控制台输入
                        基本语法
                        read(选项)(参数)
                        选项:
                        -p:指定读取值时的提示符
                        -t:指定读取值时的等待的时间(秒)
                        参数:
                        变量:指定读取值的变量名
                        -

                        使用缓存

                        options.add_argument("--disk-cache-dir=/path/to/cache/folder")
                        options.add_argument("--disable-application-cache")
                        options.add_argument("--disable-cache")
                        +
                        举个栗子

                        提示7秒内,读取控制台输入的名称

                        +
                        #!/bin/bash

                        read -t 7 -p "input your name" NAME

                        echo $NAME
                        -

                        参考:https://www.cnblogs.com/sn5200/p/15949796.html

                        ]]>
                        工具教程 - python + shell
                        - 自动获取driver - /posts/1.html - 自动获取driver

                        chrome

                        下载驱动

                        @staticmethod
                        def down_driver(option):
                        '''
                        return: 返回driver,可以直接使用
                        '''
                        driver = webdriver.Chrome(
                        ChromeDriverManager(
                        url="https://registry.npmmirror.com/-/binary/chromedriver",
                        latest_release_url="https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE",
                        cache_valid_range=365).install(),
                        options=option)
                        driver.delete_all_cookies()
                        return driver
                        - -

                        下载2

                        @staticmethod
                        def determin_chrome_driver():

                        chrome_path = r'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'


                        # 指定谷歌驱动目标位置
                        folder_path = os.path.join(ROOT_DIR, "env_setting")
                        # 驱动名称
                        file_name = 'chromedriver.exe'
                        # 路径拼接
                        file_path = os.path.join(folder_path, file_name)

                        if os.path.exists(file_path):
                        # 获取chromedriver.exe版本(谷歌浏览器驱动)
                        result = subprocess.run([file_path, '--version'], capture_output=True, text=True)
                        driverversion = '.'.join(result.stdout.strip().split(' ')[1].split('.')[:-1])

                        # 获取chrome.exe版本(谷歌浏览器)
                        command = f'wmic datafile where name="{chrome_path}" get Version /value'
                        result_a = subprocess.run(command, capture_output=True, text=True, shell=True)
                        output = result_a.stdout.strip()
                        chromeversion = '.'.join(output.split('=')[1].split('.')[0:3])

                        # 判断版本是否一致,不一致就重新下载
                        if driverversion != chromeversion:
                        # 使用ChromeDriverManager安装ChromeDriver,并获取驱动程序的路径
                        download_driver_path = ChromeDriverManager().install()
                        # 复制文件到目标位置
                        shutil.copy(download_driver_path, folder_path)
                        else:
                        print("版本一致,无需重新下载!")

                        else:
                        download_driver_path = ChromeDriverManager().install()
                        shutil.copy(download_driver_path, folder_path)

                        return file_path
                        - -

                        edge

                        下载驱动

                        from webdriver_manager.microsoft import EdgeChromiumDriverManager

                        @staticmethod
                        def download_edgedriver():
                        '''
                        function:下载edge浏览器驱动
                        return: 返回一个下载的路径
                        '''
                        folder_path = EdgeChromiumDriverManager().install()
                        shutil.copy(folder_path, webDriver) # 拷贝folder_path到webDriver目录下
                        return folder_path
                        - -

                        使用

                        # driver = webdriver.Edge(service=Service(下载路径))
                        driver = webdriver.Edge(service=Service(ddDriver.download_edgedriver()))
                        - + 如何使用pyyaml获取yaml里面的数据 + /posts/28702.html + 准备数据

                        在config目录下创建environment.yaml文件

                        +
                        username: 周杰伦
                        password: 123456
                        +
                        使用pyyaml获取yaml中的数据
                        解析yaml文件

                        首先创建yaml_config文件,为了方便自动化后面的引用,需要创建一个类,在__init__里面打开yaml文件,使用yaml.load(文件名称, Loader=yaml.FullLoader )方法获取数据

                        +

                        打印出字典格式的数据{'username': '周杰伦', 'password': 123456}

                        +
                        import yaml
                        from common.tools import get_project_path, sep


                        class GetConf:
                        def __init__(self):
                        with open(../config.environment.yaml), "r", encoding="utf-8")\
                        as env_file:
                        self.env = yaml.load(env_file, Loader=yaml.FullLoader)
                        -

                        firefox

                        下载驱动

                        @staticmethod
                        def down_driver(option):
                        driver = webdriver.Firefox
                        (
                        service=FirefoxService(GeckoDriverManager(url="https://github.com/mozilla/geckodriver/releases/download",
                        latest_release_url="https://api.github.com/repos/mozilla/geckodriver/"
                        "releases/latest",
                        cache_valid_range=365).install(),
                        options=option))
                        return driver
                        +

                        现在使用的是相对路径,后期如果换系统,或者更换文件位置,就需要自己获得文件路径,下面对代码进行优化

                        +
                        优化项:获得项目名称的url地址

                        创建get_project_path方法,获取项目根目录的绝对路径

                        +

                        首先定义一个变量,变量的值是项目的名称project_name = "trading_system_autotest"

                        +

                        获取当前文件的所在目录的绝对路径,需要使用python的os模块file_path=os.path.dirname(__file__)

                        +

                        在绝对路径中找到项目名称的下标位置file_path.find(project_name)

                        +

                        找到项目所在目录的绝对路径下标+项目名称的长度=项目根目录的绝对路径的下标file_path.find(project_name)+len(project_name)

                        +

                        然后对所在目录的绝对路径file_path进行切片获得项目根目录的绝对路径

                        +

                        file_path[: file_path.find(project_name)+len(project_name)]

                        +
                        def get_project_path():
                        """
                        获取项目根目录的绝对路径
                        :return:
                        """
                        project_name = "trading_system_autotest"
                        # 获取当前文件的所在目录的绝对路径
                        file_path = os.path.dirname(__file__)
                        # # 在绝对路径中找到项目名称的下标位置
                        # print(file_path.find(project_name))
                        # 找到项目所在目录的绝对路径+项目名称的长度=项目的绝对路径
                        # print(len(project_name))
                        return file_path[: file_path.find(project_name)+len(project_name)]
                        +
                        优化项:获得拼接后的目录和文件

                        创建sep(path, add_sep_before=False, add_sep_after=False)方法,获得文件和目录的拼接

                        +

                        变量

                        +

                        path变量需要传输一个列表,列表里面是文件所在目录和文件名称,如[文件所在目录,文件名称]

                        +

                        首先使用os.sep.join对列表的字段进行拼接all_path = os.sep.join(path)

                        +

                        add_sep_before进行判断,如果是True,就在前面添加拼接符all_path = os.sep + all_path

                        +

                        add_sep_after进行判断,如果是True,就在后面添加拼接符all_path = all_path + os.sep

                        +

                        windows格式拼接符有可能错误,就要对拼接符转换格式all_path = all_path.replace('\\', '/'),就算没有这个代码,也可以运行出来,只是调试该代码看起来不好看

                        +

                        然后返回all_path

                        +
                        def sep(path, add_sep_before=False, add_sep_after=False):
                        """
                        :param path: is list format:[Current directory , Current file]
                        :param add_sep_before: Add before directory "/"
                        :param add_sep_after: Add after directory "/"
                        :return: Current directory/Current file
                        """
                        all_path = os.sep.join(path)
                        # 在前面添加\
                        if add_sep_before:
                        all_path = os.sep + all_path
                        # 在后面添加\
                        if add_sep_after:
                        all_path = all_path + os.sep
                        # 转换格式 把\转换为/
                        all_path = all_path.replace('\\', '/')
                        return all_path
                        +
                        优化后的代码
                        class GetConf:
                        def __init__(self):
                        with open(get_project_path()+sep(["config", "environment.yaml"], add_sep_before=True), "r", encoding="utf-8")\
                        as env_file:
                        self.env = yaml.load(env_file, Loader=yaml.FullLoader)
                        print(self.env)

                        def get_username_password(self):
                        return self.env["username"], self.env["password"]
                        ]]>
                        @@ -3335,20 +3306,106 @@ if __name__ == "__init__":
                        - Shell脚本入门 - /posts/41091.html - 创建txt文件并向txt文件追加数据

                        首先创建test_shell.sh文件

                        -
                        touch test_shell.sh
                        - -

                        test_shell.sh文件输入shell脚本

                        + Shell工具(二) + /posts/55957.html + awk工具
                        +

                        强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

                        +
                        +

                        awk [选项参数] ‘pattern1{action1}’ filename

                          -
                        • 使用shell创建banzhang.txt文件

                          -
                        • -
                        • 在文件中追加数据echo "aabbccdd" >> banzhang.txt

                          -
                        • +
                        • pattern:表示awk在数据中查找的内容
                        • +
                        • action:找到匹配内容时执行命令
                        -
                        #!/bin/bash
                        # 指定目录
                        cd /opt/
                        # 创建文件
                        touch banzhang.txt
                        # 向文件追加数据
                        echo "touch banzhang" >> banzhang.txt
                        + + + + + + + + + + + + + + + +
                        选项参数功能
                        -F指定输入文件分隔符
                        -v赋值一个用户定义变量
                        +
                        举个栗子

                        数据准备的是/etc/passwd

                        +
                        [root@b09ed0cc2c9d opt]# cat passwd
                        root:x:0:0:root:/root:/bin/bash
                        bin:x:1:1:bin:/bin:/sbin/nologin
                        daemon:x:2:2:daemon:/sbin:/sbin/nologin
                        adm:x:3:4:adm:/var/adm:/sbin/nologin
                        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
                        sync:x:5:0:sync:/sbin:/bin/sync
                        shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
                        halt:x:7:0:halt:/sbin:/sbin/halt
                        mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
                        operator:x:11:0:operator:/root:/sbin/nologin
                        games:x:12:100:games:/usr/games:/sbin/nologin
                        ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
                        nobody:x:99:99:Nobody:/:/sbin/nologin
                        systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
                        dbus:x:81:81:System message bus:/:/sbin/nologin
                        + +

                        搜素passwd文件以root关键字开头的所有航,并输出该行的第7列

                        +
                        [root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $7}' passwd
                        /bin/bash
                        [root@b09ed0cc2c9d opt]#
                        + +

                        搜素passwd文件以root关键字开头的所有航,并输出该行的第1列和第7列,输出时以逗号分隔

                        +
                        [root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $1","$7}' passwd
                        root,/bin/bash
                        + +

                        只显示/etc/passwd的第一列和第7列,以逗号分隔,且在所有航前面添加列名 user,shell在最后一行添加 ddd, /bin/zuishuai

                        +
                        [root@b09ed0cc2c9d opt]# awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "ddd,bin/zuishuai"}' passwd
                        + +

                        注意:BEGIN 在所有数据读取行之前执行; END 在所有数据执行之后执行

                        +

                        将passwd 文件中的用户id增加数值1并输出

                        +
                        [root@b09ed0cc2c9d opt]# awk -F : -v i=1 '{print $3+i}' passwd
                        + +
                        内置变量
                        + + + + + + + + + + + + + + + + + + +
                        变量说明
                        filename文件名
                        nr已读的记录数
                        nf浏览记录的域的个数
                        +
                        举个栗子

                        数据准备

                        +
                        [root@b09ed0cc2c9d opt]# cat sed.txt
                        dong shen
                        guan zhen
                        wo wo
                        lai lai

                        le le
                        + +

                        统计passwd文件名,每行的行号,每列的列数

                        +
                        [root@b09ed0cc2c9d opt]# awk -F : '{print FILENAME "," NR "," NF}' passwd
                        +

                        打印空行所在的行号

                        +
                        awk '/^$/ {print NR}' sed.txt
                        + +
                        sort工具
                        +

                        文件排序

                        +
                        +

                        sort(选项)(参数)

                        + + + + + + + + + + + + + + + + + + + + + + + +
                        选项说明
                        -n按照数值大小排序
                        -r以相反的顺序排序
                        -t设置排序使用的分隔字符
                        -k指定需要排序的列
                        +

                        参数是指定待排序文件列表

                        ]]>
                        工具教程 @@ -3503,171 +3560,105 @@ if __name__ == "__init__":
                        - Shell条件判断 - /posts/50013.html - 基本语法

                        [ condition ] (注意,condition 前后要有空格

                        -

                        注意:条件非空即为 true,[ atguigu ]返回 true, [] 返回 false.

                        -
                        常用条件判断
                        两个整数之间进行比较
                        = 字符串比较
                        -lt 小于
                        -le 小于等于
                        -eq 等于
                        -gt 大于
                        -ge 大于等于
                        -ne 不等于
                        - -

                        举个栗子

                        -
                        [23 -lt 80]
                        echo $? # 判断上一步操作是不是正确
                        - -
                        按照文件权限进行判断
                        -r 读
                        -w 写
                        -x 执行
                        - -

                        举个栗子

                        -
                        [ -w 1.sh ]
                        echo $?
                        - -
                        文件类型判断
                        -f 文件存在且是一个常规文件
                        -e 文件存在
                        -d 文件存在且是一个目录
                        - -

                        举个栗子

                        -
                        [ -e 2.sh ]
                        echo $?
                        - -
                        多条件判断

                        $$ 与 ,前对,才执行后

                        -

                        ||

                        -]]>
                        - - 工具教程 - - - shell - -
                        - - Shell函数 - /posts/27832.html - 系统函数
                        basename基本语法
                        basename [string/ pathname][文件后缀] 
                        - -

                        basename命令会删掉所有的前缀,只留一个文件名

                        -

                        选项:

                        -

                        如果指定后缀,basename会将pathname或string中的文件后缀去掉

                        -
                        举个栗子

                        截取该/opt/banzhang.txt路径的文件名称

                        -
                        [root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt
                        banzhang.txt
                        [root@b09ed0cc2c9d opt]# basename /opt/banzhang.txt .txt
                        banzhang
                        [root@b09ed0cc2c9d opt]#
                        - -
                        dirname基本语法
                        dirname 文件绝对路径
                        - -

                        从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录部分)

                        -
                        举个栗子
                        [root@b09ed0cc2c9d opt]# dirname /opt/banzhang.txt
                        /opt
                        [root@b09ed0cc2c9d opt]#
                        - -
                        自定义函数
                        基本语法
                        [function] funname[()]
                        {
                        Action;
                        [retion int;]
                        }

                        funname
                        - -
                        举个栗子
                        #!/bin/bash

                        function sum()
                        {
                        s=0;
                        s=$[$1+$2]
                        echo $s
                        }

                        read -p "input your paratemer1:" p1
                        read -p "input your oaeayemer2:" p2

                        sum $p1 $p2
                        - - - - - -]]>
                        - - 工具教程 - - - shell - -
                        - - Shell流程控制 - /posts/65365.html - if判断
                        基本语法
                          -
                        • [ 条件判断式 ],中括号和条件判断式之间必须有空格

                          -
                        • -
                        • if后要有空格

                          -
                        • + 解析ini文件用于数据驱动 + /posts/42174.html + 背景
                            +
                          • PO设计模式是selenum自动化测试中比较好的设计模式
                          • +
                          • 在项目的开发过程中,UI界面上的元素不确定,会经常变化
                          -
                          if [ 条件判断式 ]:then
                          程序
                          fi
                          #或者
                          if[ 条件判断式 ]
                          then
                          程序
                          fi
                          - -
                          举个栗子

                          输入一个数字,如果是1,则输出 banzhang zhen shuai,如果是2,则输出 cls zhen mei ,如果是其他,则什么都不输出

                          -
                          #!/bin/bash
                          if [ $1 -eq 1 ]
                          then
                          echo "banzhang zhen shuai"
                          elif [ $1 -eq 2 ]
                          then
                          echo "cls zhen mei"
                          fi
                          - -
                          case 语句
                          基本语法
                            -
                          • case行尾必须是单词 “in”,每一个模式匹配必须以右括号 “)” 结束
                          • -
                          • 双分号 “;;” 表示命令序列结束,相当于java的break
                          • -
                          • 最后的 “*)” 表示默认模式,相当于java的default
                          • +

                            过程解析

                              +
                            • 在PyCharm创建ini文件
                            • +
                            • 创建一个可以解析ini文件的python模块(parse_ini)
                            • +
                            • 其他模块引用parse_ini文件里面的方法把ini文件解析出来
                            -
                            case $变量名 in  
                            "值 1")
                            如果变量的值等于1,执行程序1
                            ;;
                            "值 2")
                            如果变量的值等于2,执行程序2
                            ;;
                            *)
                            如果变量的值不是以上的值,则执行此程序
                            esac
                            - -
                            举个栗子

                            输入一个数字,如果是 1,则输出 banzhang,如果是 2,则输出 cls,如果是其他,输出 renyao

                            -
                            #!/bin/bash
                            case $1 in
                            "1")
                            echo "banzhang"
                            ;;

                            "2")
                            echo "cls"
                            ;;

                            *)
                            echo "renyou"
                            esac
                            - -
                            For循环
                            基本语法1
                            for(( 初始值;循环控制添加;变量变化 ))
                            do
                            程序
                            done
                            - -
                            举个栗子1

                            输出从1加到100的值

                            -
                            #!/bin/bash

                            s=0
                            for ((i=1;i<=100;i++))
                            do
                            s=$[$s+$i]
                            done
                            echo "cong1jiadao100:$s"
                            - -
                            基本语法2
                            for 变量 in 值1 值2 值3...
                            do
                            程序
                            done
                            - -
                            举个栗子2

                            打印所有输入参数

                            -
                            #!/bin/bash

                            for i in "$*"
                            do
                            echo "banzhang xihuan $i"
                            done
                            #-----------------------------------
                            for j in "$@"
                            do
                            echo "banzhang xihuan $j"
                            done
                            - -
                            while 循环
                            基本语法
                            while[ 条件判断式 ]
                            do
                            程序
                            done
                            - -
                            举个栗子

                            输出从1加到100的值

                            -
                            #!/bin/bash

                            i=1
                            while [ $i -le 100 ]
                            do
                            s=$[$s + $i]
                            i=$[$i + 1]
                            done

                            echo $s
                            +

                            创建ini文件

                            image

                            +

                            创建parse_ini模块

                            import configparser
                             
                            -
                            read 读取控制台输入
                            基本语法
                            read(选项)(参数)
                            选项:
                            -p:指定读取值时的提示符
                            -t:指定读取值时的等待的时间(秒)
                            参数:
                            变量:指定读取值的变量名
                            +class Parse_Ini(object): -
                            举个栗子

                            提示7秒内,读取控制台输入的名称

                            -
                            #!/bin/bash

                            read -t 7 -p "input your name" NAME

                            echo $NAME
                            + def __init__(self): + self.file = r"D:\dingdang_project\test\config.ini" + self.parse = configparser.ConfigParser() + self.parse.read(self.file, encoding="utf-8") -]]> - - 工具教程 - - - shell - - - - Shell脚本初探 - /posts/38168.html - 编写shell脚本时,必须以 #! /bin/bash 开头

                            在linux创建helloworld.sh文件,在文件内输入:

                            -
                            #!/bin/bash
                            #################
                            echo "hello World"
                            + def get_sections(self): + """ + :return: 由sections组成的列表 + """ + return self.parse.sections() -

                            然后保存该文件

                            -

                            运行.sh文件时,有两种方法可以运行

                            -
                            第一种是给该文件添加可执行权限
                            chmod +x ./helloworld.sh
                            + def get_options(self, sections): + """ + :return: 返回指定 section 中可用选项的列表。 + """ + return self.parse.options(sections) -

                            运行文件:./ 不能省略

                            -
                            ./helloworld.sh
                            + def get_sections_options(self, sections, options): + """ + :param sections: 元素名称 + :param options: 元素地址 + :return: 指定sections下的options + """ + try: + option = self.parse.get(sections, options) + if ("-->" in option): + option = tuple(option.split("-->")) + return option + except configparser.NoOptionError as e: + return 'error: No option "{}" in section: "{}"'.format(options, sections) -
                            第二种是使用bash或sh 文件路径运行该文件
                            bash helloworld.sh
                            #
                            sh helloworld.sh
                            + +if __name__ == "__init__": + pass +
                            +

                            举个栗子:

                            栗子1

                            image

                            +
                            运行结果:

                            image

                            +
                            栗子2

                            image

                            +
                            运行结果:

                            image

                            ]]> 工具教程 - shell + python - 返回cookie的Get接口开发 - /posts/24951.html - 位置布局
                            - java
                            - com.course.server
                            - intertype
                            MyGetMethod
                            Application
                            - resources
                            - application.properties
                            - -

                            Application 类

                            创建Application.java类,用来运行接口,类名只能是Application,不能自定义

                            -
                            @SpringBootApplication
                            @Controller("com.course.server.intertype")
                            public class Application {

                            public static void main(String[] args) {
                            SpringApplication.run(Application.class, args);
                            }
                            }
                            + 解析Excel用于数据驱动 + /posts/12080.html + 新建Excel
                            +

                            创建Excel数据表:learn.xlsx

                            +
                            +
                            + +
                            -
                              -
                            • @SpringBootApplication 作用是给当前类标明是运行的主类,相当于被SpringBoot托管了
                            • -
                            • @Controller("com.course.server.intertype") 钩子标识符,扫描包下面的类,被Springboot托管
                            • -
                            -

                            编写Get接口

                            创建MyGetMethod

                            -

                            类名上有修饰符@RestController@Api(value = "/")

                            -
                              -
                            • @RestController 标识该类会被扫描到,然后被SpringBoot托管
                            • -
                            • @Api(value = "/") 可加可不加
                            • -
                            • @RequestMapping(value = "访问路径", method = 访问方法) 定义接口的访问路径及访问方法
                            • -
                            • @ApiOperation(value = "接口信息", httpMethod = "接口的请求方法") 展示接口的基本信息和它的请求方法,可加可不加
                            • -
                            -

                            下面是代码信息,之后的所有GET接口都在该类里面写接口方法

                            -
                            @RestController
                            @Api(value = "/", tags = {SwaggerConfig.TagGet} )
                            public class MyGetMethod {

                            @RequestMapping(value = "/getCookies", method = RequestMethod.GET)
                            @ApiOperation(value = "通过这个方法可以获得cookies", httpMethod = "GET")
                            public String getCookies(HttpServletResponse response){

                            // HttpServerletRequest 装请求信息类
                            // HttpServerletResponse 装响应信息类

                            Cookie cookie = new Cookie("login", "True");

                            response.addCookie(cookie);

                            return "恭喜获得cookies信息成功";
                            }
                            }
                            +

                            解析excel

                            +

                            使用python的openpyxl模块来解析Excel

                            +
                            +

                            1、读取Excel文件

                            +

                            openpyxl.load_workbook(‘文件路径’)

                            +
                            +
                            excel = openpyxl.load_workbook('learn.xlsx')
                            +

                            2、获取sheet页里面的数据

                            # 获取当前活动的表单
                            sheet = excel.active
                            # 获取指定的表单
                            for sheets in excel.sheetnames: #获取所有表单的名称
                            print(sheets)
                            sheet = excel[sheets] #获取指定表单
                            +

                            3、获取单元格里面的内容

                            for values in sheet.values:
                            if type(value[0]) == int: #从第二行开始
                            print(values)
                            +

                            运行代码:

                            +
                            + +
                            -

                            上面就是返回cookie的get接口开发,接下来就是 需要携带cookies信息才能访问的get请求

                            +

                            把Excel表里面的数据以字典格式展示:

                            +
                            data = {}
                            data["name"] = values[0]
                            data["value"] = values[1]
                            print(data)
                            +

                            运行代码:

                            +
                            + +
                            ]]>
                            工具教程 - SpringBoot + python
                            @@ -3684,30 +3675,6 @@ if __name__ == "__init__": SpringBoot - - Shell运算符 - /posts/59561.html - 基本语法
                              -
                            1. $((运算式)) 或 $[运算式]
                            2. -
                            3. expr + - * /
                            4. -
                            -

                            注意,运算符号间要有空格

                            -
                            举个加法栗子
                            expr 3 + 2
                            5
                            - -
                            举栗子[(2+3)*4]

                            需要使用键盘左上角的`,把需要提前运算的包起来

                            -
                            expr `expr 2 + 3` \* 4
                            - -

                            或者

                            -
                            s=$[(2+3)*4]
                            echo $s
                            - -]]>
                            - - 工具教程 - - - shell - -
                            接口开发环境部署 /posts/557.html @@ -3728,6 +3695,32 @@ if __name__ == "__init__": SpringBoot + + 需要cookie访问的Get接口开发 + /posts/15521.html + 编写需要cookie才能访问的接口

                            这个接口还是在MyGetMethod类里面编写方法

                            +
                            /**
                            * 要求客户端携带cookie访问
                            * 这是一个需要携带cookies信息才能访问的get请求
                            */
                            @RequestMapping(value = "/get/with/cookies", method = RequestMethod.GET)
                            @ApiOperation(value = "要求客户端携带cookie访问", httpMethod = "GET")
                            public String getWithCookies(HttpServletRequest request){
                            Cookie[] cookies = request.getCookies();
                            if(Objects.isNull(cookies)){
                            return "你必须携带cookies信息来";
                            }
                            for(Cookie cookie : cookies){
                            if(cookie.getName().equals("login") && cookie.getValue().equals("True")){
                            return "恭喜你,访问成功!,这是一个需要携带cookies信息才能访问的get请求";
                            }
                            }
                            return "你必须携带cookies信息来";
                            }
                            ]]>
                            + + 工具教程 + + + SpringBoot + +
                            + + 开发获得cookie的Post登录接口 + /posts/42075.html + 开发获得cookie的Post登录接口

                            @RequestMapping(value = "/v1")的作用是把这个value和方法上的登录地址进行拼接,比如:/v1/login

                            +

                            @RestController标识该接口可以被托管

                            +

                            方法参数@RequestParam(value = "userName", required = true) String userName,代码中的required = true起到必填的作用

                            +

                            举个栗子

                            @RestController
                            @Api(value = "/", tags = {SwaggerConfig.TagPost})
                            @RequestMapping(value = "/v1")
                            public class MyPostMethod {

                            //这个变量用来装cookie信息的
                            private static Cookie cookie;

                            //用户登录成功获取到cookies,然后访问其他接口获取到列表
                            @RequestMapping(value = "/login",method = RequestMethod.POST)
                            @ApiOperation(value = "登录接口,成功后获取到cookies信息",httpMethod = "POST")
                            public String login(HttpServletResponse response,
                            @RequestParam(value = "userName", required = true) String userName,
                            @RequestParam(value = "password", required = true) String password){
                            if (userName.equals("zhangsan") && password.equals("123456")){
                            cookie = new Cookie("login","true");
                            response.addCookie(cookie);
                            return "恭喜你登录成功!";
                            }
                            return "用户名或密码错误!";

                            }
                            ]]>
                            + + 工具教程 + + + SpringBoot + +
                            需要参数才能访问的get请求 /posts/7613.html @@ -3736,183 +3729,158 @@ if __name__ == "__init__":

                            第一种url:key=value&&key=value

                            /**
                            * 开发一个需要参数才能访问的get请求
                            * 模拟获取商品列表
                            */
                            @RequestMapping(value = "/get/with/param", method = RequestMethod.GET)
                            @ApiOperation(value = "需要参数才能访问的get请求的第一种实现方法", httpMethod = "GET")
                            public Map<String, Integer> getList(@RequestParam Integer start,
                            @RequestParam Integer end){

                            Map<String, Integer> myList = new HashMap<>();

                            myList.put("鞋",400);
                            myList.put("电脑",5000);
                            myList.put("手机",3500);

                            return myList;

                            }
                            -

                            方法二url: ip:port/get/with/param/10/20

                            -

                            /**
                            * 第二种需要携带参数访问的get请求
                            */

                            @RequestMapping(value = "/get/with/param/{start}/{end}", method = RequestMethod.GET)
                            @ApiOperation(value = "需要参数才能访问的get请求的第二种实现方法", httpMethod = "GET")
                            public Map<String,Integer> myGetList(@PathVariable Integer start,
                            @PathVariable Integer end){

                            Map<String, Integer> myList = new HashMap<>();

                            myList.put("鞋",400);
                            myList.put("电脑",5000);
                            myList.put("手机",3500);

                            return myList;
                            }
                            +

                            方法二url: ip:port/get/with/param/10/20

                            +

                            /**
                            * 第二种需要携带参数访问的get请求
                            */

                            @RequestMapping(value = "/get/with/param/{start}/{end}", method = RequestMethod.GET)
                            @ApiOperation(value = "需要参数才能访问的get请求的第二种实现方法", httpMethod = "GET")
                            public Map<String,Integer> myGetList(@PathVariable Integer start,
                            @PathVariable Integer end){

                            Map<String, Integer> myList = new HashMap<>();

                            myList.put("鞋",400);
                            myList.put("电脑",5000);
                            myList.put("手机",3500);

                            return myList;
                            }
                            +]]> + + 工具教程 + + + SpringBoot + +
                            + + python自动化配置参数 + /posts/1.html + selenium 配置参数

                            每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有历史记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器

                            +

                            selenium启动配置参数接收是ChromeOptions类,创建方式如下 :

                            +
                            from selenium import webdriver
                            option = webdriver.ChromeOptions()
                            driver = webdriver.Chrome(chrome_options=option)
                            创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目
                            + +
                            from selenium import webdriver
                            option = webdriver.ChromeOptions()
                            +

                            添加启动参数

                            option.add_argument()
                            + +

                            添加扩展应用

                            option.add_extension()
                            option.add_encoded_extension()
                            + +

                            添加实验性质的设置参数

                            option.add_experimental_option()
                            + +

                            设置调试器地址

                            option.debugger_address()
                            + +

                            常用配置参数:

                            from selenium import webdriver
                            option = webdriver.ChromeOptions()

                            +

                            添加UA

                            options.add_argument('user-agent="MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"')
                            + +

                            指定浏览器分辨率

                            options.add_argument('window-size=1920x3000')
                            + +

                            谷歌文档提到需要加上这个属性来规避bug

                            chrome_options.add_argument('--disable-gpu')
                            + +

                            隐藏滚动条, 应对一些特殊页面

                            options.add_argument('--hide-scrollbars')
                            + +

                            不加载图片, 提升速度

                            options.add_argument('blink-settings=imagesEnabled=false')
                            + +

                            浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

                            options.add_argument('--headless')
                            + +

                            以最高权限运行

                            options.add_argument('--no-sandbox')
                            + +

                            手动指定使用的浏览器位置

                            options.binary_location = r"C:Program Files (x86)GoogleChromeApplicationchrome.exe"
                            + +

                            添加crx插件

                            option.add_extension('d:crxAdBlock_v2.17.crx')
                            + +

                            禁用JavaScript

                            option.add_argument("--disable-javascript")
                            + +

                            设置开发者模式启动,该模式下webdriver属性为正常值

                            options.add_experimental_option('excludeSwitches', ['enable-automation'])
                            + +

                            禁用浏览器弹窗

                            prefs = { 
                            'profile.default_content_setting_values' : {
                            'notifications' : 2
                            }
                            }
                            options.add_experimental_option('prefs',prefs)
                            + +

                            添加代理 ip

                            options.add_argument("--proxy-server=http://XXXXX.com:80")

                            driver = webdriver.Chrome(chrome_options=chrome_options)
                            + +

                            其他配置项目参数

                            指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区

                            --user-data-dir=[PATH]
                            + +

                            指定缓存Cache路径

                            –disk-cache-dir=[PATH]
                            + +

                            指定Cache大小,单位Byte

                            –disk-cache-size=
                            + +

                            重置到初始状态,第一次运行

                            –first run
                            + +

                            隐身模式启动

                            –incognito
                            + +

                            禁用Javascript

                            –disable-javascript
                            + +

                            将地址栏弹出的提示菜单数量改为num个

                            --omnibox-popup-count="num"
                            + +

                            修改HTTP请求头部的Agent字符串,可以通过about:version页面查看修改效果

                            --user-agent="xxxxxxxx"
                            + +

                            禁止加载所有插件,可以增加速度。可以通过about:plugins页面查看效果

                            --disable-plugins
                            + +

                            禁用JavaScript,如果觉得速度慢在加上这个

                            --disable-javascript
                            + +

                            禁用java

                            --disable-java
                            + +

                            启动就最大化

                            --start-maximized
                            + +

                            取消沙盒模式

                            --no-sandbox
                            + +

                            单进程运行

                            --single-process
                            + +

                            每个标签使用单独进程

                            --process-per-tab
                            + +

                            每个站点使用单独进程

                            --process-per-site
                            + +

                            插件不启用单独进程

                            --in-process-plugins
                            + +

                            禁用弹出拦截

                            --disable-popup-blocking
                            + +

                            禁用插件

                            --disable-plugins
                            + +

                            禁用图像

                            --disable-images
                            + +

                            启动进入隐身模式

                            --incognito
                            + +

                            启用账户切换菜单

                            --enable-udd-profiles
                            + +

                            使用pac代理 [via 1/2]

                            --proxy-pac-url
                            + +

                            设置语言为简体中文

                            --lang=zh-CN
                            + +

                            自定义缓存目录

                            --disk-cache-dir
                            + +

                            自定义缓存最大值(单位byte)

                            --disk-cache-size
                            + +

                            自定义多媒体缓存最大值(单位byte)

                            --media-cache-size
                            + +

                            在工具 栏增加一个书签按钮

                            --bookmark-menu
                            + +

                            启用书签同步

                            --enable-sync
                            + +

                            使用缓存

                            options.add_argument("--disk-cache-dir=/path/to/cache/folder")
                            options.add_argument("--disable-application-cache")
                            options.add_argument("--disable-cache")
                            + +

                            参考:https://www.cnblogs.com/sn5200/p/15949796.html

                            ]]>
                            工具教程 - SpringBoot - -
                            - - 需要cookie访问的Get接口开发 - /posts/15521.html - 编写需要cookie才能访问的接口

                            这个接口还是在MyGetMethod类里面编写方法

                            -
                            /**
                            * 要求客户端携带cookie访问
                            * 这是一个需要携带cookies信息才能访问的get请求
                            */
                            @RequestMapping(value = "/get/with/cookies", method = RequestMethod.GET)
                            @ApiOperation(value = "要求客户端携带cookie访问", httpMethod = "GET")
                            public String getWithCookies(HttpServletRequest request){
                            Cookie[] cookies = request.getCookies();
                            if(Objects.isNull(cookies)){
                            return "你必须携带cookies信息来";
                            }
                            for(Cookie cookie : cookies){
                            if(cookie.getName().equals("login") && cookie.getValue().equals("True")){
                            return "恭喜你,访问成功!,这是一个需要携带cookies信息才能访问的get请求";
                            }
                            }
                            return "你必须携带cookies信息来";
                            }
                            ]]>
                            - - 工具教程 - - - SpringBoot - -
                            - - 开发获得cookie的Post登录接口 - /posts/42075.html - 开发获得cookie的Post登录接口

                            @RequestMapping(value = "/v1")的作用是把这个value和方法上的登录地址进行拼接,比如:/v1/login

                            -

                            @RestController标识该接口可以被托管

                            -

                            方法参数@RequestParam(value = "userName", required = true) String userName,代码中的required = true起到必填的作用

                            -

                            举个栗子

                            @RestController
                            @Api(value = "/", tags = {SwaggerConfig.TagPost})
                            @RequestMapping(value = "/v1")
                            public class MyPostMethod {

                            //这个变量用来装cookie信息的
                            private static Cookie cookie;

                            //用户登录成功获取到cookies,然后访问其他接口获取到列表
                            @RequestMapping(value = "/login",method = RequestMethod.POST)
                            @ApiOperation(value = "登录接口,成功后获取到cookies信息",httpMethod = "POST")
                            public String login(HttpServletResponse response,
                            @RequestParam(value = "userName", required = true) String userName,
                            @RequestParam(value = "password", required = true) String password){
                            if (userName.equals("zhangsan") && password.equals("123456")){
                            cookie = new Cookie("login","true");
                            response.addCookie(cookie);
                            return "恭喜你登录成功!";
                            }
                            return "用户名或密码错误!";

                            }
                            ]]>
                            - - 工具教程 - - - SpringBoot + python
                            - 开发获取用户列表的Post接口 - /posts/16785.html - 开发获取用户列表的post请求

                            开发添加人员信息时需要的字段数据

                            首先,写一个User类,这将是添加时的字段数据

                            -
                            @Data
                            public class User {
                            private String userName;
                            private String password;
                            private String name;
                            private String age;
                            private String sex;
                            }
                            + 返回cookie的Get接口开发 + /posts/24951.html + 位置布局
                            - java
                            - com.course.server
                            - intertype
                            MyGetMethod
                            Application
                            - resources
                            - application.properties
                            -

                            然后开始写怎么获取用户列表,相当于添加用户

                            @RequestBody User u请求post接口时,在Body填写上传的数据

                            -
                            @RequestMapping(value = "/getUserList", method = RequestMethod.POST)
                            @ApiOperation(value = "获取用户列表", httpMethod = "POST")
                            public String getUserList(HttpServletRequest request,
                            @RequestBody User u){
                            User user;
                            // 获取cookies
                            Cookie[] cookies= request.getCookies();
                            // 验证cookies是否合法
                            for(Cookie c:cookies){
                            if (c.getName().equals("login")
                            && c.getValue().equals("true")
                            && u.getUserName().equals("zhangsan")
                            && u.getPassword().equals("123456")){
                            user = new User();
                            user.setName("lisi");
                            user.setAge("18");
                            user.setSex("man");
                            return user.toString();
                            }
                            }
                            return "参数不合法";
                            }
                            ]]>
                            - - 工具教程 - - - SpringBoot - -
                            - - 2023立的flag - /posts/44161.html - 目前所拥有的进度
                              -
                            • 考研恋练有词必背词全部背锅一边

                              -
                            • -
                            • 自动化测试已部署

                              -
                            • -
                            • -
                            • +

                              Application 类

                              创建Application.java类,用来运行接口,类名只能是Application,不能自定义

                              +
                              @SpringBootApplication
                              @Controller("com.course.server.intertype")
                              public class Application {

                              public static void main(String[] args) {
                              SpringApplication.run(Application.class, args);
                              }
                              }
                              + +
                                +
                              • @SpringBootApplication 作用是给当前类标明是运行的主类,相当于被SpringBoot托管了
                              • +
                              • @Controller("com.course.server.intertype") 钩子标识符,扫描包下面的类,被Springboot托管
                              -]]> - - 生活日常 - - - 目标&优化 - - - - Shell工具(二) - /posts/55957.html - awk工具
                              -

                              强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

                              -
                              -

                              awk [选项参数] ‘pattern1{action1}’ filename

                              +

                              编写Get接口

                              创建MyGetMethod

                              +

                              类名上有修饰符@RestController@Api(value = "/")

                                -
                              • pattern:表示awk在数据中查找的内容
                              • -
                              • action:找到匹配内容时执行命令
                              • +
                              • @RestController 标识该类会被扫描到,然后被SpringBoot托管
                              • +
                              • @Api(value = "/") 可加可不加
                              • +
                              • @RequestMapping(value = "访问路径", method = 访问方法) 定义接口的访问路径及访问方法
                              • +
                              • @ApiOperation(value = "接口信息", httpMethod = "接口的请求方法") 展示接口的基本信息和它的请求方法,可加可不加
                              - - - - - - - - - - - - - - - -
                              选项参数功能
                              -F指定输入文件分隔符
                              -v赋值一个用户定义变量
                              -
                              举个栗子

                              数据准备的是/etc/passwd

                              -
                              [root@b09ed0cc2c9d opt]# cat passwd
                              root:x:0:0:root:/root:/bin/bash
                              bin:x:1:1:bin:/bin:/sbin/nologin
                              daemon:x:2:2:daemon:/sbin:/sbin/nologin
                              adm:x:3:4:adm:/var/adm:/sbin/nologin
                              lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
                              sync:x:5:0:sync:/sbin:/bin/sync
                              shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
                              halt:x:7:0:halt:/sbin:/sbin/halt
                              mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
                              operator:x:11:0:operator:/root:/sbin/nologin
                              games:x:12:100:games:/usr/games:/sbin/nologin
                              ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
                              nobody:x:99:99:Nobody:/:/sbin/nologin
                              systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
                              dbus:x:81:81:System message bus:/:/sbin/nologin
                              - -

                              搜素passwd文件以root关键字开头的所有航,并输出该行的第7列

                              -
                              [root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $7}' passwd
                              /bin/bash
                              [root@b09ed0cc2c9d opt]#
                              - -

                              搜素passwd文件以root关键字开头的所有航,并输出该行的第1列和第7列,输出时以逗号分隔

                              -
                              [root@b09ed0cc2c9d opt]# awk -F : '/^root/{print $1","$7}' passwd
                              root,/bin/bash
                              - -

                              只显示/etc/passwd的第一列和第7列,以逗号分隔,且在所有航前面添加列名 user,shell在最后一行添加 ddd, /bin/zuishuai

                              -
                              [root@b09ed0cc2c9d opt]# awk -F : 'BEGIN{print "user,shell"} {print $1","$7} END{print "ddd,bin/zuishuai"}' passwd
                              - -

                              注意:BEGIN 在所有数据读取行之前执行; END 在所有数据执行之后执行

                              -

                              将passwd 文件中的用户id增加数值1并输出

                              -
                              [root@b09ed0cc2c9d opt]# awk -F : -v i=1 '{print $3+i}' passwd
                              - -
                              内置变量
                              - - - - - - - - - - - - - - - - - - -
                              变量说明
                              filename文件名
                              nr已读的记录数
                              nf浏览记录的域的个数
                              -
                              举个栗子

                              数据准备

                              -
                              [root@b09ed0cc2c9d opt]# cat sed.txt
                              dong shen
                              guan zhen
                              wo wo
                              lai lai

                              le le
                              - -

                              统计passwd文件名,每行的行号,每列的列数

                              -
                              [root@b09ed0cc2c9d opt]# awk -F : '{print FILENAME "," NR "," NF}' passwd
                              - -

                              打印空行所在的行号

                              -
                              awk '/^$/ {print NR}' sed.txt
                              +

                              下面是代码信息,之后的所有GET接口都在该类里面写接口方法

                              +
                              @RestController
                              @Api(value = "/", tags = {SwaggerConfig.TagGet} )
                              public class MyGetMethod {

                              @RequestMapping(value = "/getCookies", method = RequestMethod.GET)
                              @ApiOperation(value = "通过这个方法可以获得cookies", httpMethod = "GET")
                              public String getCookies(HttpServletResponse response){

                              // HttpServerletRequest 装请求信息类
                              // HttpServerletResponse 装响应信息类

                              Cookie cookie = new Cookie("login", "True");

                              response.addCookie(cookie);

                              return "恭喜获得cookies信息成功";
                              }
                              }
                              -
                              sort工具
                              -

                              文件排序

                              -
                              -

                              sort(选项)(参数)

                              - - - - - - - - - - - - - - - - - - - - - - - -
                              选项说明
                              -n按照数值大小排序
                              -r以相反的顺序排序
                              -t设置排序使用的分隔字符
                              -k指定需要排序的列
                              -

                              参数是指定待排序文件列表

                              +

                              上面就是返回cookie的get接口开发,接下来就是 需要携带cookies信息才能访问的get请求

                              ]]>
                              工具教程 - shell + SpringBoot
                              @@ -3952,6 +3920,46 @@ if __name__ == "__init__": 马哲 + + 开发获取用户列表的Post接口 + /posts/16785.html + 开发获取用户列表的post请求

                              开发添加人员信息时需要的字段数据

                              首先,写一个User类,这将是添加时的字段数据

                              +
                              @Data
                              public class User {
                              private String userName;
                              private String password;
                              private String name;
                              private String age;
                              private String sex;
                              }
                              + +

                              然后开始写怎么获取用户列表,相当于添加用户

                              @RequestBody User u请求post接口时,在Body填写上传的数据

                              +
                              @RequestMapping(value = "/getUserList", method = RequestMethod.POST)
                              @ApiOperation(value = "获取用户列表", httpMethod = "POST")
                              public String getUserList(HttpServletRequest request,
                              @RequestBody User u){
                              User user;
                              // 获取cookies
                              Cookie[] cookies= request.getCookies();
                              // 验证cookies是否合法
                              for(Cookie c:cookies){
                              if (c.getName().equals("login")
                              && c.getValue().equals("true")
                              && u.getUserName().equals("zhangsan")
                              && u.getPassword().equals("123456")){
                              user = new User();
                              user.setName("lisi");
                              user.setAge("18");
                              user.setSex("man");
                              return user.toString();
                              }
                              }
                              return "参数不合法";
                              }
                              ]]>
                              + + 工具教程 + + + SpringBoot + +
                              + + 自动获取driver + /posts/1.html + 自动获取driver

                              chrome

                              下载驱动

                              @staticmethod
                              def down_driver(option):
                              '''
                              return: 返回driver,可以直接使用
                              '''
                              driver = webdriver.Chrome(
                              ChromeDriverManager(
                              url="https://registry.npmmirror.com/-/binary/chromedriver",
                              latest_release_url="https://registry.npmmirror.com/-/binary/chromedriver/LATEST_RELEASE",
                              cache_valid_range=365).install(),
                              options=option)
                              driver.delete_all_cookies()
                              return driver
                              + +

                              下载2

                              @staticmethod
                              def determin_chrome_driver():

                              chrome_path = r'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'


                              # 指定谷歌驱动目标位置
                              folder_path = os.path.join(ROOT_DIR, "env_setting")
                              # 驱动名称
                              file_name = 'chromedriver.exe'
                              # 路径拼接
                              file_path = os.path.join(folder_path, file_name)

                              if os.path.exists(file_path):
                              # 获取chromedriver.exe版本(谷歌浏览器驱动)
                              result = subprocess.run([file_path, '--version'], capture_output=True, text=True)
                              driverversion = '.'.join(result.stdout.strip().split(' ')[1].split('.')[:-1])

                              # 获取chrome.exe版本(谷歌浏览器)
                              command = f'wmic datafile where name="{chrome_path}" get Version /value'
                              result_a = subprocess.run(command, capture_output=True, text=True, shell=True)
                              output = result_a.stdout.strip()
                              chromeversion = '.'.join(output.split('=')[1].split('.')[0:3])

                              # 判断版本是否一致,不一致就重新下载
                              if driverversion != chromeversion:
                              # 使用ChromeDriverManager安装ChromeDriver,并获取驱动程序的路径
                              download_driver_path = ChromeDriverManager().install()
                              # 复制文件到目标位置
                              shutil.copy(download_driver_path, folder_path)
                              else:
                              print("版本一致,无需重新下载!")

                              else:
                              download_driver_path = ChromeDriverManager().install()
                              shutil.copy(download_driver_path, folder_path)

                              return file_path
                              + +

                              edge

                              下载驱动

                              from webdriver_manager.microsoft import EdgeChromiumDriverManager

                              @staticmethod
                              def download_edgedriver():
                              '''
                              function:下载edge浏览器驱动
                              return: 返回一个下载的路径
                              '''
                              folder_path = EdgeChromiumDriverManager().install()
                              shutil.copy(folder_path, webDriver) # 拷贝folder_path到webDriver目录下
                              return folder_path
                              + +

                              使用

                              # driver = webdriver.Edge(service=Service(下载路径))
                              driver = webdriver.Edge(service=Service(ddDriver.download_edgedriver()))
                              + + + +

                              firefox

                              下载驱动

                              @staticmethod
                              def down_driver(option):
                              driver = webdriver.Firefox
                              (
                              service=FirefoxService(GeckoDriverManager(url="https://github.com/mozilla/geckodriver/releases/download",
                              latest_release_url="https://api.github.com/repos/mozilla/geckodriver/"
                              "releases/latest",
                              cache_valid_range=365).install(),
                              options=option))
                              return driver
                              + + + +]]>
                              + + 工具教程 + + + python + +
                              高数一 /posts/56062.html @@ -3988,6 +3996,25 @@ if __name__ == "__init__": 高数 + + 2023立的flag + /posts/44161.html + 目前所拥有的进度
                                +
                              • 考研恋练有词必背词全部背锅一边

                                +
                              • +
                              • 自动化测试已部署

                                +
                              • +
                              • +
                              • +
                              +]]>
                              + + 生活日常 + + + 目标&优化 + +
                              考研进度实况 /posts/52630.html diff --git a/self/css/researchblog.css b/self/css/researchblog.css index 26c42c909..9c4f83e39 100644 --- a/self/css/researchblog.css +++ b/self/css/researchblog.css @@ -1 +1 @@ -#nav{display:flex;padding:0 36px;width:100%;height:60px;box-shadow:none!important;border-bottom:1px solid #c9c9c9}#nav .menus_items .menus_item:hover .menus_item_child{display:block}[data-theme=light] #page-header.not-top-img #nav{background:rgba(255,255,255,.8);font-size:22px;-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}[data-theme=dark] #page-header.not-top-img #nav{background:rgba(0,0,0,.8);font-size:22px;box-shadow:0 5px 6px -5px #f05011}#nav .menus_items .menus_item{flex:1 1 auto;justify-content:flex-end;margin-left:auto;flex-wrap:nowrap;translate:60%;padding:0 0 0 15px}#toggleButtons{display:flex;flex:1 1 auto;justify-content:flex-end}#nav ::after{background-color:transparent!important}.menus_item_child li:not(#sidebar-menusli){float:left;border-radius:6px!important;-webkit-border-radius:6px!important;-moz-border-radius:6px!important;-ms-border-radius:6px!important;-o-border-radius:6px!important}.menus_item_child:not(#sidebar-menusul){left:50%;translate:-50%}[data-theme=light].menus_items{margin:5px!important;border-radius:5px;padding:20px}[data-theme=dark].menus_items{margin:5px!important;border-radius:5px;padding:20px}#aside-content .card-info #card-info-btn{display:block;margin-top:14px;background-color:#f05012;color:#fff;text-align:center;line-height:2.4}#aside-content .card-info #card-info-btn:hover{background-color:#ff7242}@media screen and (max-width:768px){[data-theme=light] .menus_item_child>li{border:1px solid #464646;margin:5px!important;border-radius:7px;padding-left:10px;padding-right:10px;width:100%;display:flex;translate:50%}}[data-theme=light] .site-page{padding:5px;padding-left:10px;padding-right:10px;border-radius:7px}[data-theme=light] .site-page:hover{color:#fff!important;background-color:#f05011}[data-theme=dark] .site-page{padding:5px;padding-left:10px;padding-right:10px;border-radius:7px}[data-theme=dark] .site-page:hover{color:#fff!important;background-color:#f05011}.nav-fixed #nav{transform:translateY(58px)!important;-webkit-transform:translateY(58px)!important;-moz-transform:translateY(58px)!important;-ms-transform:translateY(58px)!important;-o-transform:translateY(58px)!important}#nav{transition:none!important;-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important}#nav #site-name:hover{color:#fff!important;background-color:#f05011!important;padding:5px;padding-left:10px;padding-right:10px;border-radius:7px;box-shadow:0 0 3px #f05011!important}@media screen and (min-width:1200px){.layout{display:flex;max-width:1470px;flex:1 auto;margin:0 auto;padding:40px 15px;width:100%;margin-top:-1rem}.layout.hide-aside{max-width:1450px}#recent-posts{margin-top:-1rem;align-content:flex-start;display:flex;flex-wrap:wrap;justify-content:space-between}#recent-posts>.recent-post-item:not(.latest){margin-top:1rem;display:inline-block;height:auto;width:49%}#recent-posts>.recent-post-item:not(.latest) .post_cover{width:100%;height:200px}#recent-posts>.recent-post-item:not(.latest) .post_cover img.post_bg{width:100%;height:100%}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.content{display:none}#recent-posts>.recent-post-item:not(.latest){-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}#recent-posts>.recent-post-item:not(.latest) .left_radius{border-radius:12px 8px 0 0}#recent-posts>.recent-post-item:not(.latest) .right_radius{border-radius:12px 8px 0 0}.recent-post-item:not(.latest){height:auto!important}.recent-post-info{padding:0 40px;margin-top:1em;width:100%!important}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.article-title{-webkit-line-clamp:1;margin-top:.3rem;margin-bottom:.3rem;font-size:1.2em;line-height:1.4}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.article-title :hover{color:var(--lyx-theme)}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.article-meta-wrap{margin-bottom:1rem}}.latest{margin-top:1rem}.aside-content{max-width:312px;min-width:300px}.recent-posts{width:auto!important}span.card-archive-list-count{width:auto;text-align:left;font-size:1.5rem;line-height:.9;font-weight:700}.card-archive-list-count-group{display:flex;flex-direction:row;align-items:baseline}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:last-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:last-child{width:fit-content;margin-left:4px}span.card-archive-list-count{width:auto;text-align:left;font-size:1.1rem;line-height:.9;font-weight:700}.card-archive-list-date{font-size:14px;opacity:.6}li.card-category-list-item{flex:0 0 31%}li.card-archive-list-item{flex:0 0 48%}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{color:#fff;background-color:#f05011;box-shadow:0 8px 12px -3px #4259ef23;border-radius:8px;padding-left:.5rem;padding-right:.5rem}@media screen and (min-width:1300px){#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{transform:scale(1.03)}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:active,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:active{transform:scale(.97)}}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a,#aside-content .card-categories ul.card-category-list>.card-category-list-item a{border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-content:space-between;border:1px solid #e3e8f7}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:first-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:first-child{width:auto;flex:inherit}#aside-content .card-archives ul.card-archive-list,#aside-content .card-categories ul.card-category-list{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap}[data-theme=light] #aside-content .card-tag-cloud a{color:#363636!important;font-size:.8rem;border-radius:8px}[data-theme=dark] #aside-content .card-tag-cloud a{color:#e7e7e7!important;font-size:.8rem;border-radius:8px}#aside-content .card-tag-cloud a:hover{background:#f05011;color:#fff!important;box-shadow:0 8px 12px -3px rgba(66,89,239,.137);display:inline-block}#aside-content .card-widget{position:relative;overflow:hidden;margin-top:20px;padding:20px 24px;border:1px solid #c9c9c9;box-shadow:none;border-radius:8px}#aside-content .card-widget:hover{border:1px solid #f05011;box-shadow:none}#footer{background:#f7f9fe00;border-radius:8px;width:97%;margin:auto;opacity:.6;margin-top:1rem;display:flex;flex-direction:column}[data-theme=dark] #footer{background:#0d0d0d00;border-radius:8px;width:97%;margin:auto;opacity:.6;margin-top:1rem;display:flex;flex-direction:column}#Jay-footer{display:flex;flex-direction:row;width:100%;max-width:1200px;margin:1rem auto;justify-content:space-between;flex-wrap:wrap;margin-bottom:3rem;padding:0 1rem}#Jay-footer .footer-links{display:flex;flex-direction:column;color:#425aef}.footer-banner-right{display:flex;flex-direction:row;flex-wrap:wrap}div#footer_deal{justify-content:center;display:flex;padding-top:2rem;align-items:center;flex-wrap:wrap}.footer_left{display:flex}.footer_right{display:flex}.footer-item{color:#000}#pagination{width:100%;margin:auto}#pagination .page-number.current{background:#f05011;color:#fff}#rightside>div>a,#rightside>div>button{display:block;margin-bottom:5px;width:35px;height:35px;border-radius:5px;background-color:#616268;color:#fff;text-align:center;font-size:16px;line-height:35px}#rightside>div>a:hover,#rightside>div>button:hover{background-color:#f05011}.recent-post-item{border:1px solid #c9c9c9}.recent-post-item:hover{border:1px solid #f05011;box-shadow:none}#recent-posts>.recent-post-item>.recent-post-info>.article-title:hover{color:#f05011}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a:hover{color:#f05011;text-decoration:underline}img.footer_mini_logo{width:50px;height:50px;margin:0 1rem;cursor:pointer;transition:all .5s cubic-bezier(0,0,0,1.29) 0s}img.footer_mini_logo:hover{backface-visibility:hidden;transform-style:preserve-3d;transform:scale(1.2)}@media screen and (max-width:768px){img.footer_mini_logo{display:none}}[data-theme=light] a.deal_link{display:flex;margin:1rem 27px;color:#fff;border-radius:3rem;width:32px;height:32px;background:#151515;justify-content:center;align-items:center;transition:all .3s ease 0s}[data-theme=dark] a.deal_link{display:flex;margin:1rem 27px;color:#000;border-radius:3rem;width:32px;height:32px;background:#fff;justify-content:center;align-items:center;transition:all .3s ease 0s}a.deal_link:hover{color:#fff;background:#f05011;transform:scale(1.1)}[data-theme=light] .footer-links>a{color:#000}[data-theme=dark] .footer-links>a{color:#fff}.footer-links>a:hover{color:#f05011}#post{border:1px solid #e3e8f7;box-shadow:none}#post:hover{border:1px solid #f05011;box-shadow:none}h1::before,h2::before,h3::before,h4::before,h5::before,h6::before{-webkit-animation:ccc 1.6s linear infinite;animation:ccc 1.6s linear infinite}@-webkit-keyframes ccc{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes ccc{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}}#content-inner.layout h1::before{color:#ef50a8;margin-left:-1.55rem;font-size:1.3rem;margin-top:-.23rem}#content-inner.layout h2::before{color:#fb7061;margin-left:-1.35rem;font-size:1.1rem;margin-top:-.12rem}#content-inner.layout h3::before{color:#ffbf00;margin-left:-1.22rem;font-size:.95rem;margin-top:-.09rem}#content-inner.layout h4::before{color:#a9e000;margin-left:-1.05rem;font-size:.8rem;margin-top:-.09rem}#content-inner.layout h5::before{color:#57c850;margin-left:-.9rem;font-size:.7rem;margin-top:0}#content-inner.layout h6::before{color:#5ec1e0;margin-left:-.9rem;font-size:.66rem;margin-top:0}#content-inner.layout h1:hover,#content-inner.layout h2:hover,#content-inner.layout h3:hover,#content-inner.layout h4:hover,#content-inner.layout h5:hover,#content-inner.layout h6:hover{color:#3b70fc}#content-inner.layout h1:hover::before,#content-inner.layout h2:hover::before,#content-inner.layout h3:hover::before,#content-inner.layout h4:hover::before,#content-inner.layout h5:hover::before,#content-inner.layout h6:hover::before{color:#3b70fc;-webkit-animation:ccc 3.2s linear infinite;animation:ccc 3.2s linear infinite}#rightside_config i.fas.fa-cog.fa-spin{animation:fa-spin 5s linear infinite}.main-hero-waves-area{width:100%;position:absolute;left:0;bottom:-11px;z-index:5}.waves-area .waves-svg{width:100%;height:5rem}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s;fill:#f7f9febd}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s;fill:#f7f9fe82}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s;fill:#f7f9fe36}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s;fill:#f7f9fe}[data-theme=dark] .parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s;fill:#18171dc8}[data-theme=dark] .parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s;fill:#18171d80}[data-theme=dark] .parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s;fill:#18171d3e}[data-theme=dark] .parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s;fill:#18171d}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}100%{transform:translate3d(85px,0,0)}}@media (max-width:768px){.waves-area .waves-svg{height:40px;min-height:40px}}#page .category-list-item:hover{background:#0084ff!important;box-shadow:0 8px 12px -3px rgba(40,109,234,.2);color:#fff!important;border:1px solid #425aef}.category-lists .category-list{text-align:center;display:flex;flex-wrap:wrap;justify-content:center;flex-direction:row;margin:5em 0 3em}.category-lists ul{padding:0}.category-lists ul li{display:flex;width:fit-content;font-size:1.2em!important;padding:.2em .5em;background:#fff;margin:.5em .5em;border-radius:12px;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;border:1px solid #e3e8f7;box-shadow:0 8px 16px -4px #2c2d300c;align-items:center}.category-lists .category-list a{color:#4c4948!important}.category-lists .category-list a:hover{color:#fff!important}.category-lists ul li:before{position:unset;width:auto;height:auto;border:0;border-radius:0;background:0;color:#363636!important;cursor:pointer;content:"\e038";font-family:iconfont!important;opacity:.4;padding-top:2px;padding-right:2px}.category-lists .category-list .category-list-count{background:#f7f7f9;padding:4px 4px;border-radius:6px;color:rgba(60,60,67,.8);line-height:1;text-align:center;min-width:35px;display:inline-block;font-size:1rem;box-shadow:0 8px 16px -4px #2c2d300c}.category-lists .category-list .category-list-count:after,.category-lists .category-list .category-list-count:before{content:''}[data-theme=dark] #page .tag-cloud-list a{display:flex;width:fit-content;color:#c7c7c7!important;font-size:1.6em!important;padding:.2em .5em;background:#121212;margin:.5em .5em;border-radius:12px;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;border:1px solid #e3e8f7;box-shadow:0 8px 16px -4px #2c2d300c;align-items:center}[data-theme=light] #page .tag-cloud-list a{display:flex;width:fit-content;color:#000!important;font-size:1.6em!important;padding:.2em .5em;background:#fff;margin:.5em .5em;border-radius:12px;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;border:1px solid #e3e8f7;box-shadow:0 8px 16px -4px #2c2d300c;align-items:center}#page .tag-cloud-list a:hover{background:#f05011!important;box-shadow:0 8px 12px -3px rgba(40,109,234,.2);color:#fff!important;border:1px solid #f05011}.is-center{display:flex;flex-wrap:wrap;justify-content:center;flex-direction:row}#page .category-list-item a:hover{background:#0084ff!important;box-shadow:0 8px 12px -3px rgba(40,109,234,.2);color:#fff!important;border:1px solid #425aef}.category-list{display:flex;flex-wrap:wrap;justify-content:center;flex-direction:row}#universe{display:block;position:fixed;margin:0;padding:0;border:0;outline:0;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:1}#recent-posts>.recent-post-item{position:relative}.newPost-left,.newPost-right{position:absolute;top:0;color:#fff;padding:0 15px;background-color:#ff7550;border-radius:0 0 10px 10px}.newPost-left{left:15px}.newPost-right{right:15px}#category-bar{background:#fff0;border-radius:12px;display:flex;white-space:nowrap;overflow:hidden;margin-bottom:0;border:1px solid #c8c9c9;width:100%;margin-top:15px}@media screen and (max-width:768px){#category-bar{border-radius:0;border:0}}#category #category-bar{padding:0;border:none}#category a.category-bar-item.select a{display:none}.category-in-bar{display:flex;white-space:nowrap}.category-in-bar-tips{margin-right:1rem;margin-top:15px}.category-bar-items{white-space:nowrap;overflow-x:scroll;display:flex}.category-bar-items::-webkit-scrollbar{display:none}.category-bar-item a{padding:.1rem .5rem;margin:0 .25rem;font-weight:700;border-radius:12px}.category-bar-item:hover a{background:#f05012;color:#fff}.category-bar-item.select a{background:#f05012;color:#fff;border-radius:12px}.category-bar-more{margin-left:1rem;font-weight:700}@media screen and (min-width:900px){#aside-content{padding-right:15px;padding-left:0}}@media screen and (max-width:765px){#sidebar #sidebar-menus{position:fixed;top:0;right:-300px;z-index:103;overflow-x:hidden;overflow-y:auto;width:300px;height:100%;background:var(--sidebar-bg);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#sidebar #sidebar-menus.open>.avatar-img img{height:100px;width:100px;border-radius:50%;border:5px solid #fff;filter:none}}@media screen and (max-width:768px){.layout{padding:0 1rem}}@media screen and (max-width:768px){a.categoryButton i{display:none}.recent-post-top .categoryGroup{min-width:130px!important;margin-bottom:.5rem;margin-left:1rem;max-height:164px;overflow:hidden;position:relative}}[data-theme=light] #post .post-copyright .post-copyright-meta{color:#4c4948;font-weight:700}[data-theme=dark] #post .post-copyright .post-copyright-meta{color:#ccc;font-weight:700} \ No newline at end of file +[data-theme=light] #web_bg::before{position:absolute;width:100%;height:100%;content:''}[data-theme=dark] #web_bg::before{position:absolute;width:100%;height:100%;content:''}body{color:#c9c9c9;font-size:16px;line-height:2}#nav{display:flex;padding:0 36px;width:100%;height:60px;box-shadow:none!important;border-bottom:1px solid #c9c9c9}#nav .menus_items .menus_item:hover .menus_item_child{display:block}[data-theme=light] #page-header.not-top-img #nav{background:rgba(255,255,255,.8);font-size:22px;-webkit-box-shadow:0 5px 6px -5px rgba(133,133,133,.6);box-shadow:0 5px 6px -5px rgba(133,133,133,.6)}[data-theme=dark] #page-header.not-top-img #nav{background:rgba(0,0,0,.8);font-size:22px;box-shadow:0 5px 6px -5px #f05011}#nav .menus_items .menus_item{flex:1 1 auto;justify-content:flex-end;margin-left:auto;flex-wrap:nowrap;translate:60%;padding:0 0 0 15px}#toggleButtons{display:flex;flex:1 1 auto;justify-content:flex-end}#nav ::after{background-color:transparent!important}.menus_item_child li:not(#sidebar-menusli){float:left;border-radius:6px!important;-webkit-border-radius:6px!important;-moz-border-radius:6px!important;-ms-border-radius:6px!important;-o-border-radius:6px!important}.menus_item_child:not(#sidebar-menusul){left:50%;translate:-50%}[data-theme=light].menus_items{margin:5px!important;border-radius:5px;padding:20px}[data-theme=dark].menus_items{margin:5px!important;border-radius:5px;padding:20px}#aside-content .card-info #card-info-btn{display:block;margin-top:14px;background-color:#f05012;color:#fff;text-align:center;line-height:2.4}#aside-content .card-info #card-info-btn:hover{background-color:#ff7242}@media screen and (max-width:768px){[data-theme=light] .menus_item_child>li{border:1px solid #464646;margin:5px!important;border-radius:7px;padding-left:10px;padding-right:10px;width:100%;display:flex;translate:50%}}[data-theme=light] .site-page{padding:5px;padding-left:10px;padding-right:10px;border-radius:7px}[data-theme=light] .site-page:hover{color:#fff!important;background-color:#f05011}[data-theme=dark] .site-page{padding:5px;padding-left:10px;padding-right:10px;border-radius:7px}[data-theme=dark] .site-page:hover{color:#fff!important;background-color:#f05011}.nav-fixed #nav{transform:translateY(58px)!important;-webkit-transform:translateY(58px)!important;-moz-transform:translateY(58px)!important;-ms-transform:translateY(58px)!important;-o-transform:translateY(58px)!important}#nav{transition:none!important;-webkit-transition:none!important;-moz-transition:none!important;-ms-transition:none!important;-o-transition:none!important}#nav #site-name:hover{color:#fff!important;background-color:#f05011!important;padding:5px;padding-left:10px;padding-right:10px;border-radius:7px;box-shadow:0 0 3px #f05011!important}@media screen and (min-width:1200px){.layout{display:flex;max-width:1470px;flex:1 auto;margin:0 auto;padding:40px 15px;width:100%;margin-top:-1rem}.layout.hide-aside{max-width:1450px}#recent-posts{margin-top:-1rem;align-content:flex-start;display:flex;flex-wrap:wrap;justify-content:space-between}#recent-posts>.recent-post-item:not(.latest){margin-top:1rem;display:inline-block;height:auto;width:49%}#recent-posts>.recent-post-item:not(.latest) .post_cover{width:100%;height:200px}#recent-posts>.recent-post-item:not(.latest) .post_cover img.post_bg{width:100%;height:100%}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.content{display:none}#recent-posts>.recent-post-item:not(.latest){-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}#recent-posts>.recent-post-item:not(.latest) .left_radius{border-radius:12px 8px 0 0}#recent-posts>.recent-post-item:not(.latest) .right_radius{border-radius:12px 8px 0 0}.recent-post-item:not(.latest){height:auto!important}.recent-post-info{padding:0 40px;margin-top:1em;width:100%!important}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.article-title{-webkit-line-clamp:1;margin-top:.3rem;margin-bottom:.3rem;font-size:1.2em;line-height:1.4}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.article-title :hover{color:var(--lyx-theme)}#recent-posts>.recent-post-item:not(.latest)>.recent-post-info>.article-meta-wrap{margin-bottom:1rem}}@media screen and (max-width:900px){.layout{display:flex;flex:1 auto;margin:0 auto;padding:4px 15px;max-width:1200px;width:100%}#category-bar{background:rgba(255,255,255,0);border-radius:12px;display:flex;white-space:nowrap;overflow:hidden;margin-bottom:0;border:1px solid #c8c9c9;width:100%;margin-top:15px}}.latest{margin-top:1rem}.aside-content{max-width:312px;min-width:300px}.recent-posts{width:auto!important}span.card-archive-list-count{width:auto;text-align:left;font-size:1.5rem;line-height:.9;font-weight:700}.card-archive-list-count-group{display:flex;flex-direction:row;align-items:baseline}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:last-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:last-child{width:fit-content;margin-left:4px}span.card-archive-list-count{width:auto;text-align:left;font-size:1.1rem;line-height:.9;font-weight:700}.card-archive-list-date{font-size:14px;opacity:.6}li.card-category-list-item{flex:0 0 31%}li.card-archive-list-item{flex:0 0 48%}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{color:#fff;background-color:#f05011;box-shadow:0 8px 12px -3px #4259ef23;border-radius:8px;padding-left:.5rem;padding-right:.5rem}@media screen and (min-width:1300px){#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:hover,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:hover{transform:scale(1.03)}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a:active,#aside-content .card-categories ul.card-category-list>.card-category-list-item a:active{transform:scale(.97)}}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a,#aside-content .card-categories ul.card-category-list>.card-category-list-item a{border-radius:8px;margin:4px 0;display:flex;flex-direction:column;align-content:space-between;border:1px solid #e3e8f7}#aside-content .card-archives ul.card-archive-list>.card-archive-list-item a span:first-child,#aside-content .card-categories ul.card-category-list>.card-category-list-item a span:first-child{width:auto;flex:inherit}#aside-content .card-archives ul.card-archive-list,#aside-content .card-categories ul.card-category-list{display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap}[data-theme=light] #aside-content .card-tag-cloud a{color:#363636!important;font-size:.8rem;border-radius:8px}[data-theme=dark] #aside-content .card-tag-cloud a{color:#e7e7e7!important;font-size:.8rem;border-radius:8px}#aside-content .card-tag-cloud a:hover{background:#f05011;color:#fff!important;box-shadow:0 8px 12px -3px rgba(66,89,239,.137);display:inline-block}#aside-content .card-widget{position:relative;overflow:hidden;margin-top:20px;padding:20px 24px;border:1px solid #c9c9c9;box-shadow:none;border-radius:8px}#aside-content .card-widget:hover{border:1px solid #f05011;box-shadow:none}#footer{background:#f7f9fe00;border-radius:8px;width:97%;margin:auto;opacity:.6;margin-top:1rem;display:flex;flex-direction:column}[data-theme=dark] #footer{background:#0d0d0d00;border-radius:8px;width:97%;margin:auto;opacity:.6;margin-top:1rem;display:flex;flex-direction:column}#Jay-footer{display:flex;flex-direction:row;width:100%;max-width:1200px;margin:1rem auto;justify-content:space-between;flex-wrap:wrap;margin-bottom:3rem;padding:0 1rem}#Jay-footer .footer-links{display:flex;flex-direction:column;color:#425aef}.footer-banner-right{display:flex;flex-direction:row;flex-wrap:wrap}div#footer_deal{justify-content:center;display:flex;padding-top:2rem;align-items:center;flex-wrap:wrap}.footer_left{display:flex}.footer_right{display:flex}.footer-item{color:#000}#pagination{width:100%;margin:auto}#pagination .page-number.current{background:#f05011;color:#fff}#rightside>div>a,#rightside>div>button{display:block;margin-bottom:5px;width:35px;height:35px;border-radius:5px;background-color:#616268;color:#fff;text-align:center;font-size:16px;line-height:35px}#rightside>div>a:hover,#rightside>div>button:hover{background-color:#f05011}.recent-post-item{border:1px solid #c9c9c9}.recent-post-item:hover{border:1px solid #f05011;box-shadow:none}#recent-posts>.recent-post-item>.recent-post-info>.article-title:hover{color:#f05011}#recent-posts>.recent-post-item>.recent-post-info>.article-meta-wrap a:hover{color:#f05011;text-decoration:underline}img.footer_mini_logo{width:50px;height:50px;margin:0 1rem;cursor:pointer;transition:all .5s cubic-bezier(0,0,0,1.29) 0s}img.footer_mini_logo:hover{backface-visibility:hidden;transform-style:preserve-3d;transform:scale(1.2)}@media screen and (max-width:768px){img.footer_mini_logo{display:none}}[data-theme=light] a.deal_link{display:flex;margin:1rem 27px;color:#fff;border-radius:3rem;width:32px;height:32px;background:#151515;justify-content:center;align-items:center;transition:all .3s ease 0s}[data-theme=dark] a.deal_link{display:flex;margin:1rem 27px;color:#000;border-radius:3rem;width:32px;height:32px;background:#fff;justify-content:center;align-items:center;transition:all .3s ease 0s}a.deal_link:hover{color:#fff;background:#f05011;transform:scale(1.1)}[data-theme=light] .footer-links>a{color:#000}[data-theme=dark] .footer-links>a{color:#fff}.footer-links>a:hover{color:#f05011}#post{border:1px solid #e3e8f7;box-shadow:none}#post:hover{border:1px solid #f05011;box-shadow:none}h1::before,h2::before,h3::before,h4::before,h5::before,h6::before{-webkit-animation:ccc 1.6s linear infinite;animation:ccc 1.6s linear infinite}@-webkit-keyframes ccc{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}}@keyframes ccc{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(-1turn);transform:rotate(-1turn)}}#content-inner.layout h1::before{color:#ef50a8;margin-left:-1.55rem;font-size:1.3rem;margin-top:-.23rem}#content-inner.layout h2::before{color:#fb7061;margin-left:-1.35rem;font-size:1.1rem;margin-top:-.12rem}#content-inner.layout h3::before{color:#ffbf00;margin-left:-1.22rem;font-size:.95rem;margin-top:-.09rem}#content-inner.layout h4::before{color:#a9e000;margin-left:-1.05rem;font-size:.8rem;margin-top:-.09rem}#content-inner.layout h5::before{color:#57c850;margin-left:-.9rem;font-size:.7rem;margin-top:0}#content-inner.layout h6::before{color:#5ec1e0;margin-left:-.9rem;font-size:.66rem;margin-top:0}#content-inner.layout h1:hover,#content-inner.layout h2:hover,#content-inner.layout h3:hover,#content-inner.layout h4:hover,#content-inner.layout h5:hover,#content-inner.layout h6:hover{color:#3b70fc}#content-inner.layout h1:hover::before,#content-inner.layout h2:hover::before,#content-inner.layout h3:hover::before,#content-inner.layout h4:hover::before,#content-inner.layout h5:hover::before,#content-inner.layout h6:hover::before{color:#3b70fc;-webkit-animation:ccc 3.2s linear infinite;animation:ccc 3.2s linear infinite}#rightside_config i.fas.fa-cog.fa-spin{animation:fa-spin 5s linear infinite}.main-hero-waves-area{width:100%;position:absolute;left:0;bottom:-11px;z-index:5}.waves-area .waves-svg{width:100%;height:5rem}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s;fill:#f7f9febd}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s;fill:#f7f9fe82}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s;fill:#f7f9fe36}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s;fill:#f7f9fe}[data-theme=dark] .parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s;fill:#18171dc8}[data-theme=dark] .parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s;fill:#18171d80}[data-theme=dark] .parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s;fill:#18171d3e}[data-theme=dark] .parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s;fill:#18171d}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}100%{transform:translate3d(85px,0,0)}}@media (max-width:768px){.waves-area .waves-svg{height:40px;min-height:40px}}#page .category-list-item:hover{background:#0084ff!important;box-shadow:0 8px 12px -3px rgba(40,109,234,.2);color:#fff!important;border:1px solid #425aef}.category-lists .category-list{text-align:center;display:flex;flex-wrap:wrap;justify-content:center;flex-direction:row;margin:5em 0 3em}.category-lists ul{padding:0}.category-lists ul li{display:flex;width:fit-content;font-size:1.2em!important;padding:.2em .5em;background:#fff;margin:.5em .5em;border-radius:12px;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;border:1px solid #e3e8f7;box-shadow:0 8px 16px -4px #2c2d300c;align-items:center}.category-lists .category-list a{color:#4c4948!important}.category-lists .category-list a:hover{color:#fff!important}.category-lists ul li:before{position:unset;width:auto;height:auto;border:0;border-radius:0;background:0;color:#363636!important;cursor:pointer;content:"\e038";font-family:iconfont!important;opacity:.4;padding-top:2px;padding-right:2px}.category-lists .category-list .category-list-count{background:#f7f7f9;padding:4px 4px;border-radius:6px;color:rgba(60,60,67,.8);line-height:1;text-align:center;min-width:35px;display:inline-block;font-size:1rem;box-shadow:0 8px 16px -4px #2c2d300c}.category-lists .category-list .category-list-count:after,.category-lists .category-list .category-list-count:before{content:''}[data-theme=dark] #page .tag-cloud-list a{display:flex;width:fit-content;color:#c7c7c7!important;font-size:1.6em!important;padding:.2em .5em;background:#121212;margin:.5em .5em;border-radius:12px;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;border:1px solid #e3e8f7;box-shadow:0 8px 16px -4px #2c2d300c;align-items:center}[data-theme=light] #page .tag-cloud-list a{display:flex;width:fit-content;color:#000!important;font-size:1.6em!important;padding:.2em .5em;background:#fff;margin:.5em .5em;border-radius:12px;-webkit-backface-visibility:hidden;-webkit-transform-style:preserve-3d;border:1px solid #e3e8f7;box-shadow:0 8px 16px -4px #2c2d300c;align-items:center}#page .tag-cloud-list a:hover{background:#f05011!important;box-shadow:0 8px 12px -3px rgba(40,109,234,.2);color:#fff!important;border:1px solid #f05011}.is-center{display:flex;flex-wrap:wrap;justify-content:center;flex-direction:row}#page .category-list-item a:hover{background:#0084ff!important;box-shadow:0 8px 12px -3px rgba(40,109,234,.2);color:#fff!important;border:1px solid #425aef}.category-list{display:flex;flex-wrap:wrap;justify-content:center;flex-direction:row}#universe{display:block;position:fixed;margin:0;padding:0;border:0;outline:0;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:1}#recent-posts>.recent-post-item{position:relative}.newPost-left,.newPost-right{position:absolute;top:0;color:#fff;padding:0 15px;background-color:#ff7550;border-radius:0 0 10px 10px}.newPost-left{left:15px}.newPost-right{right:15px}#category-bar{background:rgba(255,255,255,0);border-radius:12px;display:flex;white-space:nowrap;overflow:hidden;margin-bottom:0;border:1px solid #c8c9c9;width:100%;margin-top:15px}@media screen and (max-width:768px){#category-bar{border-radius:0;border:0}}#category #category-bar{padding:0;border:none}#category a.category-bar-item.select a{display:none}.category-in-bar{display:flex;white-space:nowrap}.category-in-bar-tips{margin-right:1rem;margin-top:15px}.category-bar-items{white-space:nowrap;display:flex}.category-bar-items::-webkit-scrollbar{display:none}.category-bar-item a{padding:.1rem .5rem;margin:0 .25rem;font-weight:700;border-radius:12px}.category-bar-item:hover a{background:#f05012;color:#fff}.category-bar-item.select a{background:#f05012;color:#fff;border-radius:12px}.category-bar-more{margin-left:1rem;font-weight:700}@media screen and (min-width:900px){#aside-content{padding-right:15px;padding-left:0}}@media screen and (max-width:765px){#sidebar #sidebar-menus{position:fixed;top:0;right:-300px;z-index:103;overflow-x:hidden;overflow-y:auto;width:300px;height:100%;background:var(--sidebar-bg);-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;-ms-transition:all .5s;transition:all .5s}#sidebar #sidebar-menus.open>.avatar-img img{height:100px;width:100px;border-radius:50%;border:5px solid #fff;filter:none}}@media screen and (max-width:768px){.layout{padding:0 1rem}}@media screen and (max-width:768px){a.categoryButton i{display:none}.recent-post-top .categoryGroup{min-width:130px!important;margin-bottom:.5rem;margin-left:1rem;max-height:164px;overflow:hidden;position:relative}}[data-theme=light] #post .post-copyright .post-copyright-meta{color:#4c4948;font-weight:700}[data-theme=dark] #post .post-copyright .post-copyright-meta{color:#ccc;font-weight:700} \ No newline at end of file diff --git a/self/css/setting.css b/self/css/setting.css index 09ba9da1f..48e56ad49 100644 --- a/self/css/setting.css +++ b/self/css/setting.css @@ -1 +1 @@ -.con-rightside{height:50px!important;width:50px!important;border-radius:30px;-webkit-border-radius:30px;-moz-border-radius:30px;-ms-border-radius:30px;-o-border-radius:30px;margin:10px;transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s;-ms-transition:all .3s;-o-transition:all .3s}.con-rightside:hover{background-color:rgba(129,129,129,.568)}.con-rightside i::before{font-size:30px}[data-theme=dark] .con-rightside i::before{color:#fff}.con-rightside:hover{background-color:rgba(129,129,129,.568)}@media screen and (max-width:600px){.con-rightside i::before{font-size:16px}.con-rightside{height:20px!important;width:20px!important}}@media screen and (max-width:768px){#con-barrage{display:none!important}}#setting-buttons{display:flex;flex-wrap:wrap}.setting-title{text-align:center;font-size:30px;display:flex}#setting-sides{margin-left:auto}#setting-sides{white-space:nowrap}#setting-sidesl{display:flex}.settings .content{margin-left:20px}.settings{margin:15px}.settings input[type=checkbox]{width:38px;height:20px;position:relative;border:1px solid #000;background-color:#0000;border-radius:12px;background-clip:content-box;display:inline-block;-webkit-appearance:none;user-select:none;outline:0;transform:translateY(5px)}[data-theme=dark] .settings input[type=checkbox]{border:1px solid #fff}.settings input[type=checkbox]:before{content:'';width:12px;height:12px;position:absolute;top:3px;left:5px;border-radius:10px;background-color:#000}[data-theme=dark] .settings input[type=checkbox]:before{background-color:#fff}.settings input[type=checkbox]:checked{background-color:var(--lyx-theme);border-color:var(--lyx-theme)}.settings input[type=checkbox]:checked:before{left:19px;background-color:#fff!important}.settings input[type=checkbox]{transition:border background-color box-shadow}.settings input[type=checkbox]:before{transition:left .2s}.settings input[type=checkbox]:checked{background-color:var(--lyx-theme)}.settings input[type=checkbox]:checked:before{transition:left .2s}.settings input[type=checkbox]:checked:hover{opacity:.8}.settings input[type=checkbox]:active{background-color:#666!important;border-color:#666!important}.settings input[type=checkbox]:active::before{background-color:#fff!important}.settings{overflow:scroll;width:100%}#settingWindow{position:fixed;display:block;width:80%;max-width:800px;left:50%;top:50%;max-height:80%;background-color:#ffffffdd;border-radius:20px;-webkit-border-radius:20px;-moz-border-radius:20px;-ms-border-radius:20px;-o-border-radius:20px;border:1px solid var(--lyx-border);padding:30px;backdrop-filter:blur(10px);-ms-transform-origin-y:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);z-index:514;display:none}.settings{overflow:scroll;width:100%}#settingWindow{display:none;flex-direction:column}.settingx{width:46%;text-align:left;font-size:28px;padding:10px;margin:10px;background-color:var(--lyx-light-grey);opacity:.8;border-radius:10px}.settingx:hover{background-color:var(--lyx-gray)}.settingx i{margin:5px}@media screen and (max-width:768px){.settingx{width:100%!important}}.setting-title{text-align:center;font-size:30px;display:flex}#close-console{text-align:right}#close-console,#stt{margin-left:auto}#close-console:not(#close-console:hover){color:var(--global-font-color)} \ No newline at end of file +.con-rightside{height:50px!important;width:50px!important;border-radius:30px;-webkit-border-radius:30px;-moz-border-radius:30px;-ms-border-radius:30px;-o-border-radius:30px;margin:10px;transition:all .3s;-webkit-transition:all .3s;-moz-transition:all .3s;-ms-transition:all .3s;-o-transition:all .3s}.con-rightside:hover{background-color:rgba(129,129,129,.568)}.con-rightside i::before{font-size:30px}[data-theme=dark] .con-rightside i::before{color:#fff}.con-rightside:hover{background-color:rgba(129,129,129,.568)}@media screen and (max-width:600px){.con-rightside i::before{font-size:16px}.con-rightside{height:20px!important;width:20px!important}}@media screen and (max-width:768px){#con-barrage{display:none!important}}#setting-buttons{display:flex;flex-wrap:wrap}.setting-title{text-align:center;font-size:30px;display:flex}#setting-sides{margin-left:auto}#setting-sides{white-space:nowrap}#setting-sidesl{display:flex}.settings .content{margin-left:20px}.settings{margin:15px}.settings input[type=checkbox]{width:38px;height:20px;position:relative;border:1px solid #000;background-color:#0000;border-radius:12px;background-clip:content-box;display:inline-block;-webkit-appearance:none;user-select:none;outline:0;transform:translateY(5px)}[data-theme=dark] .settings input[type=checkbox]{border:1px solid #fff}.settings input[type=checkbox]:before{content:'';width:12px;height:12px;position:absolute;top:3px;left:5px;border-radius:10px;background-color:#000}[data-theme=dark] .settings input[type=checkbox]:before{background-color:#fff}.settings input[type=checkbox]:checked{background-color:var(--lyx-theme);border-color:var(--lyx-theme)}.settings input[type=checkbox]:checked:before{left:19px;background-color:#fff!important}.settings input[type=checkbox]{transition:border background-color box-shadow}.settings input[type=checkbox]:before{transition:left .2s}.settings input[type=checkbox]:checked{background-color:var(--lyx-theme)}.settings input[type=checkbox]:checked:before{transition:left .2s}.settings input[type=checkbox]:checked:hover{opacity:.8}.settings input[type=checkbox]:active{background-color:#666!important;border-color:#666!important}.settings input[type=checkbox]:active::before{background-color:#fff!important}.settings{overflow:scroll;width:100%}#settingWindow{position:fixed;display:block;width:80%;max-width:800px;left:50%;top:50%;max-height:80%;background-color:#ffffffdd;border-radius:20px;-webkit-border-radius:20px;-moz-border-radius:20px;-ms-border-radius:20px;-o-border-radius:20px;border:1px solid var(--lyx-border);padding:30px;backdrop-filter:blur(10px);-ms-transform-origin-y:translate(-50%,-50%);-webkit-transform:translate(-50%,-50%);-moz-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);-o-transform:translate(-50%,-50%);z-index:514;display:none}.settings{overflow:scroll;width:100%}#settingWindow{display:none;flex-direction:column}.settingx{width:46%;text-align:left;font-size:28px;padding:10px;margin:10px;background-color:var(--lyx-light-grey);opacity:.8;border-radius:10px}.settingx:hover{background-color:var(--lyx-gray)}.settingx i{margin:5px}@media screen and (max-width:768px){.settingx{width:100%!important}}.setting-title{text-align:center;font-size:30px;display:flex}#close-console{text-align:right}#close-console,#stt{margin-left:auto}#close-console:not(#close-console:hover){color:var(--global-font-color)}.content-button{margin-right:10px;margin-top:10px}.content-button{background-color:#ff7550;padding:5px;color:#fff;border-radius:4px}.bgbox{display:flex;flex-wrap:wrap}.box,.imgbox,.pimgbox{width:166px;margin:10px;background-size:cover}.imgbox,.pimgbox{border-radius:10px;overflow:hidden}.pimgbox{height:240px}.imgbox{height:95px}.box{height:100px}@media screen and (max-width:768px){.box,.imgbox,.pimgbox{height:73px;width:135px}.pimgbox{height:205px}.wb-min{display:none}#changeBgBox .wb-body::-webkit-scrollbar{display:none}}.bgbox *{border-radius:10px;-webkit-border-radius:10px;-moz-border-radius:10px;-ms-border-radius:10px;-o-border-radius:10px} \ No newline at end of file diff --git a/tags/Butterfly/index.html b/tags/Butterfly/index.html index 765a0d57f..153b8649a 100644 --- a/tags/Butterfly/index.html +++ b/tags/Butterfly/index.html @@ -1 +1 @@ -标签: Butterfly | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: Butterfly | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/English/index.html b/tags/English/index.html index b5181f976..1fadd5d45 100644 --- a/tags/English/index.html +++ b/tags/English/index.html @@ -1 +1 @@ -标签: English | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: English | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/Git/index.html b/tags/Git/index.html index 54d553aa6..e51f745fb 100644 --- a/tags/Git/index.html +++ b/tags/Git/index.html @@ -1 +1 @@ -标签: Git | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: Git | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/Properties/index.html b/tags/Properties/index.html index 7db0b7606..780962db3 100644 --- a/tags/Properties/index.html +++ b/tags/Properties/index.html @@ -1 +1 @@ -标签: Properties | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: Properties | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/SpringBoot/index.html b/tags/SpringBoot/index.html index b52c1d31e..92b7c0be6 100644 --- a/tags/SpringBoot/index.html +++ b/tags/SpringBoot/index.html @@ -1 +1 @@ -标签: SpringBoot | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: SpringBoot | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/css/index.html b/tags/css/index.html index d70edb471..40c3f748b 100644 --- a/tags/css/index.html +++ b/tags/css/index.html @@ -1 +1 @@ -标签: css | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: css | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/docker/index.html b/tags/docker/index.html index 0c413ef9a..609551e58 100644 --- a/tags/docker/index.html +++ b/tags/docker/index.html @@ -1 +1 @@ -标签: docker | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: docker | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/docker/page/2/index.html b/tags/docker/page/2/index.html index 0d3e449d4..0b91f7d0f 100644 --- a/tags/docker/page/2/index.html +++ b/tags/docker/page/2/index.html @@ -1 +1 @@ -标签: docker | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: docker | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/docker/page/3/index.html b/tags/docker/page/3/index.html index 693e27055..55c1df92a 100644 --- a/tags/docker/page/3/index.html +++ b/tags/docker/page/3/index.html @@ -1 +1 @@ -标签: docker | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: docker | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/error/index.html b/tags/error/index.html index f519a7214..237804113 100644 --- a/tags/error/index.html +++ b/tags/error/index.html @@ -1 +1 @@ -标签: error | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: error | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/index.html b/tags/index.html index 91ae3cf57..1f52bf630 100644 --- a/tags/index.html +++ b/tags/index.html @@ -1 +1 @@ -标签 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/java/index.html b/tags/java/index.html index fc9a9a6f1..fa796be0a 100644 --- a/tags/java/index.html +++ b/tags/java/index.html @@ -1 +1 @@ -标签: java | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: java | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/java/page/2/index.html b/tags/java/page/2/index.html index e6c5867cb..a5f656200 100644 --- a/tags/java/page/2/index.html +++ b/tags/java/page/2/index.html @@ -1 +1 @@ -标签: java | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: java | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/jmeter/index.html b/tags/jmeter/index.html index 4ceac6d47..53ad1f679 100644 --- a/tags/jmeter/index.html +++ b/tags/jmeter/index.html @@ -1 +1 @@ -标签: jmeter | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: jmeter | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/jmeter/page/2/index.html b/tags/jmeter/page/2/index.html index 8ac03ba8c..ef5b27753 100644 --- a/tags/jmeter/page/2/index.html +++ b/tags/jmeter/page/2/index.html @@ -1 +1 @@ -标签: jmeter | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: jmeter | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/postman/index.html b/tags/postman/index.html index 2cd8bfa2d..ecd1ec158 100644 --- a/tags/postman/index.html +++ b/tags/postman/index.html @@ -1 +1 @@ -标签: postman | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: postman | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/python/index.html b/tags/python/index.html index 92ecc9c49..4789ef0d5 100644 --- a/tags/python/index.html +++ b/tags/python/index.html @@ -1 +1 @@ -标签: python | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: python | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/shell/index.html b/tags/shell/index.html index 522e8c122..0ce8be532 100644 --- a/tags/shell/index.html +++ b/tags/shell/index.html @@ -1 +1 @@ -标签: shell | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: shell | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/sql/index.html b/tags/sql/index.html index 5915a9c65..deb2a665c 100644 --- a/tags/sql/index.html +++ b/tags/sql/index.html @@ -1 +1 @@ -标签: sql | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: sql | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/ubuntu/index.html b/tags/ubuntu/index.html index 220edb96a..92942233d 100644 --- a/tags/ubuntu/index.html +++ b/tags/ubuntu/index.html @@ -1 +1 @@ -标签: ubuntu | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: ubuntu | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/xpath/index.html b/tags/xpath/index.html index ec8bfc51a..0a88c7a55 100644 --- a/tags/xpath/index.html +++ b/tags/xpath/index.html @@ -1 +1 @@ -标签: xpath | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: xpath | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git a/tags/yaml/index.html b/tags/yaml/index.html index 9940d279d..ce78f561b 100644 --- a/tags/yaml/index.html +++ b/tags/yaml/index.html @@ -1 +1 @@ -标签: yaml | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: yaml | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/tags/\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/tags/\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index 9f558a298..803032d7f 100644 --- "a/tags/\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/tags/\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -1 +1 @@ -标签: 性能测试 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: 性能测试 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/tags/\347\233\221\346\216\247/index.html" "b/tags/\347\233\221\346\216\247/index.html" index eb57ceac1..1d7196e39 100644 --- "a/tags/\347\233\221\346\216\247/index.html" +++ "b/tags/\347\233\221\346\216\247/index.html" @@ -1 +1 @@ -标签: 监控 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: 监控 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/tags/\347\233\256\346\240\207-\344\274\230\345\214\226/index.html" "b/tags/\347\233\256\346\240\207-\344\274\230\345\214\226/index.html" index 87acdd750..bbee6983c 100644 --- "a/tags/\347\233\256\346\240\207-\344\274\230\345\214\226/index.html" +++ "b/tags/\347\233\256\346\240\207-\344\274\230\345\214\226/index.html" @@ -1 +1 @@ -标签: 目标&优化 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: 目标&优化 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/tags/\350\200\203\347\240\224/index.html" "b/tags/\350\200\203\347\240\224/index.html" index 56b4d52e1..1e6c85335 100644 --- "a/tags/\350\200\203\347\240\224/index.html" +++ "b/tags/\350\200\203\347\240\224/index.html" @@ -1 +1 @@ -标签: 考研 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: 考研 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/tags/\351\251\254\345\223\262/index.html" "b/tags/\351\251\254\345\223\262/index.html" index 3a8120b94..8fee3501c 100644 --- "a/tags/\351\251\254\345\223\262/index.html" +++ "b/tags/\351\251\254\345\223\262/index.html" @@ -1 +1 @@ -标签: 马哲 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: 马哲 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/tags/\351\253\230\346\225\260/index.html" "b/tags/\351\253\230\346\225\260/index.html" index 3531858f3..17b8ee0d8 100644 --- "a/tags/\351\253\230\346\225\260/index.html" +++ "b/tags/\351\253\230\346\225\260/index.html" @@ -1 +1 @@ -标签: 高数 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +标签: 高数 | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              文章统计

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file diff --git "a/\346\265\213\350\257\225\351\241\265\351\235\242/index.html" "b/\346\265\213\350\257\225\351\241\265\351\235\242/index.html" index 6a0d6db92..2be114b63 100644 --- "a/\346\265\213\350\257\225\351\241\265\351\235\242/index.html" +++ "b/\346\265\213\350\257\225\351\241\265\351\235\242/index.html" @@ -1 +1 @@ -GGLSS | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file +GGLSS | GGLSS
                              控制面板×

                              性能设置

                              禁用模糊效果
                              开启帧率检测(刷新后生效)

                              主题设置

                              显示aplayer
                              落樱特效
                              明暗模式自动切换
                              自动主题色(跟随文章封面)
                              未完工
                              固定导航栏
                              ###

                              主题色

                              背景设置

                              注意:切换背景功能仅在Acrylic主题中生效,在Simple主题中无效

                              图片(手机)

                              图片(电脑)

                              渐变色

                              纯色

                              文章统计

                              监控

                              访问统计显示不出来请刷新页面

                              关于

                              Hexo-theme-Acryple v1.0.100
                              Ariasaka Console v0.01
                              欢迎反馈!
                              \ No newline at end of file