- 博客(143)
- 资源 (4)
- 收藏
- 关注
原创 C# 利用ssh 开启一个命令交互窗口
需要说明的是,为了避免输入输出相互阻塞,这里读取输出采用另一个线程执行。本文记录C#如何利用ssh远程连接服务器,并开启一个命令交互窗口。
2025-01-23 11:32:53
327
原创 从N个数中均匀随机采样M个数
目录一.背景二. 问题分析1.从抽样分析2.从等概率分析三.代码实现四. 算法优化一.背景 最近在做多传感器数据同步的时候遇到一个问题,多个传感器采集数据的频率可能时不一样的,但是数据需要对齐,这样才能进行融合训练。我的一个简单思路就是将同一秒的数据以采样频率最低的数据为标准对齐,那么这必然涉及到对频率高的数据进行采样。为了保证采样尽可能的均匀,不至于,相同序列的帧在时间上不至于一样太大差距,所以希望能有一个实验均匀采样。二. 问题分析1
2024-12-27 15:51:11
825
原创 Kaggle 数据集dogs-vs-cats的错误
预览一下这两个数据,大概率无法显示。删掉这两个数据可能你的模型就可以跑起来了。如果遇到错误图像,则会暂停运行并显示错误的文件名。
2024-10-26 19:45:57
238
原创 广度优先搜索Breadth-First-Search
广度优先搜索总是能找到一个动作最少的解,因为当他生成深度为d的节点时,说明已经生成了升读为d-1的所有节点,如果其中一个节点是解,它应该已经被找到了,这对于所有动作都具有相同代价的问题,它是代价最优的,但对于不具有该特性的问题,则不一定是最优的。广度优先搜索,稍微学过算法的人都知道,网上也一大堆资料,这里就不做过多介绍了。问题来了,我们这次还是没确定从起点到目标点的最短路径,因为没有用到距离信息,别急,下一节DijkStra算法来帮我们彻底解决这个问题。,这样的指数级上界是可怕的,举个例子:假设。
2024-09-07 11:25:03
805
原创 最佳优先搜索best-find search
算法每次选取最近的节点,因此我们没有得到最优解,要想得到最优解,需要对算法进行改造,使之称为启发式算法,我会在后续章节介绍一二。,其中n是节点的总数。这里只选取到BuCharest城市的数据,该城市是访问Urziceni和Giurgiu后续的点必经之路。显然上面的BFS是一种贪婪算法,每次选取最优的近邻点是一种“短视”,虽然如此,他仍是一种可行的算法。如果你熟悉广度优先搜索,那么上面的代码也没什么难度。算法的性能显然与我们选择什么样的代价函数有直接关系。最佳优先搜索的算法可以参考。该算法最坏的复杂度是。
2024-09-05 17:01:47
825
原创 C#中值类型与引用类型的存储
请记住一个引用类型,其实例数据部分始终存放在堆里,既然两个成员都是对象数据的一部分,那么他们都会被存放在堆里,无论他们诗值类型还是引用类型。记住上面的两张图,搞不清楚时,自己划一下,以后分析值对象和引用对象在内存的位置就心里有数了。首先,构造student对象用了new,所以student的实例数据存储在堆上,其引用部分放在堆里。C#中类型分为两种:值类型和引用类型,这两种类型的对象在内存中的存储方式不同。如果存储了一个对象,该对象有多个成员,成员既有值对象又有引用对象时,存储情况如何呢?
2024-04-02 20:53:36
730
原创 C# 取消一个不带CancellationToken的任务?
在异步函数中,一般使用CancellationToken来控制函数的执行。那么如果一个异步函数没有这个Token参数,如何取消呢?
2023-10-18 18:08:03
488
翻译 C#中的TaskCompletionSource
在C#异步编程中使用await/async时,会经常使用Task类,除了void之外,Task是异步方法的主要返回类型,还有后来的TaskValue(较少使用)。那偶尔也会看见异步中使用TaskCompletionSource,它有什么用呢?
2023-10-18 16:40:21
1795
原创 C# 通过回调获取多线程中的结果
答案是传递一个回调函数。看具体的例子,假设我有一个求自然数的累加和函数,我想让一个线程单独运行,且返回结果。在C#中多线程运行一旦开启,是没办直接返回你要的结果的,但有时候我们确实需要线程给我们结果要怎么做呢?这个类不仅接受参数Number,还接受一个回调函数:Action.在计算完成前将结果传递给回调函数。这里只是简单地打印,事实上还可以将取值拿出来,做法类似于上一节提到的。
2023-10-13 12:10:52
607
原创 C# 往多线程传递安全参数的方法
这样,在执行时,我们向多线程传递的是类PassParameter。sToThread的成员函数,且没有任何参数。这样就实现了安全的将参数传递到线程中。为此要如何避免这种问题呢?
2023-10-13 11:41:30
419
原创 C#关于接口的常见面试问题
1. C# 中的接口是一个完全未实现的类,用于声明对象的一组方法。因此,我们可以将接口定义为纯抽象类,它允许我们仅定义抽象方法。抽象方法是指没有主体或实现的方法。2. 一个类可以从另一个类继承,也可以从接口继承。所以,继承可以分为两类:实现继承和接口继承。3. C#不支持多重继承,接口可以弥补这一缺陷。4. 不行,默认情况下,.NET 接口方法是隐式公共的,即使它们属于嵌套接口。非公共修饰符对于接口方法无效。因此,在这种情况下,编译器将失败并警告您。5. 不可以。
2023-10-12 16:17:56
405
1
原创 数学计算式转为表达式树
数据结构“栈”的一个用途就是:平衡符号,比如这样一个代数式:(a(b+c)*a(e*f+a*(c+d))),你能一眼看出这个式子的括号是否正确吗?更何况还可以加入中括号([]),大括号({})。如果写一个算法来验证这个式子的话,利用栈这种数据结果是最方便的:构造一个空栈,读入字符串直到文件尾。如果字符是一个开放符号,则将其推入栈中,如果字符是一个封闭符号,则房栈空时报错;否则将栈元素弹出。如果弹出的符号不是对应的开放符号,则报错。在文件尾,如果栈非空则报错。
2023-09-07 10:35:45
609
原创 C# 泛型集合中的排序
就算不熟悉Linq,熟悉SQL查询语句的,也能很快上手Linq。List类的Sort方法有4个重载,其中一个是Sort(IComparer comparer),也就是你可以直接传入一个实现ICompare的对象,Sort方法会调用次对象的固定方法,这里我们将这个特殊的对象叫做。从前面的讨论可以看出最简单的排序方法是利用Linq或者Lambda,另外两种会增加额外的代码量,但是我们应该了解其背后的原理,Linq和Lambda都是C#后面陆续推出的,自然会更能节省开发者时间。
2023-02-13 17:51:25
1318
原创 再说多线程(五)——死锁
在前面四节中,我们一直没有讨论多线程程序的一个负面问题——死锁,有了一定的基础,现在是时候研究一下死锁了。死锁一定是出现在多线程程序中,单线程是不可能造成死锁的,因为你不可能同时加两把锁。死锁有个简单的例子,假设你和你的邻居关系很好,你们相互放了一把备用钥匙在对方家里,一般来说,只要有一个人带了钥匙,那两个人一定可以各回各家,但是恰好有一天,两人出门都忘记带钥匙,回家时发现对方在门口等着,两个人只能干瞪眼。这就是死锁。
2023-01-13 16:40:00
703
翻译 再说多线程(四)——Semaphore类
C#中的信号量类用于限制可以同时访问共享资源的外部线程的数量。换句话说,我们可以说Semaphore允许一个或多个外部线程进入临界区并在线程安全的情况下并发执行任务。因此,在实时情况下,当我们的资源数量有限并且我们想限制可以使用它的线程数量时,我们需要使用信号量。
2023-01-13 11:15:20
844
翻译 再说多线程(三)——Mutex类
在前面2节,我们已经讨论了Lock语句和Monitor类,Locks 和 Monitors 确保 InProcess 线程的线程安全,即由应用程序本身生成的线程,即内部线程。但是,如果线程来自 OutProcess,即来自外部应用程序,那么 Locks 和 Monitors 将无法控制它们。而 Mutex 确保进程外线程的线程安全,即由外部应用程序生成的线程,即外部线程。可能前面一段是说的不是很明白,什么是内部进程和外部进程呢?让我们首先创建一个控制台应用程序,然后将以下代码复制并粘贴到其中。
2023-01-13 09:29:15
1301
2
原创 再说多线程(二)——细说Monitor类
1. Monitor.Wait 方法有两个比较常用的方法重载:Object:等待的锁的对象功能:释放当前线程所占用的对象锁,并且阻塞当前的线程直到它再次拥有这个锁。- Object:等待的锁的对象- Int32:线程再次进入就绪队列的等待时长,单位毫秒功能:释放当前线程所占用的对象锁,并且阻塞当前的线程直到它再次拥有这个锁。如果指定的时长过去,线程将由等待队列转移到就绪队列。2. Monitor.Wait 方法的主要执行步骤阻塞当前的线程将这个线程移动到等待队列中释放当前的同步锁。
2023-01-12 14:09:38
1160
原创 再说多线程(一)
世界是并行!做过复杂项目的朋友一定遇到过并发的问题,无论是大项目如订票系统,还是小项目中的文件管理都会有并行需求。所以不同于上学时接触的大部分代码,实际的业务往往是为多人提供服务,必然天然的带有并发的需求。这里我先不解释并行和并发的区别,也不去讨论cpu和操作系统的低层是如何做到并发的,让我们从最简单的串行说起。一个简单的打印函数,只不过,在两句话之间,添加了一个小停顿。
2023-01-11 16:30:38
395
原创 关于枚举类(Enumeration Class )
在微软的微服务架构案例eshopOnContainer中,对于订单的状态是这样的: 微软没有直接使用传统的Enum关键字,而是自定了以一个抽象类:Enumeration。最开始,我有些不解,为什么么要“舍近求远”?其实微软官方在此文中提到了枚举类,理由是启动面向对象语言的所有丰富功能。解释的很晦涩,虽然给出了代码案例,但是还是让人很难体会到其中奥妙。直到最近又看了这个博客,似乎才深入理解了一些。结合一个例子说明,可能更好! 假设你要去买咖啡,正常情况下会有“大、中、小”三种
2022-12-06 01:45:39
1046
原创 关于架构的一些理念
软件的需求是不断变更的,软件的升级也是必然的,因此我们应该再进行架构设计的时候,避免后续软件需求变更,导致软件退化,并且在软件的升级过程中,我们要适时的进行架构的升级,以保持高质量的软件设计。如果我们每次软件升级的时候,没有及时的调整程序结构,而是在原有的程序结构上不断的加入代码,最终的软件就会退化。他分为战略设计和战术设计两个层次:DDD的战略设计可以帮助公司的领导人进行团队的划分,人员的组织,产品线的规划,也可以帮助产品经理对产品功能进行规划,还可以帮助架构师进行项目架构的规划,术站的选择等;
2022-11-17 15:13:39
1076
原创 Fluent Facede Pattern(外观模式)
外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现,不能通过外观类来实现。现代的软件系统都非常复杂,尽管我们已经想尽一切方法将其“分而治之”,把一个系统划分为好几个较小的子系统了,但是仍然可能会存在这样的问题:子系统内有非常多的类,客户端往往需要和许多对象打交道之后 才能完成想要完成的功能。接下来我们定义Car的外观,我们将外观定义放在两类中,一类定义颜色,品牌,门数,一类定义生产城市地址。
2022-11-11 16:45:53
482
原创 递归泛型(recursive generic)
原因很简单,SetName函数返回的对象类型是EmployeeInfoBuilder,无法调用EmployeePositionBuilder类的函数成员。当然我们可以将Employee对象以构造注入的方式传入进去,但是这样就违背了我们的Fluent原则。稍微说明一下的就是,这么做一方面是不好理解,另一方面可能对性能有一定的影响,我认为这个派生链条不宜过长,希望有懂的朋友可以指点一下。对于上面两个泛型类,我们无法直接定义,只能借助更高层次的派生类构造,且这个类不能再是泛型,也就是泛型链的终点。
2022-11-11 11:48:27
548
原创 Asp.NetCore 从数据库加载配置(二)
在第一节中,我们实现了基本的自定义数据库配置源,从而可以读取MySql数据库的配置,但是,我们没有实现动态加载数据库配置,也就是程序一但运行起来,数据库的配置更改后就不在被更新。所以本节重点来解决这个问题。
2022-11-03 12:24:36
726
原创 Asp .NetCore 从数据库加载配置(一)
asp.net core官方不支持直接从数据库中读取配置,所以这里我们要自定义配置。而自定义配置都需要实现IConfigurationProvider接口,也就是真正将数据库的字段构建成Dictionary。一般我笨都直接集成这个抽象类,ConfigurationProvider中最重要的方法就是Load,自定义配置提供者要实现Load方法。
2022-11-02 15:33:18
1769
原创 C# 新语法
C#8.0,9.0,10.0中增加了很多新的语法,这些语法中有一些对开发人员帮助很大,这里做一点整理。C# 10.0中增加了“全局using指令”语法,我们可以将global修饰符添加到任何using关键字前,这样通过using语句引入的命名空间就可以应用到这个项目的所以源代码中,因此同一个项目中的C#代码就不需要再去重复引入这个命名空间了。在实践中,通常专门创建一个来编写全局using代码的文件,然后把项目中经常用到的命名空间声明到这个C#文件。
2022-10-28 16:29:59
2039
原创 Windows下优秀的软件包管理器Chocolatey安装
用过mac的人都知道Brew非常好用,现在Windows下页有一个很好用的包管理器:Chocolatey。官网安装了这个工具,很多软件可以直接在powershell中敲命令搞定,比如java Runtime运行环境,NotePad++,Redis等。
2022-09-20 17:04:20
325
原创 C# 中的守卫语句(GuardClause)
一般而言,我们认为代码的最小单元就是一个函数或者方法,我们写出的代码应该能让人迅速理解,所以这要求我们的代码行数不要太多、命名清晰规范、功能单一(一个方法只做一件事)。导致代码复杂性增加的一个原因是条件判断,这时代码中往往会出现或者语句,如果没有组织好你的程序结构,这两种语句很容易将你的代码从简洁易懂的变成冗长,模糊,甚至低效的。所以有一个办法是通过使用守卫语句(Guard Clause)来避免这些问题。
2022-09-13 14:14:43
857
原创 建造者模式
今天我们讨论一下 Builder 建造者模式,这个 Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。...
2022-08-13 23:53:41
220
原创 原型模式(prototype pattern)
原型模式其实很简单,又可以成为克隆模式。想象你要造一架飞机,如果你要重头到位掌握造飞机的核心技术,那么你要从力学,材料学开始学起。但是你想快点看到成果,那你就把对应的零件买回来自己组装一个就好了。...
2022-08-12 17:20:43
482
原创 抽象工厂模式
为抽象工厂中相互依赖的每种产品定义抽象接口对象,也可以这样说,有几种产品,就要声明几个抽象角色,每一个抽象产品角色和一种具体的产品相匹配。
2022-08-12 12:04:11
351
原创 工厂方法模式
在工厂方法中,用户只需要知道所要产品的具体工厂,无须关系具体的创建过程,甚至不需要具体产品类的类名。在系统增加新的产品时,我们只需要添加一个具体产品类和对应的实现工厂,无需对原工厂进行任何修改,很好地符合了“开闭原则”。...
2022-08-12 10:36:30
157
原创 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。。
2022-08-11 18:24:21
477
原创 在 ASP.NET Core 使用 IOptions pattern
由于配置结构随着嵌套部分而变得多样化,其关键表示变得冗长且难以维护。当然可以通过创建一个强类型的ConfigurationManager类来解决这个问题,该类封装了这种密钥访问机制,并且还处理了非字符串属性的类型转换要求。一个更优雅的方案是根据强类型类匹配,让Asp.NetCore为我们做这些复杂的匹配工站。.........
2022-08-03 20:08:19
768
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人