diff --git a/src/ch00-00-introduction.md b/src/ch00-00-introduction.md
index 8fba530..e23ba86 100644
--- a/src/ch00-00-introduction.md
+++ b/src/ch00-00-introduction.md
@@ -1,8 +1,8 @@
# 介绍
-> [ch00-00-introduction.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch00-00-introduction.md)
+> [ch00-00-introduction.md](https://github.com/rust-lang/book/blob/master/src/ch00-00-introduction.md)
>
-> commit 7480e811ab5ad8d53a5b854d9b0c7a5a4f58499f
+> commit 0aa307c7d79d2cbf83cdf5d47780b2904e9cb03f
> 注意:本书的版本与出版的 [The Rust Programming Language][nsprust]
> 和电子版的 [No Starch Press][nsp] 一致
@@ -10,9 +10,7 @@
[nsprust]: https://nostarch.com/rust
[nsp]: https://nostarch.com/
-欢迎阅读 “Rust 程序设计语言”,一本介绍 Rust 的书。
-
-Rust 程序设计语言能帮你编写出更快、更可靠的软件。在其他编程语言设计中,高层工程学和底层控制往往不能兼得;Rust 则试图挑战该现象。通过权衡强大的技术能力与优秀的开发体验,Rust 允许你控制底层细节(比如内存使用),并免受过去做此类控制所经历的烦恼。
+欢迎阅读 “Rust 程序设计语言”,一本介绍 Rust 的书。Rust 程序设计语言能帮助你编写更快、更可靠的软件。在编程语言设计中,高层工程学和底层控制往往不能兼得;Rust 则试图挑战这一矛盾。通过权衡强大的技术能力与优秀的开发体验,Rust 允许你控制底层细节(比如内存使用),并免受以往进行此类控制所经受的所有烦恼。
## 谁会使用 Rust
@@ -20,11 +18,11 @@ Rust 因多种原因适用于很多开发者。让我们讨论几个最重要的
### 开发者团队
-Rust 被证明是可用于大型的、拥有不同层次系统编程知识的开发者团队间协作的高效工具。底层代码中容易出现大量隐晦的 bug,在其他编程语言中,只能通过大量的测试和经验丰富的开发者细心的代码评审来捕获。在 Rust 中,编译器充当了守门员的角色,它拒绝编译存在隐晦 bug 的代码,包括并发 bug。通过与编译器合作,团队将更多的时间聚焦在程序逻辑上,而不是追踪 bug。
+Rust 被证明是可用于大型的、拥有不同层次系统编程知识的开发者团队间协作的高效工具。底层代码中容易出现种种隐晦的 bug,在其他编程语言中,只能通过大量的测试和经验丰富的开发者细心的代码评审来捕获它们。在 Rust 中,编译器充当了守门员的角色,它拒绝编译存在这些难以捕获的 bug 的代码,这其中包括并发 bug。通过与编译器合作,团队将更多的时间聚焦在程序逻辑上,而不是追踪 bug。
-Rust 也将当前的开发工具带到了系统编程世界:
+Rust 也为系统编程世界带来了现代化的开发工具:
-* Cargo,内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并在 Rust 生态系统中保持一致。
+* Cargo,内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使其在 Rust 生态系统中保持一致。
* Rustfmt 确保开发者遵循一致的代码风格。
* Rust Language Server 为集成开发环境(IDE)提供了强大的代码补全和内联错误信息功能。
@@ -32,7 +30,7 @@ Rust 也将当前的开发工具带到了系统编程世界:
### 学生
-Rust 适用于学生或任何对操作系统概念感兴趣的人。通过 Rust,很多人已经了解操作系统开发这样的主题。社区非常欢迎并乐于解答学生们的问题。通过类似于本书这样的努力,Rust 团队希望更多人了解操作系统的概念,特别是编程新手。
+Rust 适用于学生和任何对学习操作系统概念感兴趣的人。通过 Rust,很多人已经了解了像操作系统开发这样的主题。社区非常欢迎并乐于解答学生们的问题。通过类似于本书这样的努力,Rust 团队希望更多人了解操作系统的概念,特别是编程新手。
### 公司
@@ -44,47 +42,58 @@ Rust 适用于希望构建 Rust 编程语言、社区、开发工具和库的开
### 重视速度和稳定性的开发者
-Rust 适用于追求编程语言的速度与稳定性的开发者。所谓速度,我们指你用 Rust 开发出的程序运行速度,以及 Rust 提供的程序开发速度。Rust 的编译器检查确保了增加功能和重构代码时的稳定性。这与缺少这些检查的语言形成鲜明对比,开发者通常害怕修改那些脆弱的遗留代码。通过力求零开销抽象(zero-cost abstractions),高层级的特性被编译为底层代码,与手写的一样快,Rust 致力于使安全的代码也同样快速。
+Rust 适用于追求编程语言的速度与稳定性的开发者。所谓速度,是指你用 Rust 开发出的程序运行速度,以及 Rust 提供的程序开发速度。Rust 的编译器检查确保了增加功能和重构代码时的稳定性。这与缺少这些检查的语言形成鲜明对比,开发者通常害怕修改那些脆弱的遗留代码。通过力求零开销抽象(zero-cost abstractions),高层级的特性被编译为与手写一样快的底层代码,Rust 致力于使安全的代码也同样快速。
-Rust 语言希望能支持更多用户,这里提及的只是最大的利益相关者。总的来讲,Rust 最重要的目标是消除数十年来程序员不得不做的权衡:安全 **与** 生产力、速度 **与** 工程学。请尝试 Rust,看看它的选择是否适合你。
+Rust 语言也希望能支持很多其他用户,这里提及的只是最大的利益相关者。总的来讲,Rust 最重要的目标是消除数十年来程序员不得不做的权衡:安全 **与** 生产力、速度 **与** 工程学。请尝试 Rust,看看这个选择是否适合你。
-## 谁会阅读本书
+## 本书是写给谁的
本书假设你已经使用其他编程语言编写过代码,但并不假设你使用的是何种语言。我们尝试使这些材料能广泛的适用于来自很多不同编程背景的开发者。我们不会花费很多时间讨论编程 **是** 什么或者如何理解它。如果编程对于你来说是完全陌生的,你最好先阅读专门介绍编程的书籍。
## 如何阅读本书
-总体来说,本书假设你会从头到尾顺序阅读。稍后的章节建立在之前章节概念的基础上,同时之前的章节可能不会深入讨论一个主题的细节;通常稍后的章节会重新讨论这些主题。
+总体来说,本书假设你会从头到尾顺序阅读。稍后的章节建立在之前章节概念的基础上,同时之前的章节可能不会深入讨论某个主题的细节;通常稍后的章节会重新讨论这些主题。
你会在本书中发现两类章节:概念章节和项目章节。在概念章节中,我们学习 Rust 的某个方面。在项目章节中,我们应用目前所学的知识一同构建小的程序。第二、十二和二十章是项目章节;其余都是概念章节。
-第一章介绍如何安装 Rust,如何编写 Hello world 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是 Rust 语言的实战介绍。我们会介绍一些高层级的概念,在稍后章节会详细介绍。如果你希望立刻就动手实践一下,第二章正好适合你。开始阅读时,你甚至可能希望略过第三章,它介绍了 Rust 中类似其他编程语言中的功能,并直接阅读第四章学习 Rust 的所有权系统。然而,如果你是特别重视细节的学习者,并倾向于在继续之前学习每一个细节,你可能希望略过第二章并直接阅读第三章,并在想要构建项目来实践这些细节时再回来阅读第二章。
+第一章介绍如何安装 Rust,如何编写 Hello, world! 程序,以及如何使用 Rust 的包管理器和构建工具 Cargo。第二章是 Rust 语言的实战介绍。我们会站在较高的层次介绍一些的概念,在稍后的章节种会做详细介绍。如果你希望立刻就动手实践一下,第二章正好适合你。开始阅读时,你甚至可能希望略过第三章,它介绍了 Rust 中类似其他编程语言中的功能,并直接阅读第四章学习 Rust 的所有权系统。然而,如果你是特别重视细节的学习者,并倾向于在继续之前学习每一个细节,你可能希望略过第二章并直接阅读第三章,并在想要构建项目来实践这些细节时再回来阅读第二章。
第五章讨论结构体和方法,第六章介绍枚举、`match` 表达式和 `if let` 控制流结构。在 Rust 中,你将使用结构体和枚举创建自定义类型。
-第七章,你会学习 Rust 的模块系统和私有性规则来组织代码和公有应用程序设计接口(Application Programming Interface, API)。第八章讨论了一些标准库提供的通用集合数据结构,比如 vector、字符串和哈希 map。第九章探索了 Rust 的错误处理哲学和技术。
+第七章,你会学习 Rust 的模块系统和私有性规则来组织代码和公有应用程序接口(Application Programming Interface, API)。第八章讨论了一些标准库提供的通用集合数据结构,比如 vector、字符串和哈希 map。第九章探索了 Rust 的错误处理哲学和技术。
-第十章深入介绍泛型、trait 和生命周期,他们提供了定义出适用于多种类型的代码的能力。第十一章介绍测试,即使 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章,我们构建了属于自己的在文件中搜索文本的命令行工具 `grep` 的子集功能实现。为此会利用之前章节讨论的很多概念。
+第十章深入介绍泛型、trait 和生命周期,他们提供了定义出适用于多种类型的代码的能力。第十一章全部关于测试,即使 Rust 有安全保证,也需要测试确保程序逻辑正确。第十二章,我们构建了属于自己的在文件中搜索文本的命令行工具 `grep` 的子集功能实现。为此会利用之前章节讨论的很多概念。
第十三章探索了闭包和迭代器:Rust 中来自函数式编程语言的功能。第十四章会更深层次的理解 Cargo 并讨论向他人分享库的最佳实践。第十五章讨论标准库提供的智能指针以及启用这些功能的 trait。
第十六章会学习不同的并发编程模型,并讨论 Rust 如何助你无畏的编写多线程程序。第十七章着眼于比较 Rust 风格与你可能熟悉的面向对象编程原则。
-第十八章是一个模式与模式匹配的参考章节,他们是在整个 Rust 程序中表达意图的强大方式。第十九章是一个高级主题大杂烩,包括 unsafe Rust 和更多关于生命周期、 trait、类型、函数和闭包的内容。
+第十八章是一个模式与模式匹配的参考章节,他们是在整个 Rust 程序中表达意图的强大方式。第十九章是一个高级主题大杂烩,包括 unsafe Rust、宏和更多关于生命周期、 trait、类型、函数和闭包的内容。
+
+第二十章将会完成一个项目,我们会实现一个底层的、多线程的 web server!
+
+最后是一些附录,包含了一些关于语言的参考风格格式的实用信息。附录 A 介绍了 Rust 的关键字。附录 B 介绍 Rust 的运算符和符号。附录 C 介绍标准库提供的派生 trait。附录 D 涉及了一些有用的开发工具,附录 E 介绍了 Rust 的不同版本。
+
+怎样阅读本书都不会有任何问题:如果你希望略过一些内容,请继续!如果你发现疑惑可能会再跳回之前的章节。请随意阅读。
-第二十章会完成一个项目,实现了一个底层的、多线程的 web server!
+
-最后是一些附录,包含了一些关于语言的参考风格格式的实用信息。附录 A 介绍了 Rust 的关键字。附录 B 介绍 Rust 的运算符和符号。附录 C 介绍标准库提供的派生 trait。附录 D 介绍宏。
+学习 Rust 的过程中一个重要的部分是学习如何阅读编译器提供的错误信息:它们会指导你编写出能工作的代码。为此,我们会提供很多不能编译的示例代码,以及各个情况下编译器会展示的错误信息。请注意如果随便输入并运行随机的示例代码,它们可能无法编译!请确保阅读任何你尝试运行的示例周围的内容,检视他们是否有意写错。Ferris 也会帮助你区别那些有意无法工作的代码:
-怎样阅读本书都不会有任何问题:如果你希望略过一些内容,请继续!如果你发现疑惑可能会再跳回之前的章节。无论怎样都是可以的。
+| Ferris | 意义 |
+|------------------------------------------------------------------------|--------------------------------------------------|
+|
| 这些代码不能编译! |
+|
| 这些代码会 panic! |
+|
| 这些代码块包含不安全(unsafe)代码 |
+|
| 这些代码不会产生期望的行为。 |
-学习 Rust 的过程中一个重要的部分是学习如何阅读编译器提供的错误信息:它们会指导你编写出能工作的代码。为此,我们会提供很多不能编译的示例代码,以及各个情况下编译器会展示的错误信息。请注意如果随便输入并运行随机的示例代码,它们可能无法编译!请确保阅读任何你尝试运行的示例周围的内容,检视他们是否有意写错。在大部分情况,我们会指引你将任何不能编译的代码纠正为正确版本。
+在大部分情况,我们会指引你将任何不能编译的代码纠正为正确版本。
## 源代码
生成本书的源码可以在 [GitHub][book] 上找到。
-[book]: https://github.com/rust-lang/book/tree/master/second-edition/src
+[book]: https://github.com/rust-lang/book/tree/master/src
> 译者注:本译本的 [GitHub 仓库][trpl-zh-cn],欢迎 Issue 和 PR :)
diff --git a/src/ch01-00-getting-started.md b/src/ch01-00-getting-started.md
index c898517..aa0c4cb 100644
--- a/src/ch01-00-getting-started.md
+++ b/src/ch01-00-getting-started.md
@@ -1,10 +1,10 @@
# 入门指南
-> [ch01-00-getting-started.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-00-getting-started.md)
+> [ch01-00-getting-started.md](https://github.com/rust-lang/book/blob/master/src/ch01-00-getting-started.md)
>
-> commit 7480e811ab5ad8d53a5b854d9b0c7a5a4f58499f
+> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
-让我们开始 Rust 之旅!有很多内容要学,但每次旅程总有起点。在本章中,我们会讨论:
+让我们开始 Rust 之旅!有很多内容需要学习,但每次旅程总有起点。在本章中,我们会讨论:
* 在 Linux、macOS 和 Windows 上安装 Rust
* 编写一个打印 `Hello, world!` 的程序
diff --git a/src/ch01-01-installation.md b/src/ch01-01-installation.md
index 653045a..e93f773 100644
--- a/src/ch01-01-installation.md
+++ b/src/ch01-01-installation.md
@@ -1,18 +1,18 @@
## 安装
-> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-01-installation.md)
+> [ch01-01-installation.md](https://github.com/rust-lang/book/blob/master/src/ch01-01-installation.md)
>
-> commit 7480e811ab5ad8d53a5b854d9b0c7a5a4f58499f
+> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
第一步是安装 Rust。我们通过 `rustup` 下载 Rust,这是一个管理 Rust 版本和相关工具的命令行工具。下载时需要联网。
-> 注意:如果出于某些理由你倾向于不使用 `rustup`,请到 [Rust 安装页面](https://www.rust-lang.org/install.html) 查看其它安装选项。
+> 注意:如果你出于某些理由倾向于不使用 `rustup`,请到 [Rust 安装页面](https://www.rust-lang.org/install.html) 查看其它安装选项。
-接下来的步骤会安装最新的稳定版 Rust 编译器。本书所有示例和输出采用稳定版 Rust 1.21.0。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,通过这些步骤安装的最新稳定版 Rust,能正常运行本书中的内容。
+接下来的步骤会安装最新的稳定版 Rust 编译器。Rust 的稳定性确保本书所有示例在最新版本的 Rust 中能够继续编译。不同版本的输出可能略有不同,因为 Rust 经常改进错误信息和警告。也就是说,任何通过这些步骤安装的最新稳定版 Rust,都应该能正常运行本书中的内容。
> ### 命令行标记
>
-> 本章和全书中,我们会展示在终端中使用的命令。所有需要输入到终端的行都以 `$` 开头。但无需输入`$`;它代表每行命令的起点。不以 `$` 起始的行通常展示之前命令的输出。另外,PowerShell 专用的示例会采用 `>` 而不是 `$`。
+> 本章和全书中,我们会展示一些在终端中使用的命令。所有需要输入到终端的行都以 `$` 开头。但无需输入`$`;它代表每行命令的起点。不以 `$` 起始的行通常展示之前命令的输出。另外,PowerShell 专用的示例会采用 `>` 而不是 `$`。
### 在 Linux 或 macOS 上安装 `rustup`
@@ -46,12 +46,12 @@ $ export PATH="$HOME/.cargo/bin:$PATH"
### 在 Windows 上安装 `rustup`
-在 Windows 上,前往 [https://www.rust-lang.org/install.html][install] 并按照说明安装 Rust。在安装过程的某个步骤,你会收到一个信息说明为什么需要安装 Visual Studio 2013 或之后版本的 C++ build tools。获取这些 build tools 最方便的方法是安装 [Build Tools for Visual Studio 2017][visualstudio]。这个工具在 “Other Tools and Frameworks” 部分。
+在 Windows 上,前往 [https://www.rust-lang.org/install.html][install] 并按照说明安装 Rust。在安装过程的某个步骤,你会收到一个信息说明为什么需要安装 Visual Studio 2013 或更新版本的 C++ build tools。获取这些 build tools 最方便的方法是安装 [Build Tools for Visual Studio 2017][visualstudio]。这个工具在 “Other Tools and Frameworks” 部分。
[install]: https://www.rust-lang.org/install.html
[visualstudio]: https://www.visualstudio.com/downloads/
-本书的余下部分,使用能同时运行于 *cmd.exe* 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。
+本书的余下部分会使用能同时运行于 *cmd.exe* 和 PowerShell 的命令。如果存在特定差异,我们会解释使用哪一个。
### 更新和卸载
@@ -88,10 +88,10 @@ rustc x.y.z (abcabcabc yyyy-mm-dd)
[users]: https://users.rust-lang.org/
[stackoverflow]: http://stackoverflow.com/questions/tagged/rust
-恭喜入坑!(此处应该有掌声!)
+> 译者:恭喜入坑!(此处应该有掌声!)
### 本地文档
安装程序也自带一份文档的本地拷贝,可以离线阅读。运行 `rustup doc` 在浏览器中查看本地文档。
-任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查看应用程序接口(application programming interface,API)文档!
\ No newline at end of file
+任何时候,如果你拿不准标准库中的类型或函数的用途和用法,请查阅应用程序接口(application programming interface,API)文档!
\ No newline at end of file
diff --git a/src/ch01-02-hello-world.md b/src/ch01-02-hello-world.md
index ac166b9..482afe3 100644
--- a/src/ch01-02-hello-world.md
+++ b/src/ch01-02-hello-world.md
@@ -1,10 +1,10 @@
## Hello, World!
-> [ch01-02-hello-world.md](https://github.com/rust-lang/book/blob/master/second-edition/src/ch01-02-hello-world.md)
+> [ch01-02-hello-world.md](https://github.com/rust-lang/book/blob/master/src/ch01-02-hello-world.md)
>
-> commit 5dfa983aa8fca89f8b70cafe58ab8417491d2018
+> commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
-既然安装好了 Rust,我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 `Hello, world!` 是一项传统,这里我们将沿用这个传统!
+既然安装好了 Rust,我们来编写第一个 Rust 程序。当学习一门新语言的时候,使用该语言在屏幕上打印 `Hello, world!` 是一项传统,我们将沿用这一传统!
> 注意:本书假设你熟悉基本的命令行操作。Rust 对于你的编辑器、工具,以及代码位于何处并没有特定的要求,如果你更倾向于使用集成开发环境(IDE),而不是命令行,请尽管使用你喜欢的 IDE。目前很多 IDE 已经不同程度的支持 Rust;查看 IDE 文档了解更多细节。最近,Rust 团队已经致力于提供强大的 IDE 支持,而且进展飞速!
@@ -89,7 +89,7 @@ fn main() {
这几行定义了一个 Rust 函数。`main` 函数是一个特殊的函数:在可执行的 Rust 程序中,它总是最先运行的代码。第一行代码声明了一个叫做 `main` 的函数,它没有参数也没有返回值。如果有参数的话,它们的名称应该出现在小括号中,`()`。
-还须注意,函数体被包裹在花括号中,`{}`。Rust 要求所有函数体都要用花括号包裹起来(译者注:有些语言,当函数体只有一行时可以省略花括号,但在 Rust 中是不行的)。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
+还须注意,函数体被包裹在花括号中,`{}`。Rust 要求所有函数体都要用花括号包裹起来。一般来说,将左花括号与函数声明置于同一行并以空格分隔,是良好的代码风格。
在编写本书的时候,一个叫做 `rustfmt` 的自动格式化工具正在开发中。如果你希望在 Rust 项目中保持一种标准风格,`rustfmt` 会将代码格式化为特定的风格。Rust 团队计划最终将该工具包含在标准 Rust 发行版中,就像 `rustc`。所以根据你阅读本书的时间,它可能已经安装到你的电脑中了!检查在线文档以了解更多细节。
@@ -101,7 +101,7 @@ fn main() {
这行代码完成这个简单程序的所有工作:在屏幕上打印文本。这里有四个重要的细节需要注意。首先 Rust 的缩进风格使用 4 个空格,而不是 1 个制表符(tab)。
-第二,`println!` 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 `println`(没有`!`)。我们将在附录 D 中详细讨论宏。现在你只需记住,当看到符号 `!` 的时候,就意味着调用的是宏而不是普通函数。
+第二,`println!` 调用了一个 Rust 宏(macro)。如果是调用函数,则应输入 `println`(没有`!`)。我们将在第十九章详细讨论宏。现在你只需记住,当看到符号 `!` 的时候,就意味着调用的是宏而不是普通函数。
第三,`"Hello, world!"` 是一个字符串。我们把这个字符串作为一个参数传递给 `println!`,字符串将被打印到屏幕上。
@@ -119,17 +119,26 @@ $ rustc main.rs
如果你有 C 或 C++ 背景,就会发现这与 `gcc` 和 `clang` 类似。编译成功后,Rust 会输出一个二进制的可执行文件。
-在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 `ls` 命令就可看见这个可执行文件,如下:
+在 Linux、macOS 或 Windows 的 PowerShell 上,在 shell 中输入 `ls` 命令也可以看见这个可执行文件,如下:
```text
-$ ls
-main main.rs
+> ls
+
+
+ Directory: Path:\to\the\project
+
+
+Mode LastWriteTime Length Name
+---- ------------- ------ ----
+-a---- 6/1/2018 7:31 AM 137728 main.exe
+-a---- 6/1/2018 7:31 AM 1454080 main.pdb
+-a---- 6/1/2018 7:31 AM 14 main.rs
```
在 Windows 的 CMD 上,则输入如下内容:
```cmd
-> dir /B %= the /B option says to only show the file names =%
+> dir /B %= /B 参数表示只显示文件名 =%
main.exe
main.pdb
main.rs
@@ -138,7 +147,7 @@ main.rs
这展示了扩展名为 *.rs* 的源文件、可执行文件(在 Windows 下是 *main.exe*,其它平台是 *main*),以及当使用 CMD 时会有一个包含调试信息、扩展名为 *.pdb* 的文件。从这里开始运行 *main* 或 *main.exe* 文件,如下:
```text
-$ ./main # or .\main.exe on Windows
+$ ./main # Windows 是 .\main.exe
```
如果 *main.rs* 是上文所述的 Hello, world! 程序,它将会在终端上打印 `Hello, world!`。
diff --git a/src/img/ferris/does_not_compile.svg b/src/img/ferris/does_not_compile.svg
new file mode 100644
index 0000000..5d345f1
--- /dev/null
+++ b/src/img/ferris/does_not_compile.svg
@@ -0,0 +1,72 @@
+
+
+
+
diff --git a/src/img/ferris/not_desired_behavior.svg b/src/img/ferris/not_desired_behavior.svg
new file mode 100644
index 0000000..47f4024
--- /dev/null
+++ b/src/img/ferris/not_desired_behavior.svg
@@ -0,0 +1,75 @@
+
+
+
+
diff --git a/src/img/ferris/panics.svg b/src/img/ferris/panics.svg
new file mode 100644
index 0000000..be55f5e
--- /dev/null
+++ b/src/img/ferris/panics.svg
@@ -0,0 +1,70 @@
+
+
+
+
diff --git a/src/img/ferris/unsafe.svg b/src/img/ferris/unsafe.svg
new file mode 100644
index 0000000..d4fdc08
--- /dev/null
+++ b/src/img/ferris/unsafe.svg
@@ -0,0 +1,291 @@
+
+
+
+
diff --git a/src/img/trpl04-01.svg b/src/img/trpl04-01.svg
index 7f5ee8d..314f53b 100644
--- a/src/img/trpl04-01.svg
+++ b/src/img/trpl04-01.svg
@@ -1,65 +1,68 @@
-
diff --git a/src/img/trpl04-02.svg b/src/img/trpl04-02.svg
index 7d3a29a..70d490f 100644
--- a/src/img/trpl04-02.svg
+++ b/src/img/trpl04-02.svg
@@ -1,90 +1,95 @@
-
diff --git a/src/img/trpl04-03.svg b/src/img/trpl04-03.svg
index a606851..7c153e2 100644
--- a/src/img/trpl04-03.svg
+++ b/src/img/trpl04-03.svg
@@ -1,117 +1,123 @@
-
diff --git a/src/img/trpl04-04.svg b/src/img/trpl04-04.svg
index 1a17b27..a0513ab 100644
--- a/src/img/trpl04-04.svg
+++ b/src/img/trpl04-04.svg
@@ -1,91 +1,96 @@
-
diff --git a/src/img/trpl04-05.svg b/src/img/trpl04-05.svg
index 33e5b49..b4bf2eb 100644
--- a/src/img/trpl04-05.svg
+++ b/src/img/trpl04-05.svg
@@ -1,82 +1,87 @@
-
diff --git a/src/img/trpl04-06.svg b/src/img/trpl04-06.svg
index 1a87522..e64415f 100644
--- a/src/img/trpl04-06.svg
+++ b/src/img/trpl04-06.svg
@@ -1,110 +1,115 @@
-
diff --git a/src/img/trpl15-01.svg b/src/img/trpl15-01.svg
index b873825..bbeef96 100644
--- a/src/img/trpl15-01.svg
+++ b/src/img/trpl15-01.svg
@@ -1,42 +1,43 @@
-
diff --git a/src/img/trpl15-02.svg b/src/img/trpl15-02.svg
index 5b86985..4454df8 100644
--- a/src/img/trpl15-02.svg
+++ b/src/img/trpl15-02.svg
@@ -1,25 +1,26 @@
-
diff --git a/src/img/trpl15-03.svg b/src/img/trpl15-03.svg
index e26024f..dbc3b5c 100644
--- a/src/img/trpl15-03.svg
+++ b/src/img/trpl15-03.svg
@@ -1,94 +1,109 @@
-