加载头像

我的日常设备与工作环境。

硬件配置

MacBook Pro

项目 配置
芯片 Apple M1 Pro
内存 32 GB统一内存
硬盘 1 TB SSD
屏幕 16英寸Liquid Retina XDR 120Hz
系统版本 macOS 26

UTM虚拟机运行Windows 11与Arch Linux。

华硕天选6 Pro

项目 配置
CPU AMD Ryzen 9 8940HX(16核 / 32线程)
显卡 Radeon 610M核显 + NVIDIA GeForce RTX 5060 Laptop 8 GB
内存 16 GB × 2 DDR5双通道
硬盘 1 TB三星NVMe SSD
屏幕 16英寸2.5K 165Hz

Windows 11 + Arch Linux双系统。

设备环境

环境

两个文件分工:~/.zprofile(33行)先加载,只管路径骨架与brew镜像;~/.zshrc(891行)是主体,管工具链与行为。当前shell共142个环境变量。两者都调用brew shellenv,zshrc在后、优先级更高。

zshrc开头自定义两个去重函数,全文所有路径追加都走它们。原因写死在注释里:裸写export PATH="$X:$PATH"不带去重,rf重载一次就多一份——实测PATH从40条涨到44条。

1
2
path_add()    { case ":$PATH:" in *":$1:"*) ;; *) export PATH="$1:$PATH" ;; esac }   # 前置,优先级高
path_append() { case ":$PATH:" in *":$1:"*) ;; *) export PATH="$PATH:$1" ;; esac } # 后置,优先级低

zprofile则用zsh数组一次性铺骨架,先剔掉废弃的Python 3.13路径,再typeset -U去重:

1
2
3
4
eval "$(/opt/homebrew/bin/brew shellenv)"; typeset -U path PATH
path=("${(@)path:#/opt/homebrew/opt/python@3.13/libexec/bin}")
path=("$HOME/Library/Python/3.14/bin" "$HOME/.local/bin" "$HOME/.cargo/bin" "$HOME/.bun/bin" $path)
export PATH
1
[[ -r "$HOME/miniforge3/etc/profile.d/conda.sh" ]] && source "$HOME/miniforge3/etc/profile.d/conda.sh"

工具链替代

brew版顶掉系统旧版(make 4.4、curl 8.21),TinyTeX替代6.4GB的MacTeX;交互增强由zoxide、fnm、fzf与三个插件承担:

1
2
3
path_add "/opt/homebrew/opt/make/libexec/gnubin"; path_add "/opt/homebrew/opt/curl/bin"
eval "$(zoxide init zsh)"; eval "$(fnm env --use-on-cd --shell zsh)"
setopt PROMPT_SUBST APPEND_HISTORY INC_APPEND_HISTORY

密钥(已迁Keychain,文件里无明文)

读取后再export,更新用security add-generic-password ... -U:

1
2
3
IWENCAI_API_KEY="$(security find-generic-password -a "$USER" -s IWENCAI_API_KEY -w 2>/dev/null)"; export IWENCAI_API_KEY
NVIDIA_API_KEY="$(security find-generic-password -a "$USER" -s NVIDIA_API_KEY -w 2>/dev/null)"; export NVIDIA_API_KEY
export IWENCAI_BASE_URL=https://openapi.iwencai.com

网络与镜像

vpn默认端口7897(可传参),设六项代理变量并切回官方源;unvpn全部unset并切清华源与npmmirror。两者都用_ZSH_RF抑制横幅,避免rf时刷屏:

