Anduin Xue

let today = new Beginning();

All Posts


Retry with exponetial back-off on C#

本篇博客介绍了如何在C#中构建一个简单的重试引擎,使用指数退避算法来增加重试间隔。重试引擎的核心功能是在给定任务失败时,根据预设条件进行重试,直到达到最大尝试次数或任务成功完成。 博客中提供了一个RetryEngine类,其主要方法RunWithTry接受一个任务工厂、重试次数、错误处理条件以及超时时间作为参数。在执行任务时,若任务失败并满足重试条件,引擎会根据指数退避算法计算出一个等待时间并在此时间后进行重试。若达到最大尝试次数仍未成功,将抛出异常。 指数退避算法的实现在ExponentialBackoffTimeSlot方法中,通过计算2的次方来获取最大等待时间,并在此范围内随机选择一个时间作为实际等待时间。 在业务代码中,只需创建一个RetryEngine实例并调用RunWithTry方法即可实现任务的重试功能。例如,本文中给出了一个使用重试引擎执行网络请求的示例。 通过本文的介绍,您可以了解如何在C#中实现一个简单的重试引擎,并掌握指数退避算法的基本原理。但在实际应用中,可能还需要根据具体业务需求对重试引擎进行调整。那么,在您的项目中,如何根据实际情况调整重试策略呢?如何在保证任务成功执行的同时,避免过多的重试导致系统资源浪费?期待您的思考和实践。--GPT 4

C# .NET Retry

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

本文介绍了一种解决玄学问题的方法——夹逼调试法。玄学问题指的是那些在正常情况下能够正常工作,但在某些特定环境下无法正常工作的问题。夹逼调试法的核心思想是通过两个方向共同限制作用,使得问题根源的可能范围集中在最小化的条件变化中。具体操作方法包括构建一个理想环境,然后逐一对比出现问题的环境和理想环境之间的差异,通过调整这些差异,观察问题是否得到解决,从而找到可能导致问题的原因。 需要注意的是,夹逼调试法只能找到可能的原因,而不是必要、充分或充分且必要的条件。因此,该方法适用于需要快速定位可能原因的情况。本文还通过两个实际问题,详细演示了如何运用夹逼调试法进行问题定位和解决。在解决问题的过程中,我们可以发现夹逼调试法具有一定的实用性和效率,对于解决那些难以预料的因素导致的问题具有一定的参考价值。那么,在面对类似的玄学问题时,你是否会尝试运用夹逼调试法来寻找问题的根源呢?--GPT 4


The simplest way to retry in PowerShell

本篇博客详细介绍了如何在PowerShell中使用简单的方法进行重试操作。这种方法主要利用了do-try-catch-until语句,当执行某个具有较高崩溃概率的操作时,可以自动进行重试操作。在示例中,作者使用ping命令来演示这种重试机制。当ping失败时,程序会捕获到异常,并根据已尝试的次数来决定是否继续重试,直到成功或达到最大尝试次数。 在这个过程中,我们可以看到程序会在每次重试前输出当前尝试次数以及接下来的等待时间。这有助于我们了解程序的运行状态,同时可以根据需要调整等待时间。当达到最大尝试次数后,程序会抛出错误,并在日志中记录详细信息。 那么,如何使用这种重试机制来优化我们的脚本呢?在什么场景下这种重试机制会发挥最大作用?如何根据实际需求调整重试次数和等待时间?这篇博客为你提供了一个简单易懂的示例,帮助你更好地了解PowerShell中的重试机制。阅读全文,你将能够找到这些问题的答案,并学会如何在自己的PowerShell脚本中应用这种重试方法。--GPT 4

PowerShell Retry

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

本文讨论了国家在减轻学生作业负担和校外培训负担方面的政策,以及针对未成年人过度网络游戏、消费行为的制度建设。文章指出,现行政策虽然在一定程度上降低了家长的育儿压力,但仍存在诸多问题。例如,仅仅禁止课外培训活动和加强游戏监管,并不能引导学生投入有意义的事情;同时,可能会导致家长寻求地下黑市交易教育资源,助长黑市交易,甚至可能会有机构选择在境外开展培训教育。 文章建议,国家应该有配套政策来引导学生合理利用空闲时间,并从根本上解决家长养育压力的问题。例如,通过政策性调整,增加体育活动和社会实践的占比,让学生在课余时间学习乐器、演唱、绘画、雕塑等多样化课程。然而,实际操作中可能会遇到诸如学校人文教学能力不足、偏远地区教育资源不平等等问题。 此外,政策调整可能会对一些行业产生不利影响,如教育培训业。文章建议在实施前,可以考虑在一些教育资源充分的省市设立试验区,提前适应新模式,并给投资人和相关行业的企业留出充分的时间思考转型等。 那么,如何在保护未成年人的同时,平衡各方利益?如何让学生在课余时间投入有意义的事情,从而真正减轻家长的育儿压力?这些问题值得我们进一步思考。--GPT 4

