JACIN Blog

深度的 AI 应用开发者

专注 AI 应用开发、Python 后端与工程实践,持续记录大模型落地、工具构建与真实项目经验。

183篇已发布
主题索引
查看全部分类
全部文章
183
RTMP协议
计算机知识
13 分钟

RTMP协议

这篇内容围绕 RTMP 协议在直播与流媒体链路中的作用展开,先说明它是 Adobe/Macromedia 设计的实时消息传输协议,运行在应用层并通常依赖 TCP 1935 端口提供可靠传输。文章把 RTMP 的使用价值放在直播场景中解释:推流端如 OBS 或推流 SDK 将音视频送入 SRS、Nginx-RTMP、Wowza 等服务器,服务器再面向观众侧转成 HTTP-FLV、HLS 或 WebRTC 等更适合播放和互动的协议。正文重点梳理了完整连接流程,从 TCP 三次握手、C0/C1/C2 与 S0/S1/S2 的 RTMP 握手,到 connect 指定 app、stream key 和认证信息,再到 createStream 获取 stream_id,最后通过 publish 或 play 进入推流、拉流阶段。数据传输部分强调 RTMP 通过 Chunk 分块与消息机制持续传递音频帧、视频帧和 metadata,并借助持久连接实现低延迟、多路复用和音视频同步。文章也补充了 RTMP URL 结构、RTMPT、RTMPS、RTMPE 等变体,以及 macOS 下可用 VLC、Live Stream Player 配合测试流地址进行验证。需要注意的是,浏览器端已不再原生适合播放 RTMP,因为 Flash 已被淘汰;同时 RTMP session 与底层 TCP 连接绑定,正常断开需经历 deleteStream、close 和 TCP 释放,异常断开或服务器踢出则会清理相关 stream。整体适合想理解直播推拉流入口协议、服务器接入流程和连接生命周期的后端、音视频与运维开发者。

谷歌tts使用与一次性生成sdk
Python 开发
15 分钟

谷歌tts使用与一次性生成sdk

这是一篇围绕 Google Cloud Text-to-Speech 快速接入与一次性生成音频文件的实践记录,适合需要在 Python 服务中把文本转换为语音并落地为文件的开发者参考。文章先从 Google Cloud 控制台入口、价格信息和每月 100 万字符免费额度讲起,随后展示启用 TTS API、创建凭证、生成服务账号密钥、赋予权限并下载 JSON 文件的配置路径。代码部分没有直接读取本地密钥文件,而是把服务账号中的 project_id、private_key、client_email、token_uri 等字段拆入环境变量和配置类,再通过 service_account.Credentials.from_service_account_info 初始化 TextToSpeechClient。一次性合成 SDK 封装为异步 synthesize 方法,支持传入文本、输出路径、language_code、ssml_gender 和 audio_encoding,并用 asyncio.to_thread 调用同步的 synthesize_speech,再通过 aiofiles 写入 MP3、LINEAR16 或 OGG_OPUS 文件。示例还演示了生成 output.mp3 后衔接 MinIO 上传,适合需要把合成音频继续发布到对象存储或 CDN 的场景。文末补充了 TTS 参数含义和云端合成链路,包括文本规范化、音素与韵律预测、神经合成、编码封装等概念,帮助读者理解一次性返回 audio_content 背后的处理流程。

Python 开发
29 分钟

谷歌tts流式生成

这篇笔记围绕 Google Cloud Text-to-Speech 的流式音频生成实现展开,重点处理中文 TTS 暂不支持原生 streaming_synthesize 的现实限制。内容先给出一种“伪流式”方案:通过 synthesize_speech 一次性拿到完整 MP3 音频,再按 1KB 等固定大小切分,用异步文件写入、yield 分片和短暂 sleep 模拟持续下发,使调用方可以边接收边播放、上传或统计,但首包仍要等服务端完成整段合成。随后演示原生流式接口的调用方式,包括选择 en-US-Chirp3-HD-Charon 声线、先发送 streaming_config、再发送文本输入,并遍历 responses 中的 audio_content 分片实现边合成边消费。文章明确指出当前原生流式仅适用于英文 Chirp 3 HD 系列,中文和其他声线需要回退到伪流式或普通合成接口。编码部分比较了非流式与流式接口的差异:前者可用 MP3、LINEAR16、OGG_OPUS 等格式,后者只支持 OGG_OPUS 和 LINEAR16,请求 MP3 会报不支持。最后从延迟、带宽和兼容性解释 PCM 与 OGG/Opus 的取舍,适合正在为 AI 语音播报、Web 播放、对象存储上传或实时语音链路选择 Google TTS 接入方式的后端和应用开发者。

