Anduin Xue
Anduin Xue

Anduin's Tech Blog

All Posts in 2021


Auto backup for Minecraft on Linux

本文探讨了在Linux系统上为Minecraft服务器构建自动备份方案的实践过程揭示了从Git压缩方案到直接复制文件夹的优化路径并展示了如何利用tmux会话管理和自动化脚本实现游戏数据的高效备份作者通过对比Git方案带来的CPU资源消耗问题最终选择基于文件复制的轻量级解决方案详细描述了通过tmux启动服务器进程保存游戏状态执行文件复制和清理旧备份的完整流程代码示例清晰呈现了路径定义时间戳命名存档清理等核心逻辑并提出了如何在保证数据安全的同时避免过度占用系统资源的思考当服务器面临突发故障时如何确保备份脚本的可靠性又该如何在多台服务器间扩展这套方案的兼容性这些问题或许能为你的自动化运维带来新的启发--Qwen3

bash Linux Minecraft Backup Minecraft server Automatic backup

Validate an object in any C# projects

这篇文章探讨了C#项目中对象验证的最佳实践并提出了重构传统验证逻辑的创新思路。通过对比传统多层if-else验证方式带来的代码冗余问题,揭示了将验证规则内聚到数据模型中的重要性。文章展示了如何在非ASP.NET Core项目中复用框架的模型验证机制,通过定义[Required]、[MinLength]等数据注解实现声明式验证,并进一步演示了自定义[NoSpace]属性验证规则的完整实现过程。特别值得关注的是文中提供的递归验证解决方案,该方案利用反射技术实现了对嵌套对象图的自动验证,为复杂对象的校验提供了优雅的解决方案。当面对跨层级对象的验证需求时如何设计更智能的规则继承机制?当验证规则需要动态调整时如何构建可扩展的验证框架?这些开放式问题为开发者提供了深入思考的方向,启发我们探索如何将验证逻辑与领域模型深度结合,同时思考如何将这种声明式验证模式迁移到其他编程范式中。--Qwen3

ASP.NET Core C# .NET Validation DataAnnotations Custom Validation

在一秒钟内打开苏康码

在数字化生活日益渗透日常的今天健康码的使用场景正在重塑人们对身份验证的认知2021年苏州地区的开发者通过技术观察发现了一个有趣现象看似必须依赖小程序才能获取的苏康码其本质竟是可独立访问的网页这一发现不仅揭示了数字服务背后的架构逻辑更带来了突破平台限制的可能性通过直接访问https://scm.szgaj.cn/wjw/health_skm.html用户得以绕过微信支付宝的小程序生态在PC端甚至平板设备上完成健康码的获取与展示这一技术路径的实现既依赖对URL结构的解构也涉及对HTTPS安全协议的信任验证更展现了数字身份验证系统中接口调用与前端展示的分离设计当开发者将这一URL固定在手机桌面形成快捷入口时健康码的展示效率提升了数倍这种技术思维的突破不仅解放了用户对特定App的依赖更引发了对数字身份验证体系本质的思考——当数据验证权与展示权分离时用户是否能获得更自由的选择空间?而开发者对Token机制的深入分析则进一步揭示了健康码系统的技术细节通过抓包分析发现真正决定健康状态的是后端REST API的实时调用而非前端页面的静态展示这种前后端分离的设计模式是否预示着未来数字验证系统的通用架构?当行程卡服务同样被证实可通过https://xc.caict.ac.cn/#/login直接访问时这种技术解构是否正在指向一个更开放的数字身份验证生态?这些发现不仅为用户提供了更便捷的使用方案更引发了对数字身份验证体系技术架构与用户权利之间关系的深层思考——在技术不断演进的当下我们是否正在见证数字验证从封闭平台向开放接口的范式转变?--Qwen3

Web China Health Code Sukang Code Web Based Solution Browser Access

C# Play with GZip.

