ubuntu 18 安装TIM

安装deepin-wine环境

1
2
3
sudo git clone https://github.com/wszqkzqk/deepin-wine-ubuntu.git
cd deepin-wine-ubuntu/
sudo ./install.sh

安装相关应用容器:

http://mirrors.aliyun.com/deepin/pool/non-free/d/ 中下载想要的容器,点击deb安装即可。以下为推荐容器,任选其一即可:

php实现文件下载

php实现文件下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Header ( "Content-type: application/octet-stream" );
$ua = $_SERVER ["HTTP_USER_AGENT"];
$file = '/var/www/tmp.txt';
$filename = basename ( $file );
$encoded_filename = rawurlencode ( $filename );
if (preg_match ( "/MSIE/", $ua )) {
header ( 'Content-Disposition: attachment; filename="' . $encoded_filename . '"' );
} else if (preg_match ( "/Firefox/", $ua )) {
header ( "Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"' );
} else {
header ( 'Content-Disposition: attachment; filename="' . $filename . '"' );
}
header ( "Content-Length: " . filesize ( $file ) );
readfile ( $file );

ubuntu18 安装openvpn

第一步 安装openvpn

1
2
sudo apt-get update
sudo apt-get install openvpn easy-rsa

第二步 新建CA证书文件夹

1
2
3
4
5
6
7
make-cadir ~/openvpn-ca
#或者
mkdir ~/openvpn-ca
cp -r /usr/share/easy-rsa/* ~/openvpn-ca


cd ~/openvpn-ca

配置CA变量

要配置我们的CA将要用到的值,我们需要编辑目录中的vars文件。现在用文本编辑器编辑该文件(我通常使用vim):

1
vim vars

在里面,您会发现一些可以调整的变量,以确定如何创建证书。我们只需要担心其中的一些。
将以下部分值编辑为您喜欢的任何值,但不要将它们留空,有如下示例:

1
2
3
4
5
6
7
export KEY_COUNTRY="CN"
export KEY_PROVINCE="SC"
export KEY_CITY="Chengdu"
export KEY_ORG="whatever you like"
export KEY_EMAIL="whatever you like"
export KEY_OU="Community"
export KEY_NAME="server"

第四步 制作CA

1
2
cd ~/openvpn-ca
source vars

或许你也会遇到跟我一样的问题

1
2
3
4
5
**************************************************************
No /home/ubuntu/openvpn-ca/openssl.cnf file could be found
Further invocations will fail
**************************************************************
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/ubuntu/openvpn-ca/keys

输入ls会发现,有几个版本的openssl配置文件我们复制一个

1
cp ~/openvpn-ca/openssl-1.0.0.cnf  ~/openvpn-ca/openssl.cnf

再次执行source vars就不会报错了
然后执行以下命令来构建我们的根CA

1
2
./clean-all
./build-ca

一直按enter确认选择即可

第五步 创建服务器证书,密钥和加密文件

接下来,我们将生成服务器证书和密钥对,以及加密过程中使用的一些其他文件。首先生成OpenVPN服务器证书和密钥对。我们可以通过输入:

1
./build-key-server server

接下来,我们将生成一些其他项目。 我们可以通过键入生成一个强大的Diffie-Hellman密钥,以便在密钥交换期间使用

1
./build-dh

之后,我们可以生成HMAC签名以增强服务器的TLS完整性验证功能

1
openvpn --genkey --secret keys/ta.key

第六步 生成客户端证书和密钥对

接下来,我们可以生成客户端证书和密钥对。 虽然这可以在客户端计算机上完成,然后出于安全目的由服务器/ CA签名,但为了简单起见,我们将在本指南中生成服务器上的签名密钥。
我们将为本指南生成单个客户端密钥/证书,但如果您有多个客户端,则可以根据需要重复此过程。 为每个客户端传递一个唯一值的脚本。
注:在openvpn中,这种配置方法是每一个登陆的VPN客户端需要有一个证书,每个证书在同一时刻只能供一个客户端连接(如果有两个机器安装相同证书,同时拨服务器,都能拨上,但是只有第一个拨上的才能连通网络)。所以需要建立许多份证书。
因为您可能稍后再回到此步骤,我们将重新获取vars文件。 我们将使用client1作为本指南的第一个证书/密钥对的值。
要生成没有密码的凭据,以帮助自动连接,请使用build-key命令,如下所示:

1
2
3
cd ~/openvpn-ca
source vars
./build-key client1

生成的证书文件均在~/openvpn-ca/keys

第七步 配置OpenVPN服务

开始之前,把我们需要的相关文件复制到/etc/openvpn这个配置目录中去,即把~/openvpn-ca/keys目录下面的ca.crt,ca.key,server.crt,server.key,HMAC签名以及Diffie-Hellman文件复制到/etc/openvpn这个目录下面

1
2
cd ~/openvpn-ca/keys
sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn

然后从OpenVPN自带的配置模板中复制配置文件

1
2
3
sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn/
sudo gzip -d server.conf.gz

接下来修改配置文件

1
sudo vim /etc/openvpn/server.conf

然后找到tls-auth ta.key 0,在下方增加一个key-direction参数,设置其参数值为0

1
2
tls-auth ta.key 0
key-direction 0

然后找到cipher AES-256-CBC,在下方增加auth SHA256

1
2
cipher AES-256-CBC
auth SHA256

在完成初始化工作之后,降低OpenVPN守护进程的权限
取消下面的注释

1
2
user nobody
group nobody

完成以上步骤保存退出

第八步 调整服务的网络配置

允许IP转发
首先,我们需要让我们的服务器来转发流量,这是我们需要VPN服务器来提供的最基本的功能。我们可以通过修改/etc/sysctl.conf文件来调整网络设置

1
sudo vim /etc/sysctl.conf

在这个文件里面,找到net.ipv4.ip_forward,去除这一行之前的”#”来解注释这个参数:

1
net.ipv4.ip_forward=1

然后保存退出
为了读取sysctl.conf文件并且让调整后设置对当前系统的session生效,键入如下命令:

1
sudo sysctl -p

第九步 开启vpn服务

1
sudo service openvpn start

查看vpn状态

1
sudo service openvpn status

第十步 链接openvpn

下载openvpn客户端
在openvpn的安装目录中sample-config文件夹下有客户端的模板示例配置文件client.ovpn
需要修改注意的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# Are we connecting to a TCP or
# UDP server? Use the same setting as
# on the server.
;proto tcp
proto udp
# The hostname/IP and port of the server.
# You can have multiple remote entries
# to load balance between the servers.
remote 192.168.0.1 1194 #服务器ip地址及端口
;remote my-server-2 1194
user nobody
group nobody

# SSL/TLS parms.
# See the server config file for more
# description. It's best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
ca ca.crt
cert client1.crt
key client1.key
# Select a cryptographic cipher.
# If the cipher option is used on the server
# then you must also specify it here.
# Note that v2.4 client/server will automatically
# negotiate AES-256-GCM in TLS mode.
# See also the ncp-cipher option in the manpage
cipher AES-256-CBC
auth SHA256

这些地方都需要参考服务器端修改
以下为特例这里必须为1以来配合服务器端:

1
2
3
4
# If a tls-auth key is used on the server
# then every client must also have the key.
tls-auth ta.key 1
key-direction 1

做完配置文件之后以管理员身份运行openvpn-gui.exe,选择导入配置文件,然后使用ftp工具(我使用的是winscp)下载服务器端~/openvpn-ca/keys文件夹下的ca.crt、client1.crt、client1.key、ta.key。右击任务栏中openvpn选择选项可以看到一些常规设置,将下载的文件复制到配置文件文件夹
右击选择链接,正常情况下就可以正常使用了

mysql 索引

mysql索引概念

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

索引的优缺点

优点:加快了查询的速度(select)
缺点:降低了增删改的速度(update/delete/insert),增加了表的文件大小(索引文件甚至可能比数据文件还大)

索引的使用原则

  • 索引条件列(where后面最频繁的条件比较适宜索引)
  • 索引散列值,过于集中的值不要索引

索引类型

  • 普通索引:仅仅是加快了查询速度
  • 唯一索引:行上的值不能重复
  • 主键索引:不能重复
1
2
主键索引和唯一索引的区别:主键必唯一,但是唯一索引不一定是主键;
一张表上只能有一个主键,但是可以有一个或多个唯一索引
  • 全文索引

    1
    2
    3
    在MySQL5.6以下,只有MyISAM表支持全文检索。在MySQL5.6以上Innodb引擎表也提供支持全文检索
    相应字段建立FULLTEXT索引
    MySQL不支持中文全文索引,原因很简单:与英文不同,中文的文字是连着一起写的,中间没有MySQL能找到分词的地方,截至目前MySQL5.6版本是如此,但是有变通的办法,就是将整句的中文分词,并按urlencode、区位码、base64、拼音等进行编码使之以“字母+数字”的方式存储于数据库中。
  • 联合索引
    多列b+tree,使用多列值组合而成的b+tree索引
    遵循最左侧原则,从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a a,b a,b,c 3种组合进行查找,但不支持 b,c进行查找。当使用最左侧字段时,索引就十分有效。

查看某张表上的所有索引

show index from tableName [\G,如果是在cmd窗口,可以换行];

建立索引

1
2
alter table 表名 add index/unique/fulltext [索引名](列名) ;  ---索引名可不写,不写默认使用列名
alter table 表名 add primary key(列名) --不要加索引名,因为主键只有一个

删除索引

1
2
3
4
#删除非主键索引
alter table 表名 drop index 索引名;
#删除主键索引
alter table 表名 drop primary key;

laravel 使用mongodb

mongodb扩展安装

1
2
3
sudo pecl install mongodb
#或者
sudo apt-get install php-mongodb

laravel使用mongodb前准备

1
sudo composer require jenssegers/mongodb

在config/app.php下注册服务
‘providers’中加入

1
Jenssegers\Mongodb\MongodbServiceProvider::class,

‘aliases’ 中加入

1
2
'Moloquent' => Jenssegers\Mongodb\Eloquent\Model::class,
'Mongo' => Jenssegers\Mongodb\MongodbServiceProvider::class,

连接配置

在config/database.php中配置数据库
‘connections’ 中加入

1
2
3
4
5
6
7
8
9
10
11
12
'mongodb' => array(         //MongoDB
'driver' => 'mongodb',
'host' => '1xx.1xx.1xx.1x', //数据库服务器的ip
'port' => 27017, //数据库服务器上mongodb服务对应的端口
'database' => 'task_manager', //数据库名称
'username' => 'user',
'password' => 'xxx',
'options' => array(
'database' => 'task_manager' // 要使用的数据库
)

),

框架使用

在model中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
namespace App;

use Emadadly\LaravelUuid\Uuids;
use Jenssegers\Mongodb\Eloquent\Model;
use Jenssegers\Mongodb\Eloquent\SoftDeletes;


class ExampleModel extends Model
{
//
use Uuids;

/**
* Indicates if the IDs are auto-incrementing.
*
* @var bool
*/
public $incrementing = false;

use SoftDeletes;

protected $connection = 'mongodb';
protected $collection = 'xxx表名'; //表名
protected $primaryKey = 'id'; //设置主键
protected $fillable = [ 'id','title', 'type','xx']; //设置字段白名单


/**
* 需要被转换成日期的属性。
*
* @var array
*/

protected $dates = ['deleted_at'];

}

