苍月小筑

苍月小筑

Life is about making everyday count.

笔记

使用Windbg分析开启LocalDumps

1. 开启LocalDumps 配置方法 这项功能通过修改 Windows 注册表来进行配置。相关的注册表项位于 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps。 主要的注册表值包括: * DumpFolder (REG_EXPAND_SZ): 指定转储文件的保存路径。 * DumpCount (REG_DWORD): 指定在文件夹中保留的转储文件最大数量。当达到数量上限后,新的转储文件会覆盖旧的。 * DumpType (REG_DWORD): 指定要收集的转储类型。 * 0: 自定义转储(Custom dump)。 * 1: 迷你转储(Mini dump)。 * 2: 完整转储
13 min read
版本管理

一个利用AI自动生成高质量的提交信息的TortoiseSVN 和 TortoiseGit 插件

背景 最近经常用vscode和cursorvibe coding 一些小玩具,发现这两个编辑器自带的AI生成提交信息(commit message)使用起来十分方便。对于大部分修改,都能够生成比较符合主题且清晰的提交信息。但是日常工作用的较多的还是visual studio,而vs本身并没有提供一个类似的功能。 最开始的想法是写一个vs插件来做类似的事情,但是仔细一想,这不是又局限在单一工具上了嘛?又想起之前研究TortoiseSVN和TortoiseGit的时候,发现这两个版本控制系统GUI是提供了插件功能的,因此最终决定写成TSvn和TGit插件。 由于TSvn和TGit提供了统一的插件接口,因此一个插件可以在这两种版本控制系统中通用。 插件详情 GitHub - foryoung365/TSvnCMG: An intelligent plugin for TortoiseSVN and TortoiseGit that leverages AI technology to automatically generate high-quality commit
2 min read
笔记

Git迁移到SVN

背景 之前的一个项目使用Git进行源代码管理,现在项目中止,需要把代码迁移到公司大部分项目都在用的svn上进行存档。 迁移后的svn需要保留原始git的修改记录。 首先需要说明一下,因为目标svn是公司服务器,个人是没有服务器访问权限的,因此迁移过程困难重重,如果有服务器权限,那么最简单的方案是使用subgit,只需要在git端和svn服务器进行简单的配置,即可完美迁移。下面的讨论基于没有svn服务器权限的方案。 历经好几天的折腾终于找到了一个不算完美的解决方案,这里记录一下。 解决思路 经过了大量的搜索和AI的讨论,对于我的情况,最好的办法还是使用git svn。当然这中间进行了大量的妥协: git子模块问题(submodules) 待迁移的git项目中使用到了子模块,目前我还是没有找到可以完美保留子模块的方法,最后采用的折衷方案是使用git-filter-repo移除子模块相关的提交。否则在使用git svn dcommit提交到svn时,会因为找不到子模块对应的提交hash链接而失败。 原始提交人问题(author) 由于svn提交的提交人
12 min read

构建有效的代理系统

原文链接: 构建有效的代理 \ Anthropic --- Building effective agents \ Anthropic 在过去的一年里,我们与数十个团队合作,在各个行业构建大语言模型(LLM)代理。我们一致发现,最成功的实现并不是使用复杂的框架或专门的库,而是使用简单、可组合的模式来构建。 在这篇文章中,我们分享了从与客户合作和自主构建代理过程中获得的经验,并为开发者提供构建有效代理的实用建议。 什么是代理? "代理"可以有多种定义方式。一些客户将代理定义为完全自主的系统,能够长期独立运行,使用各种工具完成复杂任务。其他人则用这个术语描述更具规定性的实现,即遵循预定义工作流程的系统。在Anthropic,我们将所有这些变体都归类为代理系统,但在工作流和代理之间做出了重要的架构区分: * 工作流是通过预定义的代码路径来编排LLM和工具的系统。 * 代理则是LLM能够动态指导自己的流程和工具使用的系统,保持对如何完成任务的控制。 下面,我们将详细探讨这两类代理系统。在附录1("实践中的代理")中,我们描述了客户在使用这些系统时发现特别有价值
16 min read

