学而不思则罔,思而不学则怠

0%

Ubuntu 20.04 虚拟机下载手动部署 YApi 服务。

  • 适用 Yapi v1.10.x 版本

环境要求

安装 nodejs

系统默认 nodejs 版本为 10.x ,直接安装可能失败,需要升级至 12.x 版本。

1
2
3
4
5
6
7
8
# 导入秘钥,注册源,更新
curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash -

# 安装
sudo apt install -y nodejs

# 替换 npm 源
npm config set registry https://registry.npmmirror.com

安装 mongodb

1
2
3
4
5
6
7
8
# 导入秘钥
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

# 注册源
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

# 更新并安装
sudo apt-get update && sudo apt-get install -y mongodb-org

如果以上操作不成功,请求参考官方 安装过程

安装完成后将 mongodb 设置为系统服务,开机启动:

1
sudo systemctl enable mongod

安装部署

检查环境:

1
2
node -v # v12.22.8
npm -v # 6.14.15

使用官方推荐的可视化部署方式:

1
2
3
4
5
# 全局安装 YApi 命令行工具
sudo npm install -g yapi-cli

# 启动可视化安装界面
sudo yapi server # 在浏览器打开 http://0.0.0.0:9090 访问。非本地服务器,请将 0.0.0.0 替换成指定的域名或ip

根据提示在浏览器中打开安装页面,输入相关信息,点击 开始部署

安装完成后注意结尾提示,注意保存管理员账号和密码:

1
2
初始化管理员账号成功,账号名:"admin@admin.com",密码:"ymfe.org"
部署成功,请切换到部署目录,输入: "node vendors/server/app.js" 指令启动服务器, 然后在浏览器打开 http://127.0.0.1:3000 访问

服务管理

使用 pm2 管理应用进程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装 pm2
sudo npm install pm2 -g

# pm2 管理 yapi 服务,请求注意修改 Yapi 安装目录
sudo pm2 start "/<dir>/yapi/vendors/server/app.js" --name yapi

# 查看服务信息
sudo pm2 info yapi

# 停止服务
sudo pm2 stop yapi

# 重启服务
sudo pm2 restart yapi

将 pm2 设置为系统服务,开机启动 YApi:

1
2
3
4
5
# 设置 pm2 为系统服务
sudo pm2 upstart

# 保存已启动的应用
sudo pm2 save

更多请参考 pm2 官方文档

Flexbox 是 flexible box 的简称(注:意思是“灵活的盒子容器”),是 CSS3 引入的新的布局模式。它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来。

它之所以被称为 Flexbox ,是因为它能够扩展和收缩 flex 容器内的元素,以最大限度地填充可用空间。与以前布局方式(如 table 布局和浮动元素内嵌块元素)相比,Flexbox 是一个更强大的方式:

  • 在不同方向排列元素。
  • 重新排列元素的显示顺序。
  • 更改元素的对齐方式。
  • 动态地将元素装入容器。

1、基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称”容器”。它的所有子元素自动成为容器成员,称为 Flex 项目(flex item),简称”项目”。

在 Flexbox 模型中,有三个核心概念:

  • flex 项(注:也称 flex 子元素),需要布局的元素。
  • flex 容器,其包含 flex 项。
  • 排列方向(direction),这决定了 flex 项的布局方向。

2、容器属性

2.1 flex-direction:

  • row(默认值):主轴为水平方向,起点在左端。
  • row-reverse:主轴为水平方向,起点在右端。
  • column:主轴为垂直方向,起点在上沿。
  • column-reverse:主轴为垂直方向,起点在下沿。

2.2 flex-wrap:

  • nowrap(默认):不换行。
  • wrap:换行,第一行在上方。
  • wrap-reverse:换行,第一行在下方。

2.3 justify-content:

  • flex-start(默认值):左对齐。
  • flex-end:右对齐。
  • center: 居中。
  • space-between:两端对齐,项目之间的间隔都相等。
  • space-around:每个项目两侧的间隔相等,项目之间的间隔比项目与边框的间隔大一倍。

2.4 align-items:

  • flex-start:交叉轴的起点对齐。
  • flex-end:交叉轴的终点对齐。
  • center:交叉轴的中点对齐。
  • baseline: 项目的第一行文字的基线对齐。
  • stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