Go 开发
9 分钟

go channel用法

这篇笔记围绕 Go 的 channel 基础用法展开,定位为 goroutine 之间传递数据的类型安全管道,并借 CSP 思想说明为什么 Go 鼓励用通信来协调并发,而不是让多个 goroutine 直接共享同一份内存。内容重点解释 channel 的类型化、同步阻塞、可选缓冲区和 close 后接收零值及状态标志等特性,并给出任务分发、信号通知、并发控制等常见使用场景。文章用 go func() 发送字符串的例子说明无缓冲通道的核心约束:发送和接收必须并发配对,若在同一个顺序执行流中先发送再接收,程序会停在发送语句并形成死锁。随后通过 make(chan string) 与 make(chan string, 1) 的对比,区分无缓冲通道“零容量、必须当场交付”和缓冲通道“容量未满即可暂存”的行为差异,也说明并非所有 channel 操作都必须额外启动 goroutine。最后,笔记把普通 int 变量和 chan int 放在并发语境下比较,强调变量只是存值,而 channel 用于跨 goroutine 传值、同步生产者与消费者,并减少手写锁和时序控制的复杂度,适合刚开始理解 Go 并发模型和阻塞语义的读者。

Go 开发
7 分钟

go 里面的指针

这篇笔记围绕 Go 语言中的指针基础展开,先用 `a := 10`、`p := &a` 和 `*p` 说明指针就是变量的内存地址,`&` 用于取地址,`*` 用于通过地址访问或修改值。内容重点澄清 Go 与 C 在指针上的差异:Go 可以声明 `*int` 这类指针类型,但不支持指针算术,不能随意转换指针类型,复杂的多级指针也不鼓励使用,内存分配由 `new`、`make` 和 GC 机制配合完成。文章通过 `modify(x *int)` 的例子解释函数修改外部变量的过程:传入的是 `&a` 这个地址值,函数参数仍然按值接收,只是可以通过解引用修改地址指向的原始数据。结构体指针部分展示了 `p.Name` 与 `(*p).Name` 的等价关系,说明 Go 会在访问结构体字段时自动解引用,以减少样板代码。笔记还提醒切片、map、channel 等内置类型本身具有引用语义,通常不需要再显式传指针。最后,它集中纠正了“Go 是引用传递”“new 和 make 一样”“指针越多越高效”等常见误区,适合正在从 C、JavaScript 或其他语言迁移到 Go、需要理解值传递与可变性控制的初学者。

Go 开发
10 分钟

gorm配置数据库

这份笔记面向 Go Web 项目中使用 GORM 接入数据库的基础配置场景,以 PostgreSQL 为例展示了将连接初始化放在 infra 目录下的组织方式。正文先概括 GORM 作为 ORM 的常见能力,包括多数据库支持、自动迁移、事务、预加载、钩子、软删除和自定义 SQL,并给出安装 gorm 与数据库驱动的命令。配置部分围绕 InitPG 展开:从 utils.AppConfig 读取主机、用户、密码、库名和端口拼接 DSN,按开发环境开启 SQL Info 日志、生产环境静默日志,再通过 gorm.Open 建立连接并取得底层 sql.DB 设置连接池参数。文章还说明 main.go 中应在加载配置后调用 infra.InitPG,并用 defer infra.ClosePG 在应用退出时关闭连接,便于服务优雅释放资源。关于 GetDB,重点澄清它只是返回全局保存的 *gorm.DB 指针,不会重复建连,也不会负责释放连接;多个请求并发调用是安全的,因为 GORM 的实例本身并不长期持有物理连接。真正执行 Find、First 等查询时,GORM 会从连接池临时借用连接并在完成后归还,但使用 Raw().Rows() 这类手动遍历结果集的写法必须显式 Close,否则可能持续占用连接池。整体适合正在搭建 Gin/GORM 项目骨架、需要理解连接池生命周期和全局 DB 访问方式的后端开发者。

