极致游戏 IT运维 日常实习面经
之前投了简历大概3天后 HR 才和我联系,安排了一个没课的上午面试。我提前半小时在飞书等,面试官很准时就到了,其本人应该也是极致的运维工程师。
提问环节
自我介绍
你的项目经历很多,有落地实践的项目吗?
这是我第一次实习并且实验室几乎没有横向所以我说的没有,但实际上其实那个空教室查询软件还是能说说的,毕竟当时还是部署到酷安上了,只能说自己太老实了
本科是网络工程,有做过相关的项目吗?
说了一下简历没有写上的一个 DNS 服务器,当时用的字典树写的域名解析,效果还不错。不过我只是参与者,那个项目 Leader 是个大牛,现在去了人大高瓴。
对Linux系统的特点做个基本阐述,举出和Windows的差别?
这个问题我觉得太泛了,我就回答了一下多线程是不同的,比如 Linux 用的主要是 Fork() 效率高一些,Windows 则是用的不同的方法(具体什么方法一时想不出来),这也是 Redis 弃用 Windows 的主要原因之一。
感觉面试官对我这个回答不太满意 QAQ
常用的 Linux 指令有哪些?
top 用来看CUP负载, netstat 来看端口占用。
让我惊讶的是 ...
两步解决 SSH 免密码登陆服务器
在 VSCode 上使用 SSH 登陆我们实验室的服务器的时候需要每次都输入密码。虽然很早之前就知道可以配置 SSH 公钥实现免密登陆,但是当时我被配置公钥这几个字唬住了,以为是一件很繁琐的事情。这次硬着头皮配置了一下没想到这么简单,只需要两步就能够彻底消灭 SSH 的密码。
两步实现生成公钥我生成的是 rsa 算法的公钥,比较方便,如果有需要也可以更改为别的加密算法。
在 Windows 的终端中直接输入以下指令:
1ssh-keygen -t rsa
弹出的提示全部按回车跳过即可。
执行完毕后将会在当前用户根目录的 .ssh 文件夹(在 Windows 下是 C:\Users\%在这里替换为你的用户名%\.ssh)中生成文件名为 id_rsa.pub 的 rsa 公钥。
如果你需要连接多个 SSH 服务器或是以前已经配置过公钥了,就无需执行这步生成新的公钥,直接使用第一次配置的 .pub 文件就行了
将公钥发送给服务器输入以下指令将上一步生成的公钥发送给服务器。在这里, Windows 下的文件路径正反斜杠不敏感:
1scp C:/Users/%在这里替换为你的用户名%/.s ...
无需指定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 ...