Write the Code. Change the World.

4月 05

在CentOS8下编译安装MySQL8可能会出现Could not find rpcgen错误,而CentOS8默认的yum源下不提供rpcgen的安装包。所以需要到rpcgen的GitHub仓库上找,地址如下:

https://github.com/thkukuk/rpcsvc-proto/releases

参考:
http://www.linuxfromscratch.org/blfs/view/svn/basicnet/rpcsvc-proto.html

下载安装

wget https://github.com/thkukuk/rpcsvc-proto/archive/v1.4.1.tar.gz

tar -xzvf v1.4.1.tar.gz

./configure --sysconfdir=/etc

阅读全文 >>

4月 05

官网: https://dev.mysql.com/

先下载:
当前最新版本 8.0.19

cd /usr/local/src/

mkdir mysql

cd mysql

wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.19.tar.gz

tar -xzvf mysql-boost-8.0.19.tar.gz

创建用户组以及相关目录

groupadd mysql  #创建mysql用户组
useradd -s /sbin/nologin -g mysql -M mysql   #创建mysql用户归属mysql组
mkdir /alidata/service/mysql/mysql   #创建安装目录
mkdir -p /alidata/service/mysql/data   #创建数据库存放目录
chown -R mysql:mysql  /alidata/service/mysql/data   #给予权限
mkdir /alidata/service/mysql/log
touch /alidata/service/mysql/log/mysql-error.log
touch /alidata/service/mysql/log/mysql-slow.log
chmod 777 /alidata/service/mysql/log -R

开始编译安装

cd mysql-8-0-19

cmake ../ -DCMAKE_INSTALL_PREFIX=/alidata/service/mysql/mysql -DMYSQL_DATADIR=/alidata/service/mysql/data -DWITH_BOOST=boost -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/src/mysql/mysql-8.0.19/ -DSYSCONFDIR=/etc -DFORCE_INSOURCE_BUILD=1 -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DENABLED_LOCAL_INFILE=ON -DWITH_INNODB_MEMCACHED=ON -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1

发现报错: Please do not build in-source. Out-of source builds are highly

这个时候这样处理

mkdir build

cd build

再 cmake  .. 后边各种参数

继续报错:

报 Could NOT find Curses 这个。缺少 ncurses-devel , 装个就可以了。

yum install ncurses-devel

然后,再重新 camke,再报错,报 Package 'libtirpc', required by 'virtual:world', not found

继续安装

yum install libtirpc-devel

继续报错 Could not find rpcgen。 在CentOS8下编译安装MySQL8可能会出现Could not find rpcgen错误,而CentOS8默认的yum源下不提供rpcgen的安装包。所以需要到rpcgen的GitHub仓库上找,

https://blog.vini123.com/381

继续报错 Could NOT find BISON

yum install bison

继续报错 Could NOT find Doxygen,然后编译安装 doxygen

git clone https://github.com/doxygen/doxygen.git

cd doxygen

cmake .. -G "Unix Makefiles"

make -j2
sudo make install

然后继续报错Could NOT find FLEX

yum install flex
安装好 doxygen 后,继续编译 mysql。

make -j2

make install

初始化数据库

cd /alidata/service/mysql/mysql

./mysqld --initialize-insecure --user=mysql --basedir=/alidata/service/mysql/mysql --datadir=/alidata/service/mysql/data

设置mysqld

cd /usr/local/src/mysql/superfiles

cp mysql.server.sh /etc/init.d/mysqld

vim /etc/init.d/mysqld

# 修改 dir 配置保存
basedir=/alidata/service/mysql/mysql
datadir=/alidata/service/mysql/data

chmod +x /etc/init.d/mysqld

chkconfig --add mysqld   #添加到系统服务
chkconfig mysqld on   #设置开机自启动   

更改环境变量

vim /etc/profile

PATH=$PATH:/alidata/service/mysql/mysql/bin   

export PATH

source /etc/profile

设置 my.cnf

vim /etc/my.cnf

# 内容如下
[client]
port=3306
#user=root
#password=123
[mysqld]
# sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
# sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
server-id=1
#skip-grant-tables
port=3306
user=mysql
max_connections=400
basedir=/alidata/service/mysql/mysql
datadir=/alidata/service/mysql/data
socket=/alidata/service/mysql/data/mysql.sock
pid-file=/alidata/service/mysql/data/mysql.pid
init-connect='SET NAMES utf8mb4'
character-set-server=utf8mb4 
default-storage-engine=INNODB
log_error=/alidata/service/mysql/log/mysql-error.log
slow_query_log_file=/alidata/service/mysql/log/mysql-slow.log
[mysqldump]
quick
max_allowed_packet=128M
EOF

授权,设置用户组

