在armbian上使用snap安装neovim
概述最近搞了一台armbian的机子,想在上面安装neovim,但是发现apt上的nvim版本太低了,只有0.4.0好像。经过一番的搜索,发现Snaps可以满足我的要求。
Snaps介绍Snaps是由Canonical提供的跨分发包管理系统的工具.Snaps 基本上是一个与其依赖项和库一起编译的应用程序——为应用程序运行提供了一个沙盒环境。它们安装起来更容易、更快捷,可以接收最新更新,并且不受操作系统和其他应用程序的限制。
安装Snaps使用apt安装Snap;
1sudo apt install snapd
安装neovim使用snap安装neovim:
1sudo snap install --classic nvim
检查一下noevim的版本:
1nvim --version
输出如下:
1234NVIM v0.10.4Build type: RelWithDebInfoLuaJIT 2.1.1713484068Run "nvim -V1 -v" for more info
参考资料
如何在各种 Linux 发行版中安装和使用 Snap
在k8s中如何强制删除处于Terminating状态的namesapce
概述在k3s中删除一个namespace十分简单,就是一个命令的事儿:
1kubectl delete ns ${namespace}
但是可能存在删除失败或者namespace一直处于Terminating状态的话,那么上面的命令可能行不通。这里介绍两种实用的解决方案去帮助我们解决。
注意: 这两种方案可能存在错误删除的情况,请谨慎操作。
强制删除kubectl提供force和grace-period=0两个参数帮助我们强制删除namespace:
1kubectl delete ns ${namespace} --force --grace-period=0
说明:
–force:强制删除资源,跳过正常的删除流程。
–grace-period=0:立即删除资源,不等待任何清理操作。
使用Kubernetes API 删除获取处于Terminating状态的namespace:
1kubectl get ns |grep Terminating |awk {'print $1' ...
Spring Security 中基于用户信息的动态密码加密
Spring Security 中基于用户信息的动态密码加密前言通过自定义 Spring Security 的 DaoAuthenticationProvider,可以实现根据用户信息的不同,动态切换不同的密码加密方式。这种方法允许您根据用户的角色、组或其他属性,选择最合适的加密算法,从而提高安全性或满足特定的业务需求。
DaoAuthenticationProviderDaoAuthenticationProvider是用于实现用户名密码的登陆AuthenticationProvider,通过自定义实现additionalAuthenticationChecks方法可以实现从UserDetails获取一个字段从而动态获取密码加密服务。
实现自定义DaoAuthenticationProvider:
1234567891011121314151617181920212223242526272829303132333435363738394041@Componentpublic class HotelerAuthenticationProvider extends DaoAuthenti ...
2024年度总结
2024年度总结对我来说,2024年是一个特别有意义的一年。8月24号,我美丽又可爱的宝宝出生了,体验到了初为人父的喜悦;10月7号,国庆节刚过,公司人事就开邮件通知我我的岗位被取消了。
初为人父的喜悦孩子的出生时间其实挺意外的。由于老婆在9月初有一场很重要的考试,所以不能耽搁,所以原来计划在20号去医院打催产素的,结果因为报告晚了一天,然后就被通知不用打催产素,已经开始见红了。不过开宫口的速度很慢,过两天还是上催产素了。我记得那个时候我在家里呆着,医院我有丈母娘陪着,反正又不可能那么急着生出来,我就回家先好好休息,打算第二天过去。结果第二天我丈母娘就通知我让我赶紧过去签字给我老婆打催产素。一波三折,到最后这个催产素还是打上去了。在6号待产室,晚上6点06分,7斤2两,我可爱的儿子就这样子平平安安的出生了。说实话,我并没有在第一时间听到孩子的哭声,相反这个小家伙睡的死死的。我伸过去看看了他,第一感觉他好丑啊,头型怪怪的,有点拉长的样子。听医生说,刚出生的小宝宝通常产道的挤压,出来的时候头多多少少会有点拉长的样子,等长大点就好了。
孩子的出生,对我来说是一个特殊的人生里程碑,从这一刻开始 ...
script标签中的defer和async
浏览器中script标签中的defer和async有什么区别,优缺点是什么,应用场景是什么?在 HTML 中,<script> 标签的 defer 和 async 属性用于控制脚本的加载和执行方式,尤其是在处理 JavaScript 文件时。它们之间的主要区别和应用场景如下:
1. defer
功能:脚本在文档解析完成后执行,但在 DOMContentLoaded 事件之前执行。
加载顺序:defer 脚本会按照它们在文档中的出现顺序加载并执行。
应用场景:适用于依赖于 DOM 完全加载的脚本,或者需要按顺序执行多个脚本的情况。
优点:
确保 DOM 元素在脚本执行时已存在,避免了因元素未加载而导致的错误。
不会阻塞 HTML 的解析,可以提高页面加载性能。
示例:12<script src="script1.js" defer></script><script src="script2.js" defer></script>
2. async
功能:脚本会在下载完成后立即执行,而 ...
css的模拟面试
css变量是什么CSS 变量(也称为自定义属性)是 CSS 中用于定义可重用值的特性。它们使用 -- 前缀定义,可以在整个样式表中被引用和复用,从而提高代码的灵活性和可维护性。
1. 定义 CSS 变量CSS 变量通常在 :root 选择器中定义,这样它们可以在整个文档中使用:
12345:root { --primary-color: #3498db; --font-size: 16px; --spacing: 1rem;}
以上定义的 --primary-color、--font-size 和 --spacing 就是 CSS 变量。
2. 使用 CSS 变量CSS 变量使用 var() 函数进行引用:
12345button { background-color: var(--primary-color); font-size: var(--font-size); padding: var(--spacing);}
在这里,var(--primary-color) 引用了之前定义的变量 --primary-color 的 ...
nodejs的模拟面试
CommonJS是什么CommonJS(简称CJS)是一种JavaScript模块化规范,最初为在服务端(如Node.js)实现模块化而设计。在CommonJS中,每个文件都被视为一个独立的模块,并通过module.exports导出和require引入其他模块,形成清晰的模块依赖结构。以下是CommonJS的几个关键点:
模块导出和导入:CommonJS使用module.exports导出内容,其他文件使用require导入。例如:
12345678910// 导出模块// math.jsmodule.exports = { add: (a, b) => a + b, subtract: (a, b) => a - b,};// 导入模块const math = require("./math");console.log(math.add(2, 3)); // 输出5
同步加载:CommonJS模块是同步加载的,这在服务端环境中是合理的,因为文件系统通常是本地的,读取速度快。但在浏览器端不适用,因为网络加载是异步的,Co ...
Angular的模拟面试
前言本文是针对angular前端的模拟面试
问题前端CSS的优先级在 CSS 中,选择器用于选择 HTML 元素并应用样式。不同选择器的优先级(权重)决定了样式的应用顺序。以下是常用选择器类型及其优先级规则:
CSS 选择器类型
元素选择器:直接选择 HTML 元素,如 div、p、h1。
类选择器:通过类名选择元素,使用 . 前缀,如 .box。
ID 选择器:通过 ID 名称选择元素,使用 # 前缀,如 #header。
属性选择器:通过元素属性选择元素,如 [type=”text”]。
伪类选择器:选择特定状态的元素,如 :hover、:focus。
伪元素选择器:选择元素的一部分,如 ::before、::after。
组合选择器:通过多种选择器的组合,选择满足特定条件的元素。常见的组合符有:
后代选择器:div p,选择 div 中的所有 p 元素。
子选择器:div > p,选择 div 的直接子元素 p。
相邻兄弟选择器:h1 + p,选择紧跟在 h1 之后的 p 元素。
通用兄弟选择器:h1 ~ p,选择 h1 之后的所有 p 元素。
...
记录一下2024年10月18号和前同事的一次模拟面试
敏捷开发敏捷开发是一种以迭代和增量的方式来开发软件的流程,它注重团队协作、快速反馈以及应对变化的能力。在敏捷开发中,Sprint(冲刺) 是一个核心概念。下面我为你总结了敏捷开发流程中的Sprint、迭代节奏、和时间周期:
1. Sprint(冲刺)
Sprint 是敏捷开发的基础单位,通常是一个固定时间周期,通常为1到4周。
每个 Sprint 都是一个小型迭代周期,在这个周期中,团队需要完成一定数量的工作(通常是具体的功能、用户故事或任务)。
目标是在每个 Sprint 结束时交付一个可工作的产品增量,即使不一定是完整产品,也应该是能够演示或发布的可用功能。
2. 迭代节奏敏捷开发的迭代节奏是基于 Sprint 的。团队会按照以下步骤循环进行开发:
Sprint 计划会议(Sprint Planning):
在每个 Sprint 开始时,团队会召开计划会议,确定当前 Sprint 的目标和待完成的任务。这些任务一般从产品待办事项列表(Product Backlog)中选取,并拆分成更小的用户故事(User Stories)或任务(Tasks)。
团队会评估每个任务的工作量,并 ...
JavaScript中的闭包
定义闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包就是能够读取其他函数内部变量的, 闭包会随着函数的创建而被同时创建。
作用
本部分例子来自chatgpt
创建私有变量
1234567891011function createCounter() { let count = 0; return function() { count++; return count; };}const counter = createCounter();console.log(counter()); // 输出 1console.log(counter());
保持函数执行上下文
12345678910function outer() { let name = "John"; return functio ...