Let’s Encrypt

官方网站:https://letsencrypt.org/

现提供通配符 SSL 证书,需使用 certbot 或 acme.sh 手动发行

certbot

github:https://github.com/certbot/certbot

安装 EPEL

EPEL (Extra Packages for Enterprise Linux)是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供额外的软件包

yum -y install epel-release

安装 certbot

yum -y install certbot

申请 SSL 证书

certbot certonly --standalone -d www.test.org

证书文件在 /etc/letsencrypt/ 文件夹下

acme.sh

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书

github:https://github.com/acmesh-official/acme.sh/wiki/说明

宝塔面板

支持一键配置 宝塔SSL,Let's Encrypt免费证书

freessl

提供免费HTTPS证书申请 https://freessl.cn/

FiloSottile/mkcert

https://github.com/FiloSottile/mkcert 生成本地 HTTPS 加密证书(localhost 127.0.0.1)

其他

HTTPS 网站检测 https://myssl.com/

参考文章:

https://teddysun.com/527.html

安装

npm install -g wxss-cli

然后在小程序目录,监听此目录以下所有 css 及 less 文件并实时保存文件后转换为 wxss

# 监听文件会自动将此目录下 css,less 文件编译为 wxss
wxss ./pages

新建的 less 文件最终不会上传至小程序

Screen 是一个全屏窗口管理器。

安装

apt install screen
# 或
yum install screen

使用

screen -S <name> # 新建一个作业名为 name 的窗口,(标注 screen 窗口)
screen -ls # 显示目前所有的 screen 作业
screen -d <name> # 将指定的 screen 作业离线
screen -h <行数> # 指定视窗的缓冲区行数
screen -r <name> # 恢复指定的 screen 作业
screen -d -r <name> # 离线当前作业并回到 name 这个作业

# 当需要运行脚本、执行程序时,在命令前添加 screen 即可

ctrl + A + D # 将当前 screen detach 到后台

screen -X -S <name> quit # 删除指定 screen

进入一个 screen session 后,可能你开始跑一些程序,这时不能在命令行输入任何东西,可以使用快捷键 ctrl + A + D 将当前 screen detach 到后台

使用问题

问题:linux 在进入 screen 模式下之后,发现是无法在终端使用鼠标滚轮进行上下翻页拉动的,无法查看上面的终端输出内容了

解决办法

