Web Analytics
yangyang

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

All Posts


Windows Server操作系统上安装Intel网卡驱动

重装系统对于一个码农来说是一项必备技能。大多数个人用户操作系统比如Windows 7~11,重装系统相对来说比较简单,网上有非常多的教程,装完之后操作系统里面自带的驱动能驱动大部分硬件。但对于Windows Server这种服务器操作系统来说,重装完可能会有点麻烦,特别是各种驱动,而且第三方驱动软件,比如驱动XX、精灵之类的又完全不支持Windows Server系统。这里就记录一下我在给服务器重装Windows Server系统遇到的网卡驱动问题以及对应的解决方法。 准备工作 在确定要对一台能运行或不能运行的机器重装系统之前,安装前的准备工作非常重要。 数据备份 首先就是资料的备份。在重装系统之前,最好把其中重要的资料拷贝出来,尤其是C盘里的资料,因为重装系统可能选错盘符或者引导区格式不对,会对C盘格式化从而导致C盘资料丢失,虽然现在安装Windows 10~11操作系统,在不格 …

Windows Server 2019 Intel I219V driver

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

沪通卡ETC的注销和重新申请

去年春节回家,临出发前发现ETC坏了,插卡没反应,最后走的人工通道。节后于是准备去把ETC搞一下。仔细研究了一下发现这里面其实还有一些复杂,这里记录一下如何注销沪通卡ETC、ETC设备的选择、各种类型ETC的优缺点、沪通卡ETC的申请和绑卡、ETC快拆设备的安装和使用。 …

ETC

编译器对代码的重排序对程序可能产生的影响

编译器在编译代码或者CPU在执行代码的时候,为了提高编译器和处理器的执行性能,编译器和处理器会对指令重排(reorder)序。 编译器优化的重排序是在编译时期完成的,指令重排序和内存重排序是在CPU运行时进行的。通常情况下,重排序不会产生什么问题,但在涉及到多线程时,可能会遇到问题。本文列举了两个例子来说明编译器重排序,可能对程序造成错误。第一个例子是经典的双检锁,编译器对代码的重排序可能会多线程模式下的代码产生意向不到的错误,这个时候就需要同步锁来强制代码按照我们要求的方式来生成。第二个例子是在使用智能指针管理资源对象时可能产生的资源泄露,编译器的重排序,可能会使得原始对象创建后,和把对象放到智能指针之间会被插入其它的操作,如果这些操作抛出了异常,那么创建出来的原始对象的指针就会丢失,从而产生资源泄露。所以在编写多线程代码以及在对原始资源进行管理的时候,要注意以上问题。 …

Singleton volatile reorder double-check locking lazy initialization

从C++中的迭代器说到左闭合区间

和C#中的IEnumerable接口类似,在C++中,遍历标准容器库比如vector、deque、list等,都需要用到迭代器对象(iterator),根据容器的类型不同以及访问时是否需要读写,迭代器也分为可读写迭代器iterator,只读迭代器const_iterator以及反向迭代器reverse_itertaor。 调用容器类型成员的begin和end方法(或者cbegin,cend,rbegin,rend)方法,这两个方法分别返回指向容器首元素,以及尾元素之后的位置(one past the last element),简称尾后的迭代器。 这里面有一个容易误解的地方在于,end方法返回的迭代器,从来都不会指向容器的最后一个元素,而是指向最后一个元素之后的元素。如果容器v的第一个和最后一个元素分别记为first和last,那么调用v.begin()和v.end()返回的迭代器范围( …

iterator left-inclusive Dijkstra

C++中的声明、定义和初始化

不同于其它语言比如C#,C++中有很多专有的术语,有些术语还十分重要,比如声明、定义、初始化,初始化又有直接初始化和赋值初始化,了解这些术语对于掌握C++非常重要,这里就简单记录一下: 为什么会有声明和定义的区分 C++语言支持分离式编译(seperation compilation)机制,即允许将程序分割为若干文件,每个文件可以被独立编译。如果将程序分为多个文件,则需要有在文件间共享代码的方法,一个文件中的代码可能需要另一个文件中定义的变量。 为了支持分离式编译,C++语言将声明(declaration)和定义(definition)区分开来。声明使得名字为程序所知,一个文件如果想使用别处定义的名字,必须包含对那个名字的声明。而定义则负责创建与名字关联的实体。 变量的声明规定的变量的名字和类型,定义也一样,但除此之外,定义还申请存储空间,也可能会为变量赋予一个初始值。我们通常看到的.h头 …

C++ declaration definition initialization

感染新冠的经历

多年之后,回忆起2022年年底全面放开之后的这场COVID-19大流行,程序员可能会想起,他兴匆匆的跑到疫苗接种点接种第4针新冠疫苗的那个圣诞节前夕阳光明媚的下午,他无论如何也不会想到几天之后就会被感染,至于是如何被感染的,至今仍是个谜。 起因 就在上周12月20日,国家宣布了第4针新冠疫苗的开打,当然主要是针对60岁以上的老人以及患有基础疾病和免疫低下的人群,但其他18岁以上且已完成第一剂次加强免疫接种6个月以上的人群,可根据自身需求到就近的接种门诊或接种点开展第二剂次加强免疫。 截至上周,确切来说是12月24号之前,我和我老婆都还没有阳,这应该是快要进决赛圈了。另外我之前接种过3针武汉生物的灭活疫苗,但距离上次第3针已经有1年多了。所以看到可以打第4针后我在犹豫要不要去打。 不打的理由是,已经到了现在全面感染的阶段了,首先任何疫苗都无法防止感染,其次现阶段可以打的疫苗都没有针对最新的 …

COVID-19

布隆过滤器原理及应用

布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数,主要用于判断一个元素是否在一个集合中。与直接存储数据不同,布隆过滤器是通过一系列随机映射函数,将待存储的数据通过映射函数提取特征,然后将这些特征存储到二进制向量对应的二进制位上(类似于前文的Bitmap存储),当查找某个值时,通过随机映射函数,提取特征,然后检查这些特征所在的二进制位上是否都为1,如果都为1,表示该可能存在在集合中,但只要有一个为0,则一定不在集合中。 …

Bloom Filter Hash table collision

位运算及其应用

位运算符作用于整型对象,并把运算对象看作是二进制位的集合。位运算提供了检查和设置二进制位的功能。通常在编写代码中,相比加减乘除,位运算并不常用,但在有些情况下,位运算有用处。本文首先介绍为位运算的基本概念,然后介绍位运算的应用场景,包括使用Bitmap来存储整型数据,并介绍了在此基础上如何对大量不重复的整型数据进行快速排序,对大量整型数进行去重和快速查找,最后介绍了编程语言对Bitmap思想的实现,包括C++里面的bitset,C#里面的BitArray,并介绍了枚举值中使用位运算的一些例子。 …

bitwise or xor bitmap bitset bitarray

当心文件路径中的Unicode控制字符

最近遇到一个特别诡异的问题,文件明明存在,但是在使用File.Exists判断时却显示为false,经过一番996,发现在获取文件绝对路径的时候,从文件的“属性”-"安全"Tab页里面,复制“对象名称”时,必须从“左往右”选中复制,如果从“右往左”选中复制,则会包含一个不可见的Unicode "u202A"字符(unicode十进制8234),从而导致错误。 …

LRO RLO 0x202A 0x202E