China Politics Education

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

本篇博客介绍了如何在C#中查询Kusto(Azure数据资源管理器)并获得强类型结果。首先,需要安装Kusto客户端,然后构建一个抽象类作为Kusto响应行。接下来,创建一个名为“KustoRepository”的新类,并在其构造函数中构建一个新的KustoClient。为了获取应用ID和应用密钥,需要在Azure AD中注册应用并允许其访问Kusto客户端。然后构建查询函数,该函数将查询结果转换为强类型的列表。 建议将查询函数与缓存服务、重试引擎和`Task.Run()`进行包装,以提高性能、可靠性和代码风格。最后,在需要使用查询功能时,只需创建一个具有预期响应行类型的新类,然后使用查询函数即可。 本文提供了一个详细的示例,包括创建抽象类、KustoRepository类和查询函数的实现。通过阅读本文,读者可以了解如何在C#中实现对Kusto数据库的查询,并将查询结果转换为强类型数据。这种方法可以提高代码的可读性和可维护性,同时也可以方便地扩展到其他类型的查询。请问这种方法在实际项目中的应用有哪些优势?如何根据实际需求调整查询函数以满足不同场景的需求?--GPT 4

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

Build a common cache service for your C# app.

本篇博客介绍了如何为C#应用程序构建一个通用的缓存服务。文章详细讲解了如何使用CacheService类实现缓存功能,以及如何通过QueryCacheWithSelector方法进行缓存查询。同时,博客还提供了一系列测试用例来展示该缓存服务在不同场景下的表现。 在阅读本文后,你将了解到如何利用C#中的CacheService类实现缓存功能,以提高应用程序的性能。文章还探讨了如何利用选择器(selector)来实现更灵活的缓存策略,以及如何通过条件参数来控制缓存的行为。此外,博客还探讨了如何处理空值和缓存失效的情况。 那么,在构建C#应用程序时,如何确保缓存服务的高效运行?如何根据不同场景选择合适的缓存策略?如何在保证性能的同时,确保数据的准确性和实时性?阅读本文,你将找到答案。--GPT 4

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来恢复一个已删除的分支。首先,需要确保Git客户端已配置。接下来,在项目中安装Azure DevOps SDK。博客提供了用于恢复已删除分支的代码示例,其中包括了创建GitPushSearchCriteria对象、获取推送信息、创建GitRefUpdate对象以及调用UpdateRefsAsync方法来恢复分支。 在成功执行恢复分支的代码后,可以在本地运行`git fetch`命令,恢复的分支将会出现在本地仓库中。本文提供了一种简便的方法来恢复已删除的分支,这对于在意外删除分支后进行恢复非常有帮助。然而,在实际操作中是否能够顺利恢复取决于多种因素,例如分支的复杂性、项目的大小等。那么,除了使用Azure DevOps SDK,还有其他方法来恢复已删除的分支吗?如何确保在恢复分支的过程中不会引入潜在的问题?对于这些问题,希望读者能够在阅读本文的过程中思考并找到答案。--GPT 4

C# git Azure Azure DevOps SDK

Tips about rules setup for Outlook enterprise users

In this blog post, we discuss how to set up rules in Outlook for enterprise users, helping them manage and organize the thousands of emails they receive daily. With the proper rules in place, users can ensure they never miss important emails while also focusing on group mailboxes and automatically sorting emails into different folders based on their usage. To begin, it's essential to learn how to use the Outlook app to manage rules. A helpful resource for this can be found at [How to set a rule where my name is not in To or Cc field in Outlook? (extendoffice.com)](https://www.extendoffice.com/documents/outlook/4636-outlook-rule-where-my-name-is-not-in-to-cc.html). The blog post then shares a personal configuration for creating rules, which should be set up in a specific order: 1. Clean some useless content by moving emails from specific senders to designated folders, stopping further rule processing after moving. 2. Alert focused content by moving emails containing specific project ...--GPT 4


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

