From c50ba5bd923a3f2228f43ab82acfef5fa0a2eb7e Mon Sep 17 00:00:00 2001 From: thinklive1 <469631989@qq.com> Date: Tue, 5 Dec 2023 16:17:04 +0800 Subject: [PATCH] Site updated: 2023-12-05 16:17:03 --- .../61a\346\200\273\345\222\214/index.html" | 4 +- .../index.html" | 8 +- .../index.html" | 4 +- .../index.html" | 4 +- .../index.html" | 4 +- archives/2023/09/index.html | 8 +- archives/2023/09/page/2/index.html | 4 +- archives/2023/page/3/index.html | 12 +- archives/page/3/index.html | 12 +- atom.xml | 152 +++++------ .../black-souls/index.html" | 12 +- .../index.html" | 12 +- page/2/index.html | 112 ++++---- page/3/index.html | 29 +-- page/4/index.html | 15 +- search.xml | 242 +++++++++--------- sitemap.txt | 12 +- sitemap.xml | 38 +-- tags/black-souls/index.html | 12 +- .../index.html" | 12 +- 20 files changed, 354 insertions(+), 354 deletions(-) diff --git "a/2023/09/29/61a\346\200\273\345\222\214/index.html" "b/2023/09/29/61a\346\200\273\345\222\214/index.html" index f4ca1ed7e..3f41b47b9 100644 --- "a/2023/09/29/61a\346\200\273\345\222\214/index.html" +++ "b/2023/09/29/61a\346\200\273\345\222\214/index.html" @@ -608,8 +608,8 @@

生成器生成树的搜索路径

-
diff --git "a/2023/09/29/black souls\344\272\272\347\211\251\350\247\243\346\236\220/index.html" "b/2023/09/29/black souls\344\272\272\347\211\251\350\247\243\346\236\220/index.html" index 7eca47fe2..c57d9387c 100644 --- "a/2023/09/29/black souls\344\272\272\347\211\251\350\247\243\346\236\220/index.html" +++ "b/2023/09/29/black souls\344\272\272\347\211\251\350\247\243\346\236\220/index.html" @@ -359,13 +359,13 @@

玛丽苏

-
-
diff --git "a/2023/09/29/black souls\345\211\247\346\203\205\350\247\243\346\236\220/index.html" "b/2023/09/29/black souls\345\211\247\346\203\205\350\247\243\346\236\220/index.html" index 2c08cc63a..26096bc7f 100644 --- "a/2023/09/29/black souls\345\211\247\346\203\205\350\247\243\346\236\220/index.html" +++ "b/2023/09/29/black souls\345\211\247\346\203\205\350\247\243\346\236\220/index.html" @@ -361,8 +361,8 @@

-
diff --git "a/2023/09/29/blacksouls\345\216\237\350\221\227\346\242\227\350\247\243\346\236\220/index.html" "b/2023/09/29/blacksouls\345\216\237\350\221\227\346\242\227\350\247\243\346\236\220/index.html" index b17dc9cbd..4d269348d 100644 --- "a/2023/09/29/blacksouls\345\216\237\350\221\227\346\242\227\350\247\243\346\236\220/index.html" +++ "b/2023/09/29/blacksouls\345\216\237\350\221\227\346\242\227\350\247\243\346\236\220/index.html" @@ -378,8 +378,8 @@

ex02

-
diff --git "a/2023/09/29/cs106b\346\200\273\345\222\214\347\254\224\350\256\260/index.html" "b/2023/09/29/cs106b\346\200\273\345\222\214\347\254\224\350\256\260/index.html" index 9e02f4c60..bae986aaf 100644 --- "a/2023/09/29/cs106b\346\200\273\345\222\214\347\254\224\350\256\260/index.html" +++ "b/2023/09/29/cs106b\346\200\273\345\222\214\347\254\224\350\256\260/index.html" @@ -446,8 +446,8 @@

汉诺塔递归

-
diff --git a/archives/2023/09/index.html b/archives/2023/09/index.html index 28a9d40ca..1498987c7 100644 --- a/archives/2023/09/index.html +++ b/archives/2023/09/index.html @@ -418,8 +418,8 @@

thinklive

-
@@ -438,8 +438,8 @@

thinklive

-
diff --git a/archives/2023/09/page/2/index.html b/archives/2023/09/page/2/index.html index 958dc56a1..a1e1fa33d 100644 --- a/archives/2023/09/page/2/index.html +++ b/archives/2023/09/page/2/index.html @@ -258,8 +258,8 @@

thinklive

-
diff --git a/archives/2023/page/3/index.html b/archives/2023/page/3/index.html index 6b3a76000..cd471a532 100644 --- a/archives/2023/page/3/index.html +++ b/archives/2023/page/3/index.html @@ -258,8 +258,8 @@

thinklive

-
@@ -278,8 +278,8 @@

thinklive

-
@@ -298,8 +298,8 @@

thinklive

-
diff --git a/archives/page/3/index.html b/archives/page/3/index.html index 352c29823..ba7852e1c 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -258,8 +258,8 @@

thinklive

-
@@ -278,8 +278,8 @@

thinklive

-
@@ -298,8 +298,8 @@

thinklive

-
diff --git a/atom.xml b/atom.xml index 9983d4e15..582691c86 100644 --- a/atom.xml +++ b/atom.xml @@ -401,66 +401,66 @@ - 基于伯克利Sysadmin decal的linux笔记 - - https://thinklive1.github.io/2023/10/12/sysadmin/ - 2023-10-12T12:54:12.472Z + 基于伯克利ds100和cs231n的numpy笔记 + + https://thinklive1.github.io/2023/10/09/numpy/ + 2023-10-09T12:02:04.679Z 2023-11-27T12:50:13.887Z - shell脚本

Shell 脚本通常以 shebang 行开头:#!path/to/interpreter。

#!是一个人类可读的 幻数表示 0x23 0x21它可以告诉 shell 将文件其余部分的执行传递给 指定翻译。 如果您的脚本作为可执行文件运行(例如 ./awesome_shell_script) 加上 shebang 行,那么 shell 将调用 可执行文件(通常是解释器)位于 path/to/interpreter运行你的 脚本。 如果您的脚本作为参数传递给解释器,例如 bash awesome_shell_script,那么 shebang 没有效果并且 bash会处理 脚本的执行。 为什么这很重要? shebang 可以被认为是一个有用的部分 执行脚本的关注 如何 元数据传递了用户 给程序的作者。 awesome_shell_script可能是一个 bash脚本,一个 python脚本,一个 ruby脚本等。这个想法是只有脚本的 对于调用的用户来说,行为而不是其实现细节应该重要。

您可能已经看到过一些变体 #!/bin/sh。 虽然最初参考的是 现代系统上的 Bourne shell sh已经提到了 Shell Command Language ,这是一个具有多种实现的 POSIX 规范。 sh通常符号链接到这些符合 POSIX 标准的 shell 之一 实现 Shell 命令语言。 以 Debian 为例, sh是 符号链接到 shell dash。 重要的是要注意 bash不 **_** 遵守这个标准,虽然运行 bash作为 bash --posix做到了 更合规。

管道

我们可以使用 |字符将多个命令链接在一行中。 例如: command1 | command2 将传递的输出 command1作为输入 command2。 我们可以根据需要多次重复此操作。

循环使用 for

Bash 可以使用 for 循环对多个对象重复操作。 语法如下:

1
2
3
4
5
for VARIABLE in LIST; do

CONSEQUENT-COMMANDS

done

缩进不是必需的,但使代码更易于阅读。 这 LIST可以是包含多个文件的目录,也可以是包含多行 init 的文件、文件列表( file1 file2 file3),甚至是一系列数字( {start..end}).

有用的命令

一些对于完成实验可能有用的命令。 当然,解决问题的方法有很多,并不需要使用这些命令。

cat

cat 打印 将文件 到标准输出 。 对于打印一些内容以通过管道输入其他命令非常有用!

cut

cut [options] [filename]提取文件的某些部分(或管道输入) 参数 根据使用的 。 一些可能有用的:

-d允许我们更改分隔符,或更改字符 cut寻找将字符串分成块。 如果省略该选项, tab用来。

-f允许我们指定与要返回的字段对应的数字,例如 cut -f1 -d" "将返回句子中的第一个单词。 数字后跟一个 -也返回指定字段之后的所有字段,因此 cut -f1- -d" "将返回整个字符串。

--complement告诉 cut返回除 之外的所有内容。 指定字段

grep

grep [pattern] [filename] 过滤 并返回文件(或管道输入)中包含指定模式的行。

sed

sed可以做 很多事情 ,比如编辑字符串和匹配正则表达式。 我们可以用 sed将一种模式替换为另一种模式,如下所示:

sed 's/<PATTERN-TO-REPLACE>/<NEW-PATTERN>/g <INPUT>'

sed` 还可以从其他东西获取管道输入,而不是显式输入。

g最后告诉 sed替换所有出现的模式; 如果我们只想替换模式的第一次出现,则可以省略它,或者用数字替换以仅替换一定次数的出现。

xargs

xargs让我们将命令应用于从管道重定向的输出。 例如, output | xargs command会适用 commandoutput。 一些有用的 选项

-n1告诉 xargs将命令应用到中的每个项目 output如果输出中有多个项目(例如多个字符串的列表),则一次

-0告诉 xargs用空字符(表示字符串的结尾)分割输出中的项目,而不是使用空格。 搭配 -n1, 这意味着 xargs会将命令应用于每个字符串,而不是将字符串分解为单个单词并将命令应用于每个单词。

与往常一样,有更多方法可以使用这些命令,因此请使用 Google 或 手册页 来了解更多信息

语法

Shell 变量和类型

与大多数其他编程语言一样, bash促进有状态分配 名称到值作为变量。

变量可以被赋值 bash语法如下: NAME=value。 请注意 赋值运算符之间缺少空格 =及其操作数。 任务 对空格敏感。

您可以通过在前面添加一个来检索变量的值 $以它的名字。 获取值 NAME必须完成 $NAME。 这就是所谓的变量 插值。

1
2
3
4
5
6
7
8
$ NAME = "Tux" # Incorrect
-bash: NAME: command not found
$ NAME="Tux" # Correct
$ echo NAME # Incorrect. We want the value we assigned to NAME, not the text
# NAME itself.
NAME
$ echo $NAME # Correct
Tux

$?保存最近执行的命令的退出代码。 在这个 上下文、退出代码 0一般表示程序已经执行 成功地。 其他 退出代码 指的是错误的性质 导致程序失败。

特殊 位置参数 允许将参数传递到脚本中。 $0是脚本的名称, $1是传递给的第一个参数 脚本, $2是传递给脚本的第二个参数, $3是第三个 论证等 $#给出传递给脚本的参数数量。

所以 ./awesome_shell_script foo bar可以访问 foo$1bar$2.

Bash 变量是 无类型的 。 它们通常被视为文本(字符串),但是 如果变量包含数字和算术运算,则可以将其视为数字 对其应用操作。 请注意,这与大多数编程不同 语言。 变量 本身没有类型,但 运算符 会处理 在不同的环境下他们的价值观也不同。 换句话说, bash变量是文本,没有任何固有的行为或属性 可以操作的文本,但操作员会解释该文本 根据其内容(数字或无数字?)和上下文 表达。

算术

Bash 支持整数算术 let内置。

1
2
3
4
5
6
$ x=1+1
$ echo $x # Incorrect. We wanted 2, not the text 1+1.
1+1
$ let x=1+1
$ echo $x # Correct
2

注意 let对空格敏感。 操作数和运算符不得 用空格分隔。

bash本身不支持浮点运算,所以我们必须依赖 如果我们想处理十进制数字,请使用外部实用程序。 一个常见的选择 这是 bc。 有趣的事实: bc实际上是它自己的完整语言!

我们经常访问 bc通过 管道 (表示为 |),这允许 将一个命令的输出用作另一命令的输入。 我们包括 -l 选项 bc为了启用浮点运算。

1
2
$ echo 1/2 | bc -l
.50000000000000000000

test

Bash 脚本经常使用 [(同义词为 test) shell 内置的 表达式的条件评估。 test计算一个表达式并 以任一状态代码退出 0(true) 或状态代码 1(错误的)。

test支持常见的字符串和数字运算符,以及许多 额外的二元和一元运算符在大多数情况下没有直接类似物 其他编程语言。 您可以看到这些运算符的列表,以及 其他有用的信息,通过输入 help test在你的壳里。 的输出 如下所示。 注意 help类似于 man,除非它用于 bash 函数而不是其他程序。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
$ help test
test: test [expr]
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR. Expressions may be unary or binary. Unary
expressions are often used to examine the status of a file. There
are string operators as well, and numeric comparison operators.

File operators:

-a FILE True if file exists.
-b FILE True if file is block special.
-c FILE True if file is character special.
-d FILE True if file is a directory.
-e FILE True if file exists.
-f FILE True if file exists and is a regular file.
-g FILE True if file is set-group-id.
-h FILE True if file is a symbolic link.
-L FILE True if file is a symbolic link.
-k FILE True if file has its `sticky' bit set.
-p FILE True if file is a named pipe.
-r FILE True if file is readable by you.
-s FILE True if file exists and is not empty.
-S FILE True if file is a socket.
-t FD True if FD is opened on a terminal.
-u FILE True if the file is set-user-id.
-w FILE True if the file is writable by you.
-x FILE True if the file is executable by you.
-O FILE True if the file is effectively owned by you.
-G FILE True if the file is effectively owned by your group.
-N FILE True if the file has been modified since it was last
read.

FILE1 -nt FILE2 True if file1 is newer than file2 (according to
modification date).

FILE1 -ot FILE2 True if file1 is older than file2.

FILE1 -ef FILE2 True if file1 is a hard link to file2.

String operators:

-z STRING True if string is empty.

-n STRING
STRING True if string is not empty.

STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.

Other operators:

-o OPTION True if the shell option OPTION is enabled.
! EXPR True if expr is false.
EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.

arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne,
-lt, -le, -gt, or -ge.

Arithmetic binary operators return true if ARG1 is equal, not-equal,
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
than ARG2.

我们可以测试整数相等

1
2
3
4
$ [ 0 -eq 0 ]; echo $? # exit code 0 means true
0
$ [ 0 -eq 1 ]; echo $? # exit code 1 means false
1

字符串相等

1
2
3
4
$ [ zero = zero ]; echo $? # exit code 0 means true
0
$ [ zero = one ]; echo $? # exit code 1 means false
1

以及您可以自由进行的许多其他字符串和数字运算 探索。

控制结构

bash包括大多数编程语言典型的控制结构 – if-then-elif-else, while for-in等等。您可以阅读更多有关 条件语句迭代 中的 Bash 指南 初学者 Linux 文档项目 (LDP) 的 。 我们鼓励您 请阅读这些部分,因为本指南仅提供了一些内容的简短摘要 重要特征。

if-then-elif-else

if 语句的一般形式 bash

1
2
3
4
5
6
7
8
9
10
11
12
13
if TEST-COMMANDS; then

CONSEQUENT-COMMANDS

elif MORE-TEST-COMMANDS; then

MORE-CONSEQUENT-COMMANDS

else

ALTERNATE-CONSEQUENT-COMMANDS;

fi

缩进是一种很好的做法,但不是必需的。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

if [ $1 -eq $2 ]; then
echo args are equal
else
echo args are not equal
fi

我们看

1
2
3
4
$ ./awesome_shell_script 0 0
args are equal
$ ./awesome_shell_script 0 1
args are not equal

尽管

while 循环的一般形式 bash

1
2
3
4
5
while TEST-COMMANDS; do

CONSEQUENT-COMMANDS

done

如果 TEST-COMMANDS退出并带有状态码 0, CONSEQUENT-COMMANDS将要 执行。 这些步骤将重复,直到 TEST-COMMANDS退出时带有一些非零值 地位。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

n=$1
while [ $n -gt 0 ]; do
echo $n
let n=$n-1
done

我们看

1
2
3
4
5
6
$ ./awesome_shell_script 5
5
4
3
2
1

函数

bash supports functions, albeit in a crippled form relative to many other languages. Some notable differences include:

功能于 bash定义为

1
2
3
4
5
name_of_function() {

FUNCTION_BODY

}

并由

1
name_of_function $arg1 $arg2 ... $argN

请注意函数签名中缺少参数。 参数在 bash 函数的处理方式与全局位置参数类似,其中 $1 含有 $arg1, $2含有 $arg2, ETC。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

foo() {
echo hello $1
}

foo $1

我们看

1
2
$ ./awesome_shell_script world
hello world

实例

斐波那契

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
#!/bin/bash
# contents of fibonacci

if [ $# -eq 0 ]; then
echo "fibonacci needs an argument"
exit 1
fi

fib() {
N="$1"
if [ -z "${N##*[!0-9]*}" ]; then
echo "fibonacci only makes sense for nonnegative integers"
exit 1
fi

if [ "$N" -eq 0 ]; then
echo 0
elif [ "$N" -eq 1 ]; then
echo 1
else
echo $(($(fib $((N-2))) + $(fib $((N-1)))))
fi
}

fib "$1"
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
read -p “send: ” FOO
# enter “hi”
echo “sent: $FOO”
sent: hi

FOO=$(expr 1 + 1)
echo “$FOO”
2

-eq ==
-ne !=
-gt >
-ge >=
-lt <
-le <=

test zero = zero; echo $?
0 # 0 means true
test zero = one; echo $?
1 # 1 means false

if [ “$1” -eq 69 ];
then
echo “nice”
elif [ “$1” -eq 42 ];
then
echo “the answer!”
else
echo “wat r numbers”
fi

read -p "are you 21?" ANSWER
case "$ANSWER" in
“yes”)
echo "i give u cookie";;
“no”)
echo "thats illegal";;
“are you?”)
echo “lets not”;;
*)
echo "please answer"
esac

NAMES="a b c d"
for NAME in $NAMES
do
echo "Hello $NAME"
done

while true
do
echo "Hello $NAME"
done

Bash 支持整数算术 let内置的。

1
2
3
4
5
6
$ x=1+1
$ echo $x # Incorrect. We wanted 2, not the text 1+1.
1+1
$ let x=1+1
$ echo $x # Correct
2

注意 let对空格敏感。 操作数和运算符不得 用空格分隔。 test计算一个表达式并 以任一状态代码退出 0(true) 或状态代码 1(错误的)

bash支持函数,尽管相对于许多其他函数而言,其形式有缺陷 语言。 一些显着的差异包括:

请注意函数签名中缺少参数。 参数在 bash 函数的处理方式与全局位置参数类似,其中 $1 含有 $arg1, $2含有 $arg2, ETC。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

foo() {
echo hello $1
}

foo $1

我们看

1
2
$ ./awesome_shell_script world
hello world

shell命令

SSH(安全外壳)

SSH 允许您通过互联网登录远程计算机。 这相当于在远程计算机上打开 shell。

用法是 ssh [remote username]@[remote host].

问题

  1. 登录到 tsunami.ocf.berkeley.edu使用您的 OCF 用户名和密码。 有一个文件在 ~staff/public_html/decal。 打开它。 文件中到底隐藏着什么秘密?

管道和重定向

将命令链接在一起对于自动化 shell 操作至关重要。 这是一个快速备忘单:

>:将 标准 输出重定向到文件(将覆盖该文件)。

>>:将标准输出附加到文件(与 >除非不覆盖)。

<:从文件中读取输入。

|:将一个程序的输出发送到下一个程序的输入。

下面是一个示例:假设您正在参加一门课程,需要您提交一个包含您的 SID 的文本文件。 您的第一反应可能是打开一个文本编辑器(例如 vim)并简单地输入它,但是有一种更快的方法来创建文件! 这里是:

echo '123456789' > sid.txt

tmux

为什么是 tmux?

入门

包管理

Debian:简介 aptdpkg

在本课程中,我们将重点关注 Debian 的使用。 正如本周讲座中提到的,Debian 使用 apt/dpkg 作为其包管理器。 其他发行版使用不同的包管理器。

apt

Debian 的前端包管理器是 apt。 大多数时候,当您需要与包管理器打交道时, apt通常是要走的路。 在做任何事情之前 apt,更新包列表通常是一个好习惯,以便包管理器可以找到并获取各种包的最新版本。 为此,您可以运行:

apt update

要查找要安装的包:

apt search [package|description]

要安装包:

apt install [package]

要删除包:

apt remove [package]

使用安装的软件包一段时间后,您可能会注意到它们不会自动更新,这一功能可能存在于为其他操作系统编写的程序中。 要更新已安装的软件包,请运行:

apt upgrade或有时 apt dist-upgrade

使用起来比较普遍 apt upgrade更新你的包,但有时你需要使用 apt dist-upgrade。 阅读有关两者之间差异的更多信息 您可以在此处

在某些情况下,您希望完全确定要安装的软件包的版本。 要列出可以安装的潜在版本,您可以运行:

apt policy [package]

这根据其引脚优先级列出了要安装的候选版本以及与系统兼容的其他版本。 要安装特定目标版本的 aa 版本,您可以运行:

apt -t [targetrelease] install [package]

还有其他命令可以删除不需要的依赖项并清除包,但这就是 man页面是为了。 请注意,您将必须使用 sudo对于上述命令,因为您实际上是在修改系统本身。

dpkg

后端包管理器是 dpkg。 传统上, dpkg用于安装本地软件包。 使用 dpkg,您还可以检查软件包并修复损坏的安装。 要安装本地软件包,请运行:

dpkg -i [packagefilename]

删除系统包:

dpkg --remove [package]

要检查包以获取有关该包的更多信息:

dpkg -I [packagefilename]

要修复/配置所有已解压但未完成的安装:

dpkg --configure -a

入门

创建一个简单的包

现在,我们将使用您将在接下来的步骤中创建的 hellopenguin 可执行文件创建一个简单的包。 首先,移至您在入门部分克隆的存储库中的 a2 文件夹:

cd decal-labs/a2

现在我们将创建一个文件夹来进行此练习:

mkdir ex1

现在进入该文件夹:

cd ex1

编写和编译程序

现在,我们将用 C 语言制作一个非常简单的应用程序,打印“Hello Penguin!” 名为地狱企鹅。 调用:

touch hellopenguin.c

这将创建一个名为的空文件 hellopenguin.c。 现在,使用您选择的首选文本编辑器,例如 vim, emacs, 或者 nano,将以下代码插入 hellopenguin.c

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()

{

printf("Hello Penguin!\n");

return 0;

}

我们现在将编译您刚刚编写的源文件:

gcc hellopenguin.c -o hellopenguin

其作用是获取源文件 hellopenguin.c并将其编译为名为的可执行文件 hellopenguin-o输出标志。

打包可执行文件

现在,我们将创建可执行文件所在的文件夹结构。在 Debian 中,用户级包通常驻留在该文件夹中 /usr/bin/:

mkdir -p packpenguin/usr/bin

现在移动你编译的 hellopenguin可执行到 packpenguin/usr/bin/文件夹。

mv hellopenguin packpenguin/usr/bin/

现在我们将创建一个名为 hellopenguin。 移动到父目录 packpenguin文件夹并调用以下命令:

fpm -s dir -t deb -n hellopenguin -v 1.0~ocf1 -C packpenguin

这指定您要使用目录 -s标志,并输出 .deb包使用 -t旗帜。 它接受一个名为的目录 packpenguin, 使用 -C标志,并输出 .deb文件名为 hellopenguin, 使用 -n,版本号为 1.0~ocf1, 使用 -v旗帜。

现在通过调用 apt 并安装它来测试它:

sudo dpkg -i ./hellopenguin_1.0~ocf1_amd64.deb

现在你应该能够运行 hellopenguin通过执行以下操作:

hellopenguin

计算机网络

概述

不可否认,互联网是一个重新定义了我们世界的重要系统。 开发网络和允许设备通信的能力对于现代计算机系统至关重要。 本实验将研究计算机网络的基础知识,然后从系统管理员的角度检查网络。

我们将使用网页浏览作为类比来了解网络的基础知识。 当我上网浏览猫的图片时到底会发生什么?

但首先让我们简要了解一下网络的细节。


硬件地址mac

媒体访问控制 (MAC) 地址是唯一分配给网络接口的标识符。 所有文字

由于 MAC 地址是唯一的,因此通常称为物理地址。 八位位组通常以十六进制书写并用冒号分隔。 MAC 地址示例是 00:14:22:01:23:45。 请注意,前 3 个八位位组指的是组织唯一标识符 (OUI),它可以帮助识别制造商。 有趣的事实—— 00:14:22以上是 Dell 的 OUI。

ip

IP 地址是识别根据互联网协议连接到网络的设备的方法。 互联网协议有两个版本:IPv4 和 IPv6,它们的地址大小不同。 IPv6 地址示例是 2001:0db8:85a3:0000:0000:8a2e:0370:7334它比 IPv4 地址长得多,例如 127.0.0.1。 由于时间关系,我们只讨论 IPv4,但 IPv6 确实正在取得进展,值得一试!

IPv4 地址为 32 位,即 4 个字节,每个字节由点 (.) 分隔。 IPv4 地址示例是 127.0.0.1。 巧合的是,这个地址被称为环回地址,它映射到您自己机器上的环回接口。 这允许网络应用程序在同一台计算机(在本例中是您的计算机)上运行时相互通信。 但为什么 127.0.0.1并不是 127.0.0.0或者 127.0.0.2?

答案是 127.0.0.1是简单的约定,但从技术上讲,网络块中的任何地址 127.0.0.0/8是一个有效的环回地址。 但网络块到底是什么?

在 IPv4 中,我们可以将地址块划分为子网。 这是以 CIDR 格式编写的。 我们以上面的子网为例 127.0.0.0/8。 斜杠后面的数字 ( /),在本例中为 8,是子网掩码。 这表示网络地址中有多少位,其余位标识网络内的主机。 在这种情况下,网络地址是 127.0.0.0面具是 255.0.0.0。 所以 127.0.0.1将是第一个主机 127.0.0.0/8网络等等。

该图提供了 CIDR 寻址的可视化细分 所有文字

ARP

地址解析协议 (ARP) 是用于将 IP 地址解析为 MAC 地址的协议。 为了理解ARP,我们首先讨论发送帧的两种方式,单播和广播。 在第 2 层上下文中,单播帧意味着将该帧发送到一个 MAC 地址。 另一方面,通过将帧发送到广播地址来广播帧意味着该帧应该发送到网络上的每个设备,从而有效地“淹没”本地网络。

例如,让我们想象一个发送者 A,他有 MAC 00:DE:AD:BE:EF:00,广播一条消息,本质上是询问“谁拥有 IP 地址 42.42.42.42请在 00:DE:AD:BE:EF:00 告诉 A”。

如果一台机器B,有MAC 12:34:56:78:9a:bc有IP地址 42.42.42.42他们向发件人发送单播回复,其中包含以下信息“ 12:34:56:78:9a:bc42.42.42.42”。 发送方将此信息存储在 arp 表中,因此每当它收到发往机器 B 的数据包时,即目标 IP 地址为 42.42.42.42它将数据包发送到从 B 收到的 MAC。

为了路由 IP 数据包,设备具有所谓的路由表。 路由条目存储在路由表中,它们本质上是告诉设备应如何基于 IP 转发数据包的规则。 路由条目指定子网以及与该条目对应的接口。 设备选择具有最特定于给定数据包的子网的条目,并将其转发出该条目上的接口。

路由表通常也有一个默认网关。 在没有更具体的匹配条目的情况下,这将用作数据包的默认捕获所有内容。

以此路由表为例。

1
2
3
4
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.0.2.128/25 dev eth0 proto kernel scope link src 10.0.2.15
192.168.162.0/24 dev eth1 proto kernel scope link src 192.168.162.162

一个数据包的目的地是 8.8.8.8将从默认网关 eth0 转发出去。 一个数据包的目的地是 10.0.2.1将根据第二个条目从 eth0 转发。 一个数据包的目的地是 10.0.2.254将根据第三个条目从 eth0 转发。 一个数据包的目的地是 192.168.162.254将根据第四个条目从 eth1 转发。

域名

我们已经讨论了 IP 地址以及它们如何通过 IP 与主机进行通信,但是虽然 IP 地址是机器友好的(计算机喜欢数字),但它们并不完全是人类友好的。 记住电话号码已经够难了,记住 32 位 IP 地址也不会更容易。

但我们更容易记住 <www.google.com、www.facebook.com> 或 Coolmath-games.com 等名称。 因此,在这种冲突中,域名系统 (DNS) 诞生了,它是机器友好的 IP 地址和人类友好的域名之间的折衷方案。

DNS 是一个将 google.com 等域名映射到 172.217.6.78。 当您查询 google.com 时,您的计算机会将 google.com 的 DNS 查询发送到 DNS 服务器。 假设配置正确并且 google.com 有一个有效的对应地址,您将收到来自权威服务器的响应,其实质上是“google.com 有 IP 地址” x.x.x.x”.

现在让我们稍微消除一下这个黑魔法……

DNS 记录

DNS 服务器以资源记录 (RR) 的形式存储数据。 资源记录本质上是(名称、值、类型、TTL)的元组。 虽然 DNS 记录的类型多种多样,但我们最关心的是

  1. 一条记录 名称 = 主机名 值 = IP 地址

    该记录非常简单,包含给定主机名的 IP 地址,本质上是我们最终想要得到的信息。

  2. 国民服役记录 名称=域名 值 = 域的 DNS 服务器名称

    该记录指向另一个可以为该域提供权威答案的 DNS 服务器。 将此视为将您重定向到另一个名称服务器。

  3. CNAME 记录 名称 = 别名 值=规范名称

    这些记录指向给定别名的规范名称,例如 docs.google.com 将是一个仅指向 document.google.com 的别名 尝试 <www.facebook.com>

  4. MX记录 邮件服务使用的记录。

TCP 和 UDP

现在我们将讨论传输层的协议。 这一层最著名的两个协议是传输控制协议(TCP)和用户数据报协议(UDP)。

TCP 是一种面向有状态流的协议,可确保可靠的传输。 可靠的传输本质上保证信息完整且有序地到达目的地。

TCP 是面向连接的协议,这意味着它在发送任何数据之前必须首先建立连接。 此连接交换信息,这是 TCP 用于在其他功能中提供可靠传输的机制。 TCP 连接以 TCP 握手开始。

TCP 握手包括在发送方和接收方之间交换的数据包的 TCP 标头中设置某些标志。 发送方首先发送 SYN(设置了 SYN 标志的数据包)来启动 TCP 连接。 服务器通过发回 SYN-ACK(一个同时设置了 SYN 和 ACK 标志的数据包)来确认此连接请求。 客户端通过向服务器发送一个最终 ACK 来确认这一点,然后建立连接。

TCP 然后开始传输数据,如果数据成功到达连接的另一端,则会发出 ACK。 因此,如果数据丢失、重新排序或损坏,TCP 能够识别这一点并发送重传任何丢失数据的请求。

TCP 也有一个关闭连接的过程。 我们在这里只考虑优雅终止,突然终止有不同的过程,我们不会讨论。 如果您有兴趣,CS168 这里 有一些很棒的材料。 假设机器 A 想关闭与机器 B 的连接。

A 首先发送 FIN。 B 必须通过发送 FIN 和 ACK 进行响应。 如果 B 仅发送 ACK,则连接将持续存在,并且可以发送其他数据,直到发送 FIN。 另一方面,如果 B 准备好关闭连接并且不需要发送额外的数据,则 B 也可以只发送一个同时设置了 FIN 和 ACK 标志的数据包,即 FIN+ACK。发送最后一个 ACK​​ 来表示连接终止。

UDP是无状态无连接协议。 UDP 专注于以数据报的形式发送消息。 无连接 UDP 也不会产生 TCP 握手和终止的开销。 UDP 也不保证可靠传输,因此消息可能会损坏、无序到达或根本不到达。 因此,UDP 有时被称为不可靠数据报协议。

虽然 UDP 不保证可靠传输,但它不会像 TCP 那样遭受建立和关闭连接的开销。 因此,UDP 非常适合我们只想快速发送数据包并且丢失一些数据包也不会造成灾难性后果的使用情况。

此外,与 TCP 相比,发送的每个 UDP 数据报都需要单独接收。 而对于 TCP,您传递的数据流被透明地分成一定数量的发送,并且数据流在另一端透明地重建为一个整体。

端口

广义上讲,端口定义了服务端点——端口标记了流量的入口和出口点。 IP 地址连接主机,而端口则连接在此类主机上运行的进程。 一次只能将一个进程绑定到一个端口。 端口由 16 位数字表示,范围从 0 到 65535。从 0 到 1023 的端口是众所周知的端口,即系统端口。 使用这些端口通常有更严格的要求。 1024 到 49151 是注册端口。 官方 列表 IANA 维护着知名和注册范围的 。 从 49152 到 65535 的其余端口是临时端口,可以根据每个请求动态分配给通信会话。

systemd unit

unit的介绍和写法 Linux 发行版越来越多地采用 systemd初始化系统。 这套功能强大的软件可以管理服务器的许多方面,从服务到安装的设备和系统状态。

systemd, A unit指系统知道如何操作和管理的任何资源。 这是主要对象 systemd工具知道如何处理。 这些资源是使用称为单元文件的配置文件定义的。

单位是对象 systemd知道如何管理。 这些基本上是系统资源的标准化表示,可以由守护程序套件管理并由提供的实用程序操作。

单元可以说类似于其他 init 系统中的服务或作业。 然而,单元具有更广泛的定义,因为它们可用于抽象服务、网络资源、设备、文件系统挂载和隔离资源池。 系统的单元文件副本一般保存在 /lib/systemd/system目录。 当软件在系统上安装单元文件时,这是它们默认放置的位置。

存储在此处的单元文件可以在会话期间按需启动和停止。 这将是通用的普通单元文件,通常由上游项目的维护人员编写,应该适用于部署的任何系统 systemd在其标准实施中。 您不应编辑此目录中的文件。 相反,如果有必要,您应该使用另一个单元文件位置来覆盖该文件,该位置将取代该位置中的文件。 正确的方法是创建一个以单元文件命名的目录 .d附加在最后。 所以对于一个叫做 example.service,一个名为 example.service.d可以被创建。 在此目录中,有一个以以下结尾的文件 .conf可用于覆盖或扩展系统单元文件的属性。

大多数单元文件中的第一部分是 [Unit]部分。 这通常用于定义单元的元数据并配置单元与其他单元的关系。

尽管部分顺序并不重要 systemd解析文件时,此部分通常放置在顶部,因为它提供了单元的概述。 您可以在以下位置找到一些常见指令 [Unit]部分是:

安全管理

加密与解密

基础知识

加密采用明文和密钥,返回密文。 解密需要密文和密钥,仅当解密密钥有效时才恢复并返回原始明文。 加密和解密的密钥是由随机位组成的长字符串,这使得攻击者在计算上无法猜测密钥并解密密文。

一切 安全性是指在面对攻击时保持系统按预期运行 这可以采取多种形式:

  1. 保密性
  2. 完整性/真实性
  3. 可用性

模块:

  1. 认证
  2. 加密:防止攻击者读取您的文件,直到它们得到 联邦调查局和他们的密码学家参与其中
  3. 哈希:将大数据转化为小数据
  4. 签名和证书:确保您就是您所说的人 假设我想使用你的公钥来验证你的身份。 我 可以用它加密一些东西,并要求你解密它并且 显示正确的值。 如果您可以解密该值,那么您必须拥有密钥的私有部分并且可以进行身份​​验证。 假设你想证明你发送的消息实际上是由您发送。 您可以使用您的私钥来“签署”消息通过对其进行加密,您的公钥可用于解密签名以验证您(由您发布的公开信息识别)键)实际上确实发送了消息,因为只有您而不是其他人对手将拥有相应的私钥。 根证书:操作系统包含许多根证书 这是网络信任的基础。 证书是在通向根的链中签名; 如果链有效,则最后的 cert 被认为是可信的。

网络攻击: 攻击网络系统的方法有很多: 窃听、中间人、拒绝服务、应用程序 缓冲区/堆溢出、SQL 注入等漏洞 目录遍历、CSRF、SSRF、XSS、蠕虫、rootkit、垃圾邮件、加密挖矿、勒索软件、网络钓鱼等等……

对称密码学

在对称密码学中,用于加密和解密的密钥是相同的。

尝试一下:

  1. gpg --symmetric [FILE]在任何文件上输出 [FILE].gpg文件是输入文件的加密版本。 加密文件时需要输入密码。
  2. gpg --decrypt [FILE].gpg在原始文件的加密版本上,您需要输入原始密码。

在此 GPG 实现中,文件的加密和解密都需要知道单个密码,在本例中该密码充当对称密钥。

非对称密码学

在非对称加密中,两个单独的密钥分别用于加密和解密。 这两个密钥是一对公私密钥。 公钥是公开的并用于加密数据。 而私钥由所有者保密并用于解密数据。 使用公钥加密文件意味着只有拥有相应私钥的人才能解密生成的加密文件。

GPG 钥匙圈抽象

GPG 使用“密钥环”作为集中位置来保存用户的所有密钥。 如果您想使用并保留它,则需要向密钥环添加/导入密钥。 同样,如果您希望与其他人共享密钥,您可以导出您的密钥(这会生成您的密钥的副本)并让他们将其导入到他们的密钥环中。

尝试一下:

  1. gpg --full-generate-key生成 GPG 公私密钥对。 它会要求输入密码。 如果您的机器需要一段时间才能生成密钥,则可能是由于缺乏长随机密钥所需的熵(随机性)。 sudo apt-get install haveged将安装一个生成熵的守护进程。
  2. gpg --recipient [RECIPIENT] --encrypt [FILE]这将加密 [FILE][RECIPIENT]的公钥(目前,尝试使用您自己的公钥加密文件)。
  3. gpg --decrypt [FILE].gpg将搜索您的密钥环并使用适当的私钥解密文件(当然,如果您拥有正确的私钥)。 您无需指定使用哪个密钥来解密文件,因为 GPG 加密的文件和密钥包含元数据,允许 GPG 从密钥环中选择正确的密钥来解密文件。

签名

公钥加密、私钥解密的非对称方案也可以反过来实现数字签名,其作用相当于物理签名。 在这个相反的方案中,私钥用于对文件进行签名,从而在该文件上生成签名。 并使用相应的公钥来验证签名。 因此,只有拥有私钥的人才能生成签名,但拥有相应公钥的任何人都可以验证该签名。

UNIX 权限模型有 3 个组成部分:授予文件的 (1) 所有者用户、(2) 所有者组和 (3) 其他人/其他所有人的权限。 权限本身有 3 个子组件:(1) 读取、(2) 写入和 (3) 执行,强制执行读取、写入或执行文件的能力。

gpg

  1. 解密b8/file1.txt.gpg:
1
gpg --decrypt b8/file1.txt.gpg 
  1. 输入密码ocfdecal后,解密内容为: mYp@sw0rd2. 导入密钥的命令是:
1
gpg --import {key_file}
  1. 将密钥导出到文件的命令:
1
gpg --export --armor {key_id} > {output_file}
  1. 查看钥匙圈所有钥匙的命令:
1
gpg --list-keys
  1. 使用私钥b8/lab8privkey解密b8/file2.txt.gpg:
1
2
gpg --import ./lab8privkey
gpg --decrypt ./file2.txt.gpg

hash

  1. sha1sum [FILE]获取 SHA1 哈希值 [FILE].
  2. md5sum [FILE]获取 MD5 哈希值 [FILE].

安全系统

威胁模型

设计安全系统时要记住的最重要的事情是 了解您的威胁模型。 没有系统能够保证安全或能够 能够抵挡所有的攻击,甚至在极端的情况下也是不可能的。 对手。 但是,您可以(并且应该)针对威胁采取预防措施 你很可能会面临。 平衡授权用户访问的需求 在将未经授权的用户拒之门外的情况下,很容易出错。 幸运的是,聪明人已经将安全原则提炼为 中得到了很好的 第一个讲义 一些公理,在CS 161 的 介绍 (归功于大卫·瓦格纳教授)。 建议阅读讲义。

构建威胁模型时,请记住以下问题:

  1. 你在保护什么?
  2. 谁是你的对手?
  3. 您需要保护它的可能性有多大?
  4. 如果不加以保护,会产生什么后果?
  5. 您应该投入多少资源来保护它?

加密解密

对称密钥加密几乎对所有事物都有用,尤其是属于以下类别的事物:

作为示例,我们来探讨一下 iPhone 如何使用加密来保证数据安全:

  1. iPhone 的内部存储使用一组 AES 密钥进行加密,这些密钥存储在手机内部芯片上,并在工厂生成。
  2. 这些密钥又使用您的 PIN 进行加密。 您的 PIN 码允许手机解锁密钥,从而解密文件系统的其余部分。

与对称密钥加密不同,公钥加密中有 2 个密钥 ,密码系统由公钥私钥组成 。 顾名思义, 公钥是公开共享的,这是其他人可以使用的方式 加密适合您的数据。 您使用您的私钥来解密此内容 数据。 只要没有人拥有你的私钥,任何人都可以使用你的公钥 加密数据并确保只有您可以解密它。 这是一个强大的 对称密钥范式的扩展,除了加密之外,它还允许 签名和不可否认性 公钥密码学与 RSA 算法 同义, 是最早经过验证的双密钥方案之一。 RSA 公钥加密工作原理的简要概述

  1. RSA算法,通过一些高等数学(涉及素数和模数) 算术),返回 3 个数字:一个公共指数(又名密钥),一个私有指数, 和一个模数。 两个密钥的工作方式使得用一个密钥加密的数据只能 可以用另一个密钥解密。
  2. 为了加密数据,需要使用指数和模数之一对数据执行模幂运算。
  3. 为了解密数据,对加密数据进行模幂运算 与合作伙伴密钥和模数。 常用时,使用较大的指数 作为私钥,用于解密数据和创建签名, 较小的指数作为公钥,用于加密数据 并验证签名。 比如:
1
ssh-keygen -t rsa -b 4096

该命令将生成两个文件, ~/.ssh/id_rsa~/.ssh/id_rsa.pub。 正如命令所示,此命令生成 4096 位 RSA 密钥对。 你 应该能够猜测哪个文件代表公钥以及哪个文件必须 因此是私钥。 为了影响安全 SSH 登录,请使用 RSA密钥,用户必须首先将他们想要使用的公钥传输到 提前向服务器表明自己的身份。 然后,一旦会话结束 服务器和客户端之间建立的,服务器会加密一个随机数 号码与用户的公钥并发送给用户。 用户将 然后使用他们的私钥解密该值并返回该值的哈希值 到服务器,然后服务器可以自己散列该值以确定用户是否 能够成功解密随机数,从而表明拥有 匹配的密钥并作为身份验证的证据。

签名和证书

一开始,您 将发布 Natoshi 的公钥,此后,对于您发布的每个帖子,您 将使用您(Natoshi)的私钥对消息内容进行加密,并且 将其与您的原始消息一起发布。 那么,想验证的人 Natoshi(即公钥对应的私钥的所有者 属于 Natoshi)实际上确实发布了一条特定的消息,可以简单地 使用 Natoshi 的公钥解密加密签名并比较 内容与原始消息相反。

Natoshi 王位的觊觎者将是 无法签署他们的虚假声明,以便可以与他们核实 Natoshi 公开了公钥,因为他们没有 Natoshi 的私钥, 您可以放心,没有人会过度影响您的项目 当你躲避 IRS 和 DEA 时,除非他们碰巧有 仓库里装满了 ASIC 和大量廉价电力。

然而,在这个方案中,如何防止对手发布虚假信息 公钥并声称是您? (他们可以对此进行有效签名 假公钥)不知何故,你需要“引导”信任:有人需要 验证您的身份并公开确认您的公钥实际上 对应于你。

我们通过 证书 来做到这一点:签署的声明 声称特定的公钥实际上属于它所声称的人 属于。

谁签署此证书? 一个 证书颁发机构 ,我们的某人 信任负责验证身份和发布签名。

但是我们如何知道要信任哪些 CA,以及我们如何才能信任声称 真正值得信赖的是? 他们可能还需要证书。 它 听起来好像一路下来都是海龟; 然而,链条确实结束了 某处:所谓的信任根,根 CA。 这些 CA 的 证书是由浏览器和操作系统预安装的,因此 本质上受信任,无需任何进一步的证书。 如果根 CA 签署您的证书,我们假设他们已经完成了必要的尽职调查 愿意冒着声誉风险签署您的证书,并且基本上 相信他们的话。 这种模型被称为“ 信任网络” ,是网络如何 今天的安全工作正常进行。

不幸的是,它并不像我们希望的那样可靠: 有些 CA 很卑鄙,只要有足够的钱就会签署任何东西,从而导致有效的 为 microsoft.com 和 github.com 等域颁发的证书 显然不是 Microsoft 或 GitHub 的实体。 1 此外, 任何拥有足够边境控制的实体都可以强制安装自己的 根证书(例如哈萨克斯坦政府 2 ) 并截取 通过为任何域颁发自己的伪造证书来窃取任何流量。

您可能没有意识到,但 您使用并依赖证书和签名 每天。 每当您在网站地址栏附近看到绿色锁时, 访问,您正在通过 TLS 或 HTTPS 连接访问该网站,并且数据 您和网站之间的传输是加密的。 当你的浏览器 连接到网站的服务器,它会按顺序请求服务器的公钥 设置加密连接和服务器证书以便 验证其作为授权为您拥有的域提供服务的服务器的身份 要求。 然后,您的浏览器通过验证公钥来验证公钥 证书上的签名。 如果有人试图执行 对您进行中间人攻击,此证书验证步骤将失败, 因为受信任的 CA 不太可能颁发签名的证书 将您的域名转让给您以外的实体(除非您不幸 居住在哈萨克斯坦)。 您将收到一条非常侵入性的通知 这个事实,忽略证书验证是一个坏主意 失败通知。

怎么为自己的网站设置https加密传输数据 现在您有了一个网站,您决定,作为一个优秀的互联网公民,您 希望保护您的访客免受政府的窥探,通过 设置 HTTPS。 您已经知道您将需要一个公钥和一个 为此,由受信任的根 CA 签署的证书。 你怎么去 关于得到一个? 在互联网上搜索,你发现了一个很棒的项目,名为 Let's Encrypt 提供免费、签名的服务 证书。

文件安全

作为 root用户。 当程序启动时,它会继承其用户 ID 和组 ID 父进程,并保留它们,除非手动删除权限。 如果你 以 root 用户身份启动程序,因为,例如,它需要更深入的 系统访问,程序中的漏洞意味着攻击者可以 以 root 用户身份与您的计算机进行交互。 这是一个常见问题 错误配置的网络服务器,其中服务器以根目录运行 遍历漏洞可能允许攻击者读取秘密凭证 存储在服务器的文件系统上。

这个故事的寓意与最小特权原则紧密相连:无论在哪里 可能的话,只给予尽可能少的许可或特权。 如果 程序不需要 root 凭据,请勿以特权用户身份运行它。 如果 文件包含敏感内容,请勿使其可读。

如何更改权限? 有两个主要命令可以执行此操作: chmodchown. chmod更改文件模式,即权限,以及 其语法示例如下:

1
2
3
4
5
6
7
8
9
10
11
$ ls -la ~/
drwxr-xr-x 3 admin admin 4096 Oct 3 12:38 test
$ chmod 644 test
$ ls -la
drw-r--r-- 3 admin admin 4096 Oct 3 12:38 test
$ chmod u+x test
drwxr--r-- 3 admin admin 4096 Oct 3 12:38 test
$ chmod 000 test
d--------- 3 admin admin 4096 Oct 3 12:38 test
$ chmod +r test
dr--r--r-- 3 admin admin 4096 Oct 3 12:38 test

chmod接受八进制表示法的文件权限,即 下列的:

#读写
7读写
6RW-
5接收
4r–
3-wx
2-在-
1-X
0

pueept

● 流行的配置管理软件 ● 用于配置单个机器 ● 声明性哲学,必要时带有一些命令式组件 ● 最初基于 Ruby 构建,现在拥有自己的配置语言 流程: ● 客户端向服务器请求更新 ○ “我想配置为 Minecraft 服务器” ● 服务器向客户端询问事实列表 ○ “好的,请将您的主机名和 RAM 发送给我” ● 客户用事实回应 ○ “我的主机名是僵尸.ocf.berkeley.edu,我有 4GB RAM” ● 服务器响应配置 ○ “确保 Minecraft 服务器正在运行,主机名为僵尸.ocf.berkeley.edu,4GB RAM, 这个配置文件 ● 客户端进行必要的更改以确保其当前配置与 服务器给出的配置 ○ “minecraft服务器当前正在运行,但配置文件已更新,我将获取 更新后的版本 Puppet是一个配置管理工具,通过Puppet可以实现对大量服务器/主机的集中化、自动化的配置管理。Puppet的工作原理是:

  1. 在Puppet Master服务器上面编写Puppet Manifests(配置文件)。这些文件使用Puppet语言定义了服务器的最终状态。
  2. Puppet Agent安装在被管理的主机上面,它会定期从Puppet Master拉取配置。
  3. Puppet Agent对本地服务器状态进行检查,然后根据Manifests对服务器进行配置,确保服务器状态与预期状态一致。
  4. 如果配置发生变化,Puppet会自动应用这些变化,无需手动操作。
  5. Puppet Agent会定期运行,如果配置失效会再次修正。所以Puppet脚本就是编写Puppet Manifests的文件,它定义了需要配置什么,怎么配置。常见的配置包括:- 安装软件

git

创建一个分支:

1
git checkout -b dice

这使得一个新的本地分支称为 dice基于我们所在的分支机构 目前在( master)并将您切换到 dice分支。 这个命令是 基本上简写为:

1
2
git branch dice       # Create new branch called 'dice'
git checkout dice # Switch to branch called 'dice'

您可以通过键入来查看您创建的分支 git branch。 你应该看到 此时有两个分支,一个称为 master和一个叫 dice。 一个 星号位于您当前签出的分支旁边。 git log查看历史提交。 每个提交都有一些信息,例如提交的作者、 创建提交的时间戳和提交消息。

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
commit adc45cd5110b59f76cefc2b862d0e4d550ccb183 (HEAD -> dice)
Author: thinklive1 <469631989@qq.com>
Date: Thu Oct 12 15:32:35 2023 +0800

Restrict input range for dice iterations and sides

commit a79a770157449a9d2fb1595a0b83ecc99070eabf
Author: thinklive1 <469631989@qq.com>
Date: Thu Oct 12 15:31:56 2023 +0800

Add dice rolling logic and output dice sum and sequence

commit 924d0b1ebf050a043da434114187a290280ec660
Author: thinklive1 <469631989@qq.com>
Date: Thu Oct 12 15:30:45 2023 +0800

Add -s flag for number of sides on a die

commit 3acb62af3eff4a1dbbe875e81ec1485d9d10c44b (origin/master, origin/HEAD, master)
Merge: 4e2aac7 2aefa6c
Author: Ishaan Dham <56564174+Ishaandham19@users.noreply.github.com>
Date: Tue Mar 21 21:39:51 2023 -0700

Merge pull request #34 from 0xcf/demo

Demo

commit 2aefa6c51449ffcd39d945e3d74ce2b5e50acf7f (origin/demo)
Author: Ishaan Dham <ishaandham01@gmail.com>

除了查看提交历史记录之外,您可能还想查看实际的更改 在代码中。 您可以使用 git diff <old commit> <new commit>查看 两次提交之间的差异。

除了查看提交历史记录之外,您可能还想查看实际的更改 在代码中。 您可以使用 git diff <old commit> <new commit>查看 两次提交之间的差异。 有几种不同的方式可以引用 一次提交。 之前提到的一个是复制提交的哈希值(请注意 您的提交哈希值将与下面的示例不同):

1
git diff 3368313c0afb6e306133d604ca72b0287124e8f2 762053064506810dee895219e5b2c2747a202829

您还可以复制提交哈希开头的一小块,而不是 整个哈希。 由于哈希的工作方式,您不太可能 有两个具有完全相同的起始序列的提交。

1
git diff 3368313 7620530

如果你想尝试 diff两个提交非常接近 日志,一种更简单的方法是通过距提交的距离来引用提交 HEAD (最近)使用以下格式提交 HEAD~<number>。 由于我们添加了三个 提交新的提交 dice,我们可以查看之间的差异 dicemaster使用以下命令:

1
git diff HEAD~3 HEAD

有多种方法可以处理合并冲突,但我们将采用的方法 在这个实验室中向您展示正在使用 git rebase。 我们的 dice分支是“基于” 这 master在某个时间点有分支,但是 master分行有 向前离开 dice基于过时的 master。 因此,我们想要 “重新基地” dice就目前的状态而言 master。 当你的 dice分支, 跑步 git rebase master。 Git 将回滚您所做的提交 dice, 复制 任何新的提交 master,并尝试在顶部重放您的提交。 有时 rebase无需您的干预即可运行完成,但是如果 存在合并冲突,您需要解决它。

Git 会告诉你如果遇到合并冲突该怎么办 在变基期间。 在这种情况下,打开 rand.py并找到冲突区域 应具有以下格式:

1
2
3
4
5
<<<<<<< HEAD
Lines of code from the base branch (in this case master)
=======
Lines of code from the branch you're rebasing (in this case dice)
>>>>>>> Commit message of the commit that conflicts with the base branch

要解决冲突,只需保留您想要的行(您的行来自 dice) 和 删除冲突区域中的其他行(

1
`<<<<<<< HEAD`, `=======`, `>>>>>>> dice`

,以及来自 master 的不需要的代码),然后保存并退出 文件。 Git 会将您保存的内容作为文件的确切形式 看起来像在变基结束时,所以你所做的本质上是修复 文件,以便代码正常运行。 这意味着如果您有多个 合并冲突,您决定混合保留基础分支中的一些行 还有一些来自您的功能分支,您需要确保代码确实有效 正确。

现在您已经解决了合并冲突,请按照变基说明进行操作 暂存您的固定文件( git add rand.py),然后运行 git rebase --continue。 如果 Git 发现其他文件有更多合并冲突,您将遵循相同的操作 程序如上。 然而,我们只有一个有冲突的文件,所以我们的变基是 完成的! 跑步 git log查看我们 rebase 的结果。 你现在应该看到了 你想象中的队友 "dice rolling WIP"提交您分支的历史记录, 你的提交高于他们的提交。

docker

安装 Docker wsl2不支持systemctl命令,而是支持systemed命令 所以需要执行如下命令启动docker

1
service docker start

虚拟机 你的电脑里有一台电脑! ● 通过软件模拟抽象物理硬件 ● 虚拟机管理程序运行多个虚拟机 ● 隔离应用:更好的安全性、稳定性 ● 一些开销:需要不同的客户操作系统和模拟 每个应用程序的虚拟硬件数量 ● 需要一些时间来启动

容器 ● 通常与虚拟机进行比较,但更像是捆绑的进程 环境 ● 提供类似的隔离 ○ 然而,比虚拟机要少得多! 出于这个原因,我们仍然经常在虚拟机内运行容器(但是 每个虚拟机可以运行 >1 个容器) ● 启动速度比虚拟机快得多 ● 目标是通过共享代码提供轻量级隔离环境 ● 轻松打包应用程序以实现一致的部署 ● 常见的容器:Docker、rkt、LXC ● 很确定这是加州大学伯克利分校唯一使用的课程

CommandDescription
docker searchSearch Docker Hub for pre-built images
docker pullPull an image or a repository from a registry
docker imagesList images
docker buildBuild an image from a Dockerfile
docker runRun a command in a new container
docker psList containers
docker start/stop/restartStart/stop/restart a container
docker execRun a command in a running container
docker inspectReturn low-level information on Docker objects
docker rmRemove one or more containers
docker rmiRemove one or more images

docker ● 需要构建镜像 ● 通常使用 Dockerfile 来指定 如何构建快照 ● 快照是分层构建的 ○ 像洋葱一样 ○ 允许基于相同的快照层构建速度更快 ● 保持每一层最少化资源

自动化配置管理工具 ● 声明式:说出你想要什么,而不是如何做 ○ 应用程序弄清楚如何 ● 可以定义要安装的应用程序、要包含的文件等 ● 可以在不同“类别”的机器上安装不同的东西 (桌面与服务器) ● 常用工具:Puppet、Ansible、Chef

docker的使用

docker run hello-world

您应该看到一些友好的输出,如下所示:

1
2
3
4
5
6
7
8
9
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

此消息表明您的安装似乎运行正常。 为了生成此消息,Docker 采取了以下步骤:

  1. Docker 客户端联系了 Docker 守护进程。
  2. Docker 守护进程从 Docker Hub 中提取“hello-world”镜像。
  3. Docker 守护进程从该映像创建了一个新容器,该容器运行生成您当前正在读取的输出的可执行文件。
  4. Docker 守护进程将该输出传输到 Docker 客户端,然后将其发送到您的终端。 在容器中默认以root用户身份登录。

以交互方式运行容器。 如果您需要在裸系统上尝试和安装东西而不弄乱当前系统,那么这非常有用。 尝试运行以下命令:

docker run -it ubuntu:latest

-iflag 告诉 docker 保留 STDIN打开你的容器,然后 -t分配一个 伪 TTY flag为您 。 基本上,您需要两者才能在新启动的容器中拥有一个 shell。 尝试安装一些软件包 apt或者只是玩玩。 它看起来应该像一个裸露的 Linux 系统。

使用 CTRL+D 退出容器。 自然的问题是,Docker 镜像是如何构建的? Dockerfile 就像镜像的源代码 相反,Dockerfile允许您通过指定手动键入创建镜像的所有命令来定义镜像。 然后 Docker 可以从指定Dockerfile 构建镜像。 这些 Dockerfile 可以放入版本控制中,并将镜像上传到在线存储库。

Docker可以通过读取来自Dockerfile的指令来自动构建镜像 。 Dockerfile是一个文本文档,其中包含所有命令 用户可以在命令行上调用来构建镜像。 eg.下面是一个 Dockerfile ,通过将 Python 3 和软件包安装到基础 Fedora Linux 映像上

1
2
3
4
5
6
7
8
9
10
11
12
13
# Specify Fedora Linux as base image
FROM fedora:latest

# Install Python with yum (Fedora's Package Manager)
# Install required Python packages
RUN yum update -y && yum install -y python3 python3-pip && \
python3 -m pip install pyfiglet termcolor

# Add the missile.py file to the final image
ADD missile.py /

# Specify the command to be run on container creation
CMD ["/usr/bin/python3", "missile.py"]

docker build -t missile:latest .

这告诉 Docker 在当前目录中查找 Dockerfile,并用该文件构建一个镜像。 这 -tflag 告诉 Docker 使用名称标记此构建 missile:latest

查看系统上正在运行的容器。 使用以下命令:

docker ps

由于您(可能)没有运行任何容器,因此您可能不会看到任何有趣的东西。 但是,如果您传入 -a标志,您还可以看到已停止的容器:

要获取有关容器的更多信息,您可以使用 docker logs命令 获取容器的日志(无论它仍在运行还是已退出):

docker logs <container_id_or_name>

在某些时候,您可能想要清理已退出且不打算再使用的容器:

docker rm <container_id_or_name>

将移除容器。

查看已经下载的镜像: docker images 图像可能会占用计算机上相当多的空间,因此您可能需要清理不打算使用的图像 使用。 如果您收到有关计算机上没有足够磁盘空间的错误,这一点尤其重要:

docker rmi <image_id>

镜像文件以及容器的各种文件系统都存储在 /var/lib/docker

分离容器

容器可以以后台服务的形式运行,这适用于一些后台服务的场合,Docker 支持这种方式 以 -d标志,见 分离 方式启动容器 模式

Docker 为容器创建一个单独的虚拟网络,因此您需要将主机端口转发到您的 容器的端口(这称为 端口转发 或端口映射)。 容器正在侦听端口 80,因此让我们尝试将主机的端口 5050 转发到容器的端口 :

docker run -d -p=5050:80 httpd

-p 接受冒号分隔的一对 HOST_PORT:CONTAINER_PORT

您实际上可以“附加”到正在运行的容器并在其中运行更多命令,类似于 docker run作品。 使用 这 docker exec命令:

docker exec <container_id_or_name> <command>

要停止此容器,请使用 docker stop <container_id_or_name>.

您可以使用以下命令重新启动容器 docker restart <container_id_or_name>.

关于 docker-compose

docker-compose允许您定义需要多个容器才能运行的应用程序。 例如,在网络上 应用程序,您可能希望实际的 Web 应用程序在单个容器内运行,并且数据库在其中运行 一个不同的容器。

通常,您根据 服务 来定义应用程序。 同样,以 Web 应用程序为例,有 两个不同的服务:应用程序本身和支持它的数据库。 docker-compose让您定义不同的服务 在 YAML 文件中并相应地运行服务。

其中一件好事是 docker-compose是它会自动为您的容器设置一个网络,其中:

使用 Docker 官方网站上的说明安装 Docker Compose

一些小脚本

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash



PHONEBOOK_ENTRIES="phonelist.txt"




if [ "$#" -lt 1 ]; then

    exit 1



elif [ "$1" = "new" ]; then

    # YOUR CODE HERE #

    echo $2 $3 >> phonelist.txt



elif [ "$1" = "list" ]; then

    if [ ! -e $PHONEBOOK_ENTRIES ] || [ ! -s $PHONEBOOK_ENTRIES ]; then

        echo "phonebook is empty"

    else

        # YOUR CODE HERE #

        cat phonelist.txt

    fi



elif [ "$1" = "lookup" ]; then

    # YOUR CODE HERE #

    grep $2 phonelist.txt




elif [ "$1" = "remove" ]; then

    # YOUR CODE HERE #

    sed -i "s/$2//g" phonelist.txt




elif [ "$1" = "clear" ]; then

    # YOUR CODE HERE #

    rm phonelist.txt



else

     # YOUR CODE HERE #

     echo nothing

fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

host=$1

ping -c 1 $host >> log.txt

if [ $? -eq 0 ]; then

    echo "OK"

else

    echo "can't access"

fi
1
2
3
4
#1/bin/bash

ip addr show | grep "link/ether" | head -n 1 | cut -d' ' -f 6

]]>
+ Numpy 是 Python 中科学计算的核心库。 它提供了高性能的多维数组对象以及使用这些对象的工具 数组。

数组

numpy 数组是一个值网格,所有值都具有相同的类型,并由非负整数组成的元组索引。 它的维度就是数组的秩 ;它的shape就是每个维度的大小组成的元组

1
2
3
b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape) # Prints "(2, 3)"
print(b[0, 0], b[0, 1], b[1, 0]) # Prints "1 2 4"

官方数组创建教程 ds100的numpy教程 cs231n的python numpy教程

创建数组的方法

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
>>>np.array([[1.,2.], [3.,4.]])

array([[ 1., 2.],
[ 3., 4.]])

>>>np.array([x for x in range(5)])

array([0, 1, 2, 3, 4])

>>>np.array([["A", "matrix"], ["of", "words."]])

array([['A', 'matrix'],
['of', 'words.']],
dtype='<U6')

>>>np.ones([3,2])

array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])

>>>np.random.randn(3,2)

array([[ 0.3601399 , 1.31206686],
[-0.95112397, 0.62475726],
[-1.24179768, 1.63392069]])

1
2
3
4
5
6
7
>>>c = np.full((2,2), 7)  # Create a constant array
print(c) # Prints "[[ 7. 7.]
# [ 7. 7.]]"

>>>d = np.eye(2) # Create a 2x2 identity matrix
print(d) # Prints "[[ 1. 0.]
# [ 0. 1.]]"

数组属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>>np.arange(1,5).dtype

dtype('int64')

>>>np.array(["Hello", "Worlddddd!"]).dtype

dtype('<U10')
/*
What does `<U6` mean?
- `<` Little Endian
- `U` Unicode
- `6` length of longest string
*/

>>> np.array([1,2,3]).astype(float)

array([ 1., 2., 3.])

数组的类型与其包含的数据类型相对应,可以用.astype改变类型

数组编辑

重组和展开

1
2
3
4
5
6
7
8
9
>>>np.arange(1,13).reshape(4,3)

array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])

>>>A.flatten()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

切片索引和整数索引

切片时,第一个参数是行,第二个是列,切片形成的是对原来数组的引用,修改子数组也会影响原数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

# Use slicing to pull out the subarray consisting of the first 2 rows
# and columns 1 and 2; b is the following array of shape (2, 2):
# [[2 3]
# [6 7]]
b = a[:2, 1:3]

# A slice of an array is a view into the same data, so modifying it
# will modify the original array.
print(a[0, 1]) # Prints "2"
b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1]
print(a[0, 1]) # Prints "77"

可以混合整数索引和切片索引,这样做会产生一个比原始数组的秩更低的数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

# Two ways of accessing the data in the middle row of the array.
# Mixing integer indexing with slices yields an array of lower rank,
# while using only slices yields an array of the same rank as the
# original array:
row_r1 = a[1, :] # Rank 1 view of the second row of a
row_r2 = a[1:2, :] # Rank 2 view of the second row of a
print(row_r1, row_r1.shape) # Prints "[5 6 7 8] (4,)"
print(row_r2, row_r2.shape) # Prints "[[5 6 7 8]] (1, 4)"

# We can make the same distinction when accessing columns of an array:
col_r1 = a[:, 1]
col_r2 = a[:, 1:2]
print(col_r1, col_r1.shape) # Prints "[ 2 6 10] (3,)"
print(col_r2, col_r2.shape) # Prints "[[ 2]
# [ 6]
# [10]] (3, 1)"

整数数组 索引允许你使用另一个数组的数据构造任意数组 大批。 这是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np

a = np.array([[1,2], [3, 4], [5, 6]])

# An example of integer array indexing.
# The returned array will have shape (3,) and
print(a[[0, 1, 2], [0, 1, 0]]) # Prints "[1 4 5]"

# The above example of integer array indexing is equivalent to this:
print(np.array([a[0, 0], a[1, 1], a[2, 0]])) # Prints "[1 4 5]"

# When using integer array indexing, you can reuse the same
# element from the source array:
print(a[[0, 0], [1, 1]]) # Prints "[2 2]"

# Equivalent to the previous integer array indexing example
print(np.array([a[0, 1], a[0, 1]])) # Prints "[2 2]"

可以用整数数组索引修改数组部分值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

# Create a new array from which we will select elements
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])

print(a) # prints "array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])"

# Create an array of indices
b = np.array([0, 2, 0, 1])

# Select one element from each row of a using the indices in b
print(a[np.arange(4), b]) # Prints "[ 1 6 7 11]"

# Mutate one element from each row of a using the indices in b
a[np.arange(4), b] += 10

print(a) # prints "array([[11, 2, 3],
# [ 4, 5, 16],
# [17, 8, 9],
# [10, 21, 12]])

数组的数学运算

numpy 提供的数学函数的完整列表 文档 Numpy 提供了更多用于操作数组的函数; 完整的列表 文档

Numpy 提供了许多有用的函数来执行计算 数组; 最有用的之一是 sum:

1
2
3
4
5
6
7
import numpy as np

x = np.array([[1,2],[3,4]])

print(np.sum(x)) # Compute sum of all elements; prints "10"
print(np.sum(x, axis=0)) # Compute sum of each column; prints "[4 6]"
print(np.sum(x, axis=1)) # Compute sum of each row; prints "[3 7]"

转置矩阵, 只需使用 T数组对象的属性:

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np

x = np.array([[1,2], [3,4]])
print(x) # Prints "[[1 2]
# [3 4]]"
print(x.T) # Prints "[[1 3]
# [2 4]]"

# Note that taking the transpose of a rank 1 array does nothing:
v = np.array([1,2,3])
print(v) # Prints "[1 2 3]"
print(v.T) # Prints "[1 2 3]"

广播

我们有一个较小的数组和一个 较大的数组,并且我们想多次使用较小的数组来执行某些操作 在更大的阵列上。

例如,假设我们要向每个添加一个常数向量 矩阵的行。 我们可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

# We will add the vector v to each row of the matrix x,
# storing the result in the matrix y
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x) # Create an empty matrix with the same shape as x

# Add the vector v to each row of the matrix x with an explicit loop
for i in range(4):
y[i, :] = x[i, :] + v

# Now y is the following
# [[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]
print(y)

Numpy 广播允许我们执行此计算,而无需实际执行 创建多个副本 v。 考虑这个版本,使用广播:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

# We will add the vector v to each row of the matrix x,
# storing the result in the matrix y
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v # Add v to each row of x using broadcasting
print(y) # Prints "[[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]"

线路 y = x + v尽管有效 x有形状 (4, 3)v有形状 (3,)由于广播; 这条线的工作原理就像 v实际上有形状 (4, 3), 其中每一行都是一个副本 v,并且按元素求和。

一起广播两个数组遵循以下规则:

  1. 如果数组没有相同的秩,则在前面添加较低秩数组的形状 1s 直到两个形状具有相同的长度。
  2. 如果两个数组具有相同的维度,则称 兼容 它们在维度上 维度中的大小,或者如果其中一个数组在该维度中的大小为 1。
  3. 如果数组在所有维度上都兼容,则可以一起广播。
  4. 广播后,每个数组的行为就好像它的形状等于元素方向 两个输入数组的形状的最大值。
  5. 在一个数组的大小为 1 而另一个数组的大小大于 1 的任何维度中, 第一个数组的行为就好像它是沿着该维度复制的

一些应用

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
39
40
41
42
import numpy as np

# Compute outer product of vectors
v = np.array([1,2,3]) # v has shape (3,)
w = np.array([4,5]) # w has shape (2,)
# To compute an outer product, we first reshape v to be a column
# vector of shape (3, 1); we can then broadcast it against w to yield
# an output of shape (3, 2), which is the outer product of v and w:
# [[ 4 5]
# [ 8 10]
# [12 15]]
print(np.reshape(v, (3, 1)) * w)

# Add a vector to each row of a matrix
x = np.array([[1,2,3], [4,5,6]])
# x has shape (2, 3) and v has shape (3,) so they broadcast to (2, 3),
# giving the following matrix:
# [[2 4 6]
# [5 7 9]]
print(x + v)

# Add a vector to each column of a matrix
# x has shape (2, 3) and w has shape (2,).
# If we transpose x then it has shape (3, 2) and can be broadcast
# against w to yield a result of shape (3, 2); transposing this result
# yields the final result of shape (2, 3) which is the matrix x with
# the vector w added to each column. Gives the following matrix:
# [[ 5 6 7]
# [ 9 10 11]]
print((x.T + w).T)
# Another solution is to reshape w to be a column vector of shape (2, 1);
# we can then broadcast it directly against x to produce the same
# output.
print(x + np.reshape(w, (2, 1)))

# Multiply a matrix by a constant:
# x has shape (2, 3). Numpy treats scalars as arrays of shape ();
# these can be broadcast together to shape (2, 3), producing the
# following array:
# [[ 2 4 6]
# [ 8 10 12]]
print(x * 2)
]]>
- <h1 id="shell脚本">shell脚本</h1> -<p>Shell 脚本通常以 shebang 行开头:#!path/to/interpreter。</p> -<p><code>#!</code>是一个人类可读的 <a href="https://en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number">幻数表示</a> <code>0x23 0x21</code>它可以告诉 shell 将文件其余部分的执行传递给 指定翻译。 如果您的脚本作为可执行文件运行(例如 <code>./awesome_shell_script</code>) 加上 shebang 行,那么 shell 将调用 可执行文件(通常是解释器)位于 <code>path/to/interpreter</code>运行你的 脚本。 如果您的脚本作为参数传递给解释器,例如 <code>bash awesome_shell_script</code>,那么 shebang 没有效果并且 <code>bash</code>会处理 脚本的执行。 + <p><a href="http://www.numpy.org/">Numpy</a> 是 Python 中科学计算的核心库。 它提供了高性能的多维数组对象以及使用这些对象的工具 数组。</p> +<h2 id="数组">数组</h2> +<p>numpy 数组是一个值网格,所有值都具有相同的类型,并由非负整数组成的元组索引。 它的维度就是数组的秩 ;它的shape就是每个维度的大小组成的元组 - + - + - + + +
- 基于伯克利ds100和cs231n的numpy笔记 - - https://thinklive1.github.io/2023/10/09/numpy/ - 2023-10-09T12:02:04.679Z + 基于伯克利Sysadmin decal的linux笔记 + + https://thinklive1.github.io/2023/10/12/sysadmin/ + 2023-10-12T12:54:12.472Z 2023-11-27T12:50:13.887Z - Numpy 是 Python 中科学计算的核心库。 它提供了高性能的多维数组对象以及使用这些对象的工具 数组。

数组

numpy 数组是一个值网格,所有值都具有相同的类型,并由非负整数组成的元组索引。 它的维度就是数组的秩 ;它的shape就是每个维度的大小组成的元组

1
2
3
b = np.array([[1,2,3],[4,5,6]])    # Create a rank 2 array
print(b.shape) # Prints "(2, 3)"
print(b[0, 0], b[0, 1], b[1, 0]) # Prints "1 2 4"

官方数组创建教程 ds100的numpy教程 cs231n的python numpy教程

创建数组的方法

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
>>>np.array([[1.,2.], [3.,4.]])

array([[ 1., 2.],
[ 3., 4.]])

>>>np.array([x for x in range(5)])

array([0, 1, 2, 3, 4])

>>>np.array([["A", "matrix"], ["of", "words."]])

array([['A', 'matrix'],
['of', 'words.']],
dtype='<U6')

>>>np.ones([3,2])

array([[ 1., 1.],
[ 1., 1.],
[ 1., 1.]])

>>>np.random.randn(3,2)

array([[ 0.3601399 , 1.31206686],
[-0.95112397, 0.62475726],
[-1.24179768, 1.63392069]])

1
2
3
4
5
6
7
>>>c = np.full((2,2), 7)  # Create a constant array
print(c) # Prints "[[ 7. 7.]
# [ 7. 7.]]"

>>>d = np.eye(2) # Create a 2x2 identity matrix
print(d) # Prints "[[ 1. 0.]
# [ 0. 1.]]"

数组属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>>np.arange(1,5).dtype

dtype('int64')

>>>np.array(["Hello", "Worlddddd!"]).dtype

dtype('<U10')
/*
What does `<U6` mean?
- `<` Little Endian
- `U` Unicode
- `6` length of longest string
*/

>>> np.array([1,2,3]).astype(float)

array([ 1., 2., 3.])

数组的类型与其包含的数据类型相对应,可以用.astype改变类型

数组编辑

重组和展开

1
2
3
4
5
6
7
8
9
>>>np.arange(1,13).reshape(4,3)

array([[ 1, 2, 3],
[ 4, 5, 6],
[ 7, 8, 9],
[10, 11, 12]])

>>>A.flatten()
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])

切片索引和整数索引

切片时,第一个参数是行,第二个是列,切片形成的是对原来数组的引用,修改子数组也会影响原数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

# Use slicing to pull out the subarray consisting of the first 2 rows
# and columns 1 and 2; b is the following array of shape (2, 2):
# [[2 3]
# [6 7]]
b = a[:2, 1:3]

# A slice of an array is a view into the same data, so modifying it
# will modify the original array.
print(a[0, 1]) # Prints "2"
b[0, 0] = 77 # b[0, 0] is the same piece of data as a[0, 1]
print(a[0, 1]) # Prints "77"

可以混合整数索引和切片索引,这样做会产生一个比原始数组的秩更低的数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])

# Two ways of accessing the data in the middle row of the array.
# Mixing integer indexing with slices yields an array of lower rank,
# while using only slices yields an array of the same rank as the
# original array:
row_r1 = a[1, :] # Rank 1 view of the second row of a
row_r2 = a[1:2, :] # Rank 2 view of the second row of a
print(row_r1, row_r1.shape) # Prints "[5 6 7 8] (4,)"
print(row_r2, row_r2.shape) # Prints "[[5 6 7 8]] (1, 4)"

# We can make the same distinction when accessing columns of an array:
col_r1 = a[:, 1]
col_r2 = a[:, 1:2]
print(col_r1, col_r1.shape) # Prints "[ 2 6 10] (3,)"
print(col_r2, col_r2.shape) # Prints "[[ 2]
# [ 6]
# [10]] (3, 1)"

整数数组 索引允许你使用另一个数组的数据构造任意数组 大批。 这是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np

a = np.array([[1,2], [3, 4], [5, 6]])

# An example of integer array indexing.
# The returned array will have shape (3,) and
print(a[[0, 1, 2], [0, 1, 0]]) # Prints "[1 4 5]"

# The above example of integer array indexing is equivalent to this:
print(np.array([a[0, 0], a[1, 1], a[2, 0]])) # Prints "[1 4 5]"

# When using integer array indexing, you can reuse the same
# element from the source array:
print(a[[0, 0], [1, 1]]) # Prints "[2 2]"

# Equivalent to the previous integer array indexing example
print(np.array([a[0, 1], a[0, 1]])) # Prints "[2 2]"

可以用整数数组索引修改数组部分值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

# Create a new array from which we will select elements
a = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])

print(a) # prints "array([[ 1, 2, 3],
# [ 4, 5, 6],
# [ 7, 8, 9],
# [10, 11, 12]])"

# Create an array of indices
b = np.array([0, 2, 0, 1])

# Select one element from each row of a using the indices in b
print(a[np.arange(4), b]) # Prints "[ 1 6 7 11]"

# Mutate one element from each row of a using the indices in b
a[np.arange(4), b] += 10

print(a) # prints "array([[11, 2, 3],
# [ 4, 5, 16],
# [17, 8, 9],
# [10, 21, 12]])

数组的数学运算

numpy 提供的数学函数的完整列表 文档 Numpy 提供了更多用于操作数组的函数; 完整的列表 文档

Numpy 提供了许多有用的函数来执行计算 数组; 最有用的之一是 sum:

1
2
3
4
5
6
7
import numpy as np

x = np.array([[1,2],[3,4]])

print(np.sum(x)) # Compute sum of all elements; prints "10"
print(np.sum(x, axis=0)) # Compute sum of each column; prints "[4 6]"
print(np.sum(x, axis=1)) # Compute sum of each row; prints "[3 7]"

转置矩阵, 只需使用 T数组对象的属性:

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np

x = np.array([[1,2], [3,4]])
print(x) # Prints "[[1 2]
# [3 4]]"
print(x.T) # Prints "[[1 3]
# [2 4]]"

# Note that taking the transpose of a rank 1 array does nothing:
v = np.array([1,2,3])
print(v) # Prints "[1 2 3]"
print(v.T) # Prints "[1 2 3]"

广播

我们有一个较小的数组和一个 较大的数组,并且我们想多次使用较小的数组来执行某些操作 在更大的阵列上。

例如,假设我们要向每个添加一个常数向量 矩阵的行。 我们可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import numpy as np

# We will add the vector v to each row of the matrix x,
# storing the result in the matrix y
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = np.empty_like(x) # Create an empty matrix with the same shape as x

# Add the vector v to each row of the matrix x with an explicit loop
for i in range(4):
y[i, :] = x[i, :] + v

# Now y is the following
# [[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]
print(y)

Numpy 广播允许我们执行此计算,而无需实际执行 创建多个副本 v。 考虑这个版本,使用广播:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

# We will add the vector v to each row of the matrix x,
# storing the result in the matrix y
x = np.array([[1,2,3], [4,5,6], [7,8,9], [10, 11, 12]])
v = np.array([1, 0, 1])
y = x + v # Add v to each row of x using broadcasting
print(y) # Prints "[[ 2 2 4]
# [ 5 5 7]
# [ 8 8 10]
# [11 11 13]]"

线路 y = x + v尽管有效 x有形状 (4, 3)v有形状 (3,)由于广播; 这条线的工作原理就像 v实际上有形状 (4, 3), 其中每一行都是一个副本 v,并且按元素求和。

一起广播两个数组遵循以下规则:

  1. 如果数组没有相同的秩,则在前面添加较低秩数组的形状 1s 直到两个形状具有相同的长度。
  2. 如果两个数组具有相同的维度,则称 兼容 它们在维度上 维度中的大小,或者如果其中一个数组在该维度中的大小为 1。
  3. 如果数组在所有维度上都兼容,则可以一起广播。
  4. 广播后,每个数组的行为就好像它的形状等于元素方向 两个输入数组的形状的最大值。
  5. 在一个数组的大小为 1 而另一个数组的大小大于 1 的任何维度中, 第一个数组的行为就好像它是沿着该维度复制的

一些应用

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
39
40
41
42
import numpy as np

# Compute outer product of vectors
v = np.array([1,2,3]) # v has shape (3,)
w = np.array([4,5]) # w has shape (2,)
# To compute an outer product, we first reshape v to be a column
# vector of shape (3, 1); we can then broadcast it against w to yield
# an output of shape (3, 2), which is the outer product of v and w:
# [[ 4 5]
# [ 8 10]
# [12 15]]
print(np.reshape(v, (3, 1)) * w)

# Add a vector to each row of a matrix
x = np.array([[1,2,3], [4,5,6]])
# x has shape (2, 3) and v has shape (3,) so they broadcast to (2, 3),
# giving the following matrix:
# [[2 4 6]
# [5 7 9]]
print(x + v)

# Add a vector to each column of a matrix
# x has shape (2, 3) and w has shape (2,).
# If we transpose x then it has shape (3, 2) and can be broadcast
# against w to yield a result of shape (3, 2); transposing this result
# yields the final result of shape (2, 3) which is the matrix x with
# the vector w added to each column. Gives the following matrix:
# [[ 5 6 7]
# [ 9 10 11]]
print((x.T + w).T)
# Another solution is to reshape w to be a column vector of shape (2, 1);
# we can then broadcast it directly against x to produce the same
# output.
print(x + np.reshape(w, (2, 1)))

# Multiply a matrix by a constant:
# x has shape (2, 3). Numpy treats scalars as arrays of shape ();
# these can be broadcast together to shape (2, 3), producing the
# following array:
# [[ 2 4 6]
# [ 8 10 12]]
print(x * 2)
]]>
+ shell脚本

Shell 脚本通常以 shebang 行开头:#!path/to/interpreter。

#!是一个人类可读的 幻数表示 0x23 0x21它可以告诉 shell 将文件其余部分的执行传递给 指定翻译。 如果您的脚本作为可执行文件运行(例如 ./awesome_shell_script) 加上 shebang 行,那么 shell 将调用 可执行文件(通常是解释器)位于 path/to/interpreter运行你的 脚本。 如果您的脚本作为参数传递给解释器,例如 bash awesome_shell_script,那么 shebang 没有效果并且 bash会处理 脚本的执行。 为什么这很重要? shebang 可以被认为是一个有用的部分 执行脚本的关注 如何 元数据传递了用户 给程序的作者。 awesome_shell_script可能是一个 bash脚本,一个 python脚本,一个 ruby脚本等。这个想法是只有脚本的 对于调用的用户来说,行为而不是其实现细节应该重要。

您可能已经看到过一些变体 #!/bin/sh。 虽然最初参考的是 现代系统上的 Bourne shell sh已经提到了 Shell Command Language ,这是一个具有多种实现的 POSIX 规范。 sh通常符号链接到这些符合 POSIX 标准的 shell 之一 实现 Shell 命令语言。 以 Debian 为例, sh是 符号链接到 shell dash。 重要的是要注意 bash不 **_** 遵守这个标准,虽然运行 bash作为 bash --posix做到了 更合规。

管道

我们可以使用 |字符将多个命令链接在一行中。 例如: command1 | command2 将传递的输出 command1作为输入 command2。 我们可以根据需要多次重复此操作。

循环使用 for

Bash 可以使用 for 循环对多个对象重复操作。 语法如下:

1
2
3
4
5
for VARIABLE in LIST; do

CONSEQUENT-COMMANDS

done

缩进不是必需的,但使代码更易于阅读。 这 LIST可以是包含多个文件的目录,也可以是包含多行 init 的文件、文件列表( file1 file2 file3),甚至是一系列数字( {start..end}).

有用的命令

一些对于完成实验可能有用的命令。 当然,解决问题的方法有很多,并不需要使用这些命令。

cat

cat 打印 将文件 到标准输出 。 对于打印一些内容以通过管道输入其他命令非常有用!

cut

cut [options] [filename]提取文件的某些部分(或管道输入) 参数 根据使用的 。 一些可能有用的:

-d允许我们更改分隔符,或更改字符 cut寻找将字符串分成块。 如果省略该选项, tab用来。

-f允许我们指定与要返回的字段对应的数字,例如 cut -f1 -d" "将返回句子中的第一个单词。 数字后跟一个 -也返回指定字段之后的所有字段,因此 cut -f1- -d" "将返回整个字符串。

--complement告诉 cut返回除 之外的所有内容。 指定字段

grep

grep [pattern] [filename] 过滤 并返回文件(或管道输入)中包含指定模式的行。

sed

sed可以做 很多事情 ,比如编辑字符串和匹配正则表达式。 我们可以用 sed将一种模式替换为另一种模式,如下所示:

sed 's/<PATTERN-TO-REPLACE>/<NEW-PATTERN>/g <INPUT>'

sed` 还可以从其他东西获取管道输入,而不是显式输入。

g最后告诉 sed替换所有出现的模式; 如果我们只想替换模式的第一次出现,则可以省略它,或者用数字替换以仅替换一定次数的出现。

xargs

xargs让我们将命令应用于从管道重定向的输出。 例如, output | xargs command会适用 commandoutput。 一些有用的 选项

-n1告诉 xargs将命令应用到中的每个项目 output如果输出中有多个项目(例如多个字符串的列表),则一次

-0告诉 xargs用空字符(表示字符串的结尾)分割输出中的项目,而不是使用空格。 搭配 -n1, 这意味着 xargs会将命令应用于每个字符串,而不是将字符串分解为单个单词并将命令应用于每个单词。

与往常一样,有更多方法可以使用这些命令,因此请使用 Google 或 手册页 来了解更多信息

语法

Shell 变量和类型

与大多数其他编程语言一样, bash促进有状态分配 名称到值作为变量。

变量可以被赋值 bash语法如下: NAME=value。 请注意 赋值运算符之间缺少空格 =及其操作数。 任务 对空格敏感。

您可以通过在前面添加一个来检索变量的值 $以它的名字。 获取值 NAME必须完成 $NAME。 这就是所谓的变量 插值。

1
2
3
4
5
6
7
8
$ NAME = "Tux" # Incorrect
-bash: NAME: command not found
$ NAME="Tux" # Correct
$ echo NAME # Incorrect. We want the value we assigned to NAME, not the text
# NAME itself.
NAME
$ echo $NAME # Correct
Tux

$?保存最近执行的命令的退出代码。 在这个 上下文、退出代码 0一般表示程序已经执行 成功地。 其他 退出代码 指的是错误的性质 导致程序失败。

特殊 位置参数 允许将参数传递到脚本中。 $0是脚本的名称, $1是传递给的第一个参数 脚本, $2是传递给脚本的第二个参数, $3是第三个 论证等 $#给出传递给脚本的参数数量。

所以 ./awesome_shell_script foo bar可以访问 foo$1bar$2.

Bash 变量是 无类型的 。 它们通常被视为文本(字符串),但是 如果变量包含数字和算术运算,则可以将其视为数字 对其应用操作。 请注意,这与大多数编程不同 语言。 变量 本身没有类型,但 运算符 会处理 在不同的环境下他们的价值观也不同。 换句话说, bash变量是文本,没有任何固有的行为或属性 可以操作的文本,但操作员会解释该文本 根据其内容(数字或无数字?)和上下文 表达。

算术

Bash 支持整数算术 let内置。

1
2
3
4
5
6
$ x=1+1
$ echo $x # Incorrect. We wanted 2, not the text 1+1.
1+1
$ let x=1+1
$ echo $x # Correct
2

注意 let对空格敏感。 操作数和运算符不得 用空格分隔。

bash本身不支持浮点运算,所以我们必须依赖 如果我们想处理十进制数字,请使用外部实用程序。 一个常见的选择 这是 bc。 有趣的事实: bc实际上是它自己的完整语言!

我们经常访问 bc通过 管道 (表示为 |),这允许 将一个命令的输出用作另一命令的输入。 我们包括 -l 选项 bc为了启用浮点运算。

1
2
$ echo 1/2 | bc -l
.50000000000000000000

test

Bash 脚本经常使用 [(同义词为 test) shell 内置的 表达式的条件评估。 test计算一个表达式并 以任一状态代码退出 0(true) 或状态代码 1(错误的)。

test支持常见的字符串和数字运算符,以及许多 额外的二元和一元运算符在大多数情况下没有直接类似物 其他编程语言。 您可以看到这些运算符的列表,以及 其他有用的信息,通过输入 help test在你的壳里。 的输出 如下所示。 注意 help类似于 man,除非它用于 bash 函数而不是其他程序。

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
$ help test
test: test [expr]
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR. Expressions may be unary or binary. Unary
expressions are often used to examine the status of a file. There
are string operators as well, and numeric comparison operators.

File operators:

-a FILE True if file exists.
-b FILE True if file is block special.
-c FILE True if file is character special.
-d FILE True if file is a directory.
-e FILE True if file exists.
-f FILE True if file exists and is a regular file.
-g FILE True if file is set-group-id.
-h FILE True if file is a symbolic link.
-L FILE True if file is a symbolic link.
-k FILE True if file has its `sticky' bit set.
-p FILE True if file is a named pipe.
-r FILE True if file is readable by you.
-s FILE True if file exists and is not empty.
-S FILE True if file is a socket.
-t FD True if FD is opened on a terminal.
-u FILE True if the file is set-user-id.
-w FILE True if the file is writable by you.
-x FILE True if the file is executable by you.
-O FILE True if the file is effectively owned by you.
-G FILE True if the file is effectively owned by your group.
-N FILE True if the file has been modified since it was last
read.

FILE1 -nt FILE2 True if file1 is newer than file2 (according to
modification date).

FILE1 -ot FILE2 True if file1 is older than file2.

FILE1 -ef FILE2 True if file1 is a hard link to file2.

String operators:

-z STRING True if string is empty.

-n STRING
STRING True if string is not empty.

STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.

Other operators:

-o OPTION True if the shell option OPTION is enabled.
! EXPR True if expr is false.
EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.

arg1 OP arg2 Arithmetic tests. OP is one of -eq, -ne,
-lt, -le, -gt, or -ge.

Arithmetic binary operators return true if ARG1 is equal, not-equal,
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
than ARG2.

我们可以测试整数相等

1
2
3
4
$ [ 0 -eq 0 ]; echo $? # exit code 0 means true
0
$ [ 0 -eq 1 ]; echo $? # exit code 1 means false
1

字符串相等

1
2
3
4
$ [ zero = zero ]; echo $? # exit code 0 means true
0
$ [ zero = one ]; echo $? # exit code 1 means false
1

以及您可以自由进行的许多其他字符串和数字运算 探索。

控制结构

bash包括大多数编程语言典型的控制结构 – if-then-elif-else, while for-in等等。您可以阅读更多有关 条件语句迭代 中的 Bash 指南 初学者 Linux 文档项目 (LDP) 的 。 我们鼓励您 请阅读这些部分,因为本指南仅提供了一些内容的简短摘要 重要特征。

if-then-elif-else

if 语句的一般形式 bash

1
2
3
4
5
6
7
8
9
10
11
12
13
if TEST-COMMANDS; then

CONSEQUENT-COMMANDS

elif MORE-TEST-COMMANDS; then

MORE-CONSEQUENT-COMMANDS

else

ALTERNATE-CONSEQUENT-COMMANDS;

fi

缩进是一种很好的做法,但不是必需的。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

if [ $1 -eq $2 ]; then
echo args are equal
else
echo args are not equal
fi

我们看

1
2
3
4
$ ./awesome_shell_script 0 0
args are equal
$ ./awesome_shell_script 0 1
args are not equal

尽管

while 循环的一般形式 bash

1
2
3
4
5
while TEST-COMMANDS; do

CONSEQUENT-COMMANDS

done

如果 TEST-COMMANDS退出并带有状态码 0, CONSEQUENT-COMMANDS将要 执行。 这些步骤将重复,直到 TEST-COMMANDS退出时带有一些非零值 地位。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

n=$1
while [ $n -gt 0 ]; do
echo $n
let n=$n-1
done

我们看

1
2
3
4
5
6
$ ./awesome_shell_script 5
5
4
3
2
1

函数

bash supports functions, albeit in a crippled form relative to many other languages. Some notable differences include:

功能于 bash定义为

1
2
3
4
5
name_of_function() {

FUNCTION_BODY

}

并由

1
name_of_function $arg1 $arg2 ... $argN

请注意函数签名中缺少参数。 参数在 bash 函数的处理方式与全局位置参数类似,其中 $1 含有 $arg1, $2含有 $arg2, ETC。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

foo() {
echo hello $1
}

foo $1

我们看

1
2
$ ./awesome_shell_script world
hello world

实例

斐波那契

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
#!/bin/bash
# contents of fibonacci

if [ $# -eq 0 ]; then
echo "fibonacci needs an argument"
exit 1
fi

fib() {
N="$1"
if [ -z "${N##*[!0-9]*}" ]; then
echo "fibonacci only makes sense for nonnegative integers"
exit 1
fi

if [ "$N" -eq 0 ]; then
echo 0
elif [ "$N" -eq 1 ]; then
echo 1
else
echo $(($(fib $((N-2))) + $(fib $((N-1)))))
fi
}

fib "$1"
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
read -p “send: ” FOO
# enter “hi”
echo “sent: $FOO”
sent: hi

FOO=$(expr 1 + 1)
echo “$FOO”
2

-eq ==
-ne !=
-gt >
-ge >=
-lt <
-le <=

test zero = zero; echo $?
0 # 0 means true
test zero = one; echo $?
1 # 1 means false

if [ “$1” -eq 69 ];
then
echo “nice”
elif [ “$1” -eq 42 ];
then
echo “the answer!”
else
echo “wat r numbers”
fi

read -p "are you 21?" ANSWER
case "$ANSWER" in
“yes”)
echo "i give u cookie";;
“no”)
echo "thats illegal";;
“are you?”)
echo “lets not”;;
*)
echo "please answer"
esac

NAMES="a b c d"
for NAME in $NAMES
do
echo "Hello $NAME"
done

while true
do
echo "Hello $NAME"
done

Bash 支持整数算术 let内置的。

1
2
3
4
5
6
$ x=1+1
$ echo $x # Incorrect. We wanted 2, not the text 1+1.
1+1
$ let x=1+1
$ echo $x # Correct
2

注意 let对空格敏感。 操作数和运算符不得 用空格分隔。 test计算一个表达式并 以任一状态代码退出 0(true) 或状态代码 1(错误的)

bash支持函数,尽管相对于许多其他函数而言,其形式有缺陷 语言。 一些显着的差异包括:

请注意函数签名中缺少参数。 参数在 bash 函数的处理方式与全局位置参数类似,其中 $1 含有 $arg1, $2含有 $arg2, ETC。

例如,如果我们写

1
2
3
4
5
6
7
8
#!/bin/bash
# contents of awesome_shell_script

foo() {
echo hello $1
}

foo $1

我们看

1
2
$ ./awesome_shell_script world
hello world

shell命令

SSH(安全外壳)

SSH 允许您通过互联网登录远程计算机。 这相当于在远程计算机上打开 shell。

用法是 ssh [remote username]@[remote host].

问题

  1. 登录到 tsunami.ocf.berkeley.edu使用您的 OCF 用户名和密码。 有一个文件在 ~staff/public_html/decal。 打开它。 文件中到底隐藏着什么秘密?

管道和重定向

将命令链接在一起对于自动化 shell 操作至关重要。 这是一个快速备忘单:

>:将 标准 输出重定向到文件(将覆盖该文件)。

>>:将标准输出附加到文件(与 >除非不覆盖)。

<:从文件中读取输入。

|:将一个程序的输出发送到下一个程序的输入。

下面是一个示例:假设您正在参加一门课程,需要您提交一个包含您的 SID 的文本文件。 您的第一反应可能是打开一个文本编辑器(例如 vim)并简单地输入它,但是有一种更快的方法来创建文件! 这里是:

echo '123456789' > sid.txt

tmux

为什么是 tmux?

入门

包管理

Debian:简介 aptdpkg

在本课程中,我们将重点关注 Debian 的使用。 正如本周讲座中提到的,Debian 使用 apt/dpkg 作为其包管理器。 其他发行版使用不同的包管理器。

apt

Debian 的前端包管理器是 apt。 大多数时候,当您需要与包管理器打交道时, apt通常是要走的路。 在做任何事情之前 apt,更新包列表通常是一个好习惯,以便包管理器可以找到并获取各种包的最新版本。 为此,您可以运行:

apt update

要查找要安装的包:

apt search [package|description]

要安装包:

apt install [package]

要删除包:

apt remove [package]

使用安装的软件包一段时间后,您可能会注意到它们不会自动更新,这一功能可能存在于为其他操作系统编写的程序中。 要更新已安装的软件包,请运行:

apt upgrade或有时 apt dist-upgrade

使用起来比较普遍 apt upgrade更新你的包,但有时你需要使用 apt dist-upgrade。 阅读有关两者之间差异的更多信息 您可以在此处

在某些情况下,您希望完全确定要安装的软件包的版本。 要列出可以安装的潜在版本,您可以运行:

apt policy [package]

这根据其引脚优先级列出了要安装的候选版本以及与系统兼容的其他版本。 要安装特定目标版本的 aa 版本,您可以运行:

apt -t [targetrelease] install [package]

还有其他命令可以删除不需要的依赖项并清除包,但这就是 man页面是为了。 请注意,您将必须使用 sudo对于上述命令,因为您实际上是在修改系统本身。

dpkg

后端包管理器是 dpkg。 传统上, dpkg用于安装本地软件包。 使用 dpkg,您还可以检查软件包并修复损坏的安装。 要安装本地软件包,请运行:

dpkg -i [packagefilename]

删除系统包:

dpkg --remove [package]

要检查包以获取有关该包的更多信息:

dpkg -I [packagefilename]

要修复/配置所有已解压但未完成的安装:

dpkg --configure -a

入门

创建一个简单的包

现在,我们将使用您将在接下来的步骤中创建的 hellopenguin 可执行文件创建一个简单的包。 首先,移至您在入门部分克隆的存储库中的 a2 文件夹:

cd decal-labs/a2

现在我们将创建一个文件夹来进行此练习:

mkdir ex1

现在进入该文件夹:

cd ex1

编写和编译程序

现在,我们将用 C 语言制作一个非常简单的应用程序,打印“Hello Penguin!” 名为地狱企鹅。 调用:

touch hellopenguin.c

这将创建一个名为的空文件 hellopenguin.c。 现在,使用您选择的首选文本编辑器,例如 vim, emacs, 或者 nano,将以下代码插入 hellopenguin.c

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()

{

printf("Hello Penguin!\n");

return 0;

}

我们现在将编译您刚刚编写的源文件:

gcc hellopenguin.c -o hellopenguin

其作用是获取源文件 hellopenguin.c并将其编译为名为的可执行文件 hellopenguin-o输出标志。

打包可执行文件

现在,我们将创建可执行文件所在的文件夹结构。在 Debian 中,用户级包通常驻留在该文件夹中 /usr/bin/:

mkdir -p packpenguin/usr/bin

现在移动你编译的 hellopenguin可执行到 packpenguin/usr/bin/文件夹。

mv hellopenguin packpenguin/usr/bin/

现在我们将创建一个名为 hellopenguin。 移动到父目录 packpenguin文件夹并调用以下命令:

fpm -s dir -t deb -n hellopenguin -v 1.0~ocf1 -C packpenguin

这指定您要使用目录 -s标志,并输出 .deb包使用 -t旗帜。 它接受一个名为的目录 packpenguin, 使用 -C标志,并输出 .deb文件名为 hellopenguin, 使用 -n,版本号为 1.0~ocf1, 使用 -v旗帜。

现在通过调用 apt 并安装它来测试它:

sudo dpkg -i ./hellopenguin_1.0~ocf1_amd64.deb

现在你应该能够运行 hellopenguin通过执行以下操作:

hellopenguin

计算机网络

概述

不可否认,互联网是一个重新定义了我们世界的重要系统。 开发网络和允许设备通信的能力对于现代计算机系统至关重要。 本实验将研究计算机网络的基础知识,然后从系统管理员的角度检查网络。

我们将使用网页浏览作为类比来了解网络的基础知识。 当我上网浏览猫的图片时到底会发生什么?

但首先让我们简要了解一下网络的细节。


硬件地址mac

媒体访问控制 (MAC) 地址是唯一分配给网络接口的标识符。 所有文字

由于 MAC 地址是唯一的,因此通常称为物理地址。 八位位组通常以十六进制书写并用冒号分隔。 MAC 地址示例是 00:14:22:01:23:45。 请注意,前 3 个八位位组指的是组织唯一标识符 (OUI),它可以帮助识别制造商。 有趣的事实—— 00:14:22以上是 Dell 的 OUI。

ip

IP 地址是识别根据互联网协议连接到网络的设备的方法。 互联网协议有两个版本:IPv4 和 IPv6,它们的地址大小不同。 IPv6 地址示例是 2001:0db8:85a3:0000:0000:8a2e:0370:7334它比 IPv4 地址长得多,例如 127.0.0.1。 由于时间关系,我们只讨论 IPv4,但 IPv6 确实正在取得进展,值得一试!

IPv4 地址为 32 位,即 4 个字节,每个字节由点 (.) 分隔。 IPv4 地址示例是 127.0.0.1。 巧合的是,这个地址被称为环回地址,它映射到您自己机器上的环回接口。 这允许网络应用程序在同一台计算机(在本例中是您的计算机)上运行时相互通信。 但为什么 127.0.0.1并不是 127.0.0.0或者 127.0.0.2?

答案是 127.0.0.1是简单的约定,但从技术上讲,网络块中的任何地址 127.0.0.0/8是一个有效的环回地址。 但网络块到底是什么?

在 IPv4 中,我们可以将地址块划分为子网。 这是以 CIDR 格式编写的。 我们以上面的子网为例 127.0.0.0/8。 斜杠后面的数字 ( /),在本例中为 8,是子网掩码。 这表示网络地址中有多少位,其余位标识网络内的主机。 在这种情况下,网络地址是 127.0.0.0面具是 255.0.0.0。 所以 127.0.0.1将是第一个主机 127.0.0.0/8网络等等。

该图提供了 CIDR 寻址的可视化细分 所有文字

ARP

地址解析协议 (ARP) 是用于将 IP 地址解析为 MAC 地址的协议。 为了理解ARP,我们首先讨论发送帧的两种方式,单播和广播。 在第 2 层上下文中,单播帧意味着将该帧发送到一个 MAC 地址。 另一方面,通过将帧发送到广播地址来广播帧意味着该帧应该发送到网络上的每个设备,从而有效地“淹没”本地网络。

例如,让我们想象一个发送者 A,他有 MAC 00:DE:AD:BE:EF:00,广播一条消息,本质上是询问“谁拥有 IP 地址 42.42.42.42请在 00:DE:AD:BE:EF:00 告诉 A”。

如果一台机器B,有MAC 12:34:56:78:9a:bc有IP地址 42.42.42.42他们向发件人发送单播回复,其中包含以下信息“ 12:34:56:78:9a:bc42.42.42.42”。 发送方将此信息存储在 arp 表中,因此每当它收到发往机器 B 的数据包时,即目标 IP 地址为 42.42.42.42它将数据包发送到从 B 收到的 MAC。

为了路由 IP 数据包,设备具有所谓的路由表。 路由条目存储在路由表中,它们本质上是告诉设备应如何基于 IP 转发数据包的规则。 路由条目指定子网以及与该条目对应的接口。 设备选择具有最特定于给定数据包的子网的条目,并将其转发出该条目上的接口。

路由表通常也有一个默认网关。 在没有更具体的匹配条目的情况下,这将用作数据包的默认捕获所有内容。

以此路由表为例。

1
2
3
4
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
10.0.2.128/25 dev eth0 proto kernel scope link src 10.0.2.15
192.168.162.0/24 dev eth1 proto kernel scope link src 192.168.162.162

一个数据包的目的地是 8.8.8.8将从默认网关 eth0 转发出去。 一个数据包的目的地是 10.0.2.1将根据第二个条目从 eth0 转发。 一个数据包的目的地是 10.0.2.254将根据第三个条目从 eth0 转发。 一个数据包的目的地是 192.168.162.254将根据第四个条目从 eth1 转发。

域名

我们已经讨论了 IP 地址以及它们如何通过 IP 与主机进行通信,但是虽然 IP 地址是机器友好的(计算机喜欢数字),但它们并不完全是人类友好的。 记住电话号码已经够难了,记住 32 位 IP 地址也不会更容易。

但我们更容易记住 <www.google.com、www.facebook.com> 或 Coolmath-games.com 等名称。 因此,在这种冲突中,域名系统 (DNS) 诞生了,它是机器友好的 IP 地址和人类友好的域名之间的折衷方案。

DNS 是一个将 google.com 等域名映射到 172.217.6.78。 当您查询 google.com 时,您的计算机会将 google.com 的 DNS 查询发送到 DNS 服务器。 假设配置正确并且 google.com 有一个有效的对应地址,您将收到来自权威服务器的响应,其实质上是“google.com 有 IP 地址” x.x.x.x”.

现在让我们稍微消除一下这个黑魔法……

DNS 记录

DNS 服务器以资源记录 (RR) 的形式存储数据。 资源记录本质上是(名称、值、类型、TTL)的元组。 虽然 DNS 记录的类型多种多样,但我们最关心的是

  1. 一条记录 名称 = 主机名 值 = IP 地址

    该记录非常简单,包含给定主机名的 IP 地址,本质上是我们最终想要得到的信息。

  2. 国民服役记录 名称=域名 值 = 域的 DNS 服务器名称

    该记录指向另一个可以为该域提供权威答案的 DNS 服务器。 将此视为将您重定向到另一个名称服务器。

  3. CNAME 记录 名称 = 别名 值=规范名称

    这些记录指向给定别名的规范名称,例如 docs.google.com 将是一个仅指向 document.google.com 的别名 尝试 <www.facebook.com>

  4. MX记录 邮件服务使用的记录。

TCP 和 UDP

现在我们将讨论传输层的协议。 这一层最著名的两个协议是传输控制协议(TCP)和用户数据报协议(UDP)。

TCP 是一种面向有状态流的协议,可确保可靠的传输。 可靠的传输本质上保证信息完整且有序地到达目的地。

TCP 是面向连接的协议,这意味着它在发送任何数据之前必须首先建立连接。 此连接交换信息,这是 TCP 用于在其他功能中提供可靠传输的机制。 TCP 连接以 TCP 握手开始。

TCP 握手包括在发送方和接收方之间交换的数据包的 TCP 标头中设置某些标志。 发送方首先发送 SYN(设置了 SYN 标志的数据包)来启动 TCP 连接。 服务器通过发回 SYN-ACK(一个同时设置了 SYN 和 ACK 标志的数据包)来确认此连接请求。 客户端通过向服务器发送一个最终 ACK 来确认这一点,然后建立连接。

TCP 然后开始传输数据,如果数据成功到达连接的另一端,则会发出 ACK。 因此,如果数据丢失、重新排序或损坏,TCP 能够识别这一点并发送重传任何丢失数据的请求。

TCP 也有一个关闭连接的过程。 我们在这里只考虑优雅终止,突然终止有不同的过程,我们不会讨论。 如果您有兴趣,CS168 这里 有一些很棒的材料。 假设机器 A 想关闭与机器 B 的连接。

A 首先发送 FIN。 B 必须通过发送 FIN 和 ACK 进行响应。 如果 B 仅发送 ACK,则连接将持续存在,并且可以发送其他数据,直到发送 FIN。 另一方面,如果 B 准备好关闭连接并且不需要发送额外的数据,则 B 也可以只发送一个同时设置了 FIN 和 ACK 标志的数据包,即 FIN+ACK。发送最后一个 ACK​​ 来表示连接终止。

UDP是无状态无连接协议。 UDP 专注于以数据报的形式发送消息。 无连接 UDP 也不会产生 TCP 握手和终止的开销。 UDP 也不保证可靠传输,因此消息可能会损坏、无序到达或根本不到达。 因此,UDP 有时被称为不可靠数据报协议。

虽然 UDP 不保证可靠传输,但它不会像 TCP 那样遭受建立和关闭连接的开销。 因此,UDP 非常适合我们只想快速发送数据包并且丢失一些数据包也不会造成灾难性后果的使用情况。

此外,与 TCP 相比,发送的每个 UDP 数据报都需要单独接收。 而对于 TCP,您传递的数据流被透明地分成一定数量的发送,并且数据流在另一端透明地重建为一个整体。

端口

广义上讲,端口定义了服务端点——端口标记了流量的入口和出口点。 IP 地址连接主机,而端口则连接在此类主机上运行的进程。 一次只能将一个进程绑定到一个端口。 端口由 16 位数字表示,范围从 0 到 65535。从 0 到 1023 的端口是众所周知的端口,即系统端口。 使用这些端口通常有更严格的要求。 1024 到 49151 是注册端口。 官方 列表 IANA 维护着知名和注册范围的 。 从 49152 到 65535 的其余端口是临时端口,可以根据每个请求动态分配给通信会话。

systemd unit

unit的介绍和写法 Linux 发行版越来越多地采用 systemd初始化系统。 这套功能强大的软件可以管理服务器的许多方面,从服务到安装的设备和系统状态。

systemd, A unit指系统知道如何操作和管理的任何资源。 这是主要对象 systemd工具知道如何处理。 这些资源是使用称为单元文件的配置文件定义的。

单位是对象 systemd知道如何管理。 这些基本上是系统资源的标准化表示,可以由守护程序套件管理并由提供的实用程序操作。

单元可以说类似于其他 init 系统中的服务或作业。 然而,单元具有更广泛的定义,因为它们可用于抽象服务、网络资源、设备、文件系统挂载和隔离资源池。 系统的单元文件副本一般保存在 /lib/systemd/system目录。 当软件在系统上安装单元文件时,这是它们默认放置的位置。

存储在此处的单元文件可以在会话期间按需启动和停止。 这将是通用的普通单元文件,通常由上游项目的维护人员编写,应该适用于部署的任何系统 systemd在其标准实施中。 您不应编辑此目录中的文件。 相反,如果有必要,您应该使用另一个单元文件位置来覆盖该文件,该位置将取代该位置中的文件。 正确的方法是创建一个以单元文件命名的目录 .d附加在最后。 所以对于一个叫做 example.service,一个名为 example.service.d可以被创建。 在此目录中,有一个以以下结尾的文件 .conf可用于覆盖或扩展系统单元文件的属性。

大多数单元文件中的第一部分是 [Unit]部分。 这通常用于定义单元的元数据并配置单元与其他单元的关系。

尽管部分顺序并不重要 systemd解析文件时,此部分通常放置在顶部,因为它提供了单元的概述。 您可以在以下位置找到一些常见指令 [Unit]部分是:

安全管理

加密与解密

基础知识

加密采用明文和密钥,返回密文。 解密需要密文和密钥,仅当解密密钥有效时才恢复并返回原始明文。 加密和解密的密钥是由随机位组成的长字符串,这使得攻击者在计算上无法猜测密钥并解密密文。

一切 安全性是指在面对攻击时保持系统按预期运行 这可以采取多种形式:

  1. 保密性
  2. 完整性/真实性
  3. 可用性

模块:

  1. 认证
  2. 加密:防止攻击者读取您的文件,直到它们得到 联邦调查局和他们的密码学家参与其中
  3. 哈希:将大数据转化为小数据
  4. 签名和证书:确保您就是您所说的人 假设我想使用你的公钥来验证你的身份。 我 可以用它加密一些东西,并要求你解密它并且 显示正确的值。 如果您可以解密该值,那么您必须拥有密钥的私有部分并且可以进行身份​​验证。 假设你想证明你发送的消息实际上是由您发送。 您可以使用您的私钥来“签署”消息通过对其进行加密,您的公钥可用于解密签名以验证您(由您发布的公开信息识别)键)实际上确实发送了消息,因为只有您而不是其他人对手将拥有相应的私钥。 根证书:操作系统包含许多根证书 这是网络信任的基础。 证书是在通向根的链中签名; 如果链有效,则最后的 cert 被认为是可信的。

网络攻击: 攻击网络系统的方法有很多: 窃听、中间人、拒绝服务、应用程序 缓冲区/堆溢出、SQL 注入等漏洞 目录遍历、CSRF、SSRF、XSS、蠕虫、rootkit、垃圾邮件、加密挖矿、勒索软件、网络钓鱼等等……

对称密码学

在对称密码学中,用于加密和解密的密钥是相同的。

尝试一下:

  1. gpg --symmetric [FILE]在任何文件上输出 [FILE].gpg文件是输入文件的加密版本。 加密文件时需要输入密码。
  2. gpg --decrypt [FILE].gpg在原始文件的加密版本上,您需要输入原始密码。

在此 GPG 实现中,文件的加密和解密都需要知道单个密码,在本例中该密码充当对称密钥。

非对称密码学

在非对称加密中,两个单独的密钥分别用于加密和解密。 这两个密钥是一对公私密钥。 公钥是公开的并用于加密数据。 而私钥由所有者保密并用于解密数据。 使用公钥加密文件意味着只有拥有相应私钥的人才能解密生成的加密文件。

GPG 钥匙圈抽象

GPG 使用“密钥环”作为集中位置来保存用户的所有密钥。 如果您想使用并保留它,则需要向密钥环添加/导入密钥。 同样,如果您希望与其他人共享密钥,您可以导出您的密钥(这会生成您的密钥的副本)并让他们将其导入到他们的密钥环中。

尝试一下:

  1. gpg --full-generate-key生成 GPG 公私密钥对。 它会要求输入密码。 如果您的机器需要一段时间才能生成密钥,则可能是由于缺乏长随机密钥所需的熵(随机性)。 sudo apt-get install haveged将安装一个生成熵的守护进程。
  2. gpg --recipient [RECIPIENT] --encrypt [FILE]这将加密 [FILE][RECIPIENT]的公钥(目前,尝试使用您自己的公钥加密文件)。
  3. gpg --decrypt [FILE].gpg将搜索您的密钥环并使用适当的私钥解密文件(当然,如果您拥有正确的私钥)。 您无需指定使用哪个密钥来解密文件,因为 GPG 加密的文件和密钥包含元数据,允许 GPG 从密钥环中选择正确的密钥来解密文件。

签名

公钥加密、私钥解密的非对称方案也可以反过来实现数字签名,其作用相当于物理签名。 在这个相反的方案中,私钥用于对文件进行签名,从而在该文件上生成签名。 并使用相应的公钥来验证签名。 因此,只有拥有私钥的人才能生成签名,但拥有相应公钥的任何人都可以验证该签名。

UNIX 权限模型有 3 个组成部分:授予文件的 (1) 所有者用户、(2) 所有者组和 (3) 其他人/其他所有人的权限。 权限本身有 3 个子组件:(1) 读取、(2) 写入和 (3) 执行,强制执行读取、写入或执行文件的能力。

gpg

  1. 解密b8/file1.txt.gpg:
1
gpg --decrypt b8/file1.txt.gpg 
  1. 输入密码ocfdecal后,解密内容为: mYp@sw0rd2. 导入密钥的命令是:
1
gpg --import {key_file}
  1. 将密钥导出到文件的命令:
1
gpg --export --armor {key_id} > {output_file}
  1. 查看钥匙圈所有钥匙的命令:
1
gpg --list-keys
  1. 使用私钥b8/lab8privkey解密b8/file2.txt.gpg:
1
2
gpg --import ./lab8privkey
gpg --decrypt ./file2.txt.gpg

hash

  1. sha1sum [FILE]获取 SHA1 哈希值 [FILE].
  2. md5sum [FILE]获取 MD5 哈希值 [FILE].

安全系统

威胁模型

设计安全系统时要记住的最重要的事情是 了解您的威胁模型。 没有系统能够保证安全或能够 能够抵挡所有的攻击,甚至在极端的情况下也是不可能的。 对手。 但是,您可以(并且应该)针对威胁采取预防措施 你很可能会面临。 平衡授权用户访问的需求 在将未经授权的用户拒之门外的情况下,很容易出错。 幸运的是,聪明人已经将安全原则提炼为 中得到了很好的 第一个讲义 一些公理,在CS 161 的 介绍 (归功于大卫·瓦格纳教授)。 建议阅读讲义。

构建威胁模型时,请记住以下问题:

  1. 你在保护什么?
  2. 谁是你的对手?
  3. 您需要保护它的可能性有多大?
  4. 如果不加以保护,会产生什么后果?
  5. 您应该投入多少资源来保护它?

加密解密

对称密钥加密几乎对所有事物都有用,尤其是属于以下类别的事物:

作为示例,我们来探讨一下 iPhone 如何使用加密来保证数据安全:

  1. iPhone 的内部存储使用一组 AES 密钥进行加密,这些密钥存储在手机内部芯片上,并在工厂生成。
  2. 这些密钥又使用您的 PIN 进行加密。 您的 PIN 码允许手机解锁密钥,从而解密文件系统的其余部分。

与对称密钥加密不同,公钥加密中有 2 个密钥 ,密码系统由公钥私钥组成 。 顾名思义, 公钥是公开共享的,这是其他人可以使用的方式 加密适合您的数据。 您使用您的私钥来解密此内容 数据。 只要没有人拥有你的私钥,任何人都可以使用你的公钥 加密数据并确保只有您可以解密它。 这是一个强大的 对称密钥范式的扩展,除了加密之外,它还允许 签名和不可否认性 公钥密码学与 RSA 算法 同义, 是最早经过验证的双密钥方案之一。 RSA 公钥加密工作原理的简要概述

  1. RSA算法,通过一些高等数学(涉及素数和模数) 算术),返回 3 个数字:一个公共指数(又名密钥),一个私有指数, 和一个模数。 两个密钥的工作方式使得用一个密钥加密的数据只能 可以用另一个密钥解密。
  2. 为了加密数据,需要使用指数和模数之一对数据执行模幂运算。
  3. 为了解密数据,对加密数据进行模幂运算 与合作伙伴密钥和模数。 常用时,使用较大的指数 作为私钥,用于解密数据和创建签名, 较小的指数作为公钥,用于加密数据 并验证签名。 比如:
1
ssh-keygen -t rsa -b 4096

该命令将生成两个文件, ~/.ssh/id_rsa~/.ssh/id_rsa.pub。 正如命令所示,此命令生成 4096 位 RSA 密钥对。 你 应该能够猜测哪个文件代表公钥以及哪个文件必须 因此是私钥。 为了影响安全 SSH 登录,请使用 RSA密钥,用户必须首先将他们想要使用的公钥传输到 提前向服务器表明自己的身份。 然后,一旦会话结束 服务器和客户端之间建立的,服务器会加密一个随机数 号码与用户的公钥并发送给用户。 用户将 然后使用他们的私钥解密该值并返回该值的哈希值 到服务器,然后服务器可以自己散列该值以确定用户是否 能够成功解密随机数,从而表明拥有 匹配的密钥并作为身份验证的证据。

签名和证书

一开始,您 将发布 Natoshi 的公钥,此后,对于您发布的每个帖子,您 将使用您(Natoshi)的私钥对消息内容进行加密,并且 将其与您的原始消息一起发布。 那么,想验证的人 Natoshi(即公钥对应的私钥的所有者 属于 Natoshi)实际上确实发布了一条特定的消息,可以简单地 使用 Natoshi 的公钥解密加密签名并比较 内容与原始消息相反。

Natoshi 王位的觊觎者将是 无法签署他们的虚假声明,以便可以与他们核实 Natoshi 公开了公钥,因为他们没有 Natoshi 的私钥, 您可以放心,没有人会过度影响您的项目 当你躲避 IRS 和 DEA 时,除非他们碰巧有 仓库里装满了 ASIC 和大量廉价电力。

然而,在这个方案中,如何防止对手发布虚假信息 公钥并声称是您? (他们可以对此进行有效签名 假公钥)不知何故,你需要“引导”信任:有人需要 验证您的身份并公开确认您的公钥实际上 对应于你。

我们通过 证书 来做到这一点:签署的声明 声称特定的公钥实际上属于它所声称的人 属于。

谁签署此证书? 一个 证书颁发机构 ,我们的某人 信任负责验证身份和发布签名。

但是我们如何知道要信任哪些 CA,以及我们如何才能信任声称 真正值得信赖的是? 他们可能还需要证书。 它 听起来好像一路下来都是海龟; 然而,链条确实结束了 某处:所谓的信任根,根 CA。 这些 CA 的 证书是由浏览器和操作系统预安装的,因此 本质上受信任,无需任何进一步的证书。 如果根 CA 签署您的证书,我们假设他们已经完成了必要的尽职调查 愿意冒着声誉风险签署您的证书,并且基本上 相信他们的话。 这种模型被称为“ 信任网络” ,是网络如何 今天的安全工作正常进行。

不幸的是,它并不像我们希望的那样可靠: 有些 CA 很卑鄙,只要有足够的钱就会签署任何东西,从而导致有效的 为 microsoft.com 和 github.com 等域颁发的证书 显然不是 Microsoft 或 GitHub 的实体。 1 此外, 任何拥有足够边境控制的实体都可以强制安装自己的 根证书(例如哈萨克斯坦政府 2 ) 并截取 通过为任何域颁发自己的伪造证书来窃取任何流量。

您可能没有意识到,但 您使用并依赖证书和签名 每天。 每当您在网站地址栏附近看到绿色锁时, 访问,您正在通过 TLS 或 HTTPS 连接访问该网站,并且数据 您和网站之间的传输是加密的。 当你的浏览器 连接到网站的服务器,它会按顺序请求服务器的公钥 设置加密连接和服务器证书以便 验证其作为授权为您拥有的域提供服务的服务器的身份 要求。 然后,您的浏览器通过验证公钥来验证公钥 证书上的签名。 如果有人试图执行 对您进行中间人攻击,此证书验证步骤将失败, 因为受信任的 CA 不太可能颁发签名的证书 将您的域名转让给您以外的实体(除非您不幸 居住在哈萨克斯坦)。 您将收到一条非常侵入性的通知 这个事实,忽略证书验证是一个坏主意 失败通知。

怎么为自己的网站设置https加密传输数据 现在您有了一个网站,您决定,作为一个优秀的互联网公民,您 希望保护您的访客免受政府的窥探,通过 设置 HTTPS。 您已经知道您将需要一个公钥和一个 为此,由受信任的根 CA 签署的证书。 你怎么去 关于得到一个? 在互联网上搜索,你发现了一个很棒的项目,名为 Let's Encrypt 提供免费、签名的服务 证书。

文件安全

作为 root用户。 当程序启动时,它会继承其用户 ID 和组 ID 父进程,并保留它们,除非手动删除权限。 如果你 以 root 用户身份启动程序,因为,例如,它需要更深入的 系统访问,程序中的漏洞意味着攻击者可以 以 root 用户身份与您的计算机进行交互。 这是一个常见问题 错误配置的网络服务器,其中服务器以根目录运行 遍历漏洞可能允许攻击者读取秘密凭证 存储在服务器的文件系统上。

这个故事的寓意与最小特权原则紧密相连:无论在哪里 可能的话,只给予尽可能少的许可或特权。 如果 程序不需要 root 凭据,请勿以特权用户身份运行它。 如果 文件包含敏感内容,请勿使其可读。

如何更改权限? 有两个主要命令可以执行此操作: chmodchown. chmod更改文件模式,即权限,以及 其语法示例如下:

1
2
3
4
5
6
7
8
9
10
11
$ ls -la ~/
drwxr-xr-x 3 admin admin 4096 Oct 3 12:38 test
$ chmod 644 test
$ ls -la
drw-r--r-- 3 admin admin 4096 Oct 3 12:38 test
$ chmod u+x test
drwxr--r-- 3 admin admin 4096 Oct 3 12:38 test
$ chmod 000 test
d--------- 3 admin admin 4096 Oct 3 12:38 test
$ chmod +r test
dr--r--r-- 3 admin admin 4096 Oct 3 12:38 test

chmod接受八进制表示法的文件权限,即 下列的:

#读写
7读写
6RW-
5接收
4r–
3-wx
2-在-
1-X
0

pueept

● 流行的配置管理软件 ● 用于配置单个机器 ● 声明性哲学,必要时带有一些命令式组件 ● 最初基于 Ruby 构建,现在拥有自己的配置语言 流程: ● 客户端向服务器请求更新 ○ “我想配置为 Minecraft 服务器” ● 服务器向客户端询问事实列表 ○ “好的,请将您的主机名和 RAM 发送给我” ● 客户用事实回应 ○ “我的主机名是僵尸.ocf.berkeley.edu,我有 4GB RAM” ● 服务器响应配置 ○ “确保 Minecraft 服务器正在运行,主机名为僵尸.ocf.berkeley.edu,4GB RAM, 这个配置文件 ● 客户端进行必要的更改以确保其当前配置与 服务器给出的配置 ○ “minecraft服务器当前正在运行,但配置文件已更新,我将获取 更新后的版本 Puppet是一个配置管理工具,通过Puppet可以实现对大量服务器/主机的集中化、自动化的配置管理。Puppet的工作原理是:

  1. 在Puppet Master服务器上面编写Puppet Manifests(配置文件)。这些文件使用Puppet语言定义了服务器的最终状态。
  2. Puppet Agent安装在被管理的主机上面,它会定期从Puppet Master拉取配置。
  3. Puppet Agent对本地服务器状态进行检查,然后根据Manifests对服务器进行配置,确保服务器状态与预期状态一致。
  4. 如果配置发生变化,Puppet会自动应用这些变化,无需手动操作。
  5. Puppet Agent会定期运行,如果配置失效会再次修正。所以Puppet脚本就是编写Puppet Manifests的文件,它定义了需要配置什么,怎么配置。常见的配置包括:- 安装软件

git

创建一个分支:

1
git checkout -b dice

这使得一个新的本地分支称为 dice基于我们所在的分支机构 目前在( master)并将您切换到 dice分支。 这个命令是 基本上简写为:

1
2
git branch dice       # Create new branch called 'dice'
git checkout dice # Switch to branch called 'dice'

您可以通过键入来查看您创建的分支 git branch。 你应该看到 此时有两个分支,一个称为 master和一个叫 dice。 一个 星号位于您当前签出的分支旁边。 git log查看历史提交。 每个提交都有一些信息,例如提交的作者、 创建提交的时间戳和提交消息。

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
commit adc45cd5110b59f76cefc2b862d0e4d550ccb183 (HEAD -> dice)
Author: thinklive1 <469631989@qq.com>
Date: Thu Oct 12 15:32:35 2023 +0800

Restrict input range for dice iterations and sides

commit a79a770157449a9d2fb1595a0b83ecc99070eabf
Author: thinklive1 <469631989@qq.com>
Date: Thu Oct 12 15:31:56 2023 +0800

Add dice rolling logic and output dice sum and sequence

commit 924d0b1ebf050a043da434114187a290280ec660
Author: thinklive1 <469631989@qq.com>
Date: Thu Oct 12 15:30:45 2023 +0800

Add -s flag for number of sides on a die

commit 3acb62af3eff4a1dbbe875e81ec1485d9d10c44b (origin/master, origin/HEAD, master)
Merge: 4e2aac7 2aefa6c
Author: Ishaan Dham <56564174+Ishaandham19@users.noreply.github.com>
Date: Tue Mar 21 21:39:51 2023 -0700

Merge pull request #34 from 0xcf/demo

Demo

commit 2aefa6c51449ffcd39d945e3d74ce2b5e50acf7f (origin/demo)
Author: Ishaan Dham <ishaandham01@gmail.com>

除了查看提交历史记录之外,您可能还想查看实际的更改 在代码中。 您可以使用 git diff <old commit> <new commit>查看 两次提交之间的差异。

除了查看提交历史记录之外,您可能还想查看实际的更改 在代码中。 您可以使用 git diff <old commit> <new commit>查看 两次提交之间的差异。 有几种不同的方式可以引用 一次提交。 之前提到的一个是复制提交的哈希值(请注意 您的提交哈希值将与下面的示例不同):

1
git diff 3368313c0afb6e306133d604ca72b0287124e8f2 762053064506810dee895219e5b2c2747a202829

您还可以复制提交哈希开头的一小块,而不是 整个哈希。 由于哈希的工作方式,您不太可能 有两个具有完全相同的起始序列的提交。

1
git diff 3368313 7620530

如果你想尝试 diff两个提交非常接近 日志,一种更简单的方法是通过距提交的距离来引用提交 HEAD (最近)使用以下格式提交 HEAD~<number>。 由于我们添加了三个 提交新的提交 dice,我们可以查看之间的差异 dicemaster使用以下命令:

1
git diff HEAD~3 HEAD

有多种方法可以处理合并冲突,但我们将采用的方法 在这个实验室中向您展示正在使用 git rebase。 我们的 dice分支是“基于” 这 master在某个时间点有分支,但是 master分行有 向前离开 dice基于过时的 master。 因此,我们想要 “重新基地” dice就目前的状态而言 master。 当你的 dice分支, 跑步 git rebase master。 Git 将回滚您所做的提交 dice, 复制 任何新的提交 master,并尝试在顶部重放您的提交。 有时 rebase无需您的干预即可运行完成,但是如果 存在合并冲突,您需要解决它。

Git 会告诉你如果遇到合并冲突该怎么办 在变基期间。 在这种情况下,打开 rand.py并找到冲突区域 应具有以下格式:

1
2
3
4
5
<<<<<<< HEAD
Lines of code from the base branch (in this case master)
=======
Lines of code from the branch you're rebasing (in this case dice)
>>>>>>> Commit message of the commit that conflicts with the base branch

要解决冲突,只需保留您想要的行(您的行来自 dice) 和 删除冲突区域中的其他行(

1
`<<<<<<< HEAD`, `=======`, `>>>>>>> dice`

,以及来自 master 的不需要的代码),然后保存并退出 文件。 Git 会将您保存的内容作为文件的确切形式 看起来像在变基结束时,所以你所做的本质上是修复 文件,以便代码正常运行。 这意味着如果您有多个 合并冲突,您决定混合保留基础分支中的一些行 还有一些来自您的功能分支,您需要确保代码确实有效 正确。

现在您已经解决了合并冲突,请按照变基说明进行操作 暂存您的固定文件( git add rand.py),然后运行 git rebase --continue。 如果 Git 发现其他文件有更多合并冲突,您将遵循相同的操作 程序如上。 然而,我们只有一个有冲突的文件,所以我们的变基是 完成的! 跑步 git log查看我们 rebase 的结果。 你现在应该看到了 你想象中的队友 "dice rolling WIP"提交您分支的历史记录, 你的提交高于他们的提交。

docker

安装 Docker wsl2不支持systemctl命令,而是支持systemed命令 所以需要执行如下命令启动docker

1
service docker start

虚拟机 你的电脑里有一台电脑! ● 通过软件模拟抽象物理硬件 ● 虚拟机管理程序运行多个虚拟机 ● 隔离应用:更好的安全性、稳定性 ● 一些开销:需要不同的客户操作系统和模拟 每个应用程序的虚拟硬件数量 ● 需要一些时间来启动

容器 ● 通常与虚拟机进行比较,但更像是捆绑的进程 环境 ● 提供类似的隔离 ○ 然而,比虚拟机要少得多! 出于这个原因,我们仍然经常在虚拟机内运行容器(但是 每个虚拟机可以运行 >1 个容器) ● 启动速度比虚拟机快得多 ● 目标是通过共享代码提供轻量级隔离环境 ● 轻松打包应用程序以实现一致的部署 ● 常见的容器:Docker、rkt、LXC ● 很确定这是加州大学伯克利分校唯一使用的课程

CommandDescription
docker searchSearch Docker Hub for pre-built images
docker pullPull an image or a repository from a registry
docker imagesList images
docker buildBuild an image from a Dockerfile
docker runRun a command in a new container
docker psList containers
docker start/stop/restartStart/stop/restart a container
docker execRun a command in a running container
docker inspectReturn low-level information on Docker objects
docker rmRemove one or more containers
docker rmiRemove one or more images

docker ● 需要构建镜像 ● 通常使用 Dockerfile 来指定 如何构建快照 ● 快照是分层构建的 ○ 像洋葱一样 ○ 允许基于相同的快照层构建速度更快 ● 保持每一层最少化资源

自动化配置管理工具 ● 声明式:说出你想要什么,而不是如何做 ○ 应用程序弄清楚如何 ● 可以定义要安装的应用程序、要包含的文件等 ● 可以在不同“类别”的机器上安装不同的东西 (桌面与服务器) ● 常用工具:Puppet、Ansible、Chef

docker的使用

docker run hello-world

您应该看到一些友好的输出,如下所示:

1
2
3
4
5
6
7
8
9
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

此消息表明您的安装似乎运行正常。 为了生成此消息,Docker 采取了以下步骤:

  1. Docker 客户端联系了 Docker 守护进程。
  2. Docker 守护进程从 Docker Hub 中提取“hello-world”镜像。
  3. Docker 守护进程从该映像创建了一个新容器,该容器运行生成您当前正在读取的输出的可执行文件。
  4. Docker 守护进程将该输出传输到 Docker 客户端,然后将其发送到您的终端。 在容器中默认以root用户身份登录。

以交互方式运行容器。 如果您需要在裸系统上尝试和安装东西而不弄乱当前系统,那么这非常有用。 尝试运行以下命令:

docker run -it ubuntu:latest

-iflag 告诉 docker 保留 STDIN打开你的容器,然后 -t分配一个 伪 TTY flag为您 。 基本上,您需要两者才能在新启动的容器中拥有一个 shell。 尝试安装一些软件包 apt或者只是玩玩。 它看起来应该像一个裸露的 Linux 系统。

使用 CTRL+D 退出容器。 自然的问题是,Docker 镜像是如何构建的? Dockerfile 就像镜像的源代码 相反,Dockerfile允许您通过指定手动键入创建镜像的所有命令来定义镜像。 然后 Docker 可以从指定Dockerfile 构建镜像。 这些 Dockerfile 可以放入版本控制中,并将镜像上传到在线存储库。

Docker可以通过读取来自Dockerfile的指令来自动构建镜像 。 Dockerfile是一个文本文档,其中包含所有命令 用户可以在命令行上调用来构建镜像。 eg.下面是一个 Dockerfile ,通过将 Python 3 和软件包安装到基础 Fedora Linux 映像上

1
2
3
4
5
6
7
8
9
10
11
12
13
# Specify Fedora Linux as base image
FROM fedora:latest

# Install Python with yum (Fedora's Package Manager)
# Install required Python packages
RUN yum update -y && yum install -y python3 python3-pip && \
python3 -m pip install pyfiglet termcolor

# Add the missile.py file to the final image
ADD missile.py /

# Specify the command to be run on container creation
CMD ["/usr/bin/python3", "missile.py"]

docker build -t missile:latest .

这告诉 Docker 在当前目录中查找 Dockerfile,并用该文件构建一个镜像。 这 -tflag 告诉 Docker 使用名称标记此构建 missile:latest

查看系统上正在运行的容器。 使用以下命令:

docker ps

由于您(可能)没有运行任何容器,因此您可能不会看到任何有趣的东西。 但是,如果您传入 -a标志,您还可以看到已停止的容器:

要获取有关容器的更多信息,您可以使用 docker logs命令 获取容器的日志(无论它仍在运行还是已退出):

docker logs <container_id_or_name>

在某些时候,您可能想要清理已退出且不打算再使用的容器:

docker rm <container_id_or_name>

将移除容器。

查看已经下载的镜像: docker images 图像可能会占用计算机上相当多的空间,因此您可能需要清理不打算使用的图像 使用。 如果您收到有关计算机上没有足够磁盘空间的错误,这一点尤其重要:

docker rmi <image_id>

镜像文件以及容器的各种文件系统都存储在 /var/lib/docker

分离容器

容器可以以后台服务的形式运行,这适用于一些后台服务的场合,Docker 支持这种方式 以 -d标志,见 分离 方式启动容器 模式

Docker 为容器创建一个单独的虚拟网络,因此您需要将主机端口转发到您的 容器的端口(这称为 端口转发 或端口映射)。 容器正在侦听端口 80,因此让我们尝试将主机的端口 5050 转发到容器的端口 :

docker run -d -p=5050:80 httpd

-p 接受冒号分隔的一对 HOST_PORT:CONTAINER_PORT

您实际上可以“附加”到正在运行的容器并在其中运行更多命令,类似于 docker run作品。 使用 这 docker exec命令:

docker exec <container_id_or_name> <command>

要停止此容器,请使用 docker stop <container_id_or_name>.

您可以使用以下命令重新启动容器 docker restart <container_id_or_name>.

关于 docker-compose

docker-compose允许您定义需要多个容器才能运行的应用程序。 例如,在网络上 应用程序,您可能希望实际的 Web 应用程序在单个容器内运行,并且数据库在其中运行 一个不同的容器。

通常,您根据 服务 来定义应用程序。 同样,以 Web 应用程序为例,有 两个不同的服务:应用程序本身和支持它的数据库。 docker-compose让您定义不同的服务 在 YAML 文件中并相应地运行服务。

其中一件好事是 docker-compose是它会自动为您的容器设置一个网络,其中:

使用 Docker 官方网站上的说明安装 Docker Compose

一些小脚本

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash



PHONEBOOK_ENTRIES="phonelist.txt"




if [ "$#" -lt 1 ]; then

    exit 1



elif [ "$1" = "new" ]; then

    # YOUR CODE HERE #

    echo $2 $3 >> phonelist.txt



elif [ "$1" = "list" ]; then

    if [ ! -e $PHONEBOOK_ENTRIES ] || [ ! -s $PHONEBOOK_ENTRIES ]; then

        echo "phonebook is empty"

    else

        # YOUR CODE HERE #

        cat phonelist.txt

    fi



elif [ "$1" = "lookup" ]; then

    # YOUR CODE HERE #

    grep $2 phonelist.txt




elif [ "$1" = "remove" ]; then

    # YOUR CODE HERE #

    sed -i "s/$2//g" phonelist.txt




elif [ "$1" = "clear" ]; then

    # YOUR CODE HERE #

    rm phonelist.txt



else

     # YOUR CODE HERE #

     echo nothing

fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

host=$1

ping -c 1 $host >> log.txt

if [ $? -eq 0 ]; then

    echo "OK"

else

    echo "can't access"

fi
1
2
3
4
#1/bin/bash

ip addr show | grep "link/ether" | head -n 1 | cut -d' ' -f 6

]]>
- <p><a href="http://www.numpy.org/">Numpy</a> 是 Python 中科学计算的核心库。 它提供了高性能的多维数组对象以及使用这些对象的工具 数组。</p> -<h2 id="数组">数组</h2> -<p>numpy 数组是一个值网格,所有值都具有相同的类型,并由非负整数组成的元组索引。 它的维度就是数组的秩 ;它的shape就是每个维度的大小组成的元组 + <h1 id="shell脚本">shell脚本</h1> +<p>Shell 脚本通常以 shebang 行开头:#!path/to/interpreter。</p> +<p><code>#!</code>是一个人类可读的 <a href="https://en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number">幻数表示</a> <code>0x23 0x21</code>它可以告诉 shell 将文件其余部分的执行传递给 指定翻译。 如果您的脚本作为可执行文件运行(例如 <code>./awesome_shell_script</code>) 加上 shebang 行,那么 shell 将调用 可执行文件(通常是解释器)位于 <code>path/to/interpreter</code>运行你的 脚本。 如果您的脚本作为参数传递给解释器,例如 <code>bash awesome_shell_script</code>,那么 shebang 没有效果并且 <code>bash</code>会处理 脚本的执行。 - + - - - + - +
@@ -547,6 +547,39 @@ + + 基于苏大ppt的计算机硬件笔记 + + https://thinklive1.github.io/2023/09/29/%E7%A1%AC%E4%BB%B6%E6%80%BB%E5%92%8C%E7%AC%94%E8%AE%B0/ + 2023-09-29T02:18:45.993Z + 2023-11-27T12:47:59.707Z + + `冯·诺依曼计算机特点
– 计算机由五大部件组成
• 输入数据和程序的“输入设备”
• 记忆程序和数据的“存储器”
• 完成数据加工处理的“运算器”
• 控制程序执行的“控制器”
• 输出处理结果的“输出设备”

– 指令和数据以同等地位存于存储器,可按地址寻访
– 指令和数据用二进制表示
– 指令由操作码和地址码组成
– 以运算器为中心 基础逻辑电路:与门,非门,或门,异或门,与非门,或非门,同或门 半加器
– 𝑆𝑖当前位, 𝐶𝑖进位符 全加器 (包括之前的进位cn-1) – 𝐹𝑛当前位, 𝐶𝑛进位符 𝐶𝑛 = 𝑋𝑛 ⋅ 𝑌𝑛 + 𝑋𝑛⨁𝑌𝑛 ⋅ 𝐶𝑛−1 图片 图片 图片 CPU与外设之间的数据交换必须通过接口来完成,通常接口有
以下一些功能:
– 设置数据的寄存、缓冲逻辑,以适应CPU与外设之间的速度差异;
– 进行信息格式的转换,例如串行和并行的转换;
– 协调CPU和外设两者在信息的类型和电平的差异,如电平转换驱动器、
数/模或模/数转换器等;
– 协调时序差异;
– 地址译码和设备选择功能;
– 设置中断和DMA(直接存储器存取)控制逻辑,以保证在中断和DMA
允许的情况下产生中断和DMA请求信号,并在接受到中断和DMA应答
之后完成中断处理和DMA传输。 `为何要用二进制表示(冯.诺依曼核心)
– 无法制造多个稳定状态的物理器件
– 编码、计数、运算规则简单
– 和逻辑的真、假对应,通过逻辑门电路可实现算数运算 BCD码
– 机器中用4位二进制对每个十进制数位进行编码方法
– 4位二进制有16种组合,选取其中的十个。
– 常用的方法有:8421码、余3码、格雷码

为什么要用BCD码
– 高精确度的计算
– 耗费更多的存储空间 数的定点与浮点表示 – 十进制的公式表示:𝑁 = 10𝐸 ∗ 𝑆 – 二进制数的公式表示:𝑁 = 2𝐸 ∗ 𝑆 • 定点数:阶码𝐸位置固定,存储时统一忽略阶码 – 定点整数: 𝐸 = 0, 𝑆为纯整数,小数点固定在数值部分的右边 – 定点小数: 𝐸 = 0, 𝑆为纯小数,小数点固定在数值部分的左边浮点数详解
– 浮点数的表示范围
• 阶码E的范围:−128 ≤ 𝑒 < 127
• 最大正数:0.111 ... 1 × 2011...1 = (1 − 2^−23) × 2^127
• 最小正数:0.100 ... 0 × 2100...0 = 1
2 × 2−128 = 2−129
– 浮点数的表示精度
• 总位数不变
– 阶码越大:数值表示范围越大
– 尾数越少:精度变低 图片 机器数的表示形式:原码、反码、补码
– 原码:符号+真值
• +41 原 = 0 0101001, −41 原 = 1 0101001
• +0 原 = 0 0000000, −0 原 = 1 0000000
– 反码:正数不变,负数时符号不变,其他各位取反
• +41 反 = 0 0101001, −41 反 = 1 1010110
• +0 反 = 0 0000000, −0 反 = 1 1111111
– 补码:正数不变,负数为反码+1(计算机表示带符号数的方法)
• +41 补 = 0 0101001, −41 补 = 1 1010111
• +0 补 = 0 0000000, −0 补 = 0 0000000
• +127 补 = 0 1111111, −127 补 = 1 0000001
• −128 补 = 1 0000000 `溢出
– 运算结果超出机器数所能表示的范围时,称为溢出
– 定点数溢出的判断方法
• 两个同符号的数相加,得到的和的符号与相加数的符号不一致。
– 采用双符号位:正数的符号位为00,负数的符号位为11。符号位参加运算。如果
两个符号位不相同,则溢出。(浪费资源)
• 任意两数相加,如果数值最高位的进位不等于符号位的进位,则溢出。
– 浮点数溢出的判断方法
• 看阶码是否溢出!

BCD码:用四位二进制数表达一个十进制数,方便运算和显示 浮点数:尾数S和阶码E 符号+阶码+符号+尾数 反码:正数不变,负数除了符号位取反 补码:正数不变,负数除了符号位加一 +0:00000000 -128:10000000 [x+y]补=[x]补+[y]补 [x-y]补=[x]补+[-y]补

有效地址EA=基址(BX/BP)+变址值(SI/DI)+位移量DISP +段基址=物理地址

CISC和RISC是CPU的两种基本架构

– CISC:寻址方式多,方便编程
– RISC:寻址方式少,指令短、规整

RISC特点

– 指令系统
• RISC指令长度相同;寻址方式少;指令执行时间相当
– RISC CPU内部寄存器多
– 存储器操作
• 只有取数/存数指令访问存储器,大部分指令都在寄存器之间进行
– 代码量增多,实现特殊功能时程序复杂
– 较少的单元电路,面积小,功耗低
– 结构简单,设计周期短

程序执行过程

– PC发起地址查询
– 内存依据地址返回指令/数据
– CPU进行指令解析
– PC增量或PC赋值
• 指令结构
– 操作码+地址码(操作数所在地)

寻址方式

8086/8088微处理器

指令队列缓冲器

– 取指令时,每当指令队列缓冲区满一条指令,EU立即开始执行
– 当指令队列中有2个空字节(8088一个)BIU自动去取指
– EU从指令队列中去取指,然后执行指令,当该指令需要内存或
I/O访问,EU请求BIU进入总线周期完成访问:
• BIU空闲状态:立即响应
• 正在取指:取指完后响应
– 指令队列已满,EU没有对BIU有请求,BIU进入空闲状态
– 执行转移、调用、返回指令:指令队列中的内容(原顺序指令)
被清除,BIU去取EU所指示的新的程序段指令

寻址空间计算

– 8位机寻址:8根地址线
• 地址范围:0~255
• 最大内存空间:28 = 256Byte
– 16位机:216 = 64KB
– 32位机:232 = 4GB
– 64位机:264 = 16EB

编程结构

图片 – 4个通用寄存器(16位)
• AX、BX、CX、DX(可8位单独使用)
– 4个专用寄存器(16位)
• BP(Base Pointer)基数指针
• SP(Stack Pointer)堆栈指针
• SI(Source Index)源变址
• DI(Destination Index)目的变址
– 4个段寄存器(16位)
• CS(Code Segment)代码段寄存器
• DS(Data Segment)数据段寄存器
• SS(Stack Segment)堆栈段寄存器
• ES(Extra Segment)扩展段寄存器 – CS用来存放程序当前使用的代码段的段地址,CPU执行的指令
将从代码段取得
• CS:IP构成传统意义的PC
– SS用来存放堆栈段的段地址,堆栈操作的数据就在堆栈段中
• 通常SS:SP和SS:BP构成堆栈段的访问
– DS用来存放数据段的段地址,一般地说,程序所用的数据就存
放在数据段中
• 通常DS:XX(通用寄存器)构成对数据段的访问;
– ES用来存放附加段的段地址,也用来存放数据,但典型用法是
存放处理后的数据

主存储器

主存储器处于中心地位的原因

• 当前计算机正在执行的程序和数据均存放在存储器中,
CPU直接从存储器取指令或数据;
• 输入输出设备增多,数据传输速度加快,因此采用了
DMA(直接存储器存取)技术和输入/输出通道技术,
在存储器与输入/输出系统之间直接传送数据;
• 共享存储器的多处理机的出现,利用存储器存放共享
数据,并实现处理机之间的通信。

存储器的分类和指标

随机存储器(random access memory,RAM)
• 又称读写存储器,指通过指令可以随机地、个别地对
各个存储单元进行访问(读写)的存储器
• 访问所需时间基本固定,与存储单元地址无关
• 停电会造成信号丢失
非易失性存储器
• 停电仍能保持其内容 容量 • 计算机可寻址的最小单位是一个存储字,一个存储字 所包括的二进制位数称为字长 • 一个字节(Byte)为8个二进制位(bit),一个字可 以由若干字节组成,一个字的字长通常是8的倍数。 • 主存储器的容量:以字或字节为单位来表示主存储器 存储单元的总数 • 单位:B、KB、MB、GB、 TB、PB、EB、ZB... • 指令中地址码的位数决定了主存储器的可直接寻址的 最大空间 • 32位微型机提供32位物理地址,支持对4G字节的物理主存 空间的访问存储器存取时间(Memory Access Time)
• 又称存储器访问时间
• 启动一次存储器操作到完成该操作所经历的时间。
`存储周期(Memory Cycle Time)
• 连续启动两次独立的存储器操作(例如连续两次读操
作)所需间隔的最小时间 • 主存储器和CPU是由总线连接的。CPU通过使
用AR(地址寄存器)和DR(数据寄存器)个
主存储器进行数据传送。若AR为K位字长,
DR为n位字长,则允许主存包含2^k个可寻址
字节或字。
• 在一个周期内,CPU和主存储器之间进行n位
数据传送。 读操作:存储器→CPU
• CPU把信息字的地址送到
AR,经地址总线送往主存
储器
• CPU通过控制总线发读
(Read)命令
• CPU等待主存储器的
Ready回答信号,Ready
为 1,表示信息已读出经
数据总线,送入DR。
AR:地址寄存器
DR:数码寄存器
主存储器的基本操作

• 写操作:CPU→存储器
• CPU把信息字的地址送
到AR,经地址总线送往
主存储器,并将信息字送
往DR
• CPU通过控制总线发写
(Write)命令
• CPU等待主存储器的
Ready回答信号,Ready
为 1,表示信息已从DR
经数据总线写入主存储

读写存储器

按存储元件在运行中能否长时间保存信息分为静
态存储器SRAM和动态存储器DRAM两种
• 静态存储器:利用双稳态触发器来保存信息,只
要不断电,信息就不会丢失
• 动态存储器:利用MOS电容存储电荷来保存信
息,使用时需不断给电容充电才能使信息保持
• 静态存储器的集成度低,功耗较大;动态存储器
的集成度高,功耗小,主要用于大容量存储器 • DRAM每片容量大,引脚少; 价格低; 功耗低; 但
速度低,须再生。 DRAM一般用作计算机的主
存储器。
• SRAM速度快,价格较高,一般用作容量不大的
高速存储器。 DRAM和SRAM是可任意读写的随机存储器,当发生掉电时,存储的
内容容易立即消失,属于易失性存储器。
非易失性存储器,即使掉电,内容也不会消失:
只读存储器(ROM)
• 掩膜式ROM,由芯片制造商在制造时写入内容,以后只能读不能写
可编程序的只读存储器(PROM)
• 用户根据自己需要确定ROM的内容;
• 有熔丝式PROM,刚出厂的产品熔丝是全部接通的,使用前,用户根据需要断开某些单元
的熔丝(写入)。
可擦除可编程序的只读存储器(EPROM)
• 产品出厂时,所有存储单元都不导通,当浮置栅注入电子后,存储单元将通导;当芯片用紫外线
照射后,浮置栅上的电子将逸散,即整体擦除。
可用电擦除的可编程序的只读存储器(E2PROM)
• 编程原理和EPROM同,但读写操作可按每个位或每字节进行(类似于SRAM),但每字节的写
入周期要几毫秒,寿命为10万次。
闪速存储器(Flash Memory)
• 用电擦除,但只能整体擦除或分区擦除。

8086/8088存储器组织

存储器分段
– 为什么分段
• 地址寄存器均为16位: 216 = 64KB
– 分段方便操作系统进行存储管理
– 如何分段
• 8086地址空间为20位=1MB,地址为5位16进制数:00000H~FFFFFH
– 从偏移地址考虑,理论上最多16个不重叠的地址段
– 从段地址考虑,最多可以定义216个不同段
– 段重叠
• 段区分配通常由操作系统完成
– CS、DS、SS、ES存储与程序相关的段基址
– IP、SP、BP、SI、DI存储与程序相关的偏移地址 逻辑地址和物理地址
– 逻辑地址
• 程序和指令表示的一种地址
• 包括两部分:段地址和偏移地址
– 物理地址
• 段地址*\16+偏移地址=物理地址
– 寻址操作根据操作系统默认规则完成 堆栈(段)
– 机制
• 栈顶为唯一出入口
– 地址较小的一端
• 后进先出原则
– 作用
• 数据暂存
• 保留轨迹 段加偏移”寻址机制允许重定位
– 重定位是指一个完整的程序块或数据块可以在存储器所允许的空
间内任意浮动,并定位到一个新的可寻址的区域
– 允许程序和数据不需要做任何修改

小结

• 微处理器的设计有CISC与RISC两种基本架构。深入理解16位微处理器8086的内部结构
及其工作原理,是掌握微机工作原理的基础和关键。Intel系列高档微处理器内部的复杂
结构及其工作原理,都是在8086CPU的结构基础上逐步分解结构和细化流水线操作而发
展起来的。透彻地掌握8086CPU的基础,将有利于理解高档微处理器的技术发展。
• 8086/8088 CPU的内部结构由总线接口单元BIU和执行单元EU两部分组成。其内部有3
组共14个寄存器,必须了解它们各自的功能,并能掌握它们的使用方法。
• 总线周期是理解CPU按时序工作的重要概念。8086/8088 CPU一个最基本的总线周期由
4个时钟周期组成,简称为4个状态,即T1、T2、T3与T4这4个状态。
• 微处理器的引脚及其功能是其重要的外部特性。由于8086/8088 CPU只有40条引脚,
学习和掌握它们的功能相对于高档微处理器说来就比较简单。

CF - 进位标志(Carry Flag),表示上一条指令的运算是否产生进位。如果产生进位,CF为1,否则为0。OF - 溢出标志(Overflow Flag),表示上一条指令的结果是否越界。如果结果超出目的操作数可以表示的范围,OF为1,否则为0。 SF - 符号标志(Sign Flag),表示上一条指令运算结果的符号。如果结果为负数,SF为1,如果为正数,SF为0。 ZF - 零标志(Zero Flag),表示上一条指令的运算结果是否为0。如果结果为0,ZF为1,否则为0。

指令格式

计算机是通过指令来处理各种数据,为指出数据的来源、
操作结果的去向及执行何操作,一条指令必须包含以下信
息:
– (1) 操作码——位数及位置。
– (2) 操作数的地址——操作数的个数
– (3) 操作结果的存储地址。
– (4) 下一条指令的地址 指令长度 – 可以等于机器字长,也可以大于或小于机器字长。 • 尽可能短 • 等于字节的整数倍。 – 若所有指令的长度都是相等的,称为定长指令字结构 • RISC指令大多采用定长指令结构 – 若各种指令的长度随指令功能而异,操作码
– 操作码的位数取决于计算机指令系统的规模
– 定长编码和变长编码 变长编码:分散地放在指令字的不同字段中,如INTEL 8086/Pentium
– 优点:能表示更多的指令
– 缺点:增加了译码难度,控制器复杂 指令涉及的数据类型 – 地址:无符号数,一般是加减操作(含移位) • 8、16或32位 – 数值数据 • 定点数(整数):补码表示 – 16位、32位、64位 • 浮点数(实数):IEEE754标准 – 位、位串、字符与字符串 • 用来表示文本、声音和图像等 • 字节、字(16位)、双字(32位)、四字(64位) – 现代32位计算机通常以32位为一个字:字节、半字(16位)、字(32位)、双字(64位) – 逻辑数据 • 按位操作(0-假/非0-真)数据寻址方式
– 有效地址EA(Effective Address)=基址值(BX或BP)+变址
值(SI或DI)+位移量DISP
• +段基址=物理地址
– 根据命令判断字段长短
• 通常由寄存器长度决定

寻址方式

1
2
3
4
5
6
7
8
9
10
11
12
其他寻址方式  
– 串操作指令寻址方式
• 操作类别:清0、复制、比较等
• 源数据地址:DS:SI
• 目标数据地址:ES:DI
– I/O端口寻址方式
• 直接端口寻址
– IN AL, n OUT n, AL
– 端口号:0~255
• 间接端口寻址
– IN AL, DX OUT DX, AL
– 端口号:0~65535

通用数据传送

//CS - Code Segment,代码段寄存器。它保存代码段的起始地址,用于查找程序的指令。IP - Instruction Pointer,指令指针寄存器。它保存下条指令的地址,用于告诉CPU去哪里找到下一条要执行的指令。 1、基本传送指令 MOV(Move):传送
– 一般形式:MOV dest, src
• dest  src,将源操作数src复制到目的操作数dest,src不变 2、堆栈操作
– PUSH src
– POP dest
– LIFO后进先出
– 堆栈操作按字进行
– 不能POP CS 3、XCHG(Exchange):交换
– 一般形式:
• XCHG oprd1, oprd2 ;交换oprd1与oprd2的内容
– 语法格式:
• XCHG reg/mem, reg/mem 4.字节翻译指令XLAT(代码转换或查表指令)
– BX 基址:代码转换表首地址(表大小:0~255)
– AL 偏移(码值) MOV BX,0030H
MOV AL,5
XLAT

目标地址传送类指令

LEA(Load Effective Address)装入有效地址 – 语法格式:LEA reg16, mem ;reg16 = mem的有效地址 – 通常用于建立串操作 – 对标志位的影响:无。 – 【例】设BX = 5678H • LEA SI, 2\[BX] ;执行后,SI = 567AH 将计算结果放入BX寄存器,而不会访问那个地址的值LDS reg16, mem
– 定位串操作源地址
– LDS SI, [DI+100AH]
– 低16位存入reg16,高16位存入DS
LES reg16, mem – 定位串操作目标地址 – 同上,高16位存入ESLAHF、SAHF(保存和设置标志位)
– 与AH寄存器交互
– SF:符号标志:运算结果符号位
– ZF:零标志:运算结果是否为0
– AF:辅助进位标志:低四位是否向高四位进位
– PF:奇偶标志:是否有偶数个1
– CF:进位标志:是否进位/借位

算术运算类指令

加法
– 一般形式:
• ADD dest, src ; dest  dest + src
• ADC dest, src ; dest  dest + src + CF
• INC oprd ;oprd  oprd + 1
– 语法格式:
• ADD reg/mem, reg/mem/imm
• ADC reg/mem, reg/mem/imm
• INC reg/mem
– 对标志位的影响:
• ADD、ADC:按一般规则影响CF、OF、SF和ZF
• INC:不影响CF,其它同ADD
• ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数 减法
– 一般形式:
• SUB dest, src ; dest  dest - src
• SBB dest, src ; dest  dest - src - CF
• CMP oprd1, oprd2 ; oprd1 - oprd2
– 与SUB的区别在于,不将减法结果存入dest,只影响标志位
• DEC oprd ; oprd  oprd - 1
• NEG oprd ; oprd  0 – oprd = oprd + 1
– 语法格式:
• SUB reg/mem, reg/mem/imm
• SBB reg/mem, reg/mem/imm
• CMP reg/mem, reg/mem/imm
• DEC reg/mem
• NEG reg/mem SUB、SBB、CMP:影响CF、OF、SF、ZF、AF和PF
• DEC:不影响CF,其它同SUB
• SUB与SBB的2个操作数必须类型匹配,且不能同时是内存操作数 乘法
– MUL(Unsigned Multiplication):无符号乘法 – 一般形式: • MUL src – 语法格式: • MUL reg8/mem8 ; AX = AL × src • MUL reg16/mem16 ; DX:AX = AX × src • 对标志位的影响:若8位×8位、16位×16位的结果分别能由8、16位容 纳(即结果的高一半为0),则CF = OF = 0,否则,CF = OF = 1;其 余标志无定义。 • 由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果为 16位;同样,16位操作数相乘结果为32位(80386中32位数相乘结果 为64位)。IMUL(Integer Multiplication):带符号乘法
– 一般形式:
• IMUL src
– 语法格式:
• IMUL reg8/mem8 ; AX = AL × src
• IMUL reg16/mem16 ; DX:AX = AX × src
• 对标志位的影响:若结果的高一半为低一半的符号扩展,则CF = OF =
0,否则,CF = OF = 1;其余标志无定义
– 【例】对于同一个二进制数,采用 MUL与IMUL执行的结果可能
不同。设AL = 0FFH,BL = 1,分别执行下列指令,会得出不同
结果。
• MUL BL ; AX = 00ffh(255D)
• IMUL BL ; AX = 0ffffh(-1D) 除法
– 一般形式:
• DIV src ; 无符号数除法
• IDIV src ; 带符号数除法
– 语法格式:
• DIV reg/mem
• IDIV reg/mem
– 功能描述:
• src是8位:AX÷src,结果商在AL、余数在AH
• src是16位:DX:AX÷src,结果商在AX、余数在DX
– 对标志位的影响:无定义
– 若是8位÷8位或16位÷16位怎么解决?

符号扩展
– 对标志位的影响:无
– CBW、CWD(Convert Byte/Word to Word/Double word)
– 语法格式:
• CBW ; AL符号扩展为AX
– (若AL为正数,则零扩展,若AL为负数,则扩展部分全1)
• CWD ; AX符号扩展为32位数DX:AX
– 【例】设AL = 0FEH,给出依次执行下列指令后的结果。
• CBW ; ax = fffeh
• CWD ; dx = ffffh, ax不变,即dx:ax = -2
• 十进制调整指令(不要求)
– BCD码的加减乘除

逻辑运算类指令

AND reg/mem, reg/mem/imm
– OR reg/mem, reg/mem/imm
– XOR reg/mem, reg/mem/imm
– NOT reg/mem
– TEST reg/mem, reg/mem/imm;执行AND操作但不存储
结果
• 对标志位的影响:
– NOT:无。
– 其它指令:CF = OF = 0,按一般规则影响SF和ZF `使某位变反,其余位保持不变:对应位异或1,其余位为0
• 例: XOR AL, 60H ; 使第5、6两位为原来码的反码
• 特例: XOR AL, 0FFH = NOT AL

移位指令和循环移位指令

一般形式:
– SHL dest, count ; dest逻辑左移,count为移位次数
– SAL dest, count ; dest算术左移
– SHR dest, count ; dest逻辑右移
– SAR dest, count ; dest算术右移
– ROL, ROR循环左/右移;RCL, RCR带进位标志循环左/右移 对标志位的影响:
– 移位次数为1时,若移位后符号位发生了变化,则OF = 1,否则
OF = 0;若移位次数 > 1,则OF无定义
– 按一般规则影响ZF与SF。然而,若移位次数为0,则不影响标志
位;CF为最后移入位
• 参数规范:当count = 1时,可以立即数输入,否则需先
存入CL中;count取值范围0~255
• 【例】设AX的值为一个2字节非压缩BCD码,将其转换为
1字节压缩BCD码存入AL。
MOV CL, 4
SHL AH, CL ; ah低4位移到高4位
AND AL , 0FH ; al高4位清0
OR AL , AH

串操作指令

目标和源都是存储器 (字、字节)
– DS:SI 提供源,ES:DI提供目的,CX提供长度
• 种类
– MOVS(Move)传送
– CMPS(Compare)比较
– SCAS(Scan)搜索
– LODS(Load)读
– STOS(Store)写
• 方向(DF标志位)
• 重复前缀
– REP(Repeat)
– REPE/REPZ
– REPNE/REPNZ

程序控制类指令

无条件转移JMP(Jump)
• 一般形式:
– JMP target ; 转移到target指定的目标地址处
– 根据转移的距离,JMP指令可分为下列两类:
• 段内转移:在同一代码段内进行,又称近(Near)转移,只要修改IP的
值即可实现
• 段间转移:可在不同代码段之间进行,又称远(Far)转移,需要同时
修改CS和IP的值
– 根据目标地址的指定方式,JMP指令又可分为直接转移和间接转

• 直接转移:是指转移的目标地址直接出现在指令中,在程序执行前就已
确定
• 间接转移:指转移的目标地址是寄存器或内存操作数的值,只有执行到
该条指令时才能确定 – 直接转移
• JMP [NEAR PTR] label ; 段内转移
– 目标地址 = IP + label(2字节) ; ±32KB
例:JMP ADDR1 ; ADDR1代表一个段内目标地址
ADDR1与当前IP位移量1235H, CS=1500H, IP=2400H
目的地址:18638H JMP SHORT label
– 目标地址 = IP + label(1字节) ; -128~127
• JMP FAR PTR label ; 段间转移
– 间接转移
• JMP reg16/WORD PTR mem
; IP = reg16/mem16 段内间接转移
例:JMP FAR PTR ADDR2 ; ADDR2代表一个段间目标地址
ADDR2所在CS=6500H,IP=020CH
目的地址:6520CH
例:JMP BX ;BX→IP,CS不变
JMP WORD PTR [DI] ;[DS:DI] →IP,CS不变 JMP DWORD PTR mem
– ; CS = [mem+2],IP = [mem]
例:当前CS=1000H, IP=026AH
DS=2000H, BX=1400H, ADDR3=020AH
JMP DWORD PTR [BX+ADDR3]
CS=4000H, IP=320EH • CALL过程名
– CALL NEAR PROC 段内直接寻址(修改IP, CS不变)
– CALL BX 段内间接转移(BX → IP)
– CALL FAR PROC 段间直接调用
• IP、CS都改变,例如:CALL 2000H:5600H
• 返回地址入栈包括CS和IP
– CALL DWORD PTR [reg16] 段间间接调用
• 低字 → IP,高字 → CS
– CALL与JMP区别
• CALL调用时会将修改前IP(或IP与CS)入栈,且完成后会返回当前位置
• RET
– 要和CALL调用类型对应:RET(段内)与RETF(段间)

1
2
3
4
5
6
7
8
9
10
11
12
例】求AX累加器和BX累加器中两个无符号数之差的绝  
对值,结果放在2800H单元中
CMP AX, BX
JB AA
SUB AX, BX
MOV DI, 2800H
MOV [DI], AX
JMP STOP ;该句缺少怎样?
AA: SUB BX, AX
MOV DI, 2800H
MOV [DI], BX
STOP: HLT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
【例】从外设71H中取一个数M,判断其值是否在10和20之  
间,如果M≥20,则送0FFH给外设73H;如果M<10,则送
00H给外设73H;如果10≤M<20,则送88H给外设73H
IN AL, 71H
CMP AL, 10
JNC LP1
MOV AL, 00H
JMP LP3
LP1: CMP AL, 20
JNC LP2
MOV AL, 88H
JMP LP3
LP2: MOV AL, 0FFH
LP3: OUT 73H, AL
HLT

循环控制(短地址区间)
– LOOP 目标地址
• CX-1,如CX≠0,转移到目标地址(负值)
– LOOPE/LOOPZ 目标地址
• CX-1,如ZF=1且CX≠0循环(LOOPNE/LOOPNZ时ZF=0)

【例】求2个数组之和,每个数组长度为N。如遇到2个组
1
2
3
4
5
6
7
8
数元素都为0,则停止求和  
MOV SI, -1
MOV CX, N
NEXT: INC SI
MOV AL, [ADDR1 + SI]
ADD AL, [SI + ADDR2]
MOV [SI + ADDR3], AL
LOOPNZ NEXT

中断指令
– INT 中断类型
• 0-255
• 中断向量表
– 每种中断占4个字节
» 前两个为偏移地址,后两个为段地址
– 和CALL的区别
• 相同点:断点入栈
• 不同点
– 清除中断标志IF
– 清除单步标志TF
– 标志寄存器入栈
• 【例】 INT 20H
– IRET
– INTO 溢出中断(中断号04H)

1
2
3
4
5
6
7
8
9
10
11
12
延时一秒
START: MOV CX, 1000
DELAY1S: CALL DELAY1MS
LOOP DELAY1S
HLT
DELAY1MS: PUSH CX
MOV CX, 374
LP1: PUSHF
POPF
LOOP LP1
POP CX
RET

类型

汇编流程 – 汇编源程序:用助记符指令、变量名和标号编写的程序。 • 文件名:\*\*\*.ASM – 目标程序:机器能识别的二进制代码程序。 • 文件名:\*\*\*.OBJ – 执行程序:为PC系统所接受的应用程序。 • 文件名:\*\*\*.EXE • 工具程序 – 汇编程序:把汇编源程序翻译成机器能识别的机器指令程序的工
具程序。 • 文件名:MASM.EXE – 连接程序:把目标文件与库文件以及其他目标文件连接在一起。 • 文件名:LINK.EXE汇编语言语句类型
– 指令性语句——真指令
• 实际的CPU指令
• 汇编程序将其翻译成机器目标代码
• 由四部分组成:
[标号:] 指令助记符 [操作数] [; 注释]
– 指示性语句——伪指令[伪操作指令]
• 方便编制程序
• 不产生代码
[名字] 伪操作命令 [操作数表] [; 注释]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SSEG SEGMENT PARA STACK ; 堆栈段定义  
DW 256 DUP (?)
SSEG ENDS
DSEG SEGMENT ; 数据段定义
MESS DB 'HELLO', 0DH, 0AH, '$'
DSEG ENDS
CSEG SEGMENT ; 代码段(指令区)
ASSUME CS:CSEG, DS:DSEG ; 规定段的性质
START: MOV AX, DSEG ; 设置数据段基值
MOV DS, AX
MOV DX, OFFSET MESS ; 显示字符串信息
MOV AH, 09
INT 21H
MOV AH,4CH ; 结束本程序运行,返回DOS
INT 21H
CSEG ENDS
END START
汇编语言有若干个段
段名、开始、结束
唯一的END结束
定义起始执行地址

表达式和运算符
– 由汇编程序计算
• 值
• 地址
– 算术运算符(7种)
• +、-、*、/
• MOD
• SHL、SHR 逻辑运算符(4种)
• AND、OR、XOR、NOT
• 和指令助记符的区别
• MOV AL, 0ADH AND 0EAH → MOV AL, 0A8H
– 关系运算符(6种)
• EQ、NE、LT、GT、LE、GE
• 关系成立时返回0FFFFH,不成立时返回0
– 数值返回运算符
• SEG
• OFFSET
• TYPE • SIZE
• LENGTH 属性运算符
• PTR 修改操作数类型
• THIS

伪指令

数据定义伪指令(变量定义)
– 数据定义伪指令用来为数据分配内存空间(规定变量的类型),
并设置相应内存单元的初始值。
– 形式:
变量名 变量定义符 操作数, 操作数, ..., 操作数
• 其中,变量名是一个符号地址,表示其后操作数的首地址,变量名为可
选项,给出变量名只是为了按名存取其对应的内存单元。 变量定义符主要包括下列几种
– DB(Define Byte):定义字节,后面的每个操作数占1个字节。
– DW(Define Word):定义字,后面的每个操作数占1个字。
– DD(Define Dword):定义双字,后面的每个操作数占2个字。
– 操作数可以是
• 常数 例:DATA DB 10, 4, 10H
• 表达式 例:DATA DW 2*3, 8/4
• 字符串 例:DATA DB 'ABCD'
– ?表示只保留内存空间,未定义初始值。
• 例:DATA DD ?, 1, ?
• 重复次数 DUP (操作数,...,操作数)
– 例:DATA DB 3 DUP(?,9)

存储器的分类与组成

存储器分类 – 程序的执行是从主存中自动的取指令到控制器进行解释执行,需 要的数据也放在主存中根据指令需要存取。 – 按存储介质分类 • 半导体存储器:双极型,静态MOS型,动态MOS型 • 磁表面存储器:磁盘(Disk)、磁带 (Tape) • 光存储器:CD、CD-ROM、DVD – 按断电后信息的可保存性分类 • 非易失性存储器 – 信息可一直保留,不需电源维持(如 :ROM、磁表面存储器、光存储器等) • 易失性存储器 – 电源关闭时信息自动丢失。(如:RAM、Cache等) – 按存储器功能分类 • 读写存储器(Read/Write Memory):可读可写 • 只读存储器(Read Only Memory):只能读不能写 – 按工作方式/存取方式分类 • 随机存取存储器Random Access Memory (RAM) – 每个单元读写时间一样,且与各单元所在位置无关,如:内存。 • 顺序存取存储器Sequential Access Memory (SAM) – 数据按顺序从存储载体的始端读出或写入,因而存取时间的长短与信息所在位置 有关,例如:磁带。 • 直接存取存储器Direct Access Memory (DAM) – 直接定位到要读写的数据块,在读写某个数据块时按顺序进行。例如:磁盘。 • 相联存储器Associate Memory/Content Addressed Memory (CAM) – 按内容存储与检索,根据内容访问存储位置并进行读写。例如:快表。 – 按容量/速度 • 寄存器 • 高速缓存 • 主存 • 外存储器参数 – 存取速度:
• 存取时间𝑇𝑎:指的是CPU从启动一次存储器操作到完成所需要的时间。
• 存取周期𝑇𝑚:是指连续启动两次独立的存储器操作所需最小时间间隔。
• 带宽(数据传输速度)

读写过程

– 读
• CPU先把读单元地址送到AR,经过地址总线送往主存,同时CPU通过控
制总线发一个读请求,然后CPU等待从主存储器发来的信号,通知CPU
读操作已经完成。
• 存储器通过ready线回答,如果ready信号为1,说明存储字的内容已经
读出,并放在数据总线上,送往DR。
– 写
• CPU先将写单元地址经AR送往地址总线,并把写内容字送DR,同时通
过控制总线发出写命令,然后CPU等待写操作完成信号。
• 主存把收到的信息字写入CPU指定的地址后通过ready线发出完成信号。

只读存储器

分类
– ROM
• 芯片的内容在制造时已经输入,只能读,不能修改。
• 存储原理:是根据元件的有无来表示该存储单元的信息(1或0)。存储
元件:二极管或晶体管。
– PROM(Programmable ROM, PROM)
• 用户可根据自己的需要来确定ROM里的内容,常见的是熔丝式PROM
是以熔丝的接通来表示1、断开表示0。常用于工业控制机。
– EPROM(Erasable PROM, EPROM)
• 紫外线擦除,只能对芯片进行整体擦除,而不能对芯片中个别需要改写
的存储单元单独擦除。编程次数不受限制。 E2PROM(Electrically EPROM)
• 电擦除,可以用字擦除方式擦除,也可以用数据块擦除方式擦除。以字
擦除方式操作时,能够只擦除被选中的那个存储单元的内容;在数据块
擦除方式操作时,可擦除数据块内所有单元的内容。编程次数受限制。
– 闪速存储器(Flash Memory)
• 一种快擦写型存储器,它的主要特点是:既可在不加电的情况下长期保
存信息,又能进行快速擦除(整体擦除或分区擦除)与重写,兼备了E2
PROM和RAM的优点。
• 闪存的读取速度与DRAM相近,是磁盘的100倍左右;写数据(快擦-
编程)则与硬盘相近。

拓展

内存

解决内存访问速度慢的措施有三个:
• 提高主存芯片本身的速度
• 采用多模块存储器技术
• 在主存和CPU之间加入Cache

外部存储器(辅助存储器

磁表面存储器
– 两类:数字磁记录和模拟磁记录。
– 原理:磁性材料沉积在基体上形成记录介质,通过磁头与记录介
质的相对运动来读写信息。
– 优点:
①容量大,位价低
②记录介质可重复使用
③信息可长期保存甚至可脱机保存
④非破坏性读出
– 缺点:
①速度慢
②对工作环境要求高 光存储器
– 记录原理:用激光在具有感光特性的介质上非接触地记录高密度
信息,以介质材料的光学性质的变化来表示0或1。
– 优点:容量大、可替换(便携带)
– 缺点:速度慢。

寻址时间
– 寻址时间包括两部分:磁头寻找目标磁道所需的寻道时间和找到
磁道后磁头等待所需要读写的区段旋转到磁头下方的等待时间。
– 平均寻址时间=平均寻道时间+平均等待时间
– 平均等待时间与磁盘转速有关,用磁盘旋转一周所需时间的一半
来表示。 数据传输率
– 外部:磁表面存储器的缓存在单位时间内与主机之间传送数据的
位数或字节数。
• 单位bps。
• 取决于总线的类型和标准
– ATA、SCSI、SATA、SAS
– 内部:磁头与硬盘内存之间的数据传输率。
• 传输率=记录密度D x 运动速度V
• 误码率
– 衡量磁表面存储器的出错概率,等于出错信息的位数和读出的总
信息位数比。 磁盘cache
– 基本情况:硬盘内存速度差 (ms-ns)
• 可采用增加磁盘主轴转速
• 提高I/O总线速度
• 改进读写算法
• 采用磁盘cache等方法
– 缓存的大小与速度是直接关系到硬盘的传输速度的重要因素。
– 主流硬盘的缓存8M以上(有些甚至1G)。
– 类型一般是DRAM或SDRAM。
– 采用预读策略(局部性规则):对顺序数据特别有效
• 视频数据
• 图像文件 磁盘阵列存储器(RAID)
• 廉价冗余磁盘阵列(RAID)是用多台磁盘储存器组成的大
容量外存储子系统。(Redundant Arrays of
Inexpensive Disk)由美国加州大学伯克利分校提出。
• 目的
– 组合小的廉价磁盘来代替大的昂贵的磁盘,降低大批量数据存储
的费用;
– 希望采用冗余信息的方式,使得磁盘失效时不会使对数据的访问
受损失;
– 能适当的提升数据传输速度。
– 保证数据的可靠性和高可用性 RAID的实现
– 专门的控制芯片来完成
– 用软件的方法来实现, RAID 0级(无冗余和无校验的数据分块)
– 将连续的数据块分别存放在不同的磁盘上。具有最高的I/O性能
和磁盘空间利用率,无数据冗余,无容错能力,不能应用于数据
安全性要求高的场合。
• RAID 1级(镜像磁盘阵列)
– 由磁盘对组成,每一个工作盘都有对应的镜像盘,上面保存着与
工作盘完全相同的数据,安全性高,但磁盘空间的利用率只有
50% RAID 2级(具有纠错海明码的磁盘阵列)
– 采用海明码纠错技术和位交叉技术,用户需增加足够的校验盘来
提供单纠错和双验错功能。当阵列内有G个数据盘时,则所需的
校验盘数C要满足公式: 2𝐶 ≥ 𝐺 + 𝐶 + 1,如果有4个数据盘,
则需要3个校验盘。对数据的访问涉及到磁盘阵列中的每一个盘,
对大数据量传送有较高性能,但不利于小数据量的传送。RAID
2很少使用。 位交叉存取
– 将一个数据段中的各位分别存储在不同的磁盘上,以同步方式进
行读写,最小访问数据单位是每个磁盘的最小读写单位(例如扇
区)X磁盘数。
– 适合传送批量数据
• 块交叉存取
– 以数据块为单位,将连续的数据块分别存放在不同的磁盘上,最
小访问数据单位是每个磁盘的最小读写单位(例如扇区)
– 适合传送少量数据 RAID 5级(无专用校验盘的奇偶校验磁盘阵列)
– 无专用的校验盘,将校验信息分布到组内所有盘上,对大、小数
据量的读写都有很好的性能,因而是一种较好的方案。
• RAID 10级(RAID 0级+RAID 1级)
– 由分块和镜像组成,是所有RAID中性能最好的磁盘阵列,但每
次写入时要写两个互为镜像的盘, CPU占用率高,磁盘的利用
率低 磁盘存储器与光盘存储器的比较
– 两种存储器的记录原理、组成部分等方面都是相同的。在计算机
中它们各有自己的特点与功能。
– 硬盘驱动器
• 容量大、数据传输率高、等待时间短。
– 光盘驱动器
• 存储密度高、容量大、价格低。但是光盘与主机的速度不匹配所以不能
作为中间存储器,即不能替代硬盘 图片 为什么这种层次化结构是有效的?
– 时间局部性(Temporal Locality)
• 含义:刚被访问过的单元很可能不久又被访问
• 做法:让最近被访问过的信息保留在靠近CPU的存储器中
– 空间局部性 (Spatial Locality)
• 含义:刚被访问过的单元的邻近单元很可能不久被访问
• 做法:将刚被访问过的单元的邻近单元调到靠近CPU的存储器中
– 大量典型程序的运行情况分析结果表明:程序具有访问局部性特

• 指令:指令按序存放,地址连续,循环程序段或子程序段重复执行
• 数据:连续存放,数组元素重复、按序访问

• 键盘
– 键盘是一组排列成阵列形式的按键开关,按下一个键就产生一个
相应的字符,然后转换成ASCII或其他码送往主机
– 键盘输入信号处理可分为三个步骤:
• (1) 按下一个键;
• (2) 查出按下的是哪一个键;
• (3) 将该键翻译成能被计算机接收的代码
• 键盘的种类
– 机械式键盘
• 触点的导通或断开
• 每个键由底座、轴帽、轴帽固定卡、弹簧、金属支脚、触点金属片 导电橡胶式键盘
• 通过导电的橡胶实现触点的连接
– 电容式键盘
• 当人体(手指)接触金属感应片的时候,由于人体相当于一个接大地的
电容,因此会在感应片和大地之间形成一个电容 薄膜式键盘
• 无机械磨损
• 低价格
• 低噪音
• 低成本
• 市场占有相当份额 • 鼠标
– 一种坐标定位部件,只能用来输入相对坐标。 • CMOS传感器将每一幅图像都发送给数字信号处理器(DSP)进行分析。
• DSP检测各图像中的图案,并分析图像中图案的位置如何变动。
• 根据一系列图像中图案位置的变化,DSP确定鼠标的移动距离并将相应
坐标发送给计算机。
• 计算机根据从鼠标接收到的坐标信息,移动屏幕上的光标。
– 与轨迹球鼠标相比,光电鼠标具有下列优势:
• 没有可移动的零部件,这意味着磨损更少、故障率更低。
• 灰尘无法进入鼠标内部并干扰跟踪传感器。
• 增加的跟踪分辨率意味着响应更顺畅。
• 不需要鼠标垫等专用表面。 触摸屏
– 电阻式:利用压力感应进行控制电阻
– 电容式:利用人体的电流感应进行工作
– 红外式:在显示器上加上光点距架框,在屏幕表面形成一个红外
线网
– 表面声波触摸屏:玻璃屏的左上角和右下角各固定了竖直和水平
方向的超声波发射换能器,右上角则固定了两个相应的超声波接
收换能器。玻璃屏的四个周边则刻有45°角由疏到密间隔非常精
密的反射条纹 条形码(Bar Code)
– 由一组宽度和反射率不同的平行相邻条和空按预先规定的编码规
则组合起来,用来表示一组数据的符号 主要类型
• 堆叠式/行排式
– 建立在一维条码基础之上,按需要堆积成二行或多行
– 继承了一维条码的一些特点
– 需要对行进行判定,其译码算法与软件也不完全相同于一维条码
• 矩阵式二维码
– 它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码
– 用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制
的“0”,点的排列组合确定了矩阵式二维条码所代表的意义 显示器显色原理
– 像素点:颜色显示的最小单元
• 一个像素点包含三原色
• 通过调整三原色的显示强弱来控制颜色 CRT
– 可用于字符、图形和图像显示器。
– CRT是一个真空器件,由电子枪、偏转装置和荧光屏组成。
– 玻璃屏内壁涂有荧光粉,它将电子束的动能转换成光能,显示出
光点。不同的荧光粉在电子束的轰击下发出不同的颜色。
– 对电子束的要求
• (1)电子束要有足够的强度和速度。
• (2)电子束要足够细。
• (3)电子束的运动方向要高度可控 有机发光二极管(OLED)
– 自发光的二极管,无需背光
• 等离子显示器(PDP)
– 利用惰性气体在一定电压下产生气体放电现象而实现的发光技术。
• 显示技术的重要技术指标
– 分辨率
• 字符显示方式
– 一屏可显示的最多字符数称为分辨率,例如80列×25行,表示每屏最多可显示25
行,每行可有80个字符。
• 在图形显示方式
– 一屏可显示的像点数称为分辨率,例如800×600,表示一屏可包含600条水平扫
描线,每线可分为800点。
• 分辨率越高,显示的信息越多 颜色数(位深):每个像素点可显示的颜色数(灰度级)
• 每种原色由8位表示灰度,三原色共计224种颜色
• 实际传输过程中采用32位表示一种颜色,而高端显示器每种原色用10位
表示,总共可表示230,约10.7亿色 按打字原理分:击打式打印机(点阵针式打印机)和非击
打式打印机(喷墨打印机、激光打印机)。
• 按工作方式分:串行打印机和行式打印机。串行打印机一
次只能打一个字,行式打印机一次可以打印一行
• 常见打印机类型
– 点阵针式打印机
– 激光打印机
– 喷墨打印机
– 热转印和热敏打字机
• 发展趋势
– 击打式和非击打式并存
– 击打式的多样化、特殊化:银行、铁路、超市、酒店

]]>
+ + + <p>`冯·诺依曼计算机特点<br /> +– 计算机由五大部件组成<br /> +• 输入数据和程序的“输入设备”<br /> +• 记忆程序和数据的“存储器”<br /> +• 完成数据加工处理的“运算器”<br /> +• 控制程序执行的“控制器”<br /> +• 输出处理结果的“输出设备”</p> + + + + + + + + + + + + + + +
+ 游戏简评 @@ -592,39 +625,6 @@ - - 基于苏大ppt的计算机硬件笔记 - - https://thinklive1.github.io/2023/09/29/%E7%A1%AC%E4%BB%B6%E6%80%BB%E5%92%8C%E7%AC%94%E8%AE%B0/ - 2023-09-29T02:18:45.993Z - 2023-11-27T12:47:59.707Z - - `冯·诺依曼计算机特点
– 计算机由五大部件组成
• 输入数据和程序的“输入设备”
• 记忆程序和数据的“存储器”
• 完成数据加工处理的“运算器”
• 控制程序执行的“控制器”
• 输出处理结果的“输出设备”

– 指令和数据以同等地位存于存储器,可按地址寻访
– 指令和数据用二进制表示
– 指令由操作码和地址码组成
– 以运算器为中心 基础逻辑电路:与门,非门,或门,异或门,与非门,或非门,同或门 半加器
– 𝑆𝑖当前位, 𝐶𝑖进位符 全加器 (包括之前的进位cn-1) – 𝐹𝑛当前位, 𝐶𝑛进位符 𝐶𝑛 = 𝑋𝑛 ⋅ 𝑌𝑛 + 𝑋𝑛⨁𝑌𝑛 ⋅ 𝐶𝑛−1 图片 图片 图片 CPU与外设之间的数据交换必须通过接口来完成,通常接口有
以下一些功能:
– 设置数据的寄存、缓冲逻辑,以适应CPU与外设之间的速度差异;
– 进行信息格式的转换,例如串行和并行的转换;
– 协调CPU和外设两者在信息的类型和电平的差异,如电平转换驱动器、
数/模或模/数转换器等;
– 协调时序差异;
– 地址译码和设备选择功能;
– 设置中断和DMA(直接存储器存取)控制逻辑,以保证在中断和DMA
允许的情况下产生中断和DMA请求信号,并在接受到中断和DMA应答
之后完成中断处理和DMA传输。 `为何要用二进制表示(冯.诺依曼核心)
– 无法制造多个稳定状态的物理器件
– 编码、计数、运算规则简单
– 和逻辑的真、假对应,通过逻辑门电路可实现算数运算 BCD码
– 机器中用4位二进制对每个十进制数位进行编码方法
– 4位二进制有16种组合,选取其中的十个。
– 常用的方法有:8421码、余3码、格雷码

为什么要用BCD码
– 高精确度的计算
– 耗费更多的存储空间 数的定点与浮点表示 – 十进制的公式表示:𝑁 = 10𝐸 ∗ 𝑆 – 二进制数的公式表示:𝑁 = 2𝐸 ∗ 𝑆 • 定点数:阶码𝐸位置固定,存储时统一忽略阶码 – 定点整数: 𝐸 = 0, 𝑆为纯整数,小数点固定在数值部分的右边 – 定点小数: 𝐸 = 0, 𝑆为纯小数,小数点固定在数值部分的左边浮点数详解
– 浮点数的表示范围
• 阶码E的范围:−128 ≤ 𝑒 < 127
• 最大正数:0.111 ... 1 × 2011...1 = (1 − 2^−23) × 2^127
• 最小正数:0.100 ... 0 × 2100...0 = 1
2 × 2−128 = 2−129
– 浮点数的表示精度
• 总位数不变
– 阶码越大:数值表示范围越大
– 尾数越少:精度变低 图片 机器数的表示形式:原码、反码、补码
– 原码:符号+真值
• +41 原 = 0 0101001, −41 原 = 1 0101001
• +0 原 = 0 0000000, −0 原 = 1 0000000
– 反码:正数不变,负数时符号不变,其他各位取反
• +41 反 = 0 0101001, −41 反 = 1 1010110
• +0 反 = 0 0000000, −0 反 = 1 1111111
– 补码:正数不变,负数为反码+1(计算机表示带符号数的方法)
• +41 补 = 0 0101001, −41 补 = 1 1010111
• +0 补 = 0 0000000, −0 补 = 0 0000000
• +127 补 = 0 1111111, −127 补 = 1 0000001
• −128 补 = 1 0000000 `溢出
– 运算结果超出机器数所能表示的范围时,称为溢出
– 定点数溢出的判断方法
• 两个同符号的数相加,得到的和的符号与相加数的符号不一致。
– 采用双符号位:正数的符号位为00,负数的符号位为11。符号位参加运算。如果
两个符号位不相同,则溢出。(浪费资源)
• 任意两数相加,如果数值最高位的进位不等于符号位的进位,则溢出。
– 浮点数溢出的判断方法
• 看阶码是否溢出!

BCD码:用四位二进制数表达一个十进制数,方便运算和显示 浮点数:尾数S和阶码E 符号+阶码+符号+尾数 反码:正数不变,负数除了符号位取反 补码:正数不变,负数除了符号位加一 +0:00000000 -128:10000000 [x+y]补=[x]补+[y]补 [x-y]补=[x]补+[-y]补

有效地址EA=基址(BX/BP)+变址值(SI/DI)+位移量DISP +段基址=物理地址

CISC和RISC是CPU的两种基本架构

– CISC:寻址方式多,方便编程
– RISC:寻址方式少,指令短、规整

RISC特点

– 指令系统
• RISC指令长度相同;寻址方式少;指令执行时间相当
– RISC CPU内部寄存器多
– 存储器操作
• 只有取数/存数指令访问存储器,大部分指令都在寄存器之间进行
– 代码量增多,实现特殊功能时程序复杂
– 较少的单元电路,面积小,功耗低
– 结构简单,设计周期短

程序执行过程

– PC发起地址查询
– 内存依据地址返回指令/数据
– CPU进行指令解析
– PC增量或PC赋值
• 指令结构
– 操作码+地址码(操作数所在地)

寻址方式

8086/8088微处理器

指令队列缓冲器

– 取指令时,每当指令队列缓冲区满一条指令,EU立即开始执行
– 当指令队列中有2个空字节(8088一个)BIU自动去取指
– EU从指令队列中去取指,然后执行指令,当该指令需要内存或
I/O访问,EU请求BIU进入总线周期完成访问:
• BIU空闲状态:立即响应
• 正在取指:取指完后响应
– 指令队列已满,EU没有对BIU有请求,BIU进入空闲状态
– 执行转移、调用、返回指令:指令队列中的内容(原顺序指令)
被清除,BIU去取EU所指示的新的程序段指令

寻址空间计算

– 8位机寻址:8根地址线
• 地址范围:0~255
• 最大内存空间:28 = 256Byte
– 16位机:216 = 64KB
– 32位机:232 = 4GB
– 64位机:264 = 16EB

编程结构

图片 – 4个通用寄存器(16位)
• AX、BX、CX、DX(可8位单独使用)
– 4个专用寄存器(16位)
• BP(Base Pointer)基数指针
• SP(Stack Pointer)堆栈指针
• SI(Source Index)源变址
• DI(Destination Index)目的变址
– 4个段寄存器(16位)
• CS(Code Segment)代码段寄存器
• DS(Data Segment)数据段寄存器
• SS(Stack Segment)堆栈段寄存器
• ES(Extra Segment)扩展段寄存器 – CS用来存放程序当前使用的代码段的段地址,CPU执行的指令
将从代码段取得
• CS:IP构成传统意义的PC
– SS用来存放堆栈段的段地址,堆栈操作的数据就在堆栈段中
• 通常SS:SP和SS:BP构成堆栈段的访问
– DS用来存放数据段的段地址,一般地说,程序所用的数据就存
放在数据段中
• 通常DS:XX(通用寄存器)构成对数据段的访问;
– ES用来存放附加段的段地址,也用来存放数据,但典型用法是
存放处理后的数据

主存储器

主存储器处于中心地位的原因

• 当前计算机正在执行的程序和数据均存放在存储器中,
CPU直接从存储器取指令或数据;
• 输入输出设备增多,数据传输速度加快,因此采用了
DMA(直接存储器存取)技术和输入/输出通道技术,
在存储器与输入/输出系统之间直接传送数据;
• 共享存储器的多处理机的出现,利用存储器存放共享
数据,并实现处理机之间的通信。

存储器的分类和指标

随机存储器(random access memory,RAM)
• 又称读写存储器,指通过指令可以随机地、个别地对
各个存储单元进行访问(读写)的存储器
• 访问所需时间基本固定,与存储单元地址无关
• 停电会造成信号丢失
非易失性存储器
• 停电仍能保持其内容 容量 • 计算机可寻址的最小单位是一个存储字,一个存储字 所包括的二进制位数称为字长 • 一个字节(Byte)为8个二进制位(bit),一个字可 以由若干字节组成,一个字的字长通常是8的倍数。 • 主存储器的容量:以字或字节为单位来表示主存储器 存储单元的总数 • 单位:B、KB、MB、GB、 TB、PB、EB、ZB... • 指令中地址码的位数决定了主存储器的可直接寻址的 最大空间 • 32位微型机提供32位物理地址,支持对4G字节的物理主存 空间的访问存储器存取时间(Memory Access Time)
• 又称存储器访问时间
• 启动一次存储器操作到完成该操作所经历的时间。
`存储周期(Memory Cycle Time)
• 连续启动两次独立的存储器操作(例如连续两次读操
作)所需间隔的最小时间 • 主存储器和CPU是由总线连接的。CPU通过使
用AR(地址寄存器)和DR(数据寄存器)个
主存储器进行数据传送。若AR为K位字长,
DR为n位字长,则允许主存包含2^k个可寻址
字节或字。
• 在一个周期内,CPU和主存储器之间进行n位
数据传送。 读操作:存储器→CPU
• CPU把信息字的地址送到
AR,经地址总线送往主存
储器
• CPU通过控制总线发读
(Read)命令
• CPU等待主存储器的
Ready回答信号,Ready
为 1,表示信息已读出经
数据总线,送入DR。
AR:地址寄存器
DR:数码寄存器
主存储器的基本操作

• 写操作:CPU→存储器
• CPU把信息字的地址送
到AR,经地址总线送往
主存储器,并将信息字送
往DR
• CPU通过控制总线发写
(Write)命令
• CPU等待主存储器的
Ready回答信号,Ready
为 1,表示信息已从DR
经数据总线写入主存储

读写存储器

按存储元件在运行中能否长时间保存信息分为静
态存储器SRAM和动态存储器DRAM两种
• 静态存储器:利用双稳态触发器来保存信息,只
要不断电,信息就不会丢失
• 动态存储器:利用MOS电容存储电荷来保存信
息,使用时需不断给电容充电才能使信息保持
• 静态存储器的集成度低,功耗较大;动态存储器
的集成度高,功耗小,主要用于大容量存储器 • DRAM每片容量大,引脚少; 价格低; 功耗低; 但
速度低,须再生。 DRAM一般用作计算机的主
存储器。
• SRAM速度快,价格较高,一般用作容量不大的
高速存储器。 DRAM和SRAM是可任意读写的随机存储器,当发生掉电时,存储的
内容容易立即消失,属于易失性存储器。
非易失性存储器,即使掉电,内容也不会消失:
只读存储器(ROM)
• 掩膜式ROM,由芯片制造商在制造时写入内容,以后只能读不能写
可编程序的只读存储器(PROM)
• 用户根据自己需要确定ROM的内容;
• 有熔丝式PROM,刚出厂的产品熔丝是全部接通的,使用前,用户根据需要断开某些单元
的熔丝(写入)。
可擦除可编程序的只读存储器(EPROM)
• 产品出厂时,所有存储单元都不导通,当浮置栅注入电子后,存储单元将通导;当芯片用紫外线
照射后,浮置栅上的电子将逸散,即整体擦除。
可用电擦除的可编程序的只读存储器(E2PROM)
• 编程原理和EPROM同,但读写操作可按每个位或每字节进行(类似于SRAM),但每字节的写
入周期要几毫秒,寿命为10万次。
闪速存储器(Flash Memory)
• 用电擦除,但只能整体擦除或分区擦除。

8086/8088存储器组织

存储器分段
– 为什么分段
• 地址寄存器均为16位: 216 = 64KB
– 分段方便操作系统进行存储管理
– 如何分段
• 8086地址空间为20位=1MB,地址为5位16进制数:00000H~FFFFFH
– 从偏移地址考虑,理论上最多16个不重叠的地址段
– 从段地址考虑,最多可以定义216个不同段
– 段重叠
• 段区分配通常由操作系统完成
– CS、DS、SS、ES存储与程序相关的段基址
– IP、SP、BP、SI、DI存储与程序相关的偏移地址 逻辑地址和物理地址
– 逻辑地址
• 程序和指令表示的一种地址
• 包括两部分:段地址和偏移地址
– 物理地址
• 段地址*\16+偏移地址=物理地址
– 寻址操作根据操作系统默认规则完成 堆栈(段)
– 机制
• 栈顶为唯一出入口
– 地址较小的一端
• 后进先出原则
– 作用
• 数据暂存
• 保留轨迹 段加偏移”寻址机制允许重定位
– 重定位是指一个完整的程序块或数据块可以在存储器所允许的空
间内任意浮动,并定位到一个新的可寻址的区域
– 允许程序和数据不需要做任何修改

小结

• 微处理器的设计有CISC与RISC两种基本架构。深入理解16位微处理器8086的内部结构
及其工作原理,是掌握微机工作原理的基础和关键。Intel系列高档微处理器内部的复杂
结构及其工作原理,都是在8086CPU的结构基础上逐步分解结构和细化流水线操作而发
展起来的。透彻地掌握8086CPU的基础,将有利于理解高档微处理器的技术发展。
• 8086/8088 CPU的内部结构由总线接口单元BIU和执行单元EU两部分组成。其内部有3
组共14个寄存器,必须了解它们各自的功能,并能掌握它们的使用方法。
• 总线周期是理解CPU按时序工作的重要概念。8086/8088 CPU一个最基本的总线周期由
4个时钟周期组成,简称为4个状态,即T1、T2、T3与T4这4个状态。
• 微处理器的引脚及其功能是其重要的外部特性。由于8086/8088 CPU只有40条引脚,
学习和掌握它们的功能相对于高档微处理器说来就比较简单。

CF - 进位标志(Carry Flag),表示上一条指令的运算是否产生进位。如果产生进位,CF为1,否则为0。OF - 溢出标志(Overflow Flag),表示上一条指令的结果是否越界。如果结果超出目的操作数可以表示的范围,OF为1,否则为0。 SF - 符号标志(Sign Flag),表示上一条指令运算结果的符号。如果结果为负数,SF为1,如果为正数,SF为0。 ZF - 零标志(Zero Flag),表示上一条指令的运算结果是否为0。如果结果为0,ZF为1,否则为0。

指令格式

计算机是通过指令来处理各种数据,为指出数据的来源、
操作结果的去向及执行何操作,一条指令必须包含以下信
息:
– (1) 操作码——位数及位置。
– (2) 操作数的地址——操作数的个数
– (3) 操作结果的存储地址。
– (4) 下一条指令的地址 指令长度 – 可以等于机器字长,也可以大于或小于机器字长。 • 尽可能短 • 等于字节的整数倍。 – 若所有指令的长度都是相等的,称为定长指令字结构 • RISC指令大多采用定长指令结构 – 若各种指令的长度随指令功能而异,操作码
– 操作码的位数取决于计算机指令系统的规模
– 定长编码和变长编码 变长编码:分散地放在指令字的不同字段中,如INTEL 8086/Pentium
– 优点:能表示更多的指令
– 缺点:增加了译码难度,控制器复杂 指令涉及的数据类型 – 地址:无符号数,一般是加减操作(含移位) • 8、16或32位 – 数值数据 • 定点数(整数):补码表示 – 16位、32位、64位 • 浮点数(实数):IEEE754标准 – 位、位串、字符与字符串 • 用来表示文本、声音和图像等 • 字节、字(16位)、双字(32位)、四字(64位) – 现代32位计算机通常以32位为一个字:字节、半字(16位)、字(32位)、双字(64位) – 逻辑数据 • 按位操作(0-假/非0-真)数据寻址方式
– 有效地址EA(Effective Address)=基址值(BX或BP)+变址
值(SI或DI)+位移量DISP
• +段基址=物理地址
– 根据命令判断字段长短
• 通常由寄存器长度决定

寻址方式

1
2
3
4
5
6
7
8
9
10
11
12
其他寻址方式  
– 串操作指令寻址方式
• 操作类别:清0、复制、比较等
• 源数据地址:DS:SI
• 目标数据地址:ES:DI
– I/O端口寻址方式
• 直接端口寻址
– IN AL, n OUT n, AL
– 端口号:0~255
• 间接端口寻址
– IN AL, DX OUT DX, AL
– 端口号:0~65535

通用数据传送

//CS - Code Segment,代码段寄存器。它保存代码段的起始地址,用于查找程序的指令。IP - Instruction Pointer,指令指针寄存器。它保存下条指令的地址,用于告诉CPU去哪里找到下一条要执行的指令。 1、基本传送指令 MOV(Move):传送
– 一般形式:MOV dest, src
• dest  src,将源操作数src复制到目的操作数dest,src不变 2、堆栈操作
– PUSH src
– POP dest
– LIFO后进先出
– 堆栈操作按字进行
– 不能POP CS 3、XCHG(Exchange):交换
– 一般形式:
• XCHG oprd1, oprd2 ;交换oprd1与oprd2的内容
– 语法格式:
• XCHG reg/mem, reg/mem 4.字节翻译指令XLAT(代码转换或查表指令)
– BX 基址:代码转换表首地址(表大小:0~255)
– AL 偏移(码值) MOV BX,0030H
MOV AL,5
XLAT

目标地址传送类指令

LEA(Load Effective Address)装入有效地址 – 语法格式:LEA reg16, mem ;reg16 = mem的有效地址 – 通常用于建立串操作 – 对标志位的影响:无。 – 【例】设BX = 5678H • LEA SI, 2\[BX] ;执行后,SI = 567AH 将计算结果放入BX寄存器,而不会访问那个地址的值LDS reg16, mem
– 定位串操作源地址
– LDS SI, [DI+100AH]
– 低16位存入reg16,高16位存入DS
LES reg16, mem – 定位串操作目标地址 – 同上,高16位存入ESLAHF、SAHF(保存和设置标志位)
– 与AH寄存器交互
– SF:符号标志:运算结果符号位
– ZF:零标志:运算结果是否为0
– AF:辅助进位标志:低四位是否向高四位进位
– PF:奇偶标志:是否有偶数个1
– CF:进位标志:是否进位/借位

算术运算类指令

加法
– 一般形式:
• ADD dest, src ; dest  dest + src
• ADC dest, src ; dest  dest + src + CF
• INC oprd ;oprd  oprd + 1
– 语法格式:
• ADD reg/mem, reg/mem/imm
• ADC reg/mem, reg/mem/imm
• INC reg/mem
– 对标志位的影响:
• ADD、ADC:按一般规则影响CF、OF、SF和ZF
• INC:不影响CF,其它同ADD
• ADD与ADC的2个操作数必须类型匹配,且不能同时是内存操作数 减法
– 一般形式:
• SUB dest, src ; dest  dest - src
• SBB dest, src ; dest  dest - src - CF
• CMP oprd1, oprd2 ; oprd1 - oprd2
– 与SUB的区别在于,不将减法结果存入dest,只影响标志位
• DEC oprd ; oprd  oprd - 1
• NEG oprd ; oprd  0 – oprd = oprd + 1
– 语法格式:
• SUB reg/mem, reg/mem/imm
• SBB reg/mem, reg/mem/imm
• CMP reg/mem, reg/mem/imm
• DEC reg/mem
• NEG reg/mem SUB、SBB、CMP:影响CF、OF、SF、ZF、AF和PF
• DEC:不影响CF,其它同SUB
• SUB与SBB的2个操作数必须类型匹配,且不能同时是内存操作数 乘法
– MUL(Unsigned Multiplication):无符号乘法 – 一般形式: • MUL src – 语法格式: • MUL reg8/mem8 ; AX = AL × src • MUL reg16/mem16 ; DX:AX = AX × src • 对标志位的影响:若8位×8位、16位×16位的结果分别能由8、16位容 纳(即结果的高一半为0),则CF = OF = 0,否则,CF = OF = 1;其 余标志无定义。 • 由于2个n位数的乘积可能需要2n位,因此,若操作数是8位,则结果为 16位;同样,16位操作数相乘结果为32位(80386中32位数相乘结果 为64位)。IMUL(Integer Multiplication):带符号乘法
– 一般形式:
• IMUL src
– 语法格式:
• IMUL reg8/mem8 ; AX = AL × src
• IMUL reg16/mem16 ; DX:AX = AX × src
• 对标志位的影响:若结果的高一半为低一半的符号扩展,则CF = OF =
0,否则,CF = OF = 1;其余标志无定义
– 【例】对于同一个二进制数,采用 MUL与IMUL执行的结果可能
不同。设AL = 0FFH,BL = 1,分别执行下列指令,会得出不同
结果。
• MUL BL ; AX = 00ffh(255D)
• IMUL BL ; AX = 0ffffh(-1D) 除法
– 一般形式:
• DIV src ; 无符号数除法
• IDIV src ; 带符号数除法
– 语法格式:
• DIV reg/mem
• IDIV reg/mem
– 功能描述:
• src是8位:AX÷src,结果商在AL、余数在AH
• src是16位:DX:AX÷src,结果商在AX、余数在DX
– 对标志位的影响:无定义
– 若是8位÷8位或16位÷16位怎么解决?

符号扩展
– 对标志位的影响:无
– CBW、CWD(Convert Byte/Word to Word/Double word)
– 语法格式:
• CBW ; AL符号扩展为AX
– (若AL为正数,则零扩展,若AL为负数,则扩展部分全1)
• CWD ; AX符号扩展为32位数DX:AX
– 【例】设AL = 0FEH,给出依次执行下列指令后的结果。
• CBW ; ax = fffeh
• CWD ; dx = ffffh, ax不变,即dx:ax = -2
• 十进制调整指令(不要求)
– BCD码的加减乘除

逻辑运算类指令

AND reg/mem, reg/mem/imm
– OR reg/mem, reg/mem/imm
– XOR reg/mem, reg/mem/imm
– NOT reg/mem
– TEST reg/mem, reg/mem/imm;执行AND操作但不存储
结果
• 对标志位的影响:
– NOT:无。
– 其它指令:CF = OF = 0,按一般规则影响SF和ZF `使某位变反,其余位保持不变:对应位异或1,其余位为0
• 例: XOR AL, 60H ; 使第5、6两位为原来码的反码
• 特例: XOR AL, 0FFH = NOT AL

移位指令和循环移位指令

一般形式:
– SHL dest, count ; dest逻辑左移,count为移位次数
– SAL dest, count ; dest算术左移
– SHR dest, count ; dest逻辑右移
– SAR dest, count ; dest算术右移
– ROL, ROR循环左/右移;RCL, RCR带进位标志循环左/右移 对标志位的影响:
– 移位次数为1时,若移位后符号位发生了变化,则OF = 1,否则
OF = 0;若移位次数 > 1,则OF无定义
– 按一般规则影响ZF与SF。然而,若移位次数为0,则不影响标志
位;CF为最后移入位
• 参数规范:当count = 1时,可以立即数输入,否则需先
存入CL中;count取值范围0~255
• 【例】设AX的值为一个2字节非压缩BCD码,将其转换为
1字节压缩BCD码存入AL。
MOV CL, 4
SHL AH, CL ; ah低4位移到高4位
AND AL , 0FH ; al高4位清0
OR AL , AH

串操作指令

目标和源都是存储器 (字、字节)
– DS:SI 提供源,ES:DI提供目的,CX提供长度
• 种类
– MOVS(Move)传送
– CMPS(Compare)比较
– SCAS(Scan)搜索
– LODS(Load)读
– STOS(Store)写
• 方向(DF标志位)
• 重复前缀
– REP(Repeat)
– REPE/REPZ
– REPNE/REPNZ

程序控制类指令

无条件转移JMP(Jump)
• 一般形式:
– JMP target ; 转移到target指定的目标地址处
– 根据转移的距离,JMP指令可分为下列两类:
• 段内转移:在同一代码段内进行,又称近(Near)转移,只要修改IP的
值即可实现
• 段间转移:可在不同代码段之间进行,又称远(Far)转移,需要同时
修改CS和IP的值
– 根据目标地址的指定方式,JMP指令又可分为直接转移和间接转

• 直接转移:是指转移的目标地址直接出现在指令中,在程序执行前就已
确定
• 间接转移:指转移的目标地址是寄存器或内存操作数的值,只有执行到
该条指令时才能确定 – 直接转移
• JMP [NEAR PTR] label ; 段内转移
– 目标地址 = IP + label(2字节) ; ±32KB
例:JMP ADDR1 ; ADDR1代表一个段内目标地址
ADDR1与当前IP位移量1235H, CS=1500H, IP=2400H
目的地址:18638H JMP SHORT label
– 目标地址 = IP + label(1字节) ; -128~127
• JMP FAR PTR label ; 段间转移
– 间接转移
• JMP reg16/WORD PTR mem
; IP = reg16/mem16 段内间接转移
例:JMP FAR PTR ADDR2 ; ADDR2代表一个段间目标地址
ADDR2所在CS=6500H,IP=020CH
目的地址:6520CH
例:JMP BX ;BX→IP,CS不变
JMP WORD PTR [DI] ;[DS:DI] →IP,CS不变 JMP DWORD PTR mem
– ; CS = [mem+2],IP = [mem]
例:当前CS=1000H, IP=026AH
DS=2000H, BX=1400H, ADDR3=020AH
JMP DWORD PTR [BX+ADDR3]
CS=4000H, IP=320EH • CALL过程名
– CALL NEAR PROC 段内直接寻址(修改IP, CS不变)
– CALL BX 段内间接转移(BX → IP)
– CALL FAR PROC 段间直接调用
• IP、CS都改变,例如:CALL 2000H:5600H
• 返回地址入栈包括CS和IP
– CALL DWORD PTR [reg16] 段间间接调用
• 低字 → IP,高字 → CS
– CALL与JMP区别
• CALL调用时会将修改前IP(或IP与CS)入栈,且完成后会返回当前位置
• RET
– 要和CALL调用类型对应:RET(段内)与RETF(段间)

1
2
3
4
5
6
7
8
9
10
11
12
例】求AX累加器和BX累加器中两个无符号数之差的绝  
对值,结果放在2800H单元中
CMP AX, BX
JB AA
SUB AX, BX
MOV DI, 2800H
MOV [DI], AX
JMP STOP ;该句缺少怎样?
AA: SUB BX, AX
MOV DI, 2800H
MOV [DI], BX
STOP: HLT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
【例】从外设71H中取一个数M,判断其值是否在10和20之  
间,如果M≥20,则送0FFH给外设73H;如果M<10,则送
00H给外设73H;如果10≤M<20,则送88H给外设73H
IN AL, 71H
CMP AL, 10
JNC LP1
MOV AL, 00H
JMP LP3
LP1: CMP AL, 20
JNC LP2
MOV AL, 88H
JMP LP3
LP2: MOV AL, 0FFH
LP3: OUT 73H, AL
HLT

循环控制(短地址区间)
– LOOP 目标地址
• CX-1,如CX≠0,转移到目标地址(负值)
– LOOPE/LOOPZ 目标地址
• CX-1,如ZF=1且CX≠0循环(LOOPNE/LOOPNZ时ZF=0)

【例】求2个数组之和,每个数组长度为N。如遇到2个组
1
2
3
4
5
6
7
8
数元素都为0,则停止求和  
MOV SI, -1
MOV CX, N
NEXT: INC SI
MOV AL, [ADDR1 + SI]
ADD AL, [SI + ADDR2]
MOV [SI + ADDR3], AL
LOOPNZ NEXT

中断指令
– INT 中断类型
• 0-255
• 中断向量表
– 每种中断占4个字节
» 前两个为偏移地址,后两个为段地址
– 和CALL的区别
• 相同点:断点入栈
• 不同点
– 清除中断标志IF
– 清除单步标志TF
– 标志寄存器入栈
• 【例】 INT 20H
– IRET
– INTO 溢出中断(中断号04H)

1
2
3
4
5
6
7
8
9
10
11
12
延时一秒
START: MOV CX, 1000
DELAY1S: CALL DELAY1MS
LOOP DELAY1S
HLT
DELAY1MS: PUSH CX
MOV CX, 374
LP1: PUSHF
POPF
LOOP LP1
POP CX
RET

类型

汇编流程 – 汇编源程序:用助记符指令、变量名和标号编写的程序。 • 文件名:\*\*\*.ASM – 目标程序:机器能识别的二进制代码程序。 • 文件名:\*\*\*.OBJ – 执行程序:为PC系统所接受的应用程序。 • 文件名:\*\*\*.EXE • 工具程序 – 汇编程序:把汇编源程序翻译成机器能识别的机器指令程序的工
具程序。 • 文件名:MASM.EXE – 连接程序:把目标文件与库文件以及其他目标文件连接在一起。 • 文件名:LINK.EXE汇编语言语句类型
– 指令性语句——真指令
• 实际的CPU指令
• 汇编程序将其翻译成机器目标代码
• 由四部分组成:
[标号:] 指令助记符 [操作数] [; 注释]
– 指示性语句——伪指令[伪操作指令]
• 方便编制程序
• 不产生代码
[名字] 伪操作命令 [操作数表] [; 注释]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SSEG SEGMENT PARA STACK ; 堆栈段定义  
DW 256 DUP (?)
SSEG ENDS
DSEG SEGMENT ; 数据段定义
MESS DB 'HELLO', 0DH, 0AH, '$'
DSEG ENDS
CSEG SEGMENT ; 代码段(指令区)
ASSUME CS:CSEG, DS:DSEG ; 规定段的性质
START: MOV AX, DSEG ; 设置数据段基值
MOV DS, AX
MOV DX, OFFSET MESS ; 显示字符串信息
MOV AH, 09
INT 21H
MOV AH,4CH ; 结束本程序运行,返回DOS
INT 21H
CSEG ENDS
END START
汇编语言有若干个段
段名、开始、结束
唯一的END结束
定义起始执行地址

表达式和运算符
– 由汇编程序计算
• 值
• 地址
– 算术运算符(7种)
• +、-、*、/
• MOD
• SHL、SHR 逻辑运算符(4种)
• AND、OR、XOR、NOT
• 和指令助记符的区别
• MOV AL, 0ADH AND 0EAH → MOV AL, 0A8H
– 关系运算符(6种)
• EQ、NE、LT、GT、LE、GE
• 关系成立时返回0FFFFH,不成立时返回0
– 数值返回运算符
• SEG
• OFFSET
• TYPE • SIZE
• LENGTH 属性运算符
• PTR 修改操作数类型
• THIS

伪指令

数据定义伪指令(变量定义)
– 数据定义伪指令用来为数据分配内存空间(规定变量的类型),
并设置相应内存单元的初始值。
– 形式:
变量名 变量定义符 操作数, 操作数, ..., 操作数
• 其中,变量名是一个符号地址,表示其后操作数的首地址,变量名为可
选项,给出变量名只是为了按名存取其对应的内存单元。 变量定义符主要包括下列几种
– DB(Define Byte):定义字节,后面的每个操作数占1个字节。
– DW(Define Word):定义字,后面的每个操作数占1个字。
– DD(Define Dword):定义双字,后面的每个操作数占2个字。
– 操作数可以是
• 常数 例:DATA DB 10, 4, 10H
• 表达式 例:DATA DW 2*3, 8/4
• 字符串 例:DATA DB 'ABCD'
– ?表示只保留内存空间,未定义初始值。
• 例:DATA DD ?, 1, ?
• 重复次数 DUP (操作数,...,操作数)
– 例:DATA DB 3 DUP(?,9)

存储器的分类与组成

存储器分类 – 程序的执行是从主存中自动的取指令到控制器进行解释执行,需 要的数据也放在主存中根据指令需要存取。 – 按存储介质分类 • 半导体存储器:双极型,静态MOS型,动态MOS型 • 磁表面存储器:磁盘(Disk)、磁带 (Tape) • 光存储器:CD、CD-ROM、DVD – 按断电后信息的可保存性分类 • 非易失性存储器 – 信息可一直保留,不需电源维持(如 :ROM、磁表面存储器、光存储器等) • 易失性存储器 – 电源关闭时信息自动丢失。(如:RAM、Cache等) – 按存储器功能分类 • 读写存储器(Read/Write Memory):可读可写 • 只读存储器(Read Only Memory):只能读不能写 – 按工作方式/存取方式分类 • 随机存取存储器Random Access Memory (RAM) – 每个单元读写时间一样,且与各单元所在位置无关,如:内存。 • 顺序存取存储器Sequential Access Memory (SAM) – 数据按顺序从存储载体的始端读出或写入,因而存取时间的长短与信息所在位置 有关,例如:磁带。 • 直接存取存储器Direct Access Memory (DAM) – 直接定位到要读写的数据块,在读写某个数据块时按顺序进行。例如:磁盘。 • 相联存储器Associate Memory/Content Addressed Memory (CAM) – 按内容存储与检索,根据内容访问存储位置并进行读写。例如:快表。 – 按容量/速度 • 寄存器 • 高速缓存 • 主存 • 外存储器参数 – 存取速度:
• 存取时间𝑇𝑎:指的是CPU从启动一次存储器操作到完成所需要的时间。
• 存取周期𝑇𝑚:是指连续启动两次独立的存储器操作所需最小时间间隔。
• 带宽(数据传输速度)

读写过程

– 读
• CPU先把读单元地址送到AR,经过地址总线送往主存,同时CPU通过控
制总线发一个读请求,然后CPU等待从主存储器发来的信号,通知CPU
读操作已经完成。
• 存储器通过ready线回答,如果ready信号为1,说明存储字的内容已经
读出,并放在数据总线上,送往DR。
– 写
• CPU先将写单元地址经AR送往地址总线,并把写内容字送DR,同时通
过控制总线发出写命令,然后CPU等待写操作完成信号。
• 主存把收到的信息字写入CPU指定的地址后通过ready线发出完成信号。

只读存储器

分类
– ROM
• 芯片的内容在制造时已经输入,只能读,不能修改。
• 存储原理:是根据元件的有无来表示该存储单元的信息(1或0)。存储
元件:二极管或晶体管。
– PROM(Programmable ROM, PROM)
• 用户可根据自己的需要来确定ROM里的内容,常见的是熔丝式PROM
是以熔丝的接通来表示1、断开表示0。常用于工业控制机。
– EPROM(Erasable PROM, EPROM)
• 紫外线擦除,只能对芯片进行整体擦除,而不能对芯片中个别需要改写
的存储单元单独擦除。编程次数不受限制。 E2PROM(Electrically EPROM)
• 电擦除,可以用字擦除方式擦除,也可以用数据块擦除方式擦除。以字
擦除方式操作时,能够只擦除被选中的那个存储单元的内容;在数据块
擦除方式操作时,可擦除数据块内所有单元的内容。编程次数受限制。
– 闪速存储器(Flash Memory)
• 一种快擦写型存储器,它的主要特点是:既可在不加电的情况下长期保
存信息,又能进行快速擦除(整体擦除或分区擦除)与重写,兼备了E2
PROM和RAM的优点。
• 闪存的读取速度与DRAM相近,是磁盘的100倍左右;写数据(快擦-
编程)则与硬盘相近。

拓展

内存

解决内存访问速度慢的措施有三个:
• 提高主存芯片本身的速度
• 采用多模块存储器技术
• 在主存和CPU之间加入Cache

外部存储器(辅助存储器

磁表面存储器
– 两类:数字磁记录和模拟磁记录。
– 原理:磁性材料沉积在基体上形成记录介质,通过磁头与记录介
质的相对运动来读写信息。
– 优点:
①容量大,位价低
②记录介质可重复使用
③信息可长期保存甚至可脱机保存
④非破坏性读出
– 缺点:
①速度慢
②对工作环境要求高 光存储器
– 记录原理:用激光在具有感光特性的介质上非接触地记录高密度
信息,以介质材料的光学性质的变化来表示0或1。
– 优点:容量大、可替换(便携带)
– 缺点:速度慢。

寻址时间
– 寻址时间包括两部分:磁头寻找目标磁道所需的寻道时间和找到
磁道后磁头等待所需要读写的区段旋转到磁头下方的等待时间。
– 平均寻址时间=平均寻道时间+平均等待时间
– 平均等待时间与磁盘转速有关,用磁盘旋转一周所需时间的一半
来表示。 数据传输率
– 外部:磁表面存储器的缓存在单位时间内与主机之间传送数据的
位数或字节数。
• 单位bps。
• 取决于总线的类型和标准
– ATA、SCSI、SATA、SAS
– 内部:磁头与硬盘内存之间的数据传输率。
• 传输率=记录密度D x 运动速度V
• 误码率
– 衡量磁表面存储器的出错概率,等于出错信息的位数和读出的总
信息位数比。 磁盘cache
– 基本情况:硬盘内存速度差 (ms-ns)
• 可采用增加磁盘主轴转速
• 提高I/O总线速度
• 改进读写算法
• 采用磁盘cache等方法
– 缓存的大小与速度是直接关系到硬盘的传输速度的重要因素。
– 主流硬盘的缓存8M以上(有些甚至1G)。
– 类型一般是DRAM或SDRAM。
– 采用预读策略(局部性规则):对顺序数据特别有效
• 视频数据
• 图像文件 磁盘阵列存储器(RAID)
• 廉价冗余磁盘阵列(RAID)是用多台磁盘储存器组成的大
容量外存储子系统。(Redundant Arrays of
Inexpensive Disk)由美国加州大学伯克利分校提出。
• 目的
– 组合小的廉价磁盘来代替大的昂贵的磁盘,降低大批量数据存储
的费用;
– 希望采用冗余信息的方式,使得磁盘失效时不会使对数据的访问
受损失;
– 能适当的提升数据传输速度。
– 保证数据的可靠性和高可用性 RAID的实现
– 专门的控制芯片来完成
– 用软件的方法来实现, RAID 0级(无冗余和无校验的数据分块)
– 将连续的数据块分别存放在不同的磁盘上。具有最高的I/O性能
和磁盘空间利用率,无数据冗余,无容错能力,不能应用于数据
安全性要求高的场合。
• RAID 1级(镜像磁盘阵列)
– 由磁盘对组成,每一个工作盘都有对应的镜像盘,上面保存着与
工作盘完全相同的数据,安全性高,但磁盘空间的利用率只有
50% RAID 2级(具有纠错海明码的磁盘阵列)
– 采用海明码纠错技术和位交叉技术,用户需增加足够的校验盘来
提供单纠错和双验错功能。当阵列内有G个数据盘时,则所需的
校验盘数C要满足公式: 2𝐶 ≥ 𝐺 + 𝐶 + 1,如果有4个数据盘,
则需要3个校验盘。对数据的访问涉及到磁盘阵列中的每一个盘,
对大数据量传送有较高性能,但不利于小数据量的传送。RAID
2很少使用。 位交叉存取
– 将一个数据段中的各位分别存储在不同的磁盘上,以同步方式进
行读写,最小访问数据单位是每个磁盘的最小读写单位(例如扇
区)X磁盘数。
– 适合传送批量数据
• 块交叉存取
– 以数据块为单位,将连续的数据块分别存放在不同的磁盘上,最
小访问数据单位是每个磁盘的最小读写单位(例如扇区)
– 适合传送少量数据 RAID 5级(无专用校验盘的奇偶校验磁盘阵列)
– 无专用的校验盘,将校验信息分布到组内所有盘上,对大、小数
据量的读写都有很好的性能,因而是一种较好的方案。
• RAID 10级(RAID 0级+RAID 1级)
– 由分块和镜像组成,是所有RAID中性能最好的磁盘阵列,但每
次写入时要写两个互为镜像的盘, CPU占用率高,磁盘的利用
率低 磁盘存储器与光盘存储器的比较
– 两种存储器的记录原理、组成部分等方面都是相同的。在计算机
中它们各有自己的特点与功能。
– 硬盘驱动器
• 容量大、数据传输率高、等待时间短。
– 光盘驱动器
• 存储密度高、容量大、价格低。但是光盘与主机的速度不匹配所以不能
作为中间存储器,即不能替代硬盘 图片 为什么这种层次化结构是有效的?
– 时间局部性(Temporal Locality)
• 含义:刚被访问过的单元很可能不久又被访问
• 做法:让最近被访问过的信息保留在靠近CPU的存储器中
– 空间局部性 (Spatial Locality)
• 含义:刚被访问过的单元的邻近单元很可能不久被访问
• 做法:将刚被访问过的单元的邻近单元调到靠近CPU的存储器中
– 大量典型程序的运行情况分析结果表明:程序具有访问局部性特

• 指令:指令按序存放,地址连续,循环程序段或子程序段重复执行
• 数据:连续存放,数组元素重复、按序访问

• 键盘
– 键盘是一组排列成阵列形式的按键开关,按下一个键就产生一个
相应的字符,然后转换成ASCII或其他码送往主机
– 键盘输入信号处理可分为三个步骤:
• (1) 按下一个键;
• (2) 查出按下的是哪一个键;
• (3) 将该键翻译成能被计算机接收的代码
• 键盘的种类
– 机械式键盘
• 触点的导通或断开
• 每个键由底座、轴帽、轴帽固定卡、弹簧、金属支脚、触点金属片 导电橡胶式键盘
• 通过导电的橡胶实现触点的连接
– 电容式键盘
• 当人体(手指)接触金属感应片的时候,由于人体相当于一个接大地的
电容,因此会在感应片和大地之间形成一个电容 薄膜式键盘
• 无机械磨损
• 低价格
• 低噪音
• 低成本
• 市场占有相当份额 • 鼠标
– 一种坐标定位部件,只能用来输入相对坐标。 • CMOS传感器将每一幅图像都发送给数字信号处理器(DSP)进行分析。
• DSP检测各图像中的图案,并分析图像中图案的位置如何变动。
• 根据一系列图像中图案位置的变化,DSP确定鼠标的移动距离并将相应
坐标发送给计算机。
• 计算机根据从鼠标接收到的坐标信息,移动屏幕上的光标。
– 与轨迹球鼠标相比,光电鼠标具有下列优势:
• 没有可移动的零部件,这意味着磨损更少、故障率更低。
• 灰尘无法进入鼠标内部并干扰跟踪传感器。
• 增加的跟踪分辨率意味着响应更顺畅。
• 不需要鼠标垫等专用表面。 触摸屏
– 电阻式:利用压力感应进行控制电阻
– 电容式:利用人体的电流感应进行工作
– 红外式:在显示器上加上光点距架框,在屏幕表面形成一个红外
线网
– 表面声波触摸屏:玻璃屏的左上角和右下角各固定了竖直和水平
方向的超声波发射换能器,右上角则固定了两个相应的超声波接
收换能器。玻璃屏的四个周边则刻有45°角由疏到密间隔非常精
密的反射条纹 条形码(Bar Code)
– 由一组宽度和反射率不同的平行相邻条和空按预先规定的编码规
则组合起来,用来表示一组数据的符号 主要类型
• 堆叠式/行排式
– 建立在一维条码基础之上,按需要堆积成二行或多行
– 继承了一维条码的一些特点
– 需要对行进行判定,其译码算法与软件也不完全相同于一维条码
• 矩阵式二维码
– 它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码
– 用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制
的“0”,点的排列组合确定了矩阵式二维条码所代表的意义 显示器显色原理
– 像素点:颜色显示的最小单元
• 一个像素点包含三原色
• 通过调整三原色的显示强弱来控制颜色 CRT
– 可用于字符、图形和图像显示器。
– CRT是一个真空器件,由电子枪、偏转装置和荧光屏组成。
– 玻璃屏内壁涂有荧光粉,它将电子束的动能转换成光能,显示出
光点。不同的荧光粉在电子束的轰击下发出不同的颜色。
– 对电子束的要求
• (1)电子束要有足够的强度和速度。
• (2)电子束要足够细。
• (3)电子束的运动方向要高度可控 有机发光二极管(OLED)
– 自发光的二极管,无需背光
• 等离子显示器(PDP)
– 利用惰性气体在一定电压下产生气体放电现象而实现的发光技术。
• 显示技术的重要技术指标
– 分辨率
• 字符显示方式
– 一屏可显示的最多字符数称为分辨率,例如80列×25行,表示每屏最多可显示25
行,每行可有80个字符。
• 在图形显示方式
– 一屏可显示的像点数称为分辨率,例如800×600,表示一屏可包含600条水平扫
描线,每线可分为800点。
• 分辨率越高,显示的信息越多 颜色数(位深):每个像素点可显示的颜色数(灰度级)
• 每种原色由8位表示灰度,三原色共计224种颜色
• 实际传输过程中采用32位表示一种颜色,而高端显示器每种原色用10位
表示,总共可表示230,约10.7亿色 按打字原理分:击打式打印机(点阵针式打印机)和非击
打式打印机(喷墨打印机、激光打印机)。
• 按工作方式分:串行打印机和行式打印机。串行打印机一
次只能打一个字,行式打印机一次可以打印一行
• 常见打印机类型
– 点阵针式打印机
– 激光打印机
– 喷墨打印机
– 热转印和热敏打字机
• 发展趋势
– 击打式和非击打式并存
– 击打式的多样化、特殊化:银行、铁路、超市、酒店

]]>
- - - <p>`冯·诺依曼计算机特点<br /> -– 计算机由五大部件组成<br /> -• 输入数据和程序的“输入设备”<br /> -• 记忆程序和数据的“存储器”<br /> -• 完成数据加工处理的“运算器”<br /> -• 控制程序执行的“控制器”<br /> -• 输出处理结果的“输出设备”</p> - - - - - - - - - - - - - - -
- 迪瑞克拉世界观设定集 @@ -857,18 +857,17 @@ - blacksouls人物解析 - - https://thinklive1.github.io/2023/09/29/black%20souls%E4%BA%BA%E7%89%A9%E8%A7%A3%E6%9E%90/ + blacksouls剧情解析 + + https://thinklive1.github.io/2023/09/29/black%20souls%E5%89%A7%E6%83%85%E8%A7%A3%E6%9E%90/ 2023-09-29T02:18:45.993Z 2023-11-27T12:47:59.687Z - 尸龙贾巴沃克
1
在天之繁星哟!命数已定之众哟!尽管去为爱所煎熬吧,为嫉妒之苦吧!呜呼!感激涕零吧!为这幸灾乐祸暗黑舞台点缀色彩就好!!!

象征着腐败与神秘的紫黑色,遍布全身的缝合痕迹与绷带,恶魔一样的卷曲角,晦暗如死尸的肤色,以及左眼燃烧着的灵魂之火(致敬黑岩射手可能性微存),尸龙姐姐的人物形象无时无刻不在传达着神秘强大而阴暗的气氛,本视频将对尸龙的整个人物进行解析 尸龙在爱丽丝镜中奇遇的原型是一首小诗,这首诗的大意是勇者手提沃伯尔之剑斩杀邪龙贾巴沃克,游戏中也承袭了这一设定,贾巴沃克一直都以死尸的形象登场 要解析这一角色,我们首先从最直接的行为说起,按游戏的时间线,尸龙姐姐大概做了以下这些事 1把童话(具体哪本未知,根据混沌迷宫的狼外婆信息推测可能是小红帽)给了渴望母爱的玛丽.苏,从而激发了虫虫的创作能力,导致她创造出一代的箱庭。顺便一提,关于尸龙玛丽苏的关系,游戏里没有直接证据支持姐妹说,混沌迷宫提到黑山羊有两个子嗣,米兰达认为尸龙有黑山羊的气息,且明显尸龙玛丽苏有一定关系,这些是确定的,但并未明说姐妹,有人从克苏鲁的设定中寻找论据,但本人对克系了解不多在此不评价。 2红偶像约会中电影《三人的茶会》提及茶会时期的三人曾经打倒过贾巴沃奇,不知是否和尸龙有关,此外尸龙也曾被昔日的勇者,如今的猎头兔打倒,自称在之后洗心革面,但相关资料太少,我们不知道是不是她放水或另有隐情 3格林被引导进玛丽苏的箱庭开始一代的故事,此时尸龙(不知道玛丽苏是否知情)已经乱入到一代的不思议之国,为格林一行人提供帮助,通关d结局后找她对话,她会直接把二代给剧透了,不过由于时间线上d结局应该直接接上二代,所以“正史”上可能没有这件事,顺便一提,一代的不思议之国是爱丽丝的箱庭,或者说玛丽苏的仿造品,也没有定论,所以很难推测尸龙是入侵还是本来就在那里 4来到二代时间线,由于不思议之国是奈亚的箱庭,而黑山羊则是奈亚的“配偶”,所以尸龙出现在这倒是理所应当,此时的尸龙以四噩梦之一的身份登场,,但工作内容则是在卡罗尔川上堆雪人,以及在格林面前装出温柔大姐姐的形象,十足的关系户做派。 里路线中,格林和米兰达等人可以先后对战三噩梦,以及杀死其余两个噩梦后现出真身的尸龙,值得一提的是这似乎是她全系列中唯一一次全力出手,并且在此战中死亡,但考虑到支配者的特性,是否死透了依旧存疑 以上就是尸龙在系列中的行动,接下来我将对这些行动的目的与尸龙的性格进行归纳。 尸龙首先是一个安静的观察者,一代中她只是在一棵树下扮尸体,二代则在河边堆雪人,如果格林不找她,在里线之前不会和她有任何交集,然而,隐藏和善表面下的真相是尸龙其实是个性格扭曲唯恐天下不乱的乐子人,是她启发了玛丽苏创造自己的黑童话箱庭,间接引发之后所有的故事,而一开始的目的可能只是以玛丽苏面对求而不得的母爱痛苦挣扎的样子为乐,也是她诅咒了狩猎邪龙的英雄,使兔子一族成为贪食尸体的魔兽,其中被沃波尔斩下头颅可能是她行事风格的分界线,其自述死前曾是无恶不作的邪龙,在复活后变得收敛,但其实依旧不改邪龙本质,只是变得只在关键时刻推波助澜 而将这两种性格统一起来的则是她的创作欲,没错,和玛丽苏一样,尸龙对创作也有自己的执念,在玛丽苏涌现起黑暗的创作力之后,尸龙意识到,玛丽苏那邪恶的灵魂一定程度其实是自己的作品,如果说玛丽苏是支配者中第一个创造故事的人,尸龙就是第一个“创作者”,这激发出她内心最深层的欲望,那就是创作出足够黑暗污秽的灵魂,方法则是让一个灵魂在无尽的痛苦与求而不得中循环。 可以说在这点上尸龙和奈亚有一定的共同点,就是让格林经历无数次的痛苦循环,但二者还是有着分歧,奈亚想要的是格林求而不得的爱,尸龙则想要格林本就污秽的灵魂更加黑暗。 这时我们就可以理解尸龙的行为了,由于里线实际上也处于轮回之中,所以对尸龙来说,告诉格林一些真相只会让他的反抗更加激烈,也会在反抗之后更加绝望,这样才符合她的目的。 而以上依旧是贾巴沃克的表层性格,而她隐藏最深的性格则是扭曲的独占欲,在卡罗尔川的地牢中有个四个雪人,分别是玛丽苏,小红帽,爱丽丝和格林,此外,班达斯奈奇的住处也有着一个写着想将其变为收藏品的雪人(sen0才能看到真相),可见尸龙内心最深的欲望其实是独占欲,培育最污秽的灵魂,随后将其收藏起来,这才是尸龙的愿景,但她为何要隐藏这一欲望呢,在qf尸龙失败的逆监禁剧情里,由于尸龙发现格林的灵魂已经黑暗到想要独占自己,尸龙就会唯一一次直接暴露自己的独占欲来收割这个丰硕的成果,然而,奈亚或者其他支配者绝不会容忍这种行为,所以一旦尸龙试图独占格林就会立刻被排除出世界,这就是尸龙一直压抑着独占欲的原因。 此外,根据dlc3入口处的对话以及数量庞大的雪人,或许可以猜测尸龙曾经一边观察一边玩弄过很多灵魂,但这些灵魂最后都因为经历过多的痛苦和绝望后变得麻木,因此才会对有着无穷成长性的格林视若珍宝 一切温柔的言语都不过是为了将格林引导向更绝望的结局,独占污秽的黑之魂,玩到腻后就扔掉,对贾巴沃克之魂的描述为包藏在虚伪的母性之下的独占欲之影可谓恰如其分。 值得一提的是,独占欲这种感情不止在尸龙一人上出现,大部分支配者都有着这种感情,如白之女王诺登就承认自己多次有独占格林的想法,爱丽丝01也曾吐露自己害怕不可控制地想要独占格林,但她们与尸龙的区别则是,她们能够理解人类的爱,并为了人类的幸福选择放手,与红白女王的对比或许也是尸龙人物形象设计的一个目的 现在可以做一个总结了,尸龙姐姐是一个对格林有着强烈爱意的角色,她的母性是虚伪的,但这种爱意却不是,尽管她扭曲,残酷,自私,虚伪,但是她始终知道自己要做什么并理性地付出行动,即使失败了也不失风度从容自若,相较于虫虫几乎写在脸上的扭曲性格,直截了当的作恶行径,以及一有挫败就大呼小叫的行径,尸龙的感情更加内敛,行事也更加隐秘,但可谓是个很有恶人魅力的反派角色 同时,由于bs的碎片化叙事并且尚未完结,关于尸龙依旧有很多谜团,例如她和玛丽苏以及其他支配者的具体关系,里线中她是不是仍然在演戏,她究竟为何会给玛丽苏童话书,尸龙等三噩梦和三个爱丽丝的关系等等,就期待续作的解答了 大家都来和尸龙姐姐做朋友吧,尸门

玛丽苏

玛丽苏,作为bs中自称的女主角,是bs唯二个三代都有出场(包括红森)的支配者,还有一个是贾巴沃克),在此过程中做过的好事可谓数不胜数,罄竹难书,我们来按着时间线整理一下 1一开始的玛丽苏是个渴望母爱的孩子,尽管我们不知道bs设定下一开始的支配者到底会不会有类似人类的亲情,她掌管自己的世界,倾听子民的祈祷,开始感到厌烦,这时贾巴沃克不知出于什么目的,送了她一本童话书,这本书,我们不知道是哪个童话,但本人猜测很可能这本书的作者是玛丽苏第一个抓住的,并在黑之魂的融合中有重要地位,根据青鸟的文本,卡罗尔并不是第一个抓住的素材,所以基本可以排除梦游仙境,结合男主角格林的名字和混沌迷宫的狼外婆,我个人猜测是小红帽,她开始渴望创作自己的故事来打动母亲,至少一开始是这样,她派遣属下四处收集童话作者的灵魂作为素材,同时肆意进行同人创作。 2玛丽苏的处女作是小红帽,也是她第二得意的作品,根据一些信息,小红帽的灵魂可能以现实世界的一个女学生为素材,在魔改剧情的同时,她还给了小红帽注定20岁早逝的设定,并可能赋予了小红帽通过镜子穿梭位面之类的特殊能力来担任女主角,但不知道为什么她又不满意,想做一个男主角出来,但她对小红帽的善后却颇有些问题,小红帽不仅杀穿了红森,而且还能意识到她这个黑幕的存在。 3缝合了众多童话作家灵魂的格林诞生了,并被赋予了给周围的女主角带来不幸的设定,格林污秽的黑之魂有成为支配者的潜质,玛丽苏甚至还大胆地保留了他的部分创作能力,因为最关键的改变权能在她手上,为什么叫做格林则未知,可能是最初的童话书就是格林童话的一本,这之后格林不知道为什么,以什么身份在一个叫不思议之国的地方和叫爱丽丝和祈祷主的存在开起了茶会,随后格林与爱丽丝01相恋,嫉妒的祈祷主呼唤了玛丽苏,导致格林被带走了,连同格林不知何时创造出的故事们也被篡改 4基于以上提到的各种童话故事素材,玛丽苏魔改出了失落帝国的箱庭,把格林放进去经历一次次绝望故事的轮回,自己则担任女主角欣赏故事,还设计把母亲叫了进来欣赏自己的大作。不知多少次循环后,这个大好局面被打破了,母亲黑山羊为了逃离这个世界和她战斗,连圣森都磨灭了,战胜母亲后,奈亚丽丝前来捡漏带走格林进行新一轮追寻爱的游戏,本来想顺带着把玛丽苏也灭了,但在诺登的劝阻以及可能的其他考量下放过了她 5奈亚,红女王,白女王中的某位或若干位剥夺了她的改变权能,把她囚禁在库因兰德,失去权能的她改名为玛丽安,但不知何时也不知何人前来探访了她,到格林试图从梦中醒来的里线,玛丽安乘乱逃出,由于正史上不太可能发生f结局,所以此时应该是g结局,也有可能正史上g结局有少许与游戏不同,不管怎么说此时的玛丽安应该被格林小红帽两人打败,但h结局中可以看到她没有死,而且不知道怎么逃了出来 可以说,bs中的一切悲剧,玛丽苏至少有五成功劳,接下来让我们来分析一下玛丽苏的角色特质。 首先,最直接的一点,玛丽苏是个典型的支配者,高高在上地支配着人类这样的低等种族,但玛丽苏特殊之处在于,她可能是最能理解人类感情的支配者之一,首先我们就可以看到她居然渴望所谓的母爱,而根据2代大部分支配者的表现,即使因融入皮套逐渐有了感情,也没有第二个有亲情这种非常类似人类感情的支配者,此外,她还以玩弄人类的灵魂为乐,当然有这种兴趣的支配者恐怕不少,但这股风气可以说是玛丽苏带起来的,也是她最先玩出各种花样。 因此可以引出玛丽苏的第二个特点了,她是很像人类的一个支配者,尽管理解非常片面,但她确实懂得并拥有不少人性,而她为什么这么喜欢玩弄人类呢?这也很容易理解,一般来说越通人性的动物越被人类亲近,逗猫逗狗远远比逗蚂蚁有意思,因为这些宠物的智力和人类更接近,人类可以很容易地理解它们在想什么,然后在逗弄它们的过程中获得一种智力上的优越感,以及一种“支配感”,这恐怕就是玛丽苏看到自己编排的好戏上演的感觉。 这点可以说是我们对玛丽苏进行解析的基石,毕竟任何角色首先都是人的投影,而人性越丰富,就有越多的性格侧面。 玛丽苏第三个特点就是由此衍生的纯粹性,当然,此处并不是说纯洁善良云云,而是某种意义上的纯粹之恶,很多支配者在扮演人类后都会被皮套影响而恐慌或纠结,但玛丽苏却没有这种烦恼,她以融入人类扮演人类为乐(小精灵也算类人种族),她作为支配者的漆黑本性和人性之恶完美地兼容了,不会有徘徊二者之间的身份认同问题,而她大部分所作所为也就是为了践行人性之恶,什么是恶呢,比较狭隘的解释就是为了为了自己的利益或者取乐而伤害他人,而玛丽苏的邪恶就很纯粹,就是为了取乐,甚至有损自己利益也要作恶,如果解救了被囚禁的玛丽苏,此时她会自认为东山再起,但她想的不是第一时间抹杀已经成长了的格林或者藏起来,而是想再让格林经历一次悲惨的故事,可以说她作恶的动机相当纯粹,也相当执着。 在此之上的第四个特点,就是她的创作者身份,很多支配者都会赞扬她的创作能力,连奈亚构建的不思议之国都有不少玛丽苏箱庭的影子,但这种创造力也只是对于支配者来说了,如果我们用人类的视角看如何呢?寿司在访谈时轻蔑地说到“她说到底也只是玛丽苏,也只能整点二次创作了”可以说道出了玛丽苏所谓创作的本质,说到底,玛丽苏就是那种典型的黑深残小鬼,把一个可能有很多种解释的作品曲解为单一的猎奇世界观,当然不是说这样不行,如果原创一个黑深残世界观自娱自乐当然是可以接受的,但玛丽苏的行为就是最恶劣的一种同人女行为,魔改原来的作品,把自己做成角色代入进去搞cp,还要把所有其他角色踩一遍,情节和人物关系只要对自己代入的角色有利就行,然后把这部除了自己看谁也不会喜欢的同人拿给原作者看,我就不详细说这种行为的恶劣程度了,但这种作品折射出来的创作观我必须要辩驳一下。 当然,本视频所有讨论只局限于二次元文化内, 荒木飞吕彦认为漫画有四要素,角色、剧情、世界观、主题,我们就用这四个维度来剖析玛丽苏的所谓创作。 首先是角色,直接创作一个鲜活的灵魂对强大的支配者来说也是一件难事,所以对于角色的选取,玛丽苏很可能都是使用现实存在的灵魂然后再魔改来适配进童话或者传说的人物,因此她笔下所谓角色虽然很多但其实并不是她自己的功劳,而她为了把这些灵魂塞进角色对设定随意删改,把小红帽的外婆和母亲缝成了一笔烂账,人物关系更是一团乱麻,怎么方便怎么来,角色设定连基本的自洽也做不到,水平着实不敢恭维 随后是世界观,失落帝国这个箱庭本质上来说就是个童话故事的缝合体,没有历史演化,没有详细设定,这并不是一个鲜活的世界观,只不过是一个临时搭建的舞台而已,当然,很多线性的故事并不需要一个多详尽的世界观,在这点上玛丽苏只能说无功无过 最后是剧情和主题,玛丽苏的主题是简单粗暴的黑深残,剧情则是当常规的rpg剧本演到最后的happy end时毫无铺垫伏笔地急转直下变成bad end,当然,能设置这么大规模的箱庭,还写了不少支线剧情,证明玛丽苏确实是有一些笔力的,但首先,她的角色基本靠抓人,故事则都有童话原型,故事演变她只需要把握大方向,其他可以让角色自己来,而最后没有任何铺垫的bad end依旧表明了她创作的失败,如果一个设定没有任何铺垫和暗示,直到使用时才抛出,那只能证明这部作品情节编排的失败,因为一部作品的生命周期不是作者创作出来就结束了的,而要等到读者看完理解了故事才会结束,这个过程作者读者应该处于相对公平的地位,根据故事的设定,人物有充分的理由这样行动,这样才能让读者认同这个故事,而玛丽苏却完全相反,滥用作者的权能让故事不仅没有逻辑,还自相矛盾,很明显,对玛丽苏来说她是作者也自认为是唯一的读者,那些被抓走被改造的灵魂不过是用完即扔的工具罢了,不需要自圆其说,只要自己看得高兴就行了,或许就支配者的立场来说她不过是自娱自乐罢了,但对人类(至少灵魂上是人类),以及同样作为创作者的格林来说,首先就绝不可能认同这种恶行,更不可能认同自己的作品被改成这样的烂作 说到这里,就可以讨论一下玛丽苏对于格林的看法了,直观地说,是玛丽苏创造了名为格林的污秽黑之魂,但其实在最初,是格林等童话作家激发了玛丽苏的创作欲,因此,事实上,两者是相互创造的关系,玛丽苏创造格林的目的,首先是为了成为她作品的男主角,让她能够代入女主角的位置欣赏这个故事,这样说来似乎格林除了男主角的身份和其他角色也没什么本质的不同。但格林还有一点对玛丽苏有着重大意义,就是他童话作家灵魂集合体的身份,即使自我中心如玛丽苏这种存在,也会有对别人欣赏自己作品的渴望,因此玛丽苏特地设置了一个c结局,用演戏的形式让格林得以了解她的整个创作生涯,至于目的,除了单纯的表现欲和欣赏格林的痛苦以外,恐怕也有一丝希望作为原作者的格林认同自己的心情,哪怕是厌恶,玛丽苏也想得到一些对创作的反馈,而格林是唯一能在创作这个领域和她有一些共鸣的人,作者,读者,男主角,格林三位一体的身份对玛丽苏来说,可以说是难得的知己,尽管这种关系非常扭曲,但不能否认,在这点上玛丽苏作为创作者的心情是有些真心的。而玛丽苏会渴望认同这点,一开始是希望得到母爱,但在得到格林这个玩具之后,玛丽苏就一点也不在意黑山羊的死活了,这也是佐证。 最后不得不提的是,玛丽苏的特殊性质,很大程度上她是寿司这个作者的投影,我个人觉得玛丽苏这个角色有不少表达寿司自己创作观的成分,这也解释了寿司为何这么偏爱她当然,一部好的作品,任何角色都是基于自己的设定和世界观行动,不可能因为是作者的投影就有特别待遇,所以可以说,玛丽苏虽然很大程度上是寿司的投影,但投影的目的其实是对比,玛丽苏的创作肤浅,笔下的故事只是无聊的黑深残,但寿司却喜欢在绝望时写一些希望,在希望中铺设绝望,最后的反转再怎么说都是有因可循,单论创作的层次来说就高出绿虫子太多了,当然,我也不是在吹寿司笔力多高,因为高出玛丽苏这个水平的创作者多如牛毛。 寿司设置玛丽苏这个角色,其实是使用了一种嵌套的结构来讲故事,首层是童话的原作,这些是毋庸置疑的好故事,随后是虫子和奈亚魔改出的箱庭,是烂故事的典型,最后一层寿司想讲的重点其实是格林怎么察觉真相,挣脱出烂故事的循环,书写自己的结局的故事,在这三层中,第一层玛丽苏是读者,格林等人是作者,只出现在设定层面,第二层玛丽苏是一半作者一半角色,格林是一半读者一半角色,体现在abc结局,最后一层中寿司是唯一的作者,玛丽苏和格林就都是角色了,体现在d结局以及之后的二代,这种层层演变虽然有些炫技,但确实非常有意思。 就玛丽苏这个角色而言,整个泛二次元文化里她这样的反派也不常见,究其原因,则是因为一个有能力玩弄主角取乐的boss必然会导致战力失衡,冲突不起来,让读者感到憋屈,因此想要打败这种boss要么机械降神唯心爆发,比如一代c结局(虽然是演的),要么引入新的boss和同伴体系取代她如d结局,也因此,虽然我个人很喜欢一代,但一代的真结局d结局远没有2代h结局震撼 来做个总结吧,玛丽苏无疑是个纯粹邪恶的支配者,一个烂到骨子里的创作者,她作为创作者无疑是失败的,但作为bs这个故事里的角色反而是很成功的,不仅纯粹有特点,还有很多角色侧面可以挖掘,寿司巧妙地利用她读者,创作者和角色的三重身份来塑造她的多面性,颇有荒木在漫画术中写的“在作恶道路上高歌猛进”的成功反派角色风格。

]]>
+ 冬之钟

由于black souls的故事远远没有完结,因此现阶段我们很难对红白女王梅贝尔这些与格林牵扯极深的支配者们进行什么定论,只能就已有的剧情和文本进行一些归纳,本期视频我将就bs2比较难懂的一处地方,冬之钟的主线事件,进行一些个人向的分析。 在冬之钟最后一章地图能遇到5个白熊,白熊的身份迄今为止依然是谜团,但他们提供了整整五段发生在支配者之间的重要对话,我将概括一下这五段对话提供的主要信息以便进一步的分析 我们按解包后的地图顺序开始, 第一段对话发生于梅贝尔和妹妹爱丽丝之间,可以猜测妹妹爱丽丝属于支配者之一,数量众多的支配者都在奈亚的箱庭占据一个角色以便和格林繁殖,但随着时间推移,支配者们发现扮演角色的同时,他们也在被角色同化(梅贝尔所言),因此纷纷退场,妹妹爱丽丝也逐渐被角色影响对格林产生好感,此外,姐姐爱丽丝不知何故地退场。 第二场对话发生于梅贝尔和白之女王之间,对话中提及冬之钟正是白女王的箱庭,而白之女王由于爱上了格林自愿放弃女王的身份去守护他,而梅贝尔则对这场追寻爱的闹剧,以及陪着胡闹的其他支配者感到无聊,向白女王提出一个让格林摆脱循环,并且能够独占他的计划。 第三第四场对话都发生于红白女王之间,红女王为陷入痛苦轮回的格林而痛苦,不断进行自残,白女王制止了她,两人由于同样爱上格林而心意相通 第四场对话则告诉我们,红女王接过了白女王的权王冠(推测为箱庭权限),并以此创造出库因兰德,并使其能排除奈亚的监视,两人密谋让格林挣脱循环的方法,红女王恳请白女王放弃对格林的独占欲,白女王同意了,此外,梅贝尔也知晓这一计划,并根据后面的行动来看,她不知为何也参与了这个计划 第五场对话发生于白女王和玛丽苏之间,白女王夺走了玛丽苏的改变能力,并且根据混沌迷宫的情报,将其赋予了古兰剧场,玛丽苏察觉白女王爱上了格林,并且等待着格林的到来,结尾,玛丽苏等到了一个神秘人(黑山羊?) 总结这些信息,我们可以推测出针对格林,一共提出了两个计划,一个是梅贝尔怂恿的独占计划,一个是红偶像策划的拯救计划,这两个计划都必须有诺登的参与,但此时我们并不知道诺登的真正想法是哪个 在推进h结局的过程后,格林会有两个选择,1是和暗黑舞台合二为一2是打败舞台,夺取舞台的改变能力, “此时”的冬之钟虽然沉睡,但相信诺登依旧有一定的控制能力,然而不同于G结局的阻拦,此时的诺登选择了旁观,并在最后支持格林任意一个选择 总结一下大致发生的事件(以下事件的时间顺序难以具体确定) 1诺登作为支配者之一管理着自己的箱庭冬之钟,和奈亚创造自己箱庭的时间关系未知 2奈亚将格林带到箱庭,邀请支配者们参加繁殖游戏,根据牛津学院人偶爱丽丝的说法,是舞台装置创造出了让格林在舞台上登场的皮套(格林的灵魂出自玛丽苏的手笔,因此推测只能创造皮套),并且在创造格林时两者间确立了深远的联系,白女王也参加了这个游戏,可以肯定白女王为了心爱的格林才舍弃了王冠(王冠可能指代管理箱庭的权能),因此推测白女王在爱上格林后可能以放弃王冠为代价,得到了管理奈亚箱庭的权限和陪伴在格林身边的权力 3红偶像被奈亚切割,由于茶会时期她曾经打倒初代红之女王,因此此刻可以说她的身份是第二任红之女王,为格林自责的她不断紫餐,得到了白女王的同情,白女王将自己原来的王冠权能移交给被奈亚切割的红女王,让她在原冬之钟的地盘上创造出自己的箱庭。 4红白女王合谋,或者其中之一从奈亚手中夺走了玛丽苏并囚禁起来,为了避免红白女王相互猜疑,二者将从玛丽苏手上得到的改变能力赋予舞台装置古兰,创造出一个新的支配者暗黑舞台,藏于处于过去时间线的冬之钟,同时由于处于过去的时间线,冬之钟几乎没有被发现的风险,通过dlc3经常出现的齿轮与其他信息可以推测,舞台装置拥有着影响整个箱庭以及舞台上大部分“演员”的能力,即在部分地图的bg和格林脑中的“齿轮声”,是不思议之国这场戏的核心,此外,由于诺登为了管理这个箱庭必须借助舞台的力量,而红白女王理论上权能接近,因此本视频中猜测红白女王都有部分操控舞台的权限 4由于支配者们发现扮演箱庭的角色会改变自己的本质,因此纷纷退出,白女王被迫用自己和格林的子嗣填补空缺 5梅贝尔认为这场游戏无聊透顶,一场剧本烂透的戏剧重复多少遍也只会让人厌倦(她自己是这么说的),因此她怂恿白女王让格林脱出循环,并抢先独占他 6红女王努力让自己的领域能排除奈亚的监视,并在此向白女王提出了拯救格林的计划,这个计划梅贝尔也知情,白女王同意了拯救计划,我们不知道白女王听到这两个计划的顺序,但他们明显是冲突的 7可能是人为,可能是自发,舞台觉醒了自我意识呼唤着格林的爱,同时在梅贝尔的指引下格林也朝着舞台进发,一场死斗在所难免,可以推测,在夺取舞台能力的结局中,诺登执行了红女王的拯救计划,舍身为格林断后,使其在爱丽丝01,即现在的红偶像的帮助下回到现实。在舞台与格林合一的bad end中,诺登执行了梅贝尔提出的独占计划,该结局中诺登辅佐着通过合体得到创作能力的格林与奈亚进行斗争,并且前往世界尽头来逃避一切纷争和毁灭,顺便一提,我觉得这结局也不算坏,白女王很可能会确保格林在融合中占据主导,此时格林成为了名副其实的支配者,和白女王的结合甚至能和奈亚势均力敌,不过寿司在采访中提到执着于爱丽丝身份的奈亚无法发挥全力就是了,毫无疑问这时的格林是目前为止的(格林)战力巅峰。 这就是冬之钟里发生的主要事件了,下面我将对事件的主要参与者,红白女王和虚无的少女进行分析。 首先是参与程度较低的梅贝尔梅贝尔虽然入局较浅,但却是格林的引导者,并帮助拖延了一下奈亚,也是她告诉我们打破这一循环只能正面和舞台装置对决,那么她的目的是什么呢? 首先,梅贝尔在混沌迷宫中会直接提及支配者间不可避免将爆发战争,并且导致阿撒托斯的苏醒毁灭一切,而身份不是支配者却可能得到支配者之器的格林,才能发动不会惊醒阿撒托斯的箱庭战争,这可能是她帮助格林的首要目的 其次,梅贝尔是个不可救药的收藏狂,她的箱庭是个巨大的垃圾场,什么都有,因此她也想把格林培养成一个完美收藏品或者棋子 最后,在个人感情上,很难定论梅贝尔到底产生了多少感情,她自称对永无止境的劣质戏剧循环感到厌倦,才会帮助格林创造自己的故事,但又在背叛剧情中声称想要让格林得到更高的器随后利用他,最后如果试图救她又会说自己涌现出了一些对格林的爱,由于信息过少,很难知道她到底觉醒了多少感情。 不过可以肯定的是,如果是梅贝尔真有意背叛动机是不充分的,如果她只需要格林成为拥有支配者之器的棋子,那么独占和拯救计划都能实现这个目的,并且由于白女王看着,融合后大概率是格林占主导地位,无非是好不好操控的问题,因此猜测梅贝尔实际上是真心帮助格林,只是在用激将法,或者习惯性毒舌。 冬之钟的棋局不管怎么走梅贝尔都不是输家,如果独占计划成功,白女王和格林则会成为一股对抗奈亚甚至其他支配者的强大力量,如果拯救计划成功,格林则会成为一个有着支配者的器,却对大部分支配者恨之入骨的棋子或潜在盟友,不论哪个结果都对梅贝尔阻止阿撒托斯苏醒的目的有利,而她的损失不过是万千分身中的一个而已 随后则是红之女王,尽管游戏中没有直接说红女王就是一代的爱丽丝01,以及茶会中的爱丽丝,但大量证据表明她和爱丽丝01有着千丝万缕的关系,爱丽丝01也极有可能就是茶会爱丽丝,所以本视频采纳这一说法,可以说最早钻进人类皮套的她是人性化最深的支配者,她人类的一面深爱格林,但又恐惧支配者的一面暴露,因此自觉配不上格林,甚至认为是自己导致了格林的一切悲剧,顺便一提关于茶会以及更早时期的资料实在太少,所以我们现在对这段剧情的讨论很可能是不完整甚至有较大误解的,因此在此我只能尽可能保守地做一些推测,由于支配者本性难以剥离,在她身上有着强烈的自毁倾向,想爱,却又自觉没有资格去爱,因此她只能用紫餐的方式填补内心的负罪感,H结局中,她以几乎自杀的方式当着奈亚的面帮助格林逃离了奈亚的掌控,可以说为了格林,红女王自降身份把自己变成了棋子,而且是必死的棋子,只为了能在后续将奈亚一军。 等待着这个叛徒的是什么结局,我们只能发挥一下想象力了 最后则是冬之钟的核心人物,白之女王诺登诺登的原型之一是爱丽丝梦游仙境的白兔先生,白兔最明显的元素就是他永远匆忙的样子和怀表,这点也在诺登身上得以体现,白女王作为这场繁殖游戏事实上的管理者,为了协调任性的演员们可谓操碎了心,在轮回的最后,台上的演员几乎全部是她的子嗣(兔子可是繁殖力非常强的生物),可以猜测在制定剧本和排练上她也得下不少功夫,而dlc3的核心意象,齿轮,其实可以说既指着暗黑舞台的齿轮带动了戏码的上演,也指着诺登怀表的齿轮,诺登就是那个负责在指针快点到达终点前让齿轮倒转,重新开始计时的人,这也是为何她会在结局中说为齿轮停止感到害怕,让齿轮转动是她的职责,在她的内心深处或许也有着对无尽循环中格林真正爱上自己并一起逃到世界尽头的希望,但最后她选择成全格林真正的爱,而放弃管理齿轮的职责则意味着她与自己支配者的身份完全决裂,将一切奉献给人类的爱。此外,诺登的支配者原型则是所谓的幻梦境之主,这或许解释了为何是她在实际上管理着二代这个巨大的梦境 我在尸龙的人物解析说,类似尸龙的独占欲在红白女王身上也出现过,但红女王由于害怕自己的支配者本性选择放手,那么白女王呢?在h结局中,梅贝尔被古兰(推测,也可能是奈亚)针对性的陷阱解决,但拥有舞台权限的红白女王应该不受影响,红女王为了最后拯救格林必须蛰伏,因此辅助格林对抗古兰以及奈亚的任务只能交给白女王,但即使在此时此刻,白女王依旧有着独占格林的选项,如果她控制或者协助舞台装置强迫和格林融合,就可以抢先一步独占所有支配者都垂涎的格林,但如果把舞台的改变能力给予格林,那么失去王冠和舞台的诺登则会失去自己在棋局上的几乎所有棋子,面对这种选择,诺登将选择权给了格林,不能说她是完全无私的,但面对这样的诱惑,她也会尊重格林的选择,这不得不说是非常伟大的爱 可以说白女王是一个有着两面性的角色,她支配者的一面始终对格林有着独占欲,但她人性的一面始终压抑着这些黑暗的感情,她是一个徘徊于人与神界限的存在,但无论如何,她都尊重并支持着格林的选择,所以她闪耀着人性光辉的一面始终是压过支配者的黑暗一面的。 让我们给这幕疯狂剧场的落幕做一个总结吧,这局棋是红白女王和梅贝尔设下的,目的是为了让格林得到古兰的改变能力并逃离奈亚的箱庭,其中没有舞台权限的梅贝尔负责引导格林,红女王则在最后帮助得到改变能力的格林摆脱奈亚掌控,而白女王则有着最关键的决策权,即是否利用舞台独占格林,但她最后将决定权给了格林,而格林真正的选择应该是夺取舞台的改变能力,因此最后白女王舍弃了一切帮助格林逃离崩坏的舞台。 这场棋局中,梅贝尔横竖不亏,红女王陷入必死之局,最关键的棋手就是白女王,只要她愿意,随时可以下出必赢的一着,但最后她依旧选择了放弃自己的棋子,把终结棋局的希望留给了格林 在经历如此多的牺牲之后,格林终于从棋子升为了棋手,只是不知道他又会下出怎样的一着

]]>
- <h1 id="尸龙贾巴沃克">尸龙贾巴沃克</h1> -<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在天之繁星哟!命数已定之众哟!尽管去为爱所煎熬吧,为嫉妒之苦吧!呜呼!感激涕零吧!为这幸灾乐祸暗黑舞台点缀色彩就好!!!</span><br></pre></td></tr></table></figure> -<p>象征着腐败与神秘的紫黑色,遍布全身的缝合痕迹与绷带,恶魔一样的卷曲角,晦暗如死尸的肤色,以及左眼燃烧着的灵魂之火(致敬黑岩射手可能性微存),<code>尸龙</code>姐姐的人物形象无时无刻不在传达着神秘强大而阴暗的气氛,本视频将对<code>尸龙</code>的整个人物进行解析 + <h1 id="冬之钟">冬之钟</h1> +<p>由于black souls的故事远远没有完结,因此现阶段我们很难对<code>红白女王</code>与<code>梅贝尔</code>这些与格林牵扯极深的支配者们进行什么定论,只能就已有的剧情和文本进行一些归纳,本期视频我将就bs2比较难懂的一处地方,冬之钟的主线事件,进行一些个人向的分析。 @@ -884,17 +883,17 @@
- blacksouls剧情解析 - - https://thinklive1.github.io/2023/09/29/black%20souls%E5%89%A7%E6%83%85%E8%A7%A3%E6%9E%90/ + blacksouls原著梗解析 + + https://thinklive1.github.io/2023/09/29/blacksouls%E5%8E%9F%E8%91%97%E6%A2%97%E8%A7%A3%E6%9E%90/ 2023-09-29T02:18:45.993Z 2023-11-27T12:47:59.687Z - 冬之钟

由于black souls的故事远远没有完结,因此现阶段我们很难对红白女王梅贝尔这些与格林牵扯极深的支配者们进行什么定论,只能就已有的剧情和文本进行一些归纳,本期视频我将就bs2比较难懂的一处地方,冬之钟的主线事件,进行一些个人向的分析。 在冬之钟最后一章地图能遇到5个白熊,白熊的身份迄今为止依然是谜团,但他们提供了整整五段发生在支配者之间的重要对话,我将概括一下这五段对话提供的主要信息以便进一步的分析 我们按解包后的地图顺序开始, 第一段对话发生于梅贝尔和妹妹爱丽丝之间,可以猜测妹妹爱丽丝属于支配者之一,数量众多的支配者都在奈亚的箱庭占据一个角色以便和格林繁殖,但随着时间推移,支配者们发现扮演角色的同时,他们也在被角色同化(梅贝尔所言),因此纷纷退场,妹妹爱丽丝也逐渐被角色影响对格林产生好感,此外,姐姐爱丽丝不知何故地退场。 第二场对话发生于梅贝尔和白之女王之间,对话中提及冬之钟正是白女王的箱庭,而白之女王由于爱上了格林自愿放弃女王的身份去守护他,而梅贝尔则对这场追寻爱的闹剧,以及陪着胡闹的其他支配者感到无聊,向白女王提出一个让格林摆脱循环,并且能够独占他的计划。 第三第四场对话都发生于红白女王之间,红女王为陷入痛苦轮回的格林而痛苦,不断进行自残,白女王制止了她,两人由于同样爱上格林而心意相通 第四场对话则告诉我们,红女王接过了白女王的权王冠(推测为箱庭权限),并以此创造出库因兰德,并使其能排除奈亚的监视,两人密谋让格林挣脱循环的方法,红女王恳请白女王放弃对格林的独占欲,白女王同意了,此外,梅贝尔也知晓这一计划,并根据后面的行动来看,她不知为何也参与了这个计划 第五场对话发生于白女王和玛丽苏之间,白女王夺走了玛丽苏的改变能力,并且根据混沌迷宫的情报,将其赋予了古兰剧场,玛丽苏察觉白女王爱上了格林,并且等待着格林的到来,结尾,玛丽苏等到了一个神秘人(黑山羊?) 总结这些信息,我们可以推测出针对格林,一共提出了两个计划,一个是梅贝尔怂恿的独占计划,一个是红偶像策划的拯救计划,这两个计划都必须有诺登的参与,但此时我们并不知道诺登的真正想法是哪个 在推进h结局的过程后,格林会有两个选择,1是和暗黑舞台合二为一2是打败舞台,夺取舞台的改变能力, “此时”的冬之钟虽然沉睡,但相信诺登依旧有一定的控制能力,然而不同于G结局的阻拦,此时的诺登选择了旁观,并在最后支持格林任意一个选择 总结一下大致发生的事件(以下事件的时间顺序难以具体确定) 1诺登作为支配者之一管理着自己的箱庭冬之钟,和奈亚创造自己箱庭的时间关系未知 2奈亚将格林带到箱庭,邀请支配者们参加繁殖游戏,根据牛津学院人偶爱丽丝的说法,是舞台装置创造出了让格林在舞台上登场的皮套(格林的灵魂出自玛丽苏的手笔,因此推测只能创造皮套),并且在创造格林时两者间确立了深远的联系,白女王也参加了这个游戏,可以肯定白女王为了心爱的格林才舍弃了王冠(王冠可能指代管理箱庭的权能),因此推测白女王在爱上格林后可能以放弃王冠为代价,得到了管理奈亚箱庭的权限和陪伴在格林身边的权力 3红偶像被奈亚切割,由于茶会时期她曾经打倒初代红之女王,因此此刻可以说她的身份是第二任红之女王,为格林自责的她不断紫餐,得到了白女王的同情,白女王将自己原来的王冠权能移交给被奈亚切割的红女王,让她在原冬之钟的地盘上创造出自己的箱庭。 4红白女王合谋,或者其中之一从奈亚手中夺走了玛丽苏并囚禁起来,为了避免红白女王相互猜疑,二者将从玛丽苏手上得到的改变能力赋予舞台装置古兰,创造出一个新的支配者暗黑舞台,藏于处于过去时间线的冬之钟,同时由于处于过去的时间线,冬之钟几乎没有被发现的风险,通过dlc3经常出现的齿轮与其他信息可以推测,舞台装置拥有着影响整个箱庭以及舞台上大部分“演员”的能力,即在部分地图的bg和格林脑中的“齿轮声”,是不思议之国这场戏的核心,此外,由于诺登为了管理这个箱庭必须借助舞台的力量,而红白女王理论上权能接近,因此本视频中猜测红白女王都有部分操控舞台的权限 4由于支配者们发现扮演箱庭的角色会改变自己的本质,因此纷纷退出,白女王被迫用自己和格林的子嗣填补空缺 5梅贝尔认为这场游戏无聊透顶,一场剧本烂透的戏剧重复多少遍也只会让人厌倦(她自己是这么说的),因此她怂恿白女王让格林脱出循环,并抢先独占他 6红女王努力让自己的领域能排除奈亚的监视,并在此向白女王提出了拯救格林的计划,这个计划梅贝尔也知情,白女王同意了拯救计划,我们不知道白女王听到这两个计划的顺序,但他们明显是冲突的 7可能是人为,可能是自发,舞台觉醒了自我意识呼唤着格林的爱,同时在梅贝尔的指引下格林也朝着舞台进发,一场死斗在所难免,可以推测,在夺取舞台能力的结局中,诺登执行了红女王的拯救计划,舍身为格林断后,使其在爱丽丝01,即现在的红偶像的帮助下回到现实。在舞台与格林合一的bad end中,诺登执行了梅贝尔提出的独占计划,该结局中诺登辅佐着通过合体得到创作能力的格林与奈亚进行斗争,并且前往世界尽头来逃避一切纷争和毁灭,顺便一提,我觉得这结局也不算坏,白女王很可能会确保格林在融合中占据主导,此时格林成为了名副其实的支配者,和白女王的结合甚至能和奈亚势均力敌,不过寿司在采访中提到执着于爱丽丝身份的奈亚无法发挥全力就是了,毫无疑问这时的格林是目前为止的(格林)战力巅峰。 这就是冬之钟里发生的主要事件了,下面我将对事件的主要参与者,红白女王和虚无的少女进行分析。 首先是参与程度较低的梅贝尔梅贝尔虽然入局较浅,但却是格林的引导者,并帮助拖延了一下奈亚,也是她告诉我们打破这一循环只能正面和舞台装置对决,那么她的目的是什么呢? 首先,梅贝尔在混沌迷宫中会直接提及支配者间不可避免将爆发战争,并且导致阿撒托斯的苏醒毁灭一切,而身份不是支配者却可能得到支配者之器的格林,才能发动不会惊醒阿撒托斯的箱庭战争,这可能是她帮助格林的首要目的 其次,梅贝尔是个不可救药的收藏狂,她的箱庭是个巨大的垃圾场,什么都有,因此她也想把格林培养成一个完美收藏品或者棋子 最后,在个人感情上,很难定论梅贝尔到底产生了多少感情,她自称对永无止境的劣质戏剧循环感到厌倦,才会帮助格林创造自己的故事,但又在背叛剧情中声称想要让格林得到更高的器随后利用他,最后如果试图救她又会说自己涌现出了一些对格林的爱,由于信息过少,很难知道她到底觉醒了多少感情。 不过可以肯定的是,如果是梅贝尔真有意背叛动机是不充分的,如果她只需要格林成为拥有支配者之器的棋子,那么独占和拯救计划都能实现这个目的,并且由于白女王看着,融合后大概率是格林占主导地位,无非是好不好操控的问题,因此猜测梅贝尔实际上是真心帮助格林,只是在用激将法,或者习惯性毒舌。 冬之钟的棋局不管怎么走梅贝尔都不是输家,如果独占计划成功,白女王和格林则会成为一股对抗奈亚甚至其他支配者的强大力量,如果拯救计划成功,格林则会成为一个有着支配者的器,却对大部分支配者恨之入骨的棋子或潜在盟友,不论哪个结果都对梅贝尔阻止阿撒托斯苏醒的目的有利,而她的损失不过是万千分身中的一个而已 随后则是红之女王,尽管游戏中没有直接说红女王就是一代的爱丽丝01,以及茶会中的爱丽丝,但大量证据表明她和爱丽丝01有着千丝万缕的关系,爱丽丝01也极有可能就是茶会爱丽丝,所以本视频采纳这一说法,可以说最早钻进人类皮套的她是人性化最深的支配者,她人类的一面深爱格林,但又恐惧支配者的一面暴露,因此自觉配不上格林,甚至认为是自己导致了格林的一切悲剧,顺便一提关于茶会以及更早时期的资料实在太少,所以我们现在对这段剧情的讨论很可能是不完整甚至有较大误解的,因此在此我只能尽可能保守地做一些推测,由于支配者本性难以剥离,在她身上有着强烈的自毁倾向,想爱,却又自觉没有资格去爱,因此她只能用紫餐的方式填补内心的负罪感,H结局中,她以几乎自杀的方式当着奈亚的面帮助格林逃离了奈亚的掌控,可以说为了格林,红女王自降身份把自己变成了棋子,而且是必死的棋子,只为了能在后续将奈亚一军。 等待着这个叛徒的是什么结局,我们只能发挥一下想象力了 最后则是冬之钟的核心人物,白之女王诺登诺登的原型之一是爱丽丝梦游仙境的白兔先生,白兔最明显的元素就是他永远匆忙的样子和怀表,这点也在诺登身上得以体现,白女王作为这场繁殖游戏事实上的管理者,为了协调任性的演员们可谓操碎了心,在轮回的最后,台上的演员几乎全部是她的子嗣(兔子可是繁殖力非常强的生物),可以猜测在制定剧本和排练上她也得下不少功夫,而dlc3的核心意象,齿轮,其实可以说既指着暗黑舞台的齿轮带动了戏码的上演,也指着诺登怀表的齿轮,诺登就是那个负责在指针快点到达终点前让齿轮倒转,重新开始计时的人,这也是为何她会在结局中说为齿轮停止感到害怕,让齿轮转动是她的职责,在她的内心深处或许也有着对无尽循环中格林真正爱上自己并一起逃到世界尽头的希望,但最后她选择成全格林真正的爱,而放弃管理齿轮的职责则意味着她与自己支配者的身份完全决裂,将一切奉献给人类的爱。此外,诺登的支配者原型则是所谓的幻梦境之主,这或许解释了为何是她在实际上管理着二代这个巨大的梦境 我在尸龙的人物解析说,类似尸龙的独占欲在红白女王身上也出现过,但红女王由于害怕自己的支配者本性选择放手,那么白女王呢?在h结局中,梅贝尔被古兰(推测,也可能是奈亚)针对性的陷阱解决,但拥有舞台权限的红白女王应该不受影响,红女王为了最后拯救格林必须蛰伏,因此辅助格林对抗古兰以及奈亚的任务只能交给白女王,但即使在此时此刻,白女王依旧有着独占格林的选项,如果她控制或者协助舞台装置强迫和格林融合,就可以抢先一步独占所有支配者都垂涎的格林,但如果把舞台的改变能力给予格林,那么失去王冠和舞台的诺登则会失去自己在棋局上的几乎所有棋子,面对这种选择,诺登将选择权给了格林,不能说她是完全无私的,但面对这样的诱惑,她也会尊重格林的选择,这不得不说是非常伟大的爱 可以说白女王是一个有着两面性的角色,她支配者的一面始终对格林有着独占欲,但她人性的一面始终压抑着这些黑暗的感情,她是一个徘徊于人与神界限的存在,但无论如何,她都尊重并支持着格林的选择,所以她闪耀着人性光辉的一面始终是压过支配者的黑暗一面的。 让我们给这幕疯狂剧场的落幕做一个总结吧,这局棋是红白女王和梅贝尔设下的,目的是为了让格林得到古兰的改变能力并逃离奈亚的箱庭,其中没有舞台权限的梅贝尔负责引导格林,红女王则在最后帮助得到改变能力的格林摆脱奈亚掌控,而白女王则有着最关键的决策权,即是否利用舞台独占格林,但她最后将决定权给了格林,而格林真正的选择应该是夺取舞台的改变能力,因此最后白女王舍弃了一切帮助格林逃离崩坏的舞台。 这场棋局中,梅贝尔横竖不亏,红女王陷入必死之局,最关键的棋手就是白女王,只要她愿意,随时可以下出必赢的一着,但最后她依旧选择了放弃自己的棋子,把终结棋局的希望留给了格林 在经历如此多的牺牲之后,格林终于从棋子升为了棋手,只是不知道他又会下出怎样的一着

]]>
+ 01

众所周知,black souls的原型,或者说最重要的灵感来源就是爱丽丝梦游仙境以及它衍生的爱丽丝镜中奇遇,我本人一直对游戏和原著的对应关系感到很好奇,但由于工作量很大,一直没下定决心做这件事,但最近突然想到,如果分期做一些整理会不会就没那么麻烦了呢,于是决定开启这个系列。 由于是第一期,我就扯一些闲话,爱丽丝的原著可谓有着非常深远的影响,首先,他就是最著名的童话之一,在儿童里的传播极为广泛,在我小时候就听说并读过这个作品,但说实话爱丽丝的原著对孩童来说实在太过思维跳脱,导致我虽然通读了几遍但完全没看进去,考虑到当时的儿童文学相比现在的完善可以说几乎不存在,这本书可谓有着相当的意义,不过我毕竟没有研究过相关文学史所以不多评价了,对于爱丽丝的原著,我最深刻的印象就是其无比丰富的想象力以及跳脱的情节(由于卡罗尔是数学家,他还塞了不少数学梗进去),可能这就是莉耶芙喜欢这本书的初衷吧。 此外,爱丽丝这一形象与整个不思议之国以无数的二次创作形象疯狂地在各种娱乐作品里传播,关于这点,我认为是爱丽丝原著符号性强烈的特点导致的,永无止境的茶会,跳进兔子洞等元素非常具有符号性,它们奇怪到引人注目,但谁也不知道到底指的什么,可能有意义,可能没有意义,二次创作者可以非常自由地阐释这些元素,因此导致了在二次元文化里,爱丽丝近乎成了最常见的一个人名或者说符号 最后则是它的现实作者,金属冶炼在欧美文化里是个很敏感的话题,关于原作者此方面的谣言可以说满天飞,但对此我只能说疑罪从无,没有直接证据表明这一点,就连一些间接证据在我看来也很明显是牵强附会,基于道德的角度,我们不该用一些间接证据指责两个世纪前人物的私事,此外,black souls是毋庸置疑的架空世界观作品,不管怎么编故事也和现实中的卡罗尔毫无关系。 当然black souls设定下的卡罗尔也是个经常被讨论的问题,由于冬之钟那个崩坏的adv,很多人认为black souls的卡罗尔是个炼金术师,但是很明显小剧场不过是哪个支配者的大作,而且是个很有虫虫风格的作品,没有任何证据表明black souls设定下现实的卡罗尔干了相同的事,总的来说我认为black souls世界观的卡罗尔,除了他一直深爱爱丽丝以外和爱丽丝一家的关系是没有确切信息的,而且这种爱也可能不是男女之爱,只是柏拉图之恋罢了。 好吧,关于原著以外的讨论就说到这里,接下来我们开始具体情节的对照分析。 第一章的开头,小爱丽丝和姐姐一起坐在河边,姐姐在看一本没有插图没有对话的书,让小爱丽丝感到无聊。 书在black souls中是个很常见的意象,没有插图的书只在牛津学院的回忆中提到过一次,读书的倒是有几个,一代的爱丽丝02一直看着书,书上的内容似乎是格林被玛丽苏毁灭时的遗言,此外,一代的尸龙也在读着书,而且二代时她也在河边,根据她念出来的部分,其实就是我们这个世界的卡罗尔描写邪龙贾巴沃克被打倒的那首诗,个人猜测有可能black souls中卡罗尔没有给爱丽丝送出去的礼物其实是他的作品集,后来卡罗尔被玛丽苏捉走,这本书则被尸龙拿走,最后,二代的白女王诺登也是个看书人,这本书格林无法阅读,但0sen下能看到轮回次数 由于02不是任何人的姐姐,白女王虽然很御姐,但原型明显是白兔先生,所以对应度最高的其实是贾巴沃克,此外尸龙摸鱼的时候摘花,而此时的爱丽丝也有摘花的意图,可能暗指温柔的尸龙姐姐摘花编成花环想送给爱丽丝(迫真) 随后就是经典的爱丽丝跟着匆忙的白兔先生进了兔子洞的环节,此时的白兔先生声称自己是急着去找公爵夫人 兔子洞在一二代都有对应,一代追寻着原著顺序,跟着白兔,从兔子洞跳下就能到达不思议之国,二代却是相反的,格林先到坠落之间,然后才到兔子洞 此外,原著对坠落的描述是,途中有很多书架以及各种柜子,这点在坠落之间和兔子洞都有体现,爱丽丝在坠落后第二次见到了匆忙的白兔先生,而按通常的流程,也是格林过了兔子洞后进行度为1才能见到白兔诺登,此外原著中爱丽丝第一次来到的门厅顶上有一排灯,这可能是图书馆的进行度灯的灵感来源,原著中爱丽丝用钥匙打开一扇门后来到了放有变大变小药的房间,游戏可以直接到达,喝了我和吃了我是非常经典的原作梗。 以上是爱丽丝原著第一章和游戏的对应关系,那么今天就到此为止了

02

接下来开始第二章的分析 吃下蛋糕后的爱丽丝身形变得非常巨大,也因此挤不进她想去的花园,此时她哭泣的眼泪形成了泪水池,对应bs的血泪之池,有种说法是红偶像紫餐产生的血泪形成了血泪之池,如果从致敬原著看的角度倒是不无可能 这时白兔先生经过,被爱丽丝吓跑,留下了手套和扇子,扇子有着让人变小的能力,但此时不知情的爱丽丝一边扇扇子一边开始自我怀疑,正是这时她提到了梅贝尔这个名字。 根据爱丽丝的说法,梅贝尔什么都不知道,住在又破又小的房子,没有玩具还要天天念书,对应bs中的梅贝尔,某种程度上讲还挺还原的 随后被扇子变小的爱丽丝掉进了泪水池,并在池子里遇到了一只耗子以及其他动物,她们一起游上了岸。 接下来就是第三章了 此时耗子开始上起了历史课,这段剧情在bs有两个对应点,一个就在酒馆里耗子直接出场给我们上课,而则是牛津学院的回忆提到爱丽丝讨厌历史课。 随后为了让湿透的衣服变干,渡渡鸟为她的动物朋友们召开了一场赛跑会,跑完宣布大家都赢了,但奖品让爱丽丝颁发,甚至包括爱丽丝自己的奖品,于是爱丽丝给所有人每人一颗糖,给自己发了一只丁真,很对应游戏血泪之池的渡渡赛跑会,但游戏中只有杀害渡渡会得到一颗糖果,杀害其它动物没有奖品(私藏奖品的屑),附近可以捡到糖果,此外,游戏和原著中的赛跑参与者是不完全对应的,赛跑中白鹅会提到鹦鹉和鹰缺席了,原因吗,因为涉及一些书本以外的东西我们以后再说 此后螃蟹母子的对话会提到好脾气的牡蛎,可能对应bs的dlc1嚣张的牡蛎 第四章中爱丽丝被白兔错认为了玛丽.安,白兔家的女仆,这就是为什么被白兔诺登剥夺神力的虫虫改名成玛丽.安并且穿着女仆装。 爱丽丝喝了让自己再次变大的药水,然后被挤进了房子里无法动弹,此时她吐露了自己不想长大的愿望,随后,蜥蜴比尔被派去搬来梯子,爬进烟囱里查探情况,被爱丽丝一脚踢飞出去,这段对应bs大圣堂里比尔搭梯子的剧情,顺便一提,比尔除了倒霉蛋属性外在bs里几乎全被魔改了,合理怀疑是莉耶芙加了什么私货进去。 随后爱丽丝吃下了被扔进来的蛋糕,再次变小,并逃进了一个长着高大蘑菇的森林,并在蘑菇上遇到了抽烟的青虫,对应游戏中的孢子之森,第四章结束 也就是说原作爱丽丝的路线就是兔子洞-血泪之池-孢子之森,这也是为什么进行度0时会在森林遇到爱丽丝的幻象,虽然这一路线并不一定遇到比尔 格林和希夏的对话基本对应原作爱丽丝和它的见面,一开始不理不睬,但离去时希夏开口挽留,原著毛虫让爱丽丝背了首威廉老爹的诗,对应孢子之森的boss,游戏与原作不同的是,原作的虫子告诉爱丽丝吃下蘑菇可以变大变小,游戏中直接让格林去找公爵夫人 爱丽丝见过青虫后有段剧情,爱丽丝吃下蘑菇后脖子变得很长,被一只孵蛋的鸽子认作来吃蛋的长虫,这里译本的长虫其实就是大蛇的意思,这段剧情在游戏也有两个对应,一是游戏中的物品鸽子蛋,孢子之森能捡到鸽子蛋,杀害希夏会掉落鸽子蛋,正好符合原作顺序,对其的描述是少女不吃生蛋,蛇却很喜欢吃,也符合原作,bs中的蛇只有蛇神,而0sen下看到他的脖子很长,也对应原著情节;第二个疑似的对应点则是卡罗尔川的矮胖子,可以孵化出雏鸟,但除此以外和原著没什么对应

03

接下来我们开始第六章,公爵夫人的章节 公爵夫人馆外能遇到名为幼犬的怪物,这应该对应书中第四章,遇到青虫前爱丽丝遇到的小狗,馆内可以遇到鱼和蛙之听差,原作中他们分别是女王派来邀请打縋球和公爵夫人处接受邀请信的佣人。 公爵夫人是比较还原原著的一个角色,基本上所有行为举止都有对应。爱丽丝初见她的场景和游戏中几乎完全对得上,婴儿和猪的转化则用sen值来实现(顺便一提屠宰场也有类似的转换),只有柴郡猫没有出现,但馆内一张挂画上则会出现柴郡猫,这张挂画上随着sen值不同也会出现猪和婴儿的转变,此外,由于公爵夫人还原度很高,我把台词中的对应点用图整理如下 公爵夫人另一个原型,也是她名字和贪食属性的由来则是一幅画作,这幅画作(比较哈人就不放了)可能的历史原型是一位贵族女性,她在历史上有大嘴的外号,并且和丈夫并不恩爱(甚至没同过房?),这解释了里线中她的台词 游戏中柴郡猫瞬忽隐忽现,还有标志性的微笑都出自此章,不过对她来说似乎更认同爱丽丝家的猫的身份,然而她又部分否定了戴娜的身份 值得一提的是,此前我们提到的原作路线都是有着某种程度上的认证的,到森林的路线有爱丽丝幻影,随后有希夏的指引,但从公爵夫人开始跳脱出了梦游仙境,让我们去了镜中奇遇,并且地图到了这里也确实是死路,如果继续按公爵夫人的指引,到达库因兰德这条死路后也确实找到了爱丽丝,虽然格林并不知情。 而如果我们想要继续原著路线,就要踏上不同的路,经过牛津学院到达永不终焉的茶会,为什么呢? 关于茶会我很有些个人想法,但我们先从原著的角度说起 虽然一二代都有茶会,但比较对应原著茶会一段的是二代的茶会,原著中帽匠和三月兔被柴郡猫钦定为疯子,可以说是整部作品里最荒诞的一段,在bs中也不遑多让,我们先从三人的现实原型说起,帽子屋的原型是中世纪的帽匠,由于工艺会用到水银,所以有着疯疯癫癫的形象(游戏也提到这点),三月兔的原型是一句俗语,这句俗语的由来据说是兔子三月处于繁殖期而狂躁不安,所以会有这种人设,睡鼠原型则是一种常见的宠物,非常嗜睡,当时人们喜欢把它养在茶壶里。 我们分人物说起,首先是帽匠 原著一见到爱丽丝,帽匠就大喊没位置了,并且抛出了乌鸦桌子的谜语,和游戏一样,这段谜语若干年后卡罗尔才公布答案,所以游戏的帽子屋说不知道答案。 随后,爱丽丝说自己说的和想的一样,三人一人一句地反驳了她,其中除了三月兔抛出的两句话,都是主语宾语单项包含关系,但游戏中爱丽丝的话由帽子屋说出,并只有睡鼠保留着这种逻辑关系。 面包黄油的对话几乎完全致敬原著。 原著爱丽丝与柴郡猫对话提及此刻是五月,和帽子屋对话提及今天是4号,游戏中时计塔的密码1852正是爱丽丝的生年,所以游戏中帽子屋会说擅长happy birthday 帽匠会提及,自己和时间闹翻了(红心女王的说法是谋杀时间),所以茶会被永远定格到这个时间,餐盘只能越积越多,这可能是游戏中帽子屋不死能力的来源,监禁后她离开了茶会,所以又可以杀死了,此外,游戏中狂鸟一定程度上和时间有着关系,并且帽子屋很讨厌她,或许和原著这段情节有关(但帽子屋又称呼时间为先生) 随后是三月兔,原著中三月兔头顶缠着稻草,卡罗尔说这表示她疯了,游戏致敬了这点。 原著的三月兔打翻了牛奶,游戏中是红茶 最后是睡鼠,睡鼠在原著中唱歌和讲故事都和游戏里对应,故事中三个小姑娘的名字对应利德尔三姐妹,讲故事时,三人责怪爱丽丝打岔,在游戏中里线战斗对话有体现。 好了,以上是和游戏原著比较对应的地方,接下来我就说说对茶会的个人理解,再强调一下,都是个人理解。 茶会可以说是bs2中一个很重要的地图,它和牛津学院直接相连,并且两张地图连续有一个回忆,而进入牛津学院主流的路线就是从精神病院开始通过路德维希市街,见证伊迪斯和杰克的悲剧,顺便一提关于利德尔三姐妹,我之后会出个特辑,这里先不谈,漫布迷雾的街道明显是在neta伦敦,并且卡罗尔是英国人,曾在牛津学院任职,这条路线可以说是最贴近现实的一条路。 此外,如果要防止狂鸟唱歌,就必须先来到茶会去往时计塔,并且时计和箱庭的运转息息相关,而狂鸟唱歌的目的应该就是让格林别乱跑了去找爱丽丝,此外,不思议之国的大部分地方都很有着阴森的氛围,而且弯弯绕绕,只有茶会非常狭小却坐拥一个篝火而且阳光明媚氛围悠闲,几乎可以磨灭格林的斗志了,茶会的三个参与者就更有意思了 如果我们给三人归纳一个关键词,一个是疯狂,一个是爱欲,一个是睡梦,三者加在一起几乎概括出了整个二代的特点,这恐怕是奈亚不想让格林意识到的,此外,来到茶会必然会遇到伊迪斯,按原作顺序之后就是红心女王罗丽娜,两人是乱入者,且都曾和卡罗尔关系亲密,奈亚不希望她们引发卡罗尔的回忆,所以才会让夫人把我们支开。 对这三人和她们的象征意义,疯狂和爱欲其实不必多说,但睡梦其实是一条相对的暗线,我一直认为寿司是一个很喜欢前后对照的作者,所以就让我们来分析一下,不少npc会提及此处是个梦境,但最早是在op,游戏的开头是格林苏醒,看到爱丽丝,然后不知道为什么再次睡去,因此我们如果认真看开头就会知道不思议之国是个梦境,那么为什么设定成梦境呢,首先是由于协助创造箱庭的诺登的原型是所谓的幻梦境之主,其次呢就是因为原著的结局会发现爱丽丝的奇遇是一场梦,光是这点就很有意思,两者揭露梦境的时间点完全相反。 那么问题来了,已经在梦境了,如果再次做梦不就有了梦中梦?而如果是梦境是虚假,梦中梦则是虚假的虚假,会不会是真实呢?格林做过几次梦中梦呢,第一次是精神病院看到师匠,第二次是孢子之森的幻觉爱丽丝,第三次是海底的旅社,第四次是冬之钟adv,牛津学院的月面比较特殊就不论了,这几次梦中梦,虽然未必都是真实,但都揭示了部分真相或者现实。 既然如此,有一个人就很奇怪了,睡鼠,她是格林外唯一一个能在梦境中沉睡的人,如果是格林自己的梦还可以做梦中梦,但睡鼠一个梦境中的角色怎么还能入梦呢?除非她只是装睡,对话中睡鼠会说她没有睡,所有人的对话她都没有听漏,这很有可能就是真相(虽然里线又说真在睡),并且她随后说了一句要杀了所有人,然后辩解说是梦话,结果全监禁后她真的这么做了。 因此个人猜测睡鼠表面虽然入梦,但其实是最清醒敏锐的,她有着监视格林的任务,一旦格林不照着剧本做梦,滞留在一次轮回中,就会把风险清除掉,逼迫他进入下个轮回。 而h结局中在冬之钟我们能看到三月兔和帽子屋,她们的对话反过来看就是冬之钟的本质,为什么只有这两个人呢?一是三人的对话提到除了睡鼠两人都想来冬之钟,二则是根据我的想法,此时格林意识上已经从梦里醒来,剩下的问题就是奈亚的爱欲,以及舞台带来的疯狂,也就是茶会的这两个人的象征。 当然,以上不过是个人解读,大家看个乐就行。 可能有人问,那么一代的茶会呢?这个由于时间线的原因我们以后再讲。

04

让我们开始第八章的分析 七章末尾,爱丽丝被疯疯癫癫的三人惹恼,离开了茶会,进入了一片森林,在她迷路时出现了一道门,让她回到了最初的兔子洞大厅,随后她利用变大变小的能力走进了最初看到的庭院。 这段路线,如果我们忽略茶会怎么回到兔子洞这个问题,可能对应利德尔墓地到心脏庭院,墓地这块确实是森林,并且进入庭院的入口确实是一道门,虽然顺序颇有些问题。 原著中,入口旁的三个扑克园丁忙着把种错的白玫瑰刷成红心王后喜欢的红色,随后被王后发现要杀头,游戏中只有一个庭师在干活,而且不是上漆而是上血,另外两个则在说格里芬的闲话。可能是rpgmaker的素材问题,原著和游戏的扑克种类对不上 原著中红心王后杀头的表达翻译过来大概是这样的:他们的头没了吗?士兵的回答是:“他们的头不见了”由此王后认为确实杀头了,这里是个文字游戏,原著中这三个园丁藏了起来,头确实看不见了,但没有杀头,这可能是游戏中红心女王不看处刑场面的由来。 杀头后王后邀请爱丽丝打追球,但是球棍是火烈鸟,球是刺猬,两者都会在游戏出现,区别是火烈鸟0sen变成弯曲的球棍,球则在0sen才出现 打球的时候公爵夫人来向爱丽丝搭话送了她几句教训,对应游戏中公爵夫人出现在追球场并且满口教训,随后王后再次出现在爱丽丝面前,带她回去打球,这次过程中王后把除了国王的所有人判了死刑,随后国王赦免了他们。 可能是由于实际上外来者的缘故,红心王后也被魔改得很厉害,基本上只有性格和杀头的口头禅是还原原著的,此外,原著的红心王后虽然没杀过一个人的头(狮鹫的说法),但被所有身边人畏惧,这点也沿用到了游戏中,红心王后可能的原型是当时的英国女王,这也是为什么游戏中红城bgm是掷弹兵进行曲。公爵夫人会说红女王和红心女王一样残暴,这段可能来自于卡罗尔自己对两位皇后的解释。原著的红心国王直接删掉了,是梦游仙境唯二个游戏里没有对应的主要人物(还有个是红桃杰克),当然也有可能对应格林(笑)。 之后,王后让狮鹫带爱丽丝去听假海龟的故事,对应游戏里罗丽娜发布布告让部下去讨伐食尸鬼,因为会在那里见到假海龟。原著中在女王走远后,狮鹫说到女王从来没有成功杀过一个人的头,对应游戏中格里芬说女王不敢看处刑场面 这里顺便一提,狮鹫是卡罗尔任职的牛津学院的三一学院的院徽,假海龟出自当时用牛肉汤代替昂贵海龟汤的习惯,原著中狮鹫懒散,假海龟则惶恐不安,和游戏对应,假海龟哭哭啼啼地讲起了自己的故事,它曾在深海的学校上课云云,这里是非常典型卡罗尔造生词环节,游戏中有原台词化用 说完上课的事后,狮鹫提出跳龙虾方块舞,游戏中则是龙虾舞,为什么呢,我给大家三秒钟猜一下,因为格里芬是方块骑士,所以已经有方块了,这很可能是方块骑士身份的来源,因为除此以外原著只有一些方块廷臣,其中的歌是假海龟唱的,游戏中也有体现,格里芬说自己不记得歌词 随后狮鹫让爱丽丝背了几首诗,最后假海龟唱了一首海龟汤,对应游戏中让假海龟做料理的台词 关于爱丽丝的线索,女王和格里菲会引导格林去市街,市街的卡面来打会引导格林去墓地方向,随后线索就断了。 这之后就是梦游仙境最后一个场景,审判庭,关于审判这件事的信息,翻遍二代也只能找到狮鹫去邀请比尔当陪审员这件事,其中,他们会说审判已经发生过一遍,那么是在哪呢? 很有可能是在一代的不思议之国。已然终结的茶会,最明显的是守门的班达斯奈奇,他提出的问题和答案部分和原著的审判相对应,茶会中的一只兔子会提到疯帽子三人以及爱丽丝的消失,这正是原著剧情,收集童话出现的里门,爱丽丝排列成类似法庭陪审团的形式面朝格林,这很有可能也是表示审判。 此外,我也有些个人想法,杀害02得到的缎带物品描述是追寻梦中的爱丽丝,这几乎可以肯定指的二代,而爱丽丝原著正是在最后的审判后告诉我们一切都是梦,然后见到了姐姐,而这和一代也在读书的尸龙姐姐勉强对得上,审判后的爱丽丝消失了,奈亚丽丝用格林取代了她的位置一直梦游到了审判剧情前,这样一来就构成了一个循环,爱丽丝梦游仙境结束后开始格林梦游仙境,这是很有寿司风格的前后对照。 此外,还有一种可能的解读是,审判其实是奈亚丽丝内部召开的,最后判决结果是把爱丽丝01驱逐出去,产生了红偶像 总之,审判这段原著情节在bs有没有对应大家就见仁见智吧 好了,这样一来对梦游仙境的解析就结束了,下一期作为拾遗篇,我会说说卡罗尔和利德尔三姐妹在游戏中的暗线。

拾遗篇

查尔斯·道奇森,一个天赋型的数学家,笔名刘易斯.卡罗尔,最知名的作品是两本以知名幻想角色爱丽丝为主角的作品,与同时代知名的柯南道尔(福尔摩斯系列的作者)同是一个灵异研究学会的成员,还有一个较晚出生的知名的同时代人是克苏鲁体系的作者洛夫克拉夫特 有意思的是以上提到的三人分别是三种文学流派的奠基人,并且这三种衍生文化不同程度地影响了bs系列 1855年,卡罗尔23岁,结识了自己任职学院的院长一家,一年后认识了三姐妹,随后的时间他时常和这家的三姐妹一起聚会,1962年7月4日,一个黄金的午后,当时三姐妹的长女罗丽娜13岁,次女10岁,三女8岁,与卡罗尔一起泛舟湖上,卡罗尔讲了一个日后成为梦游仙境原稿的故事,两年后整理成了一部名为地底冒险的手稿送给次女。 1863 年 6 月,利德尔一家和卡罗尔之间的关系突然破裂,没有直接证据能说明原因,几个月后有所缓和,但已经无法还原如初的美好了。 再之后,长女没有在历史上留下痕迹,次女和三女都和一位王子有过绯闻,但可能因为身份原因没有成,可怜的三女在即将结婚时22岁因病早逝(精神病院的开门次数),似乎最受上天关爱的次女于28岁结婚,成为哈格里夫斯夫人。 这是我们这个世界历史上的卡罗尔和三姐妹的故事。那么bs世界里这四人发生了什么呢?

最直接的证据是六段苦涩的回忆,虽然对他们的来龙去脉或是真假完全没有确论,但它们提供了大部分相关信息,我们按现实时间顺序一个一个说起。 卡罗尔川的回忆直接用了梦游仙境的卷首诗,描述了这个故事的原初,并且由于卡罗尔生活时期正是英国盛世,泰晤士河污染严重,黄金午后的那条河流从属于泰晤士河,和游戏中污染的描述也对得上 按现实顺序随后的应该是牛津学院的回忆,卡罗尔和利德尔一家的交恶 随后则是槌球场,这里应该对应现实中黄金午后的两年后,卡罗尔送给了爱丽丝地底冒险手稿,这部手稿有卡罗尔自己的插画,但并非圣诞礼物,卡罗尔曾和爱丽丝一家打槌球玩,因此会出现在槌球场,但游戏中此时二家似乎没有交恶,因此bs中可能存在顺序调换。 之后就是纯粹的架空时间线了 之后是叹息的海边,回忆中摄影的阁楼有现实对应,正是牛津大学的建筑,回忆描述了两人的再次重逢,至于为什么是海边,可能是因为卡罗尔在1876年出版的《猎蛇鲨记》,这是他最后一部知名作品,次女和卡罗尔的重逢历史上没有什么资料,事实上,即使卡罗尔逝世时,次女也就46岁,不可能是老婆婆,但梦游仙境的改编的戏剧于1886年圣诞节期间上映,卡罗尔也去看了,顺便一提,演睡鼠的是一位叫多萝西的女士。这是有记载的卡罗尔最后一次见到次女,而有记载的次女最后一次与卡罗尔有交集,是在1932年卡罗尔逝后的100年诞辰,这时她已经80岁了 再后面是库因兰德的回忆,库因兰德的女王原型是镜中奇遇的红女王,而镜中奇遇出版于1871年。这段回忆似乎提到卡罗尔把另一个人当做代餐,可能是bs世界观的罗丽娜? 最后是完全架空的茶会回忆,和现实基本没有关系了。 其次还有若干原著彩蛋在游戏中使用,如卷首诗,也就是第一段回忆的little和利德尔同音,血泪之池的鹦鹉和小鹰分别是长女和三女的书中化身,睡鼠的故事也化用了三姐妹的名字等

卡罗尔在bs中和现实基本对应得上,但还有的问题是,猎蛇鲨记,贾巴沃克等作品的来源没有交代,其中贾巴沃克这首诗尸龙基本给我们念了一遍,有可能原稿在她手上,此外卡罗尔虽然终身未婚,但依然有很多朋友,如猎蛇鲨记就受一位忘年交的启发,可能是冬之钟小剧场那张照片中的女人 顺便一提,现实中的弗朗西斯.利德尔1965年出生,自他记事起卡罗尔和利德尔一家应该都不怎么来往了,现实中的三姐妹和当时的大部分贵族女性一样在家中由私教授课,不可能叫卡罗尔老师

之后我们来分别探讨一下三姐妹在bs的暗线 现实中的长女资料最少,但书中的鹦鹉有卖弄自己年纪大的特点,并且有一种说法是,当年的长女对卡罗尔非常依恋,这些特点沿用到了游戏中,有可能bs中的卡罗尔倾吐虚假爱意的对象就是她。根据其自述,罗丽娜向邪神献祭灵魂才会来到不思议之国,但时间点未知,如果是在次女后,那么游戏中的罗丽娜是完全的少女心性就很奇怪了。还有一种说法是,罗丽娜和她的母亲名字一样,所以小剧场那张照片的真身有可能是……不过我觉得这可能很小就是了 心脏女王也是个谜点重重的角色,如果我们给有梦游仙境原型的誓约角色所需魂数量排序,那么由小到大依次是白兔,渡渡,比尔,希夏,公爵夫人与假海龟,帽子屋,心脏女王 其中除了假海龟都参照原作出场顺序,她虽然是乱入者,但不思议之国大部分住民都会提到并认同女王是名义上的统治者,她不知为何能指挥魔兽化的手下,让唯一有理智的格里菲去全国巡逻,每天用审判来控制人口,还给大工批了大把建筑费用来上达天听,不知道是奈亚的命令还是什么其他原因,她确实做了很多管理不思议之国的事,此外,还是唯一一个非格林子女却有里线战斗的 三女伊迪丝在游戏中是精神病院的boss,对于她怎么来到箱庭,仅有的线索是混沌迷宫和电影院的两段没头没尾的故事,游戏里和三女私奔的王子,很可能也是杰克,这位角色现实原型之一很可能是利奥波德王子,正如前文所说,据传他曾与伊迪丝相爱,伊迪丝22岁早夭后,王子为她抬棺,王子和伊迪丝一样病弱,患有血友病,三女辞世的8年后,王子以30岁的年龄逝世,这或许是游戏中他也住院的原因,另外两个明显原型是开膛手杰克和福尔摩斯,或许是因为卡罗尔曾被看做开膛手杰克的嫌疑人,而同时代柯南道尔也曾经研究过这个案件,顺便一提上文王子的一个侄子也是一大嫌疑人 伊迪丝在冬之钟小剧场里头戴着枯萎的花圈,可能暗示着她的早逝,并且多次有小鹰的元素出现,但罗丽娜除了大姐作风却没有明显的鹦鹉元素,这点也有些让人在意 最后是次女,这里的次女指的是观星引来奈亚的人类个体,关于这个个体的信息反而是最少的,只知道她和卡罗尔心心相惜却被拆散,她和现实次女的履历是否一样未知,她的最终去向未知,牛津学院的学寮长是否就是她父亲的灵魂所化也未知。 关于现实中的对应,现实的次女并非常见的金发形象而是黑发,并且和梦游仙境的爱丽丝有很多差异,游戏中似乎没怎么提到过发色,不知道如何设定,次女和南丁格尔是同时代的人,因此院长认识爱丽丝可能是认识人类状态的次女,此外,小剧场的次女会有很多致敬原著的台词,出示如下 在群星之夜后,似乎她的名字成为了禁忌,也是里线剧情的关键,关于次女我还有一个,, 等等,次女的名字,为什么,我想不起来次女的名字,对了,她的名字,她的名字不就是 爱丽丝.利德尔 勿呼其名,唤则得知,蠕动前行而来 縺ゥ縺?@縺ヲ遘√'谤「縺辅↑縺代l縺ー縺ェ繧峨↑縺??縺ァ縺呐° 繧「繝ェ繧ケ繧呈尔縺励※缧ゅい繝ェ繧ケ繧呈?縺励※缧ゅい繝ェ繧ケ繧贞ソ倥l縺ェ縺?〒缧 诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ 诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ

ex01

相较梦游仙境,镜中奇遇在bs中的对应情节明显变少,但依旧有分析的价值 首先是镜中奇遇的卷首诗,这首诗提到了卡罗尔此时和现实的爱丽丝年龄相差一倍,语气中某种程度上可能透露了卡罗尔对无法回到往日时光的惋惜,不管怎么说,此时爱丽丝已经长大了,看童话故事的美好时光已经不会回来了 开篇剧情中爱丽丝在和戴娜生下的小猫玩,对应普通结局少女的房间中柴郡猫说自己产下小猫后死去,虽然我们不知道现实的戴娜是怎么死的。 随后爱丽丝会提到镜子屋,也就是镜子里的相反的房间,这在之后成为整本书的主题,在bs中镜子屋对应公爵夫人提到了通过血泪之池镜子才能到达的镜之国,但同样和镜子有莫大关系的还有一位小红帽,值得一提的是,镜之国库因兰德是为数不多没有柴郡猫出现的篝火。 随后爱丽丝在镜子屋看到了一些会说话的棋子,并随意摆布它们,这段有点像bs奈亚的作风 她翻到了一首叫贾巴沃克的诗,当然这里其实是卡罗尔引用之前的作品,贾巴沃克这首诗非常晦涩难懂,以后有机会我会谈谈在它在bs里的对应。 之后爱丽丝飞跃滑下楼梯,想跑去屋外的花园,这里的下楼梯法在冬之钟小剧场有对应

爱丽丝想走到一座小山丘俯视花园上,但怎么走都会回到原点,这 里可能对应精神病院的走法,也可能对应库因兰德的迷宫,于是她只能转而去往一个小花园,遇到了一群会说话的花,这些花对应一代圣森和不思议之国的会说话的花,以及在bs2中,红女王的房间里的花,一些花很吵闹,爱丽丝威胁把它们拔下来,对应道具咒骂之花, 随后爱丽丝遇到了红王后,原著中的红王后被卡罗尔描述为典型的家庭教师,原型可能就是爱丽丝的家教,bs中红女王的名字直接用了这位家教的名字,有一种说法是卡罗尔利用三姐妹来追求她造成两家决裂 爱丽丝羡慕地说想成为王后,红王后告诉她需要前进八格,然后拉着她全力奔跑,贡献了一句经典台词,前进八格成后这是国际象棋的规则,而红王后的台词在bs中对应库因兰德的一个留言和冬之钟柴郡猫的台词 值得一提的是在原著中有重要意义的棋盘在bs中也有同样的重要性,红女王的库因兰德遍布着棋子,梅贝尔在自己的箱庭部下棋局,而白女王则把王冠,也就是走了八步后成王的关键放在了冬之钟,可以推测原著中想要成后的爱丽丝其实对应着bs中想要得到改变权能而成王的格林。 红王后指引爱丽丝成后的走法,提到了需要乘火车,对应去库因兰德的火车 火车上爱丽丝遇到了一只会说话的虫子,在一阵颠簸后她们发现自己安静地坐在树下,爱丽丝和它讨论了一下命名学,虫子告诉爱丽丝前方有着无名之森,对应bs里的那张地图,这只虫子可能也对应无名之森的一只虫形怪物 无名之森里爱丽丝遇到了一只小鹿,对应bs中无名之森的小鹿,但bs中通过无名之森才能坐火车,与原著相反 本章的末尾,爱丽丝遇到了双子

ex02

爱丽丝接下来遇到的是崔德尔双子,二者一开始站立不动,让爱丽丝觉得他们是蜡人偶,也就是蜡像,游戏中反了过来,游戏中双子提到了站立不动的格林是蜡像的可能 两兄弟的原型是一首英国童谣,童谣提到了丢失的拨浪鼓和飞来筑巢的乌鸦,在游戏双子的台词有体现,筑巢的大鸟应该就是伊迪丝 随后两兄弟给爱丽丝背了首海象和木匠的诗,大意是海象和木匠偏小牡蛎来做客,然后把它们吃完了,游戏中很明显海象对应希伏契,木匠对应大工,吃牡蛎的剧情也在希伏契对话中有体现,且,双子誓约对话会提到两人 之后,爱丽丝发现了附近正在做梦的红王,在双子对话中有原意复用 双子中的蒂看到了他弄坏的拨浪鼓,让两兄弟起了矛盾,对应游戏中的台词,随后两人约定决斗,可能对应游戏里的双子相残,就在这时乌鸦飞了过来,打断了决斗 书中的两兄弟按棋谱来说是白方,这解释了她们为何与dlc3的克里米亚有一定关系

为了躲避大鸟,爱丽丝逃进树林遇到了白王后,与严肃的红王后不同,白王后非常随和友好,并且她声称自己是倒着过日子的,这解释了白女王诺登管理重启轮回的职能 交谈一会后,爱丽丝突然转移到了一间商店里,店主是一只绵羊,发生了很多怪事后爱丽丝又闪现到了小船上和绵羊一起划船,对应游戏里老羊的台词 书中这段空间转换非常频繁,可能因此寿司在老羊商店里放了一堆来源不明的谏言

一连串的转换后爱丽丝看到了矮胖子,这位角色也来自于一首英国民谣,矮胖子很多台词台词在游戏里有直接对应,整理如下 值得一提的是矮胖子解释了一些贾巴沃克诗的生造词,为后世的译者提供了不少信息。 在爱丽丝和它不欢而散后,听到了蛋壳碎裂的声音,暗示它的跌落,但游戏中矮胖子是因为孵化而裂开

爱丽丝再次前进,遇到了白国王和他的部下,信差告诉了他独角兽和狮子为了王冠争斗,这里的两只动物对应苏格兰和英格兰,并且依旧来源于一首民谣,游戏中冬之钟小剧场长女会引用,并且冬之钟也有很多争斗的对应情节,整理如下 独角兽傲慢,狮子凶恶,游戏中有一定程度上的体现,两者对应的棋子走法一个诡异难测,一个横冲直撞,也在游戏中对应

随后,爱丽丝遇到了前来将她军的红骑士,但埋伏在旁的白骑士反吃了红骑士,护送爱丽丝成王前的最后一段路,这段几乎没有在游戏里的直接对应,除了冬之钟小剧场he中卡罗尔让三姐妹为他挥手帕用了原台词,并且也有说法是白骑士是作者的投影。 但我个人对此有一些猜测,这段很可能对应整个冬之钟剧场,根据一些主流猜测,这段其实是梅贝尔和古兰合谋困住了追击的奈亚,如果我们认为红方是敌方,那么就对应奈亚,指引爱丽丝成王的红王后对应反水的红女王,红骑士表示前来追击的奈亚,白骑士就可能是白女王方的梅贝尔,那么这段剧情就成了,奈亚前来将住格林,梅贝尔前来解围,护送格林到了成王之路

终于,爱丽丝戴上了王冠,格林成了“王”,在此之后的剧情对应很少,青蛙佣人招待爱丽丝去了晚宴,对应游戏中去往古兰晚宴前向海因里希托付女儿,爱丽丝梦醒后红白王后成了黑白两只小猫,对应红女王的台词,可能会在续作有进一步的阐释

至此,对卡罗尔爱丽丝系列的作品就完全结束了,之后有机会可以说说贾巴沃克和猎蛇鲨记

]]>
- <h1 id="冬之钟">冬之钟</h1> -<p>由于black souls的故事远远没有完结,因此现阶段我们很难对<code>红白女王</code>与<code>梅贝尔</code>这些与格林牵扯极深的支配者们进行什么定论,只能就已有的剧情和文本进行一些归纳,本期视频我将就bs2比较难懂的一处地方,冬之钟的主线事件,进行一些个人向的分析。 + <h1 id="section">01</h1> +<p>众所周知,black souls的原型,或者说最重要的灵感来源就是爱丽丝梦游仙境以及它衍生的爱丽丝镜中奇遇,我本人一直对游戏和原著的对应关系感到很好奇,但由于工作量很大,一直没下定决心做这件事,但最近突然想到,如果分期做一些整理会不会就没那么麻烦了呢,于是决定开启这个系列。 @@ -910,17 +909,18 @@
- blacksouls原著梗解析 - - https://thinklive1.github.io/2023/09/29/blacksouls%E5%8E%9F%E8%91%97%E6%A2%97%E8%A7%A3%E6%9E%90/ + blacksouls人物解析 + + https://thinklive1.github.io/2023/09/29/black%20souls%E4%BA%BA%E7%89%A9%E8%A7%A3%E6%9E%90/ 2023-09-29T02:18:45.993Z 2023-11-27T12:47:59.687Z - 01

众所周知,black souls的原型,或者说最重要的灵感来源就是爱丽丝梦游仙境以及它衍生的爱丽丝镜中奇遇,我本人一直对游戏和原著的对应关系感到很好奇,但由于工作量很大,一直没下定决心做这件事,但最近突然想到,如果分期做一些整理会不会就没那么麻烦了呢,于是决定开启这个系列。 由于是第一期,我就扯一些闲话,爱丽丝的原著可谓有着非常深远的影响,首先,他就是最著名的童话之一,在儿童里的传播极为广泛,在我小时候就听说并读过这个作品,但说实话爱丽丝的原著对孩童来说实在太过思维跳脱,导致我虽然通读了几遍但完全没看进去,考虑到当时的儿童文学相比现在的完善可以说几乎不存在,这本书可谓有着相当的意义,不过我毕竟没有研究过相关文学史所以不多评价了,对于爱丽丝的原著,我最深刻的印象就是其无比丰富的想象力以及跳脱的情节(由于卡罗尔是数学家,他还塞了不少数学梗进去),可能这就是莉耶芙喜欢这本书的初衷吧。 此外,爱丽丝这一形象与整个不思议之国以无数的二次创作形象疯狂地在各种娱乐作品里传播,关于这点,我认为是爱丽丝原著符号性强烈的特点导致的,永无止境的茶会,跳进兔子洞等元素非常具有符号性,它们奇怪到引人注目,但谁也不知道到底指的什么,可能有意义,可能没有意义,二次创作者可以非常自由地阐释这些元素,因此导致了在二次元文化里,爱丽丝近乎成了最常见的一个人名或者说符号 最后则是它的现实作者,金属冶炼在欧美文化里是个很敏感的话题,关于原作者此方面的谣言可以说满天飞,但对此我只能说疑罪从无,没有直接证据表明这一点,就连一些间接证据在我看来也很明显是牵强附会,基于道德的角度,我们不该用一些间接证据指责两个世纪前人物的私事,此外,black souls是毋庸置疑的架空世界观作品,不管怎么编故事也和现实中的卡罗尔毫无关系。 当然black souls设定下的卡罗尔也是个经常被讨论的问题,由于冬之钟那个崩坏的adv,很多人认为black souls的卡罗尔是个炼金术师,但是很明显小剧场不过是哪个支配者的大作,而且是个很有虫虫风格的作品,没有任何证据表明black souls设定下现实的卡罗尔干了相同的事,总的来说我认为black souls世界观的卡罗尔,除了他一直深爱爱丽丝以外和爱丽丝一家的关系是没有确切信息的,而且这种爱也可能不是男女之爱,只是柏拉图之恋罢了。 好吧,关于原著以外的讨论就说到这里,接下来我们开始具体情节的对照分析。 第一章的开头,小爱丽丝和姐姐一起坐在河边,姐姐在看一本没有插图没有对话的书,让小爱丽丝感到无聊。 书在black souls中是个很常见的意象,没有插图的书只在牛津学院的回忆中提到过一次,读书的倒是有几个,一代的爱丽丝02一直看着书,书上的内容似乎是格林被玛丽苏毁灭时的遗言,此外,一代的尸龙也在读着书,而且二代时她也在河边,根据她念出来的部分,其实就是我们这个世界的卡罗尔描写邪龙贾巴沃克被打倒的那首诗,个人猜测有可能black souls中卡罗尔没有给爱丽丝送出去的礼物其实是他的作品集,后来卡罗尔被玛丽苏捉走,这本书则被尸龙拿走,最后,二代的白女王诺登也是个看书人,这本书格林无法阅读,但0sen下能看到轮回次数 由于02不是任何人的姐姐,白女王虽然很御姐,但原型明显是白兔先生,所以对应度最高的其实是贾巴沃克,此外尸龙摸鱼的时候摘花,而此时的爱丽丝也有摘花的意图,可能暗指温柔的尸龙姐姐摘花编成花环想送给爱丽丝(迫真) 随后就是经典的爱丽丝跟着匆忙的白兔先生进了兔子洞的环节,此时的白兔先生声称自己是急着去找公爵夫人 兔子洞在一二代都有对应,一代追寻着原著顺序,跟着白兔,从兔子洞跳下就能到达不思议之国,二代却是相反的,格林先到坠落之间,然后才到兔子洞 此外,原著对坠落的描述是,途中有很多书架以及各种柜子,这点在坠落之间和兔子洞都有体现,爱丽丝在坠落后第二次见到了匆忙的白兔先生,而按通常的流程,也是格林过了兔子洞后进行度为1才能见到白兔诺登,此外原著中爱丽丝第一次来到的门厅顶上有一排灯,这可能是图书馆的进行度灯的灵感来源,原著中爱丽丝用钥匙打开一扇门后来到了放有变大变小药的房间,游戏可以直接到达,喝了我和吃了我是非常经典的原作梗。 以上是爱丽丝原著第一章和游戏的对应关系,那么今天就到此为止了

02

接下来开始第二章的分析 吃下蛋糕后的爱丽丝身形变得非常巨大,也因此挤不进她想去的花园,此时她哭泣的眼泪形成了泪水池,对应bs的血泪之池,有种说法是红偶像紫餐产生的血泪形成了血泪之池,如果从致敬原著看的角度倒是不无可能 这时白兔先生经过,被爱丽丝吓跑,留下了手套和扇子,扇子有着让人变小的能力,但此时不知情的爱丽丝一边扇扇子一边开始自我怀疑,正是这时她提到了梅贝尔这个名字。 根据爱丽丝的说法,梅贝尔什么都不知道,住在又破又小的房子,没有玩具还要天天念书,对应bs中的梅贝尔,某种程度上讲还挺还原的 随后被扇子变小的爱丽丝掉进了泪水池,并在池子里遇到了一只耗子以及其他动物,她们一起游上了岸。 接下来就是第三章了 此时耗子开始上起了历史课,这段剧情在bs有两个对应点,一个就在酒馆里耗子直接出场给我们上课,而则是牛津学院的回忆提到爱丽丝讨厌历史课。 随后为了让湿透的衣服变干,渡渡鸟为她的动物朋友们召开了一场赛跑会,跑完宣布大家都赢了,但奖品让爱丽丝颁发,甚至包括爱丽丝自己的奖品,于是爱丽丝给所有人每人一颗糖,给自己发了一只丁真,很对应游戏血泪之池的渡渡赛跑会,但游戏中只有杀害渡渡会得到一颗糖果,杀害其它动物没有奖品(私藏奖品的屑),附近可以捡到糖果,此外,游戏和原著中的赛跑参与者是不完全对应的,赛跑中白鹅会提到鹦鹉和鹰缺席了,原因吗,因为涉及一些书本以外的东西我们以后再说 此后螃蟹母子的对话会提到好脾气的牡蛎,可能对应bs的dlc1嚣张的牡蛎 第四章中爱丽丝被白兔错认为了玛丽.安,白兔家的女仆,这就是为什么被白兔诺登剥夺神力的虫虫改名成玛丽.安并且穿着女仆装。 爱丽丝喝了让自己再次变大的药水,然后被挤进了房子里无法动弹,此时她吐露了自己不想长大的愿望,随后,蜥蜴比尔被派去搬来梯子,爬进烟囱里查探情况,被爱丽丝一脚踢飞出去,这段对应bs大圣堂里比尔搭梯子的剧情,顺便一提,比尔除了倒霉蛋属性外在bs里几乎全被魔改了,合理怀疑是莉耶芙加了什么私货进去。 随后爱丽丝吃下了被扔进来的蛋糕,再次变小,并逃进了一个长着高大蘑菇的森林,并在蘑菇上遇到了抽烟的青虫,对应游戏中的孢子之森,第四章结束 也就是说原作爱丽丝的路线就是兔子洞-血泪之池-孢子之森,这也是为什么进行度0时会在森林遇到爱丽丝的幻象,虽然这一路线并不一定遇到比尔 格林和希夏的对话基本对应原作爱丽丝和它的见面,一开始不理不睬,但离去时希夏开口挽留,原著毛虫让爱丽丝背了首威廉老爹的诗,对应孢子之森的boss,游戏与原作不同的是,原作的虫子告诉爱丽丝吃下蘑菇可以变大变小,游戏中直接让格林去找公爵夫人 爱丽丝见过青虫后有段剧情,爱丽丝吃下蘑菇后脖子变得很长,被一只孵蛋的鸽子认作来吃蛋的长虫,这里译本的长虫其实就是大蛇的意思,这段剧情在游戏也有两个对应,一是游戏中的物品鸽子蛋,孢子之森能捡到鸽子蛋,杀害希夏会掉落鸽子蛋,正好符合原作顺序,对其的描述是少女不吃生蛋,蛇却很喜欢吃,也符合原作,bs中的蛇只有蛇神,而0sen下看到他的脖子很长,也对应原著情节;第二个疑似的对应点则是卡罗尔川的矮胖子,可以孵化出雏鸟,但除此以外和原著没什么对应

03

接下来我们开始第六章,公爵夫人的章节 公爵夫人馆外能遇到名为幼犬的怪物,这应该对应书中第四章,遇到青虫前爱丽丝遇到的小狗,馆内可以遇到鱼和蛙之听差,原作中他们分别是女王派来邀请打縋球和公爵夫人处接受邀请信的佣人。 公爵夫人是比较还原原著的一个角色,基本上所有行为举止都有对应。爱丽丝初见她的场景和游戏中几乎完全对得上,婴儿和猪的转化则用sen值来实现(顺便一提屠宰场也有类似的转换),只有柴郡猫没有出现,但馆内一张挂画上则会出现柴郡猫,这张挂画上随着sen值不同也会出现猪和婴儿的转变,此外,由于公爵夫人还原度很高,我把台词中的对应点用图整理如下 公爵夫人另一个原型,也是她名字和贪食属性的由来则是一幅画作,这幅画作(比较哈人就不放了)可能的历史原型是一位贵族女性,她在历史上有大嘴的外号,并且和丈夫并不恩爱(甚至没同过房?),这解释了里线中她的台词 游戏中柴郡猫瞬忽隐忽现,还有标志性的微笑都出自此章,不过对她来说似乎更认同爱丽丝家的猫的身份,然而她又部分否定了戴娜的身份 值得一提的是,此前我们提到的原作路线都是有着某种程度上的认证的,到森林的路线有爱丽丝幻影,随后有希夏的指引,但从公爵夫人开始跳脱出了梦游仙境,让我们去了镜中奇遇,并且地图到了这里也确实是死路,如果继续按公爵夫人的指引,到达库因兰德这条死路后也确实找到了爱丽丝,虽然格林并不知情。 而如果我们想要继续原著路线,就要踏上不同的路,经过牛津学院到达永不终焉的茶会,为什么呢? 关于茶会我很有些个人想法,但我们先从原著的角度说起 虽然一二代都有茶会,但比较对应原著茶会一段的是二代的茶会,原著中帽匠和三月兔被柴郡猫钦定为疯子,可以说是整部作品里最荒诞的一段,在bs中也不遑多让,我们先从三人的现实原型说起,帽子屋的原型是中世纪的帽匠,由于工艺会用到水银,所以有着疯疯癫癫的形象(游戏也提到这点),三月兔的原型是一句俗语,这句俗语的由来据说是兔子三月处于繁殖期而狂躁不安,所以会有这种人设,睡鼠原型则是一种常见的宠物,非常嗜睡,当时人们喜欢把它养在茶壶里。 我们分人物说起,首先是帽匠 原著一见到爱丽丝,帽匠就大喊没位置了,并且抛出了乌鸦桌子的谜语,和游戏一样,这段谜语若干年后卡罗尔才公布答案,所以游戏的帽子屋说不知道答案。 随后,爱丽丝说自己说的和想的一样,三人一人一句地反驳了她,其中除了三月兔抛出的两句话,都是主语宾语单项包含关系,但游戏中爱丽丝的话由帽子屋说出,并只有睡鼠保留着这种逻辑关系。 面包黄油的对话几乎完全致敬原著。 原著爱丽丝与柴郡猫对话提及此刻是五月,和帽子屋对话提及今天是4号,游戏中时计塔的密码1852正是爱丽丝的生年,所以游戏中帽子屋会说擅长happy birthday 帽匠会提及,自己和时间闹翻了(红心女王的说法是谋杀时间),所以茶会被永远定格到这个时间,餐盘只能越积越多,这可能是游戏中帽子屋不死能力的来源,监禁后她离开了茶会,所以又可以杀死了,此外,游戏中狂鸟一定程度上和时间有着关系,并且帽子屋很讨厌她,或许和原著这段情节有关(但帽子屋又称呼时间为先生) 随后是三月兔,原著中三月兔头顶缠着稻草,卡罗尔说这表示她疯了,游戏致敬了这点。 原著的三月兔打翻了牛奶,游戏中是红茶 最后是睡鼠,睡鼠在原著中唱歌和讲故事都和游戏里对应,故事中三个小姑娘的名字对应利德尔三姐妹,讲故事时,三人责怪爱丽丝打岔,在游戏中里线战斗对话有体现。 好了,以上是和游戏原著比较对应的地方,接下来我就说说对茶会的个人理解,再强调一下,都是个人理解。 茶会可以说是bs2中一个很重要的地图,它和牛津学院直接相连,并且两张地图连续有一个回忆,而进入牛津学院主流的路线就是从精神病院开始通过路德维希市街,见证伊迪斯和杰克的悲剧,顺便一提关于利德尔三姐妹,我之后会出个特辑,这里先不谈,漫布迷雾的街道明显是在neta伦敦,并且卡罗尔是英国人,曾在牛津学院任职,这条路线可以说是最贴近现实的一条路。 此外,如果要防止狂鸟唱歌,就必须先来到茶会去往时计塔,并且时计和箱庭的运转息息相关,而狂鸟唱歌的目的应该就是让格林别乱跑了去找爱丽丝,此外,不思议之国的大部分地方都很有着阴森的氛围,而且弯弯绕绕,只有茶会非常狭小却坐拥一个篝火而且阳光明媚氛围悠闲,几乎可以磨灭格林的斗志了,茶会的三个参与者就更有意思了 如果我们给三人归纳一个关键词,一个是疯狂,一个是爱欲,一个是睡梦,三者加在一起几乎概括出了整个二代的特点,这恐怕是奈亚不想让格林意识到的,此外,来到茶会必然会遇到伊迪斯,按原作顺序之后就是红心女王罗丽娜,两人是乱入者,且都曾和卡罗尔关系亲密,奈亚不希望她们引发卡罗尔的回忆,所以才会让夫人把我们支开。 对这三人和她们的象征意义,疯狂和爱欲其实不必多说,但睡梦其实是一条相对的暗线,我一直认为寿司是一个很喜欢前后对照的作者,所以就让我们来分析一下,不少npc会提及此处是个梦境,但最早是在op,游戏的开头是格林苏醒,看到爱丽丝,然后不知道为什么再次睡去,因此我们如果认真看开头就会知道不思议之国是个梦境,那么为什么设定成梦境呢,首先是由于协助创造箱庭的诺登的原型是所谓的幻梦境之主,其次呢就是因为原著的结局会发现爱丽丝的奇遇是一场梦,光是这点就很有意思,两者揭露梦境的时间点完全相反。 那么问题来了,已经在梦境了,如果再次做梦不就有了梦中梦?而如果是梦境是虚假,梦中梦则是虚假的虚假,会不会是真实呢?格林做过几次梦中梦呢,第一次是精神病院看到师匠,第二次是孢子之森的幻觉爱丽丝,第三次是海底的旅社,第四次是冬之钟adv,牛津学院的月面比较特殊就不论了,这几次梦中梦,虽然未必都是真实,但都揭示了部分真相或者现实。 既然如此,有一个人就很奇怪了,睡鼠,她是格林外唯一一个能在梦境中沉睡的人,如果是格林自己的梦还可以做梦中梦,但睡鼠一个梦境中的角色怎么还能入梦呢?除非她只是装睡,对话中睡鼠会说她没有睡,所有人的对话她都没有听漏,这很有可能就是真相(虽然里线又说真在睡),并且她随后说了一句要杀了所有人,然后辩解说是梦话,结果全监禁后她真的这么做了。 因此个人猜测睡鼠表面虽然入梦,但其实是最清醒敏锐的,她有着监视格林的任务,一旦格林不照着剧本做梦,滞留在一次轮回中,就会把风险清除掉,逼迫他进入下个轮回。 而h结局中在冬之钟我们能看到三月兔和帽子屋,她们的对话反过来看就是冬之钟的本质,为什么只有这两个人呢?一是三人的对话提到除了睡鼠两人都想来冬之钟,二则是根据我的想法,此时格林意识上已经从梦里醒来,剩下的问题就是奈亚的爱欲,以及舞台带来的疯狂,也就是茶会的这两个人的象征。 当然,以上不过是个人解读,大家看个乐就行。 可能有人问,那么一代的茶会呢?这个由于时间线的原因我们以后再讲。

04

让我们开始第八章的分析 七章末尾,爱丽丝被疯疯癫癫的三人惹恼,离开了茶会,进入了一片森林,在她迷路时出现了一道门,让她回到了最初的兔子洞大厅,随后她利用变大变小的能力走进了最初看到的庭院。 这段路线,如果我们忽略茶会怎么回到兔子洞这个问题,可能对应利德尔墓地到心脏庭院,墓地这块确实是森林,并且进入庭院的入口确实是一道门,虽然顺序颇有些问题。 原著中,入口旁的三个扑克园丁忙着把种错的白玫瑰刷成红心王后喜欢的红色,随后被王后发现要杀头,游戏中只有一个庭师在干活,而且不是上漆而是上血,另外两个则在说格里芬的闲话。可能是rpgmaker的素材问题,原著和游戏的扑克种类对不上 原著中红心王后杀头的表达翻译过来大概是这样的:他们的头没了吗?士兵的回答是:“他们的头不见了”由此王后认为确实杀头了,这里是个文字游戏,原著中这三个园丁藏了起来,头确实看不见了,但没有杀头,这可能是游戏中红心女王不看处刑场面的由来。 杀头后王后邀请爱丽丝打追球,但是球棍是火烈鸟,球是刺猬,两者都会在游戏出现,区别是火烈鸟0sen变成弯曲的球棍,球则在0sen才出现 打球的时候公爵夫人来向爱丽丝搭话送了她几句教训,对应游戏中公爵夫人出现在追球场并且满口教训,随后王后再次出现在爱丽丝面前,带她回去打球,这次过程中王后把除了国王的所有人判了死刑,随后国王赦免了他们。 可能是由于实际上外来者的缘故,红心王后也被魔改得很厉害,基本上只有性格和杀头的口头禅是还原原著的,此外,原著的红心王后虽然没杀过一个人的头(狮鹫的说法),但被所有身边人畏惧,这点也沿用到了游戏中,红心王后可能的原型是当时的英国女王,这也是为什么游戏中红城bgm是掷弹兵进行曲。公爵夫人会说红女王和红心女王一样残暴,这段可能来自于卡罗尔自己对两位皇后的解释。原著的红心国王直接删掉了,是梦游仙境唯二个游戏里没有对应的主要人物(还有个是红桃杰克),当然也有可能对应格林(笑)。 之后,王后让狮鹫带爱丽丝去听假海龟的故事,对应游戏里罗丽娜发布布告让部下去讨伐食尸鬼,因为会在那里见到假海龟。原著中在女王走远后,狮鹫说到女王从来没有成功杀过一个人的头,对应游戏中格里芬说女王不敢看处刑场面 这里顺便一提,狮鹫是卡罗尔任职的牛津学院的三一学院的院徽,假海龟出自当时用牛肉汤代替昂贵海龟汤的习惯,原著中狮鹫懒散,假海龟则惶恐不安,和游戏对应,假海龟哭哭啼啼地讲起了自己的故事,它曾在深海的学校上课云云,这里是非常典型卡罗尔造生词环节,游戏中有原台词化用 说完上课的事后,狮鹫提出跳龙虾方块舞,游戏中则是龙虾舞,为什么呢,我给大家三秒钟猜一下,因为格里芬是方块骑士,所以已经有方块了,这很可能是方块骑士身份的来源,因为除此以外原著只有一些方块廷臣,其中的歌是假海龟唱的,游戏中也有体现,格里芬说自己不记得歌词 随后狮鹫让爱丽丝背了几首诗,最后假海龟唱了一首海龟汤,对应游戏中让假海龟做料理的台词 关于爱丽丝的线索,女王和格里菲会引导格林去市街,市街的卡面来打会引导格林去墓地方向,随后线索就断了。 这之后就是梦游仙境最后一个场景,审判庭,关于审判这件事的信息,翻遍二代也只能找到狮鹫去邀请比尔当陪审员这件事,其中,他们会说审判已经发生过一遍,那么是在哪呢? 很有可能是在一代的不思议之国。已然终结的茶会,最明显的是守门的班达斯奈奇,他提出的问题和答案部分和原著的审判相对应,茶会中的一只兔子会提到疯帽子三人以及爱丽丝的消失,这正是原著剧情,收集童话出现的里门,爱丽丝排列成类似法庭陪审团的形式面朝格林,这很有可能也是表示审判。 此外,我也有些个人想法,杀害02得到的缎带物品描述是追寻梦中的爱丽丝,这几乎可以肯定指的二代,而爱丽丝原著正是在最后的审判后告诉我们一切都是梦,然后见到了姐姐,而这和一代也在读书的尸龙姐姐勉强对得上,审判后的爱丽丝消失了,奈亚丽丝用格林取代了她的位置一直梦游到了审判剧情前,这样一来就构成了一个循环,爱丽丝梦游仙境结束后开始格林梦游仙境,这是很有寿司风格的前后对照。 此外,还有一种可能的解读是,审判其实是奈亚丽丝内部召开的,最后判决结果是把爱丽丝01驱逐出去,产生了红偶像 总之,审判这段原著情节在bs有没有对应大家就见仁见智吧 好了,这样一来对梦游仙境的解析就结束了,下一期作为拾遗篇,我会说说卡罗尔和利德尔三姐妹在游戏中的暗线。

拾遗篇

查尔斯·道奇森,一个天赋型的数学家,笔名刘易斯.卡罗尔,最知名的作品是两本以知名幻想角色爱丽丝为主角的作品,与同时代知名的柯南道尔(福尔摩斯系列的作者)同是一个灵异研究学会的成员,还有一个较晚出生的知名的同时代人是克苏鲁体系的作者洛夫克拉夫特 有意思的是以上提到的三人分别是三种文学流派的奠基人,并且这三种衍生文化不同程度地影响了bs系列 1855年,卡罗尔23岁,结识了自己任职学院的院长一家,一年后认识了三姐妹,随后的时间他时常和这家的三姐妹一起聚会,1962年7月4日,一个黄金的午后,当时三姐妹的长女罗丽娜13岁,次女10岁,三女8岁,与卡罗尔一起泛舟湖上,卡罗尔讲了一个日后成为梦游仙境原稿的故事,两年后整理成了一部名为地底冒险的手稿送给次女。 1863 年 6 月,利德尔一家和卡罗尔之间的关系突然破裂,没有直接证据能说明原因,几个月后有所缓和,但已经无法还原如初的美好了。 再之后,长女没有在历史上留下痕迹,次女和三女都和一位王子有过绯闻,但可能因为身份原因没有成,可怜的三女在即将结婚时22岁因病早逝(精神病院的开门次数),似乎最受上天关爱的次女于28岁结婚,成为哈格里夫斯夫人。 这是我们这个世界历史上的卡罗尔和三姐妹的故事。那么bs世界里这四人发生了什么呢?

最直接的证据是六段苦涩的回忆,虽然对他们的来龙去脉或是真假完全没有确论,但它们提供了大部分相关信息,我们按现实时间顺序一个一个说起。 卡罗尔川的回忆直接用了梦游仙境的卷首诗,描述了这个故事的原初,并且由于卡罗尔生活时期正是英国盛世,泰晤士河污染严重,黄金午后的那条河流从属于泰晤士河,和游戏中污染的描述也对得上 按现实顺序随后的应该是牛津学院的回忆,卡罗尔和利德尔一家的交恶 随后则是槌球场,这里应该对应现实中黄金午后的两年后,卡罗尔送给了爱丽丝地底冒险手稿,这部手稿有卡罗尔自己的插画,但并非圣诞礼物,卡罗尔曾和爱丽丝一家打槌球玩,因此会出现在槌球场,但游戏中此时二家似乎没有交恶,因此bs中可能存在顺序调换。 之后就是纯粹的架空时间线了 之后是叹息的海边,回忆中摄影的阁楼有现实对应,正是牛津大学的建筑,回忆描述了两人的再次重逢,至于为什么是海边,可能是因为卡罗尔在1876年出版的《猎蛇鲨记》,这是他最后一部知名作品,次女和卡罗尔的重逢历史上没有什么资料,事实上,即使卡罗尔逝世时,次女也就46岁,不可能是老婆婆,但梦游仙境的改编的戏剧于1886年圣诞节期间上映,卡罗尔也去看了,顺便一提,演睡鼠的是一位叫多萝西的女士。这是有记载的卡罗尔最后一次见到次女,而有记载的次女最后一次与卡罗尔有交集,是在1932年卡罗尔逝后的100年诞辰,这时她已经80岁了 再后面是库因兰德的回忆,库因兰德的女王原型是镜中奇遇的红女王,而镜中奇遇出版于1871年。这段回忆似乎提到卡罗尔把另一个人当做代餐,可能是bs世界观的罗丽娜? 最后是完全架空的茶会回忆,和现实基本没有关系了。 其次还有若干原著彩蛋在游戏中使用,如卷首诗,也就是第一段回忆的little和利德尔同音,血泪之池的鹦鹉和小鹰分别是长女和三女的书中化身,睡鼠的故事也化用了三姐妹的名字等

卡罗尔在bs中和现实基本对应得上,但还有的问题是,猎蛇鲨记,贾巴沃克等作品的来源没有交代,其中贾巴沃克这首诗尸龙基本给我们念了一遍,有可能原稿在她手上,此外卡罗尔虽然终身未婚,但依然有很多朋友,如猎蛇鲨记就受一位忘年交的启发,可能是冬之钟小剧场那张照片中的女人 顺便一提,现实中的弗朗西斯.利德尔1965年出生,自他记事起卡罗尔和利德尔一家应该都不怎么来往了,现实中的三姐妹和当时的大部分贵族女性一样在家中由私教授课,不可能叫卡罗尔老师

之后我们来分别探讨一下三姐妹在bs的暗线 现实中的长女资料最少,但书中的鹦鹉有卖弄自己年纪大的特点,并且有一种说法是,当年的长女对卡罗尔非常依恋,这些特点沿用到了游戏中,有可能bs中的卡罗尔倾吐虚假爱意的对象就是她。根据其自述,罗丽娜向邪神献祭灵魂才会来到不思议之国,但时间点未知,如果是在次女后,那么游戏中的罗丽娜是完全的少女心性就很奇怪了。还有一种说法是,罗丽娜和她的母亲名字一样,所以小剧场那张照片的真身有可能是……不过我觉得这可能很小就是了 心脏女王也是个谜点重重的角色,如果我们给有梦游仙境原型的誓约角色所需魂数量排序,那么由小到大依次是白兔,渡渡,比尔,希夏,公爵夫人与假海龟,帽子屋,心脏女王 其中除了假海龟都参照原作出场顺序,她虽然是乱入者,但不思议之国大部分住民都会提到并认同女王是名义上的统治者,她不知为何能指挥魔兽化的手下,让唯一有理智的格里菲去全国巡逻,每天用审判来控制人口,还给大工批了大把建筑费用来上达天听,不知道是奈亚的命令还是什么其他原因,她确实做了很多管理不思议之国的事,此外,还是唯一一个非格林子女却有里线战斗的 三女伊迪丝在游戏中是精神病院的boss,对于她怎么来到箱庭,仅有的线索是混沌迷宫和电影院的两段没头没尾的故事,游戏里和三女私奔的王子,很可能也是杰克,这位角色现实原型之一很可能是利奥波德王子,正如前文所说,据传他曾与伊迪丝相爱,伊迪丝22岁早夭后,王子为她抬棺,王子和伊迪丝一样病弱,患有血友病,三女辞世的8年后,王子以30岁的年龄逝世,这或许是游戏中他也住院的原因,另外两个明显原型是开膛手杰克和福尔摩斯,或许是因为卡罗尔曾被看做开膛手杰克的嫌疑人,而同时代柯南道尔也曾经研究过这个案件,顺便一提上文王子的一个侄子也是一大嫌疑人 伊迪丝在冬之钟小剧场里头戴着枯萎的花圈,可能暗示着她的早逝,并且多次有小鹰的元素出现,但罗丽娜除了大姐作风却没有明显的鹦鹉元素,这点也有些让人在意 最后是次女,这里的次女指的是观星引来奈亚的人类个体,关于这个个体的信息反而是最少的,只知道她和卡罗尔心心相惜却被拆散,她和现实次女的履历是否一样未知,她的最终去向未知,牛津学院的学寮长是否就是她父亲的灵魂所化也未知。 关于现实中的对应,现实的次女并非常见的金发形象而是黑发,并且和梦游仙境的爱丽丝有很多差异,游戏中似乎没怎么提到过发色,不知道如何设定,次女和南丁格尔是同时代的人,因此院长认识爱丽丝可能是认识人类状态的次女,此外,小剧场的次女会有很多致敬原著的台词,出示如下 在群星之夜后,似乎她的名字成为了禁忌,也是里线剧情的关键,关于次女我还有一个,, 等等,次女的名字,为什么,我想不起来次女的名字,对了,她的名字,她的名字不就是 爱丽丝.利德尔 勿呼其名,唤则得知,蠕动前行而来 縺ゥ縺?@縺ヲ遘√'谤「縺辅↑縺代l縺ー縺ェ繧峨↑縺??縺ァ縺呐° 繧「繝ェ繧ケ繧呈尔縺励※缧ゅい繝ェ繧ケ繧呈?縺励※缧ゅい繝ェ繧ケ繧贞ソ倥l縺ェ縺?〒缧 诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ 诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ诨帙@縺ヲ

ex01

相较梦游仙境,镜中奇遇在bs中的对应情节明显变少,但依旧有分析的价值 首先是镜中奇遇的卷首诗,这首诗提到了卡罗尔此时和现实的爱丽丝年龄相差一倍,语气中某种程度上可能透露了卡罗尔对无法回到往日时光的惋惜,不管怎么说,此时爱丽丝已经长大了,看童话故事的美好时光已经不会回来了 开篇剧情中爱丽丝在和戴娜生下的小猫玩,对应普通结局少女的房间中柴郡猫说自己产下小猫后死去,虽然我们不知道现实的戴娜是怎么死的。 随后爱丽丝会提到镜子屋,也就是镜子里的相反的房间,这在之后成为整本书的主题,在bs中镜子屋对应公爵夫人提到了通过血泪之池镜子才能到达的镜之国,但同样和镜子有莫大关系的还有一位小红帽,值得一提的是,镜之国库因兰德是为数不多没有柴郡猫出现的篝火。 随后爱丽丝在镜子屋看到了一些会说话的棋子,并随意摆布它们,这段有点像bs奈亚的作风 她翻到了一首叫贾巴沃克的诗,当然这里其实是卡罗尔引用之前的作品,贾巴沃克这首诗非常晦涩难懂,以后有机会我会谈谈在它在bs里的对应。 之后爱丽丝飞跃滑下楼梯,想跑去屋外的花园,这里的下楼梯法在冬之钟小剧场有对应

爱丽丝想走到一座小山丘俯视花园上,但怎么走都会回到原点,这 里可能对应精神病院的走法,也可能对应库因兰德的迷宫,于是她只能转而去往一个小花园,遇到了一群会说话的花,这些花对应一代圣森和不思议之国的会说话的花,以及在bs2中,红女王的房间里的花,一些花很吵闹,爱丽丝威胁把它们拔下来,对应道具咒骂之花, 随后爱丽丝遇到了红王后,原著中的红王后被卡罗尔描述为典型的家庭教师,原型可能就是爱丽丝的家教,bs中红女王的名字直接用了这位家教的名字,有一种说法是卡罗尔利用三姐妹来追求她造成两家决裂 爱丽丝羡慕地说想成为王后,红王后告诉她需要前进八格,然后拉着她全力奔跑,贡献了一句经典台词,前进八格成后这是国际象棋的规则,而红王后的台词在bs中对应库因兰德的一个留言和冬之钟柴郡猫的台词 值得一提的是在原著中有重要意义的棋盘在bs中也有同样的重要性,红女王的库因兰德遍布着棋子,梅贝尔在自己的箱庭部下棋局,而白女王则把王冠,也就是走了八步后成王的关键放在了冬之钟,可以推测原著中想要成后的爱丽丝其实对应着bs中想要得到改变权能而成王的格林。 红王后指引爱丽丝成后的走法,提到了需要乘火车,对应去库因兰德的火车 火车上爱丽丝遇到了一只会说话的虫子,在一阵颠簸后她们发现自己安静地坐在树下,爱丽丝和它讨论了一下命名学,虫子告诉爱丽丝前方有着无名之森,对应bs里的那张地图,这只虫子可能也对应无名之森的一只虫形怪物 无名之森里爱丽丝遇到了一只小鹿,对应bs中无名之森的小鹿,但bs中通过无名之森才能坐火车,与原著相反 本章的末尾,爱丽丝遇到了双子

ex02

爱丽丝接下来遇到的是崔德尔双子,二者一开始站立不动,让爱丽丝觉得他们是蜡人偶,也就是蜡像,游戏中反了过来,游戏中双子提到了站立不动的格林是蜡像的可能 两兄弟的原型是一首英国童谣,童谣提到了丢失的拨浪鼓和飞来筑巢的乌鸦,在游戏双子的台词有体现,筑巢的大鸟应该就是伊迪丝 随后两兄弟给爱丽丝背了首海象和木匠的诗,大意是海象和木匠偏小牡蛎来做客,然后把它们吃完了,游戏中很明显海象对应希伏契,木匠对应大工,吃牡蛎的剧情也在希伏契对话中有体现,且,双子誓约对话会提到两人 之后,爱丽丝发现了附近正在做梦的红王,在双子对话中有原意复用 双子中的蒂看到了他弄坏的拨浪鼓,让两兄弟起了矛盾,对应游戏中的台词,随后两人约定决斗,可能对应游戏里的双子相残,就在这时乌鸦飞了过来,打断了决斗 书中的两兄弟按棋谱来说是白方,这解释了她们为何与dlc3的克里米亚有一定关系

为了躲避大鸟,爱丽丝逃进树林遇到了白王后,与严肃的红王后不同,白王后非常随和友好,并且她声称自己是倒着过日子的,这解释了白女王诺登管理重启轮回的职能 交谈一会后,爱丽丝突然转移到了一间商店里,店主是一只绵羊,发生了很多怪事后爱丽丝又闪现到了小船上和绵羊一起划船,对应游戏里老羊的台词 书中这段空间转换非常频繁,可能因此寿司在老羊商店里放了一堆来源不明的谏言

一连串的转换后爱丽丝看到了矮胖子,这位角色也来自于一首英国民谣,矮胖子很多台词台词在游戏里有直接对应,整理如下 值得一提的是矮胖子解释了一些贾巴沃克诗的生造词,为后世的译者提供了不少信息。 在爱丽丝和它不欢而散后,听到了蛋壳碎裂的声音,暗示它的跌落,但游戏中矮胖子是因为孵化而裂开

爱丽丝再次前进,遇到了白国王和他的部下,信差告诉了他独角兽和狮子为了王冠争斗,这里的两只动物对应苏格兰和英格兰,并且依旧来源于一首民谣,游戏中冬之钟小剧场长女会引用,并且冬之钟也有很多争斗的对应情节,整理如下 独角兽傲慢,狮子凶恶,游戏中有一定程度上的体现,两者对应的棋子走法一个诡异难测,一个横冲直撞,也在游戏中对应

随后,爱丽丝遇到了前来将她军的红骑士,但埋伏在旁的白骑士反吃了红骑士,护送爱丽丝成王前的最后一段路,这段几乎没有在游戏里的直接对应,除了冬之钟小剧场he中卡罗尔让三姐妹为他挥手帕用了原台词,并且也有说法是白骑士是作者的投影。 但我个人对此有一些猜测,这段很可能对应整个冬之钟剧场,根据一些主流猜测,这段其实是梅贝尔和古兰合谋困住了追击的奈亚,如果我们认为红方是敌方,那么就对应奈亚,指引爱丽丝成王的红王后对应反水的红女王,红骑士表示前来追击的奈亚,白骑士就可能是白女王方的梅贝尔,那么这段剧情就成了,奈亚前来将住格林,梅贝尔前来解围,护送格林到了成王之路

终于,爱丽丝戴上了王冠,格林成了“王”,在此之后的剧情对应很少,青蛙佣人招待爱丽丝去了晚宴,对应游戏中去往古兰晚宴前向海因里希托付女儿,爱丽丝梦醒后红白王后成了黑白两只小猫,对应红女王的台词,可能会在续作有进一步的阐释

至此,对卡罗尔爱丽丝系列的作品就完全结束了,之后有机会可以说说贾巴沃克和猎蛇鲨记

]]>
+ 尸龙贾巴沃克
1
在天之繁星哟!命数已定之众哟!尽管去为爱所煎熬吧,为嫉妒之苦吧!呜呼!感激涕零吧!为这幸灾乐祸暗黑舞台点缀色彩就好!!!

象征着腐败与神秘的紫黑色,遍布全身的缝合痕迹与绷带,恶魔一样的卷曲角,晦暗如死尸的肤色,以及左眼燃烧着的灵魂之火(致敬黑岩射手可能性微存),尸龙姐姐的人物形象无时无刻不在传达着神秘强大而阴暗的气氛,本视频将对尸龙的整个人物进行解析 尸龙在爱丽丝镜中奇遇的原型是一首小诗,这首诗的大意是勇者手提沃伯尔之剑斩杀邪龙贾巴沃克,游戏中也承袭了这一设定,贾巴沃克一直都以死尸的形象登场 要解析这一角色,我们首先从最直接的行为说起,按游戏的时间线,尸龙姐姐大概做了以下这些事 1把童话(具体哪本未知,根据混沌迷宫的狼外婆信息推测可能是小红帽)给了渴望母爱的玛丽.苏,从而激发了虫虫的创作能力,导致她创造出一代的箱庭。顺便一提,关于尸龙玛丽苏的关系,游戏里没有直接证据支持姐妹说,混沌迷宫提到黑山羊有两个子嗣,米兰达认为尸龙有黑山羊的气息,且明显尸龙玛丽苏有一定关系,这些是确定的,但并未明说姐妹,有人从克苏鲁的设定中寻找论据,但本人对克系了解不多在此不评价。 2红偶像约会中电影《三人的茶会》提及茶会时期的三人曾经打倒过贾巴沃奇,不知是否和尸龙有关,此外尸龙也曾被昔日的勇者,如今的猎头兔打倒,自称在之后洗心革面,但相关资料太少,我们不知道是不是她放水或另有隐情 3格林被引导进玛丽苏的箱庭开始一代的故事,此时尸龙(不知道玛丽苏是否知情)已经乱入到一代的不思议之国,为格林一行人提供帮助,通关d结局后找她对话,她会直接把二代给剧透了,不过由于时间线上d结局应该直接接上二代,所以“正史”上可能没有这件事,顺便一提,一代的不思议之国是爱丽丝的箱庭,或者说玛丽苏的仿造品,也没有定论,所以很难推测尸龙是入侵还是本来就在那里 4来到二代时间线,由于不思议之国是奈亚的箱庭,而黑山羊则是奈亚的“配偶”,所以尸龙出现在这倒是理所应当,此时的尸龙以四噩梦之一的身份登场,,但工作内容则是在卡罗尔川上堆雪人,以及在格林面前装出温柔大姐姐的形象,十足的关系户做派。 里路线中,格林和米兰达等人可以先后对战三噩梦,以及杀死其余两个噩梦后现出真身的尸龙,值得一提的是这似乎是她全系列中唯一一次全力出手,并且在此战中死亡,但考虑到支配者的特性,是否死透了依旧存疑 以上就是尸龙在系列中的行动,接下来我将对这些行动的目的与尸龙的性格进行归纳。 尸龙首先是一个安静的观察者,一代中她只是在一棵树下扮尸体,二代则在河边堆雪人,如果格林不找她,在里线之前不会和她有任何交集,然而,隐藏和善表面下的真相是尸龙其实是个性格扭曲唯恐天下不乱的乐子人,是她启发了玛丽苏创造自己的黑童话箱庭,间接引发之后所有的故事,而一开始的目的可能只是以玛丽苏面对求而不得的母爱痛苦挣扎的样子为乐,也是她诅咒了狩猎邪龙的英雄,使兔子一族成为贪食尸体的魔兽,其中被沃波尔斩下头颅可能是她行事风格的分界线,其自述死前曾是无恶不作的邪龙,在复活后变得收敛,但其实依旧不改邪龙本质,只是变得只在关键时刻推波助澜 而将这两种性格统一起来的则是她的创作欲,没错,和玛丽苏一样,尸龙对创作也有自己的执念,在玛丽苏涌现起黑暗的创作力之后,尸龙意识到,玛丽苏那邪恶的灵魂一定程度其实是自己的作品,如果说玛丽苏是支配者中第一个创造故事的人,尸龙就是第一个“创作者”,这激发出她内心最深层的欲望,那就是创作出足够黑暗污秽的灵魂,方法则是让一个灵魂在无尽的痛苦与求而不得中循环。 可以说在这点上尸龙和奈亚有一定的共同点,就是让格林经历无数次的痛苦循环,但二者还是有着分歧,奈亚想要的是格林求而不得的爱,尸龙则想要格林本就污秽的灵魂更加黑暗。 这时我们就可以理解尸龙的行为了,由于里线实际上也处于轮回之中,所以对尸龙来说,告诉格林一些真相只会让他的反抗更加激烈,也会在反抗之后更加绝望,这样才符合她的目的。 而以上依旧是贾巴沃克的表层性格,而她隐藏最深的性格则是扭曲的独占欲,在卡罗尔川的地牢中有个四个雪人,分别是玛丽苏,小红帽,爱丽丝和格林,此外,班达斯奈奇的住处也有着一个写着想将其变为收藏品的雪人(sen0才能看到真相),可见尸龙内心最深的欲望其实是独占欲,培育最污秽的灵魂,随后将其收藏起来,这才是尸龙的愿景,但她为何要隐藏这一欲望呢,在qf尸龙失败的逆监禁剧情里,由于尸龙发现格林的灵魂已经黑暗到想要独占自己,尸龙就会唯一一次直接暴露自己的独占欲来收割这个丰硕的成果,然而,奈亚或者其他支配者绝不会容忍这种行为,所以一旦尸龙试图独占格林就会立刻被排除出世界,这就是尸龙一直压抑着独占欲的原因。 此外,根据dlc3入口处的对话以及数量庞大的雪人,或许可以猜测尸龙曾经一边观察一边玩弄过很多灵魂,但这些灵魂最后都因为经历过多的痛苦和绝望后变得麻木,因此才会对有着无穷成长性的格林视若珍宝 一切温柔的言语都不过是为了将格林引导向更绝望的结局,独占污秽的黑之魂,玩到腻后就扔掉,对贾巴沃克之魂的描述为包藏在虚伪的母性之下的独占欲之影可谓恰如其分。 值得一提的是,独占欲这种感情不止在尸龙一人上出现,大部分支配者都有着这种感情,如白之女王诺登就承认自己多次有独占格林的想法,爱丽丝01也曾吐露自己害怕不可控制地想要独占格林,但她们与尸龙的区别则是,她们能够理解人类的爱,并为了人类的幸福选择放手,与红白女王的对比或许也是尸龙人物形象设计的一个目的 现在可以做一个总结了,尸龙姐姐是一个对格林有着强烈爱意的角色,她的母性是虚伪的,但这种爱意却不是,尽管她扭曲,残酷,自私,虚伪,但是她始终知道自己要做什么并理性地付出行动,即使失败了也不失风度从容自若,相较于虫虫几乎写在脸上的扭曲性格,直截了当的作恶行径,以及一有挫败就大呼小叫的行径,尸龙的感情更加内敛,行事也更加隐秘,但可谓是个很有恶人魅力的反派角色 同时,由于bs的碎片化叙事并且尚未完结,关于尸龙依旧有很多谜团,例如她和玛丽苏以及其他支配者的具体关系,里线中她是不是仍然在演戏,她究竟为何会给玛丽苏童话书,尸龙等三噩梦和三个爱丽丝的关系等等,就期待续作的解答了 大家都来和尸龙姐姐做朋友吧,尸门

玛丽苏

玛丽苏,作为bs中自称的女主角,是bs唯二个三代都有出场(包括红森)的支配者,还有一个是贾巴沃克),在此过程中做过的好事可谓数不胜数,罄竹难书,我们来按着时间线整理一下 1一开始的玛丽苏是个渴望母爱的孩子,尽管我们不知道bs设定下一开始的支配者到底会不会有类似人类的亲情,她掌管自己的世界,倾听子民的祈祷,开始感到厌烦,这时贾巴沃克不知出于什么目的,送了她一本童话书,这本书,我们不知道是哪个童话,但本人猜测很可能这本书的作者是玛丽苏第一个抓住的,并在黑之魂的融合中有重要地位,根据青鸟的文本,卡罗尔并不是第一个抓住的素材,所以基本可以排除梦游仙境,结合男主角格林的名字和混沌迷宫的狼外婆,我个人猜测是小红帽,她开始渴望创作自己的故事来打动母亲,至少一开始是这样,她派遣属下四处收集童话作者的灵魂作为素材,同时肆意进行同人创作。 2玛丽苏的处女作是小红帽,也是她第二得意的作品,根据一些信息,小红帽的灵魂可能以现实世界的一个女学生为素材,在魔改剧情的同时,她还给了小红帽注定20岁早逝的设定,并可能赋予了小红帽通过镜子穿梭位面之类的特殊能力来担任女主角,但不知道为什么她又不满意,想做一个男主角出来,但她对小红帽的善后却颇有些问题,小红帽不仅杀穿了红森,而且还能意识到她这个黑幕的存在。 3缝合了众多童话作家灵魂的格林诞生了,并被赋予了给周围的女主角带来不幸的设定,格林污秽的黑之魂有成为支配者的潜质,玛丽苏甚至还大胆地保留了他的部分创作能力,因为最关键的改变权能在她手上,为什么叫做格林则未知,可能是最初的童话书就是格林童话的一本,这之后格林不知道为什么,以什么身份在一个叫不思议之国的地方和叫爱丽丝和祈祷主的存在开起了茶会,随后格林与爱丽丝01相恋,嫉妒的祈祷主呼唤了玛丽苏,导致格林被带走了,连同格林不知何时创造出的故事们也被篡改 4基于以上提到的各种童话故事素材,玛丽苏魔改出了失落帝国的箱庭,把格林放进去经历一次次绝望故事的轮回,自己则担任女主角欣赏故事,还设计把母亲叫了进来欣赏自己的大作。不知多少次循环后,这个大好局面被打破了,母亲黑山羊为了逃离这个世界和她战斗,连圣森都磨灭了,战胜母亲后,奈亚丽丝前来捡漏带走格林进行新一轮追寻爱的游戏,本来想顺带着把玛丽苏也灭了,但在诺登的劝阻以及可能的其他考量下放过了她 5奈亚,红女王,白女王中的某位或若干位剥夺了她的改变权能,把她囚禁在库因兰德,失去权能的她改名为玛丽安,但不知何时也不知何人前来探访了她,到格林试图从梦中醒来的里线,玛丽安乘乱逃出,由于正史上不太可能发生f结局,所以此时应该是g结局,也有可能正史上g结局有少许与游戏不同,不管怎么说此时的玛丽安应该被格林小红帽两人打败,但h结局中可以看到她没有死,而且不知道怎么逃了出来 可以说,bs中的一切悲剧,玛丽苏至少有五成功劳,接下来让我们来分析一下玛丽苏的角色特质。 首先,最直接的一点,玛丽苏是个典型的支配者,高高在上地支配着人类这样的低等种族,但玛丽苏特殊之处在于,她可能是最能理解人类感情的支配者之一,首先我们就可以看到她居然渴望所谓的母爱,而根据2代大部分支配者的表现,即使因融入皮套逐渐有了感情,也没有第二个有亲情这种非常类似人类感情的支配者,此外,她还以玩弄人类的灵魂为乐,当然有这种兴趣的支配者恐怕不少,但这股风气可以说是玛丽苏带起来的,也是她最先玩出各种花样。 因此可以引出玛丽苏的第二个特点了,她是很像人类的一个支配者,尽管理解非常片面,但她确实懂得并拥有不少人性,而她为什么这么喜欢玩弄人类呢?这也很容易理解,一般来说越通人性的动物越被人类亲近,逗猫逗狗远远比逗蚂蚁有意思,因为这些宠物的智力和人类更接近,人类可以很容易地理解它们在想什么,然后在逗弄它们的过程中获得一种智力上的优越感,以及一种“支配感”,这恐怕就是玛丽苏看到自己编排的好戏上演的感觉。 这点可以说是我们对玛丽苏进行解析的基石,毕竟任何角色首先都是人的投影,而人性越丰富,就有越多的性格侧面。 玛丽苏第三个特点就是由此衍生的纯粹性,当然,此处并不是说纯洁善良云云,而是某种意义上的纯粹之恶,很多支配者在扮演人类后都会被皮套影响而恐慌或纠结,但玛丽苏却没有这种烦恼,她以融入人类扮演人类为乐(小精灵也算类人种族),她作为支配者的漆黑本性和人性之恶完美地兼容了,不会有徘徊二者之间的身份认同问题,而她大部分所作所为也就是为了践行人性之恶,什么是恶呢,比较狭隘的解释就是为了为了自己的利益或者取乐而伤害他人,而玛丽苏的邪恶就很纯粹,就是为了取乐,甚至有损自己利益也要作恶,如果解救了被囚禁的玛丽苏,此时她会自认为东山再起,但她想的不是第一时间抹杀已经成长了的格林或者藏起来,而是想再让格林经历一次悲惨的故事,可以说她作恶的动机相当纯粹,也相当执着。 在此之上的第四个特点,就是她的创作者身份,很多支配者都会赞扬她的创作能力,连奈亚构建的不思议之国都有不少玛丽苏箱庭的影子,但这种创造力也只是对于支配者来说了,如果我们用人类的视角看如何呢?寿司在访谈时轻蔑地说到“她说到底也只是玛丽苏,也只能整点二次创作了”可以说道出了玛丽苏所谓创作的本质,说到底,玛丽苏就是那种典型的黑深残小鬼,把一个可能有很多种解释的作品曲解为单一的猎奇世界观,当然不是说这样不行,如果原创一个黑深残世界观自娱自乐当然是可以接受的,但玛丽苏的行为就是最恶劣的一种同人女行为,魔改原来的作品,把自己做成角色代入进去搞cp,还要把所有其他角色踩一遍,情节和人物关系只要对自己代入的角色有利就行,然后把这部除了自己看谁也不会喜欢的同人拿给原作者看,我就不详细说这种行为的恶劣程度了,但这种作品折射出来的创作观我必须要辩驳一下。 当然,本视频所有讨论只局限于二次元文化内, 荒木飞吕彦认为漫画有四要素,角色、剧情、世界观、主题,我们就用这四个维度来剖析玛丽苏的所谓创作。 首先是角色,直接创作一个鲜活的灵魂对强大的支配者来说也是一件难事,所以对于角色的选取,玛丽苏很可能都是使用现实存在的灵魂然后再魔改来适配进童话或者传说的人物,因此她笔下所谓角色虽然很多但其实并不是她自己的功劳,而她为了把这些灵魂塞进角色对设定随意删改,把小红帽的外婆和母亲缝成了一笔烂账,人物关系更是一团乱麻,怎么方便怎么来,角色设定连基本的自洽也做不到,水平着实不敢恭维 随后是世界观,失落帝国这个箱庭本质上来说就是个童话故事的缝合体,没有历史演化,没有详细设定,这并不是一个鲜活的世界观,只不过是一个临时搭建的舞台而已,当然,很多线性的故事并不需要一个多详尽的世界观,在这点上玛丽苏只能说无功无过 最后是剧情和主题,玛丽苏的主题是简单粗暴的黑深残,剧情则是当常规的rpg剧本演到最后的happy end时毫无铺垫伏笔地急转直下变成bad end,当然,能设置这么大规模的箱庭,还写了不少支线剧情,证明玛丽苏确实是有一些笔力的,但首先,她的角色基本靠抓人,故事则都有童话原型,故事演变她只需要把握大方向,其他可以让角色自己来,而最后没有任何铺垫的bad end依旧表明了她创作的失败,如果一个设定没有任何铺垫和暗示,直到使用时才抛出,那只能证明这部作品情节编排的失败,因为一部作品的生命周期不是作者创作出来就结束了的,而要等到读者看完理解了故事才会结束,这个过程作者读者应该处于相对公平的地位,根据故事的设定,人物有充分的理由这样行动,这样才能让读者认同这个故事,而玛丽苏却完全相反,滥用作者的权能让故事不仅没有逻辑,还自相矛盾,很明显,对玛丽苏来说她是作者也自认为是唯一的读者,那些被抓走被改造的灵魂不过是用完即扔的工具罢了,不需要自圆其说,只要自己看得高兴就行了,或许就支配者的立场来说她不过是自娱自乐罢了,但对人类(至少灵魂上是人类),以及同样作为创作者的格林来说,首先就绝不可能认同这种恶行,更不可能认同自己的作品被改成这样的烂作 说到这里,就可以讨论一下玛丽苏对于格林的看法了,直观地说,是玛丽苏创造了名为格林的污秽黑之魂,但其实在最初,是格林等童话作家激发了玛丽苏的创作欲,因此,事实上,两者是相互创造的关系,玛丽苏创造格林的目的,首先是为了成为她作品的男主角,让她能够代入女主角的位置欣赏这个故事,这样说来似乎格林除了男主角的身份和其他角色也没什么本质的不同。但格林还有一点对玛丽苏有着重大意义,就是他童话作家灵魂集合体的身份,即使自我中心如玛丽苏这种存在,也会有对别人欣赏自己作品的渴望,因此玛丽苏特地设置了一个c结局,用演戏的形式让格林得以了解她的整个创作生涯,至于目的,除了单纯的表现欲和欣赏格林的痛苦以外,恐怕也有一丝希望作为原作者的格林认同自己的心情,哪怕是厌恶,玛丽苏也想得到一些对创作的反馈,而格林是唯一能在创作这个领域和她有一些共鸣的人,作者,读者,男主角,格林三位一体的身份对玛丽苏来说,可以说是难得的知己,尽管这种关系非常扭曲,但不能否认,在这点上玛丽苏作为创作者的心情是有些真心的。而玛丽苏会渴望认同这点,一开始是希望得到母爱,但在得到格林这个玩具之后,玛丽苏就一点也不在意黑山羊的死活了,这也是佐证。 最后不得不提的是,玛丽苏的特殊性质,很大程度上她是寿司这个作者的投影,我个人觉得玛丽苏这个角色有不少表达寿司自己创作观的成分,这也解释了寿司为何这么偏爱她当然,一部好的作品,任何角色都是基于自己的设定和世界观行动,不可能因为是作者的投影就有特别待遇,所以可以说,玛丽苏虽然很大程度上是寿司的投影,但投影的目的其实是对比,玛丽苏的创作肤浅,笔下的故事只是无聊的黑深残,但寿司却喜欢在绝望时写一些希望,在希望中铺设绝望,最后的反转再怎么说都是有因可循,单论创作的层次来说就高出绿虫子太多了,当然,我也不是在吹寿司笔力多高,因为高出玛丽苏这个水平的创作者多如牛毛。 寿司设置玛丽苏这个角色,其实是使用了一种嵌套的结构来讲故事,首层是童话的原作,这些是毋庸置疑的好故事,随后是虫子和奈亚魔改出的箱庭,是烂故事的典型,最后一层寿司想讲的重点其实是格林怎么察觉真相,挣脱出烂故事的循环,书写自己的结局的故事,在这三层中,第一层玛丽苏是读者,格林等人是作者,只出现在设定层面,第二层玛丽苏是一半作者一半角色,格林是一半读者一半角色,体现在abc结局,最后一层中寿司是唯一的作者,玛丽苏和格林就都是角色了,体现在d结局以及之后的二代,这种层层演变虽然有些炫技,但确实非常有意思。 就玛丽苏这个角色而言,整个泛二次元文化里她这样的反派也不常见,究其原因,则是因为一个有能力玩弄主角取乐的boss必然会导致战力失衡,冲突不起来,让读者感到憋屈,因此想要打败这种boss要么机械降神唯心爆发,比如一代c结局(虽然是演的),要么引入新的boss和同伴体系取代她如d结局,也因此,虽然我个人很喜欢一代,但一代的真结局d结局远没有2代h结局震撼 来做个总结吧,玛丽苏无疑是个纯粹邪恶的支配者,一个烂到骨子里的创作者,她作为创作者无疑是失败的,但作为bs这个故事里的角色反而是很成功的,不仅纯粹有特点,还有很多角色侧面可以挖掘,寿司巧妙地利用她读者,创作者和角色的三重身份来塑造她的多面性,颇有荒木在漫画术中写的“在作恶道路上高歌猛进”的成功反派角色风格。

]]>
- <h1 id="section">01</h1> -<p>众所周知,black souls的原型,或者说最重要的灵感来源就是爱丽丝梦游仙境以及它衍生的爱丽丝镜中奇遇,我本人一直对游戏和原著的对应关系感到很好奇,但由于工作量很大,一直没下定决心做这件事,但最近突然想到,如果分期做一些整理会不会就没那么麻烦了呢,于是决定开启这个系列。 + <h1 id="尸龙贾巴沃克">尸龙贾巴沃克</h1> +<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">在天之繁星哟!命数已定之众哟!尽管去为爱所煎熬吧,为嫉妒之苦吧!呜呼!感激涕零吧!为这幸灾乐祸暗黑舞台点缀色彩就好!!!</span><br></pre></td></tr></table></figure> +<p>象征着腐败与神秘的紫黑色,遍布全身的缝合痕迹与绷带,恶魔一样的卷曲角,晦暗如死尸的肤色,以及左眼燃烧着的灵魂之火(致敬黑岩射手可能性微存),<code>尸龙</code>姐姐的人物形象无时无刻不在传达着神秘强大而阴暗的气氛,本视频将对<code>尸龙</code>的整个人物进行解析 diff --git "a/categories/\346\270\270\346\210\217\346\235\202\350\260\210/black-souls/index.html" "b/categories/\346\270\270\346\210\217\346\235\202\350\260\210/black-souls/index.html" index 33bc5dba4..3581c9dde 100644 --- "a/categories/\346\270\270\346\210\217\346\235\202\350\260\210/black-souls/index.html" +++ "b/categories/\346\270\270\346\210\217\346\235\202\350\260\210/black-souls/index.html" @@ -259,8 +259,8 @@

black souls
-
@@ -279,8 +279,8 @@

black souls
-
@@ -299,8 +299,8 @@

black souls
-
diff --git "a/categories/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" "b/categories/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" index 60d971758..3e8eb2a0c 100644 --- "a/categories/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" +++ "b/categories/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" @@ -399,8 +399,8 @@

游戏杂谈
-
@@ -419,8 +419,8 @@

游戏杂谈
-
@@ -439,8 +439,8 @@

游戏杂谈
-
diff --git a/page/2/index.html b/page/2/index.html index e6caf0219..4dc5d02e1 100644 --- a/page/2/index.html +++ b/page/2/index.html @@ -363,7 +363,7 @@

算法性质

- +

- +

@@ -442,12 +442,12 @@

-

shell脚本

-

Shell 脚本通常以 shebang 行开头:#!path/to/interpreter。

-

#!是一个人类可读的 幻数表示 0x23 0x21它可以告诉 shell 将文件其余部分的执行传递给 指定翻译。 如果您的脚本作为可执行文件运行(例如 ./awesome_shell_script) 加上 shebang 行,那么 shell 将调用 可执行文件(通常是解释器)位于 path/to/interpreter运行你的 脚本。 如果您的脚本作为参数传递给解释器,例如 bash awesome_shell_script,那么 shebang 没有效果并且 bash会处理 脚本的执行。 +

Numpy 是 Python 中科学计算的核心库。 它提供了高性能的多维数组对象以及使用这些对象的工具 数组。

+

数组

+

numpy 数组是一个值网格,所有值都具有相同的类型,并由非负整数组成的元组索引。 它的维度就是数组的秩 ;它的shape就是每个维度的大小组成的元组

- + 阅读全文 »
@@ -478,7 +478,7 @@

shell脚本

- +

- +

@@ -557,12 +557,12 @@

-

Numpy 是 Python 中科学计算的核心库。 它提供了高性能的多维数组对象以及使用这些对象的工具 数组。

-

数组

-

numpy 数组是一个值网格,所有值都具有相同的类型,并由非负整数组成的元组索引。 它的维度就是数组的秩 ;它的shape就是每个维度的大小组成的元组 +

shell脚本

+

Shell 脚本通常以 shebang 行开头:#!path/to/interpreter。

+

#!是一个人类可读的 幻数表示 0x23 0x21它可以告诉 shell 将文件其余部分的执行传递给 指定翻译。 如果您的脚本作为可执行文件运行(例如 ./awesome_shell_script) 加上 shebang 行,那么 shell 将调用 可执行文件(通常是解释器)位于 path/to/interpreter运行你的 脚本。 如果您的脚本作为参数传递给解释器,例如 bash awesome_shell_script,那么 shebang 没有效果并且 bash会处理 脚本的执行。

- + 阅读全文 »
@@ -936,7 +936,7 @@

- +

-
diff --git "a/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" "b/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" index 81a37695e..69c513e0d 100644 --- "a/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" +++ "b/tags/\346\270\270\346\210\217\346\235\202\350\260\210/index.html" @@ -399,8 +399,8 @@

游戏杂谈

-
@@ -419,8 +419,8 @@

游戏杂谈
-
@@ -439,8 +439,8 @@

游戏杂谈
-