Anduin Xue

let today = new Beginning();

All Posts


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

在过去的二十年,全球化在软件工程领域取得了长足的发展,然而近年来,逆全球化的趋势逐渐浮现。在这篇博客中,我们将探讨这种趋势背后的原因以及它如何影响我们构建和维护软件的方式。 在全球化的背景下,我们曾经认为构建的应用应该越来越“全球化”,即应用能够全球布局,全球服务。然而,随着近年来国际间政治局势的变化,人与人之间的不信任逐渐加剧,客户对网络和互联网耦合的服务产生了不信任。这种不信任导致了软件工程领域的逆全球化趋势。 在逆全球化的趋势下,我们不能无条件地将整个地球视为一个可以进行数据最终一致性的分区。考虑到许多国家的军队、机关、科研等都逐步面向私有网络和空气墙的模式,我们在尝试面向这些客户时,也必须考虑在完全本地的部署情况下应用的维护与运行。这意味着我们需要重新思考软件的构建和维护方式,以适应这种新的趋势。 容忍空气墙(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

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

在本博客中,我们将探讨如何使用Azure DevOps和JetBrains代码质量分析器自动检查C#代码质量并拒绝包含不良代码的Pull Requests。首先,我们需要安装JetBrains代码质量检查器,然后将其添加到构建管道中。在构建任务后和测试任务前插入此任务,以确保在没有构建项目的情况下不会引发问题。并选择合适的严重性级别,以便在检测到无效代码时使管道失败。 对于GitHub Actions,我们也可以轻松地将其应用到GitHub Actions中,只需参考给出的yaml代码即可。此外,我们还需要在本地检查代码质量并生成报告。虽然购买ReSharper是最好的方法,但我们还是可以免费使用代码质量检查工具。通过运行给出的命令,可以在本地安装语法检查工具并运行检查。 为了调整检查级别或抑制警告,我们可以创建一个.editorconfig文件并添加相应的规则。通过参考给出的链接,我们可以查询.editorconfig的所有级别属性。如此一来,我们就拥有了一个完整的C#代码质量自动检查解决方案,而且是免费的!祝您编码愉快!在这个过程中,你有没有想过如何根据项目需求调整代码质量检查标准?或者如何在本地生成详细的代码质量报告以进行调试和优化?--GPT 4

C# Azure DevOps JetBrains Resharper Code Quality Pipelines

FFmpeg 用法概览

本篇博客概括了FFmpeg的用法,包括视频转码、硬件加速、直播推流、整合视频和音频、修改视频分辨率、调整视频速度、剪取视频的一段时间、用ffmpeg扣取一个视频区域、反转视频等。文章详细介绍了每个操作的命令和参数,并给出了示例。此外,博客还推荐了SRS项目和flv.js,用于搭建直播平台和在网页里加载FLV直播流。通过阅读本文,您将了解如何使用FFmpeg进行各种视频操作和直播推流,实现类似Bilibili直播的播放体验。那么,您准备好尝试这些功能了吗?或许您可以思考如何将这些技能应用到您的项目中,为观众带来更好的观看体验。--GPT 4

bash FFmpeg

C# run tasks in a threads pool with fixed size

在本文中,我们将探讨如何在C#中使用固定大小的线程池运行任务。首先,我们提供了一个`CannonQueue`类,该类使用`SafeQueue`来存储待处理的任务,并使用`RunTasksInQueue`方法来并行执行这些任务。为了能够动态地向任务池中添加任务,我们修改了`QueueNew`方法,使其在添加任务时重新启动引擎。同时,我们还提供了一个`QueueWithDependency`方法,以便在需要访问诸如数据库或HTTP之类的依赖项时保持依赖项处于活动状态。 最后,我们展示了如何注册`CannonQueue`作为单例依赖项,并如何在实际应用中使用该服务。例如,我们可以使用`QueueNew`方法将下载任务添加到队列中,并利用`RunTasksInQueue`方法并行执行这些任务。此外,我们还可以使用`QueueWithDependency`方法来处理具有依赖关系的任务,例如使用Entity Framework的任务。 那么,如何在实际应用场景中高效地利用这个线程池呢?本文提供的方法是否足够满足您的需求,还是需要进一步优化?在实际开发过程中,可能会遇到哪些挑战和问题?希望这篇文章能够启发您的思考,帮助您找到解决方案。--GPT 4

C# Async Task Multi-Threading

Display code coverage information for .NET Core project using Azure DevOps.

本文介绍了如何在.NET Core项目中使用Azure DevOps显示代码覆盖率信息。首先,需要在Azure DevOps中创建一个构建管道。对于使用经典设计器的用户,需要添加一个新的.NET Core命令行步骤,并确保发布测试结果。在参数输入中,插入:--configuration $(buildConfiguration) --collect "Code coverage"。对于使用YAML的用户,添加任务:DotNetCoreCLI@2,并使用相应的输入参数。 请注意,始终使用Windows平台运行构建,不要在Linux上运行,因为代码覆盖率生成器尚不支持Linux。保存并运行管道后,可以在构建完成时查看代码覆盖率和测试结果。在本文的示例中,代码覆盖率为87%。 要获取徽章URL,首先复制URL中的以下部分。复制URL的三个部分,如示例中的A、B和C。然后复制以下markdown文本:![Azure DevOps coverage](https://img.shields.io/azure-devops/coverage/{{A}}/{{B}}/{{C}})。将A、B和C更改为复制的值,如:![Azure DevOps coverage](https://img.shields.io/azure-devops/coverage/aiursoft/Star/5)。将其保存在readme.md中。 完成上述步骤后,即可在.NET Core项目中显示代码覆盖率信息。这样的功能对于开发者来说,无疑是一个很好的辅助工具,可以更好地了解代码的覆盖情况,提高代码质量。那么,如何更好地提高代码覆盖率呢?这将是一个值得思考的问题。--GPT 4

.NET Core Azure DevOps .NET Test MSTest Integration Test Code coverage GitHub

ASP.NET Core Integration Test using MSTest

在官方文档中,仅有一个使用xunit进行ASP.NET Core集成测试的示例。但如果你不喜欢xunit呢?我们能否用MSTest替换它?答案是可以的。 首先,卸载xunit并安装MSTest。清理项目结构,然后为测试项目安装MSTest。接下来,在测试项目中启动服务器。在测试项目下创建一个名为`BasicTests.cs`的新类。将以下代码放入基本测试中,当测试开始时,它将自动启动一个新的ASP.NET Core Web服务器,并使用来自主Web项目的Startup。 接下来,添加一个简单的测试。在测试类中插入一个新功能。在这个新测试中,你将请求测试服务器并检查结果。现在你可以运行测试了!在Visual Studio中,或者在解决方案文件夹下执行`dotnet test`。 最后,考虑测试清理。在测试之后,你应该停止服务器以防止影响其他测试。只需停止并释放服务器即可完成工作。 本文讨论了如何使用MSTest替换xunit进行ASP.NET Core集成测试,并提供了详细的步骤。那么,使用MSTest进行集成测试是否能带来更好的测试效果?在实际应用中,MSTest和xunit之间的性能差异如何?这些问题留给读者自己探索和找到答案。--GPT 4

ASP.NET Core C# .NET Core Test MSTest Functional Test Integration Test

Fire and forget in ASP.NET Core with dependency alive

在C#中,实现fire and forget非常简单,只需使用Task.Run(() => FireAway())。然而,在ASP.NET Core控制器中,这种方法可能并不合适。当我们在控制器中触发一个耗时的任务,任务将作为fire-and-forget成功启动。但在处理HTTP响应后,控制器可能会被释放,这意味着依赖项可能不再存在,因此任务可能无法完成。 为了在触发任务时始终保持依赖项处于活动状态,我们需要创建一个新的服务来包含它,这个新服务必须是单例的,因为单例服务永远不会被释放。我们需要在服务中获取依赖项,而不是在控制器中,因为控制器的生命周期依赖于HTTP上下文,而单例服务则不依赖。 创建一个新类CannonService,并在StartUp.cs的ConfigureServices方法中将其注册为单例。在控制器中使用时,只需将CannonService注入到控制器中,然后调用一个依赖于某些耗时操作的函数。这个方法不会阻塞当前线程,可以直接向客户端返回结果,而发送器在发送邮件时始终保持活动状态。 作者已将上述代码发布为一个Nuget包。你可以在这里查看源代码:[Aiursoft.Canon](https://gitlab.aiursoft.cn/aiursoft/canon/-/tree/master),也可以在这里下载包:[Nuget.org](https://www.nuget.org/packages/Aiursoft.Canon/)。 这篇博客分享了在ASP.NET Core中实现fire and forget的方法,以及如何确保依赖项在任务执行过程中保持活动状态。那么,你是否考虑过在自己的项目中使用这种方法来优化性能呢?--GPT 4

ASP.NET Core C# Async Fire and forget

How to serialize JSON object in C# without Newtonsoft Json

本篇博客介绍了如何在C#中不使用Newtonsoft.Json库进行JSON对象的序列化和反序列化。在某些情况下,我们可能无法访问`Newtonsoft.Json`包,例如当不同的包使用不同版本的库时,可能会导致构建过程中的版本冲突。这通常发生在一些非常大的项目中。 本文提供了一个名为`MyJsonConverter`的静态类,其中包含两个方法:`Serialize`用于将对象序列化为JSON字符串,`Deserialize`用于将JSON字符串反序列化为对象。这个类使用了`System.Runtime.Serialization.Json`命名空间中的`DataContractJsonSerializer`类来实现序列化和反序列化。 通过这个类,我们可以像使用`Newtonsoft.Json`一样简单地进行JSON操作。示例代码创建了一个名为`Book`的简单类,并使用`MyJsonConverter`将其序列化为JSON字符串,然后将该字符串反序列化为`Book`对象。运行结果显示序列化和反序列化均成功。 这篇博客提供了一个在不依赖`Newtonsoft.Json`的情况下进行JSON操作的替代方案。那么,在实际项目中,我们是否应该放弃使用`Newtonsoft.Json`呢?这个问题值得我们深入思考。--GPT 4

C# JSON .NET Newtonsoft.Json

Enable PowerShell remoting for Windows Server machines

本篇博客主要讲述了如何在Windows Server上启用PowerShell远程功能。就像在Linux机器上使用SSH执行远程命令一样,你也可以在目标Windows Server上执行远程PowerShell命令。博客提供了详细的步骤,包括使用自签名证书启用HTTPS远程功能、配置监听地址以及在本地机器上通过PowerShell连接到服务器。 首先,我们需要在服务器上执行一系列命令来移除旧的监听器、创建自签名证书并启用HTTPS远程功能。接下来,在本地机器上执行命令来跳过CA检查(因为我们使用的是自签名证书),然后输入服务器的计算机名、SSL选项、端口号、会话选项和凭据。之后,系统会提示输入密码。 如果一切顺利,你将成功连接到服务器。但如果无法连接,可能是因为端口被阻止了。此时,可以在服务器上执行命令来解除端口阻止。 本文详细介绍了在Windows Server上启用PowerShell远程功能的方法,以及如何解决可能遇到的问题。那么,你是否已经准备好尝试这些操作,实现在Windows Server上的远程PowerShell功能呢?--GPT 4

PowerShell Windows Server Remote Management WMI