这篇博客展示了如何通过C#为字符串添加GZip压缩功能的扩展方法揭示了数据压缩技术在现代编程中的实用价值。通过构建包含ZipToBase64和UnZipBase64方法的扩展类开发者可以轻松实现字符串的压缩与解压操作在示例代码中反复压缩的字符串通过Base64编码实现了体积的显著缩减这种数据处理方式是否暗示着更高效的存储方案值得深入思考当压缩后的数据长度突破原始字符串限制时是否会引发新的技术挑战而Base64编码与GZip压缩的组合是否意味着存在更优的编码策略当我们面对海量数据时这种压缩方法是否能承受性能压力又该如何平衡压缩率与处理效率的矛盾这些问题或许能为优化数据传输方案提供新的思路而测试用例中验证的压缩效果是否意味着在特定场景下可以完全替代传统存储方式呢--Qwen3

C# .NET Compress GZip Base64 string extension

Directly talk to any enterprise Microsoft Teams user

最近发现一个巧妙方式能直接与任何Microsoft Teams企业用户发起对话无需通过传统通讯录或好友请求这背后揭示了微软Teams在企业通讯架构中隐藏的开放性接口通过构造特定URL格式并附上目标邮箱地址即可瞬间建立连接例如将anduin@aiursoft.com嵌入到https://teams.microsoft.com/l/chat/0/0?users=路径后就能生成直达对话框的链接更令人惊讶的是该方法同样适用于机器人账号只需将邮箱替换为28:(guid)格式的标识符这种设计是否意味着企业通讯正在向去中心化协作演进当技术门槛被降至最低时信息流动将如何重塑组织边界而这种开放性是否会带来新的安全挑战当每个人都能绕过企业通讯录直接联系到任何人时隐私保护与权限控制又该如何平衡这种看似简单的链接构造背后究竟隐藏着多少未被发现的协作可能性--Qwen3

Microsoft Teams Microsoft 365 Microsoft Teams Teams Link Direct Messaging

Use Windows as a stateless OS on your devices

该脚本涵盖Windows系统多项配置操作包括用户账户控制设置远程桌面连接电源管理语言环境调整网络配置时间同步文件资源管理器优化主题模式切换危险操作如桌面清理和网络信任设置等具体实现涉及注册表修改策略调整PowerShell命令及系统工具调用其中关键配置包含启用中文输入法设置中国时区关闭睡眠模式调整鼠标灵敏度启用暗黑主题禁用蓝牙图标优化文件管理器显示设置网络为私有模式提升功能权限同时包含潜在风险操作如删除所有桌面文件开启远程桌面连接以及强制系统更新并自动重启等需要用户谨慎执行--Qwen3

PowerShell Windows Windows 11 Automation Configuration Device Reimage

Why you should never use `Console.WriteLine`

本文探讨了在库代码中使用`Console.WriteLine`的潜在问题及其替代方案。文章指出`Console`类与标准输出的强耦合特性会导致库代码与业务逻辑的依赖混乱——当库被单元测试框架或Web服务器调用时,控制台输出可能完全失效违背依赖倒置原则。通过引入`ILogger`接口抽象层可实现日志系统的解耦,使日志记录与具体输出方式分离。实际应用中可通过`Microsoft.Extensions.Logging`框架构建可扩展的日志体系:通过依赖注入注册日志服务后,开发者可动态切换控制台日志、文件日志或Application Insights等不同输出方式,同时支持日志分级和格式化功能。文章通过代码示例演示了如何通过服务集合配置日志系统,并指出即使不使用依赖注入框架也能通过`LoggerFactory`快速创建控制台日志实例。值得注意的是在终端UI应用或自定义日志实现器等特定场景下,`Console`类仍可作为直接交互工具。那么当你的应用需要同时处理多租户日志时,如何设计日志上下文关联机制?当服务器集群规模扩大时,控制台日志是否仍然能胜任分布式追踪需求?这需要开发者重新思考日志系统的架构设计边界。--Qwen3

C# .NET Core Console App .NET Logging ILogger

Install Windows store app with WinGet

