跳转至

翻译

马修·伯恩斯坦讲线性代数系列:矩阵的介绍

原文:Introducing matrices

在这里,我将介绍思考矩阵的三种主要方法。当我在本科线性代数课程中第一次接触到矩阵时,这种对矩阵多方面思考方式的高级描述将帮助我更好地直觉矩阵。

引言

矩阵是线性代数中的基本概念,在科学和工程领域中无处不在。从表面上看,矩阵只是一个二维的值数组。例如,以下是一个矩阵:

\[\begin{bmatrix}1 & -2 & 0 \\ 4 & -3 & 1 \\ 0 & 6 & -2 \end{bmatrix}\]

正如我在上一篇博客文章中讨论的那样,有些概念需要从多个角度观察才能掌握其真实本质。尽管矩阵表面上很简单,但我认为矩阵是其中一个概念,并且我相信,如果一开始就提供对矩阵的高层次、多视角概述,以便为未来的线性代数学习提供背景,那么对于我--大学线性代数课程的二年级学生来说,这会对我有所帮助。在这篇文章中,我将介绍查看矩阵的三个主要角度,这对我以前的自己有帮助。

预备知识

在介绍观察矩阵的三种角度之前,我将介绍一些符号。首先,一个矩阵是一个矩形的值数组。例如,以下矩阵 \(\boldsymbol{A}\)\(m\) 行和 \(n\) 列:

\[\boldsymbol{A} := \begin{bmatrix} a_{1,1} & a_{1,2} & \dots & a_{1,n} \\ a_{2,1} & a_{2,2} & \dots & a_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m,1} & a_{m,2} & \dots & a_{m,n} \end{bmatrix}\]

马修·伯恩斯坦讲线性代数系列:开篇

马修·伯恩斯(Matthew N. Bernstein) 是计算生物学与机器学习领域的研究者,现任 Cellular Intelligence 首席计算科学家。

他于2019年获威斯康星大学麦迪逊分校计算机科学博士学位,本科毕业于圣母大学。此前曾在 Stellaromics 和 Immunitas Therapeutics 担任机器学习与计算生物学科学家,并在 Morgridge Institute 从事博士后研究。Bernstein 专注于将高维基因组学数据转化为可指导人类健康研究的洞见,在空间转录组学、药物靶点识别和深度学习模型开发方面有丰富经验。

他在技术博客中,撰写了大量关于线性代数、变分自编码器、信息论基础等数学与机器学习概念的科普文章,以清晰的数学解释和直观的可视化著称。本系列是从马修的技术博客中筛选出有关线性代数的文章进行翻译后组成的一个合集。

马修·伯恩斯坦讲线性代数系列目录如下:

成为一名优秀的程序员:心智模型和学习策略

前言

在我作为软件工程师的职业生涯中,我遇到了一些伟大的程序员,并从他们身上学到了很多东西。这篇文章将为初学者提供一些关于成为一名优秀程序员的旅程的提示,特别是从心智模型和学习策略方面。

掌握编程需要花费大量时间。 Peter Norvig 说十年可能就足够了,所以请保持耐心,让我们开始吧。

心智模型

每个人都会编程,几岁的孩子也能写出一些可运行的代码。然而,成为一名优秀的程序员需要大量的时间和精力来打磨技能。做好准备的心态会让你在这段漫长的旅程中不断成长。

SSL和SSL证书初学者指南

原文: SSL and SSL Certificates Explained For Beginners

安全套接字层 (SSL,全称Secure Sockets Layer)传输层安全 (TLS,全称Transport Layer security) 是通过计算机网络或链接提供安全通信的协议。它们通常用于网页浏览和电子邮件。在本教程中,我们将了解学习到:

  • TLS 和 SSL
  • 公钥和私钥
  • 为什么我们需要证书以及它们的作用
  • 如何获取数字证书并了解不同的常见证书类型

什么是 TLS?

TLS 基于 SSL,并作为替代方案而开发以应对 SSLv3 中的已知漏洞。SSL 是常用术语,我们说的 SSL 通常指的就是 TLS。

SSL/TLS 提供安全保障

SSL/TLS 提供数据加密、数据完整性和身份验证功能。这意味着当使用 SSL/TLS 时,你可以确保:

  • 没有人读过你的消息
  • 没有人篡改过你的消息
  • 你正在与预期的人(服务器)通信

在两方之间发送消息时,你需要解决两个问题。

  • 你怎么知道没有人读过这条消息?
  • 你怎么知道没有人篡改过该消息?

这些问题的解决办法是:

  • 对其进行加密(Encrypt it) : 这会使内容无法读取,因此对于查看该消息的任何人来说,它只是乱码。
  • 签名(Sign it) : 这可以让收件人确信是你发送的邮件,并且邮件未被篡改。

