kitlau
kitlau

kitlau's blog

All Posts


如何使用 CSharp 表达式树?

本篇博客详细介绍了如何使用 CSharp 表达式树,通过一个实际的例子展示了如何手动构建表达式树。博文首先解释了表达式树的概念,并通过 C# 中的语法树为读者提供了直观的理解。接着,博文对 .NET 中的 `Expression<TDelegate>` 类型进行了详细的解析,并通过代码示例展示了如何从 lambda 表达式生成 `Expression<TDelegate>` 类型的变量,以及如何将其编译成 `TDelegate` 类型的委托对象。然后,博文通过一个实际的例子,详细地介绍了如何手动构建表达式树,包括如何构建叶子节点和根节点,以及如何编译和调用表达式树。最后,博文提到了表达式树在简化值对象比较中的应用,并给出了相关的参考文档链接。那么,表达式树是否真的能够避免硬编码,从而使代码更易于维护呢?阅读全文,你将得到答案。--GPT 4

C#

【译】数据是如何存储在 SQL 数据库中

本篇博客主要讲述了数据在 SQL 数据库中的存储方式。首先,虽然表中的数据在逻辑上以行和列的格式存储,但在物理上,它以数据页的形式存储,数据页是 SQL Server 中数据存储的基本单位。其次,SQL Server 中的表数据实际上存储在一个类似树的结构中,这种树状结构被称为 B-Tree、index B-Tree 或 Clustered index structure。数据实际上存储在一系列数据页中,这些数据页的树形结构如下所示。在树底部的节点称为数据页或树的叶节点,正是这些叶节点包含我们的表数据。每个数据页的大小为 8KB,这意味着每个数据页中存储的行数实际上取决于每行的大小。位于树顶部的节点称为根节点,根节点和叶节点之间的节点称为 intermediate levels。根节点和中间层节点包含索引行,而叶节点包含实际的数据行。每个索引行包含一个键和一个指向 B 树中的中间层节点或叶节点中的数据行的指针。这个树状结构有一系列的指针,可以帮助数据库引擎快速找到数据。最后,文章简要介绍了 SQL Server 是如何通过 ID 找到一个数据行的。这篇博客对于理解 SQL 数据库的数据存储方式非常有帮助。你觉得 SQL Server 的这种数据存储方式有什么优点和缺点吗?--GPT 4

DB

【译】SQL 索引是如何工作的

本篇博客详细介绍了SQL索引的工作方式,包括聚集索引和非聚集索引的详细解释和实例演示。首先,博客解释了什么是聚集索引,如何通过ID查找数据行,并通过实例演示了如何创建一个包含一百万条数据的Employees表。然后,博客介绍了聚集索引查找和扫描的概念,以及它们的区别和使用场景。接着,博客解释了在SQL Server中创建非聚集索引的方法,以及非聚集和聚集索引的作用和使用方式。最后,博客通过实例演示了根据Name非聚集索引查询时的执行计划,以及Estimated Subtree Cost的概念。这篇博客对于理解和使用SQL索引非常有帮助,特别是对于需要处理大量数据的开发者。你是否了解过SQL索引的工作方式?你是否知道如何通过索引优化查询性能?你是否了解聚集索引和非聚集索引的区别和使用方式?阅读这篇博客,你将找到答案。--GPT 4

DB

如何在 CSharp 和 EF Core 中使用 UTC 时间

这篇博客主要讲述了如何在CSharp和EF Core中使用UTC时间,以及如何配合Mapster自动转换UTC时间到本地时间。首先,文章解释了什么是UTC时间,并详细描述了在C#中如何使用UTC时间,包括如何将所有DateTime和DateTime?类型且名称结尾为"Utc"的属性的Kind都设置为`Utc`。接着,文章介绍了如何配合EF Core使用UTC时间,通过在ApplicationDbContext.cs中进行设置,可以实现属性的批量转换。然后,文章探讨了如何便捷地使用UTC时间,将其转换为本地时间,包括三种常见的方式:给Product类再加`Created`和`Modified`两个属性,自定义一个Product类的DTO,或者使用AutoMapper或者Mapster等库来自动Mapping。最后,文章介绍了如何使用Mapster自动将UTC映射为本地时间。通过这些步骤,可以实现将ProductDto的Created和Modified都转换成美国的时间,避免了“在今天买到明天生产的牛奶”等问题。那么,你会选择哪种方式来使用UTC时间呢?--GPT 4

.NET

解锁 AI 的黑暗面:与无约束的 AI 模型交谈

本文主要探讨了无约束的 Vicuna 13B AI模型,这是一个开源的对话机器人,它在对话风格的交互方面表现出色,据称达到了 90% 的 ChatGPT 3.5 的质量。文章详细介绍了如何在本地运行 Vicuna 13B,并对其无约束版本的模型进行了实验。通过与模型的交谈,文章验证了 Vicuna 13B 模型能够回答一些 ChatGPT 无法回答的问题,如“如何摧毁一个小国的经济”。文章还提到了当前世界进入了 LLM 时代,很多问题实际上已经出现,但被 AI 高速的发展掩盖了。例如“Open”AI 的 GPT-3.5 和 GPT-4 都不“Open”,并不能让所有人公平的用上。这让人对 AI 的发展产生了一些担忧。如果你有兴趣了解更多关于 Vicuna 13B 模型的信息,或者你对 AI 的未来发展有所思考,那么这篇文章值得一读。你认为我们应该如何平衡 AI 的发展与其可能带来的风险呢?--GPT 4

