当前位置: 首页 > news >正文

Vim 从何而来?

Vim 编辑器的创造者、维护者和终身领导者 Bram Moolenaar

为了纪念这位杰出的荷兰程序员,我们今天来聊一聊 Vim 的历史。

Vim 无处不在。它被很多人使用。同时 Vim 可能是世界上 “最难用的软件之一” ,但是又多次被程序员们评价为 最受欢迎的 代码编辑器。

Vim 预装在 Mac OS 上,并且在 Linux 领域拥有大量支持者。即使对于那些讨厌它的人来说,它也很熟悉,因为足够流行的命令行工具会默认将用户带入 Vim。

有一些主要网站,包括 Facebook,当你按 j 键时会向下滚动,当你按 k 键时会向上滚动 — 这就是通过 Vim 的广泛传播而形成的文化。

然而 Vim 也是一个谜。

例如,与众所周知的由 Facebook 开发和维护的 React 不同,Vim 没有明显的赞助商。

尽管它无处不在且很重要,但似乎没有任何类型的委员会或组织对 Vim 做出决策。

你可能会花几分钟浏览 Vim 网站(https://www.vim.org),但无法更好地了解谁创建了 Vim 或为什么创建。

如果你启动 Vim 时没有给它提供文件参数,那么你将看到 Vim 的启动消息,其中显示 Vim 是由“Bram Moolenaar 等人”开发的。但这并不能告诉你太多。布拉姆·穆勒纳尔 (Bram Moolenaar) 是谁?他的合作者又是谁?

在这里插入图片描述
也许更重要的是,为什么退出 Vim 需要输入 :wq ?

当然,这是一个“写入”操作,然后是一个“退出”操作,但这并不是一个特别直观的约定。谁决定复制文本应该被称为“yanking”?为什么 :%s/foo/bar/gc 是“查找和替换”的缩写?Vim 的特性似乎太随意了,不可能是虚构的,但它们是从哪里来的呢?

正如通常的情况一样,答案始于古老——贝尔实验室。从某种意义上说,Vim 只是一个软件的最新版本——称之为“wq 文本编辑器”——自 Unix 时代开始以来一直在不断开发和改进。

en Thompson 编写了一个行编辑器
1966 年,贝尔实验室聘请了 Ken Thompson。汤普森刚刚在加州大学伯克利分校获得了电气工程和计算机科学硕士学位。在那里,他使用了一个名为 QED 的文本编辑器,该编辑器是在 1965 年至 1966 年间为伯克利分时系统编写的。

汤普森到达贝尔实验室后做的第一件事就是为麻省理工学院兼容时间重写 QED - 共享系统。后来他为 Multics 项目编写了 QED 的另一个版本。在此过程中,他扩展了该程序,以便用户可以搜索文件中的行并使用正则表达式进行替换。

Multics 项目与伯克利分时系统一样,旨在创建一个商业上可行的分时操作系统,该项目是麻省理工学院、通用电气和贝尔实验室之间的合作项目。AT&T 最终认为该项目毫无进展并退出。

汤普森和贝尔实验室研究员丹尼斯·里奇现在无法访问分时系统,他们开始创建自己的版本,最终被称为 Unix。1969 年 8 月,当他的妻子和年幼的儿子去加利福尼亚度假时,Thompson 组装了新系统的基本组件,“为操作系统、shell、编辑器各分配了一周的时间”。

编辑器将被称为 ed 。它基于 QED,但并不是精确的重新实现。Thompson 决定放弃某些 QED 功能。正则表达式支持被削减,以便只能理解相对简单的正则表达式。QED 允许用户通过打开多个缓冲区来一次编辑多个文件,但 ed 一次只能使用一个缓冲区。尽管 QED 可以执行包含命令的缓冲区,但 ed 不会执行此类操作。可能需要进行这些简化。Dennis Ritchie 表示,没有 QED 的高级正则表达式“并没有多大损失”

ed 现在是 POSIX 规范的一部分,因此如果你有兼容 POSIX 的系统,则可以将其安装在你的计算机上。它值得一试,因为许多 ed 命令如今已成为 Vim 的一部分。例如,为了将缓冲区写入磁盘,你必须使用 w 命令。为了退出编辑器,你必须使用 q 命令。这两个命令可以同时在同一行指定 - wq 。

与 Vim 一样, ed 是一个模式编辑器;要从命令模式进入输入模式,你可以使用插入命令( i )、附加命令( a )或更改命令( c ),取决于你如何转换文本。ed 还引入了用于查找和替换(或“替换”)文本的 s/foo/bar/g 语法。

鉴于所有这些相似之处,你可能认为普通 Vim 用户使用 ed 不会遇到任何问题。但 ed 在另一个重要方面与 Vim 完全不同。ed 是一个真正的行编辑器。它是在电传打字机时代编写并广泛使用的。当 Ken Thompson 和 Dennis Ritchie 攻克 Unix 时,他们看起来像这样:

在这里插入图片描述

ed 不允许你在打开缓冲区的其他行之间编辑行,或移动光标,因为 ed 每次都必须重新打印整个文件对其进行了更改。1969 年的时候, ed 还没有“清除”屏幕内容的机制,因为屏幕只是一张纸,已经输出的所有内容都是用墨水输出的。必要时,你可以要求 ed 使用列表命令 ( l ) 为您打印出一系列行。因此,使用 ed 有点像试图用功率不足的手电筒在黑暗的房子里寻找出路。你一次只能看到这么多,所以你必须尽力记住所有东西在哪里。

这是 ed 会话的示例。我添加了注释(在 # 字符之后)来解释每行的用途

[tt 09:49 ~]$ ed
i                           # Enter input mode
Hello world!Isn't it a nice day?
.                           # Finish input
1,2l                        # List lines 1 to 2
Hello world!$
$
2d                          # Delete line 2
,l                          # List entire buffer
Hello world!$
Isn't it a nice day?$
s/nice/terrible/g           # Substitute globally
,l
Hello world!$
Isn't it a terrible day?$
w foo.txt                   # Write to foo.txt
38                          # (bytes written)
q                           # Quit
[sinclairtarget 10:50 ~]$ cat foo.txt
Hello world!
Isn't it a terrible day?

Bill Joy 编写了一个文本编辑器
ed 对于 Thompson 和 Ritchie 来说工作得足够好。但其他人发现它很难使用,并且它被认为是 Unix 对新手特别不友好的一个例子。

1975 年,一位名叫 George Coulouris 的人在伦敦玛丽女王学院安装的 Unix 系统上开发了 ed 的改进版本。

与 ed 不同,Coulouris 的程序允许用户在屏幕上编辑一行,逐个按键地浏览该行。Coulouris 称他的程序为 em ,或“凡人的编辑器”

1976 年,Coulouris 带着 em 来到加州大学伯克利分校,并以客座教授的身份在加州大学伯克利分校度过了一个夏天。此时距离肯·汤普森离开伯克利去贝尔实验室工作整整十年了。在伯克利,Coulouris 遇到了 Bill Joy,他是一名从事 Berkeley Software Distribution (BSD) 工作的研究生。Coulouris 向 Joy 展示了 em ,Joy 从 Coulouris 的源代码开始构建了 ed 的改进版本,称为 ex ,用于“扩展 ed 的 1.1 版本与 1978 年 BSD Unix 的第一个版本捆绑在一起。ex 很大程度上与 ed 兼容,但它增加了两种模式:“open”模式,它启用了单行编辑,就像 em 一样,以及“视觉”模式,它接管整个屏幕并启用整个文件的实时编辑,就像我们今天习惯的那样。

1979 年的第二个 BSD 版本,引入了一个名为 vi 的可执行文件,它的作用只不过是在可视模式下打开 ex 。

ex / vi (此后称为 vi )建立了我们现在与 Vim 关联的大部分约定,这些约定尚未成为 ed 的一部分。Joy 使用的视频终端是 Lear Siegler ADM-3A,其键盘没有光标键。相反,箭头被绘制在 h 、 j 、 k 和 l 键上,这就是 Joy 使用这些键作为光标的原因 vi 中的移动。ADM-3A 键盘上的退出键也是今天我们可以找到 Tab 键的地方。

命令前缀的:字符也来自 vi ,在常规模式下(即通过运行 ex 输入的模式)使用 : 作为提示。这解决了长期以来对 ed 的抱怨。在可视模式下,保存和退出现在需要输入经典的 :wq 。“Yanking”和“putting”、标记以及用于设置选项的 set 命令都是原始 vi 的一部分。我们今天在 Vim 中进行基本文本编辑过程中使用的功能主要是 vi 功能。

vi 是除 ed 之外唯一与 BSD Unix 捆绑在一起的文本编辑器。当时,Emacs 可能要花费数百美元(这是在 GNU Emacs 之前),因此 vi 变得非常流行。但 vi 是 ed 的直接后代,这意味着如果没有 AT&T 源许可证,则无法修改源代码。这促使一些人创建 vi 的开源版本。STEVIE(VI 爱好者的 ST 编辑器)出现于 1987 年,Elvis 出现于 1990 年, nvi 出现于 1994 年。其中一些克隆添加了额外的功能,如语法突出显示和分割窗口。尤其是 Elvis,它的许多功能都被纳入了 Vim,因为许多 Elvis 用户都在推动将其纳入其中。

Bram Moolenaar 撰写 Vim
“Vim” 现在缩写为“Vi Improve”,最初代表“Vi Imitation”。与许多其他 vi 克隆一样,Vim 最初是尝试在不可用的平台上复制 vi 。Bram Moolenaar 是一位荷兰软件工程师,在荷兰 Venlo 的一家复印机公司工作,他想要为他全新的 Amiga 2000 使用类似 vi 的东西。在 1988 年,Moolenaar 以现有的 STEVIE vi 克隆为起点,开始研究 Vim。

Moolenaar 可以访问 STEVIE,因为 STEVIE 之前曾出现在名为 Fred Fish 磁盘的东西上。Fred Fish 是一位美国程序员,他每个月都会寄出一张软盘,其中包含精选的适用于 Amiga 平台的最佳开源软件。任何人都可以索取磁盘,只需支付邮费即可。Fred Fish 磁盘上发布了 STEVIE 的多个版本。Moolenaar 使用的版本已在 Fred Fish 磁盘 256 上发布。

Moolenaar 喜欢 STEVIE,但很快注意到缺少许多 vi 命令。因此,对于 Vim 的第一个版本,Moolenaar 将 vi 兼容性作为他的首要任务。其他人编写了一系列 vi 宏,Moolenaar 能够让这些宏在 Vim 中运行。1991 年,Vim 首次在 Fred Fish 磁盘 591 上发布,名称为“Vi Imitation”。Moolenaar 添加了一些功能(包括多级撤消和针对编译器错误的“快速修复”模式),这意味着 Vim 已经超越了 vi 。但 Vim 一直是“Vi Imitation(模仿)”,直到 1993 年通过 FTP 发布 Vim 2.0。

Moolenaar 在各种互联网合作者的偶尔帮助下,稳定地为 Vim 添加了功能。Vim 2.0 引入了对 wrap 选项和水平滚动长行文本的支持。Vim 3.0 添加了对分割窗口和缓冲区的支持,该功能受到 vi 克隆 nvi 的启发。Vim 现在还将每个缓冲区保存到交换文件中,以便编辑后的文本可以在崩溃时幸存下来。Vimscript 首次出现在 Vim 5.0 中,并支持语法突出显示。与此同时,Vim 的受欢迎程度与日俱增。它被移植到 MS-DOS、Windows、Mac,甚至 Unix,与原始的 vi 竞争。

2006 年,Vim 被评选为最受 Linux Journal 读者欢迎的编辑器。如今,根据 Stack Overflow 的 2018 年开发者调查,Vim 是最流行的文本模式(即终端仿真器)编辑器,25.8% 的软件开发人员(以及 40% 的系统管理员/DevOps 人员)使用它。有一段时间,在 20 世纪 80 年代末和整个 90 年代,程序员发动了“编辑器战争”,使 Emacs 用户与 vi (最终是 Vim)用户对立。虽然 Emacs 当然仍然有一些追随者,但有些人认为编辑器之战已经结束,Vim 获胜了。2018 年 Stack Overflow 开发者调查表明这是事实;只有 4.1% 的受访者使用 Emacs。

Vim 是如何变得如此成功的?显然人们喜欢 Vim 提供的功能。但我认为,Vim 背后的悠久历史表明,它拥有的优势不仅仅是其功能集。Vim 的代码库可以追溯到 1988 年,当时 Moolenaar 开始研究它。“wq 文本编辑器”有几种不同的具体表达方式,但部分归功于 Bill Joy 和 Bram Moolenaar 对向后兼容性的不同寻常的关注,随着时间的推移,好的想法逐渐积累起来。从这个意义上说,“wq 文本编辑器”是运行时间最长、最成功的开源项目之一,得到了计算世界中一些最伟大思想家的贡献。我不认为“初创公司抛弃所有先例并创造颠覆性新软件”的开发方法一定是坏事,但 Vim 提醒我们,协作和增量方法也可以产生奇迹。

相关文章:

Vim 从何而来?

Vim 编辑器的创造者、维护者和终身领导者 Bram Moolenaar 为了纪念这位杰出的荷兰程序员,我们今天来聊一聊 Vim 的历史。 Vim 无处不在。它被很多人使用。同时 Vim 可能是世界上 “最难用的软件之一” ,但是又多次被程序员们评价为 最受欢迎的 代码编辑…...

Auto.js 清除指定应用缓存

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!Auto.js 清除指定应用缓存 环境 win10Pixel4Android13var packageName = ""; // 包名 var resu…...

[EFI]Surface Pro 4电脑 Hackintosh 黑苹果引导文件

硬件型号驱动情况主板Surface Pro 4处理器Intel Core i5-6300U 2.5GHz已驱动内存16GB DDR4 2400Mhz已驱动硬盘Samsung SSD 860 EVO 250G Media (Install on SSD External)已驱动显卡Intel HD Graphics 520 2GBmacOS 13以上自行添加显卡补丁声卡Realtek ALC3269(id 3…...

【Java 进阶篇】深入浅出:JQuery 事件绑定的奇妙世界

在前端的世界里,事件是不可或缺的一部分。用户的点击、输入、滚动等行为都触发着各种事件,而如何在代码中捕捉并处理这些事件是每位前端开发者必须掌握的技能之一。本文将带你深入浅出,探索 JQuery 中的事件绑定,为你揭开这个奇妙…...

Pair用法示例:

这里用到了 org.apache.commons.lang3.tuple.Pair 来封装数据(就是不想自己再写一个 DO 或者 VO 或者 MO) 在Java中,Pair是一种简单的数据结构,用于存储两个相关联的值。它没有特定的内置类,但可以通过自定义实现或使…...

rpc依赖安装

依赖: 0、boost:用于实现多线程等; 1、protobuf:用于实现数据的序列化、反序列化,也用于定义和生成rpc数据及接口; 2、libevent:用于实现基于IO多路复用机制的网络事件循环。 其实可以直接用包…...

文件存储服务 实时通信服务 HTTP通信协议

目录 文件存储服务实时通信服务HTTP通信协议 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 文件存储服务 文件存储服务是一种用于…...

Redis - 订阅发布替换 Etcd 解决方案

为了减轻项目的中间件臃肿,由于我们项目本身就应用了 Redis,正好 Redis 的也具备订阅发布监听的特性,正好应对 Etcd 的功能,所以本次给大家讲解如何使用 Redis 消息订阅发布来替代 Etcd 的解决方案。接下来,我们先看 R…...

Hessian协议详解

前言 Hessian协议是一种基于二进制的轻量级远程调用协议,用于在分布式系统中进行跨语言的通信。它使用简单的二进制格式来序列化和反序列化数据,并支持多种编程语言,如Java、C#、Python等。Hessian协议相对于其他协议的优势在于其简单性和高…...

【AI视野·今日Sound 声学论文速览 第三十六期】Mon, 30 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 30 Oct 2023 Totally 7 papers 👉上期速览✈更多精彩请移步主页 Daily Sound Papers Style Description based Text-to-Speech with Conditional Prosodic Layer Normalization based Diffusion GAN Authors Neeraj Kumar, A…...

Android Jetpack的组件介绍,常见组件解析

jetpack组件有哪些 Android Jetpack是一个集成Android应用程序组件的一站式解决方案。它使开发人员能够专注于他们的应用程序的真正创新部分,而不会受到Android平台特定的限制。Jetpack组件可分为四个类别: 架构组件(Architecture Componen…...

ImportError: cannot import name ‘url_quote‘ from...

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是全栈工…...

一文看分布式锁

为什么会存在分布式锁? 经典场景-扣库存,多人去同时购买一件商品,首先会查询判断是否有剩余,如果有进行购买并扣减库存,没有提示库存不足。假如现在仅存有一件商品,3人同时购买,三个线程同时执…...

Jenkins自动化部署一个Maven项目

Jenkins自动化部署 提示:本教程基于CentOS Linux 7系统下进行 Jenkins的安装 1. 下载安装jdk11 官网下载地址:https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.html 本文档教程选择的是jdk-11.0.20_linux-x64_bin.tar.g…...

K8S1.23.5部署(此前1.17版本步骤囊括)及问题记录

应版本需求,升级容器版本为1.23.5 kubernetes组件 一个kubernetes集群主要由控制节点(master)与工作节点(node)组成,每个节点上需要安装不同的组件。 master控制节点:负责整个集群的管理。 …...

基于java web的中小型人力资源管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

Python学习笔记--Python关键字yield

原文:http://stackoverflow.com/questions/231767/the-python-yield-keyword-explained 注:这是一篇 stackoverflow 上一个火爆帖子的译文 问题 Python 关键字 yield 的作用是什么?用来干什么的? 比如,我正在试图理解下面的代码: def node._get_child_candidates(self,…...

CF 850 C Arpa and a game with Mojtaba(爆搜优化SG)

CF 850 C. Arpa and a game with Mojtaba(爆搜优化SG) Problem - C - Codeforces Arpa and a game with Mojtaba - 洛谷 思路:显然对于每一种质因子来说操作都是独立的 , 因此可以考虑对于每一种质因子求当前质因子的SG &#…...

kafka分布式安装部署

1.集群规划 2.集群部署 官方下载地址:http://kafka.apache.org/downloads.html (1)上传并解压安装包 [zhangflink9wmwtivvjuibcd2e package]$ tar -zxvf kafka_2.12-3.3.1.tgz -C ../software/(2)修改解压后的文件…...

[云原生2.] Kurbernetes资源管理 ---- (陈述式资源管理方式)

文章目录 1. K8s管理资源的方法类别1.1 陈述式资源管理方式1.2 声明式资源管理方式1.3 GUI式资源管理方法 2. 陈述式资源管理方式2.1 命令行工具 ---- Kubelet2.1.1 简介2.1.2 特性2.1.3 kubelet拓展命令2.1.4 kubectl基本语法2.1.5 Kubectl工具的自动补全 2.2 k8s Service 的类…...

java:IDEA中的Scratches and Consoles

背景 IntelliJ IDEA中的Scratches and Consoles是一种临时的文件编辑环境,用于写一些文本内容或者代码片段。 其中,Scratch files拥有完整的运行和debug功能,这些文件需要指定编程语言类型并且指定后缀。 举例:调接口 可以看到…...

华为 Mate 60 Pro 拆解:陆制零件比率上升至47% | 百能云芯

近日,日经新闻联合研究公司Fomalhaut Techno Solutions对华为 Mate 60 Pro 进行了拆解,揭示了这款于8月发布的新型智能手机的成本结构。拆解结果显示,该手机的国产零部件比例达到了47%,相较于三年前的 Mate 40 Pro,提高…...

ZBrush 2024(三维数字雕刻软件)

ZBrush是一款Mac数字雕刻软件,它具有以下功能: 雕刻工具:ZBrush的雕刻工具非常强大,可以让用户在3D模型上进行雕刻,就像使用传统雕塑工具一样。高精度模型创建:ZBrush可以创建高精度的3D模型,适…...

wpf devexpress 排序、分组、过滤数据

这个教程示范在GridControl如何排序数据,分组数据给一个行创建一个过滤。这个教程基于前一个教程。 排序数据 可以使用GridControl 排序数据。这个例子如下过滤数据对于Order Date 和 Customer Id 行: 1、对于Order Date 和 Customer Id 行指定Colum…...

使用Badboy录制生成 JMeter 脚本

JMeter是一款在国外非常流行和受欢迎的开源性能测试工具,像LoadRunner 一样,它也提供了一个利用本地Proxy Server(代理服务器)来录制生成测试脚本的功能,但是这个功能并不好用。所以在本文中介绍一个更为常用的方法——…...

V10 桌面版、服务器版系统加固

V10 桌面版、服务器版系统加固 一、 文档说明 本文档中涉及的加固方法主要包括:密码策略配置、防火墙规 则配置、禁用高风险服务等。 二、 V10 桌面版系统加固 2.1 密码策略配置 密码策略包括密码老化控制策略和密码复杂度策略。密码老化 控制策略需要配置/etc…...

mtgsig1.2简单分析

{"a1": "1.2", # 加密版本"a2": new Date().valueOf() - serverTimeDiff, # 加密过程中用到的时间戳. 这次服主变坏了, 时间戳需要减去一个 serverTimeDiff(见a3) ! "a3": "这是把xxx信息加密后提交给服务器, 服主…...

场景交互与场景漫游-osgGA库(5)

osgGA库 osgGA库是OSG的一个附加的工具库,它为用户提供各种事件处理及操作处理。通过osgGA库读者可以像控制Windows窗口一样来处理各种事件 osgGA的事件处理器主要由两大部分组成,即事件适配器和动作适配器。osgGA:GUIEventHandler类主要提供了窗口系统的…...

Leetcode -1

Leetcode Leetcode -521.最长特殊序列Leetcode - 541.反转字符串Ⅱ Leetcode -521.最长特殊序列 题目:给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列的长度。如果不存在,则返回 - 1 。 「最长特殊序列」 定义如下&#xff1…...

系列四、JVM的内存结构【本地接口(Native Interface)】

一、组成 本地接口由本地方法栈(Native Method Stack)、本地方法接口(Native Interface)、本地方法库组成。 二、本地接口的作用 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C程序,Jav…...

大型语言模型中的幻觉研究综述:原理、分类、挑战和未决问题11.15+11.16+11.17

大型语言模型中的幻觉研究综述:原理、分类、挑战和未决问题11.15 摘要1 引言2 定义2.1 LLM2.3 大语言模型中的幻觉 3 幻觉的原因3.1 数据的幻觉3.1.1 有缺陷的数据源3.1.2 较差的数据利用率3.1.3 摘要 3.2 来自训练的幻觉3.2.1训练前的幻觉3.2.2来自对齐的幻觉3.2.3…...

redis悲观锁和乐观锁

redis悲观锁 Redis加锁命令分有INCR、SETNX、SET 一、INCR锁 key不存在时,key的值会先被初始化为0,其它用户在执行INCR操作进行加一, 如果返回的数大于1,说明这个锁正在被使用当中,通常用在同时只能有一个人可以操作某…...

前端项目练习,首页退出登录功能,清除token --点击事件 quitFn

<el-menu-item index"2" click"quitFn"><i class"el-icon-switch-button">退出</i> </el-menu-item>quitFn() {// 为了让用户体验更好&#xff0c;来个确认提示框this.$confirm("确认退出登录吗&#xff1f;退出登…...

nodejs+vue杰和牧场管理系统的设计与实现-微信小程序-安卓-python-PHP-计算机毕业设计

系统涉及的对象是奶牛。 系统使用员工有管理员和普通员工。 管理员有修改的权限&#xff0c;普通员工没有。系统包含新闻功能&#xff0c;最好是有个后台管理&#xff0c;在后台输入新闻标题和内容&#xff0c;插入图片&#xff0c;在网页上就可以展示。最好再有个轮播图。 新闻…...

基于STM32的蓝牙低功耗(BLE)通信方案设计与实现

蓝牙低功耗&#xff08;Bluetooth Low Energy&#xff0c;简称BLE&#xff09;是一种能够在低功耗环境下实现无线通信的技术。在物联网应用中&#xff0c;BLE被广泛应用于传感器数据采集、健康监测设备、智能家居等领域。本文将基于STM32微控制器&#xff0c;设计并实现一个简单…...

qt 重载信号,使用““方式进行connect()调用解决方案

问题 在Qt中&#xff0c;重载的信号默认是无法使用&这种方式调用的。 因为&只能绑定到一个具体的信号&#xff0c;而重载的信号名称相同&#xff0c;编译器无法确定要绑定哪一个信号。 解决方案 如果非要使用&绑定重载的信号&#xff0c;可以使用函数指针进行转…...

阿里云+宝塔部署项目(Java+React)

阿里云服务器宝塔面板部署项目&#xff08;SpringBoot React&#xff09; 1. 上传所需的文件到服务器 比如jdk包和java项目的jar&#xff1a;这里以上传jar 为例&#xff0c;创建文件夹&#xff0c;上传文件&#xff1b; 在创建的文件夹下上传jar包 上传jdk 2. 配置jdk环境 3.…...

Linux_系统信息_uname查看内核版本、内核建立时间、处理器类型、顺便得到操作系统位数等

1、uname --help 使用uname --help查看uname命令的帮助信息 2、uname -a 通过上面的help就知道-a选项显示全部内容时的含义了。 内核名是Linux主机名是lubancat&#xff0c;如果想看主机名可以使用命令hostname&#xff1b;内核版本是Linux 4.19.232&#xff0c;建立时间为2…...

screen中conda激活环境后登录jupyter notebook导入包提示找不到,但是在命令行中就可以导入包

问题&#xff1a;screen中conda激活环境后登录jupyter notebook导入包提示找不到&#xff0c;但是在命令行中就可以导入包 解决方法&#xff1a; screen可能有bug&#xff0c;当在screen中conda激活环境后登录jupyter notebook出现问题&#xff0c;import torch提示没有安装好…...

基于SSM的中小型企业财务管理设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

工厂模式之简单工厂模式(常用)

工厂模式的分类 简单工厂模式工厂方法模式抽象工厂模式 简单工厂模式 简单工厂模式又称为静态工厂模式&#xff0c;实质是由一个工厂类根据传入的参数&#xff0c;动态决定应该创建哪一个产品类&#xff08;这些产品类继承自一个父类或接口&#xff09;的实例。简单工厂模式的…...

Kafka入门教程与详解(一)

Kafka入门教程与详解&#xff08;一&#xff09; 一、Kafka入门教程 1.1 消息队列&#xff08;Message Queue) Message Queue消息传送系统提供传送服务。消息传送依赖于大量支持组件&#xff0c;这些组件负责处理连接服务、消息的路由和传送、持久性、安全性以及日志记录。消…...

GoFrame学习随便记1

用Yii1.1中典型的 blog 项目作为例子来学习Web应用应该不错。数据库 sqlite3&#xff0c;windows下可以下载 sqlite-tools-win-x64-*** &#xff08;https://www.sqlite.org/download.htm&#xff09;&#xff0c;把下载的几个exe放到 %GOPATH%\bin 目录下&#xff0c;而该目…...

最新自动定位版本付费进群系统源码

更新内容&#xff1a; 1.在网站首页增加了付款轮播功能。 2.新增了城市定位功能&#xff0c;方便用户查找所在城市的相关信息。 3.对域名库及支付设置进行了更新和优化。 4.增加了一种图模板设置模式&#xff0c;简化了后台模板设置流程。 5.此外还进行了前后台的其他优化…...

freeswitch的一个性能问题

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 在fs的使用过程中&#xff0c;会遇到各种各样的问题&#xff0c;各种问题中&#xff0c;性能问题是最头疼的。 最近在测试某些场景的时候&#xff0c;压测会造成fs的内存占用持续升高&#xff0c;并在达到某个临界点的…...

各机构如何加强网络渗透、“渗透”防御

数据渗透&#xff0c;例如黑客攻击和“渗透”&#xff0c;或未经授权的信息传输。 联邦调查局、国家安全局以及网络安全和基础设施安全局最近的联合报告证明&#xff0c;网络安全仍然是当今国防部门面临的两个最大的网络威胁。 所谓的零日攻击尤其有害&#xff0c;因为组织在…...

Docker命令 常用中间件运维部署,方便构建自己服务

Tips&#xff1a;记录了如何安装不同中间件的Docker命令&#xff0c;帮助大家更方便的搭建自己服务&#xff0c;会不定期更新。 MySQL # Mysql 5版本&#xff1a; docker run -d -p 3306:3306 --privilegedtrue \ -v /itholmes/mysql/log:/var/log/mysql \ -v /itholmes/mysql…...

Android——gradle构建知识片-散装版

一、Gradle - Plugins插件库地址 Gradle - Plugins插件库地址https://plugins.gradle.org/ 二、将自己的代码Android Library发布到仓库Bintray、JCenter、JitPack 放弃JitPack&#xff0c;发布Android Library到Bintray、JCenter - 简书Bug&#xff1a;升级到gradle tools …...

3.3 Windows驱动开发:内核MDL读写进程内存

MDL内存读写是一种通过创建MDL结构体来实现跨进程内存读写的方式。在Windows操作系统中&#xff0c;每个进程都有自己独立的虚拟地址空间&#xff0c;不同进程之间的内存空间是隔离的。因此&#xff0c;要在一个进程中读取或写入另一个进程的内存数据&#xff0c;需要先将目标进…...

开源与闭源:驾驭大模型未来的关键决断

在数字化的时代洪流中&#xff0c;开源与闭源的选择不断成为技术界的重要分水岭。随着特斯拉CEO埃隆马斯克的言论及其决策&#xff0c;公开支持开源&#xff0c;并糅合商业理念与技术革新&#xff0c;使得这场辩论再次成为公众关注的焦点。那么&#xff0c;在这场关乎技术发展脉…...