在controller中使用

1
2
3
4
5
6
7
8
9
#增
$result = ExampleModel::create($data);
#删
$result = ExampleModel::where('id', $id)->delete();
#改
$result = ExampleModel::where('id',$id)->update($data);
#查
$result = ExampleModel::all();
$result = ExampleModel::where('id',$id)->get();

mysql中innodb锁机制

InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁

事务(Transaction)及其ACID属性

事务具有以下4个属性

1
2
3
4
1. 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
2. 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
3. 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
4. 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

并发事务处理带来的问题
相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多的用户。但并发事务处理也会带来一些问题,主要包括以下几种情况。

更新丢失(Lost Update):

当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更
新覆盖了由其他事务所做的更新。例如,两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更改其副本,然后保存更改后的副本,这样就覆盖了原始文 档。最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果在一个编辑人员完成并提交事务之前,另一个编辑人员不能访问同一文件,则可避免此问 题。

脏读(Dirty Reads):

一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加 控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读"。

不可重复读(Non-Repeatable Reads):

一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。

幻读(Phantom Reads):

一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

事务隔离级别

  在上面讲到的并发事务处理带来的问题中,“更新丢失”通常是应该完全避免的。但防止更新丢失,并不能单靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决,因此,防止更新丢失应该是应用的责任。
