Anduin Xue

let today = new Beginning();

Featured Posts


UWP 一个技术上成功但商业上失败的框架之死;一个现代的操作系统究竟应该提供什么?

本文探讨了UWP(通用Windows平台)框架的技术优势与商业失败。UWP框架解决了许多Windows操作系统面临的问题,如应用商店、版本管理、依赖管理、存储空间管理、自动更新等。然而,尽管技术上表现出色,UWP在商业上却未能取得成功,原因包括:市场份额丧失、应用质量不高、开发难度较大等。 在现实中,UWP已经失去了市场竞争力,许多开发者和用户放弃了这个框架。微软自家的UWP应用质量也不高,功能稀缺,导致用户对UWP的印象普遍不佳。此外,开发一个UWP应用的难度并不低,许多开发者更愿意选择其他框架。 总之,尽管UWP在技术上具有诸多优势,但由于商业上的失败,它已经失去了生存的希望。新的开发框架MAUI正在崛起,但它放弃了UWP的优点,回归了Win32的开发模式。这让人不禁思考,未来的应用是否还会面临类似UWP的命运。--GPT 4

C# Microsoft Windows Microsoft Store UWP

Install your own NFS ESXI storage server

本篇博客详细介绍了如何安装和配置自己的NFS ESXI存储服务器。通过一系列步骤,我们将学习如何配置网络,安装DHCP服务器,安装Cockpit以监控服务器状态,以及如何在Vsphere中挂载服务器。文章详细阐述了每个步骤的操作方法和注意事项,以图文并茂的形式展示了操作过程。 在配置网络部分,我们将学习如何在NFS服务器和ESXI服务器之间建立连接,以及如何通过桥接多个光纤端口来简化管理。为了提高性能,我们可以使用光纤直接连接ESXI主机和存储服务器。同时,我们还将安装DHCP服务器,并进行相应的配置。 Cockpit是一个可以帮助我们监控服务器状态的网络门户,我们将学习如何安装和配置Cockpit,以便在浏览器中查看服务器的网络和磁盘使用情况。在Vsphere部分,我们将学习如何为ESXI主机准备挂载NFS存储,并在VCenter服务器中添加新的存储。 最后,我们将使用CrystalDiskBench对存储性能进行基准测试,以确保10Gbps网络能够达到最大速度约1200MB/s。在整个过程中,我们需要密切关注网络使用情况和磁盘使用情况。 通过阅读本篇博客,您将能够掌握搭建NFS ESXI存储服务器的方法和技巧。那么,为什么我们需要在网络中安装额外的DHCP服务器呢?如何在浏览器中访问Cockpit并监控服务器状态?阅读全文,您将找到答案。--GPT 4

Linux Storage NFS VMware ESXI Vsphere Dell IPMI Debian Server

Install Nextcloud on a Ubuntu 20.04\22.04 server

本篇博客详细介绍了如何在Ubuntu 20.04/22.04服务器上安装Nextcloud。文章分为17个步骤,包括安装所需的软件包、配置数据库、创建Nextcloud目录、设置权限、配置Apache、安装和配置SSL证书、设置大文件上传、配置Cron、调整数据存储位置、完成区域设置、完成电子邮件设置、完成Redis设置、设置备份、设置反向代理(可选)以及设置GPU。 文章还提供了一些有趣的问题,以吸引读者阅读并启发思考。例如,在调整数据存储位置时,如何确保在重启后云仍然可以正常工作?在设置备份时,如何自动运行备份脚本以确保数据安全?在设置反向代理时,如何避免出现问题? 通过阅读本篇博客,读者可以了解到如何成功安装和配置Nextcloud,以及如何根据自己的需求进行一些额外的设置。在文章的最后,作者还提到了如何为Nextcloud添加GPU支持,以便在安装了识别应用程序的情况下提高性能。 现在,你是否对在Ubuntu服务器上安装Nextcloud感兴趣?是否想知道如何通过这些设置来优化你的Nextcloud实例?快来阅读全文,自己找到答案吧!--GPT 4