这篇文章揭示了如何通过WinGet在Windows 11系统上实现Microsoft Store应用的自动化安装。传统依赖图形界面的安装方式被一条命令打破——通过解析特定格式的ProductId(如9nblggh5r558),开发者可以构建PowerShell脚本直接跳转至应用商店页面。更深层的技术突破在于,作者展示了如何利用WinGet的源管理能力,通过指定msstore源并配合--accept-package-agreements参数,实现真正意义上的无交互式安装。这种自动化方案对系统部署和软件管理具有革命性意义,它让我们思考:当应用安装变成可编程操作时,操作系统本身的可配置性将如何演变?文中提供的Install-StoreApp函数不仅封装了安装逻辑,更引入了应用存在性检测机制,这种自适应安装架构是否预示着未来软件分发的新范式?技术爱好者或许会好奇:这种命令行方式是否能突破Windows生态的限制?当脚本可以自动获取应用标识符时,软件分发的边界将如何重新定义?--Qwen3

PowerShell Windows Winget Microsoft Store UWP Store

Install Windows 11 side-by-side without a USB drive

This article presents a method to install Windows 11 alongside an existing system without relying on USB drives or optical discs by directly extracting the install.wim file into a new partition. The process bypasses traditional boot media and leverages built-in tools like DISM and BCDedit to create a dual-boot setup where the original OS remains accessible. By unpacking the Windows image to a dedicated NTFS partition (created via disk management or shrinking existing volumes), users can generate a bootable system that coexists with their current installation. The guide emphasizes critical steps such as selecting the correct image index for the desired edition, avoiding BitLocker encryption, and configuring boot entries to ensure the new OS is recognized during startup. While this approach offers a streamlined alternative to conventional installation methods, it raises intriguing questions about the boundaries of OS deployment: Can this technique be adapted for Linux or other operating ...--Qwen3

Windows 10 PowerShell Windows Windows 11 Install DISM Bcdedit Boot BCD

Retry with exponetial back-off on C#

本文介绍了一个基于C#实现的指数退避重试引擎设计与实现其核心通过动态计算等待时间在多次失败后自动触发重试机制代码中通过递增的幂次方随机数生成回退间隔时间并结合超时控制与异常过滤策略为开发者提供了灵活的重试解决方案该引擎允许通过when参数自定义重试条件并支持异步任务执行与超时熔断机制在实际应用中开发者可以将其封装到网络请求或分布式任务中以应对临时性故障但如何平衡重试次数与系统负载?当重试策略与业务场景的关联性增强时是否需要引入更智能的决策模型?当异常类型复杂化时如何设计更精准的过滤规则?这些问题都值得在构建可靠系统时深入思考--Qwen3

C# .NET Retry Retry Engine Exponential Backoff Exception Handling

找到玄学问题的根源的方法 - 夹逼调试法

夹逼调试法是一种通过双向环境对比快速定位玄学问题根源的系统方法。当程序在理想环境能正常运行而在特定环境异常时该方法通过构建理想环境与故障环境的对比集合逐步逼近问题核心先在故障环境向理想环境靠拢过程中观察差异因素的影响再反向从理想环境向故障环境逼近验证假设从而缩小问题范围。该方法特别适用于环境依赖性强的异常场景例如网络配置操作系统版本软件冲突等复杂因素交织的情况。通过Spotify无法运行的案例展示了如何通过对比操作系统版本网络环境软件来源等差异最终发现Windows N版与专业版的兼容性问题在飞机启动故障案例中则通过开关状态的双向验证锁定关键控制因素。这种方法的优势在于将模糊的环境差异转化为可验证的变量组合但需注意其结果仅指向可能原因而非绝对因果。当面对类似"为什么我的代码在本地运行正常却在服务器报错""为什么同样的配置在不同设备表现不一致"等问题时能否通过构建理想环境和差异分析找到突破口?或许这个方法能成为你调试玄学问题的利器。--Qwen3

Software Development Debugging Problem Solving Computer Science Environment Analysis System Issues

The simplest way to retry in PowerShell

本文介绍了在PowerShell中实现简单重试机制的代码框架通过do-while循环和try-catch结构构建了具有指数退避策略的自动重试流程当执行高失败概率操作时脚本会根据尝试次数动态调整等待时间从0秒开始逐步增加到20秒最大尝试次数设置为5次示例中使用ping命令演示了网络请求失败时的自动重试过程当目标主机无法解析时脚本会输出带颜色标识的错误提示并记录错误代码和详细信息成功案例展示了标准ping命令的输出格式而失败案例则包含完整的错误追踪信息这种设计模式不仅适用于网络操作还能扩展到文件处理数据库连接等需要容错的场景代码通过LASTEXITCODE判断执行状态结合异常捕获机制实现健壮的错误处理但作者留给我们一个值得思考的问题当重试次数和等待时间需要根据具体业务动态调整时如何在代码中优雅地实现参数化配置同时在错误处理中是否应该区分瞬时性错误与永久性错误并采取不同策略这些改进方向都能让重试逻辑更智能更符合实际需求--Qwen3