2.5 align-content:

定义了多根轴线的对齐方式,如果项目只有一根轴线,那么该属性将不起作用

  • flex-start:与交叉轴的起点对齐。
  • flex-end:与交叉轴的终点对齐。
  • center:与交叉轴的中点对齐。
  • space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
  • space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
  • stretch(默认值):轴线占满整个交叉轴。

结合 justify-content和align-items,看看在 flex-direction 两个不同属性值的作用下,轴心有什么不同:

3、项目属性

3.1 order属性

3.2 flex-grow属性

flex-grow 属性定义项目的放大比例,默认为 0,即如果存在剩余空间,也不放大。

如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间(如果有的话)。如果一个项目的 flex-grow 属性为 2,其他项目都为 1,则前者占据的剩余空间将比其他项多一倍。

3.3 flex-shrink属性

flex-shrink 属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

1
2
3
.item {
flex-shrink: <number>; /* default 1 */
}

如果所有项目的 flex-shrink 属性都为 1,当空间不足时,都将等比例缩小。如果一个项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小。

负值对该属性无效。

3.4 align-self属性

align-self 属性允许单个项目有与其他项目不一样的对齐方式,可覆盖 align-items 属性。默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,则等同于 stretch

1
2
3
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}

弹性布局默认不改变项目的宽度,但是它默认改变项目的高度。如果项目没有显式指定高度,就将占据容器的所有高度。

参考:
阮一峰的网络日志
Flex 布局教程:语法篇
Flexbox 布局的最简单表单

windows 下面安装 node-sass,确实令人头痛,正确姿势如下:

修改 NPM 镜像

查看当前设置:

1
2
3
4
# npm 命令
npm config get registry
# yarn 命令
yarn config get registry

修改为淘宝镜像:

1
2
3
4
5
6
# npm 命令
# npm config set registry http://registry.npm.taobao.org/
npm config set registry https://registry.npmmirror.com
# yarn 命令
# yarn config set registry http://registry.npm.taobao.org/
yarn config set registry https://registry.npmmirror.com

安装 windows 平台编译环境

需要在管理员权限下安装:

1
2
3
4
5
6
npm install -g node-gyp

# 安装 python 和 vs-build
# 此过程可能长时间没有反映,可从控制面板中检查是否安装成功
# 安装完成后要重新打开命令行窗口
npm install -g --production windows-build-tools

安装 node-sass

安装时可以指定 node-sass 镜像地址:

1
2
# npm i node-sass --sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
npm i node-sass --sass_binary_site=https://npmmirror.com/mirrors/node-sass/

成功!

换行符在不同的操作系统上的表示

首先要理解的一点是,对于不同的操作系统,对于换行符的表示是不一样的。也就是说当我们在编辑一个文件,在键盘上按下回车键的时候,对于不同的操作系统保存到文件中的换行符是不一样的。见下表:

1
2
3
4
5
6
7
8
9
CR: 表示回车\r
LF: 表示换行\n
CRLF: 表示回车换行\r\n

敲下回车键,不同的操作系统保存到文件中的值:
Windows:使用的是 CRLF ==> 即 \r\n,文件中保存的是 \r\n
Linux/Unix: 使用的是 LF ==> 即 \n,文件中保存的是 \n
MacOS: 使用的是 CR ==> 即 \r,文件中保存的是 \r
MacOS X系统:使用的是 LF ==> 即 \n,文件中保存的是 \n(MacOS X 已经改成和 Unix/Linx 一样使用 LF)

问题: 既然不同的操作系统,对于换行符使用不同的表示形式,如果一个团队在开发一个共同的项目,如果你使用的是 windows 系统,而你的小伙伴用的是 Mac 的话,当你们使用 git 协同开发软件时,就会出现换行符不统一的问题。

虽然对于不同的操作系统,默认的换行符的表示方法不一样,但是编辑器是可以设置在敲下回车键的时候保存的换行符是什么的,比如常用的 vscode 就可以进行设置。直接点击编辑器右下角的 LF 或者 CRLF,出现如下图所示的设置,直接选择即可。在设置完成之后,在敲回车键,保存在文件中的换行符就是你设置的(CRLF 或者是 LF,设置什么就是什么)。

vbox-guest-additions-01

Git 会自动对换行符进行转换