1
2
3
4
5
PROXY_PORT=7897
vpn() { local p="${1:-$PROXY_PORT}"; export http_proxy="http://127.0.0.1:$p" all_proxy="socks5://127.0.0.1:$p"
unset HOMEBREW_BOTTLE_DOMAIN PIP_INDEX_URL; npm config delete registry 2>/dev/null }
unvpn() { unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY
export PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple" }

HF走镜像是因为huggingface.co本机直连超时,hf-mirror实测4.87 MB/s:

1
export HF_ENDPOINT=https://hf-mirror.com

本地化与其他

只设LANGUAGE不动LANG:tealdeer(Rust)读LANGUAGE生效,而不影响glibc程序报错语言与LC_COLLATE排序。

1
2
export LANGUAGE=zh_CN:zh:en      # 中文优先,无中文页回落英文
export LC_TIME=zh_CN.UTF-8 # 只控制时间格式

重载函数写成unalias + function双保险,防止老会话残留alias导致parse error:

1
2
unalias rf 2>/dev/null
function rf { _ZSH_RF=1; source ~/.zshrc; unset _ZSH_RF; print -P "%F{240}已重载%f" }

工具

  • 使用uv统一管理3.9到3.14的多个Python版本,方便在不同项目、兼容性测试和版本切换之间快速调整,不用再去配pyenv或系统自带Python。

    • 主力开发环境固定使用uv管理的Python 3.14,日常开发、调试和运行都基于这个版本,保证主环境干净、可复现。
    • 其他3.9到3.13的版本主要用来做兼容性验证和CI矩阵测试,确保代码在较旧版本上也能正常工作。
    • 版本约束可以通过pyproject.toml里的requires-python配合uv python pin来固定,依赖则用uv.lock锁定,整体环境更稳定、可追踪。
    • 全局homebrew安装的Python仅用于执行全局脚本。
  • 连续两次path_add,后加的那条排最前、优先级最高。注意3.14的libexec只给python/pip/wheel,没有python3——它由/opt/homebrew/bin/python3提供,同为3.14.7。

1
2
path_add "$HOME/Library/Python/3.14/bin"
path_add "/opt/homebrew/opt/python@3.14/libexec/bin" # 后加 = 排第一

pip/pip3被写成同名函数拦截(函数优先级高于PATH,覆盖所有环境的pip),只提示用uv并返回127;临时绕过要command pip:

1
2
3
pip()  { print -u2 "请使用uv构建"; return 127; }
pip3() { print -u2 "请使用uv构建"; return 127; }
alias py="python"; alias ui="uv init"; alias ur="uv run" # 共 6 条 uv 别名

conda只在脚本存在时source,不自动激活base:

  • 使用fnm统一控制node版本。已经下载了node16-26,并把node26设为默认版本,日常默认直接使用node 26,需要时再按项目切换到其他版本。

    • 全局Homebrew不安装node,避免版本在PATH上冲突
    • Node相关环境尽量都交给fnm,保证版本干净、可控,也方便后续按项目灵活切换不同Node版本。
    • 使用更快的pnpm安装而不是传统的npm。
  • 使用uvr作为R的版本控制工具。

    • 通过uvr集中安装、切换和锁定不同的R版本,按项目或全局需求指定要使用的版本,确保开发、测试和部署时都基于一致的R环境。
  • 使用RStudio编写R代码。

  • 使用新型的、用Rust写的新式命令或工具,替代那些传统的Unix命令。

    • 用fd替代find,用procs替代ps,用btop和btm替代top和htop来监控系统资源,用eza替代ls,以及用zellij替代tmux来做终端复用,等等。
    • 这类工具通常启动快、性能好、跨平台,默认就带彩色高亮和更友好的输出,配置也更简单,日常开发和运维时能明显提升终端里的效率与体验。
  • 想用Docker来做一些必要的操作,比如搭建环境、部署服务,或者跑一些临时工具,可我对Docker其实完全不算会,连基本命令和镜像、容器之间的关系都还没弄明白。

    • 就干脆凭感觉胡乱下载了一堆镜像,想着先囤着再说,之后大概率总会有派上用场的时候;就算现在暂时用不到,以后真遇到需要时,至少也能少一点临时下载。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
macbook ~ % docker images
i Info → U In Use
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
alpine:3.24 5b02b42e375f 13.6MB 4.28MB
debian:trixie-slim a99cfc517144 142MB 32.2MB
hello-world:latest 5e2309035332 22.6kB 10.3kB
nginx:stable-alpine 985220252f38 92.9MB 26.9MB
node:24-slim 2fe369e96955 351MB 83.3MB
node:26-slim ec7758ee051e 377MB 88.2MB
python:3.10-slim fd76ade0c607 223MB 50.9MB
python:3.12-slim 78387bc3881b 216MB 49MB
python:3.13-slim 9d2e5553305c 215MB 48.8MB
python:3.14-slim cad9a2c87176 217MB 49.2MB
python:3.9-slim 2d97f6910b16 211MB 47.5MB
rocker/r-base:4.6.1 d7efed9aba87 1.39GB 389MB
rocker/rstudio:4.6 32446ec39713 4.53GB 1.12GB
ubuntu:26.04 9559ceb7c21e 180MB 44.5MB

avatar
陈鑫宇的个人博客:A股量化交易、Python 工具链与实践笔记
公告
📌 本站记录 A 股量化、Python 工具链与实践笔记
博客快捷键
shift K
关闭快捷键功能
shift A
打开/关闭中控台
shift M
播放/暂停音乐
shift D
深色/浅色显示模式
shift S
站内搜索
shift R
随机访问
shift H
返回首页
shift F
友链鱼塘
shift L
友链页面
shift P
关于本站
shift I
原版/本站右键菜单
引用到评论
随便逛逛博客分类文章标签
复制地址关闭热评深色模式轉為繁體