如何刷算法?

算法是所有程序员们逃不掉的一座大山,如何开始学习算法是许多人面临的一大难题。 时间复杂度和空间复杂度是衡量算法优劣的两个非常重要的指标。 时间复杂度 (待补充) 空间复杂度 (待补充) 线性数据结构 数组 (待补充) 链表 (待补充) 栈 (待补充) 非线性数据结构 树 (待补充) 图 (待补充) 哈希表 (待补充) 扩展阅读 想刷算法,但又苦于不知道如何开始的同学该怎么做?

继续阅读 »

JSON序列化: System.Text.Json与Newtonsoft.Json

两者的比较 System.Text.Json: 官方, 高性能, 低内存, 默认行为严格, 相对不灵活, 支持源生成, AOT Newtonsoft.Json: 第三方, 性能较高, 功能丰富, 默认行为相对宽松, 强大的灵活性, 不支持源生成, 不能AOT System.Text.Json迁移至Newtonsoft.Json, 简单 Newtonsoft.Json迁移至System.Tex...

继续阅读 »

.NET的NativeAOT编译指南

什么是AOT有何优点 JIT(即时编译): 是一种在程序运行之前将源代码或中间代码编译成目标平台的机器代码或可执行代码的编译技术。 AOT(提前编译): 是一种编译技术,它在程序运行之前将源代码或中间代码(如字节码)转换为目标平台的机器代码。 AOT相对JIT优点: 更快的启动时间:译。 更小的内存占用:可以在不需要安装.NET运行时的环境中运行。 不依赖.NET环境: 生成一个包含环境的...

继续阅读 »

记一次用wsl2中共享宿主机的代理-v2rayN

起因 在公司中使用Windows系统, 开发中使用WSL2并装了Ubuntu22.04系统, 在Linux系统中使用拉取各种包时会出现大量超时, 导致工作效率非常低下. 在WSL2中设置 在WSL系统查看宿主机IP和端口, 使用命令:ip route | grep default | awk '{print $3}, 在v2ray主界面可以看到http代理端口. 设置代理脚本 # 添加...

继续阅读 »

c#中如何扩展一个类?

约定 // 示例类, 后面一些基于此类扩展 public class Person { public string Name { get; set; } public DateTime Birthday { get; set; } } 扩展方法(Extension Methods)(C#3.0) 扩展方法特点: 定义一个静态类 静态类中实现一个静态方法 静态方法中的第一...

继续阅读 »

Nginx日志按天分隔

脚本日志分隔 宝塔面板的计划任务-新建计划任务-任务类型-网站日志切割可以批量配置网站的日志切割脚本, 每天晚上执行一次. Nginx模块日志分隔 nginx日志切割,这里使用的是默认安装的ngx_http_map_module插件, 可以使用nginx -V命令查看已安装的模块. 先设置一个nginx变量$logdate 将如下代码添加入nginx的http模块中 map $time_is...

继续阅读 »

有限状态机FSM(finite-state macine)

常用概念 状态机 状态机(State Machine)全称是[有限状态自动机],不是指一台实际机器,而是现实事物运行规则抽象而成的一个数学模型。它由一组状态、转移条件和动作组成。 这里的自动可以理解成: 给定一个状态机,同时给定它的当前状态以及输入,那么输出状态是可以明确地运算出来的。 状态, 表示了系统或程序所处的特定情况或阶段, 可以分为改变前状态/改变后状态。 条件, 在什么条件下从...

继续阅读 »

C#模式匹配汇总

模式匹配概述 C# 支持多种模式,包括声明、类型、常量、关系、属性、列表、var 和弃元等,在is、switch语句、switch表达式中使用,还可以使用布尔逻辑关键字 and、or 和 not 组合多个模式,极大的简化了代码编写,可读性也还不错。 模式匹配详解 类型和声明模式 检查类型是否匹配,同时申明变量,如果类型兼容则申明并赋值变量,该变量在后面代码作用域中有效。 object ag...

继续阅读 »

c#的源代码生成器SourceGenerator

简介 微软在 .NET 5 中引入了 Source Generator 的新特性,利用 Source Generator 我们可以在应用编译期间根据当前编译信息动态生成代码,而且可以在我们的 C# 代码中直接引用动态生成的代码,从而大大减少重复代码。 前面我们介绍过Emit和表达式树,本篇讲到的源代码生成器也是同样一个动态代码生成方案,他们之间的区别: Source Generators在...

