ARCHIVE

全部文章

94 篇文章
Python NumPy 数据分析指南 封面
Python / NumPy

Python NumPy 数据分析指南

NumPy 的难点不在记住函数名,而在理解数组形状、索引、广播和 dtype 如何一起影响结果。

GCDWebServer 基础使用指南 封面
iOS / WebDAV

GCDWebServer 基础使用指南

GCDWebServer 适合在 iOS 或 macOS 应用里临时提供 HTTP 服务,也能处理 WebDAV、上传和下载。

Nginx 综合指南 封面
Nginx

Nginx 综合指南

Nginx 的配置看起来只是几段 server,但请求到底走正向代理、反向代理还是静态文件,取决于指令所在的层级。

Swift 优秀的第三方库整理 封面
Swift 库

Swift 优秀的第三方库整理

iOS 项目选第三方库,先看维护状态、依赖数量和是否能覆盖当前平台,再看功能列表。

SmartPush - iOS 推送测试工具 封面
APNs

SmartPush - iOS 推送测试工具

SmartPush 把 APNs 推送测试里几项容易填错的内容集中到一个界面:证书、Device Token、Payload 和环境。

iOS 开发者模式详解 封面
iOS 调试

iOS 开发者模式详解

iPhone 的开发者模式不只是一个开关,它会影响设备配对、日志、自动化和网络调试。

RESTful API 设计规范 封面
RESTful API

RESTful API 设计规范

REST API 的可维护性,主要体现在资源命名、HTTP 方法、状态码和错误格式是否前后一致。

MyBatis Plus 框架详解 封面
MyBatis Plus

MyBatis Plus 框架详解

MyBatis-Plus 在 MyBatis 上补了一层通用 CRUD、条件构造器和分页能力。

Docker 容器化最佳实践 封面
Docker

Docker 容器化最佳实践

容器能启动不等于镜像适合长期运行。这里从镜像、进程、网络、数据卷和发布检查几个方面,整理一套实际部署时能用的 Docker 习惯。

TypeScript 高级类型系统 封面
TypeScript

TypeScript 高级类型系统

TypeScript 的高级类型真正有用的地方,是把重复的运行时判断提前交给编译器。

Spring Boot 3.0 新特性详解 封面
Spring Boot

Spring Boot 3.0 新特性详解

Spring Boot 3 的变化不只是一组新特性,还包括 JDK 17 基线、Jakarta 命名空间和原生镜像支持。

Vue3 Composition API 深度解析 封面
Vue3

Vue3 Composition API 深度解析

Composition API 让 Vue 组件可以按逻辑组织代码,而不是把数据、方法和生命周期拆在不同选项里。

iOS 耗电量检测与优化 封面
iOS 性能

iOS 耗电量检测与优化

耗电优化不能只盯着某一段代码。先用 Energy Impact 和 Instruments 找到高耗电区,再分别检查刷新、网络、定位、后台任务和图片处理,效果更容易验证。

Vapor 从0开始:用 Swift 写后端与网站的完整教程 封面
Vapor 教程

Vapor 从 0 开始:系列总览

用纯 Swift 基于 SwiftNIO 写后端与网站,从环境搭建、路由、数据库 CRUD 到部署一站打通。

路由与请求处理 封面
路由

路由与请求处理

路由就是 URL 和处理函数之间的映射。这里用 GET、POST、路径参数和 JSON 请求,把客户端到处理逻辑的完整路径走一遍。

控制器与 MVC 架构 封面
架构

控制器与 MVC 架构

路由少时写在 routes.swift 里还能看懂,数量一多就难维护。

用 Leaf 渲染动态网页 封面
模板

用 Leaf 渲染动态网页

要把缩略语网站渲染成 HTML,路由需要返回 Leaf 视图而不是 JSON。

Fluent 数据库与 RESTful CRUD 封面
数据库

Fluent 数据库与 RESTful CRUD

Fluent 把模型操作映射到数据库,但第一次配置时要同时处理驱动、迁移和 CRUD。

用户认证:密码哈希与 Token 封面
认证

用户认证:密码哈希与 Token

用户认证先解决密码和令牌,而不是先做登录页面。这里从 Bcrypt 哈希、用户名唯一性和 Token 签发开始,再把认证与授权的边界分开。

部署到自己的云服务器 封面
部署

部署到自己的云服务器

本地能访问不等于部署完成。这里从 Ubuntu、Docker 数据库和 Vapor 进程开始,最后用 Nginx 把外部的 80/443 转到应用端口。