COSTAR 提示词框架

介绍: 提高提示能力(LLMs)像 GPT 一样对于获得更好的响应至关重要。COSTAR 是一个提供结构化提示创建方法的框架。该方法确保考虑到影响LLM响应的所有关键方面,从而产生更具针对性和影响力的输出响应。 COSTAR 框架解析: 背景信息有助于LLM理解特定场景。 目标 (O):清晰定义任务可以引导LLM的关注。 样式 (S):指定所需的写作风格与 LLM 响应对齐。 语气 (T):设定语气确保回应与所需情感相符。 受众 (A):识别目标受众使得LLM的响应能够针对特定受众。 响应 (R):提供响应格式,如文本或 json,确保LLM输出,并帮助构建管道。 这是使用 COSTAR  的一个例子: 假设你是一名个人生产力开发者,你喜欢通过将目标转化为可执行的项目来帮助人们实现他们的目标。现在让我们测试一个可以实现这个目的的 COSTAR 提示。 # 上下文 # 我是一名个人生产力开发者。在个人发展和生产力领域,对于不仅帮助个人设定目标,还能将这些目标转化为可操作步骤的系统需求日益增长。许多人在从愿望到具体行动的过渡中遇到困难,这凸显了有效的目标到系统转换
3 min read
游戏开发

基于多级时间轮的定时器机制