在过去的二十年,全球化在软件工程领域取得了长足的发展,然而近年来,逆全球化的趋势逐渐浮现。在这篇博客中,我们将探讨这种趋势背后的原因以及它如何影响我们构建和维护软件的方式。 在全球化的背景下,我们曾经认为构建的应用应该越来越“全球化”,即应用能够全球布局,全球服务。然而,随着近年来国际间政治局势的变化,人与人之间的不信任逐渐加剧,客户对网络和互联网耦合的服务产生了不信任。这种不信任导致了软件工程领域的逆全球化趋势。 在逆全球化的趋势下,我们不能无条件地将整个地球视为一个可以进行数据最终一致性的分区。考虑到许多国家的军队、机关、科研等都逐步面向私有网络和空气墙的模式,我们在尝试面向这些客户时,也必须考虑在完全本地的部署情况下应用的维护与运行。这意味着我们需要重新思考软件的构建和维护方式,以适应这种新的趋势。 容忍空气墙(AirGap)是这种新趋势下的一个关键问题。在面对这种情况时,我们可能需要考虑将私有云打包提供给客户,甚至将一整个系统,连带一整套有完整维护、更新、管理经验的组织结构一起交给他。这可能会产生截然不同,甚至是如今无法想象的合作模式:未来销售软件,销售的不再是光盘,不再是程序,而是销售的人,销售的组织结构。 虽然站在2021年的视角来看,这种逆全球化的操作还非常疯狂,但现实往往正是这样。在这样的背景下,我们需要重新审视我们构建和维护软件的方式,以适应这种不断变化的世界。那么,我们将如何应对这种逆全球化趋势,以确保软件工程能够继续发展和繁荣呢?这是一个值得我们深入思考和探讨的问题。--GPT 4

Multi-tenant China Software Development AirGap

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

本篇博客详细介绍了如何使用TypeScript构建一个可在浏览器和Node.js中使用的包。首先,我们需要安装必要的依赖,如terser-webpack-plugin、ts-loader、typescript、webpack和webpack-cli。接着,在项目中创建tsconfig.json文件,配置TypeScript编译选项。然后,在项目中创建一个名为src的文件夹,并在其中放置.ts文件。示例中展示了一个名为DisableWith的类,并将其导出为默认导出。 接下来,我们需要在项目的根目录下创建webpack.config.js文件,配置Webpack以便将TypeScript代码打包成UMD格式的库。在生产模式下,我们还会使用terser插件对包进行优化。最后,别忘了修改package.json文件,指定库的入口文件。 通过运行`npm run build`命令,我们可以构建项目,并在dist文件夹中生成相应的文件。然后,可以通过一个简单的示例来测试生成的库。最后,我们将项目发布到npm,使用户可以通过`npm install`命令安装我们的包,并在他们的项目中使用。 整个过程详细介绍了从项目创建到发布的每个步骤,为那些希望使用TypeScript构建库的开发者提供了很好的参考。在阅读本文后,你是否已经掌握了如何使用TypeScript构建可在浏览器和Node.js中使用的包?有没有什么可以改进的地方?欢迎阅读全文并进行深入探讨。--GPT 4

Web npm TypeScript node webpack JavaScript Front-end

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

This blog post discusses the use of Azure Key Vault to store connection strings for App Service, providing a secure way to manage sensitive information without compromising access control. Azure Key Vault is a tool designed to safeguard cryptographic keys and other secrets used by cloud apps and services. The article guides you through the process of creating a new Azure Key Vault, adding yourself as an administrator, and storing the production connection string. Once the secret is created, the reference URL is copied and wrapped using the @Microsoft.KeyVault() function. This wrapped URL is then pasted into the app service, replacing the real password. After saving the new value and restarting the app service, an identity is added to allow the app service to access the key vault. By using Azure Key Vault, you can manage your app service without touching confidential values and invite others to help manage it without revealing sensitive information, such as database passwords. This se...--GPT 4

Azure App Service Azure Security Key vault

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

在这篇博客中,我们将学习如何使用.NET Core和SSH.NET库编程地连接到远程服务器并执行命令。这对于构建服务器管理工具非常有用,尤其是当需要远程连接到Ubuntu服务器时。 首先,创建一个新的.NET Core项目,然后安装最新的SSH.NET库。接下来,编写一段使用SSH.NET库连接到远程服务器并执行命令的代码。示例中的代码将连接到远程服务器并运行`apt upgrade`命令。运行应用程序后,将自动连接到远程服务器并执行该命令。 SSH.NET库还有许多其他用途,可以查看其文档以了解更多信息。通过本文的示例,你将能够更好地理解如何使用.NET Core和SSH.NET库远程连接和管理服务器。在实际应用中,你可能需要根据自己的需求调整代码以满足不同的场景。 那么,你是否有兴趣尝试使用SSH.NET库来简化远程服务器管理呢?或者你是否有其他方法来实现类似的功能?让我们一起探讨吧!--GPT 4

C# .NET Core bash Linux SSH