Git 为了解决上面提出的问题,会自动对换行符进行转换。转换的方案有 3 种:

  1. 在提交时将 CRLF 转换为 LF,在拉取(检出 checkout)时将 UNIX 换行符(LF)替换成 CRLF。(Windows 系统推荐使用,我们在 windows 上安装 git 的时候,如果一路 next,默认是使用这个方案)。

  2. 在提交时将 CRLF 转换为 LF,在拉取(检出 checkout)时不进行转换。(Linux/Unix 和 MacOS 和 MacOS X 推荐使用,在 Unix 或者类 Unix 操作系统上安装 git,默认使用这种方案)。

  3. 不进行转换(这种方案对于跨平台项目不推荐使用)。

可以发现,如果不使用第3种方案,那么在 Git 仓库(包括本地仓库和 GitHub 远程仓库)中保存的文件的换行符都是 LF 表示的。

自己指定换行符转换方案

我们自己在开发过程中,是可以修改/设置 Git 的换行符转换方案的。修改/设置的方法有 2 种。

通过 Git 的全局配置进行修改

设置 autocrlf 属性,在控制台直接运行如下的一条命令就可以设置了:

1
2
3
4
5
6
7
8
// 提交时转换为 LF,检出时转换为 CRLF
git config --global core.autocrlf true

// 提交时转换为LF,检出时不转换
git config --global core.autocrlf input

// 提交检出均不转换
git config --global core.autocrlf false

上述命令运行之后,会修改 .gitconfig 文件。

一般在项目中,为了避免项目中同时出现 CRLF 和 LF,还可以开启 safecrlf 检查。当然,如果你的项目自己定义了语法检查规则,例如使用 eslint 去约束换行符必须是 LF,那么当你的文件中出现 CRLF 的时候,eslint 会给你错误提示信息,告诉你不能包含 CRLF,这时候,不开启 safecrlf 也是可以的 (一般建议开启)。

开启方法如下第一条命令:

1
2
3
4
5
6
7
8
// 拒绝提交包含混合换行符的文件 (一般设置为 true)
git config --global core.safecrlf true

// 允许提交包含混合换行符的文件
git config --global core.safecrlf false

// 提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

上述命令运行之后,也会修改.gitconfig 文件。

注册 NPM 账号

点击 注册账号,并完成邮箱验证。

初始化 NPM 项目

1
2
3
4
5
6
# 创建项目目录
mkdir <project>
# 进入项目目录
cd <project>
# 初始化项目
npm init

执行上述命令,根据提示输入相关信息,完成后目录下会生成 package.json 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"name": "demo",
"version": "1.0.0",
"description": "A demo projcet of npm.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"npm"
],
"author": "hao",
"license": "ISC"
}
  • name:项目名称
  • version: 版本号
  • description: 项目描述
  • main:包入口文件,默认为 index.js
  • repository:代码存放地址(一般是 git 地址)
  • keywords:项目关键字,便于搜索
  • author:作者
  • license:授权协议

详情请参考:package.json

添加用户

如果你使用的是 taobao 源,要先切换到官方源:

1
2
3
4
# npm 官方源
npm config set registry=http://registry.npmjs.org
# taobao 源
npm config set registry=http://registry.npm.taobao.org/

添加用户,根据提示输入账号信息:

1
npm adduer

发布 NPM 包

登陆,根据提示输入用户名和密码:

1
npm login

发布:

1
npm publish

graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-->D;
sequenceDiagram
    participant Alice
    participant Bob
    Alice->>John: Hello John, how are you?
    loop Healthcheck
        John->>John: Fight against hypochondria
    end
    Note right of John: Rational thoughts 
prevail... John-->>Alice: Great! John->>Bob: How about you? Bob-->>John: Jolly good!
gantt
dateFormat  YYYY-MM-DD
title Adding GANTT diagram to mermaid

section A section
Completed task            :done,    des1, 2014-01-06,2014-01-08
Active task               :active,  des2, 2014-01-09, 3d
Future task               :         des3, after des2, 5d
Future task2               :         des4, after des3, 5d
gitGraph:
options
{
    "nodeSpacing": 150,
    "nodeRadius": 10
}
end
commit
branch newbranch
checkout newbranch
commit
commit
checkout master
commit
commit
merge newbranch