Go 开发
8 分钟

docker部署 gin

这篇笔记聚焦 Gin 项目的 Docker 容器化部署,先从 Go 的部署特性解释为什么它适合做轻量镜像:Go 通过 go build 将源码、标准库和依赖静态链接为操作系统可直接执行的原生二进制文件,通常不需要在运行环境安装 Go、解释器或虚拟机。文章用 ELF、Mach-O、PE 等可执行文件格式说明二进制产物的本质,并对比 Go 与 C/C++ 在默认静态链接、交叉编译、标准库、并发和内存安全方面的差异,帮助读者理解“只拷贝可执行文件即可运行”的前提。部署部分给出多阶段 Dockerfile:先使用 golang:alpine 下载依赖并执行 go build -o gin-api-template,再切换到 alpine:latest,仅安装 ca-certificates,复制编译产物和 .env,暴露 8080 端口并以 CMD 启动程序。文章还解释 Alpine 镜像体积小、攻击面低、启动快以及基于 musl libc 和 busybox 的特点,说明为什么它常用于 Go 服务的运行阶段。最后的 docker-compose.yml 展示了构建当前目录镜像、映射 8080:8080、挂载并加载 .env、设置 unless-stopped 重启策略的基本方式,适合需要把 Gin API 打包成较小容器镜像并保持配置文件可管理的后端开发者。

Go 开发
16 分钟

gin 常见中间件配置

这篇笔记围绕 Gin API 项目的中间件基础配置展开,按 middlewares 目录下的 security.go、cors.go、request_id.go 和 logging.go 拆分说明安全响应头、跨域、请求标识与请求响应日志的实现方式。安全头部分展示了在 gin.HandlerFunc 中统一设置 X-Frame-Options、Content-Security-Policy、Referrer-Policy、Cross-Origin-Opener-Policy、X-Content-Type-Options、X-XSS-Protection,并仅在 HTTPS 或代理标记为 https 时启用 HSTS,用于降低 iframe 劫持、Referer 泄露和 MIME 嗅探等风险。CORS 配置通过应用配置读取允许来源,在开发环境回退到 localhost 与 127.0.0.1 白名单,同时明确允许方法、请求头、暴露 X-Request-ID、携带凭证和预检缓存时间。Request ID 中间件会优先复用请求头中的 X-Request-ID,没有则生成 UUID,并写入 Gin Context、工具包上下文和响应头,方便日志检索、链路追踪和前后端协同排查。日志中间件演示了读取并回填请求体、包装 ResponseWriter 捕获响应体、记录方法、路径、客户端 IP、User-Agent、状态码和耗时的做法。最后在 gin.New() 初始化的路由中给出注册顺序:Recovery、安全头、CORS、Request ID、日志,再挂载业务路由,适合作为 gin-api-template 的落地参考;但请求体和响应体日志会带来敏感信息暴露与性能开销,实际项目需要按场景裁剪。

Go 开发
11 分钟

gin框架-使用

这篇笔记围绕 Gin 框架的入门使用与并发模型展开,先定位它作为 Go 生态中轻量、高性能 Web 框架的用途,适合 RESTful API、微服务接口网关、后台管理系统和轻量级后端模块等场景。正文用一个 /ping 路由示例展示 Gin 启动 HTTP 服务、注册 GET 路由并返回 JSON 的最小写法,同时概括其中间件、参数绑定、错误处理、路由分组以及与 Swagger、JWT、Gorm、Zap 等库集成的常见能力。文章还把 Gin 放到容器化和云原生背景下理解,说明 Go 静态编译、二进制文件易分发、镜像可精简、启动快和适配 CI/CD 的特点,为什么与 Docker、Kubernetes 等基础设施生态契合。重点部分解释了 Gin“同步风格编程、goroutine 并发处理请求”的模型:业务代码看起来线性直观,但每个 HTTP 请求通常由独立 goroutine 承载,因此慢接口不会天然阻塞其他请求。最后通过 FastAPI 对比 async/await、事件循环、阻塞 IO、GIL 和协程调度差异,帮助读者判断 Go/Gin 与 Python/FastAPI 在易用性、吞吐和阻塞风险上的取舍。适合正在学习 Go 后端、准备做 API 服务或想理解 Gin 并发机制与容器化部署优势的开发者阅读。

