𝓕𝓻𝓪𝓷𝓴.𝓗's blog

精力分配决定层次


  • 首页

  • 分类

  • 归档

  • 标签

  • 关于

  • 小工具

如何养成习惯性自律-潇峰学长的回答-阅读笔记

发表于 2020-07-28   |   分类于 阅读笔记

概述

笔记为阅读知乎问题《如何养成习惯性自律》潇峰学长的回答

阅读全文 »

MySQL开启主从复制

发表于 2018-08-31   |   分类于 DB

必要条件

  • 在主库上要开启 bin log
  • 从库的 server-id 必须和主库不一样
  • 主库创建一个专门的主从复制的用户
  • 从主库获得 binlog 的位置
  • 从库设置同步

创建用户

1
2
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

获取 binlog 位置

1
2
3
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
UNLOCK TABLES;

配置从库

1
2
3
4
5
6
CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_USER='replication_user_name',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
MASTER_LOG_POS=recorded_log_position;

参考文档:

  • Setting Up Binary Log File Position Based Replication
阅读全文 »

PHP7 编译安装 + pthreads 编译

发表于 2018-06-12   |   分类于 日常笔记

编译环境 Ubuntu 18.04 LTS Server 版本,使用 sudo lsb_release -a 查看 编译的 PHP 版本为 7.2.6

Apache 安装

1
sudo apt install apache2 apache2-dev

构建环境

1
sudo apt install build-essential

获取源码

去 PHP 官网 http://php.net/downloads.php 下载源码(可以选择离自己近的镜像),这里选择的是 *.xz 版本,体积更小

1
wget http://hk2.php.net/get/php-7.2.6.tar.xz/from/this/mirror -O "php-7.2.6.tar.xz"

解压:

1
2
xz -d php-7.2.6.tar.xz
tar -xvf php-7.2.6.tar

这个时候可以得到源码的目录 php-7.2.6/

额外的依赖包

1
2
3
4
5
6
7
sudo apt install libxml2-dev \
libcurl4-openssl-dev \
pkg-config \
libssl-dev \
libtidy-dev \
libxslt1-dev \
libreadline-dev

可能不同的机器、启用不同的 PHP 模块需要的依赖是不一样的,可以按照抛出的错误进行安装(也可以 Google 错误再安装),缺啥装啥!

构建