chown -R mysql.mysql /alidata/service/mysql/mysql
chown -R mysql.mysql /alidata/service/mysql/data

chmod -R 755 /alidata/service/mysql/mysql
chmod -R 755 /alidata/service/mysql/data

启动 mysql

/etc/init.d/mysqld start

执行安全初始化脚本

# 执行,然后回车
mysql_secure_installation 

Securing the MySQL server deployment.

Connecting to MySQL using a blank password.
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Please set the password for root here.  # 设置root用户密码

如果报错 `Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`
可以执行: ln -s /alidata/service/mysql/data/mysql.sock /tmp/mysql.sock

New password:

Re-enter new password:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

 #是否删除匿名用户,生产环境建议删除
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

#是否禁止root远程登录,根据自己的需求选择Y/n并回车,建议禁止
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

#是否删除test数据库

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

#是否重新加载权限表,直接回车
Reload privilege tables now? (Press y|Y for Yes, any other key for No) :

 ... skipping.
All done!

到此,设置了 root 用户密码,以及禁用远程登录 root 用户,也删除了匿名用户。那么需要创建一个新用户来使用mysql了。

请看这里: https://blog.vini123.com/382

远程连接 mysql

创建新用户,然后远程连接。

create user shenqi@'%' identified by '33441314';  

# 创建 shenqi 用户,并设置密码。但这样远程连接会报错。
caching_sha2_password' cannot be loaded: dlopen(/usr/local/lib/plugin/caching_sha2_password.so, 

# 使用 mysql_native_password 方式设置密码就好了。
ALTER USER 'shenqi'@'%' IDENTIFIED WITH mysql_native_password BY '33441314';

请看这里: https://www.iteye.com/blog/binary-space-2412769

参考

https://www.cnblogs.com/zyxnhr/p/11892702.html

阅读全文 >>

4月 05

安装

github 地址:

https://github.com/kkos/oniguruma/

过程:

点击 tags,找到最新版本,寻找下载

cd /usr/local/src/php/

wget https://github.com/kkos/oniguruma/archive/v6.9.5_rc1.zip

unzip v6.9.5_rc1.zip

./autogen.sh && ./configure --prefix=/usr

# 错误
./autogen.sh: line 6: autoreconf: command not found

# 解决错误,
yum install autoconf automake libtool

make && make install

参考:

https://www.cnblogs.com/architectforest/p/12433640.html
24kplus.com/linux/1614.html

阅读全文 >>

4月 05

参考版本

https://blog.vini123.com/303

https://www.24kplus.com/linux/400.html

却的依赖,然后安装:

yum install sqlite-devel

# centos8 安装 oniguruma ,yum 不行。
yum install oniguruma

yum 不行,就编译安装个哈。看这里
https://blog.vini123.com/379

configure 后会出警告如下:

php 7.4 --enable-gd 代替 --with-gd

configure: WARNING: unrecognized options: --with-freetype-dir,  --with-libxml-dir, --with-pcre-regex, --with-png-dir, --with-jpeg-dir, --enable-libxml, --enable-zip, --enable-gd

不管它,安装吧。
最后:

Wrote PEAR system config file at: /alidata/service/php/etc/pear.conf
You may want to add: /alidata/service/php/lib/php to your php.ini include_path
/usr/local/src/php/php-7.4.4/build/shtool install -c ext/phar/phar.phar /alidata/service/php/bin
ln -s -f phar.phar /alidata/service/php/bin/phar
Installing PDO headers:           /alidata/service/php/include/php/ext/pdo/

如果之前没安装 gd库,则需要安装

https://www.php.net/manual/zh/image.installation.php



安装 gd jpeg:

cd /usr/local/src/php

wget http://www.ijg.org/files/jpegsrc.v9c.tar.gz

tar -xzvf jpegsrc.v9c.tar.gz

# 我们安装到 /usr/local/lib/jpeg 目录
./configure --prefix=/usr/local/lib/jpeg --enable-shared --enable-static 

make && make install

再 安装 freetype2

git clone https://github.com/aseprite/freetype2.git

cd freetype2

../autogen.sh

./configure --prefix=/usr/local/lib/freetype

make && make install 

# 查看之前的,然后接上现在的,继续编译安装,然后重启
php -i |grep configure 

./configure  …  --with-jpeg-dir=/usr/local/lib/jpeg --with-freetype-dir=/usr/local/lib/freetype

然后,最终的 configure。

./configure --prefix=/alidata/service/php --with-config-file-path=/alidata/service/php/etc --with-config-file-scan-dir=/alidata/service/php/etc/php.d --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-mysqli --with-openssl --with-external-pcre --with-pdo-mysql --with-pdo-sqlite --with-pear   --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-bcmath --with-libxml --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --with-zip --enable-fpm --enable-gd --with-jpeg=/usr/local/lib/jpeg --with-freetype=/usr/local/lib/freetype