“脏读”、“不可重复读”和“幻读”,其实都是数据库读一致性问题,必须由数据库提供一定的事务隔离机制来解决。数据库实现事务隔离的方式,基本上可分为以下两种。
  一种是在读取数据前,对其加锁,阻止其他事务对数据进行修改。
另一种是不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致
性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本,因此,这种技术叫做数据多版本并发控制(MultiVersion Concurrency Control,简称MVCC或MCC),也经常称为多版本数据库。
  数据库的事务隔离越严格,并发副作用越 小,但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”是矛盾的。同时,不同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏 感,可能更关心数据并发访问的能力。 为了解决“隔离”与“并发”的矛盾,ISO/ANSI SQL92定义了4个事务隔离级别,每个级别的隔离程度不同,允许出现的副作用也不同,应用可以根据自己的业务逻辑要求,通过选择不同的隔离级别来平衡 “隔离”与“并发”的矛盾。表20-5很好地概括了这4个隔离级别的特性。
表20-5 4种隔离级别比较

读数据一致性及允许的并发副作用 隔离级别 读数据一致性 脏读 不可重复读 幻读
未提交读(Read uncommitted) 最低级别,只能保证不读取物理上损坏的数据
已提交读(Read committed) 语句级
可重复读(Repeatable read) 事务级
可序列化(Serializable) 最高级别,事务级

最后要说明的是:各具体数据库并不一定完全实现了上述4个隔离级别,例如,Oracle只提供Read committed和Serializable两个标准隔离级别,另外还提供自己定义的Read only隔离级别;SQL Server除支持上述ISO/ANSI SQL92定义的4个隔离级别外,还支持一个叫做“快照”的隔离级别,但严格来说它是一个用MVCC实现的Serializable隔离级别。MySQL 支持全部4个隔离级别,但在具体实现时,有一些特点,比如在一些隔离级别下是采用MVCC一致性读,但某些情况下又不是,这些内容在后面的章节中将会做进 一步介绍。

hexo 安装问题

hexo 安装问题

1
$ npm install -g hexo-cli --registry https://registry.npm.taobao.org # 这里使用淘宝镜像也可以全局设置 npm config set registry https://registry.npm.taobao.org

错误提示

1
unable to verify the first certificate(无法验证第一证书)

问题是2014年2月27日npm不再支持自签名证书。
解决方法:
关闭ssl验证:npm config set strict-ssl false