实用 Shell 工具
整理一些优化 shell 使用体验的小工具。 starshipGithub: starship starship 是跨平台支持不同 shell 的命令行主题配置工具。 安装配置: 在 Windows 可以使用 winget 安装 1winget install --id Starship.Starship 在 Linux 可以使用下面的命令进行全局安装 1curl -sS https://starship.rs/install.sh | sh 也可以直接在 Github Release 手动下载预编译版本(使用 rust 编写,解压出来就是单文件),存放在 ~/.local/bin 即可。 需要在每一个 shell 的启动配置文件中都加入对应的配置 ~/.bashrc1eval "$(starship init bash)" ~/.config/fish/config.fish1starship init fish | source $profile1Invoke-Expression (&starship init powershell) ...
Python uv 使用笔记
uv 是一个用 Rust 编写的极速 Python 包安装器和解析器,由 Astral 团队开发(也是 Ruff 的作者)。它旨在替代传统的 pip + venv + pip-tools 组合,同时提供类似 pipx 的全局工具管理功能。 uv 提供与 pip 高度兼容的接口,但不是 pip 的等价实现,通过底层优化实现了数倍到数十倍的速度提升。 uv = Python 版本管理 + 虚拟环境管理 + 包管理 + 项目依赖管理 + 工具安装 安装 uv使用下面的命令可以安装 uv 12345# Linux/MacOScurl -LsSf https://astral.sh/uv/install.sh | sh# Windowsirm https://astral.sh/uv/install.ps1 | iex 安装后,uv 的可执行文件(uv,uvx)会被存放到 ~/.local/bin/uv,可以在任何目录下直接使用。 基本使用uv 提供了与 pip 几乎完全相同的子命令,只需将 pip 替换为 uv pip 即可: 12345uv pip install re...
C/C++ 创建 PPM 图像/视频
Portable Pixmap Format(PPM)格式是非常简单的图片/视频格式,它结构非常简单,不含任何压缩和优化处理,图片就是直接存储所有像素(P3:ASCII格式,P6:二进制格式),视频则是通过一组 PPM 图像创建。因此可以用 C/C++ 直接写入,无需专门的图形处理库。但是 PPM 格式的图像查看有点麻烦,可以使用 ffmpeg 转换为 png 格式,生成视频的过程也需要依赖 ffmpeg。 例如 P3 格式的 PPM 文件是完全使用 ASCII 格式明文存储的,格式规定如下: 第一行是魔数 P3 第二行说明图像的宽度和高度 第三行说明像素值的最大值(通常是255) 第四行开始是 RGB 像素数据矩阵 示例文件如下 12345P34 2255255 0 0 0 255 0 0 0 255 255 255 0255 255 255 0 0 0 128 128 128 255 0 255 P6 格式则是把数据存储从 ASCII 格式改成了二进制格式,除此之外和 P3 格式一样。 参考资料: https://x.com/ts...
采样定理的演示实验
采样定理在实际测量中,很多信号本来是连续变化的,例如声音、机械振动、电压、电流等。但计算机只能记录离散数据,所以我们需要每隔一小段时间测一次。 问题:采样频率要多高,才能从离散数据中正确看出原信号的频率信息? 采样定理给出的回答非常简单明确:如果信号中最高的有效频率是 $f_{\max}$,那么采样频率 $f_s$ 应该满足 $f_s / 2 > f_{\max}$,其中 $f_s / 2$ 叫做 Nyquist 频率,表示在当前采样频率下能可靠分辨的最高频率。 一些说明为什么采样频率存在下限要求? 如果采样频率太低,高频信号不会简单地消失,而是会“折叠”成低频信号,这叫混叠。 例如真实信号里有一个 $70\ \mathrm{Hz}$ 的频率成分。如果采样频率是 $100\ \mathrm{Hz}$,那么 Nyquist 频率是 $50\ \mathrm{Hz}$。由于 $70$ Hz 超过了 $50$ Hz,它会在采样后表现成 $100-70=30\ \mathrm{Hz}$,也就是说:$70\ \mathrm{Hz} \to 30\ \...
LLM 代码练习——在 shell 中询问大模型
一个简单的代码练习,解决编程实践中的痛点问题:直接在 shell 中询问大模型具体的 shell 命令。 类似的项目: https://github.com/TheR1D/shell_gpt https://github.com/ChenZiHong-Gavin/easy-shell 完整源码(无任何非标准库的依赖) 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714...
中点圆算法
算法介绍中点圆算法(Midpoint Circle Algorithm)是计算机图形学中的一个经典的算法,用于在离散的像素网格上画圆。在离散的像素网格上绘制连续曲线时,核心挑战在于光栅化决策。Bresenham 思想为其提供了一套高效的解决方案: 离散化逼近:利用像素中心坐标的整数特性。 决策参数更新:通过判别式的符号指导下一步像素的选择 根据对称性,只需要绘制 1/8 圆 每次候选像素有两个,计算其中点位置,如果中点在圆内,使用外侧候选像素,否则使用内侧候选像素 整数化规约:将复杂的平方、开方或三角函数运算转化为简单的整数加减法。 具体推导默认圆以原点为圆心,并且只接受整数半径,圆的隐式方程如下 $$f(x, y) = x^2 + y^2 - R^2$$ 若 $f(x, y) < 0$ 点在圆内,$> 0$ 点在圆外。 在第一象限的八分之一圆弧($0 \le x \le y$)中,从像素点 $P_1(0,r)$ 开始,已知当前像素点 $P_i(x_i, y_i)$,每次沿着 $x$ 轴步进一格,下一个像素点只有两个候选: $P_1(...
Cpp std::filesystem 学习笔记
关于 C++17 标准库 std::filesystem 的整理笔记。 概述std::filesystem 是 C++17 引入的标准库模块,用于对文件和目录进行跨平台操作。它提供了文件路径管理、目录操作、文件判断、遍历、创建和删除等功能,使用时无需依赖操作系统特定 API。 由于 Linux 系统和 Windows 系统的文件系统确实存在很多差异,虽然 std::filesystem 的设计目标是屏蔽平台差异,但实际使用中仍然会存在细微差异。这里以 Linux 平台为主进行实验,Windows 平台会存在分隔符等差异。 在导入头文件时,一般对命名空间使用如下别名缩写 123#include <filesystem>namespace fs = std::filesystem; 路径基础std::filesystem 的核心类型是 std::filesystem::path,用于表示文件或目录的路径,它并不会具体指代相对路径或绝对路径,只是简化了一些对路径常用的字符串解析操作,然后再对接底层提供的文件系统操作。 创建路径对象可以直接使用字符串创建路径 12std::...
C++ Import std 尝试
记录一下如何使用 C++20 和 C++23 所提出的模块,尤其是 std 模块。 编译环境: Linux 系统 Ubuntu 24 clang++20,使用libc++ 测试代码 main.cpp123456import std;int main() { std::println("Hello, World!"); return 0;} 首先需要预编译libc++的std模块: 1clang++ -std=c++23 -stdlib=libc++ --precompile -x c++-module /usr/lib/llvm-20/share/libc++/v1/std.cppm -o std.pcm 得到的产物 std.pcm 存放在当前目录,然后和源文件一起进行编译 1clang++ -std=c++23 -stdlib=libc++ -fmodule-file=std=std.pcm main.cpp -o main 最终可以顺利编译,没有报错,正常输出 Hello,world! 目前只尝试了这一种做法,对于...
tcolorbox 宏包基础
LaTeX 的 tcolorbox 宏包是最常见的盒子样式美化宏包,在各个模板中都广泛使用,tcolorbox 宏包的功能非常复杂丰富,文档长达五百多页,还可以深度结合 tikz 得到更丰富的样式。下面简单记录一下 tcolorbox 最基础的一些用法,这里使用 lipsum 宏包生成对应的填充文本。 tcolorbox 宏包的功能模块化,可以按需进行导入,为了使用方便,可以直接加上 [most] 选项 1\usepackage[most]{tcolorbox} 首先从 tcolorbox 环境开始,用法如下 123\begin{tcolorbox}[<options>] \lipsum[1][1-3]\end{tcolorbox} 可以通过可选参数来设置盒子的样式,最基础的选项包括: colback: 背景色 colframe: 边框色 title:盒子标题 注意: 不设置任何选项则会使用默认样式; 如果出现重复选项,不会报错,后者会对前者进行覆盖。 例如 1234567\begin...
LaTeX Tikz 绘图积累
Tikz 绘图的内容非常复杂,目前没有精力去仔细学习,只是简单记录一些可能用到的例子。一部分例子是我自己绘制的,更多的则是参考的网上公开资料。 Tikz 相关教程例如:TikZBolg。 有一些在线绘图工具可以可视化绘制简单图形,并导出 Tikz 代码,例如:Mathcha。 对于更复杂的需求,可以使用专业的矢量图绘制软件(例如 Inkscape) 绘制并导出 Tikz 代码。 函数图像 1234567891011121314151617181920\documentclass[border=2mm]{standalone}\usepackage{amsmath,amssymb,amsfonts,amsthm}\usepackage[dvipsnames]{xcolor}\usepackage{tikz}\begin{document}\begin{tikzpicture} \draw[->] (-0.5, 0) -- (6, 0) node[ab...
