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

merge-images 合并图像

github 地址:https://github.com/lukechilds/merge-images

Cropper.js 图片裁剪工具

github 地址:https://github.com/fengyuanchen/cropperjs
示例地址:https://fengyuanchen.github.io/cropperjs/

grade.js 根据图片的两种主要颜色生成背景渐变

github 地址:https://github.com/benhowdle89/grade
示例地址:https://benhowdle89.github.io/grade/

Compressor.js 图像压缩

github 地址:https://github.com/fengyuanchen/compressorjs
示例地址:https://fengyuanchen.github.io/compressorjs/

update wp_posts set id = 430 where id = 404;
update wp_term_relationships set object_id = 430 where object_id = 404;
update wp_postmeta set post_id = 430 where post_id = 404;
update wp_comments set comment_post_ID = 430 where comment_post_ID = 404;

如果页面指定了 DTD,即指定了 DOCTYPE 时,使用 document.documentElement.scrollTop/Left 可以获取到正确的结果

页面没有 DTD,即没指定 DOCTYPE 时,使用 document.body.scrollTop/Left 可以获取到正确的结果

获取页面向左、向上卷动的距离的兼容性方式

function getScroll() {
return {
left: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0,
top: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0
}
}

document.body 与 document.documentElement 区别

document.body 返回 dom 中的 body 节点即 <body>
document.documentElement 返回 dom 中的 root 节点即 <html>

设置页面卷曲距离

// X: 向左卷曲距离
// Y: 向上卷曲距离
window.scrollTo(X, Y)

# 卸载openssh-client
sudo apt-get remove openssh-client # 卸载openssh-client并重新安装

# 安装ssh服务
sudo apt-get install ssh
# 理论上包含了 openssh-server 和客户端 openssh-client,如果安装出现异常,请独立安装这两个

# 修改配置
vi /etc/ssh/sshd_config

Port = 22 # 默认是22端口,如果和windows端口冲突或你想换成其他的否则不用动
#ListenAddress 0.0.0.0 # 如果需要指定监听的IP则去除最左侧的井号,并配置对应IP,默认即监听PC所有IP
PermitRootLogin yes # 如果你需要用 root 直接登录系统则此处改为 yes
PasswordAuthentication yes # 将 no 改为 yes 表示使用帐号密码方式登录

# 设置密码
passwd root

# 启动 ssh 服务
service ssh start
# sudo /etc/init.d/ssh start

# 查看 ssh 状态
service ssh status

局域网内的其他终端无法连接:不要忘了,还要配置防火墙开启端口才能被其他 PC 访问