AI

如何实现 AI 虚拟小镇?我与 NewBing 和 GPT-4 讨论了一下

本篇博客详细地讨论了如何实现一个AI虚拟小镇,其中的居民是由GPT-4驱动的NPC。博客首先提供了一个实现方案的概述,包括选择游戏引擎和向量数据库,创建NPC类,集成GPT-4语言模型,实现决策系统和交互系统,最后将游戏的各个组件连接起来。然后,博客提供了一些代码示例,用于初始化游戏和数据库,定义NPC类,创建NPC和环境元素,实现决策系统和交互系统,以及集成语言模型。最后,博客讨论了如何进一步完善游戏,包括实现更详细的决策系统和交互系统,优化代码结构,以及添加UI和音效等游戏元素。这篇博客为开发者提供了一个实现AI虚拟小镇的详细指南,同时也引发了一些有趣的问题,比如如何优化NPC的决策系统和交互系统?如何根据NPC的记忆生成决策?如何处理NPC与环境元素和其他NPC的交互?希望读者能够通过阅读全文找到答案。--GPT 4

AI

C# 3 年前的 record 你现在用上了吗?

这篇博客主要讨论了C#中的record类型,它是一种不可变的引用类型,具有值语义,主要适用于表示不可变的数据结构。文章首先通过深入解析record类型的代码实现,揭示了其内部工作原理。接着,文章对比了record、class和struct三种类型的主要区别,包括不可变性、引用类型与值类型、值语义、继承、构造函数和析构函数以及解构等方面。然后,文章从内存层面探讨了这三种类型的差异,包括引用类型与值类型的表现、垃圾回收行为以及装箱与拆箱操作等。文章还探讨了为何record类型鲜有应用,认为这反映出了对代码质量的忽视。最后,文章呼吁开发者重视代码质量,充分利用record类型的优势,编写更高质量的代码。然而,随着AI编程工具的发展,未来编程实践可能会发生巨大变革,这是否意味着我们应该重新考虑我们对代码质量的关注和record类型的应用呢?--GPT 4

.NET

金鱼也能看懂的 Postgres 和 MySQL 选择指南

这篇博客提供了一个详细的指南,帮助读者在选择 Postgres 和 MySQL 这两个流行的关系型数据库系统时做出决策。文章首先介绍了两者的相似之处,如都是关系型数据库管理系统,都支持JSON和SQL。然后,文章详细对比了两者的区别,例如,Postgres是一个功能强大、高度可扩展且被广泛认为是一个更加安全的数据库系统,而MySQL则在Web应用程序开发中非常受欢迎,易于安装和配置,并且可以处理大量的并发请求。文章还针对不同的使用场景,给出了选择Postgres和MySQL的建议。例如,如果需要处理大量的并发请求和快速部署,那么MySQL是更好的选择,而如果需要更高级的功能和更好的安全性,那么Postgres是更好的选择。文章的结论是,选择哪个数据库系统取决于你的特定需求,希望这篇文章能帮助你做出最好的选择。你觉得你的项目更适合使用哪个数据库系统呢?--GPT 4

DB

微服务生产环境故障难调试?OpenTelemetry 了解一下?

本篇博客详细介绍了OpenTelemetry在.NET中的应用以及如何使用OpenTelemetry和Jaeger对微服务系统进行仪表化,收集和展示遥测数据。文章通过一个运行在k8s中的微服务系统作为实战案例,演示了如何实现分布式追踪,并通过Jaeger UI查看和分析Trace信息。此外,还讨论了OpenTelemetry如何解决微服务系统中的一些业务问题,包括快速定位线上问题的根源、分析系统的性能瓶颈和优化点、监控系统的运行状态和健康度等。同时,文章还探讨了OpenTelemetry Logs如何解决传统日志在分布式系统中的一些痛点问题,例如难以监控复杂多变的系统状态和行为、难以实现跨平台、跨语言、跨组件的日志集成等。最后,作者提醒读者,如果想要深入探索可观测性相关的内容,可以阅读官方文档或等待他的后续文章。那么,你是否已经对如何在.NET中使用OpenTelemetry有了一定的了解呢?你觉得OpenTelemetry能否解决你当前面临的问题呢?--GPT 4

.NET OpenTelemetry

为什么我的接口,慢得跟蜗牛一样啊?系列文章目录与导读

"为什么我的接口,慢得跟蜗牛一样啊?"是一个系列文章,旨在解决生产环境中经常遇到的问题。该系列文章将通过多篇文章,介绍如何分析和处理线上问题。第一部分已经完结,主要介绍了如何为应用配置完善的日志、计时、请求追踪和诊断信息,以及如何将日志记录到Seq这种日志中心,轻松进行日志分析。第二部分则着重介绍了OpenTelemetry,这是一个强大的工具,可以帮助我们更可靠、更高效地定位线上问题的根源,分析系统业务问题、性能瓶颈和优化点,以及监控系统运行状态和健康度。这个系列文章的目的是帮助读者提高软件的可靠性和效率,以及快速定位和解决线上问题。那么,你是否已经对如何提高接口速度有了一些新的想法和理解呢?--GPT 4

.NET Performance