进入回滚模式(可以操作鼠标滚轮上下翻页):先按Ctrl+a键,然后释放,然后再按[键即可进入翻页模式。
切换回之前模式:Ctrl+c

ubuntu 下源码编译安装 screen 最新版

下载地址:http://ftp.gnu.org/gnu/screen/

# 下载
wget -c https://ftp.gnu.org/gnu/screen/screen-4.8.0.tar.gz

# 解压
tar -xzvf screen-4.8.0.tar.gz
cd screen-4.8.0

# 安装依赖
apt install gcc g++ make make-guile

# 编译
mkdir build && cd build
../configure

# 安装
make && make install

验证一下
screen -h

问题:

如果报错:checking whether the C compiler works... no

# 安装 g++
apt install g++

如果报错,信息如:configure: error: !!! no tgetent - no screen

需要先安装 ncurses 下载地址 https://ftp.gnu.org/gnu/ncurses

# 下载依赖包ncurses
wget -c https://ftp.gnu.org/gnu/ncurses/ncurses-6.2.tar.gz

# 解压安装
tar -xzvf ncurses-6.2.tar.gz
cd ncurses-6.2
mkdir build && cd build
../configure
make && sudo make install

Snap2HTML 可以帮你将硬盘下的文件整理成一个 html 格式的树状视图列表,类似于 Windows 资源管理器,带有文件大小、日期、数量等常用信息,右上角还提供了搜索功能,方便你去整理或查找,或者是向基友们分享一下你的收藏

github地址 https://github.com/rlv-dan/Snap2HTML

官网地址 https://www.rlvision.com/snap2html/about.php

百度云链接: https://pan.baidu.com/s/1XVvgMX4TKTOZSvEay8xvnQ 提取码: pbi3

UsbEAm Hosts Editor 是一款能够提升 origin、steam、uplay 等游戏平台下载速度的工具,同时也可以有效的解决一些游戏或者平台出现的各种网络错误,帮玩家能够顺利的登录平台,顺利进行游戏。

UsbEAm Hosts Editor 还可以为 github 加速,提高网页浏览的速度和代码下载的速度

使用方法:

  • 点击左下角的游戏手柄(或者点击鼠标右键),弹出菜单

  • 在弹出的菜单上选择要检测的项目。里面包含了多个流行的游戏平台,每个平台还有下载、浏览等子菜单

  • 接着会出现一大堆 IP,先别急着去用,先点击 检测延迟,然后选择延迟最低的地址,点击应用选中即可

  • 也可以点击 编辑Hosts,手工对 Hosts 进行编辑

如果某些安全软件弹出阻止情况,请忽略放过,不然无法修改

软件下载

百度云:https://pan.baidu.com/s/1CYNEbqxkH-8vzdxWDOOE2g 提取码:p1ee

Scrcpy

github: https://github.com/Genymobile/scrcpy

Scrcpy 可以将安卓手机的画面投屏到电脑桌面显示上并进行操控。简单地说,就是可以让你在电脑上控制手机!它支持鼠标控制、键盘输入、电脑剪切板复制粘贴、拖放文件传输到手机、以及拖放 APK 文件进行安装。跨平台支持 Win、Mac、Linux,可通过 USB 数据线或 WiFi 进行连接

Scrcpy 投屏效果非常理想,画面清晰流畅,基本无明显延迟,可以自定义视频码率,支持自动横屏,操作很灵敏,实用性非常的高

你可以方便地利用 Scrcpy 来测试 APP 应用、玩游戏、高效完成一些需要在手机上进行的复杂工作、更高效地办公;也能更方便地进行 Android 屏幕录像、截屏;甚至还能方便你上班时摸鱼划水。应用场景非常多,无论是开发者还是普通个人用户都相当的实用。如果经常有电脑上操控手机的需求,那么 Scrcpy 可谓是妥妥的神器!

Scrcpy 是一款命令行工具,没有图形界面,无需 ROOT 手机,也不需在手机上安装 APP,只需在系统设置里启用“USB 调试”( adb 调试) 即可

几款 Scrcpy-GUI 工具

Scrcpy 本身是个命令行软件,对很多人来说用起来并不是那么方便……。

Scrcpy-GUI

Scrcpy-GUI 是一个能专门为 Scrcpy 提供可视化的操作界面的外挂工具

Scrcpy-GUI 也是免费开源的,同时也能跨平台支持 Windows、macOS 和 Linux 等系统

github:https://github.com/Tomotoes/scrcpy-gui

使用文档: https://github.com/Tomotoes/scrcpy-gui/blob/master/README.zh_CN.md

Scrcpy-GUI 只是图形界面(它不包含 Scrcpy 本身),你需要先安装好 Scrcpy,之后就能使用 GUI 界面进行连接使用了

Scrcpy_GUI 酷安@晨钟酱

下载链接

百度云:https://pan.baidu.com/s/14f8ffCapvPrU2eMWwBWK0A 提取码:64l0

https://www.coolapk.com/feed/15973938?shareKey=YWE5NWFkMTg1N2Y2NWU1ODFlOWQ~&shareUid=739982&shareFrom=com.coolapk.market_10.0.1

安卓投屏

下载地址

蓝奏云:https://www.lanzous.com/b009vk8ze 密码:gu2t

百度云:https://pan.baidu.com/s/1E41IIgyU1vvERkhxFh0eGg 提取码:zfqd

QtScrcpy

开源地址:https://github.com/barry-ran/QtScrcpy

网站外链跳转时通过 go 界面进行对 seo 比较友好,既美观又可以避免权重的流失。

简单的实现

  1. 在 wordpress 的根目录下,新建一个 go.php 文件,在 go.php 里面输入以下代码
<?php
$t_url = preg_replace('/^url=(.*)$/i','$1',$_SERVER["QUERY_STRING"]);
if(!empty($t_url)) {
preg_match('/(http|https):\/\//',$t_url,$matches);
if($matches){
$url=$t_url;
$title='页面正在安全跳转中,请稍候';
} else {
preg_match('/\./i',$t_url,$matche);
if($matche){
$url='http://'.$t_url;
$title='页面正在安全跳转中,请稍候';
} else {
$url='//wqdy.top/';
$title='参数错误,正在返回首页';
}
}
} else {
$title='参数缺失,正在返回首页';
$url='//wqdy.top/';
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="refresh" content="1;url='<?php echo $url;?>';">
<title><?php echo $title;?></title>
<style>
body {background:#000}
.loading {
-webkit-animation:fadein 2s;
-moz-animation:fadein 2s;
-o-animation:fadein 2s;
animation:fadein 2s}
@-moz-keyframes fadein {from {opacity:0}
to {opacity:1}}
@-webkit-keyframes fadein {from {opacity:0}
to {opacity:1}}
@-o-keyframes fadein {from {opacity:0}
to {opacity:1}}
@keyframes fadein {from {opacity:0}
to {opacity:1}}
.spinner-wrapper {
position:absolute;
top:0;
left:0;
z-index:300;
height:100%;
min-width:100%;
min-height:100%;
background:#3498db}
.spinner-text {
position:absolute;
top:50%;
left:50%;
margin-left:-200px;
margin-top: 2px;
color:#fff;
letter-spacing:1px;
font-weight:700;
font-size:36px;
font-family:Arial}
.spinner {
position:absolute;
top:50%;
left:50%;
display:block;
margin-left:-270px;
width:1px;
height:1px;
border:25px solid rgba(100,100,100,0.2);
-webkit-border-radius:50px;
-moz-border-radius:50px;
border-radius:50px;
border-left-color:transparent;
border-right-color:transparent;
-webkit-animation:spin 1.5s infinite;
-moz-animation:spin 1.5s infinite;
animation:spin 1.5s infinite}
@-webkit-keyframes spin {0%,100% {-webkit-transform:rotate(0deg) scale(1)}
50% {-webkit-transform:rotate(720deg) scale(0.6)}}
@-moz-keyframes spin {0%,100% {-moz-transform:rotate(0deg) scale(1)}
50% {-moz-transform:rotate(720deg) scale(0.6)}}
@-o-keyframes spin {0%,100% {-o-transform:rotate(0deg) scale(1)}
50% {-o-transform:rotate(720deg) scale(0.6)}}
@keyframes spin {0%,100% {transform:rotate(0deg) scale(1)}
50% {transform:rotate(720deg) scale(0.6)}}
</style>
</head>
<body>
<div class="loading">
<div class="spinner-wrapper">
<span class="spinner-text">页面正在安全跳转中,请稍候</span>
<span class="spinner"></span>
</div>
</div>
</body>
</html>

则外链跳转形式为: {本站地址}/go.php?{外链地址}

  1. 给外部链接加上 go 跳转,在主题目录下的 functions.php 中添加如下代码
add_filter('the_content','the_content_nofollow',999);
function the_content_nofollow($content) {
preg_match_all('/<a(.*?)href="(.*?)"(.*?)>/',$content,$matches);
if($matches){
foreach($matches[2] as $val){
if(strpos($val,'://')!==false && strpos($val,home_url())===false && !preg_match('/\.(jpg|jepg|png|ico|bmp|gif|tiff)/i',$val)){
$content=str_replace("href=\"$val\"", "href=\"".home_url()."/go.php?url=$val\" ",$content);
}
}
}
return $content;
}

安装

$ npm install pm2 -g

使用

$ pm2 list # 显示所有进程状态

$ pm2 start <js文件路径>.js # 同 node <js文件路径>.js
$ pm2 start <json描述文件路径>.json
$ pm2 start <python文件路径>.py --interpreter python
$ pm2 start <sh文件路径>.sh --interpreter bash
$ pm2 start ./node_modules/<某模块名称>/<模块主文件路径>.js
$ pm2 start <某种方式> -- --param_name param_value
$ pm2 start npm -- start # 同 npm start
$ pm2 start npm -- run <scriptname> # 同 npm run <scriptname>
$ pm2 start npm --watch --name <taskname> -- run <scriptname> # --name 指定任务名 --watch监听文件变化

$ pm2 start yarn -- start
$ pm2 start yarn -- run <scriptname>

$ pm2 stop <app_name|namespace|id|'all'|json_conf> # 停止进程 all 停止所有进程
$ pm2 restart <app_name|namespace|id|'all'|json_conf> # 重启进程 all 重启所有进程
$ pm2 delete <app_name|namespace|id|'all'|json_conf> # 删除进程 all 删除所有进程
$ pm2 reload all # 重载所有进程

$ pm2 describe <id|app_name> # 进程详情

$ pm2 monit # 进程日志、详情

# 更新 PM2
# Install latest PM2 version
$ npm install pm2@latest -g
# Save process list, exit old PM2 & restore all processes
$ pm2 update

youtube-dl – 一款犀利的全网视频下载利器

github:https://github.com/ytdl-org/youtube-dl

下载:https://github.com/ytdl-org/youtube-dl/releases

CR TubeGet 基于 youtube-dl 封装并做功能扩展的一款视频下载软件

CR TubeGet 功能:
1、支持 2000+站点视频下载,支持 YouTube、BiliBili 等主流视频站点
2、支持下载脚本扩展,加入 youtube-dl 不支持的站点下载
3、支持 200+播放列表,甚至搜索引擎(google、bing、baidu、yahoo、yandex、ask)之视频搜索列表,支持自定义视频列表
4、支持 YouTube 8k 分辨率,支持 Mp3 等音频下载,支持批量下载
5、支持视频 URL、文本文件拖放下载,支持剪切板视频 URL 监测功能
7、内置视频页面支持快捷下载
8、支持 aria2 下载器加速下载,支持 annie、you-get 下载组件
9、支持视频格式无损转换、字幕烧录

下载地址

v0.9.2.4 版起,未注册版本只能下载 99 个视频
如果希望继续使用免费版本,请下载 v0.9.2.3 版,该没有任何功能上的限制,有着视频下载的基本功能,若您下载油管及 B 站,相信其功能可以满

软件发布官网:http://www.cr-soft.net/

百度云:https://pan.baidu.com/s/1E_fGDHhGKn7sWCEt7fMtGQ 提取码:m3fk

Allavsoft

Allavsoft 视频下载器,是一个流行的快速在线视频下载和转换器,可将下载的视频转换为几乎所有流行的视频和音频格式。作为一款国外的软件,支持非常多的国内视频网站下载,包括但不限于优酷、土豆、爱奇艺等,更多支持网站请点击 这里 进行查看。

破解教程 https://www.bilibili.com/video/av85631611/

下载地址

百度云:https://pan.baidu.com/s/1VwGCcssxOvn-U4GWFec9KQ 提取码:5r2x

硕鼠下载

http://www.flvcd.com/

nuxt

Nuxt.js 是一个基于 Vue.js 的通用应用框架。

官网:https://nuxtjs.org/
中文:https://zh.nuxtjs.org/ https://www.nuxtjs.cn/

nuxt 渲染流程

在任何 Vue 组件的生命周期内, 只有 beforeCreate 和 created 这两个方法会在 客户端和服务端被调用。其他生命周期函数仅在客户端被调用。

asyncData 方法

https://zh.nuxtjs.org/api/

用于在渲染组件之前异步获取数据,在服务端或路由更新之前被调用。在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData 方法来获取数据并返回给当前组件。

注意:由于 asyncData 方法是在组件 初始化 前被调用的,所以在方法内是没有办法通过 this 来引用组件的实例对象。
asyncData 只在首屏被执行,其它时候相当于 created 或 mounted 在客户端渲染页面。

fetch 方法

在 2.12 版本之前:

fetch 方法用于在渲染页面前填充应用的状态树(store)数据, 与 asyncData 方法类似,不同的是它不会设置组件的数据。
警告: 您无法在内部使用 this 获取组件实例,fetch 是在组件初始化之前被调用

在 2.12 版本中,fetch 有大更新,fetch(context)已被弃用,可以在 fetch() 中直接使用 this,参考:https://nuxtjs.org/api/pages-fetch

参考 2:https://juejin.im/post/5ecb813751882543184598fe
https://zh.nuxtjs.org/blog/understanding-how-fetch-works-in-nuxt-2-12/

context

https://zh.nuxtjs.org/api/context

服务端上下文对象,可以在 asyncData fetch plugins middlewares modules store/nuxtServerInit 等特殊的 Nuxt 生命周期区域中使用

nuxt 配置

配置启动端口

以下两者都可以配置启动端口

第一种

nuxt.config.js :

module.exports = {
server: {
port: 8000,
host: '127.0.0.1'
}
}

第二种

package.json :
"config": {
"nuxt": {
"port": "8000",
"host": "127.0.0.1"
}
},

引入 element-ui

npm i element-ui

修改 nuxt.config.js

module.exports = {
plugins: ['@/plugins/element-ui'],
transpile: [/^element-ui/]
}

创建 plugins/element-ui.js

import Vue from 'vue'
import Element from 'element-ui'
Vue.use(Element)

环境变量

https://zh.nuxtjs.org/api/configuration-env

package.json

{
"scripts": {
"dev": "nuxt",
"build:test": "cross-env BASE_URL=testxxx nuxt build",
"build:production": "cross-env BASE_URL=productionxxx nuxt build"
}
}

nuxt.config.js

module.exports = {
env: {
baseUrl: process.env.BASE_URL
}
}

我们可以通过以下两种方式来使用 baseUrl 变量:

通过 process.env.baseUrl
通过 context.env.baseUrl

自定义路由配置

在 Nuxt.js 中,路由是基于文件结构自动生成,无需配置。自动生成的路由配置可在 .nuxt/router.js 中查看。

配置路由以 .html 结尾

nuxt.config.js

export default {
router: {
middleware: 'router',
extendRoutes(routes, resolve) {
routes.push({
name: 'case',
path: '/case.html',
component: resolve(__dirname, 'pages/case/_id.vue')
})
routes.forEach((element) => {
let path = element.path
if (path !== '/' && !path.includes('.html')) {
path = path + '.html'
element.path = path
}
})
}
}
}

axios 配置

使用 Axios,并配置全局拦截器,处理跨域

安装依赖

npm install @nuxtjs/axios @nuxtjs/proxy --save
// nuxt.config.js
module.exports = {
modules: ['@nuxtjs/axios'], // 不需要加入@nuxtjs/proxy
axios: {
proxy: true,
prefix: '/api', // baseURL
credentials: true
},
proxy: {
'/api/': {
target: 'http://127.0.0.1:8080', // 代理地址
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}

组件中使用

<script>
export default {
asyncData ({ app, $axios }) {
// app.$axios == $axios
console.log(app.$axios)
},
created () {
console.log(this.$axios)
}
}
</script>

设置全局拦截器:新建一个/plugins/axios.js

export default function ({ $axios }) {
const axios = $axios
// 基本配置
axios.defaults.timeout = 10000
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'

// 请求回调
axios.onRequest((config) => {})

// 返回回调
axios.onResponse((res) => {})

// 错误回调
axios.onError((error) => {})
}

然后在 plugins 配置它

plugins: [
{
src: '@/plugins/axios',
mode: 'client',
},

配置 css 预处理器

安装依赖

npm i -D less less-loader

无需配置,模板内直接使用

<style lang="less" scoped></style>

token 的设置与存储

在前后端分离的项目中,一般都会存放到本地存储中。但 Nuxt.js 不同,由于服务端渲染的特点,部分请求在服务端发起,我们无法获取 localStorage 或 sessionStorage。

可以使用 cookie,并借助 cookie-universal-nuxt 模块(该模块只是帮助我们注入,主要实现依赖 cookie-universal),不管在服务端还是客户端,cookie-universal-nuxt 都为我们提供一致的 api,它内部会帮我们去适配对应的方法。

安装 cookie-universal-nuxt

npm run cookie-universal-nuxt --save

nuxt.config.js :

module.exports = {
modules: ['cookie-universal-nuxt']
}

访问 $cookies 进行使用:

// 服务端:
// 获取
app.$cookies.get('name')
// 设置
app.$cookies.set('name', 'value')
// 删除
app.$cookies.remove('name')

// 客户端:
// 获取
this.$cookies.get('name')
// 设置
this.$cookies.set('name', 'value')
// 删除
this.$cookies.remove('name')

之后需要改造下 axios,让它在请求时带上验证信息:

/plugins/axios.js :

export default function ({ app: { $axios, $cookies } }) {
$axios.interceptors.request.use((config) => {
// 头部带上验证信息
config.headers['X-Token'] = $cookies.get('token') || ''
return config
})
$axios.interceptors.response.use((response) => {
if (/^[4|5]/.test(response.status)) {
return Promise.reject(response.statusText)
}
return response.data
})
}

middleware 中间件使用

https://zh.nuxtjs.org/api/pages-middleware

全局配置: 这种中间件使用是注入到全局的每个页面中

nuxt.config.js :

module.exports = {
router: {
middleware: ['auth']
}
}

如果你希望中间件只运行于某个页面,可以配置页面的 middleware 选项:

export default {
middleware: 'auth'
}

使用 keep-alive

https://github.com/nuxt/nuxt.js/tree/dev/examples/with-keep-alive

layouts/default.vue:

直接给 Nuxt 添加 keep-alive 虽然可以实现页面缓存,但是每次页面切换时都会去请求接口

https://juejin.im/post/5cff5f02e51d4510624f97ab

分离 css

nuxt.config.js

build: {
extractCSS: true,
optimization: {
splitChunks: {
chunks: 'all',
},
},
}

head 配置

meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ name: 'author', content: 'cuilongjin' },
{ 'http-equiv': 'X-UA-Compatible', content: 'IE=edge' },
],
link: [
{
rel: 'icon',
type: 'image/x-icon',
href: '/logo.png',
},
],
script: [
{
src: '/moveheader.js', // 引入 js 路径
},
{
innerHTML: 'console.log('1')' // 直接引入 js 代码
},
],
// 如果使用innerHTML直接引入 js 代码,代码中的引号会被转换为实体字符,导致代码不能正常执行,所以需要配置此项
__dangerouslyDisableSanitizers: ['script'],

添加百度统计代码

在 plugins 目录下新建 baidu.js 文件,内容如下:
注意修改xxxxxxxxxxx编号

/*
** 只在生产模式的客户端中使用
*/
if (process.client && process.env.NODE_ENV === 'production') {
// 百度统计脚本
var _hmt = _hmt || []
;(function () {
const hm = document.createElement('script')
hm.src = 'https://hm.baidu.com/hm.js?xxxxxxxxxxx'
const s = document.getElementsByTagName('script')[0]
s.parentNode.insertBefore(hm, s)
})()
}

export default ({ app: { router }, store }) => {
// 每次路由变更时进行pv统计
if (process.client && process.env.NODE_ENV === 'production') {
router.afterEach((to, from) => {
var _hmt = _hmt || []
;(function () {
const hm = document.createElement('script')
hm.src = 'https://hm.baidu.com/hm.js?xxxxxxxxxxx'
const s = document.getElementsByTagName('script')[0]
s.parentNode.insertBefore(hm, s)
})()
})
}
}

nuxt-config.js 中添加

plugins: [
{ src: '~plugins/baidu.js', mode: 'client' },
],

兼容 ie9 ie10

其他

参考 demo
掘金教程

window.__NUXT__ 如何去掉

vue 实例中 通过 this.$nuxt.context 访问 context

nuxt generate 动态路由配置

nuxt 配置自定义 webpack loader 处理图片 css