Web Analytics
yangyang

码农兼一个普普通通小青年

Featured Posts


从双分发的视角看访问者模式

在23种经典设计模式中,Visitor模式可能是比较难理解的几个模式之一,之前在C#设计模式之访问模式这篇文章中渐进式的介绍了Visitor设计模式。恰巧最近看的《C++语言设计与演化,简称D&E》这本书中提到了一个单分派和双分派的概念,这里从前文介绍的C++中的虚函数表以及动态分发即单分发的基础上,介绍双分发以及基于双分发的Visitor设计模式,试着从另外一个角度来看访问者这一经典的设计模式,最后对比了通过工厂方法和访问者模式的异同。 …

Design Pattern Double Dispatch single dispatch visitor vtable factory

通过程序判断和阻止来自特定IP地址的远程桌面连接攻击

由于工作原因,偶尔需要在家里远程连接到公司计算机上处理一些工作事宜。因为公司的电脑是在一个局域网内的,并没有对外暴露IP地址,所以一般的做法就是通过第三方软件比如TeamView、向日葵这类软件来提供支持,但这些第三方软件经常会爆发一些安全事件,且把电脑交给第三方软件其实也存在安全隐患。不使用第三方软件,通用的做法就是在路由器上将外网IP地址和特定的端口转发到特定内网IP地址的机器和端口上。这样通过外网IP地址和端口,就可以使用远程桌面的方式访问到内网的计算机,但在外网暴露特定端口是有风险的,尤其是对于远程桌面3369这样常用的端口,因为任何人都可以通过一些端口扫描工具进行连接,进而通过暴力的方式尝试登录。本文介绍了通过程序的方式自动监控这种RDP失败的登录,并在登录失败超过一定次数后,自动新建防火墙入站规则,并将疑似IP地址添加到规则中,从而防止来自这类IP地址的RDP攻击的进一步尝试。 …

RDP Block 3389

C++中的虚函数表以及动态分发

在C++中,如果一个类有虚函数,那么该类的对象在实例化后,会多一个指向虚函数表(virtual table, vtbl)的指针(vitrual table pointer, vptr)。虚函数表及虚函数调用是C++实现多态或者说动态分发(dynamic dispatch)的基础。本文首先介绍一下C++中的对象的虚函数指针以及类的虚函数表的结构,然后介绍了通过使用虚函数表实现动态分发的原理,最后讨论了虚函数调用的性能。 …

static dispatch dynamic dispatch early binding virtual table

记一次.NET程序内存暴涨分析

大约在上个月,利用WinDbg找到了软件中的一个存在很久的内存会暴涨的bug,说起来也是巧合,这里记录一下。 在描述问题之前,我想提一下,软件开发中寻找bug的正确思路和方法,这也是从我领导那里学到的严谨态度,并且在工作中体会最深的。 …

WinDbg Memory Leak

Python注册和调用C#中的事件和方法

我有个用C#编写的程序,需要提供其中的一部分功能给使用Python的同事使用,于是研究了一下如何在Python中调用C#的方法,特别是如何注册C#中的回调,这里记录一下。 使用Python for Net类库 使用Pythonnet类库可以在Python中调用C#编写的dll,要使用pythonnet首先要安装,安装方法很简单,在管理员权限下使用命令行程序即可安装: pip install pythonnet 安装完成之后,使用pip list查看一下 …

Delegate Python pythonnet callback pythonnet debug

.NET中的一些无损压缩算法

股票的行情这种时序数据类型,数据冗余度和相似度较高,天然适合进行压缩。本文分析了几种无损压缩算法,分别是C#内置的和SharpZipLib的GZip、Zstd、LZ4以及Snappy。在对比这几种算法的压缩率,压缩时间后发现,Zstd具有比较好的压缩率和压缩速度,基本能满足行情数据处理以及传输效率的要求。 …

GZip SharpZipLib Zstd LZ4 Snappy lossless compression algorithm

C#设计模式之访问者模式

Visitor 是面向对象设计模式中一个很重要的设计模式,这个模式是一种将数据操作和数据结构分离的一种方法,它能够在不修改结构的情况下向现有对象结构添加新操作,是遵循开放/封闭原则的一种方法。上述这个定义很枯燥抽象,那就以例子来说明吧。     假设我们要打印四则运算表达式,比如(1.0+(2.0+3))的字符串表示,或者对其求值,这是两个需求,一个是打印,一个是求值。为了简化,这里仅对加号括号进行处理,其他的可以类推。在写任何代码之前,一定要考虑一下是否面向对象,针对上面的字符串,可以将数字和操作符抽象为两个对象,并实现同一抽象类Expression。 public abstract class Expression { }     目前上述Expression抽象类没有任何成员或方法,后续我们会添加。接着添加表示doule类型数字的具体类DoubleValueExpression,和 …

Design Pattern Visitor Pattern Double Dispatch

  • 1