这两个过程都需要使用密钥。这些密钥只是数字(常见的是 128 位),然后使用特定方法(通常称为算法)与消息组合,例如RSA,对消息进行加密或签名。

如何在微控制器中运行Rust?

原文:Running Rust on Microcontrollers

概览

Rust 是一个相当新的编程语言(它诞生于20101年),但在开发嵌入式固件方面显示出巨大的潜力。它首先被设计为一种系统编程语言,这使得它特别适合用于微控制器。它试图通过实现一个强大的所有权模型(可以消除整个错误类的发生)来改进 C/C++ 的一些最大缺点,这对固件也非常适用。

截至2022年,CC++ 编程语言仍然是嵌入式固件的事实标准。然而 Rust 在固件中的角色看起来很光明。Rust 对固件的支持并不是后面才考虑到,而是一开始就考虑支持。 为此,Rust 专门有官方的 嵌入式设备工作组 和 介绍如何使用 Rust 进行嵌入式开发的 嵌入式Rust之书。下图就是Rust嵌入式设备工作组logo2

Rust嵌入式设备工作组logo

本篇文章旨在探索在微控制器(这里指的是低级嵌入式固件,而不是在 Linux 等主机环境上运行)上运行 Rust,涵盖以下内容:

  • 语言特性
  • 架构支持
  • MCU家族支持
  • IDE, 编码 和 编码体验
  • 实时操作系统
  • Rust缺点

Nasm使用教程:基于X86编程教学

原文:NASM Tutorial

第一个程序

在了解 nasm 之前,让我们确保你可以输入和运行程序。确保 nasm 和 gcc 都已安装。根据你的机器平台,将以下程序之一保存为 hello.asm。然后根据给定的说明运行程序。

如果你使用的是基于 Linux 的操作系统:

; ----------------------------------------------------------------------------------------
; Writes "Hello, World" to the console using only system calls. Runs on 64-bit Linux only.
; To assemble and run:
;
;     nasm -felf64 hello.asm && ld hello.o && ./a.out
; ----------------------------------------------------------------------------------------

          global    _start

          section   .text
_start:   mov       rax, 1                  ; system call for write
          mov       rdi, 1                  ; file handle 1 is stdout
          mov       rsi, message            ; address of string to output
          mov       rdx, 13                 ; number of bytes
          syscall                           ; invoke operating system to do the write
          mov       rax, 60                 ; system call for exit
          xor       rdi, rdi                ; exit code 0
          syscall                           ; invoke operating system to exit

          section   .data
message:  db        "Hello, World", 10      ; note the newline at the end

Go 开发中我一定会用到的 7 种代码模式

原文:7 Code Patterns in Go I Can’t Live Without

代码模式使你的程序更可靠、更高效,并使你的工作和生活更轻松

我已经为开发EDR解决方案工作了7年。这意味着我必须编写具有弹性和高效性的长时间运行的系统软件。我在这项工作中大量使用 Go,我想分享一些最重要的代码模式,你可以依靠这些模式你的程序更加可靠(reliable)和高效(efficient)。

使用Map实现Set

我们经常需要检查某些对象是否存在。例如,我们可能想检查之前是否访问过某个文件或者URL。在这些情况下,我们可以使用map[string]struct{}。如下所示:

使用空结构 struct{} 意味着我们不希望Map的值占用任何空间。有些人会使用 map[string]bool,但基准测试表明 map[string]struct{} 在内存和时间上都表现得更好。相关基准测试可以查看这里

探索Prometheus Go客户端指标

原文是 Exploring Prometheus Go client metrics,有删改。

在这篇文章中,我将探索下Prometheus Go 客户端指标,这些指标由client_go通过promhttp.Handler()暴露出来的。通过这些指标能帮助你更好的理解 Go 是如何工作的。

想对Prometheus了解更多吗?你可以去学习下Monitoring Systems and Services with Prometheus,这是一门很棒的课程,可以让你快速上手。

让我们从一个简单的程序开始,它注册prom handler并且监听8080端口:

package main

import (
    "log"
    "net/http"

    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    http.Handle("/metrics", promhttp.Handler())
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Go 反射三定律

原文地址:https://blog.golang.org/laws-of-reflection

简介

Reflection(反射) 在计算机中表示程序能够检查自身结构的能力,特别指通过类型进行处理。它是元编程的一种形式,也是最容易让人迷惑的一部分。

类型和接口

因为反射建立在类型系统之上,所以让我们先回顾一下 Go 中的类型。Go 是静态类型语言。每个变量都有一个静态类型,即只有一种类型,并且在编译时就已经确定了。比如int, float32, *MyType, []byte等。比如我们进行如下声明:

type MyInt int

var i int
var j MyInt