您正在查看: 2019年10月

Mac下ElasticSearch安装

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。

下面介绍一下Mac下安装Elasticsearch的步骤

更新brew

brew update

安装java8

brew cask install homebrew/cask-versions/java8

安装es

brew install elasticsearch

运行es

brew services start elasticsearch

本地浏览器访问http://localhost:9200

{
name: "90LNUen",
cluster_name: "elasticsearch_shengyulong",
cluster_uuid: "vMztQUmQS7-_aJ1b37URYg",
version: {
    number: "6.6.2",
    build_flavor: "oss",
    build_type: "tar",
    build_hash: "3bd3e59",
    build_date: "2019-03-06T15:16:26.864148Z",
    build_snapshot: false,
    lucene_version: "7.6.0",
    minimum_wire_compatibility_version: "5.6.0",
    minimum_index_compatibility_version: "5.0.0",
},
tagline: "You Know, for Search",
}

安装Kibana
Kibana是ES的一个配套工具,可以让用户在网页中与ES进行交互

brew install kibana

启动Kibana

brew services start kibana

本地浏览器访问

http://localhost:5601

查看集群健康状态

localhost:9200/_cat/health?v

green:一切都很好(集群功能齐全)
yellow:所有数据都可用,但尚未分配一些副本(群集功能齐全)
Red:某些数据由于某种原因不可用(群集部分功能)

php单例模式


<?php
//单例模式:在应用中最多只能拥有一个该类的实例存在,一旦创建就会一直在内存中。
//用法:把一个对象实例化后放在静态属性上
//场景:数据库类设计,可以保证只连接一次数据库
//特点1:单例类不能直接实例化创建,只能由类本身实例化,因此构造函数必须标记为private,从而防止类被实例化
//特点2:需要有一个能访问到的实例公开的静态方法和一个私有静态成员变量来保存类的实例
//特点3:类中通常需要一个空的私有__clone()方法防止别人对单例类进行实例克隆

class single {

    protected static $ins = null;
    //方法前加final,在继承后该方法将不能被子类覆盖
    final protected function __construct(){

    }

    final protected function __clone(){

    }

    public static function getIns(){
        if(self::$ins === null){
            self::$ins = new self();
        }
        return self::$ins;
    }

}

$s1 = single::getIns();
$s2 = single::getIns();
if($s1 === $s2){
    echo '单例模式';
}

PHP抽象类与接口的区别详解

对于面向对象开发,抽象类与接口这两个东西是比较难理解的;就算是对于有一定经验的程序员来说也如此。下面根据自己的理解来讲述一下这两个东西,如有什么不对的,还望不吝赐教。

抽象类: 是基于类来说,其本身就是类,只是一种特殊的类,不能直接实例,可以在类里定义方法,属性。类似于模版,规范后让子类实现详细功能。

接口: 主要基于方法的规范,有点像抽象类里的抽象方法,只是其相对于抽象方法来说,更加独立。可让某个类通过组合多个方法来形成新的类。

抽象类与接口的相同点:

1、都是用于声明某一种事物,规范名称、参数,形成模块,未有详细的实现细节。

2、都是通过类来实现相关的细节工作

3、语法上,抽象类的抽象方法与接口一样,不能有方法体,即{}符号

4、都可以用继承,接口可以继承接口形成新的接口,抽象类可以继承抽象类从而形成新的抽象类

抽象类与接口的不同点:

1、抽象类可以有属性、普通方法、抽象方法,但接口不能有属性、普通方法、可以有常量

2、抽象类内未必有抽象方法,但接口内一定会有“抽象”方法

3、语法上有不同

4、抽象类用abstract关键字在类前声明,且有class声明为类,接口是用interface来声明,但不能用class来声明,因为接口不是类。

5、抽象类的抽象方法一定要用abstract来声明,而接口则不需要

6、抽象类是用extends关键字让子类继承父类后,在子类实现详细的抽象方法。而接口则是用implements让普通类在类里实现接口的详细方法,且接口可以一次性实现多个方法,用逗号分开各个接口就可

各自的特点:

抽象类内未必有抽象方法,但有抽象方法的类,则必是抽象类

抽象类内,即便全是具体方法,也不能够实例化,只要新建类来继承后,实例继承类才可以