发现有报错,libzip 木有。那就安装吧。

libzip 下载

wget https://libzip.org/download/libzip-1.7.3.tar.gz

tar -xzvf libzip-1.7.3.tar.gz

cd libzip-1.7.3

mkdir build

cd build

cmake ..

make && make install

whereis libzip 

出现结果,ok

# 进入到 php 文件目录
cd php

export PKG_CONFIG_PATH="/usr/local/lib64/pkgconfig/"

#上面命令的作用就是告诉configure程序,去/usr/local/lib64 目录下找库文件,这样他就能找到libzip.so
此时,你继续./configure将会很顺利的看到 

再进行 configure 出现 thanks 时才表示各种都准备好了。如果没有,还得继续处理问题。 然后 make && make install

参考

https://segmentfault.com/q/1010000022601109

https://www.php.net/manual/zh/migration74.other-changes.php#migration74.other-changes.pkg-config

阅读全文 >>

4月 05

编译安装 gcc gcc-c++

官网: https://gcc.gnu.org/

安装文档:
https://gcc.gnu.org/install/

安装包镜像:
https://gcc.gnu.org/mirrors.html

https://bigsearcher.com/mirrors/gcc/releases/

发现 yum 源上的是 8.3版本,而 9.3版本已经在2020年3月12日发布了。

cd /usr/local/src/

mkdir gcc

cd gcc

wget https://bigsearcher.com/mirrors/gcc/releases/gcc-9.3.0/gcc-9.3.0.tar.gz

tar -xzvf gcc-9.3.0.tar.gz

# 哎呀 ,不熟悉。还是 yum 安装吧。强迫症郁闷。

阅读全文 >>

4月 05

先更新yum并安装依赖

尽可能的安装最新版本。如果 yum 安装的不是最新版本,可以先卸载掉,再下载源码编译安装。yum 安装新包之前,可以先查看下该包是否是最新版本。编译安装后,可以 ls -l 建立软链接,下次有新包,可以再覆盖安装。

# 更新 yum 包
yum update

# 查看某个安装,比如 gcc。 它会显示是否存在该安装,该安装的版本,是否已经安装等信息。

yum list gcc

需要安装:

  1. gcc gcc-c++。它可以编译 C,C++,Ada,Object C和Java等语言。

  2. pcre pcre-devel。PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括 perl 兼容的正则表达式库。nginx 的 http 模块使用 pcre 来解析正则表达式,所以需要在 linux 上安装 pcre 库,pcre-devel 是使用 pcre 开发的一个二次开发库。

  3. nginx 使用 zlib 对 http 包的内容进行 gzip。可是,不是用 Brotli 么。两个都装,装了也没事。gzip 编译安装来个。如果不编译,使用 yum 安装,版本达不到要求。

  4. bzip2 是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。

开始安装

yum install gcc gcc-c++

yum install pcre pcre-devel

yum install zlib zlib-devel

yum install bzip2

安装 openssl

https://blog.vini123.com/301

安装 cmake

https://blog.vini123.com/289

已经安装到了 usr/local/bin 下了,不需要软链了

安装 ngx_brotli

参考从前:https://blog.vini123.com/298

阅读全文 >>

2月 09

typescript 是 js 的超集。用了 ant design pro,用了 ts。那先看最首要解决的问题。注册,模板相关的问题。

点点滴滴

阅读全文 >>

1月 31

开始安装 ant design pro

流程参考

https://blog.vini123.com/359

关于路由这块,需要再说明一下。路由有 laravel 的路由,还有 ant design pro 的路由,以及 nginx 的 location 的。

既然后台访问的域名为 xxx/admin/ , 而接口也是 xxx/admin/,这个时候就需要针对该情况的 nginx 的配置。根据 nginx 的 location 的优先级以及正则等原则,可以配置nginx的匹配规则如下:

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

