Ray Lei 发布的文章

MacOS下使用VS Code创建第一个.NET core程序

0 .NET core环境的安装

  • .NET SDK安装

.NET Core分为两部分,一个是运行时,另一个是开发工具包,二者区别如下:

.NET Runtime: 只能运行.NET Core程序,不能开发
.NET SDK: 能运行.NET Core程序,不能开发

既然我们是用来开发程序的,因此我们需要安装.NET SDK, 下载链接在这里

选择最新的版本,下载后双击安装即可。

  • VS Code安装

安装完VS Code之后,还需要安装C#插件,这个比较简单,就不做说明了。

- 阅读剩余部分 -

C#中接口(interface)和抽象类(abstract class)的区别

对面型对象理解总觉得不够深入,这里记录一下:

接口(interface)

  • 接口是无状态的
  • 接口一般只有成员方法,一般无成员变量,属性,虽然也可以有,但基本上不这样做
  • 接口中不能包含实现代码,子类中必须对接口方法进行实现
  • 接口可以被多个类继承实现

抽象类(abstract class)

  • 抽象类是可以有状态的
  • 抽象类除了可以有抽象方法外,还可以有成员变量、属性,也可以有非抽象方法
  • 抽象类中可以有自己的非抽象接口实现,子类可以复用
  • 抽象类不能被多继承,一个类只能继承一个父类
  • 抽象类中的抽象方法在子类中也可以是抽象的,直到最后有个子类的实现即可

参考

stackoverflow

记阿里云ECS挖矿木马Macron的排查解决过程

记阿里云ECS挖矿木马Macron的排查解决过程

0. 现象

早上朋友找到我说,他们放在阿里云上的站点无法访问了,页面提示nginx 502 Gateway错误,让我帮忙看看。

1. 排查过程

定位问题

第一反应是不是nginx哪里除了问题,因为自己本身对nginx这一块也不大熟,就先网上查了下502的原因,有说一些配置导致的、日志写满磁盘的等。

看着原因比较多,不是很清楚,于是决定先登录服务器再说。

使用finalshell登录后,很快看到CPU一直是100%的状态,于是top命令查看是那个进程一直占着CPU。

这时候就能定位到Macron这个进程了,第一反应先kill了,CPU马上降下来了。但是以作为一个程序员对病毒的粗浅理解,事情肯定不会这么简单的,果不其然,很快这个Macron进程就又冒出来了。

- 阅读剩余部分 -

2019简单总结,2020憧憬下

时光走向2020年纪元,今天偶然开始打开个人blog时发现多了两条评论,这对于本站来说可是蛮稀罕的事情,毕竟三年多来总评论数都停留在个位数。

最近的文章已是2019年7月份写的了,去年整年共发布5篇文章,真是惨不忍睹。细想整个2019年,发生了很多事情,个人也有了一些思考,今天借此机会记录下,说不定未来哪天会回来看看呢。

- 阅读剩余部分 -

使用Redis构建分布式锁

在软件开发中,锁是常见的一种业务处理方式,用途也很广泛。锁给我们提供了一种能够被多个线程访问的共享内存数据结构,在使用锁时,通常有着以下步骤“获取锁、然后执行操作、最后释放锁”。

最初的锁实现中,是提供给同一进程内的多个线程进行共享访问的,因为最初往往程序都是单机部署,而随着互联网技术的发展,分布式部署已成了主流,同一应用往往部署在多个不同的服务器中。

能让分布在不同服务器的进程同时访问的锁,称为分布式锁。分布式锁有多种实现方式,这里只介绍其中的一种:利用Redis实现分布式锁。

简易锁

大部分Redis用户对锁(lock)、加锁(locking)、锁超时(lock timeout)有所了解,但确不一定能够正确使用,都是因为未能正确考虑以下几种故障和异常情况:

  • 持有锁的进程因为操作时间过长而导致锁被自动释放,但进程本身并不知道,那么当该线程对锁进行释放时就有可能会将其他进程持有的锁进行释放;
  • 当前持有锁的进程在进行长时间操作时崩溃,导致锁未能正常释放,而其他想要获取锁的线程并不知道哪个线程持有锁,也无法知晓持有锁的线程已经崩溃,因此只能等待锁过期释放;
  • 当一个进程持有的锁过期后,多个线程同时尝试去获取锁,且都获取了锁;
  • 上述第一、第三种情况同时出现,导致多个线程获得了锁,而每个线程都以为自己是唯一获得锁的线程;

如今稍微好点硬件能够让Redis在服务器上每秒执行几十万次操作,虽说上述情况出现的几率较小,但在高负载时出现的几率会大大提高,因此需要编写能正确工作的锁。

- 阅读剩余部分 -