无需指定Windows IP ,一劳永逸的 WSL2 代理服务器配置
为了复现一篇论文的实验结果,我需要在 Linux 环境下配置深度学习的开发环境,为此需要配置 WSL 的网络代理以实现科学上网。
网络上绝大部分教程都是获取 Windows 主机的 IP 并通过配置全局变量进行代理的方式,这种方式配置最大的问题是一旦网络环境改变, IP 地址也会发生改变,还需要重新配置。不过文章WSL2 中访问 Windows 的代理的最简易方案中则提到了一种利用 Windows 自带的 mDNS 实现建议配置的方法,经过测试在 Win 11 的 WSL2 上稳定可用。
准备工作
首先,需要得到你的代理工具的端口并打开其局域网功能,在代理工具中一般都能查看。我使用的是 Clash ,其默认端口为 7890 。
你还需要找到你的主机名称(电脑名称),推荐以下两种方法
Win 11 下打开 设置\系统\系统信息\设备规格 ,设备名称即为主机名称
控制台输入 systeminfo ,输出的主机名即为主机名称
测试 mDNS 是否可用在 WSL 中执行
1ping <你的主机名>.local
能够收到返回包则继续接下来的步骤,否则说明你的 Window ...
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 实际上采用的是引用计数的机制。无论是怎样进行赋值或拷贝,只要是相同的值,就会指向同一个内存地址,实际上这时就是增加了一个引用计数。即使是直接赋值,只要值相同,也是与先前相同的内存地址。一旦值不同,内存地址就不同。因此本 ...