1 个三级分类
三级分类
技术体系化整理、工程实践与开发笔记。
专题分组
1 个三级分类
三级分类
2 个三级分类
3 个三级分类
2 个三级分类
2 个三级分类
3 个三级分类
1 个三级分类
三级分类
Python 开发从 PyCharm 迁移到 Cursor 调试 Python 项目时,最容易遇到的问题是模块导入路径不再由 IDE 自动补齐,导致运行当前文件时出现 ModuleNotFoundError。文章给出的常规做法是在项目下创建 .vscode/launch.json,配置 Python launch 任务,并通过 env 中的 PYTHONPATH: ${workspaceFolder} 手动把工作区加入模块搜索路径,相当于复刻 PyCharm 的 Mark Directory as Sources Root。它也解释了 Python 默认只会搜索标准库、site-packages 和当前脚本目录,因此在 VS Code/Cursor 这类编辑器中需要显式声明项目根路径。针对 conda 环境,文章进一步给出 settings.json 中固定 python.defaultInterpreterPath,以及 launch.json 中指定 python 解释器路径、保留 PYTHONPATH、设置 PYTHONUNBUFFERED=1 的配置方式,以便调试控制台正常输出日志。需要注意的是,Python Environment Manager 等环境管理插件可能在选择环境时自动重写 settings.json,与 launch.json 中的解释器配置冲突,并引发 permission denied,因此作者建议删除相关插件。整体适合正在从 PyCharm 转向 Cursor、希望降低内存占用但仍保留 Python 单文件调试和 conda 环境调试能力的开发者参考。
开发工具这篇记录围绕 OrbStack 的 Linux Machine 模式,说明如何在 macOS 上快速创建一个轻量级 Ubuntu 隔离环境,用于临时测试、运行脚本或准备不同架构的 Linux 用户态。正文给出的核心流程很直接:通过 brew 安装 OrbStack,使用 `orb create ubuntu guardian-test` 创建机器,再用 `orb -m guardian-test` 进入;如果需要 x86/amd64 环境,则用 `orb create -a amd64 ubuntu guardian-x86` 单独创建。文章强调 OrbStack 相比 Docker Desktop、Multipass 的优势在于基于 macOS 原生轻量级虚拟化框架,空闲内存、启动速度和 CPU 占用都更适合日常开发中的短时隔离需求。需要特别注意的是,OrbStack 默认开启文件系统共享,Linux 内的 `/mnt/mac`、`/Users`、`/Volumes` 等路径可能直接映射到 Mac 真实文件,未知脚本若删除这些目录下的内容,会影响宿主机数据。为降低风险,作者建议高风险脚本只在 `/root` 或 `/home/linux_user` 等 Linux 内部目录运行,并提供了手动卸载共享挂载点以及写入 `/etc/rc.local` 实现开机自动卸载的命令。最后还补充了分流规则配置中的网络模式注意点:不能使用 fake-ip,需要切换到 host 模式,否则规则里看到的可能都是内网 IP。
Python 开发这篇笔记聚焦 FastAPI 中使用 ORJSONResponse 提升 JSON 响应序列化性能的原因与配置方式,核心场景是接口返回大列表、大 JSON 或包含时间字段等复杂类型的数据库记录。正文将默认 JSONResponse/标准库 json 与 orjson 的路径拆开比较:前者通常先把 Python 对象转换成 Python str,再由 Web 层编码成 UTF-8 bytes;orjson 则直接生成可网络传输的 UTF-8 字节,减少一次全量内存拷贝和编码转换。文章还解释了 orjson 采用 Rust 实现、面向速度优化并利用 SIMD 的背景,以及它对 datetime、UUID、numpy、dataclasses 等类型的原生支持如何避免频繁回调 Python 函数,从而降低额外开销和 GIL 争用。实践部分给出安装 orjson、导入 ORJSONResponse,并通过 FastAPI(default_response_class=ORJSONResponse) 设置全局默认响应类的示例。性能判断上,文中认为纯序列化微基准可能达到标准库的 5 到 10 倍,但在真实 Web 接口里收益取决于响应体大小和瓶颈位置。对于只返回极小 JSON 的接口,网络 IO 可能掩盖差异;而返回几千行记录、数 MB JSON 或大量 datetime 字段时,ORJSONResponse 更可能带来可感知的响应时间下降。
这篇解释围绕“洛杉矶同城机房为什么能测到约 1ms Ping”展开,把低延迟拆成物理距离、互联枢纽和链路形态三个层面。正文先用光在光纤中约 20 万公里/秒、Ping 是往返时间来估算:1ms 足够覆盖约 100 公里往返,而洛杉矶核心区域之间的实际光纤传播耗时通常只占 0.1ms 到 0.3ms,剩余时间主要来自路由器处理和排队。随后文章指出,洛杉矶的很多 IDC、运营商和海底光缆接入点会汇聚到 One Wilshire 这类西海岸重要网络枢纽,所谓不同“洛杉矶机房”在网络层面可能只是隔着几层楼或几条街。它还进一步区分了 IDC 之间的暗光纤、内网直连与普通公网绕行的差异,说明低延迟并不只取决于地图上的城市大小,而取决于实际走线和交换位置。文章最后用家庭宽带访问 IDC 作对照,提到 BRAS、计费、鉴权、NAT 等运营商环节会引入额外路径和处理成本。适合网络学习者、VPS 用户和运维人员理解同城机房延迟测试结果,避免把“洛杉矶很大”直接等同于“网络一定很远”。
这份配置记录面向那些 Docker 镜像本身没有账号密码、但又不适合直接开放给公网访问的服务,核心思路是在端口暴露和反向代理两层同时收紧入口。服务侧先在 docker-compose 的 ports 中使用 127.0.0.1:3033:8081 这种绑定方式,让容器端口只接受本机访问,避免外部绕过 Nginx 直接连到后端。随后在服务器上安装 apache2-utils,并通过 htpasswd -c /etc/nginx/.htpasswd admin 创建基础认证所需的账号密码文件。Nginx 配置部分则是在对应的 location / 代理块中加入 auth_basic 和 auth_basic_user_file,前者开启浏览器弹窗式的 Basic Auth,后者指定刚生成的密码文件。完成修改后执行 systemctl reload nginx 重新加载配置,即可让访问该反向代理路径的用户先通过密码验证。它适合临时保护管理后台、自用工具或轻量服务,但前提是请求确实都经过 Nginx,且后端端口不要再以 0.0.0.0 形式暴露。
服务器与部署这份记录聚焦在更换 VPS 后重新部署 Discourse 时,如何基于官方 discourse_docker 仓库重新生成环境,而不是直接搬迁旧目录。配置核心集中在 containers/app.yml:只启用 Web 与限流模板,将容器 80 端口绑定到本机 127.0.0.1:37880,便于前面再由 Nginx 做反向代理,同时用 DISCOURSE_HOSTNAME 指定对外域名。数据库与缓存被拆分处理,PostgreSQL 通过外部地址连接,Redis 则放在 Docker 内网中,Discourse 需要通过 docker_args 加入同一个 mynetwork,Redis 未设置密码时可仅依赖内网访问。邮件服务也是部署前提之一,需要提前准备 SMTP 地址、端口、用户名、密码和 STARTTLS,否则 Discourse 的注册、通知等基础功能会受影响。文章特别指出反代 HTTPS 场景下要设置 DISCOURSE_FORCE_HTTPS,让容器内部仍走 HTTP 时也能生成正确的 HTTPS 外链,避免站点链接或资源地址异常。最后通过 after_code hook 安装 PostgreSQL 16 客户端,并强制修正 pg_dump、psql 软链接,用来匹配外部数据库版本,适合已经熟悉 Docker、Nginx 和基础服务拆分部署的站点维护者参考。
服务器与部署这篇记录聚焦 GCP 免费服务器启用后的两类容易被忽略的问题:免费额度相关扣费项检查,以及面向个人小服务场景的防火墙收紧。费用部分强调先确认是否存在 snapshots 快照,若有需到 disks 相关页面处理;同时检查磁盘类型、容量是否符合标准型 30GB 的免费配置,并留意实例区域选择,否则即使实例本身来自免费套餐,也可能因快照、磁盘或区域不匹配产生费用。网络策略上,作者采用较激进的最小暴露思路,入站只放行自己使用的三个 IP,其他访问全部禁止,且明确该机器只是挂载小服务,不承担代理用途。出站控制没有直接在 GCP 防火墙里细分,而是在实例内通过 ipset 与 iptables 建立 CUSTOM_OUT_BLOCK 链,将中国、澳大利亚以及 Cloudflare、Fastly、Akamai 等网段批量导入 out_block_list,并在 OUTPUT 链首匹配后丢弃。脚本执行前需要先借助其他节点代理完成下载,因为封锁列表来源本身可能依赖 CDN;运行后日志显示规则已挂载,并累计屏蔽约 26130 个出站网段。它更适合已经会使用 GCP 免费实例、希望减少误扣费并按个人访问范围加固服务器的用户参考,不应直接当作通用云防火墙模板套用。
数据库与缓存这篇笔记聚焦 Redis Pub/Sub 的发布订阅机制,核心定位是低延迟广播而非队列消费:发布者把消息写入 Channel,Redis 通过 SUBSCRIBE、PSUBSCRIBE 建立的订阅关系,将消息推送给所有当前在线的订阅连接。正文用 live_room:123 这类房间频道说明了订阅、发布、接收、取消订阅以及 PUBSUB 查询命令的基本用法,并给出 FastAPI 多进程房间广播示例:各节点订阅 live_room:*,收到消息后解析频道中的房间号,再调用本地 WebSocket 广播函数。文章特别强调每个订阅者在 Redis 端都是独立 TCP 长连接,发布时 Redis 执行 Fan-out,遍历同一频道下所有活跃连接并各发送一份完整消息,因此它不是“谁抢到谁处理”的负载均衡模型。需要注意的是,Pub/Sub 不持久化消息,也没有 ACK、重试、死信队列或回放能力,订阅连接断开、阻塞或不可读时就可能丢失该连接上的消息。文末将它与 RabbitMQ/Kafka 的队列、Topic 和消费者组机制对比,给出选型边界:在线聊天、游戏广播、房间通知等可容忍丢失的中小规模实时场景适合 Redis Pub/Sub;若要求可靠投递、复杂路由、审计回溯或海量吞吐,则应使用专业 MQ。
数据结构这篇笔记围绕 AOE 网络梳理工程计划中的任务依赖与时间约束建模方法,说明它以有向无环图表示项目:顶点是事件,边是活动,边权是活动持续时间,源点到汇点的最长路径决定最短总工期。内容重点区分事件最早发生时间 ve、最迟发生时间 vl,以及活动的最早开始 E、最迟开始 L、最早完成时间和总时差,并给出正向取最大、逆向取最小的计算公式。拓扑排序部分解释了 Kahn 入度法和 DFS 法如何为依赖任务生成合法顺序,也说明在 AOE 网中正向推算最早时间本质上依赖拓扑序。关键路径求法采用 CPM 的“一次正推 + 一次逆推”:先从源点计算各事件 ve 和总工期,再从汇点反推 vl,最后用 E(i,j)==L(i,j) 判断关键活动。示例通过逐步计算 1 到 6 号事件的 ve、vl,展示活动 d 的最早开始和最迟开始都为 12,从而说明关键活动判定的具体过程。适合学习项目进度控制、DAG 任务编排、构建依赖分析或 Airflow、Prefect、Dagster 等调度框架底层思想的读者,用来建立从图论模型到关键路径计算的基础框架。
数据结构散列表是一篇面向数据结构初学者的基础笔记,围绕“如何用哈希函数把关键字直接映射到存储位置”展开,解释它为什么能在平均情况下获得接近 O(1) 的插入、删除和精确查找效率。内容先定义哈希函数、散列表、装填因子等核心概念,再梳理开放定址法、链地址法、线性探测、二次探测、双重散列以及直接定址、除留余数、数字分析、平方取中等构造哈希函数的方法。文章通过与顺序表、链表、二叉搜索树对比,突出散列表适合快速精确查找,但本质上是以空间换时间,并不强调有序遍历或范围查询。示例部分用 H(key)=key%7、表长 11、线性探测插入 8 个关键字,逐步展示冲突处理,并计算成功查找平均长度为 9/8,失败查找平均长度为 6。这里特别提醒失败查找的统计起点由哈希函数值域决定,虽然物理槽位是 0 到 10,但 key%7 只会产生 0 到 6,不能把 7 到 10 也纳入平均。最后补充数据结构哈希与 MD5、SHA、CRC32 等成熟哈希函数的目标差异,并说明它们在数据分片、URL 缩短、文件去重、跨平台实现和安全需求中的使用边界。