hgxfg9

人生若只如初见,何事秋风悲画扇。

0%

作者:myfreax

出处:https://www.myfreax.com/how-to-install-postgresql-on-ubuntu-18-04/

PostgreSQL或Postgres是一个开源的通用对象关系数据库管理系统。 PostgreSQL具有许多高级功能,可让您创建复杂的Web应用程序。

在本教程中,我们将向您展示如何在Ubuntu 18.04上安装PostgreSQL并探索基本数据库管理的基础。

先决条件

在继续学习本教程之前,请确保您以具有sudo权限的用户身份登录

在Ubuntu上安装PostgreSQL

在撰写本文时,可从官方Ubuntu存储库中获得的PostgreSQL的最新版本是PostgreSQL版本10.4。

要在Ubuntu服务器上安装PostgreSQL,请执行以下步骤:

安装PostgreSQL

刷新本地软件包索引,并安装PostgreSQL服务器以及PostgreSQL contrib软件包,后者为PostgreSQL数据库提供了一些附加功能:

1
2
sudo apt update
sudo apt install postgresql postgresql-contrib

Copy

验证PostgreSQL安装

安装完成后,PostgreSQL服务将自动启动。

要验证在安装过程中,我们将尝试使用psql连接到PostgreSQL数据库服务器并打印服务器版本:

1
sudo -u postgres psql -c "SELECT version();"

Copy

psql是一个交互式命令行实用程序,使我们可以与PostgreSQL服务器进行交互。

PostgreSQL角色和身份验证方法

PostgreSQL中的数据库访问权限是通过角色的概念来处理的。一个角色可以代表一个数据库用户或一组数据库用户。

PostgreSQL支持多种身份验证方法。最常用的是:

  • 信任-使用此方法,只要符合pg_hba.conf中定义的条件,角色就可以不使用密码进行连接。
  • 密码-可以通过提供密码来连接角色。密码可以存储为scram-sha-256 md5password(明文)
  • 标识-仅在TCP / IP连接上支持此方法。通过获取客户端的操作系统用户名以及可选的用户名映射来工作。
  • Peer-与Ident相同,但仅在本地连接上受支持。

PostgreSQL客户端身份验证在名为pg_hba.conf的配置文件中定义。默认情况下,对于本地连接,PostgreSQL设置为使用对等身份验证方法。

在安装PostgreSQL时会自动创建postgres用户。该用户是PostgreSQL实例的超级用户,它等效于MySQL根用户。

要首先以postgres用户身份登录PostgreSQL服务器,您需要切换到用户 postgres,然后可以使用psql实用程序访问PostgreSQL提示符:

1
2
sudo su - postgres
psql

Copy

从这里您可以与PostgreSQL实例进行交互。要退出PostgreSQL shell,请输入:

1
\q

Copy

您也可以使用sudo命令来访问PostgreSQL提示符,而无需切换用户:

1
sudo -u postgres psql

Copy

通常仅从本地主机使用postgres用户,建议不要为此用户设置密码。

创建PostgreSQL角色和数据库

您可以使用createuser命令从命令行创建新角色。只有具有CREATEROLE特权的超级用户和角色才能创建新角色。

在以下示例中,我们将创建一个名为john的新角色以及一个名为johndb的数据库,并授予对该数据库的特权。

创建新的PostgreSQL角色

以下命令将创建一个名为john的新角色:

1
sudo su - postgres -c "createuser john"

Copy

创建新的PostgreSQL数据库

使用createdb命令创建名为johndb的新数据库:

1
sudo su - postgres -c "createdb johndb"

Copy

授予特权

要向上一步中创建的数据库上的john用户授予权限,请连接到PostgreSQL shell:

1
sudo -u postgres psql

Copy

并运行以下查询:

1
grant all privileges on database johndb to john;

Copy

启用对PostgreSQL服务器的远程访问

默认情况下,PostgreSQL服务器仅在本地接口上侦听127.0.0.1。要启用对PostgreSQL服务器的远程访问,请打开配置文件postgresql.conf,然后在CONNECTIONS AND AUTHENTICATION部分中添加listen_addresses = '*'

1
sudo vim /etc/postgresql/10/main/postgresql.conf

Copy

/etc/postgresql/10/main/postgresql.conf

1
2
3
4
5
6
7
#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*' # what IP address(es) to listen on;

Copy