准备编译 PHP,这里需要注意的是,CLI 需要多线程功能 pthreads,而 pthreads 是不支持 CGI 的(见项目说明 https://github.com/krakjoe/pthreads#sapi-support);所以要分开编译, 分别指定不同的 php.ini 路径从而实现 CLI 单独配置 pthreads CGI 不需要

开始踩了坑一起编译,使用统一的配置,导致 Apache 无法启动,查看 Apache 的配置却没有问题,最后看 /var/log/apache2/error.log 才知道是加载 PHP 模块的时候出错了(看文档要仔细!!!)

编译 PHP CGI

configure

编译参数和 CLI 的会有一点点区别,后面会给出相关的解释

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
# CGI 不需要线程安全

./configure --prefix=/opt/php \
--enable-calendar \
--with-curl \
--enable-exif \
--enable-ftp \
--with-gettext \
--enable-mbstring \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-oci8=instantclient,/opt/oracle/instantclient_12_1 \
--with-pdo-oci=instantclient,/opt/oracle/instantclient_12_1,12.1 \
--with-openssl \
--enable-pcntl \
--with-readline \
--enable-shmop \
--enable-sockets \
--with-tidy \
--enable-wddx \
--with-xsl \
--with-xmlrpc \
--enable-zip \
--with-zlib \
--with-config-file-scan-dir=/opt/php/etc \
--with-apxs2=/usr/bin/apxs2 \
--with-config-file-path=/opt/php/cgi \
--disable-cli

如果自己输入模块请检查 ./configure 运行完成之后有没有 Warnings 很有可能会拼写错误或者配置名字已经改变

使用将帮助信息 ./configure --help > youfile.txt 来进行对照查看比较方便

需要注意的是,这里配置了的模块是不需要再在 php.ini 配置的,相当于把这些模块打包进了 PHP 而不是从外部加载,如果强行配置可能会导致警告说在共享模块中找不到该模块

apxs2 这个是 apxs - APache eXtenSion tool (使用 man apxs2 得到)可以通过 whereis apxs2 找到位置

指定 --prefix 在 nix 是一个好习惯,方便卸载(nix 和 Windows 在应用方面架构的差距!)

make

直接执行

1
make

一般来说参数填写对了执行就不会有错误,看到最后出现了 Build Complete 就运行完了

执行 make 的时候需要很长的时间等待使用 htop 查看资源使用情况;发现是单核跑的,经过查询 make 是可以实现多进程运行的,这样时间可以大大减少。

使用 make -j8 (编译的机器 CPU 是 Core-i7 有 8 个逻辑核心所以使用 8 个进程,根据各自情况应该设置合适的数字)

如果是第二次或者多次运行 make 的时候,应该在运行 make 之前运行 make clean;否则可能会出现一些奇奇怪怪的错误

make install

make 执行完成之后,执行

1
sudo make install

一般从输出的信息中我们可以知道安装到了 /opt/php 下

如果没有指定 --prefix ,可以在这里把输出重定向到一个文件,将来要彻底删除的时候有用

配置 php.ini

我们在配置里写了 --with-config-file-path=/opt/php/cgi 所以把源码目录下的 php.ini-development (也可以拷贝生产环境的) 拷贝到 /opt/php/cgi/php.ini

配置 PHP 到 Apache

由于我们配置了 --with-apxs2=/usr/bin/apxs2 Apache 需要的模块已经自动放好了,通过命令可以启用 PHP7 模块

1
sudo a2enmod php7

重启 Apache 这个时候发现,HTML 解析正常 PHP 却输出了源码,这表示 PHP 并没有被正确的解析。这个时候去 /etc/apache2/mods-available/ 看发现只有 php7.load 没有发现 php7.conf (这里是通过对比我的 Ubuntu Desktop 发现的,上面是通过 apt 安装的); 当然经过搜索也有人在 Gist 中说了这个问题 https://gist.github.com/m1st0/1c41b8d0eb42169ce71a, 所以在目录下创建文件 php7.conf

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
sudo vim /etc/apache2/mods-available/php7.conf

# 从 Ubuntu Desktop 的文件复制了如下内容
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
SetHandler application/x-httpd-php-source
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
<Directory /home/*/public_html>
php_admin_flag engine Off
</Directory>
</IfModule>

重新开启一下 PHP 扩展 sudo a2enmod php7 重启 Apache 发现 PHP 已经可以正常解析;到此 PHP CGI 编译完成!

编译 PHP CLI

这里我们需要 pthreads 多线程支持(其实配置和 CGI 几乎可以通用,只要改动一下配置文件的位置参数)

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
# CLI 需要线程安全,要使用 pthreads,并且不需要 Apache 配置

./configure --prefix=/opt/php \
--enable-calendar \
--with-curl \
--enable-exif \
--enable-ftp \
--with-gettext \
--enable-mbstring \
--enable-mysqlnd \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-oci8=instantclient,/opt/oracle/instantclient_12_1 \
--with-pdo-oci=instantclient,/opt/oracle/instantclient_12_1,12.1 \
--with-openssl \
--enable-pcntl \
--with-readline \
--enable-shmop \
--enable-sockets \
--with-tidy \
--enable-wddx \
--with-xsl \
--with-xmlrpc \
--enable-zip \
--with-zlib \
--with-config-file-scan-dir=/opt/php/etc \
--with-config-file-path=/opt/php/cli \
--enable-maintainer-zts \
--disable-cgi
  • 去掉了 Apache 相关的配置 apxs2
  • 禁用 cli 改成了 cgi
  • 配置文件的路径改为 /opt/php/cli

其他的配置均保持一致,后面的步骤和上面一致,直到 sudo make install 完成,PHP CLI 部分也已经编译完成,不要忘了将 php.ini 拷贝一份到 cli 目录。

建立符号链接

使用符号连接我们可以直接在命令行中使用 php

1
sudo ln --symbolic /opt/php/bin/php /usr/bin/php

当然这里也可以把 bin 目录下的其他可执行文件进行设置,看个人需求

到这里基本上 PHP 已经编译好了并可以在命令行中使用了。

编译 pthreads

PHP 的多线程特性不是官方实现的,这个项目在 Github

从页面上找到 master 分支的 zip 下载链接(clone 也可以)

1
2
3
4
5
6
7
8
# 下载
wget https://github.com/krakjoe/pthreads/archive/master.zip -O pthreads-master.zip
# 解压
unzip pthreads-master.zip
# 复制到 ext 目录下
mv pthreads-master ext/pthreads
# 进入 pthreads 的目录
cd ext/pthreads/

接下来运行 phpize 生成 configure

1
/opt/php/bin/phpize

运行 configure

1
./configure --with-php-config=/opt/php/bin/php-config --prefix=/opt/php

运行完成之后和上面一样的运行 make && make install,这个时候应该会生成文件 /opt/php/lib/php/extensions/no-debug-zts-20170718/pthreads.so

加载 pthreads 模块到 PHP,编辑 php.ini

1
2
3
4
sudo vim /opt/php/conf.d/php.ini

# 加入如下的行
extension=pthread

检查 PHP 已经加载的模块,使用 php -m 查看已经加载的模块列表,应该 pthreads 已经出现在列表中了

到此基本上所有的安装都完成了

阅读全文 »

浅谈我国2018年的市场变化

发表于 2017-11-28   |   分类于 By 罗V

目测2018年我国市场上会发生以下翻天覆地的变化:

一、 化妆品市场份额持续增长

化妆品市场份额持续增长。原因为:1.我国消费水平提高;2.化妆品以口红为引爆点在女性中掀起化妆风暴,培养了用户化妆消费习惯;3.化妆的潜在用户群在使用入门级化妆品后向更高端一点的化妆品升级。(第一点第二点的原因有很多类似点,可联系上下文一起看)

二、 中高端消费品市场逐步复苏

中高端消费品市场逐步复苏,并由海淘市场慢慢回归国内市场。原因类似上文第一点,但更重要的一个原因是我国消费品自2017年12月1日起进口关税大幅度降低,由原来的平均17.3%降至7.7%,而化妆品的关税更是降至5%,此政策更是将直接影响国内化妆品销售额的上升(国内外价差缩小,从而吸引海淘、找代购者回流国内市场)。

三、 跨界范围继续扩大

跨界范围继续扩大,且强弱吞并、强强联合将进一步发展。市场将不单单只是阿里和腾讯的角逐,更多有实力的公司或者风投将加入其中。

单拿支付市场来说,11月22日,中国移动、中信银行信用卡中心、网易考拉、丰巣、花间堂、罗森、什么值得买、小猪短租、翼支付等9家企业在杭州宣布共同成立“美好生活联盟”。而另一边,联通也在虎视眈眈,大力推广沃钱包,以及生活缴费、电子券等其他金融服务。同时,电信也没闲着,打着翼支付的名号卷土而来。虽然目前国内支付市场已经形成支付宝和微信支付两分天下的局面,但是通信三巨头手握直达每台智能手机主人的生命线这样一手好牌,后发力,能否分得一块蛋糕也未可知。与此同时,央行牵头成立的线上支付统一清算平台(业内简称“网联”)的方案也在蠢蠢欲动。

再来说说大热的医美、化妆品市场,又有几家能不想分一杯羹?全球最大的连锁便利店7-Eleven带着名为“Simply Me Beauty”的美妆线正式进军美妆领域。此外,以服装闻名的朗姿集团加快推进构建“泛时尚产业互联生态圈”的战略构想,提出了要在“女装、婴童、化妆品、医美”四大板块继续布局。7月15日,全国第一家苏宁易购汽车超市开业。11月26日,农夫泉及其所在的养生堂集团在杭州发布了养生堂天然桦树汁补水系列护肤品,包括含面膜、清爽型、滋润型化妆水,2018年还将推出精华、面霜等产品线。便利店、服装公司、

此外,10月份,苏宁汽车正式入局互联网造车领域。近日,苏宁易购汽车公司成立,其中野心可见一斑。再看打车领域滴滴独大,共享单车领域摩拜和OFO基本形成两分天下局面,阿里买下大润发36.16%股份……强强联合、强弱合并的案例随处可见,未来大公司的根将会越扎越深。

阅读全文 »

第2章 - 算法分析

发表于 2017-09-16   |   分类于 《数据结构与算法分析》笔记

算法(algorithm) 是为求解一个问题需要遵循、被清楚地指定的简单指令集合。对于一个问题,一旦给定某种算法并且(以某种方式)确定其是正确的, 那么重要的一步就是就是确定该算法将需要多少时间或空间等资源量的问题。如果一个问题的求解算法需要长达一年时间,那么这种算法就很难有什么用处。同样,一个需要 1GB 内存的算法在当前的大多数机器上面也是没法使用的。

在这一章中将讨论:

  • 如何估计一个程序所需要的时间。
  • 如何将一个程序的运行时间从天或年降低到秒
  • 粗心使用递归的后果
  • 将一个数自乘得到其幂以及计算两个数的最大公因数的非常有效的算法。
阅读全文 »

PHP json_decode 遇到的坑

发表于 2017-08-03   |   分类于 PHP

场景:某项目客户反馈,输出的结果 JSON 中有个要求为对象的数据字段,在某些情况下返回的是 [] 而不是 {};数据由公司其他部门提供,查看原始数据的时候,没有发现任何问题;后来因为要加入某些预处理,在获取到其他部门的 JSON 数据之后进行解码并对某个字段进行处理;然而,在处理完之后再次使用 JSON 输出,发现结果已经不是我们想要的了。

原始数据

1
2
3
4
5
6
{
...,
"foo": "",
"bar": {},
...
}

其中 foo 是我要进行处理的字段,处理完成之后再次使用 json_encode($data) 进行 JSON 编码。

编码完成之后的结果却是这样的

1
2
3
4
5
6
{
...,
"foo": "",
"bar": [],
...
}

空对象编程了空数组,而且我并没有处理过字段 bar

通过对模拟数据的实测,发现是因为在对 JSON 进行解码的时候,是这么解的

1
$data = json_decode($jsonString, true)

问题就出在这里,由于 PHP 自身的特性,在 PHP 中 array 是可以代表强类型语言,如 Java 中的 List 和 Map 的。

来看 PHP 中 json_decode() 方法是如何定义的

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

来源 http://php.net/manual/zh/function.json-decode.php

当第二个参数 $assoc 为 true 时,返回的类型是 array,所以问题就来了,当 JSON 中空对象 {} 和 [] 空数组,使用这种方式解码出来的结果表现是一致的;即 array();当再次 json_encode() 编码的时候就出现了 {} 变 [] 了。

所以正确的做法是在解码 JSON 的时候 json_decode 不要传递第二个参数;让解码结果是一个对象,然后操作对象的属性,操作完成之后再次编码就不会出现偏差。

这种问题最突出在于强类型语言和弱类型语言的 API 对接上,由于项目的下家是使用 Java 语言,所以导致了 BUG

阅读全文 »

nvm-npm加速

发表于 2017-03-26   |   分类于 JavaScript

NVM 加速

安装 Node.js 一般都是用 nvm

但是安装之后使用体验就不咋地了,由于某些不可变原因,国内网络就不好吐槽了;就连执行一下 nvm ls-remote 都要很久。

当然“道”高一尺“魔”高一丈,聪明的国人肯定也想出了对应的解决方案,就是建立了各种各样的镜像;比如淘宝源 淘宝 NPM 镜像

所以加速 nvm 的方法就是使用 NPM 淘宝的 node.js 镜像。

临时方案:

在运行 nvm 命令之前执行设置一个变量的命令

1
NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node

再执行 nvm 命令,那么速度就非常快了;这种方案就是每次使用你都要手工执行设置变量的命令,所以也就有了永久的方案。

永久方案:

其实很简单,就是在 .bashrc 中加入上面的设置变量的命令,这样就可以保证每次一开机,系统就自动执行了这个命令了。

NPM 加速

如果在安装完 node 之后,使用 npm install 速度也是非常感人的;所以同样的我们也需要使用镜像来加速依赖的安装。

设置也比较简单,只需要设置 npm 的全局配置即可

1
2
3
4
5
6
# 查看默认的 registry 地址
npm config -g get registry
https://registry.npmjs.org/

# 设置 npm 淘宝镜像
npm config -g set registry https://registry.npm.taobao.org

这样设置之后安装就非常快了

阅读全文 »

ES6学习笔记

发表于 2016-12-13   |   分类于 日常笔记

ES6(ECMAScript 6.0)已经使用了很久了,但是有很多的东西还是没有学会;学东西不应该浅尝而止,应该系统的学习;记录一些自己的理解。

笔记主要是依据阮一峰老师的教程ECMAScript 6入门学习所得

阅读全文 »

Ubuntu 常用命令记录

发表于 2016-11-22   |   分类于 日常笔记

Linux有太多的命令,很多经常用却没有记住;这里统一收集一下平常用到的一些命令

阅读全文 »

《TCP/IP详解》第一章 概述

发表于 2016-08-22   |   分类于 《TCP/IP详解》笔记

引言

很多不同的厂家生产各种型号的计算机,它们运行完全不同的操作系统,但TCP/IP协议族允许它们通信。它是一个真正开放的系统,因为协议族的定义及其多种实现 可以不用花钱或花很少的钱就可以公开的得到。它被称作“全球互联网”或“因特网(Internet)”的基础,该广域网(WAN)已包含遍布世界的计算机。

本章主要对TCP/IP协议族进行概述,其目的是为本书的其余章节提供充分的背景知识。

阅读全文 »
123
𝓕𝓻𝓪𝓷𝓴.𝓗

𝓕𝓻𝓪𝓷𝓴.𝓗

自我救赎中...

21 日志
12 分类
32 标签
RSS
© 2020 𝓕𝓻𝓪𝓷𝓴.𝓗