苍月小筑

苍月小筑

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 测试 API curl http:
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 博客的作者)曾经讲过一个关于他与微软联合创始人比尔·盖茨的审查的故事。 当时的 CEO 花了相当多的时间提问,包括一些看似随意的问题和更难的问题。问题越来越难,越来越尖锐,
19 min read
跑步

跑步名词解释

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

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

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

账号服务器开发总结

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

Mactype配置文件

**LCD.ini** [General] Name=LCD Icon=..mactray.exe,012 HookChildProcesses=1 【应用到子进程】——比如你用启动方法1启动了一个winrar,双击里面的一个文本文档,那么下一步被打开的“记事本”程序也会使用gdi++渲染。 0:禁用; 1:启用。 HintingMode=1 ; 0:Normal 1:NoHinting 2:AutoHinting 3:Light+AutoHinting 【字体微调】——对字体进行细微调整,以实现比较锐利、不模糊的效果。windows的cleartype就是用的这类技术,弊端是会使字体变形、笔画粘在一起。 下面会有两种情况: 情况一,当FontLoader=0(在下面)时: 0:使用字体内部的微调,字体内部没有微调的话就和选1时的效果一样; 1:
6 min read
版本管理

SVN全局忽略匹配表达式

不错的一组SVN全局忽略匹配表达式,记录下来备用。以后重装SVN的时候再也不用到处找了。 可复制黏贴模式 *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store thumbs.db Thumbs.db *.bak *.class *.exe *.dll *.mine *.obj *.ncb *.lib *.log *.idb *.pdb *.ilk *.msi* .res *.pch *.suo *.exp *.*~ *.~* ~*.* cvs CVS .CVS .cvs release Release debug Debug ignore Ignore bin Bin obj Obj *.csproj.user *.user *.generated.
1 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
游戏开发

RakNet参考手册索引

RakNet开源免费了,接下来准备学习一下,计划把RakNet的文档做个翻译。就从手册开始吧。原文链接。 介绍 手册最后更新时间 2012-11-19。 查看readme.txt文件获取当前版本号。 RakNet是为游戏或者其他高性能网络应用设计的一套高性能的网络API。 RakNet致力于提供现代游戏所需的绝大部分的功能特性,如Master Server(主服务器),autopatcher(自动更新),语音聊天和跨平台兼容性等。RakNet当前支持Windows, PlayStation 3, XBOX 360, PlayStation Vita, Linux, Mac, the iPhone[1], Android,和Windows Phone 8。 快速入门 多人游戏的组成 系统概览 实现细节 教程 编译设置(Visual Studio) 编译设置(XCode) 可选的第三方依赖项 操作方式 教学视频 介绍:主要特性 教程1:
8 min read
游戏开发

Lua语言学习笔记

自学过Lua好多次,每次都因为长时间没用然后忘记了。这次决定做一下笔记,一方面加深印象,另一方面为了下次忘记能够快速“捡回来”做准备。 参考教程:菜鸟教程之Lua教程 参考手册:Lua5.3参考手册 斜体部分为我个人的理解,可能不一定正确,只是帮助记忆。 [TOC] 注释 单行注释 --是单行注释: --这是单行注释 多行注释 --[[]]--是多行注释: --[[ 这是多行注释的第一行 这是多行注释的第二行 ... ]] 标识符 我喜欢称之为变量名。规则同C/C++。字母或者下划线_开头,后面跟字母、数字或者下划线。 关键词 即系统保留关键字。一般约定,以下划线开头连接一串大写字母的名字(比如_VERSION)被保留用于Lua内部全局变量。 and break do else elseif end false for function
45 min read