快速、开源的 Windows / macOS 替代方案。

安装

使用 apt-add-repository 增加第三方软件包源

安装某些软件时需要增加第三方软件包源,如 elementary-tweaks 系统调整工具。使用 add-apt-repository 要先安装以下软件包:

1
2
$ sudo apt-get install python-software-properties
$ sudo apt-get install software-properties-common

使用 gdebi 安装 deb 软件包

安装已编译二进制 deb 软件包时,要用到 gdebi 工具:

1
$ sudo apt-get install gdebi

安装 fcitx 小企鹅输入法

安装软件包及配置工具:

1
2
3
$ sudo apt-get install fcitx fcitx-config-gtk fcitx-pinyin 
$ sudo apt-get install fcitx-table-all
$ sudo apt-get install im-config

此时请重启系统,再通过 im-config 命令将 fcitx 设置为默认输入法。

配置输入法

安装 elementary-tweaks 系统调整工具

1
2
3
$ sudo apt-add-repository -y  ppa:philip.scott/elementary-tweaks
$ sudo apt-get update
$ sudo apt-get install elementary-tweaks

安装完成后在 系统配置 中打开,详情请参考 官方

常用软件包

安装

Ubuntu18 系统

  1. 设置 MariaDB 仓库

    默认情况下 MariaDB 的包没有在 Ubuntu 仓库中,请参考 MariaDB 官方进行设置 移步
    参考官方设置时请选择有效的仓库镜像地址,下面选择的是清华大学镜像,测试可用。

    1
    2
    3
    $ sudo apt-get install software-properties-common
    $ sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
    $ sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] http://mirror.its.dal.ca/mariadb/repo/10.4/ubuntu bionic main'
  2. 安装

    安装过程中要输入 MariaDB 的 root 密码。

    1
    2
    $ sudo apt update
    $ sudo apt install mariadb-server
  3. 基本操作

    1
    2
    3
    4
    5
    6
    7
    8
    # 链接
    $ mysql -u root -p
    # 停止
    $ sudo /etc/init.d/mysql stop
    # 启动
    $ sudo /etc/init.d/mysql start
    # 重启
    $ sudo /etc/init.d/mysql restart

设置

设置 MariaDB 开启远程访问

  1. 检查有没有设置防火墙或者 iptables 规则

  2. 检查 3306 端口是否打开

    检查端口状态,下面输出说明端口只在 127.0.0.1 上监听,所以无法通过其它 IP 访问。

    1
    2
    $ netstat -an | grep 3306
    tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN

    解决办法:修改 /etc/mysql/my.cnf 文件,打开文件找到下面一行内容。
    可以将 127.0.0.1 换成合适的 IP,建议直接将此行注释掉。

    1
    2
    3
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
    bind-address = 127.0.0.1

    重启 MariaDB 服务,再次检测:

    1
    2
    3
    $ sudo /etc/init.d/mysql restart
    $ netstat -an | grep 3306
    tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
  3. 给 MariaDB 用户 root 分配远程访问权限

    测试时如果输出如下内容,说明不允许链接服务器。

    1
    2
    3
    $ mysql -h 192.168.0.101 -u root -p
    Enter password:
    ERROR 1130 (00000): Host 'Ubuntu-Fvlo.Server' is not allowed to connect to this MySQL server

    解决办法:给 root 用户分配远程访问的权限,密码设置为 123456

    1
    2
    3
    4
    5
    6
    7
    8
    $ mysql -u root -p
    Enter password:
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    Your MariaDB connection id is 28
    Server version: 5.5.51-MariaDB-1~trusty mariadb.org binary distribution
    ......
    MariaDB [(none)]> grant all on *.* to root@'%' identified by '123456';
    Query OK, 0 rows affected (0.00 sec)

    再次测试,成功。

    1
    2
    3
    4
    5
    6
    7
    $ mysql -h 192.168.0.101 -u root -p
    Enter password:
    Welcome to the MariaDB monitor. Commands end with ; or \g.
    Your MariaDB connection id is 28
    Server version: 5.5.51-MariaDB-1~trusty mariadb.org binary distribution
    ......
    MariaDB [(none)]>

    CentOS6.6 要关闭防火强
    service iptables stop # 停止
    chkconfig iptables off # 禁用

参考

