Wrap & Unwrap errors in Go
tags: Go source: “Wrap and Unwrap Errors in Go (Golang) | Gosamples.Dev.” Accessed October 12, 2022. https://gosamples.dev/wrap-unwrap-errors/. Overview Since Go1.13, there is a new feature about error add to go: Wrap & Unwrap errors. Let’s start from a simple example:
package main import ( "errors" "fmt" ) var errRollingInTheDeep = errors.New("rolling in the deep") func doSomeActualJob() error { return errRollingInTheDeep } func someFrameworkCaller() error { // We use fmt.Errorf to wrap error.
actix-web extractors 支持提取任意长度的参数
tags: Rust 背景 今天看了一下 actix-web 发现该框架支持基于参数的 Extractor,可以非常方便地解析参数(包括 URI、Query、JSON 和 FormData)。
先来看一个在项目 README.md 中的例子:
use actix_web::{get, web, App, HttpServer, Responder}; #[get("/{id}/{name}/index.html")] async fn index(web::Path((id, name)): web::Path<(u32, String)>) -> impl Responder { format!("Hello {}! id:{}", name, id) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().service(index)) .bind("127.0.0.1:8080")? .run() .await } 初看之下觉得很神奇,但细想通过宏实现应该不是特别困难,然后发现其官网还有不是基于宏的运行时调用:
use actix_web::{web, App, HttpRequest, HttpServer, Responder}; async fn greet(req: HttpRequest) -> impl Responder { let name = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!
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 没有。
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 会在任何资源的所有权消失后立刻释放该资源,就这些,当:
译:深度学习算法:完整指南
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.