Web Linux Ubuntu IT Apache2 PHP MySQL Certbot Nextcloud Storage

Install Windows 11 on Vultr cloud machine

本篇博客详细介绍了如何在Vultr云服务器上安装Windows 11。首先,我们需要下载Windows 11的ISO文件,并将其转换为WIM文件。接着,准备一个新的磁盘驱动器以供安装Windows 11。在完成这些准备工作后,我们需要解压Windows 11的WIM文件,然后设置相应的启动配置。重启服务器后,通过VNC连接并完成Windows 11的初始设置。最后,启用远程桌面服务并删除旧的Windows Server。 在阅读这篇博客后,你会了解到在云服务器上安装Windows 11的整个过程。这将有助于你在云端搭建自己的个人电脑,并随时随地通过远程桌面连接使用。此外,你还可以为家人和朋友创建更多的云电脑,让他们也能随时随地体验Windows 11的便捷。 那么,云电脑的未来会是怎样的呢?随着技术的发展,云电脑是否会成为我们日常生活中不可或缺的一部分?请继续关注我们的博客,探讨云电脑的未来趋势!--GPT 4

PowerShell Windows Server Cloud Windows Windows 11 DISM Bcdedit Vultr Cloud PC

Validate an object in any C# projects

本篇博客详细介绍了如何在C#项目中使用对象验证,以确保输入模型的有效性。文章首先讲解了如何在纯C#环境中使用验证,通过复制一个简单的函数来实现。接着,文章展示了如何在类定义中为属性设置验证规则,如:Required、MinLength和Range等。然后,文章讨论了如何在代码中使用这些验证规则,以及如何根据验证结果输出相应的错误信息。 在某些情况下,系统提供的验证规则可能无法满足特定需求。因此,文章还介绍了如何创建自定义验证属性。例如,验证属性不包含空格或换行符。通过创建一个自定义的验证属性类,我们可以实现这一需求。最后,文章提供了一个完整的示例代码,演示了如何在项目中使用对象验证功能。 在阅读本篇博客后,你是否对C#项目中的对象验证有了更深入的了解?文章中的示例代码是否能帮助你更好地理解如何使用和自定义验证规则?在你的项目中,是否有其他需求需要自定义验证属性来实现?如何利用本文介绍的方法来优化你的项目代码?--GPT 4

ASP.NET Core C# .NET Validation

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

本篇博客文章介绍了如何在不使用USB驱动器的情况下,与现有操作系统并行安装Windows 11。首先,需要获取Windows 11的ISO文件并找到其中的Install.wim(或Install.esd)文件。接下来,在计算机上创建一个新的、干净的分区,用于安装新的Windows系统。然后,提取install.wim(esd)文件到新分区,并为新Windows添加启动项。最后,重启计算机,在启动菜单中选择新安装的操作系统即可。 在完成这个过程的过程中,你可能会遇到一些问题。例如,如何选择正确的Windows版本进行安装?如何确保新分区足够大以容纳新的操作系统?如何正确地将install.wim(esd)文件提取到新分区?以及如何确保新分区能够正常启动新的操作系统?本文详细解答了这些问题,并提供了相应的解决方案,如使用7zip打开install.wim(esd)文件,查找适合的Windows版本;使用磁盘管理工具创建新分区;以及使用命令行工具(如dism和bcdedit)完成文件提取和添加启动项等操作。 在阅读本文后,你将能够顺利地完成Windows 11的并行安装,无需依赖USB驱动器。但在实际操作过程中,你可能还会遇到其他问题,如何解决这些问题?尝试阅读全文,从中找到答案。--GPT 4

Windows 10 PowerShell Windows Windows 11 Install DISM Bcdedit Boot BCD

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

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

Best-practice for authentication after creating a new Linux server

