这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
PHP 的 CQRS 与事件溯源:命令总线、事件存储与投影
PHP 的 CQRS 与事件溯源实战:读写分离的动机、命令总线与处理器、聚合根与不变量保护、事件存储的追加与乐观并发、投影与读模型重建、事件版本升级与快照、重放与最终一致性、Laravel 落地与常见陷阱。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
PHP 的 CQRS 与事件溯源实战:读写分离的动机、命令总线与处理器、聚合根与不变量保护、事件存储的追加与乐观并发、投影与读模型重建、事件版本升级与快照、重放与最终一致性、Laravel 落地与常见陷阱。
Nix 中的 CUDA 与机器学习环境实战:GPU 环境为什么难(驱动/运行时/库三方版本约束)、nixpkgs 的 cudaPackages 布局、驱动与 cudatoolkit 的版本匹配、GPU 开发 shell 搭建、PyTorch 打包与 Python 生态、版本匹配矩阵与常见错配、容器镜像部署、cudaCapabilities 编译加速与多 GPU、常见坑与排错清单。
系统讲解 Elixir 生态的认证授权方案:JWT 的三段结构与签名算法、Guardian 的配置与 Pipeline 插件链、Token 签发验证与刷新、Phoenix.Token 的适用边界、令牌吊销与密钥轮换,以及 alg=none、算法混淆、重放等常见攻击面与防御。
沿一次表单登录拆开认证链:ProviderManager 如何按 supports() 挑选 AuthenticationProvider、DaoAuthenticationProvider 的模板方法、SecurityContextHolder 的存储策略、上下文在请求间的保存,以及 AuthorizationManager 取代 AccessDecisionManager 后的授权决策。
讲清 Spring Boot 4.x 的链路追踪栈:为什么 Sleuth 已被 Micrometer Tracing 取代,OTel 与 Brave 桥接包怎么选,management.tracing 的采样率与传播格式如何配置,traceId 如何进入日志 MDC,@Observed 与 Observation API 的用法,以及 HTTP 客户端与 Kafka 的上下文传播。
手写关卡写到第三十关就会枯竭。本节让程序按难度曲线生成关卡:用 mulberry32 做可复现的种子随机,把「难」拆成速度、间距、危险占比三条曲线,再用由跳跃初速度与重力推出的最大跳跃距离约束沟宽,最后用 LevelBuilder 把生成结果实例化到 Cocos 场景里。
8.1 定了 levels.json 的结构,但表是人写的,人一定会写错。本节写加载与校验两层:用 assetManager.loadBundle 与 JsonAsset 从 bundle-levels 读表并做缓存与释放,再用一份纯 TS 校验器把漏字段、y 越界、goalX 早于最后障碍等错误在加载时就变成清晰报错,配 vitest 用例与失败兜底。
本节用弹窗栈管理暂停、结算、设置三个面板的压栈出栈与遮罩点击拦截,给出带进出动画的 PopupBase 基类与可直接单测的栈逻辑,并按 sys.languageCode 切换中英文文案表,说明中英文字长差异导致的换行、溢出与字号不一致该如何取舍。
本节拆解 Cocos Creator 3.8 的 ScrollView 节点结构与属性面板取值,用 Layout 与 Prefab 搭出关卡选择列表,用 NodePool 复用列表项控制 Draw Call,并给出滚动结束事件驱动的分页与吸顶实现,以及可在命令行单测的可见项区间算法。
远程与热更是资源管线的最后一环。本节区分远程 Bundle 与原生热更两条路:讲清 isRemoteBundle 与构建面板远程地址怎么配、loadRemote 加载包外单文件、native.AssetsManager 的 checkUpdate/update 事件流与 manifest 结构,并给出按 sys.isNative 与 sys.Platform 分流的多端策略与发布清单。
一张 PNG 拖进 assets/ 之后发生了什么:讲清 .meta 文件的结构与 uuid 身份、图片与音频的导入设置、为什么 .meta 必须提交又绝不能手改、复制粘贴导致的 uuid 冲突怎么排查,并写出用 resources 按 sub-asset 路径加载 SpriteFrame 的组件代码。
属性面板显示哪些字段、值怎么存进 .prefab:讲清 @property 的几种写法(类型、数组、选项对象),为什么改字段名会让编辑器里绑好的引用变空、formerlySerializedAs 怎么救,serializable:false 与 editorOnly 用在哪,并打开预制体看自定义组件的序列化结果。
卷二最后一节,做一次收尾与交接:盘点《方块冲刺》从 demo 到产品的完整轨迹与三个贯穿全卷的关键决策,划清卷二刻意没讲的部分,交代高级卷要回答的「为什么」类问题,给出从「会用」到「会查 cc.d.ts」的实证方法与常见误区澄清,并列出继续做这款游戏的三个方向。
本节把《方块冲刺》全卷真正踩过的坑收敛成一份复盘:平台判断用字符串比较、.meta 丢失致引用断裂、动态加载路径带扩展名与大小写、常驻节点忘了移除、资源不释放、分包名与目录名不一致、三端存档差异、构建缓存带进旧代码,每条都给出症状、根因与修法,并汇总成一张速查表。
本节把《方块冲刺》真正推上线:先回看第 1.1 节定下的功能需求 FR-01 到 FR-08、非功能需求 NFR-01 到 NFR-06、用例 UC-01 到 UC-05,再把它们逐条翻译成功能、非功能、用例、三端构建、合规五个维度的可勾选检查项,给出构建配置实际取值与发布单模板,让「发布」从感觉变成清单。
CI 里的冒烟能挡住白屏,却挡不住真实用户那边偶发的崩溃与卡死。本节把线上问题变得「看得见」:用 window 事件与引擎事件捕获异常、用纯逻辑模块定义埋点结构与批量编码、用 sys.platform 采集环境上下文,并讲清三端差异、本地队列、上报时机与隐私边界。
类型对、单测过,不代表跑起来不白屏。本节把「冷启动 → 主菜单 → 跳一下」这条主路径写成 Playwright 冒烟用例,用 Cocos CLI 构建 H5 产物、用截图比对守住首屏外观,并给出 CI 里的构建命令、产物归档与失败判定——让每次提交都自动「打开游戏看一眼」。
启动耗时优化完了,怎么保证下次改动不会让它悄悄退回去?答案是把验证交给机器。本节把项目脚本分成「纯逻辑 core」与「引擎 game」两层,对前者用 vitest 跑单测,对后者用 @cocos/creator-types@3.8.8 做 tsc --noEmit 类型门禁,并给出这两道门禁在 CI 里的落点、命令、产物与失败判定。
变现的另一条腿是内购,而内购比广告更麻烦:它牵涉订单、验签、发货,还牵涉实名、防沉迷、消费限额这些合规红线。本节给出「服务端下单、平台支付、服务端验签发货」的完整时序,写一个防重复购买的 IapService,再逐条列出上架前必须过的合规清单。
激励视频是《方块冲刺》最主要的变现方式,也是体验最容易翻车的地方。本节先规划广告位,再给出「创建一次、加载、展示、onClose 结算」的完整时序,写一个带状态机与并发锁的 AdManager,保证奖励只发一次,最后处理无广告填充时的降级策略与激励弹窗预制体。