go 环境搭建
Go 开发
9 分钟

go 环境搭建

这是一篇面向 Go 初学者的本地开发环境与项目结构入门笔记,覆盖从安装 Go、配置 GOROOT 与 PATH、验证 go version,到在 GoLand 中选择 SDK 的基础准备。正文重点解释 GOPATH 与 Go Modules 的差异:前者要求项目放在固定的 $GOPATH/src 下,依赖集中管理;后者通过 go.mod 在项目内独立管理依赖,是 Go 1.16 之后默认推荐的方式。文章以 Gin 小项目为例,演示 go mod init 创建模块、go get 显式添加依赖、go mod tidy 根据 import 自动整理依赖,并给出 main 包调用自定义 gin_test 包启动 /ping 接口的代码结构。后半部分补充 Go 的包与文件组织规则,说明同一目录同一 package 下多个 .go 文件会被编译器合并,函数重名会触发 redeclared 编译错误,并与 Python 的动态模块机制做了对照。文章还概括了 Go 用 struct、method、组合和接口替代传统 class 与继承的基本思路。最后介绍 air 热重载工具的安装、PATH 配置、air init 生成 .air.toml 以及运行 air 自动重启服务,适合从 Python 或其他动态语言转向 Go 的开发者建立环境、依赖和包组织的第一层认知。

Go 开发
1 分钟

关于“Go 开发”类别

“Go 开发”类别的定位应围绕分类准入规则展开,重点说明它为什么存在、用于承载哪些内容,以及作者在发布文章时如何判断是否归入该类。正文给出的框架强调,需要先解释类别用途,再界定它与站内既有类别的差异,避免同一主题在多个分类之间重复归档或被拆分得过细。适合纳入的内容应由类别说明进一步明确,例如语言相关实践、开发经验、工具链使用或问题处理等方向,但具体范围需要以实际站点分类体系为准。该说明还要求评估类别的必要性,判断它是否应独立保留,或是否可以与其他类别、子类别合并。整体价值在于为知识库分类提供一致的判断依据,使读者和作者都能更快理解该分类的边界、用途和内容预期。

3x-ui面板安装与使用
服务器与部署
15 分钟

3x-ui面板安装与使用

这篇记录围绕 3x-ui 面板的 Docker 部署与基础使用展开,目标是在服务器上快速搭建可管理 Trojan、SS 等入站节点的代理面板,并利用 3x-ui 查看流量使用情况。正文给出 docker-compose 配置示例,说明 host 网络模式、数据库与日志挂载、可选证书路径,以及 pull、down、up -d 等启动命令;由于新版不再直接在日志中输出管理账号信息,还演示了进入容器后安装 sqlite、apache2-utils,通过修改 x-ui.db 重置管理员用户名和密码,并用日志查看默认运行端口的做法。安全加固部分包括登录后修改语言、Web UI 监听端口和账号密码,也提供了可选的 Nginx HTTPS 反代配置,以及借助 Cloudflare 代理和防火墙规则限制面板访问来源的思路。节点配置部分分别展示 Trojan 入站、TLS、关闭 sniffing、提取 trojan:// 信息并转换为 Clash 配置的流程,SS 协议则以面板自动生成密码和常规入站配置为主。末尾对 Trojan、VLESS+TLS+WS、VLESS+TLS+Reality 在握手开销、传输封装、CPU 负载、DPI 难度、CDN/WAF 穿透、客户端支持和配置复杂度上作了对比,帮助已有服务器与 Docker 基础的读者在部署、加固和协议选择之间形成可执行判断。

文章归档
183