WSL2 启动报错:参考的对象类型不支持尝试的操作
最近需要安装 Redis ,在 Windows 上官方推荐使用 WSL (Windows Subsystem for Linux)。然而在打开我好几周没开过的 WSL 后发现直接报错无法进入:
参考的对象类型不支持尝试的操作 这个错误真是让人摸不着头脑……百度了一下很快就有解决方案了,为了节省下次再遇到这个问题的时间,直接一劳永逸的记录一下吧。
解决方案该问题报错原因及其讨论见 github-issue
下载可执行文件 NoLsp.exe (需要科学上网)
管理员身份运行控制台(右键点击 win 键 -> 终端(管理员)最直观)
控制台输入 .\NoLsp.exe C:\windows\system32\wsl.exe
输出字符串 Success! 说明修复成功
然后就可以打开 WSL 在 Windows 下尽情享用 Linux 啦! 什么牛头人战士发言
RFC 9234 :一种新的 BGP 路由泄露防御与检测方法
最近在 IETF 数据库上看近期的互联网草案和 RFC 文档。我特别关注到了 RFC 9234 - Route Leak Prevention and Detection Using Roles in UPDATE and OPEN Messages 这篇文档。该文档在今年(2022年)5月份才正式被赋予 RFC 编号,算是一篇很新的文档。这篇文档描述了通过对 BGP 的 Open 和 Update 两种报文新字段属性的设计,实现域间路由泄露的检测与防御。对于 BGP 这个已经成熟了数年的协议来说,有一份新的 RFC 文档已经非常难能可贵了,更何况是对报文本身的修改。恰巧我的本科毕业设计和实验室里一位学姐的研究方向都是这方面的内容,同时也为了方便我的组会汇报,在这里记录一下我对这篇文档的粗略介绍。其实基本上就是翻译……
简介路由泄露是指 BGP 前缀的传播违反了对 BGP 拓扑关系的预期。例如将从一个 provider 学到的路由宣布给另一个 provider ;或是将从一个 peer 学到的路由宣布给另一个 peer 或宣布给其直接的 provider。这往往是 BGP 路由配置错误 ...
通过 Golang 的函数类型实现接口
在对 Gin 框架和 Golang net/http 包进行源码分析对比的时候,在 net/http.server 发现了以下让我难以理解的参数传递。作为 Golang 初学者,确实是很难理解这种将函数类型作为接口实现的多态模式。在此处记录一下以防以后踩坑。
背景http 包中的服务多路复用器(ServeMux)需要确定对于一个特定 URL 来说,应当调用哪个函数来处理它发来的请求。其中有这样一个函数:
123456func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) { if handler == nil { panic("http: nil handler") } mux.Handle(pattern, HandlerFunc(handler)) // 请注意此行}
上述的 mux.Handle() 函数原型是 ServeMux.Handle() ,如下所示:
1234fun ...
Golang 微服务实战 - 4. Gin 框架
Gin 是一个 Golang 的 web 框架,封装使用简单,目前被广泛使用。实际上对于 Golang 而言,web 框架的依赖要远比 Python,Java 之类的要小。因为其自身的 net/http 足够简单,性能也非常不错。那么包括 Gin 在内的各种 Go web 框架出现的意义仅仅只是为了开发方便吗?关于这方面更深层次的探讨可以看这篇文章,同时也可以参考我学长博客中的相关内容。
这里同时推荐一个简洁实用的 Gin 中文文档。
简而言之,在 Http 连接建立方面,Golang 原生的 net/http 只用了一个简单的服务多路复用器,通过匹配 URL 提供对应的请求响应服务,几乎无法处理当下规范的 RESTful Web 接口;而 Gin 框架则以 前缀树 作为数据结构,使用了多棵 路由树 来实现响应服务与对应 Http 请求的匹配,使得 Gin 框架下的 Http 通信在有更丰富的功能性的前提下,获得了更高的性能。
安装创建 Gin 项目,控制台输入
1go get -u github.com/gin-gonic/gin
在 .go 文件中加入依赖
123import ( ...
Golang 微服务实战 - 3. Go-Micro 框架
Go-Micro 是分布式系统的开发框架。 由 Micro 公司开发,几经波折后发展到了 v4 版本(详见Go-Micro 不能用了?关于 Go-Micro 的一些说明),Github 仓库地址点此。请注意,现在普遍的 Go-Micro 框架并非指该仓库 https://github.com/micro/micro ,该框架是一个云原生开发平台而非微服务框架。
安装
下文将默认安装以下所有组件
框架我使用的是 go 1.9 版本,最新的 go-micro 框架版本是 4.9.0 ,因此只需要在项目的 go.mod 内的 require 项里添加如下语句即可
1go-micro.dev/v4 v4.9.0
命令工具如果需要,还可以额外安装控制台命令。可以在官方文档中查看详细信息。
1go install github.com/go-micro/cli/cmd/go-micro@latest
安装完成后,在命令行输入 go-micro 验证是否成功安装。
仪表板工具也可以安装 Go-Micro Web 仪表板,方便后续测试。
1go install github.com/go-mic ...
Python 函数装饰器 @functools.lru_cache
在做 LeetCode 139. 单词拆分时,通过记忆化函数法解题总是超时。经过了解,问题主要出在递归调用耗时太多,在 Python 语言下需要使用函数装饰器 @functools.lru_cache ,该装饰器为函数提供缓存功能,当某一函数的两次调用参数均一致,则直接返回前一次调用的结果。以下是修改后的 AC 答案。
1234567891011121314151617class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: # 使用函数装饰器 import functools # @functools.lru_cache(None) @functools.cache def recall(string: str, ptr_start: int, ptr_end: int) -> bool: if ptr_start == len(string): retu ...
通过 Python 源码分析二分查找落点问题
对有序数据来说,二分查找是一种简单高效的搜索方法。但即使在各种各样的背景下写过许多次的二分查找算法,二分查找的落点问题仍然常常让我感到困惑。举例来说,所谓二分查找的落点问题,就是在一个升序序列中,所查找的下标应当在目标元素的最左边还是最右边。仅需要改变 if 判断语句的一个等号结果就会大不相同。
实际上网络上已经有许多详尽的解释和参考教程解释如何在编写二分查找时精确掌控其落点。但我认为如果要加深印象,以标准库里的源码作为例子能更深入了解二分查找的基本原理。
bisect 库关于二分查找/二分插入的 Python 官方库是 bisect,其源码位于 Github 上。
bisect 库默认输入序列是升序的
在 bisect 库中,二分插入实际上是二分查找的封装。因此以下将着重分析右落点二分查找 bisect_right 和左落点二分查找 bisect_left 。
以下的例子体现了两种函数的不同:
二分查找源码源码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424 ...
Golang 微服务实战 - 2. Consul
第二部分需要提到微服务架构中必不可少的功能:服务发现。我在先前做的 Spring Cloud 项目中使用过 Eureka 作为服务发现框架。但现在 Eureka 已经停更一年多,且使用 Go 编写的 Consul 更适合在 Go 环境微服务分布式系统上使用。
以下列出几篇文章,这几篇文章说明了有关服务发现的相关概念,并对当下热门服务发现框架进行了一些对比:《什么是服务发现》,《服务发现框架Consul的使用》,深入了解服务注册与发现
Consul什么是 Consul ?官方网站的解释如下:
HashiCorp Consul 是一个网络服务解决方案,使团队能够管理服务之间、本地环境、多云环境以及运行时之间的安全网络连接。Consul 提供服务发现、服务网格、流量管理和网络基础设施设备的自动更新。您可以在单个 Consul 部署实例中单独或一起使用这些功能。
安装 Consul在官方网站下载二进制文件,随后解压至你所指定的文件目录。解压完成后,仅会得到一个二进制文件consul(Windows 下则是consul.exe)。将该二进制文件所在目录添加进系统环境变量,并在控制台输入指令c ...
Python 的拷贝机制
在做 LeetCode 131. 分割回文串 的时候因为一个 Python 列表的拷贝操作导致险些超时。为此特地在此记录一下我所了解到的 Python 拷贝机制。
Python 拷贝类型
直接赋值(=): 即对象的引用(可以理解为别名)。
浅拷贝(copy): 拷贝指定对象,不会拷贝对象的内部的子对象。
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了目标对象及其子对象。
Python中的深拷贝与浅拷贝 这篇文章的图例很形象地描述了三种拷贝类型的差别
直接赋值
浅拷贝
深拷贝
直接赋值Python 没有指针的概念,但 Python 的赋值操作就类似于新增一个指向原变量内存地址的指针。考虑操作b = a,这是一个赋值引用,对象 a 与 b 的变化完全同步。
拷贝对于基本数据类型(如 int),Python 实际上采用的是引用计数的机制。无论是怎样进行赋值或拷贝,只要是相同的值,就会指向同一个内存地址,实际上这时就是增加了一个引用计数。即使是直接赋值,只要值相同,也是与先前相同的内存地址。一旦值不同,内存地址就不同。因此本 ...
Golang 微服务实战 - 1. 简要介绍与RPC
云原生(Cloud Native)方向很难避开和 Golang,即 Go 语言的接触。我的目标是对云原生技术有一个比较系统的了解,为此需要对 Go 有一定的熟练度。以我的经验来看,要从零开始了解一个语言,最快最高效的方式就是用它做一个实践项目出来。尽管已经有无数前辈提醒我,实现系统在研究生阶段属于低级产出,但我认为作为一个练手的方式,用从未接触的语言实现一个完整的可行系统还是有很大的学习意义的。
该项目来源于网络上的相关教程。在完整实现后,我应该会在另一篇文章中通过将该项目“上云”来实现对云原生关键工具 Kubernetes 的进一步了解。
关于 Golang 的基本语法我基本不会大篇幅说明,但在原教程中前半部分都是相关内容,需要的朋友可以进行参考。而即使是在本文中的大部分内容,在 Golang 的文档中也能搜索到
将会根据实现进度实时更新,内容将分为多篇文章。
RPCRPC 协议,即Remote Procedure Call Protocol (远程过程调用协议)。它主要用于远程进程通信,在 TCP/IP 模型上属于应用层协议( http 协议同层),其底层使用 TCP 实 ...