笔记

docker环境下php使用指南

最近由于业务原因,需要将 php7.0 升级到 7.2。升级要考虑一下几点
要满足以下需求

  1. php7.0 和 7.2 要共存,以免升级 7.2 以后出现问题,及时切换回来。
  2. 升级操作要简单,服务器数量比较多,原生方式安装太过复杂,操作步骤太多,就算携程 shell 脚本,维护起来也比较麻烦
  3. nginx 保持原样,只对项目相关的配置文件做简单调整即可。如果 nginx 变更日志处理等模块都收到牵连。

考虑到上面的因素,用 docker 显然是非常符合的。于是就开启了踩坑之旅。
主要遇到了两个问题,一个是502,还有一个是File not found。下面进行分析

vue组件之插槽

这篇文章的写作时间是 vue2.6 发布后,因此适用于 2.6 以后的版本
插槽是 vue 组件中很重要的一环,他解决了组件内容自定义的问题。以及父子组件变量传递的问题(作用域插槽)。
在 2.6 以后的版本中,具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令),它取代了 slot 和 slot-scope 。这两个老的已经进入废弃期,为了保持平滑升级,目前还可以使用,但是不推荐使用。后期会被移除。

省略sudo使用docker

安装 docker

1
wget -qO- https://get.docker.com/ | sh

1
sudo apt install docker

原理

为什么需要创建 docker 用户组?
Docker 守候进程绑定的是一个 unix socket,而不是 TCP 端口。这个套接字默认的属主是 root,其他是用户可以使用 sudo 命令来访问这个套接字文件。因为这个原因,docker 服务进程都是以 root 帐号的身份运行的。

使用阿里云ecs主机打造shadowsocks服务器,实现科学上网

要想打造一台自己的ss(shadowsocks)或ssr(shadowsocksR)服务器。要具备一下条件:

  1. 要有一台自己的服务器vps或ecs云主机都可以,虚拟主机是不行滴
  2. 服务器一定要在海外或中国香港。推荐日、韩、香港、新加坡服务器
    下面已阿里ecs为实例说明,主要是ecs降价了366/年的价格速度很快。比网上说的搬瓦工、Vultr强多了。

VirtualBox v5.2.12 Ubuntu18.04 宿主机和虚拟主机互通,都可上网配置方式

全局设置

点击管理,全局设置;
选择网络,里面只有 NAT 网络;
点击添加,列表新增 NatNetwork,点击确定。

虚拟机配置

点击管理,选择主机网络管理;
选择创建,列表新增 vboxnet0,只要这一个就够了;
选中点击 vboxnet0,点击手动配置网卡;
点击 IPv4 地址,输入配置的网关 IP,如:192.168.56.1;
如果不想使用 DHCP,取消启用 DHCP,点击应用。

给虚拟机添加网卡

右键点击一个虚拟主机,选择设置;
选择网络;
选中点击网卡 1,勾选启用网络连接;
连接方式选择网络地址转换(NAT),界面可以空着;
选中点击网卡 2,勾选启用网络连接;
连接方式选择仅主机(Host-Only)网络,界面名称为 vboxnet0,点击确认。

设计模式基本原则大白话

单一职责原则

简单点说就是最小化封装,一个方法只负责一个功能,一个类只负责一类功能。如果一个功能比较复杂,那就差分成多个小功能,然后去实现。
这样做的好处是

  • 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
  • 提高类的可读性,提高系统的可维护性;
  • 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。

里氏替换原则

简单点说就是子类可以扩展父类的功能,但不能改变父类原有的功能。
注意一下几点即可

  • 子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
  • 子类中可以增加自己特有的方法。
  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
  • 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。

这样做可以有效避免,功能耦合度太高,改一个小功能影响到其他功能的情况

依赖倒置原则

依赖倒置就是控制翻转,又名 IOC,简单点说,就是将需要的外部对象,通过构造函数参数传递或属性赋值的方式,让当前对象可以使用注入的外部对象。
注意一下几点即可

  • 低层模块尽量都要有抽象类或接口,或者两者都有。
  • 变量的声明类型尽量是抽象类或接口。
  • 使用继承时遵循里氏替换原则

这样做可以有效解耦,功能发生改变时,只需要替换外部的依赖对象,而不必修改主体功能代码。