第一次使用 AI,先理解这 7 件事 封面
AI 入门

第一次使用 AI,先理解这 7 件事

第一次用 AI,先别急着背工具名称。模型为什么会编、长文本为什么会漏、token 怎么算,以及 RAG 和 Agent 何时值得引入,这七件事决定了后面的使用方式。

从 0 开始理解大语言模型 封面
大模型

从 0 开始理解大语言模型

想把 LLM 用到工程里,先要知道 token 如何进入模型、注意力为何昂贵,以及训练和推理分别花在哪里。

Prompt 工程:让模型稳定输出 封面
Prompt

Prompt 工程:让模型稳定输出

稳定的提示词更像一份小型接口契约:输入是什么、输出长什么样、哪些信息不能越过,都要写清楚。

AI Agent 的最小闭环 封面
Agent

AI Agent 的最小闭环

Agent 真正难的不是把模型接上工具,而是让它在长链路里及时停下、回退并留下证据。

开发环境准备 封面
Vapor 大型教程

开发环境准备

先把 Swift、Vapor 工具箱和编辑器准备好,后面的示例才有一致的运行环境。

Vapor 工具箱能力 封面
Vapor 大型教程

Vapor 工具箱能力

Vapor 工具箱负责创建项目、生成 Xcode 工程和启动服务。

添加路由 封面
Vapor 大型教程

添加路由

添加路由的关键是先定清 URL、HTTP 方法和处理函数。

HTTP 基础 封面
Vapor 大型教程

HTTP 基础

写接口前先把 HTTP 的请求、响应、方法和状态码对上。

返回 JSON 数据 封面
Vapor 大型教程

返回 JSON 数据

接口返回 JSON 前,先定义可编码的类型,再让路由负责解码和编码。

接收客户端数据 封面
Vapor 大型教程

接收客户端数据

POST 请求里的 JSON 需要先解码成类型,再进入业务逻辑。

异步与 Future 封面
Vapor 大型教程

异步与 Future

Vapor 3 用 Future 表达尚未完成的结果。

SwiftNIO 原理 封面
Vapor 大型教程

SwiftNIO 原理

Vapor 的请求处理建立在 SwiftNIO 上。

控制器与 RouteCollection 封面
Vapor 大型教程

控制器与 RouteCollection

RouteCollection 让控制器自己注册路由,应用入口只负责挂载模块。

配置数据库 封面
Vapor 大型教程

配置数据库

数据库驱动决定数据存在哪里,配置方式也会随驱动变化。

Fluent 模型持久化 封面
Vapor 大型教程

Fluent 模型持久化

一个模型真正可用,除了定义字段,还要有 Migration 把表建出来。

数据库 CRUD 操作 封面
Vapor 大型教程

数据库 CRUD 操作

CRUD 接口把 Acronym 的新增、查询、修改和删除分别落到 HTTP 方法上。

Fluent 查询 封面
Vapor 大型教程

Fluent 查询

Fluent 查询从 all() 和 first() 开始,还包括过滤、或条件、排序和取首条记录。

数据库种子数据 封面
Vapor 大型教程

数据库种子数据

新环境的数据库是空的,但写接口又需要先登录。这里在 Migration 中插入管理员账号,并说明种子数据为什么要保持可重复执行。

父子关系(外键) 封面
Vapor 大型教程

父子关系(外键)

用户和缩略语、宠物和主人都属于一对多关系。这里用外键把子表指向父表,并处理表创建顺序与约束检查。

兄弟关系(多对多) 封面
Vapor 大型教程

兄弟关系(多对多)

多对多关系不能只靠一列外键表示,需要一张 Pivot 表保存两边的 ID。

用户认证概述 封面
Vapor 大型教程

用户认证概述

认证流程除了验证密码,还要保证用户名唯一,并且不把密码带回响应。

Basic 认证 封面
Vapor 大型教程

Basic 认证

给接口加 Basic 认证,服务端需要从 Authorization 头取出用户名和密码,再决定是否继续处理请求。

Token 认证 封面
Vapor 大型教程

Token 认证

Basic 认证每次都带密码,Token 认证则把登录和后续请求分开。

为认证更新测试用例 封面
Vapor 大型教程

为认证更新测试用例

认证接入后,原来的测试请求少了 Authorization 头,失败是必然的。

构建 REST API 封面
Vapor 大型教程

构建 REST API