接口可以让一个类一次性实现多个不同的方法

接口本身就是抽象的,但注意不是抽象类,因为接口不是类,只是其方法是抽象的。所以,其也是抽象的

php工厂模式

为什么要用工厂模式?
  很多没接触过工厂模式的人会不禁问,为啥我要费那么大的劲儿去构造工厂类去创建对象呢?不去套用那些易维护,可扩展之类的话,我们可以考虑这样一个简单的问题。如果项目中,我们通过一个类创建对象。在快完成或者已经完成,要扩展功能的时候,发现原来的类类名不是很合适或者发现类需要添加构造函数参数才能实现功能扩展。我靠!我都通过这个类创建了一大堆对象实例了啊,难道我还要一个一个去改不成?我们现在才感受到了“高内聚低耦合”的博大精深。没问题,工厂方法可以解决这个问题。
  再考虑一下,我要连接数据库,在php里面就有好几种方法,mysql扩展,mysqli扩展,PDO扩展。我就是想要一个对象用来以后的操作,具体要哪个,视情况而定喽。既然你们都是连接数据库的操作,你们就应该拥有相同的功能,建立连接,查询,断开连接...(此处显示接口的重要性)。总而言之,这几种方法应该“团结一致,一致对外”。如何实现呢?利用工厂模式。


//工厂模式,工厂方法:用一个类(工厂模式)通过本身的方法(或静态方法)来实例化一个类并返回一个实例对象;

//特点如下
//工厂模式专门负责实例化有大量公共接口的类
//工厂模式可以动态地决定将哪一个类实例化
//客户类和工厂类是分开的

//缺点:当客户类产品需要修改时,工厂类也要做相应的修改。

//定义数据库方法
interface db{
    function conn();
}

//定义工厂方法
interface Factory{
    function createDB();
}

//实现数据库接口
class dbmysql implements db{
    public function conn(){
        echo '连上了mysql';
    }
}

class dbsqlite implements db{
    public function conn(){
        echo '链接上了sqlite';
    }
}

class dboracle implements db{
    public function conn(){
        echo '链接上了oracle';
    }
}


//实现工厂模式接口
class mysqlFactory implements Factory{
    public  function createDB(){
        return new dbmysql();
    }
}
class sqliteFactory implements Factory{
    public function createDB(){
        return new dbsqlite();
    }
}
class oracleFactory implements Factory{
    public function createDB(){
        return new dboracle();
    }
}



$fact = new mysqlFactory();
$db = $fact->createDB();
$db->conn();

$fact = new sqliteFactory();
$db = $fact->createDB();
$db->conn();

$fact = new oracleFactory();
$db = $fact->createDB();
$db->conn();



//工厂模式2
class mysqlFactory2{
    static public function factory($class_name){
        return new $class_name();
    }
 
}

$fact = mysqlFactory2::factory('dbmysql');
$fact->conn();

macOS 中的 Rootless 机制

一、前因
苹果从 OS X El Capitan 10.11 系统开始使用了 Rootless 机制,可以将该机制理解为一个更高等级的系统的内核保护措施,系统默认将会锁定 /system、/sbin、/usr 这三个目录。

二、后果
Rootless 机制虽然在一定程度上增加了系统的安全性,但作为一名开发人员会经常的操作 /usr 这个目录,这个时候你会发现你使用的任何命令都会提示没有操作权限,即使使用 root 权限也不行。

三、开关 Rootless
关闭和开启 Rootless 非常简单,方法如下:

重启 Mac,听到开机启动声后按下 Command+R,进入恢复模式,在上面的菜单实用工具中找到并打开 Terminal(如果顶部没出现菜单,请继续重启^_^)。输入如下命令:

  1. 关闭 Rootless
    $ csrutil disable

  2. 开启 Rootless
    $ csrutil enable

执行完命令后,重启电脑即可生效。为了系统的安全,建议大家平时都开启 Rootless,只有需要时才暂时关闭。

四、文件还是无法写入系统目录的情况
Mac 升级 catalina 后根目录无法创建文件,提示‘Read-only file system’错误,原本根目录文件夹被迁移
关闭 sip即可,终端输入 sudo mount -uw /