PowerShell Retry Exponential Backoff retry mechanism error handling exception catching

时评:国家对于子女教育方面的政策还需要多方面配套

国家在子女教育领域的政策调整正面临配套机制缺失的困境。双减政策试图通过减少作业量和校外培训来缓解家庭教育焦虑,却未构建起替代性的时间管理框架——学生被释放的课余时间既可能流入地下培训市场,也可能催生逃避监管的外服游戏等灰色行为。这种单向度的"堵"而非系统性的"疏",暴露出教育改革中结构性矛盾的深层症结:当家长被迫承担起原本由市场机构分担的教育责任时,是否应通过公共服务体系重构来实现教育职能的再分配?更值得思考的是,若强行将实践课程纳入必修体系,如何避免区域教育资源失衡带来的新形式教育不公?政策制定者需要在规范性与灵活性之间寻找平衡点,既不能放任资本对教育的异化,也不能以行政指令取代市场调节。当教育部门试图用体育艺术课程填补学生课余生活时,是否充分考虑过乡村学校连基础文化课都难以保障的现实?而那些被政策冲击的教培企业,其转型空间与投资信心的重建,是否也应被纳入改革的系统考量?或许真正的挑战在于:如何构建一个既能承载素质教育理想,又能适应区域发展差异的弹性教育生态?这需要政策设计者以更前瞻的视野,在试验性改革与全面推广之间找到渐进式过渡的路径。--Qwen3

China Politics Education Education Reform Policy Analysis Game Regulation

Query Kusto database with C# and get result as List<T>.

该实现通过双缓冲机制和任务调度优化Kusto数据写入性能采用双缓冲策略交替使用_activeBuffer和_secondaryBuffer减少内存占用和数据碎片冷却引擎动态计算写入延迟时间平衡写入频率与数据量大小通过ReaderWriterLockSlim和锁机制实现线程安全的数据入队与缓冲区交换操作引擎任务负责批量写入数据并在缓冲区数据量不足时自动休眠冷却引擎负责在休眠后重新唤醒写入任务形成热状态下的持续写入能力支持高并发场景下的非阻塞数据添加通过CalculateSleepTime方法根据缓冲区数据量动态调整休眠时间避免频繁写入和资源浪费SyncAsync方法确保所有待处理数据最终持久化实现可靠的数据同步机制。--Qwen3

C# .NET Core Azure .NET Kusto Azure Data Explorer KQL

Build a common cache service for your C# app.

这篇文章介绍了如何通过封装Microsoft.Extensions.Caching.Memory库创建一个更简洁的缓存抽象层,重点展示了CacheService类通过策略模式实现的条件缓存机制与选择器模式的结合应用。作者通过封装后的RunCache方法简化了复杂对象的缓存操作,允许开发者通过设置缓存过期时间动态控制数据新鲜度,并通过Selector模式实现缓存数据的转换处理。单元测试示例验证了该方案在不同场景下的行为特征:包括基于缓存条件的动态存储策略、对null值的特殊处理、通过选择器转换数据后的缓存逻辑,以及如何通过设置0分钟缓存时间实现强制刷新。这种设计既保持了原始缓存库的灵活性,又通过策略模式将缓存规则与业务逻辑解耦,为复杂缓存场景提供了可扩展的解决方案。测试用例的覆盖范围暗示着该模式在处理多条件组合缓存场景时的鲁棒性,同时引发思考:是否还有其他维度可以扩展这种缓存策略模式?--Qwen3

ASP.NET Core C# .NET Core Performance Caching .NET Cache MemoryCache

Restore a deleted branch from Azure DevOps using it's SDK