# 后台接口统一加了 api
    location ^~ /admin/api/ {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location /admin/  {
        index index.html index.htm;
        try_files $uri $uri/ /admin/index.html;
    }

# 编辑重启
sudo vim /etc/nginx/sites-available/admin.com
sudo nginx -s reload

ant design pro 相关

话说,要用就用最新的 V4(pro v4 以及 ant design v4),要用就用 TypeScript 。话说,还是得从零开始学一下 TypeScript。 那么之前做的部分工作,可以先暂停。

https://zhuanlan.zhihu.com/antdesign

https://www.zhihu.com/topic/20178853/hot

https://zhuanlan.zhihu.com/p/67498559

那么,我们把之前的 js 版本的 ant design pro 干掉。然后重启一个分支来做 typescript 版本的 ant design pro

# 先看看哪个提交时初始化创建 ant design pro
git log -n 6 --oneline

# 找到对应的 hash,回滚回去
git reset --hard xxxx

# 强提交
git push --force

# 开始新建分支
git checkout -b antdesign

# 所有的 ant design pro 相关的全在这个分支上干

npm create umi

# 选择 ant design pro, 选择 typescript ,y

npm install

# 再继续

git add .
git commit -m 'ant design pro v4 initialize'
git push --set-upstream origin antdesign

当使用 define 的方式定义全局常亮,typescript 再非定义位置报错问题处理。 需要在 typings.d.ts 中配置。
参考: https://pro.ant.design/docs/environment-variables-cn#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E4%BB%A3%E7%A0%81%E4%B8%AD%E6%8A%A5%E9%94%99%E7%9A%84%E5%A4%84%E7%90%86%E6%96%B9%E5%BC%8F

ant design pro

一边学,一边使用 ant design pro。看到不明白的就开始查查查。

第一个 useState
useState(0) 是最新的 hooks api

https://segmentfault.com/a/1190000018781083?utm_source=tag-newest

阅读全文 >>

1月 31

web 页面,以及后台接口,权限基础架构已经完成。现在再多增点东西。比如发短信,比如模型事件。

先看模型事件,用模型事件一方面是减少耦合,另一方面如果模型多出 Create ,并在 Created 后要做一系列逻辑。这个时候用模型事件就比较好。否则有重复代码,或你用 trait 去处理。反正就是模型事件好。

模型事件文档

# 我们先给 User 用户创建一个观察者
php artisan make:observer UserObserver --model=Models/User

# 创建成功后,删除掉其他的事件,只保留 created 
# 在你希望观察的模型上使用 observe 方法注册观察者。也可以在服务提供者的 boot 方法注册观察者。这里在 AppServiceProvider 中注册观察者。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Models\User;
use App\Observers\UserObserver;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

# 这样,当 User created 的时候,就会调用到事件侦听

再来处理短信相关的。

短信提供商有很多,我们选择用阿里云的。因为短信价格都差不多,服务器,域名都在阿里下。所以短信也选择阿里的。这里使用 overtrue 的 easy-sms 来做。

composer require overtrue/easy-sms

vim config/easysms.php

<?php

return [
    // HTTP 请求的超时时间(秒)
    'timeout' => 10.0,

    // 默认发送配置
    'default' => [
        // 网关调用策略,默认:顺序调用
        'strategy' => \Overtrue\EasySms\Strategies\OrderStrategy::class,

        // 默认可用的发送网关
        'gateways' => [
            'aliyun',
        ],
    ],
    // 可用的网关配置
    'gateways' => [
        'errorlog' => [
            'file' => storage_path('logs/easy-sms/easy-sms.log'),
        ],
        'aliyun' => [
            'access_key_id' => env('SMS_ALIYUN_ACCESS_KEY_ID'),
            'access_key_secret' => env('SMS_ALIYUN_ACCESS_KEY_SECRET'),
            'sign_name' => '约拍宝',
            'templates' => [
                'register' => env('SMS_ALIYUN_TEMPLATE_REGISTER'),
            ]
        ],
    ],
];

# 再来创建 serverprovider

php artisan make:provider EasySmsServiceProvider

<?php

namespace App\Providers;

use Overtrue\EasySms\EasySms;
use Illuminate\Support\ServiceProvider;

class EasySmsServiceProvider extends ServiceProvider
{
    public function boot()
    {

    }

    public function register()
    {
        $this->app->singleton(EasySms::class, function ($app) {
            return new EasySms(config('easysms'));
        });

        $this->app->alias(EasySms::class, 'easysms');
    }
}

# 在 config/app.php 中加入 
App\Providers\EasySmsServiceProvider::class,

# 最后,env 中配置好对应的值即可

使用

use Overtrue\EasySms\EasySms;

public function send(EasySms $easySms)
    {
        $phone = 13888888888;
            // 生成4位随机数,左侧补0
        $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);

        try {
            $result = $easySms->send($phone, [
                'template' => config('easysms.gateways.aliyun.templates.register'),
                'data' => [
                    'code' => $code
                ],
            ]);
        } catch (\Overtrue\EasySms\Exceptions\NoGatewayAvailableException $exception) {
            $message = $exception->getException('aliyun')->getMessage();
            abort(500, $message ?: '短信发送异常');
        }
    }

先到这里,真实场景再使用。下一步就是开始后台了。这里使用阿里的 ant design pro。

顺便再说一下。env 中加入的配置,我们先要在 env example
中先加一份。 .env 是不加入版本控制的。掉了就没了。 .env.example 是加入了版本控制,但敏感数据空着就好,空留key即可。

阅读全文 >>