MySQL 数据库无法远程连接的解决办法

环境

  • 系统 Ubuntu18.04 Server LTS

  • 系统没有安装 Apache 或 MySQL

安装

  1. 安装APACHE2
1
2
3
4
5
6
sudo apt update
sudo apt install apache2 libapache2-mod-passenger

sudo systemctl stop apache2.service
sudo systemctl start apache2.service
sudo systemctl enable apache2.service
  1. 安装数据库MYSQL
1
2
3
4
5
sudo apt-get install mysql-server

sudo systemctl stop mysql.service
sudo systemctl start mysql.service
sudo systemctl enable mysql.service

运行以下命令以保护MYSQL服务器的安全:

1
2
3
4
5
6
7
8
sudo mysql_secure_installation         

New password: (输入密码)
Re-enter new password: (重复输入)
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y
  1. 创建 REDMINE 数据库
1
2
3
4
5
6
7
sudo mysql -u root -p

mysql> create database redmine;
mysql> create user 'redmine'@'localhost' identified by '123456';
mysql> grant all on redmine.* to 'redmine'@'localhost' identified by '123456' with grant option;
mysql> flush privileges;
mysql> exit;

创建用户或授权时有可能报如下错误:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
这是由于密码太简单,不满足安全策略造成的。查看MYSQL初始的密码策略:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show variables like 'validate_password%';
+--------------------------------------+-------+
| Variable_name | Value |
+--------------------------------------+-------+
| validate_password_check_user_name | OFF |
| validate_password_dictionary_file | |
| validate_password_length | 6 |
| validate_password_mixed_case_count | 1 |
| validate_password_number_count | 1 |
| validate_password_policy | LOW |
| validate_password_special_char_count | 1 |
+--------------------------------------+-------+
7 rows in set (0.41 sec)

解决办法:1. 设置更复杂的密码,2. 降低安全策略:

1
2
set global validate_password_policy=LOW;
set global validate_password_length=6;
  1. 安装REDMINE
1
sudo apt-get install redmine redmine-mysql

在安装过程中,系统将要求配置REDMINE,选择YES,然后继续。数据库选择MYSQL;接下来为REMIND实例创建一个密码以在数据库中注册,密码为上面创建的数据库用户的密码;接下来,安装GEM、BLUNDLER软件包。

1
2
sudo gem update
sudo gem install bundler

更新过程中会报如下错误,不过暂时可以忽略。

1
2
3
4
5
6
7
8
9
10
11
12
13
Fetching: mysql2-0.5.3.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.

current directory: /var/lib/gems/2.5.0/gems/mysql2-0.5.3/ext/mysql2
/usr/bin/ruby2.5 -r ./siteconf20200414-8181-7u476x.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.5.0/gems/mysql2-0.5.3 for inspection.
Results logged to /var/lib/gems/2.5.0/extensions/x86_64-linux/2.5.0/mysql2-0.5.3/gem_make.out
  1. 为REDMINE设置APACHE2站点。首先运行以下命令创建指向REDMINE文档根目录的软链接:
1
sudo ln -s /usr/share/redmine/public /var/www/html/redmine
  1. 配置APACHE2

运行以下命令以打开PASSENGER.CONF文件:

1
sudo vim /etc/apache2/mods-available/passenger.conf

然后将突出显示的行添加到文件中并保存:

1
2
3
4
5
<IfModule mod_passenger.c>
PassengerDefaultUser www-data
PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
PassengerDefaultRuby /usr/bin/ruby
</IfModule>

为REDMINE配置APACHE2站点配置文件。该文件将控制用户访问REDMINE内容的方式。运行以下命令以创建一个名为REDMINE.CONF的新配置文件:

1
sudo vim /etc/apache2/sites-available/redmine.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<VirtualHost *:80>
ServerAdmin redmime@demo.com
DocumentRoot /var/www/html/redmine
ServerName demo.com
ServerAlias redmine.demo.com

<Directory /var/www/html/redmine>
RailsBaseURI /redmine
PassengerResolveSymlinksInDocumentRoot on
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
  1. 启用REDMINE站点
1
2
sudo a2ensite redmine.conf
sudo systemctl restart apache2.service

访问页面:http://redmine.demo.com/

登录账户密码:admin/admin

首次登陆要求修改密码