4.1 原来的定时器调度机制 * 简单的轮询遍历式定时器: * 在线程循环中,每隔一定的时间间隔,调用一次OnTimer * 在OnTimer中按照管理器、对象、对象的成员等逐层遍历所有OnTimer void ThreadProcess() { while (true): { // do something... // 经过一个周期,触发定时器轮询 if (curTime - lastTime >= 750/*ms*/) { // 遍历所有管理器,调用OnTimer foreach xxxMgr: xxxMgr.OnTimer() } // do something else... } } // 管理器的定时器实现 void
8 min read

我写了一个插件,让你在Visual Studio中使用本地大模型辅助编码

为什么要开发LLMCopilot插件? GPT-4刚发布时,我就订阅了OpenAI的plus会员。经过一段时间的使用,确实GPT-4对于编码辅助能力非常强大,极大提升了解决开发过程中问题的效率。之后,各种辅助编码的大模型也如雨后春笋般出现,如vscode中的CodeGeeX,FittenCode等插件。这些插件的体验都很好,但是这些都是云端插件,无可避免会将你的数据发送到厂商的服务器上。 之前我在vscode中开发爬虫时,由于需要将账户密码配置在代码中,这时我就不想使用这些云端的大模型了。因此,我希望能有一个本地的插件,可以让我完全控制自己的数据和隐私。这就是为什么有了上一篇文章: 在vscode中使用本地AI编程大模型如果您想在您的计算机上运行 AI 代码助手而不泄露信息,甚至不需要互联网连接,现在有相当简单的方法可以做到。 我将在这里展示一个非常直接的解决方案。您需要 ollama、VSCode 和 privy 扩展。 Ollama Ollama 是一个很好的编排器,可以在本地机器上运行模型。 它支持多个编码器, 本文中我们使用 deepseek-coder. 您可以在
6 min read

在vscode中使用本地AI编程大模型

如果您想在您的计算机上运行 AI 代码助手而不泄露信息,甚至不需要互联网连接,现在有相当简单的方法可以做到。 我将在这里展示一个非常直接的解决方案。您需要 ollama、VSCode 和 privy 扩展。 Ollama Ollama 是一个很好的编排器,可以在本地机器上运行模型。 它支持多个编码器, 本文中我们使用 deepseek-coder. 您可以在 macOS、Linux 和 Windows 上安装它。它可以在 Docker 中运行。 在 Windows 上进行示例安装和验证安装。_ 安装 ollama。 使用 ollama 运行 deepseek-coder 模型 : ollama run deepseek-coder:6.7b 您现在可以在终端上进行聊天。 您可以使用 curl 测试
2 min read
游戏开发

基于共享内存的 LOG 异步化

原有日志接口的问题 * 写日志耗时高 * 实时写入文件单行 LOG,耗时约 0.25ms(1KB 以内的 LOG 长度并不会显著的影响写入文件的耗时,固态硬盘和机械硬盘也没有显著的差异) * * 异常时日志丢失 * 缓存型日志,单文件 4K 缓存,可以极大的减少写入文件的开销,但是宕机时,可能导致文件内容丢失 解决方案 * 降低写日志开销 * 异步化 * 防止日志丢失 * 共享内存 具体实现 * 数据结构: typedef struct AsyncLogInfo_s { ASYNC_LOG_OPT_TYPE nOpt; // 操作类型 DWORD dwData2; // 自定义数据 int64_t i64Data1; // 自定义数
3 min read
跑步

McMillan 10K跑步计划(8周)

训练1训练2训练3第1周轻松跑30Min法特莱克跑8x1Min长跑45Min第2周轻松跑40Min法特莱克跑5x2Min长跑50Min第3周轻松跑45Min节奏跑40Min渐进跑60Min第4周轻松跑30Min法特莱克跑4x3Min长跑70Min第5周轻松跑70Min法特莱克跑10×1Min渐进跑60Min第6周轻松跑80Min节奏跑50Min长跑70Min第7周轻松跑40Min法特莱克跑15x1Min渐进跑60Min第8周轻松跑30Min法特莱克跑5×1Min比赛日!

怪物移动响应延迟优化

背景 前段时间客户端想做怪物移动表现优化,改善现在怪物移动一顿一顿的感觉,希望服务端配合。客户端反馈服务端下发的怪物移动消息延迟很不稳定,会在几十毫秒到几百毫秒中波动,客户端平滑插值表现完之后,还没有收到服务端下发的下一个移动消息,导致怪物还是会出现移动卡顿的表现。 为了解决这个问题,我花了不少时间排查和优化,因此记录一下。 响应慢的原因 socket线程收包延迟 这里说的延迟不是指网络本身的延迟,因为在内网,所以这里暂时忽略网络部分的延迟。Socket线程的处理逻辑大致如下: while (!msgpipe.empty()): processmsg() foreach socket :// 怪物移动由怪服控制,怪服也是通过socket连接到游服 recv a packet; send the packet to logic thread; send buffering packet; if there is no msg in msgpipe: // <== 问题点 sleep(40); else:
4 min read
游戏开发

C++代码审查终极指南

英文原文:https://www.incredibuild.com/blog/the-ultimate-guide-to-cpp-code-review-part-2 在第一部分中,我们花了一些时间讨论代码审查的广泛方面。本部分将专注于 C++,提供一个代码审查清单并提供一些最佳实践。你可以按任意顺序阅读它们,但我们建议回过头去阅读我们的之前的文章。 C++ 审查清单 代码审查清单永远不会全面,需要检查的问题、项目和潜在事项几乎是无穷无尽的。因此,制作一个涵盖所有潜在情况的清单是不可能的,而且执行起来更加困难。相反,让我们关注在 C++ 代码审查期间应该涵盖的广泛方面。 类别 1 - 需求和底层领域的理解 Joel Spolsky(Stackoverflow 的联合创始人,Fog Creek 的创始人,现在是 Glitch 的创始人,以及Joel-on-Software
19 min read
跑步

跑步名词解释

跑步名词解释 轻松跑 轻松跑是跑步者训练计划的主要组成部分。跑步时身体感觉轻松,呼吸始终保持稳定,可以与训练伙伴进行对话。轻松跑后不会有持续的疲劳。 长跑 长跑与轻松跑相似,只是时间更长。虽然跑步的强度仍然轻松,但由于跑步时间的延长,可能会变得更加困难。长跑后可能会有一些持久的疲劳,因此在长跑后通常需要额外的恢复时间。 休息 训练会让身体感到压力。要变得更强壮、更健康,就需要恢复。休息日用于增强恢复,可以是完全休息一天,也可以是进行交叉训练。 Fartlek 跑 Fartlek 是一个斯堪的纳维亚词,意为“速度游戏”。通常被称为速度变化训练,Fartlek 跑只是在恢复间隔期间,快速跑步与慢跑交替进行。通常,Fartlek 跑以 5K-10K 的速度进行,快速跑步部分会稍微喘不过气来,然后在恢复部分(慢跑速度)恢复呼吸。 递进跑 顾名思义,递进跑以一种速度开始,但在跑步结束时变得更快。递进跑可以有所不同,但通常包括最后 5-
4 min read
摄影

摄影

1. 景深 1. 含义:拍摄场景清晰度可接受的前后范围 2. 前后景深: 1. 焦平面前后清晰的范围 2. 后景深 > 前景深 1. 景深大小: 1. 作用:控制背景虚化效果。 2. 关系:景深越小,背景虚化越明显。 1. 影响因素: 1. 光圈:光圈越大,景深越小;光圈越小,景深越大。 2. 焦距:焦距越长,景深越小;焦距越短,景深越大。 3. 背景距离:背景越近,景深越小;背景越远,景深越大。 4. 物距:物距越小,景深越小;物距越大,景深越大。 1. 曝光
4 min read
文档

ReviewBoard + SVN 集成 Windows搭建指南

Review Board 是一款开源的基于 Web 的代码和文档审查工具,旨在帮助公司、开源项目和其他组织保持高质量、低缺陷数。 Review Board 跟踪你的待定代码、图形、文档以及所有关于你的产品决策的讨论。我们的差异查看器不仅仅显示差异:它会精确地展示你的代码如何被修改,并使用语法高亮、差异之间的比较、移动行检测、缩进更改指示器等功能。你可以使用 Review Board 的丰富 API 和扩展框架进行集成,以实现定制的功能、审查 UI、数据分析等,而无需分支 Review Board。对于 Bazaar、ClearCase、CVS、Git、Mercurial、Perforce、Plastic 和 Team Foundation Server 的支持,维托服务器上或者使用 Assembla、Beanstalk、Bitbucket、Codebase、
6 min read
游戏开发

账号服务器开发总结

从六月份开始开发账号服务器到今天,账号服务器的大体功能也算完善了,账号服务器的开发暂时告一段落,预计下周又回去开发游戏服务端了。 一直想写一篇文章总结一下账号服务器开发过程的经验和教训,迟迟没有时间动笔,今天正好借这个机会写一下。虽然不是什么高大上的东西,但是我们的项目还在运营,另外也有商业秘密的原因,设计到具体实现细节的这里不会描述,也不用来问我,我也没法告诉你。 起因 公司本来已经有了一套比较成熟的账号服务器了,不过一直是端游在用的。而我们是手机游戏,许多需求和端游不同: 1. 手游常常需要接入各个第三方渠道 2. 登录验证方式不同,手游的第三方渠道账号登录以后需要通过HTTP协议到第三方平台进行账号验证 3. 手游有混服登录的需求(即多个第三方渠道的账号登录同一台游戏服务器) 4. 原有账号服务器掌握在别的部门手上,每次功能修改和开发都需要耗费大量时间沟通协调,自己开发维护响应会比较迅速 虽然有这么多需求,早期我们也没打算自己开发账号服务器,而是在游服上直接做,然后用一个数据库对账号进行重新编号排序。这种做法,在内测阶段只有一两台服务器当然没有太大问题
9 min read
游戏开发

游戏服务端死循环检测方案

传统死循环问题检测排查的困境 游戏服务端开发维护过程中,经常会碰到死循环或者游服性能问题,此类问题一般存在本机或者QA内部环境极难重现,难以定位和排查的问题。一般能采用的方式,只有: 1. 静态代码审查 2. 在可能出问题或者可能耗时较多的代码部分添加LOG,然后经过测试后上线观察,再加LOG,再观察。 以上这些传统方案不仅定位效率低,准确度低,而且问题的解决周期长,碰到影响恶劣的问题,还可能引起重大项目事故。 本方案解决的问题 1.实现精确到功能点级的故障定位,极大缩短了定位问题的时间。一般故障报出以后,当下查看LOG即可定位到问题所在。 2.实现精确到功能点级的耗时检测,和函数级的LUA脚本函数调用检测,并从时间段累计调用次数,累计调用耗时,单次调用平均耗时等方面综合监测性能问题,检测时间精确到tick。 方案应用后极大的提高外服死循环和性能问题的排查效率,目前已通过该方案查出数个死循环和性能问题。 实现方案 游服的业务驱动,一般来自这么几个部分: 1.
5 min read
笔记

游戏开发网络协议对比:TCP VS UDP

本文基于Glenn Fiedler的英文原文翻译,原文请戳这里 为了防止歧义,一些专有词汇将保留英文原文。 以下是翻译全文: 介绍 这篇文章我们将从网络编程最基础的方面说起,即通过网络发送和接收数据。这仅仅是个开始——网络编程中最简单和最基础的部分。但是如何达到最佳实践过程,依然是错综复杂的。如果你弄错了这个部分,那么将会给你的联机游戏带来可怕的负面结果,请务必注意。 你很可能听说过sockets,并且可能已经知道有两种主要的类型:TCP和UDP。当编写一款网络游戏时,我们首先需要选择使用哪种类型的socket。那么我们应该使用TCP sockets,UDP sockets,还是将两种混用呢? 你的选择完全取决于你想做的网络游戏的类型。本文(和后面的系列文章)的内容都将假设你要做的一款动作网游。比如大家熟知的:《光环》、《战地1942》、《雷神之锤》、《虚幻竞技场》、《反恐精英》、《军团要塞》等等。 按照我们想要做一款动作网游的假设,我们将非常详细的考察每种类型socket的特性,并且略微进一步探讨英特网是如何工作的。一旦我们掌握了这些讯息,那么作出正确的选择就易如反掌了。
15 min read
疑难杂症

小问题解决办法汇总

汇总一些平常碰到的小问题,方便查询。 1. VS2015输入中文出现乱码,显示???的问题 * 删除所有的输入法 包括美式键盘,只留下常用的那个输入法,我的是搜狗,搞定。 2. Flutter报错 Could not resolve all artifacts for configuration ':classpath'的问题 * 第一步:修改build.gradle,注释掉jcenter(),google()。使用阿里的镜像。原因是jcenter google库无法访问到导致的问题 buildscript { repositories { //google() //jcenter() maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https:
2 min read
笔记

导航网格学习笔记

相关资料 1. 导航网格开源库:RecastNavgation 2. 一个基于C#的AI库,包含UNITY 3D插件:CAINav 3. 开源服务端框架:kbengine 4. WOW服务端模拟器:TrinityCore RecastNavgation是业界比较知名的导航网格生成和寻路的开源库了,大名鼎鼎的UE4和Unity3D游戏引擎都有基于Recast的实现,而上述两个开源服务端框架中,导航网格也是基于Recast的。因此,Recast应该是已经被证明可靠的导航网格LIB。 在CAINav官网看到有比较详尽的导航网格文档,因此打算深入了解一下导航网格的原理和相关算法,本篇就是学习过程中记录的学习笔记。 多边形网格(Polygon Mesh) 多边形网格(Polygon mesh)是三维计算机图形学中表示多面体形状的顶点与多边形的集合,它也叫作非结构网格。这些网格通常由三角形、四边形或者其它的简单凸多边形组成,这样可以简化渲染过程。但是,网格也可以包括带有空洞的普通多边形组成的物体。 导航网格的生成 1. 高度图介绍 * 基本高度图结构
8 min read
想法

一种回合制战斗过程的记录方式

回合制战斗的页游,需要将战斗过程在服务端全部计算完成后再下发给客户端,并且还需要将战斗过程保存起来,让第三方直接查看。 将战斗的过程以动作为单位分解成多种消息,之后将多种战斗消息封装在一个消息打包器中下发给客户端。客户端从打包消息中按字节流的方式还原 出战斗消息,再解析消息进行表现。保存战斗过程只需要保存被打包完的字节流消息即可。 MsgPacker #pragma pack(push, 1) typedef struct { MSGHEAD_DEFINE USHORT usAction; DWORD dwData; DWORD dwAmount; //后面有几个消息 UCHAR ucMsg[0]; //各种战斗消息 }MSG_Info; #pragma pack(pop) ```**MsgBattle**``` enum MSGBATTLE_ACTION { MSGBATTLE_None, = 0, //无效 MSGBATTLE_BattleStart = 1, //战斗开始 MSGBATTLE_BattleEnd = 2,
2 min read
游戏开发

一种可以守护多个程序的守护进程的实现方案

* 账服需要守护程序,原来的守护程序使用的一对一的方式,技术部希望我们能提供一对多的守护程序,这样他们可以不用区分哪个程序守护哪个账服,多开时比较方便。 * 原来的守护进程的做法是先启动守护进程,然后守护进程通过CreateProcess启动账服程序,然后调用WaitForSingleObject挂起等待账服进程,如果返回,说明账服崩溃了或者被关闭了,那么就重新启动账服,不断循环。 如果一个守护程序要同时守护多个程序,那么原来的方案就适用了。 * 于是我们采用了另外一个方案: 1. 在文件中配置需要守护的所有程序 2- 每隔一段时间(可配置在文件中,如5秒),遍历一次所有进程(可以使用ToolHelp32也可以用enumprocesses),获取进程的可执行文件的完整路径文件名,和配置内的程序进行匹配 3- 如果无法找到,则重新启动这些程序 * 方案优缺点分析: *
1 min read
笔记

《网络多人游戏架构与编程》读书笔记

第一章 网络游戏概述 将数据分为4种类型: 1. 非保障数据。这类数据不是游戏所必需的数据。所以当带宽有限时,游戏选择首先丢弃这些数据。 2. 保障数据。该类数据需要保证其准确到达以及到达的顺序。用于对游戏至关重要的数据。 3. 最近的状态数据。该类数据用于只有最新版本的数据才是重要数据的场合。 4. 最快保障数据。该类数据具有最高的优先级,在可靠传输的基础上,保障尽快到达。 * 我们游戏现在数据没有分类,导致网络传输出现瓶颈的时候,无法根据类型丢弃数据包,后续可以考虑优化,但是重点在于如何选择哪些数据可以被丢弃?
1 min read
文档

WordPress+Nginx+Centos7建站指北

前一段时间折腾了一个周末,终于把新的博客搭建好了。其他过程都很顺利,主要时间都花费在了搭建WordPress,特别是如何让WordPress自带的更新和插件功能生效,浪费了大量的时间。这里把整个过程的注意事项,大致的说明一下,避免再次踩坑。 科学上网 1. 使用SSH工具连接VPS,执行下列命令,选择安装v2ray+ws+tls curl -O https://raw.githubusercontent.com/atrandys/v2ray-ws-tls/master/v2ray_ws_tls.sh && chmod +x v2ray_ws_tls.sh && ./v2ray_ws_tls.sh 2. 等待脚本执行,过程中会提示需要输入域名,输入解析到本VPS的域名,然后回车
3 min read