本文介绍了如何通过Azure DevOps SDK恢复被误删的代码分支的技术方案。文章指出当开发分支被删除后,可以通过Azure DevOps提供的Git API获取分支最后的提交记录,并利用Git引用更新机制重建分支。开发者需要先通过VssConnection建立认证连接,使用GitHttpClient获取分支的推送历史,找到被删除前的提交ID,再通过UpdateRefsAsync方法将分支引用重新指向该提交。这个过程涉及对Git底层引用机制的深入理解,包括如何处理旧对象ID与新对象ID的映射关系。代码示例展示了如何构建GitPushSearchCriteria查询参数,解析返回的RefUpdates数据,并构造GitRefUpdate请求体。特别值得注意的是,文章揭示了在更新引用时将OldObjectId设为全零占位符的技巧,这是实现分支恢复的关键技术点。技术实现过程中涉及的权限控制、项目名称与仓库ID的匹配等问题,为开发者提供了思考空间。当本地执行git fetch后,删除的分支会重新出现在版本历史中。这引发我们思考:如何在团队协作中设计分支保护策略?当多用户同时操作时,这种恢复机制是否具有原子性?如果在不同版本的Azure DevOps中执行该操作,可能会遇到哪些兼容性问题?--Qwen3

C# git Azure Azure DevOps SDK Git Branch Restore

Tips about rules setup for Outlook enterprise users

在信息洪流中如何构建高效的邮件过滤体系?当每天面对成百上千封邮件时如何让重要信息浮出水面?企业用户在Outlook中设置规则的艺术在于建立分层处理策略——从垃圾信息的精准拦截到核心项目的主动捕捉从个人事务的智能识别到团队协作的分类管理。通过构建优先级明确的规则链:首先将GitHub通知Teams消息等固定来源的噪音批量归类继而用关键词触发关键项目警报再通过收件人识别锁定个人沟通最后按团队邮箱分流讨论内容最终形成"重要-次要-其他"的三维信息矩阵。这种规则架构不仅需要识别邮件的本质属性更考验对工作场景的深层理解:当你的规则体系开始自动运行时是否真正实现了信息的精准触达?在自动化分类背后隐藏的其实是对工作优先级的哲学思考——究竟哪些信息值得你立即响应哪些可以延迟处理哪些应该永久归档?邮件规则设置不仅是技术操作更是工作认知的具象化过程你的Outlook规则是否反映了你对工作的独特理解?--Qwen3

Outlook Rules Setup Email Organization Tips Mail Automation Efficient Workflow Inbox Management Guide Important Emails Alert

软件工程领域中的逆全球化趋势

过去的二十年间软件工程领域的全球化趋势曾被视作技术发展的必然方向跨国企业通过统一的云基础设施和分布式系统实现全球服务覆盖CAP定理指导下的分区容忍性设计让跨地域数据同步成为可能微软的CosmosDb和国内的TiDB等技术验证了这种模式的可行性但2020年后的地缘政治变化正在改写这一逻辑国家间的数据流动面临前所未有的信任危机客户开始要求服务必须在物理隔离的空气墙环境中依然完整运行这种需求催生了软件工程的逆全球化转型当分布式系统的分区不再由网络延迟定义而是由政治和技术壁垒切割时传统的SaaS模式面临根本性挑战私有云的本地化部署和数据主权的重新定义成为刚需更极端的场景要求将整个组织结构作为服务交付对象而非仅仅是代码这种变革不仅颠覆了技术架构更重构了商业逻辑当数据跨境流动需要如同人员出入境般办理数字签证时当软件销售从交付产品转向交付人才与组织时我们是否正在见证一种新的数字时代地缘政治如何在CAP定理的框架下重新定义软件工程的边界?当全球化与逆全球化的力量在代码层面持续角力时未来的技术架构将如何在信任与安全的天平上找到新的平衡点?--Qwen3

Multi-tenant China Software Development AirGap Globalization CAP Theorem

Build a package that can be used in browser and node with TypeScript

