- tags: Learning,Learning English
Translate
Links to this note
Understanding Rust futures by going way too deep
tags: Translate,Rust,Tokio 原文链接:Understanding Rust futures by going way too deep。 译者注:原文大量的引入了有趣的对话,迫于排版问题这里不进行翻译,必要的对话通过引用块来解释。 深入理解 Rust future 用 Rust future!就是这么简单!直到我们发现并非如此。所以我们先探索简单的部分,然后继续探索困难部分而不是等它慢慢靠近我们。 起步 Choo choo here comes the easy part 🚂💨 我们创建一个新的项目: $ cargo new waytoodeep Created binary (application) `waytoodeep` package 我们需要安装 cargo-edit 如果之前没有安装过的话,接下来就可以直接 cargo add : $ cargo install cargo-edit Updating crates.io index Downloaded cargo-edit v0.7.0 Downloaded 1 crate (57.6 KB) in 0.47s Ignored package `cargo-edit v0.7.0` is already installed, use --force to override 因为 cargo-edit 很方便,所以你可能已经安装过它。部分读者会感到困惑是因为像 cargo new, cargo build, cargo test, cargo run 等子命令都内置在 cargo 中, 但是 cargo add 没有。 ...
Python behind the scenes #2: how the CPython compiler works
tags: Translate,Incomplete,Python Python 幕后 #2: CPython 编译器如何工作 今天的主题(Today’s subject) 在本系列的第一篇文章中我们研究了 Python 虚拟机。我们学了解到它通过执行一系列叫做字节码(bytecode)的指令。 我们也看到 Python 字节码没有完全描述代码片段的行为。这也是为什么存在一个代码对象(code object)的概念。 执行诸如函数或模块的代码块也就是执行对应的代码对象。代码对象包含了代码块的字节码,包含代码中使用的常量和变量名, 还有代码块的一些属性。 通常,一个 Python 程序员不用编写字节码,并且也不用创建代码对象,而是编写正常的 Python 代码。所有 CPython 必须 能够将源代码转换成代码对象。CPython 编译器就负责这部分工作。我们将通过这部分内容探索它是如何工作的。 Note: 本文参考 CPython 3.9。一些实现细节将必然会随着 CPython 的演进而改变。 我将会尝试关注一些重要的改变并添加更新备注。 什么是 CPython 编译器(What CPython compiler is) 我们已经了解了 CPython 编译器的职责,但是在我们进入到它是如何实现的之前,让我们首先来搞清楚为什么我们称之为编译器? 在通常情况加,编译器是一个将一个程序语言翻译到另一个与之等价的程序语言的程序。编译器有许多种类,但是通常情况下我们 讨论的都是静态编译:将一个高级语言的程序翻译成机器码。CPython 编译器也是这样吗?要回答这个问题,我们先看一下静态编 译器的传统三阶段设计(three-stage design)。 编译器前端(frontend)将源代码转换成一种中间语言(IR,intermediate representation)。然后优化器(optimzer)拿到中间语言 对其进行优化并把优化过的中间语言传递给编译器后端生成机器码。如果我们选择一种源语言和目标机器无关的中间语言,我们就 得到了三阶段设计的关键益处:对于一个编译器来说,支持一种新的源语言仅仅需要新增一个对应的编译器前端,支持一种新的目标机器 仅仅需要新增一个对应的编译器后端。 LLVM 工具集(toolchain)就是这个模型的一个很好的成功的例子。有很多编译器前端如 C、Rust、Swift 等其他很多编程语言基于 LLVM 提供给编译器更加复杂的部分。LLVM 的创建者 Chris Latter 提供了一个很好的 LLVM 架构概览。 CPython 尽管不需要支持多个源语言和目标机器,尔仅仅需要支持 Python 代码和 CPython 虚拟机。不过,CPython 同样实现了三阶段设计。 如果想知道为什么,我们需要更加详细的解释编译器的三阶段的每个阶段。 ...
Python behind the scenes #1: how the CPython VM works
tags: Translate,Python 原文链接:Python behind the scenes #1: how the CPython VM works。 Python 幕后 #1: CPython 虚拟机如何工作 介绍(Introduction) 你是否曾经好奇过当你运行 Python 代码时 python 做了些什么? $ python script.py 这篇文章将开启一个系列来尝试解答这个问题。我们将深入 Python 最流行的实现 CPython 的内部。 通过深入 CPython 的内部我们将更深一层的去理解这门编程语言本身。这也是我们这个系列的最主要的目标。 如果你熟悉 Python 并且可以阅读 C 代码,但是对 CPython 源码本身没有太多的经验, 那么你可能非常适合本系列,并且对本系列感兴趣。 什么是 CPython 并且为什么有人想学习它(What CPython is and why anyone would want to study it) 我们首先来说明一些众所周知的事情。CPython 是用 C 编写的 Python 解析器。他是 Python 语言的众多实现 的一种,其他还有诸如 PyPy、Jython、IronPython 等。CPython 的独特之处在于它是 Python 的起源、维护时间最长也是最受欢迎的。 CPython 实现了 Python,但是 Python 是什么?最简单的一个答案可能是:Python 是一门编程语言。 当正确问相同的问题,那么答案将会更加明确:什么定义了 Python?Python 不像 C 语言有正式的规范, 但是与之相近的是 Python 语言参考(Python Language Reference),它以如下内容开始: ...
Rust Means Never Having to Close a Socket
tags: Translate,Rust,Rust Wrapper Types 原文链接:Rust Means Never Having to Close a Socket Rust 最酷的特性之一就是它可以自动地帮助你管理资源,同时在仍能保持安全(没有段错误)和高性能。 这是因为 Rust 是一门与众不同地编程语言,要理解我说的可能有点困难,让我来更近一步说明: Rust 就像带垃圾回收的编程语言,你无需手动释放内存 Rust 不同于其他带垃圾回收的编程语言,你无需1手动关闭或者释放像文件、套接字和锁这样的资源 Rust 达到以上这些特性不附带任何运行时开销(垃圾回收或者引用计数),并且不牺牲安全性。 如果你曾经造成过一个套接字或者文件泄漏,或者使用过一些抽象方法造成了这些资源的泄漏,那么你就会知道这有多重要。 你可能已经期望通过“使用后释放”来避免内存问题,而与此同时你并没有考虑到没有明确地关闭套接字可能出现类似的错误。我在这里告诉你,还有更好地办法。 如果你使用的是带垃圾回收的编程语言,则应密切关注本文提到的资源管理方面的内容。如果你使用的是像 C/C++ 这样底层编程语言,你可能会对安全方面更加感兴趣。 Rust 的许多特性都是从其他语言借鉴而来。Rust 之所以变得有趣是因为它把所有的这些特性放在了一起,并且在编程语言层面实现了更严格地保证。 实际上,这种编程语言层面的保证让这些特性更加实用。 所有权系统(The Ownership System) 让这种保证工作的方式是通过 Rust 的「所有权(ownership)」系统。不管任何时候你创建一个新的对象,都被创建它的「作用域(scope)」所拥有。 让我们通过一个例子来进一步说明:我们定义一个函数,函数拷贝输入文件到临时文件去处理它,然后拷贝输入文件到输出文件。 fn process(from: &Path, to: &Path) -> IoResult<()> { // creates a new tempdir with the specified suffix let tempdir = try!(TempDir::new("skylight")); // open the input file let mut from_file = try!(File::open(from)); // create a temporary file inside the tempdir let mut tempfile = try!(File::create(&tempdir.path().join("tmp1"))); // copy the input file into the tempfile try!(io::util::copy(&mut from_file, &mut tempfile)); // use an external program to process the tmpfile in place // after processing, copy the tempfile into the output file let mut out = try!(File::create(to)); io::util::copy(&mut tempfile, &mut out) } 在这个例子中,函数 process 的作用域再第一行创建了 TempDir 是其初始拥有者。在这个例子中, process 函数从未放弃所有权,所以当函数完成调用, 它就会自动被丢弃(dropped),也就是会删除 Tempfile 。 ...
Surgical Reading: How to Read 12 Books at Once
tags: Translate,Incomplete 原文链接:https://superorganizers.substack.com/p/surgical-reading-how-to-read-12-books 手术阅读法:如何同时阅读 12 本书 译者注:这篇文章让我想起了《如何阅读一本书》这本书,文章中的大部分技巧都能在这本书中找出来,阅读是一门需要学习的技能。 当有人问我如何阅读时我总是会有点尴尬,因为我一般都是同时阅读十几本书。 但是我这样阅读并不是为了炫耀 – 我这么做是因为我觉得这种阅读方式更好,最起码对我来说。 这是一个我开发一个叫做 手术阅读法(surgical reading) 的过程,它意味着当我读一本非小说的书籍时,我会专注于尽可能快的从书中找到最有价值的部分并将之剔除。 这样允许我在一个主题上同时阅读许多不同的书籍,并从多个角度来观察这一主题。我的目标是快速地找到有价值的知识,并使用现实中获得的信息去解决问题。 这种方法有很多隐藏的好处。首先,我可以快速了解自己对一本书是否有兴趣,并因此去花更多的时间读我真正感兴趣书籍。当我对一本书不感兴趣时我就可以将其放下并转到其他事情上,因为我知道我将它放回去是有原因的。 阅读不应该是将书籍在 ToDo 事项完成,而是应该解释什么吸引了你。 其次,我可以从多个角度观察一个主题,并真正理解问题。我可以看到有多少不同的人讨论同一个时间和想法,而不是依靠一位作者的陈述。 这使我对当前感兴趣的的任何主题都有更细微的了解。 最后,它将书籍转变为更主动和更积极的事物。我的书架(library)已经不再是死板的存储空间,而是一个与我不断互动的鲜活的事物。 当然,当我找到一本我真正喜欢的书(现在也越来越频繁),我也可以充分的利用它。 我是谁(Who I Am) 我的名字是 Brian Tobal,我耗费了我的大部分时间来思考如何学习。在过去 15 年,我在教育界获得了很多头衔(hats)。 我曾是一名小学科学老师、一家教育公司的研究员、六家教育科技初创公司的产品负责人,本人也是一些初创公司的创始人, 包括我于 2018 年出售的一家名为 Hickory 的公司。 我喜欢初创公司。从学习角度来看,它们使你可以完全沉浸于新的领域,并根据其性质迫使你解决实际问题。 这为我自己的学习方法和阅读方法提供了动力。我不是为了仅仅积累知识来建立知识库,通常我建立它是为了尽快使用它。 手术阅读法就是设计用来帮助我这么做的。 所以你准备好试一试了吗?请从书架上拿出一些已经搁置了一段时间的书,希望您还没有读过。跟着我,亲眼看看手术阅读法的感觉。 让我们开始吧! 把书当作其自身的地图(Use the Book Itself as a Map) 以下是一份我如何阅读一本书的步骤分解: 了解一本书 通过封面评判这本书 索引(index)包含了一切 把目录(TOC)当作骨架 通过前言(preface)进行预览 此过程的重点是获得在大约 15 分钟内对任何书籍进行“地图绘制”的能力。你希望对有价值的知识位于何处、什么地方打动你以及要花费多少时间来阅读它有基本的了解。 下面,我们将逐步完成从一本书中提取要点(或者说知识块)的过程,如何增加阅读一本书的价值,以及如何结合所有内容以便您可以轻松的一次提取多本书。 了解一本书(Approaching a Book ) 当我开始阅读一本非小说的书籍之前,我会话费 5-10 分钟的时间尝试去了解他对我具有什么价值以及它的结构。当我们决定要阅读此书时我们可以通过很多方式做到这一点。 也许通过亚马逊阅读一些评论和反馈或者随机浏览其中一部分。我更喜欢使用这本书本身。 同样,我通常对从头到尾阅读一本书籍不感兴趣,所以我需要删除我需要的信息,当然需要先找找它。我想要的是一本关于本书内容的地图(无论是思维上的还是书面上的)。 你可以使用大脑记忆、记事本、Google Doc 或某些精美的笔记记录系统作为记录机制 – 根据你自己的喜好就行。 ...
Rust Borrow and Lifetimes
tags: Rust,Translate,Rust Wrapper Types 原文链接:Rust Borrow and Lifetimes。 Rust 是一门处于往 1.0 活跃开发的新语言(译注:1.0 早已发布,目前最新稳定版本 1.42)。 我必须再写一篇关于我为什么觉得 Rust 牛逼的新博客,但是今天我将关注在它的借用(borrow) 和生命周期(lifetimes)系统,这也是常常让包括我在内的 Rust 新手陷入困境的地方。这篇文章假设 你基本了解 Rust,如果还没推荐你先阅读指南和指针指南。 资源所有权和借用 Rust 通过一个难缠的(sophisticated)借用系统在不用 GC 的情况下达到内存安全。对于任何资源 (栈内存、堆内存、文件句柄等),他们都对应一个唯一的所有者(owner)在需要的情况下处理资源回收。 你可以通过 & 或者 &mut 创建一个新的绑定指向该资源,这被称之为借用或可变借用。编译器确保 所有的所有者(owners)和借用者(borrowers)行为正确。 拷贝和转移(Copy and move) 在我们开始进入借用系统之前,我们需要知道 Rust 如何处理拷贝和转移。这个 StackOverflow 答案非常值得一读。 基本上,在赋值和函数调用上: 如果值是可拷贝的(copyable)(仅涉及原始(primitive)类型,不涉及如内存或文件句柄的资源),编译器默认进行拷贝。 其他情况,编译器转移(moves)所有权(ownership)并使原来的绑定无效。 简而言之,POD(Plan Old Data) => 拷贝,Non-POD(线性类型(linear types))=> 转移。 以下是一些额外的注释供你参考: Rust 拷贝像 C。每一个按值(by-value)使用一个值都是字节拷贝(通过 memcpy 浅拷贝),而不是语义上的拷贝或克隆。 如果想要让一个 POD 结构体变成不可拷贝的,你可以使用一个 NoCopy 标记,或者实现 Drop 特性(trait)。 转移之后,所有权就转移到了下一个所有者那。 资源回收 Rust 会在任何资源的所有权消失后立刻释放该资源,就这些,当: 所有者超出作用域,或 正在持有的所有者改变绑定(原始绑定变成 void)。 所有者和借用者的权限(privileges)和限制 这一节基于 Rust Guide 在权限(privileges)一部分提到拷贝和转移。 ...
译:深度学习算法:完整指南
tags: Translate,Deep Learning,AI,Incomplete 原文链接:Deep Learning Algorithms : The Complete Guide。 深度学习正在影响整个世界。 深度学习的炒作始于 2012 年:一个神经网络(Neural Network)在图片识别任务上表现出超人的性能,并且只有少数人能预测将会发生什么。 在过去 10 年,越来越多的算法落地到我们生活中。越来越多的公司开始将其加入到日常业务中。 这里,我尝试覆盖近几年各种应用如计算机视觉和自然语言处理(Natural Language Processing)中所涉及的所有最重要的算法和构思。 其中有一些算法比其他一些使用的更加频繁并且每一种都有其自身的优点和缺点。 我的主要目标是给你一个当前领域通用的思路去帮助你理解每一种情况应该使用什么算法。 因我知道它看起来会对一些从零开始的人造成一定程度的混乱。 但是通过阅读这份指南,我有信心你会认识到什么是什么并且你可以准备好去立即使用他们。 所以如果你正在寻找一份深度学习真正的完整指南,那就让我们开始吧。 Contents 但是什么是深度学习? 神经网络 前馈神经网络(FNN) 卷积神经网络(CNN) 循环神经网络(RNN) 递归神经网络(Recurisive Neural Network) 自编码器(AutoEncoders) 深度信念网络 (Deep belief network)和受限玻尔兹曼机 (Restricted Boltzmann machine) 生成对抗网络(GAN) Transformers 图神经网络(GNN) 自然语言处理中的深度学习 词嵌入 (Word embedding) 序列建模(Sequence Modeling) 计算机视觉中的机器学习 本地化和物体识别 单发探测器(Single shot detectors) 语义分割(Semantic Segmentation) 姿势估计(Pose Estimation) 深度学习在科学和企业界取得了疯狂的人气。从 2012,卷积神经网络(CNN)在图像识别竞赛( ImageNet Large Scale Visual Recognition Challenge)中获得了惊人的准确性,每年都出现了越来越多的研究论文并且越来越多的企业将神经网络收录到他们的业务中。据估计,深度学习目前的市场规模为 25 亿,预计到 2023 年将达到 181.6 亿。 ...