使用Zabbix监控网络连接状况
有时候我们需要监控外网网络的连接状况,通常的做法是在本机ping一些网络地址,比如sina。要实现这一目的,可以编写bat脚本不间断ping目标地址,并将返回结果保存到文本文件中,也可以使用Zabbix做一些配置来不间断监控网络状况,本文介绍这两种方法的具体实现。 …
有时候我们需要监控外网网络的连接状况,通常的做法是在本机ping一些网络地址,比如sina。要实现这一目的,可以编写bat脚本不间断ping目标地址,并将返回结果保存到文本文件中,也可以使用Zabbix做一些配置来不间断监控网络状况,本文介绍这两种方法的具体实现。 …
在.NET中的基础类库(Basic Class Liberary,BCL)中有一些基本的数据类型比如Stack、List、Dictionary、LinkList等等,这些类型虽然看上去五花八门,但是其内部的实现所使用的数据结构无外乎是那些经典的结构比如数组、链表、哈希表、树等。了解这些类型背后的结构就能很清楚的知道对应数据类型的插入、查找、删除的时间和空间复杂度。在应用开发中可以根据具体的使用场景,选择合适的、高效的数据结构可以提高应用程序的效率。本文试图通过源码来查看这些基本类型的内部实现方式。 …
前几天看到一篇新闻里做的下面这张股票热点图,单纯的觉得这个图很好看,于是研究了一下如何自己绘制这个图,后来发现这种类型的图还有个专有的名字,叫treemap图。本文先介绍什么是treemap图,然后展示如何使用C#来生成沪深300指数的treemap。 …
端口转发在有些时候还是比较有用的,它能够在数据传输的过程中增加一个“路由”,提供了某种程度的灵活。本文简单介绍了工作中遇到的一个可能使用端口转发能解决的例子,以及如何使用端口转发,包括介绍了在Windows上的内置的端口转发工具,以及一些开源的端口转发程序,最后再简单介绍了如何使用C#实现一个端口转发工具。 …
前段时间用C++写了个批量改文件名的小工具,发现在改英文文件名的时候正常,但是遇到中文文件名就会失败。调试过程中发现,中文文件名在程序里得到的是乱码。这个问题在VS Code中很明显,只要是在VS Code的控制台里输出中文字符,大概率乱码,所以在在使用VS Code练习C++的时候,很少使用中文字符。这个问题我也一直没有深究,最近看了字符编码的相关知识,这里总结记录一下。为了了解乱码,需要了解什么是字符编码,本文介绍了一些常用的编码比如ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、UTF-32,在此过程中也介绍了大端小端的概念以及字节顺序标记BOM相关知识。 …
Visitor模式的一大缺点就是依赖问题,在定义Visitor接口的时候,就必须要知道所有的子类类型。在一些编译链接型语言如C++中,Visitor类和子类就会出现相互依赖的情况,当然,通过前向声明可以解决这个问题。另外一个问题就是在不同的子类中有很多“制式”代码。比如所有的子类必须实现基类中的Accept(Visitor&)方法,并且方法的实现都是一模一样的,都是调用该参数的Visitor方法并传入指向对象本身的引用。幸好在C++ 11中引入了可变参数模板,使用可变参数模板以及CRTP技术,可以极大简化Visitor模式中的一些实现方面的问题。在这一过程中顺便学习和了解Moden C++的一些强大的功能,这些功能是如此的特别以至于它跟C#有很大的不同。 …
本来是想接着上文继续来说明如何使用C++模板来简化Visitor设计模式的,但这里涉及到了C++ 11中引入的可变参数模板,这个特性很有用,所以值得专门写一篇文章来介绍一下C++中的可变参数模板。可变参数模版比较特殊,跟其它语言比如C#里面的params相比,似乎更加灵活和强大。 当然我没有能力对某个特性做全面的解读,可变参数模板有很多用处,这里列举了侯捷老师在《 C++新标准:C++11&14》课程里对可变参数模版的解读里面举的几个例子,这几个例子比较经典,完美的解释了可变参数模版的用法。这篇文章算是一个简单的笔记,C++里面有些特性需要反复的学习和复习才能掌握。 …
在23种经典设计模式中,Visitor模式可能是比较难理解的几个模式之一,之前在C#设计模式之访问模式这篇文章中渐进式的介绍了Visitor设计模式。恰巧最近看的《C++语言设计与演化,简称D&E》这本书中提到了一个单分派和双分派的概念,这里从前文介绍的C++中的虚函数表以及动态分发即单分发的基础上,介绍双分发以及基于双分发的Visitor设计模式,试着从另外一个角度来看访问者这一经典的设计模式,最后对比了通过工厂方法和访问者模式的异同。 …
通常,在保留n位小数进行四舍五入的时候,会用到Math.Round方法,但默认的这个Round方法的实现可能与我们平常想象的不一样,在很早之前我就知道有这个差别,今天重新整理一下。简单来说,Math.Round方法除了提供了第二个保留小数位数的参数之外,还有一个名为MidpointRounding的枚举类型参数,这个参数在.NET Framework 4.8及.NET Core 3.0版本之前,只提供了两个Round nearest类型枚举值: ToEven和AwayFromZero。这两个值的区别只在于当遇到中值5时的舍入问题。在.NET Core 3.0及之后的版本中,又引入了三个枚举值:ToZero、ToNegativeInfinity和ToPositiveInfinity这三个值,这个三个值解决了是直接舍掉、整体向下还是整体向上舍入的问题。 …
由于工作原因,偶尔需要在家里远程连接到公司计算机上处理一些工作事宜。因为公司的电脑是在一个局域网内的,并没有对外暴露IP地址,所以一般的做法就是通过第三方软件比如TeamView、向日葵这类软件来提供支持,但这些第三方软件经常会爆发一些安全事件,且把电脑交给第三方软件其实也存在安全隐患。不使用第三方软件,通用的做法就是在路由器上将外网IP地址和特定的端口转发到特定内网IP地址的机器和端口上。这样通过外网IP地址和端口,就可以使用远程桌面的方式访问到内网的计算机,但在外网暴露特定端口是有风险的,尤其是对于远程桌面3369这样常用的端口,因为任何人都可以通过一些端口扫描工具进行连接,进而通过暴力的方式尝试登录。本文介绍了通过程序的方式自动监控这种RDP失败的登录,并在登录失败超过一定次数后,自动新建防火墙入站规则,并将疑似IP地址添加到规则中,从而防止来自这类IP地址的RDP攻击的进一步尝试。 …