Origami404 的 Blog 有空的话就随便逛逛吧 www

矢量运算与高阶线性结构的构造性定义

前言

上大学了, 终于有大段的时间来整理数学和物理学内容了.

本文有其思想上的参考: 3b1b: 发明新数学是怎样一种体验?

“最原始的"双线性二元运算

让我们来考虑矢量的运算吧!

假如我们需要在线性空间 $\mathbb{V}$ 上定义二元运算, 显然我们会希望这个运算至少是线性的, 否则为啥我们要在线性空间上搞呢. 同时如果一个二元运算是双线性的(就是说对于两个操作数而言它都是线性的), 那么我们只需要对 $\mathbb{V}$ 的基底定义此运算即可.

换句话说, 对于双线性运算 $\mathbf{a} \otimes \mathbf{b}$, 我们可以将其按基底展开:

$$ \begin{aligned} \mathbf{a} \otimes \mathbf{b} &= (\sum_{i=1}^n a_i \mathbf{e_i}) \otimes (\sum_{i=1}^n b_i \mathbf{e_i}) \\ &= \sum_{i=1}^n \sum_{j=1}^n a_i b_j (\mathbf{e_i} \otimes \mathbf{e_j}) \end{aligned} $$

那么, 我们只需要定义所有的 $\mathbf{e_i} \otimes \mathbf{e_j}$ (一共 $n^2$ 个) 即可.

等等, 这都啥跟啥啊????

从外代数出发的行列式理论

前置

这篇文章有些前置知识我默认读者是知道的, 比如矢量和线性空间(wiki, 知乎)的概念. 具体来讲, 我希望读者能完全理解这句话: “基底通过线性组合张成线性空间”. 但更加重要的是, 我希望读者能够放开胆子, 接受并批判地思考与新的语言与概念. 文中有些地方我特意没有使用书本的符号, 为的就是让读者直接判断他自己到底是在跟着文章思路走还是靠课本里记下的结论硬看. 通过这篇文章, 我希望能有更多人开始 “思考” 和 “创造” 数学, 穿过数学高冷的表面, 看到数学定义背后的 “动机” 和 “深意”, 最终享受数学, 而不是只是跟着课本学点计算.

要知道, 数学家也是人. 一旦你觉得有什么东西是反人类的, 它背后一定是有自己的逻辑. 这里的逻辑, 是数学定义背后数学家们思考的内在的直觉的人的逻辑, 而不完全是死的客观精准的数理逻辑.

建议餐前食用: 3b1b: 发明新数学是怎样一种体验?

餐后或餐中可以结合: 3b1b: 线性代数的本质

比起纯粹的几何直观, 我更看重一种 “符号上的直观”, 也就是说, 你得把这一套数学符号, 当作与生俱来的, 自然的东西. 所谓直观学习, 不是把所有东西都归纳成你的 “直观”, 而是让你能把更多的东西变成你的直观.

鸡汤灌得够多了, 让我们开始吧.

基于Bison和Flex的编译器前端实现

前言

最近被某学长介绍了毕昇杯编译器比赛, 有点感兴趣, 遂开始用 C 自己实现, 然后就:

还是 Java 香!

本文记录了我用 Bison 和 Flex 来构建 SysY2021 语言前端的尝试.

Git Command: Git 的数据使用方式

此文章施工中…

现在让我们来使用上面我们写好的 Git Object 来实现常用的 Git 命令吧.

Git Index: Git 的暂存区

此文章施工中…

二进制格式

前后顺序均按从低位到高位.

Git 实现: Object 文件

导读

本文先介绍了一些方便查看 Git Object 文件 二进制内容的命令行工具, 其次分别介绍了 4 种 Object: Blob, Commit, Tree, Tag.

每一种 Object 按"概念模型"与"二进制格式"分隔, 前者主要介绍其储存了那些抽象信息, 后者则专注于其二进制储存格式.

Git 实现: 目录 & 前言 & Git repo

前言

写这篇文章一开始主要是受到了 Write Yourself a Git, 深入理解Git实现原理 这两篇文章的激励. 俗话说学会使用轮子的最佳方法就是造一个轮子(其实是我刚刚说的), 而在使用 Python 实现的过程中又多少碰到了点前面两篇文章没有覆盖到的细节点, 特记录于此, 以飨读者.

本文章介绍顺序是先介绍其存储用的数据结构, 分别按其概念模型(包含了什么信息, 为什么要这样设计)及其二进制格式(储存在文件系统中的格式)来介绍; 随后再描述如何实现 Git 的常用功能.

本文章不是 Git 的教程, 如果读者对 Git 的操作并非十分了解的话可以参考 ProGit, 一本非常好的 Git 教材.

本文对于细节扣得有点多, 可能并不适合只想理解 Git 底层模型的读者.

或者也可以像我一样现学现写.

本文的配套代码及 Markdown 源码一同发布于 GitHub: mgit, 可以配套查看. (顺着 Commit 看我怎么挣扎着理解的说不定别有一番乐趣).

由于作者水平有限, 时间亦有限, 错漏难免, 还请大佬指正.

UEFI下的引导恢复

背景

想调整一下分区大小, 结果一不小心删掉了 ESP…

Anbox 踩坑 & Manjaro 下的内核编译

前言 & Anbox 简介

最近换回了 Manjaro 和 Xfce, 打算认认真真地开始将 Linux 作为日常生活系统而不仅仅是开发系统来用了. 然而在日常生活中, 总归是逃不掉某国产IM的 :(. 为了实现以 Manjaro 作为生活主力系统的目标, (同时也为了以后说不定能愉快地打游戏), 决定安装一个能跑安卓应用的东西. 于是我的 Anbox 之旅就在完全搞不懂 Android x86 是什么玩意的情况下展开了.

Anbox 官网上的介绍:

Anbox: Android in a Box Run Android applications on any GNU/Linux operating system. Anbox puts the Android operating system into a container, abstracts hardware access and integrates core system services into a GNU/Linux system. Every Android application will be integrated with your operating system like any other native application.

简单来讲就类似 docker , 利用 LXD 技术在 Linux 系统里新建一个全新的容器, 然后直接去跑一个 Android x86. 好处嘛就是跑得比虚拟机快, 集成度比虚拟机好. 坏处嘛就是兼容性还是有待提高…

Python 与 Type Annotations

前言

用Python写了个Scheme解释器, 代码. 记录一下Python的类型标注要怎么用, 有什么坑.

话说回来这好像是我第一篇技术性文章…?

不务正业实锤

本文假定您已有支持编译期泛型的静态类型语言的编程背景, 比如C++, Haskell之类的.