保存文件,然后使用以下方法重新启动PostgreSQL服务:

1
sudo service postgresql restart

Copy

使用ss实用工具验证更改:

1
ss -nlt | grep 5432

Copy

1
2
LISTEN   0         128                 0.0.0.0:5432             0.0.0.0:*
LISTEN 0 128 [::]:5432 [::]:*

Copy

从PostgreSQL服务器上方的输出中可以看到,在所有接口(0.0.0.0)上,正在侦听。

最后一步是通过编辑pg_hba.conf文件将服务器配置为接受远程连接。

以下是显示不同用例的一些示例:

/etc/postgresql/10/main/pg_hba.conf

1
2
3
4
5
6
7
8
9
10
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# The user jane will be able to access all databases from all locations using a md5 password
host all jane 0.0.0.0/0 md5

# The user jane will be able to access only the janedb from all locations using a md5 password
host janedb jane 0.0.0.0/0 md5

# The user jane will be able to access all databases from a trusted location (192.168.1.134) without a password
host all jane 192.168.1.134 trust

Copy

结论

您已了解如何在Ubuntu 18.04服务器上安装和配置PostgreSQL。

有关此主题的更多信息,请查阅 PostgreSQL 10.4文档

作者:骏马金龙

出处:http://www.cnblogs.com/f-ck-need-u/p/9279703.html

1.简介和安装

sysbench是一个很不错的数据库性能测试工具。

官方站点:

https://github.com/akopytov/sysbench/

rpm包下载:

https://packagecloud.io/akopytov/sysbench/packages/el/7/sysbench-1.0.15-1.el7.centos.x86_64.rpm

源码包下载:

https://github.com/akopytov/sysbench/archive/1.0.15.tar.gz

如果是编译安装,需要先安装好mysql的开发包(尽管编译错误时提示的是缺少Mysql库文件)。

1
2
3
4
5
6
7
8
yum -y install mysql-community-devel

tar xf 1.0.15.tar.gz
cd sysbench-1.0.15
./autogen.sh
./configure
make -j
make install

安装后,只有一个二进制文件sysbench,还提供了很多个lua脚本。

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
[root@s1 ~]# rpm -ql sysbench | grep 'bin\|lua'  
/usr/bin/sysbench
/usr/share/sysbench/bulk_insert.lua
/usr/share/sysbench/oltp_common.lua
/usr/share/sysbench/oltp_delete.lua
/usr/share/sysbench/oltp_insert.lua
/usr/share/sysbench/oltp_point_select.lua
/usr/share/sysbench/oltp_read_only.lua
/usr/share/sysbench/oltp_read_write.lua
/usr/share/sysbench/oltp_update_index.lua
/usr/share/sysbench/oltp_update_non_index.lua
/usr/share/sysbench/oltp_write_only.lua
/usr/share/sysbench/select_random_points.lua
/usr/share/sysbench/select_random_ranges.lua
/usr/share/sysbench/tests/include/inspect.lua
/usr/share/sysbench/tests/include/oltp_legacy/bulk_insert.lua
/usr/share/sysbench/tests/include/oltp_legacy/common.lua
/usr/share/sysbench/tests/include/oltp_legacy/delete.lua
/usr/share/sysbench/tests/include/oltp_legacy/insert.lua
/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua
/usr/share/sysbench/tests/include/oltp_legacy/oltp_simple.lua
/usr/share/sysbench/tests/include/oltp_legacy/parallel_prepare.lua
/usr/share/sysbench/tests/include/oltp_legacy/select.lua
/usr/share/sysbench/tests/include/oltp_legacy/select_random_points.lua
/usr/share/sysbench/tests/include/oltp_legacy/select_random_ranges.lua
/usr/share/sysbench/tests/include/oltp_legacy/update_index.lua
/usr/share/sysbench/tests/include/oltp_legacy/update_non_index.lua