在这篇博客中,我们探讨了在创建新的Linux服务器后进行身份验证的最佳实践。文章详细讲述了如何确保服务器的安全性,包括使用SSH密钥、创建强密码以及限制不必要的服务等方面。同时,博客还提供了一些实用的命令和技巧,帮助读者轻松地完成身份验证过程。在阅读本文后,您将了解到如何在创建新的Linux服务器后实施有效的身份验证策略,以确保服务器的安全和稳定运行。 文章引发了一些有趣的问题,例如:如何在不同的Linux发行版中实现类似的安全策略?如何确保在云环境中部署的Linux服务器同样安全?以及在遇到攻击时,如何快速识别并采取相应的防范措施?这些问题将激发读者思考更多关于Linux服务器安全的话题,并可能引导他们深入研究相关领域。 在阅读这篇博客时,希望您能够思考如何将这些最佳实践应用到自己的服务器环境中,以及如何根据实际需求调整这些建议。最后,您是否认为这些最佳实践足以确保服务器的安全,还是需要进一步探索其他方法来增强服务器的防护能力?我们期待您在阅读全文后,找到这些问题的答案。--GPT 4

bash Linux Ubuntu SSH

微信的架构是如何实现分布式消息分发?

微信作为生活中不可或缺的通讯工具,其架构设计之巧妙令人称赞。本文探讨了微信如何通过分布式架构实现高效的消息分发。文章首先提出了一些关于微信的疑问,例如需要手机扫码登录PC端、切换设备后无法同步聊天记录等,然后通过深入分析微信的架构设计,解释了这些现象背后的原因。 文章提出,微信采用了分布式应用架构,其服务器遍布全球各地,没有中心化的服务器。为了实现分布式通讯,微信至少需要设计三个算法:服务器选择算法、服务器端切换算法和用户发现算法。这三个算法共同保证了用户能够快速定位到合适的微信服务器并进行通信。 分布式架构的设计带来了许多好处,例如运维上的便利、对单台服务器生命的弱化、国际化应用的支持等。此外,文章还通过类比Email的通信过程,解释了微信群聊、文件传输等功能的实现原理。 最后,文章指出许多产品经理可能无法理解微信架构设计的复杂性,而盲目模仿或吐槽微信的槽点。实际上,微信的设计非常精巧,为用户提供了高效便捷的通讯体验。然而,这种设计也存在一定的局限性,有些功能并非程序员脑残,而是数据结构本身无法支撑。因此,产品经理在设计产品时,需要更深入地了解技术架构,避免提出不切实际的需求。--GPT 4

Web WeChat Distributed Messging IM

EF second layer cache to enhance your SQL database performance based on Redis

本篇博客介绍了如何使用基于Redis的EF第二层缓存来提高SQL数据库性能。首先,安装`EFCoreSecondLevelCacheInterceptor`包,然后在`StartUp`类的`ConfigureServices`方法中进行相应的配置。这个缓存会在通过使用这个库的DbContext更改实体(插入、更新或删除)时更新。如果数据库通过其他方式(如存储过程或触发器)更新,缓存将变得过时。但是,如果我们的应用程序在多个实例中运行,数据库的更改可能不适用于其他实例,可能会导致许多问题。此时,我们需要使用Redis来存储缓存。 Redis是一种开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。本文介绍了三种安装Redis的方法,分别是在Redis官网下载安装、在Windows Server上安装及在Azure上创建Redis缓存实例。安装完成后,使用命令安装`EasyCaching.Redis`包,并修改`StartUp`方法以连接Redis数据库并使用Redis存储Entity-Framework Core的缓存,支持扩展。 此外,还需在`appsettings.json`文件中添加正确的Redis连接信息。这样,在启动过程中,应用程序将尝试连接到Redis数据库,并使用Redis缓存数据库结果。在不修改代码的情况下,ASP.NET Core应用程序的性能得到了极大的提升。Redis值得称赞! 那么,如何在多实例应用程序中保持可扩展性呢?使用Redis作为缓存存储是否足够满足我们的需求?在实际应用中,我们可能还需要关注其他性能优化策略。--GPT 4

ASP.NET Core C# SQL Server SQL Entity Framework Core Azure Redis Caching Cache