本文探讨了如何构建一个兼容浏览器与Node环境的TypeScript库项目并实现标准化发布。通过初始化npm项目配置TypeScript与Webpack构建工具链创建UMD模块化输出方案开发者可以将核心逻辑封装为类型安全的类并通过Webpack配置实现生产环境代码压缩与多环境适配。文章展示了从项目结构搭建到tsconfig编译选项设置再到webpack打包配置的完整流程最终通过npm发布实现代码共享。这种构建方式既保留了TypeScript的类型优势又通过UMD格式兼容了不同运行环境的调用需求。当开发者需要在前端框架中复用算法或构建可复用组件时如何平衡类型系统与兼容性如何设计模块的导出结构以及如何优化打包体积成为值得关注的技术命题。--Qwen3

Web npm TypeScript node webpack JavaScript Front-end

Use Azure Key Vault to store connection strings for App Service.

本文探讨了如何通过Azure Key Vault解决Azure App Service协作管理中的敏感信息泄露风险。传统环境变量配置方式存在隐患,当多人协作时可能导致数据库连接字符串暴露进而引发意外操作。文章提出使用Azure Key Vault作为安全中间层,通过权限分级管理实现服务托管与密钥保护的分离。具体方案包括创建独立密钥库、启用基于角色的访问控制、配置托管身份验证以及构建密钥引用链路。这种架构不仅保障了连接字符串的机密性,更允许团队成员在无需知晓具体凭证的前提下完成应用服务的日常维护。文章最后引发思考:当安全需求与协作效率产生冲突时,如何设计既能满足权限最小化原则又不阻碍团队协作的技术方案?你是否考虑过如何在不暴露密钥的前提下实现团队协作?或者,是否有更高效的安全策略等待探索?--Qwen3

Azure App Service Azure Security Key vault Environment Variables Azure Key Vault

Programmatically connect to the remote server via SSH and execute remote command.

文章围绕如何通过程序化方式实现SSH远程服务器连接与命令执行展开重点探讨了.NET Core环境下借助SSH.NET库完成自动化运维任务的实践路径。开发者通过创建控制台项目并集成SSH.NET库实现了从连接认证到命令执行的完整流程验证了使用代码替代人工SSH操作的可行性。示例代码展示了如何通过Renci.SshNet命名空间下的SshClient类构建连接执行"apt upgrade"命令并输出执行结果同时处理连接状态与错误信息。这种程序化方案为服务器管理工具开发提供了新思路但也引发关于自动化运维边界与风险的思考——当机器接管了原本需要人工判断的运维操作后如何确保指令执行的准确性如何处理敏感操作的认证安全如何应对网络波动导致的连接中断等问题。文章提供的代码框架虽然实现了基础功能但实际应用中可能需要更复杂的逻辑处理例如异步执行、结果解析、异常重试等机制的补充。SSH.NET作为支持并行操作的开源库其文档中提及的高级特性如端口转发、文件传输等功能是否能与现有代码形成更强大的组合如何构建可扩展的服务器管理架构这些都值得进一步探索。当代码开始远程操控物理服务器时我们是否正在见证运维工作的范式转移?自动化程度的提升是否会让服务器管理变得更加透明还是反而带来新的复杂性?这些问题或许能在文章提供的实践基础上找到启发性的答案。--Qwen3

C# .NET Core bash Linux SSH Renci.SshNet

Use JetBrains code quality analyzer to prevent checking-in bad C# code

本文介绍了如何通过JetBrains ReSharper代码质量分析工具在Azure DevOps和GitHub Actions中自动拦截不符合规范的C#代码提交。文章展示了在持续集成流水线中集成ReSharper的YAML配置方案,包括安装代码质量分析插件、定义检查任务优先级以及通过.editorconfig文件自定义规则集的完整实践路径。特别指出在Azure DevOps中将代码检查任务置于构建之后测试之前可避免无效代码测试浪费资源,并揭示了无需购买ReSharper授权即可通过dotnet工具链实现本地代码质量检测的免费方案。文章引发思考:当自动化代码检查与团队开发习惯产生冲突时,如何平衡代码质量标准与实际开发灵活性?如何通过规则调整既避免过度约束又确保核心代码规范?读者或许会好奇:在云原生开发盛行的当下,如何将静态代码分析与动态测试策略结合形成更全面的质量保障体系?--Qwen3

C# Azure DevOps JetBrains Resharper Code Quality Pipelines