Dry Realm

Get busy living

Category

  • DevOps
  • Javascript
  • Review
  • 一些技巧
  • 其它
  • 学习过程中的所感所想
  • 拼命学习
  • 那些年的所见所闻
  • 随笔

Tags

  • Node.js
  • MongoDB
  • linux
  • HTTP
  • docker
  • 面试总结
  • 运维
  • typescript
  • es6
  • express
  • 本地版博客
  • 数据库
  • ntzyz大佬
  • git
  • MySQL
  • eslint
  • 负数
  • 数学
  • devcontainer
  • Css
  • review
  • wsl2
  • 语句
  • 正则表达式
  • javascript
  • ECMA
  • 年度总结
  • Gitlab Api
  • 离别
  • 下载youtube
  • docker swarm
  • vscode
  • 大黑猫
  • 新博客框架
  • 西安
  • 3rd-lib
  • 南京
  • 文字
  • Git
  • 数据库连接
  • 第三方库
  • 网络
  • linux指令
  • jenkins pipeline
  • webpack
  • k8s
  • new life
  • 子网掩码

Recent replies

  • xzdry 发表于「使用ffmpeg和youtube-dl下载youtube视频」

友链

ntzyz double

我

真诚
很看重自己在乎的人
希望能越来越好
爱蛋蛋

linux和win文件互传

2019 年 6 月 28 日分类:一些技巧#linux

工具

貌似xShell更好,但是收费。所以选择另一个很好用的工具PUTTY

win传linux

首先要把文件用scp(win10下用pscp)复制到服务器那边。放到目录/var/www/xzdry下,

pscp E:\前端学习\github\playground\test1.html xxxx:
#输入密码

#传输完成

具体查询scp/pscp(远程传输文件),cp(拷贝)等命令。这里写的并不详细,只是暂时测试。

linxu传win

在网上找了很多,诸如lrzsz,pscp等方法,但都碰到了问题。最后发现了这个帖子,用putty自带的PSFTP。
具体步骤如下:

# 打开psftp,输入open ip(linux的ip,使用ifconfig查看)
open ip xxx.xx.xx.xx

# 进入对应目录,cd进入要操作文件夹的linux目录,lcd切换到要操作文件夹的win的目录
lcd C:\Users\xzdry\Desktop\test  # win目录
cd /home/xzdry   # 使用ls查看当前文件夹
# 使用put文件名上传到服务器(暂未尝试,都是使用上方的pscp方法)

# get 文件名下载文件到自己电脑。文件夹用get -r
get -r xxx

使用ffmpeg和youtube-dl下载youtube视频

2019 年 5 月 17 日分类:一些技巧#下载youtube

下载方式看文档,win下只需要下载一个二进制的exe

常用命令

youtube-dl -F xxx   # xxxx 为视频网址

-F(--list-formats)会列出视频所有格式,如下:

youtube-dl -f 137+140 xxxxx

获取之后可以使用-f 编号(通过+连接多个编号)进行下载

youtube-dl --write-sub --all-subs xxxx

两个参数–write-sub:加入字幕文件 –all-subs:如果有字幕存在则全部下载。用于下载字幕

# 直接下载最高清vedio和audio
youtube-dl -f bestvideo+bestaudio xxx

# 最简单的方式,直接下载best
youtube-dl -f 22 xxx

# 下载某个格式的best quality format
youtube-dl -f mp4 xxx
yd -f 22 --playlist-start xxx # xxx为一个playlist地址

直接使用playlist地址会下载里面所有的视频。--playlist-start选项则指定从哪个视频开始。还可以指定下载某几个,到哪个视频结束等等,具体参加文档的Video Selection部分

附几个工具的官网:
ffmpeg
youtube-dl

Mongodb模糊匹配

2019 年 5 月 2 日分类:拼命学习#MongoDB#正则表达式

MongoDB的模糊查询可以用正则表达式来查询,比如我想查找文章中是否有某段话,如下:

db.getCollection('posts').find({'content.content':{$regex:'http:\/\/localhost'}})

需要注意的点就是转义,如果是子对象就用.来表示,但是要加引号。附数据库结构: 1556781529013-MongoDB模糊匹配.png

把项目部署到服务器流程

2019 年 1 月 28 日分类:一些技巧#Node.js#HTTP#express#linux

使用的是ntzyz大佬的服务器。过程如下

第一步 拷贝文件到服务器

用scp(win10下用pscp)复制到服务器那边。放到目录/var/www/xzdry下,但是直接使用:

pscp E:\前端学习\github\playground\test1.html [email protected]:/var/www/xzdry

会因为没有权限而被拒绝。因此只能先传到/home/xzdry下。具体如下:

pscp E:\前端学习\github\playground\test1.html xxxx:
#输入密码

#传输完成

## 注:传输整个文件夹用-r命令

第二步 把文件复制到对应的文件夹下

这里主要涉及到几个常用的linux命令:

  • 拷贝文件用cp,拷贝整个文件夹则是cp -r
  • 如果只想拷贝文件夹下的内容而不拷贝文件夹,则用cp -rf xxx/* xxx
  • 删除文件用rm,删除文件夹为rm -rf 例子:
#文件从/home/xzdry下拷贝到/var/www/xzdry下,这里同样会有权限的问题,因此需要使用sudo
sudo cp test1.html /var/www/xzdry/example2/
# rm -rf xxx  #强制删除整个文件夹

详细语法:

cp [选项] 源文件或目录 目标文件或目录
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的各选项含义如下:
- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
- d 拷贝时保留链接。
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。
需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。

第三步 挂在到后台

# 第一步
screen -S xxx  #如screen -S my_service

# 第二步 启动后端服务
node app.js

# 第三步 挂载到后台
# 按顺序按住Ctrl+A+D 就挂载到后台了

附其它命令:

# 从后台恢复 
screen -r xxx  #此处可填 进程序号或者进程名字。比如124624或gowhere_service

# 查看有哪些虚拟终端
screen -ls  # 例如结果:124624.gowhere_service  (Detached)

# 退出虚拟终端:在虚拟终端里输入
exit

更多关于screen的内容,参见: linux screen 命令详解 linux 技巧 linux 技巧

第四步 配置ngnix

后端配合使用静态文件,即用http的形式打开项目:

//app.js
app.use('/', express.static('./gowhere1')) //把当前目录下的项目挂载到http 3008端口

这样,项目就运行在本地3008端口,和后端同端口,就不存在https和http的跨域问题了。
然后,配置nginx,让https://www.xzdry.net/gowhere/#/反向代理到本机的3008端口, 把博客的/gowhere目录代理到3008端口,就可以直接在https://www.xzdry.net/gowhere/访问了。这样也不用一定要把项目放到博客的/static目录下了。只需要把博客下的/xxx代理到本机3008端口就可以了。
ngnix配置图:
这里我和nginx之间使用的是https通信,nginx和node则是http,nginx充当中间人的身份。
完成后systemctl restart nginx重启重新加载配置。

实现一个全局提示组件

2019 年 1 月 9 日分类:Javascript
提示:在继续阅读之前,请注意此文章最后更新于 2356 天前,其中的部分内容可能已经无效或过时。

具体代码参考:

准备知识

关于static

static关键字在后端中相信没人陌生,修饰一个字段或者方法时,表示该字段/方法是类的成员而非类所创建的实例的成员。即不能通过类new出来的实例调用。
在javascript中的作用也差不多。大概补充几点:

  • 同一个类中静态方法可以用过this调用其它静态方法/字段
  • 同一类中非静态方法可以用过class(类本身)/this.constructor来调用静态方法/字段。这里补充一点,this.constructor打印出来其实是指类,而不是类里面的构造函数。
  • 类中静态方法中的this指向这个类本身,new Class()等价于new this()
  • 类中非静态方法(包括constructor)指向类创建的实例,因为这些方法属于实例所有
  • 调用静态方法的时候,constructor不会执行
  • 一句话,属于类的成员(静态方法)中的this的指向类,所以可以直接调用其它静态方法/成员。属于类的实例(非静态方法,construtor())的this指向类创建的实例,因此不可以调用静态方法/字段。但可以调用其它实例所有的方法(其它非静态方法)。 栗子:
class StaticExample {
  static _static = 10;

  constructor() {
    console.log('constructor中的this:')
    console.log('this.constructor:', this.constructor);
    console.log(this);
    // console.log(this.A())//error
    // console.log(this.constructor.A()); //可以调用但是死循环,A中调用B,B又会通过constructor调用A
  }

  static A() {
    console.log('1.静态方法B中的this:\t', this)
    console.log('2.静态方法调用静态字段\t', this._static);
    console.log('3.静态方法调用非静态方法B:');
    new this().B();
  }
  B(instance) {
    if (!instance) return;
    console.log(instance === this); //true
    console.log('1.非静态方法B中的this:\t', this)  // 非静态方法指向类创建的实例
    console.log('2.非静态方法用this.contructor调用静态字段\t', this.constructor._static);
    console.log('3.非静态方法用class调用静态字段\t', StaticExample._static);
    this.C();
  }
  C() {
    console.log('1.非静态方法C');
  }
}
StaticExample.A();
let instance = new StaticExample();
instance.B(instance);
class StaticExample {
  static _static = 10;

  constructor(instance) {
    if (!instance) return;
    console.log('constructor中的this:', this) //指向类的实例
    console.log('this.constructor:', this.constructor);//指向类
    console.log(instance === this.constructor);//指向类

  }
}
new StaticExample(new StaticExample().constructor)

补充:在了解this.constructor的过程中,聊着聊着又聊到底层去了,所以要学的还有好多啊。当务之急还是先熟悉react和ts,然后去补充自己的底层基础。

具体实现

首先,在点击按钮中添加点击事件,点击事件会调用类的静态函数,这个类有三个静态函数入口,分别表示正常信息,错误信息,成功信息。以Toast.info为例这个函数接收3个参数,分别是msg:string(信息),duration(延迟),onClose(回调)。

Toast.info

这个静态函数只是一个包装,里面调用this._notice,把接收到的参数,加上类型传入进去,即: this._notice('info',msg,duration,onClose);

_notice

这个静态函数里面有两个步骤,第一步是执行_create();这个函数不接收任何参数,作用是创建一个遮罩的DOM元素。之后执行this._ins.addNotice,这个函数是创建真正的提示信息。这里有个不明白的点是,this._ins明明指向类,却能调用非静态addNotice方法。

_create

这个静态函数用于创建一个DOM遮罩,首先检查有没有_ins这个静态字段,如果有,直接返回。如果没有。创建一个DIV元素,zIndex设置为9999,并添加到body的最后。然后通过React.render渲染Toast这个组件,并通过组件上的ref把组件自身存到this._ins中

addNotice

这个非静态函数负责改变state里的值,把传入的参数进行处理后,通过setState进行更新。这个函数还有一个作用是销毁组件,在经过duration秒后,调用_removeNotice并传入notices的key

_removeNotice

这个函数用来在duration秒后销户组件,把notices数组中的每一项进行过滤,如果找到了传入的key对应的消息,就检查这个消息是否携带回调,如果携带,就执行,然后return false过滤掉这一项。之后再通过setState来更新新的消息数组,当数组长度为0的时候,说明遮罩内没有消息了,此时销毁最外层的遮罩容器

  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • »
Copyright © 2016-2018 ntzyz. All rights reversed.
Except where otherwise noted, content on this blog is licensed under CC-BY 2.0.