本文介绍的是新版本sysbench oltp lua脚本的用法(/usr/share/sysbench/*.lua),所以不涉及传统的lua(tests/include/oltp_legacy/*.lua),如果想要了解这些传统Lua脚本的用法,网上随便找。常用的 7 款 MySQL 客户端工具,也推荐看下。

2.sysbench使用方法

以下列出了sysbench对测试mysql时常用的选项。

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
37
38
[root@xuexi ~]# sysbench --help
Usage:
sysbench [options]... [test_lua] [lua_options] [command]

Commands implemented by most tests: prepare run cleanup help

通用选项:以下中括号中的值表示默认值
--threads=N 指定线程数[1]
--events=N 限制最大请求数,0表示不限制[0]
--time=N 限制最长执行时间,0表示不限制[10]
--events和--time二者选一即可
--forced-shutdown=STRING 达到最长执行时间后还需等待多久关闭sysbench
off表示禁用该功能[off]
--thread-stack-size=SIZE 每个线程使用的栈空间大小[64K]
--rate=N 平均事务处理速率,0表示不限制[0]
--report-interval=N 每隔几秒报告一次结果,0表示禁用间隔报告[0]
--config-file=FILENAME 从文件中读取命令行选项
--tx-rate=N 已废弃,是--rate的别名[0]
--max-requests=N 已废弃,是--events的别名[0]
--max-time=N 已废弃,是--time的别名[0]
--num-threads=N 已废弃,是--threads的别名[1]
--db-ps-mode=STRING 是否使用prepare模式的语句 {auto, disable} [auto]

mysql相关选项:
--mysql-host=[LIST,...] MySQL server host [localhost]
--mysql-port=[LIST,...] MySQL server port [3306]
--mysql-socket=[LIST,...] MySQL socket
--mysql-user=STRING MySQL user [sbtest]
--mysql-password=STRING MySQL password []
--mysql-db=STRING MySQL database name [sbtest]
--mysql-ignore-errors=[LIST,...] 要忽略的错误代码,值可为"all" [1213,1020,1205]

Compiled-in tests:
fileio - File I/O test
cpu - CPU performance test
memory - Memory functions speed test
threads - Threads subsystem performance test
mutex - Mutex performance test

其中,command部分有4类:prepare run cleanup和help:

  • prepare:准备数据的命令。例如,在sysbench压力测试之前,需要先准备好测试库、测试表以及测试表中的数据。具体用法见后文。

test_lua是想要使用的lua脚本,如果是rpm包安装的sysbench,则这些脚本都是/usr/share/sysbench目录下。对于一般的数据库测试,只需使用和oltp有关的lua脚本就足够。

options和lua_options是不同的,options是sysbench的选项,lua_options是lua脚本的选项,lua_options应该要放在test_lua的后面(非必需,但建议)。

例如,要查看oltp_common.lua的用法,可以:

1
sysbench /usr/share/sysbench/oltp_common.lua help

3.准备测试数据

首先创建sysbench所需数据库sbtest(这是sysbench默认使用的库名,必须创建测试库)。

1
mysqladmin -h127.0.0.1 -uroot -pP@ssword1! -P3306 create sbtest;

然后,准备测试所用的表,这些测试表放在测试库sbtest中。这里使用的lua脚本为/usr/share/sysbench/oltp_common.lua

1
2
3
4
5
6
7
8
sysbench --mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=P@ssword1! \
/usr/share/sysbench/oltp_common.lua \
--tables=10 \
--table_size=100000 \
prepare

其中--tables=10表示创建10个测试表,--table_size=100000表示每个表中插入10W行数据,prepare表示这是准备数的过程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> show tables from sbtest;
+------------------+
| Tables_in_sbtest |
+------------------+
| sbtest1 |
| sbtest10 |
| sbtest2 |
| sbtest3 |
| sbtest4 |
| sbtest5 |
| sbtest6 |
| sbtest7 |
| sbtest8 |
| sbtest9 |
+------------------+

mysql> select count(*) from sbtest.sbtest1;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+

如果想要清除这10个表,可使用cleanup命令。

1
2
3
4
5
6
7
sysbench --mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=P@ssword1! \
/usr/share/sysbench/oltp_common.lua \
--tables=10 \
cleanup

4.数据库测试和结果分析

稍微修改下之前准备数据的语句,就可以拿来测试了。

需要注意的是,之前使用的lua脚本为oltp_common.lua,它是一个通用脚本,是被其它lua脚本调用的,它不能直接拿来测试。

所以,我这里用oltp_read_write.lua脚本来做读、写测试。还有很多其它类型的测试,比如只读测试、只写测试、删除测试、大批量插入测试等等。可找到对应的lua脚本进行调用即可。

1
2
3
4
5
6
7
8
9
10
11
sysbench --threads=4 \
--time=20 \
--report-interval=5 \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=P@ssword1! \
/usr/share/sysbench/oltp_read_write.lua \
--tables=10 \
--table_size=100000 \
run

以下是测试返回的结果:

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
37
38
Initializing worker threads...

Threads started!


####以下是每5秒返回一次的结果,统计的指标包括:
#### 线程数、tps(每秒事务数)、qps(每秒查询数)、
#### 每秒的读//其它次数、延迟、每秒错误数、每秒重连次数
[ 5s ] thds: 4 tps: 130.16 qps: 2606.30 (r/w/o: 1824.51/520.66/261.13) lat (ms,95%): 104.84 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 4 tps: 126.74 qps: 2539.17 (r/w/o: 1778.17/507.52/253.47) lat (ms,95%): 108.68 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 4 tps: 136.54 qps: 2736.34 (r/w/o: 1915.25/548.01/273.07) lat (ms,95%): 102.97 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 4 tps: 107.44 qps: 2148.65 (r/w/o: 1505.60/428.17/214.89) lat (ms,95%): 132.49 err/s: 0.00 reconn/s: 0.00

SQL statistics:
queries performed:
read: 35098 # 执行的读操作数量
write: 10028 # 执行的写操作数量
other: 5014 # 执行的其它操作数量
total: 50140
transactions: 2507 (124.29 per sec.) # 执行事务的平均速率
queries: 50140 (2485.82 per sec.) # 平均每秒能执行多少次查询
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)

General statistics:
total time: 20.1694s # 总消耗时间
total number of events: 2507 # 总请求数量(读、写、其它)

Latency (ms):
min: 2.32
avg: 32.13
max: 575.78
95th percentile: 118.92 # 采样计算的平均延迟
sum: 80554.96

Threads fairness:
events (avg/stddev): 626.7500/2.49
execution time (avg/stddev): 20.1387/0.04

5.cpu/io/内存等测试

sysbench内置了几个测试指标。

1
2
3
4
5
6
Compiled-in tests:
fileio - File I/O test
cpu - CPU performance test
memory - Memory functions speed test
threads - Threads subsystem performance test
mutex - Mutex performance test

可直接help输出测试方法。例如,fileio测试。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@xuexi ~]# sysbench fileio help
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

fileio options:
--file-num=N number of files to create [128]
--file-block-size=N block size to use in all IO operations [16384]
--file-total-size=SIZE total size of files to create [2G]
--file-test-mode=STRING test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}
--file-io-mode=STRING file operations mode {sync,async,mmap} [sync]
--file-async-backlog=N number of asynchronous operatons to queue per thread [128]
--file-extra-flags=[LIST,...] list of additional flags to use to open files {sync,dsync,direct} []
--file-fsync-freq=N do fsync() after this number of requests (0 - don't use fsync()) [100]
--file-fsync-all[=on|off] do fsync() after each write operation [off]
--file-fsync-end[=on|off] do fsync() at the end of test [on]
--file-fsync-mode=STRING which method to use for synchronization {fsync, fdatasync} [fsync]
--file-merged-requests=N merge at most this number of IO requests if possible (0 - don't merge) [0]
--file-rw-ratio=N reads/writes ratio for combined test [1.5]

例如,创建5个文件,总共1G,每个文件大概200M。

1
2
3
4
5
6
7
8
sysbench fileio --file-num=5 --file-total-size=1G prepare

[root@xuexi ~]# ls -lh test*
-rw------- 1 root root 205M Jul 8 12:15 test_file.0
-rw------- 1 root root 205M Jul 8 12:15 test_file.1
-rw------- 1 root root 205M Jul 8 12:15 test_file.2
-rw------- 1 root root 205M Jul 8 12:15 test_file.3
-rw------- 1 root root 205M Jul 8 12:15 test_file.4

然后,运行测试。

1
2
3
4
5
6
7
8
9
sysbench --events=5000 \
--threads=16 \
fileio \
--file-num=5 \
--file-total-size=1G \
--file-test-mode=rndrw \
--file-fsync-freq=0 \
--file-block-size=16384 \
run

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
File operations:
reads/s: 98.67
writes/s: 66.85
fsyncs/s: 6.26

Throughput: # 吞吐量
read, MiB/s: 1.54 # 表示读的带宽
written, MiB/s: 1.04 # 表示读的带宽

General statistics:
total time: 12.7426s
total number of events: 2117

Latency (ms):
min: 0.00
avg: 86.66
max: 2919.41
95th percentile: 646.19
sum: 183460.80

Threads fairness:
events (avg/stddev): 132.3125/24.19
execution time (avg/stddev): 11.4663/1.09

再比例cpu性能测试:

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
[root@xuexi ~]# sysbench cpu --threads=40 --events=10000 --cpu-max-prime=20000 run
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 40
Initializing random number generator from current time


Prime numbers limit: 20000

Initializing worker threads...

Threads started!

CPU speed:
events per second: 2127.81

General statistics:
total time: 4.6986s
total number of events: 10000

Latency (ms):
min: 1.72
avg: 18.16
max: 302.17
95th percentile: 110.66
sum: 181628.49

Threads fairness:
events (avg/stddev): 250.0000/30.81
execution time (avg/stddev): 4.5407/0.10

以上,希望能帮到你。

Hexo+Next7.X 博客美化教程合集

关于Next主题安装

next主题的官网地址:https://theme-next.iissnan.com/

下载next

在终端窗口下,定位到 Hexo 站点目录下。使用 Git checkout 代码:

1
2
$ cd your-hexo-site
$ git clone https://github.com/iissnan/hexo-theme-next themes/next

启用next

与所有 Hexo 主题启用的模式一样。 当 克隆/下载 完成后,打开 站点配置文件, 找到 theme 字段,并将其值更改为 next

1
theme: next

到此,NexT 主题安装完成。下一步我们将验证主题是否正确启用。在切换主题之后、验证之前, 我们最好使用 hexo clean 来清除 Hexo 的缓存。

验证主题

首先启动 Hexo 本地站点,并开启调试模式(即加上 --debug),整个命令是 hexo s --debug。 在服务启动的过程,注意观察命令行输出是否有任何异常信息,如果你碰到问题,这些信息将帮助他人更好的定位错误。 当命令行输出中提示出:

1
INFO  Hexo is running at http://0.0.0.0:4000/. Press Ctrl+C to stop.

主题设定

Scheme 是 NexT 提供的一种特性,借助于 Scheme,NexT 为你提供多种不同的外观。同时,几乎所有的配置都可以 在 Scheme 之间共用。目前 NexT 支持三种 Scheme,他们是:

  • Muse - 默认 Scheme,这是 NexT 最初的版本,黑白主调,大量留白
  • Mist - Muse 的紧凑版本,整洁有序的单栏外观
  • Pisces - 双栏 Scheme,小家碧玉似的清新
  • Gemini - 我现在用的这款

Scheme 的切换通过更改 主题配置文件,搜索 scheme 关键字。 你会看到有三行 scheme 的配置,将你需用启用的 scheme 前面注释 # 去除即可。

1
2
3
4
5
# Schemes
#scheme: Muse
#scheme: Mist
#scheme: Pisces
scheme: Gemini

教程开始

设置背景图片

  • 找到CSS存放位置:

oez1gapzfj

新建 _other.styl 文件,用来存放自己后面添加的CSS样式

  • 打开主要CSS文件 main.styl ,引入_other.styl CSS样式文件,添加如下代码: //个人添加 @import “_other.styl”

sknhnea8t8

  • 插入博客背景的CSS样式到_other.styl

    1
    2
    3
    4
    5
    6
    7
     //背景图片 
    body { background:url(https://pic.heson10.com/img/image-20200712231958010.png);
    background-repeat: no-repeat;
    background-attachment:fixed;
    background-size: cover;
    background-position:50% 50%;
    }

    代码中url的链接就是你想要替换的博客背景图片链接,建议上传到图床,然后粘贴上去。

设置半透明效果

插入半透明的CSS样式到_other.styl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//博客内容透明化
//文章内容的透明度设置
.content-wrap {
opacity: 0.9;
}

//侧边框的透明度设置
.sidebar {
opacity: 0.9;
}

//菜单栏的透明度设置
.header-inner {
background: rgba(255,255,255,0.9);
}

//搜索框(local-search)的透明度设置
.popup {
opacity: 0.9;
}

0.9代表透明度为90%,这个可以自己设置,当然不要设置的太低,要不文章看不见了。

Linux tar 命令解析以及实例

Linux tar(英文全拼:tape archive )命令用于备份文件。

tar 是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。

语法

1
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

参数

  • -A或–catenate 新增文件到已存在的备份文件。
  • -b<区块数目>或–blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
  • -B或–read-full-records 读取数据时重设区块大小。
  • -c或–create 建立新的备份文件。
  • -C<目的目录>或–directory=<目的目录> 切换到指定的目录。
  • -d或–diff或–compare 对比备份文件内和文件系统上的文件的差异。
  • -f<备份文件>或–file=<备份文件> 指定备份文件。
  • -F<Script文件>或–info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
  • -g或–listed-incremental 处理GNU格式的大量备份。
  • -G或–incremental 处理旧的GNU格式的大量备份。
  • -h或–dereference 不建立符号连接,直接复制该连接所指向的原始文件。
  • -i或–ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
  • -k或–keep-old-files 解开备份文件时,不覆盖已有的文件。
  • -K<文件>或–starting-file=<文件> 从指定的文件开始还原。
  • -l或–one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
  • -L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
  • -m或–modification-time 还原文件时,不变更文件的更改时间。
  • -M或–multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
  • -N<日期格式>或–newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
  • -o或–old-archive或–portability 将资料写入备份文件时使用V7格式。
  • -O或–stdout 把从备份文件里还原的文件输出到标准输出设备。
  • -p或–same-permissions 用原来的文件权限还原文件。
  • -P或–absolute-names 文件名使用绝对名称,不移除文件名称前的”/“号。
  • -r或–append 新增文件到已存在的备份文件的结尾部分。
  • -R或–block-number 列出每个信息在备份文件中的区块编号。
  • -s或–same-order 还原文件的顺序和备份文件内的存放顺序相同。
  • -S或–sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
  • -t或–list 列出备份文件的内容。
  • -T<范本文件>或–files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
  • -u或–update 仅置换较备份文件内的文件更新的文件。
  • -U或–unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
  • -v或–verbose 显示指令执行过程。
  • -V<卷册名称>或–label=<卷册名称> 建立使用指定的卷册名称的备份文件。
  • -w或–interactive 遭遇问题时先询问用户。
  • -W或–verify 写入备份文件后,确认文件正确无误。
  • -x或–extract或–get 从备份文件中还原文件。
  • -X<范本文件>或–exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
  • -z或–gzip或–ungzip 通过gzip指令处理备份文件。
  • -Z或–compress或–uncompress 通过compress指令处理备份文件。
  • -<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。
  • –after-date=<日期时间> 此参数的效果和指定”-N”参数相同。
  • –atime-preserve 不变更文件的存取时间。
  • –backup=<备份方式>或–backup 移除文件前先进行备份。
  • –checkpoint 读取备份文件时列出目录名称。
  • –concatenate 此参数的效果和指定”-A”参数相同。
  • –confirmation 此参数的效果和指定”-w”参数相同。
  • –delete 从备份文件中删除指定的文件。
  • –exclude=<范本样式> 排除符合范本样式的文件。
  • –group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
  • –help 在线帮助。
  • –ignore-failed-read 忽略数据读取错误,不中断程序的执行。
  • –new-volume-script=<Script文件> 此参数的效果和指定”-F”参数相同。
  • –newer-mtime 只保存更改过的文件。
  • –no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
  • –null 从null设备读取文件名称。
  • –numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
  • –owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
  • –posix 将数据写入备份文件时使用POSIX格式。
  • –preserve 此参数的效果和指定”-ps”参数相同。
  • –preserve-order 此参数的效果和指定”-A”参数相同。
  • –preserve-permissions 此参数的效果和指定”-p”参数相同。
  • –record-size=<区块数目> 此参数的效果和指定”-b”参数相同。
  • –recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
  • –remove-files 文件加入备份文件后,就将其删除。
  • –rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
  • –same-owner 尝试以相同的文件拥有者还原文件。
  • –suffix=<备份字尾字符串> 移除文件前先行备份。
  • –totals 备份文件建立后,列出文件大小。
  • –use-compress-program=<执行指令> 通过指定的指令处理备份文件。
  • –version 显示版本信息。
  • –volno-file=<编号文件> 使用指定文件内的编号取代预设的卷册编号。

实例

# tar -cf all.tar *.jpg
将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。
# tar -xf all.tar
解出all.tar包中所有文件,-x是解开的意思
# tar -tf all.tar
列出all.tar包中所有文件,-t是列出文件的意思
# tar -rf all.tar *.gif
将所有.gif的文件增加到all.tar的包里面去,-r是表示增加文件的意思。
# tar -uf all.tar logo.gif
更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。

常用命令

压缩

tar -cvf jpg.tar *.jpg
将目录里所有jpg文件打包成tar.jpg
tar -czf jpg.tar.gz *.jpg
将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
tar -cjf jpg.tar.bz2 *.jpg
将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
tar -cZf jpg.tar.Z *.jpg
将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
tar -Jcvf jpg.tar.xz *.jpg
将目录里所有jpg文件打包成jpg.tar后,并且将其用xz压缩,生成一个xz压缩过的包,命名为jpg.tar.xz

解压

tar -xvf file.tar //解压 tar包
tar -xzvf file.tar.gz //解压tar.gz
tar -xjvf file.tar.bz2 //解压 tar.bz2
tar -xZvf file.tar.Z //解压tar.Z
tar -xvJf file.tar.xz //解压tar.xz

将HTML文件转换为MD文件

html格式转md格式

# 模块html2text

1
pip install html2text/pip3 install html2text

测试:

1
2
3
4
5
6
7
8
9
10
import html2text as ht
text_maker = ht.HTML2Text()
# 读取html格式文件
with open('./*.html', 'r', encoding='UTF-8') as f:
htmlpage = f.read()
# 处理html格式文件中的内容
text = text_maker.handle(htmlpage)
# 写入处理后的内容
with open('*.md', 'w') as f:
f.write(text)


typora + hexo博客中插入图片

在使用了hexo搭建了博客后,最大的问题便是如何使用一款markdown工具来编辑博客了,我采取的就是Typora,这工具免费简单易用没广告,而且把图片保存到本地还是很方便的,因此大家只要稍微了解点markdown语法就可以上手使用了。

关于图片和图片路径的设置,有以下教程。

事先声明,所有博客文件均保存在 hexo/_posts/文件夹下

首先在 hexo > source目录下建一个文件夹叫images,用来保存博客中的图片。

然后打开Typora的 文件 > 偏好设置,进行如下设置。

在这里插入图片描述

这样的话所有的博客中的图片都将会保存到 /source/images/该博客md文件名/图片名称

但是仅仅这样设置还不够,这样设置在typora中倒是能看图片了,但是使用的却是相对于当前md文件的相对路径,可是如果启动hexo,是要用服务器访问的,而服务器显然无法根据这个相对路径正确访问到图片,因此还需要在typora中进行进一步设置。

在typora菜单栏点击 格式->图像->设置图片根目录,将hexo/source作为其根目录即可。

一定要先设置了图片根目录后再插入图片,否则图片路径会不正确喔!

proxychains for windows 用法

在 linux 下为了终端命令绕过防火墙我们可以使用 proxychains 结合 socksv5 代理进行使用,在windows下有没有类似工具呢,有!大佬写了一个 proxychains for windows 版可以使用,下面就是简要的设置过程

参考:Proxychains for Windows 自述文件

  1. https://github.com/shunf4/proxychains-windows/releases 下一个最新版如 proxychains_0.6.8_win32_x64.zip,解压到任意目录,我为了方便解压到D:\proxychains
  2. proxychains_win32_x64.exe 重命名 proxychains
  3. 编辑目录下 proxychains.conf 配置文件,根据自己实际情况改,例如 socks5 127.0.0.1 1081
  4. 编辑系统环境变量将 D:\proxychains 加入系统 PATH 变量。
  5. 新建一个系统变量名称 PROXYCHAINS_CONF_FILED:\proxychains\proxychains.conf 根据情况自己修改
  6. 打开一个新的 cmd,使用方法 proxychains command,如 proxychains go get github.com/StackExchange/wmi

注意:一些协议估计没法代理,详情见作者项目文档

问题

因为next主题默认是使用markdown文件的修改时间作为更新时间,这个时间是不符合预期的。比如我换了电脑,clone下来markdown文件,写完后发布,那么所有文章的更新时间都会变成当前时间,这个就不符合预期,就不对。

但是,文章更新时间确实是有意义的,读者能够通过更新时间推断出一篇文章的有效性。比如很多工具和技术昨天可以用,文章写的没毛病,但是也许今天就不能用了。

本文就来研究一下,怎样让next主题显示符合预期的、准确的更新时间。

思路

首先,我们知道next主题是支持显示更新时间的,只不过显示的更新时间不对。那么,能不能显示对的更新时间呢?看代码。

1、_config.yml,其中关于更新时间的部分:

1
2
3
4
5
6
7
8
# Post meta display settings
post_meta:
item_text: true
created_at: true
updated_at:
enable: true
another_day: true
categories: true

2、layout/_macro/post.swig,其中关于更新时间的部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
{%- if theme.post_meta.updated_at.enable and datetime_diff %}
{%- set display_updated = not theme.post_meta.updated_at.another_day or theme.post_meta.updated_at.another_day and date_diff %}

{%- if display_updated or not theme.post_meta.created_at %}
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">{{ __('post.edited') }}</span>
<time title="{{ __('post.modified') + __('symbol.colon') + full_date(post.updated) }}" itemprop="dateModified" datetime="{{ moment(post.updated).format() }}">{{ date(post.updated) }}</time>
</span>
{%- endif %}
{%- endif %}

由上面的代码我们可以得知:

  • 只要在文章头部yaml定义中添加 updated 字段,就可以显示我们自己定义的更新时间,而不是文件的修改时间。
  • 如果开启了 post_meta.updated_at.another_day ,当 date 和 updated 日期相同时,只会显示发布时间。

因此,我们现在有两个思路来实现next主题显示符合预期的更新时间。
思路一:开启 post_meta.updated_at.enable,然后给所有的md文件添加 updated 字段。
思路二:开启 post_meta.updated_at.enable,修改 post.swig ,令没有 updated 字段的md文件只显示发布时间,有 updated 字段的md文件显示发布时间和更新时间。

这里选择思路一,因为实现的逻辑最简单,而且郝同学的shell脚本用的还不错。

实现

开启更新时间显示

_config.yml,开启更新时间显示:

1
2
3
4
5
6
7
8
# Post meta display settings
post_meta:
item_text: true
created_at: true
updated_at:
enable: true
another_day: true
categories: true

添加updated字段

1、准备脚本

1
2
3
4
5
6
7
8
9
#!/bin/bash

dir="_posts"
for file in `ls ${dir} | grep '.md'`;do
content=$(cat ${dir}/${file}| head -n 10 | grep 'date: ')
datestr=$(echo "$content" | awk '{print $2" "$3}')
newcontent="updated: "$datestr
sed -i "/$content/a\\$newcontent" ${dir}/${file}
done

2、执行脚本
把脚本放到 source 目录下,然后执行脚本 bash modify.sh
备注:需要linux环境,mac环境的sed命令和linux环境的sed命令有差异。


title: 如何在正则表达式中排除某个单词?
date: 2022-10-20 11:03:30
tags:

如何在正则表达式中排除某个单词?

我正在使用这个表达式,它非常适合我需要的东西:

1
.*(cq\|conquest).*

它返回任何单词/短语/句子/等。 字母’cq’或’conquest’字样。 但是,从这些比赛中我想排除所有包含”征服力量”一词的内容。

例子:

1
2
3
- some conquest here(应该匹配)
- another cq with some conquest here(应该匹配)
- too much cq or conquest power is bad(不应该匹配)

我怎么能对上面的正则表达式做到这一点? 它必须只有一个正则表达式,否则我正在使用的程序(高级战斗追踪器)将创建两个不同的选项卡。

如果要匹配任何包含”conquest”或”cq”的字符串,但是如果字符串包含”conquest power”则不匹配,那么正则表达式是

1
^(?!.*conquest poer).*?(?:cq\|conquest).*

以上将尝试匹配从字符串的开头到行的结尾,如果要从每行的开头匹配,请在多行模式下切换(如果可用) - 将(?m)添加到正则表达式的开头可能会 那。

如果要匹配换行符,请将.更改为[\s\S],或者如果可用,则打开singleline模式。

你通过声明”我想匹配’cq’或’征服’”而且”我希望正则表达式提取该行”让人困惑。

我假设你真的不想只匹配”cq”或”conquest”,你想匹配包含”cq”或”conquest”的字符串/行(?)。

从你原来的问题我得到你想要匹配所有包含”cq”或”conquest”但不包含”power”的字符串。 对于这种情况,以下正则表达式有效:

1
^([^p]|p(?!ower))*(cq|conquest)([^p]|p(?!ower))*$