继续阅读 »

C#的表达式树(System.Linq.Expressions)

概述 在C#编程中,表达式树(Expression)是一种数据结构,表达式树也称表达式目录树,是将代码以一种抽象的方式表示成一个对象树,树中每个节点本身都是一个表达式。表达式树不是可执行代码,它是一种数据结构。但是可以利用LambdaExpression类的派生类Expression<TDelegate>将表达式树转化成可执行的Lambda表达式的委托,当然也可以将Lambda表...

继续阅读 »

C#的System.Reflection.Emit教程 - 显著改善反射性能

第一部分:Emit介绍 Emit 是开发者在掌握反射的使用后,进阶需要的知识,它能显著的改善因反射带来的性能影响。 Emit 是一种动态生成IL代码的技术,通过使用 System.Reflection.Emit 命名空间中的类,可以在运行时创建和修改程序集、类型和方法。 Emit 技术通常用于解决需要在运行时动态生成代码的特定场景,例如在ORM(对象关系映射)框架中动态创建实体类,或者在AO...

继续阅读 »

.NET 高性能和零开销指南

背景 2008 年前后的 Midori 项目试图构建一个以 .NET 为用户态基础的操作系统,在这个项目中有很多让 CLR 以及 C# 的类型系统向着适合系统编程的方向改进的探索,虽然项目最终没有面世,但是积累了很多的成果。近些年由于 .NET 团队在高性能和零开销设施上的需要,从 2017 年开始,这些成果逐渐被加入 CLR 和 C# 中,从而能够让 .NET 团队将原先大量的 C++ 基...

继续阅读 »

C#反射时调用GetValue/SetValue方法时的拆箱和装箱操作

什么是拆箱和装箱操作 .NET的类型分为两种,一种是值类型,另一种是引用类型。这两个类型的本质区别,值类型数据是分配在栈中,而引用类型数据分配在堆上。 装箱操作: 值类型转化成引用类型; 拆箱操作: 引用类型转化为值类型。 装箱和拆箱过程需要进行大量的计算。 对值类型进行装箱时,必须创建一个全新的对象。这可能比简单的引用赋值用时最多长 20 倍。 拆箱的过程所需时间可达赋值操作的4倍。[...

继续阅读 »

浏览器http自动跳转到https的解决方案

最近在做网站时,遇到了一个问题,目前主流浏览器当同时开通了http与https时,默认会将http自动跳转到https。会产出一些问题,例如在未合理配置的情况下导致了http页面请求https的内容时,反之也一样,会出现跨域或者请求失败的情况。 当关闭https后,可能因为浏览器缓存等原因导致http还是会继续跳转到https导致请求错误。 下面是解决其强制自动跳转的方法 chrome浏览器...

继续阅读 »

开源数据集成/清洗/转化工具pentaho-kettle&OpenRefine&airbyte

pentaho-kettle Kettle,也称为Pentaho Data Integration,是一款强大的开源ETL(Extract, Transform, Load)工具。它主要用于从多个数据源提取数据,并对数据进行转换和加载到目标系统中。Kettle 提供了可视化的界面,使用户能够使用拖放方式创建数据流程,并通过连接不同的转换步骤进行数据转换和处理。Kettle 支持多种数据源和目...

继续阅读 »

内功修炼-网络数据包的发送、传输、接受过程

TCP/IP模型 TCP/IP模型是网络编程的基础,在TCP/IP网络分层模型里,整个协议栈被分成了物理层、链路层、网络层,传输层和应用层。物理层对应的是网卡和网线,应用层对应的是我们常见的Nginx,FTP等等各种应用。Linux实现的是链路层、网络层和传输层这三层。 在Linux内核实现中,链路层协议靠网卡驱动来实现,内核协议栈来实现网络层和传输层。 网络数据包的发送过程 int ma...

继续阅读 »

内功修炼-操作系统之进程管理

进程 程序是如何运行的? 程序编译链接形成可执行文件存储在硬盘 程序运行前把程序放入内存 程序开始运行前,操作系统创建对应的进程,建立PCB 指令序列读入内存——程序段 内存中存放运行中产生的数据——数据段 CPU从内存中取出指令开始运行 进程实体的组成 PCB是给操作系统用的,PCB是进程存在的唯一标识; 程序段、数据段是给进程自己用的。 进程的状态,及其状态的转化 创建态——系统完...

继续阅读 »