REST 把资源、URL 和 HTTP 方法组合起来,但规范不是把四个动词贴到路径上。

API 模板与约定 封面
Vapor 大型教程

API 模板与约定

Vapor 模板工程并不神秘:Package.swift 管依赖,Sources 放应用代码,Tests 放测试。

工程结构 封面
Vapor 大型教程

工程结构

模板项目启动后,先看清目录比直接改代码更省时间。

切换到 PostgreSQL 封面
Vapor 大型教程

切换到 PostgreSQL

SQLite 适合起步,但外键和并发场景会逼你换数据库。

测试基础 封面
Vapor 大型教程

测试基础

接口测试要能重复运行,测试数据库就不能和开发库混在一起。

测试进阶与重构 封面
Vapor 大型教程

测试进阶与重构

测试代码里重复的建应用、重置数据库和发请求逻辑,应该抽到公共辅助方法。

常见错误排查 封面
Vapor 大型教程

常见错误排查

Vapor 的错误常常不是代码本身:缓存、生成文件、依赖版本和配置都可能影响结果。

其它测试用例 封面
Vapor 大型教程

其它测试用例

一个测试用例验证不了整条接口链路。这里补上新增用户、按 ID 查询,以及 User/Acronym、Acronym/Category 关联的测试。

在 Linux 上测试 封面
Vapor 大型教程

在 Linux 上测试

本地 Mac 通过的测试,到了 Linux 可能会暴露 Foundation 或路径差异。

部署到私有服务器 封面
Vapor 大型教程

部署到私有服务器

私有服务器部署的步骤并不多:数据库、应用、反向代理和 TLS。

部署到 Vapor Cloud 封面
Vapor 大型教程

部署到 Vapor Cloud

Vapor Cloud 的部署流程可以压缩成几个命令,但失败后怎么取消、资源怎么清理同样重要。

Leaf 模板引擎 封面
Vapor 大型教程

Leaf 模板引擎

返回 JSON 适合接口,返回 HTML 才能组成网站。

中间件 封面
Vapor 大型教程

中间件

中间件位于请求和响应之间,适合放认证、日志、跨域和错误处理。

数据校验 封面
Vapor 大型教程

数据校验

表单数据默认不可信,字段规则和跨字段规则都要在服务端检查。

Cookie 与 Session 封面
Vapor 大型教程

Cookie 与 Session

登录状态需要在请求之间保存,Cookie 和 Session 负责记住这件事。

提供文件下载 封面
Vapor 大型教程

提供文件下载

静态资源应该由明确的目录提供,而不是让路由随意读取文件。

数据库迁移 封面
Vapor 大型教程

数据库迁移

数据表不会永远停在第一版。这里用 Fluent Migration 给 User 增加字段、给 Category 加唯一约束,并按环境准备管理员账号。

美化页面 封面
Vapor 大型教程

美化页面

Vapor 的功能页面能跑起来后,还需要一套不会重复的模板骨架。

缓存 封面
Vapor 大型教程

缓存

缓存的价值是少做重复工作,但命中、过期和失效策略必须先说清楚。

创建缩略语页面 封面
Vapor 大型教程

创建缩略语页面

创建缩略语需要两个接口:一个返回表单,一个接收提交的数据。

编辑缩略语页面 封面
Vapor 大型教程

编辑缩略语页面

编辑页和创建页大部分字段相同,区别在于要先取出旧记录,再把改动写回。

删除缩略语页面 封面
Vapor 大型教程

删除缩略语页面

浏览器表单没有 DELETE 方法,删除动作可以由 POST 路由承接。

全部分类页 封面
Vapor 大型教程

全部分类页

分类页分成两层:先列出全部分类,再展示某个分类下的缩略语。

添加分类 封面
Vapor 大型教程

添加分类

缩略语和分类是一个多对多关系:模型要能查询,表单要能多选,保存时还要处理新增和移除。

全部用户页 封面
Vapor 大型教程

全部用户页

用户列表不复杂,麻烦的是它要在每个页面都能被找到。

用户主页 封面
Vapor 大型教程

用户主页

用户主页先显示用户信息,再查询他创建的全部缩略语。

Google 登录 封面
Vapor 大型教程

Google 登录

Google 登录的关键不是按钮,而是 OAuth 回调、状态保存和用户绑定。

移动端(iOS)接入 封面
Vapor 大型教程

移动端(iOS)接入

Vapor 服务端跑通后,iOS 客户端还要处理明文 HTTP 和自签名 HTTPS。