一文讲懂Mac中的环境变量
你是否曾经因为环境变量配置不当而浪费了宝贵的开发时间?你是否好奇为什么有时候在终端输入命令会提示"command not found",而有时候又能正常运行?如果你是一名Mac用户,并且希望真正掌握环境变量的奥秘,那么这篇文章将为你揭开Mac中环境变量的神秘面纱,帮助你成为一名更高效的开发者。
目录
- 什么是环境变量?
- 为什么环境变量如此重要?
- Mac中常见的环境变量
- 如何查看Mac中的环境变量
- 设置环境变量的方法
- 临时设置
- 永久设置
- 系统级环境变量
- 环境变量加载顺序
- 常见问题和解决方案
- 1. 环境变量没有生效
- 2. PATH环境变量混乱
- 3. 环境变量包含空格
- 4. 子进程无法访问环境变量
- 5. IDE或图形应用程序无法识别环境变量
- 6. 版本管理工具(如pyenv, rbenv)与系统路径冲突
- 环境变量最佳实践
- 高级技巧:使用direnv管理项目特定的环境变量
- 安装direnv
- 使用direnv
- 高级direnv用法
- 总结
什么是环境变量?
环境变量是一种在操作系统中存储的动态命名值,可以影响系统中运行程序的行为。简单来说,它们就像是你电脑中的一个个小便签,上面记录着各种重要信息,这些信息可以被系统或其他程序读取和使用。
在Mac(以及其他Unix-like系统)中,环境变量通常表现为"键值对"的形式:
KEY=value
例如,一个常见的环境变量是PATH
,它告诉系统在哪里查找可执行文件:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
为什么环境变量如此重要?
环境变量之所以重要,是因为它们在软件开发和系统管理中扮演着关键角色:
-
命令行工具的可用性:
PATH
环境变量决定了系统在哪里查找可执行文件。正确配置PATH
可以让你在任何目录下使用命令行工具。 -
配置应用程序行为: 许多应用程序使用环境变量来确定其行为。例如,
JAVA_HOME
环境变量告诉Java应用程序在哪里找到Java运行时。 -
安全性: 某些环境变量用于存储敏感信息,如API密钥或数据库连接字符串,这样可以避免将这些信息硬编码到源代码中。
-
跨平台兼容性: 环境变量提供了一种在不同操作系统间共享配置的方法。
-
开发环境管理: 不同的项目可能需要不同版本的工具或库。通过环境变量,你可以轻松切换между不同的开发环境。
Mac中常见的环境变量
让我们来看看Mac系统中一些常见且重要的环境变量:
-
PATH:
- 作用:指定系统查找可执行文件的目录列表。
- 示例:
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
-
HOME:
- 作用:指定当前用户的主目录。
- 示例:
/Users/yourusername
-
USER:
- 作用:当前登录用户的用户名。
- 示例:
yourusername
-
SHELL:
- 作用:指定当前用户的默认shell。
- 示例:
/bin/zsh
-
LANG:
- 作用:设置程序的语言和区域设置。
- 示例:
en_US.UTF-8
-
JAVA_HOME:
- 作用:指定Java开发工具包(JDK)的安装位置。
- 示例:
/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
-
PYTHONPATH:
- 作用:指定Python查找模块的额外目录。
- 示例:
/Users/yourusername/projects/python_modules
-
NODE_ENV:
- 作用:指定Node.js应用程序的运行环境(如开发、生产等)。
- 示例:
development
-
EDITOR:
- 作用:指定默认的文本编辑器。
- 示例:
/usr/bin/vim
-
TERM:
- 作用:指定终端类型。
- 示例:
xterm-256color
如何查看Mac中的环境变量
在Mac中,有several 线下查看环境变量的方法:
-
使用
env
命令:
打开终端,输入以下命令:env
这将列出所有当前设置的环境变量。
-
使用
printenv
命令:printenv
这个命令的效果与
env
类似。 -
查看特定的环境变量:
如果你只想查看某个特定的环境变量,可以使用echo
命令:echo $PATH
这将显示
PATH
环境变量的值。 -
使用
set
命令:set
这个命令会显示所有的shell变量,包括环境变量。
-
在图形界面中查看:
你也可以通过以下步骤在图形界面中查看系统环境变量:- 打开 “终端” 应用程序
- 在菜单栏中选择 “Shell” > “新建窗口” > “系统环境变量”
这将打开一个新的终端窗口,显示所有的系统环境变量。
让我们通过一个实际的例子来演示如何查看和理解环境变量:
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin$ echo $HOME
/Users/yourusername$ printenv | grep JAVA
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
在这个例子中,我们首先查看了PATH
环境变量,它显示了一系列由冒号分隔的目录。这些目录就是系统查找可执行文件的地方。然后我们查看了HOME
环境变量,它指向当前用户的主目录。最后,我们使用grep
命令过滤出包含"JAVA"的环境变量,这里显示了JAVA_HOME
的设置。
理解这些环境变量的含义和作用,对于排查问题和优化开发环境至关重要。例如,如果你安装了一个新的命令行工具,但在终端中无法使用,很可能是因为它的安装目录没有被添加到PATH
环境变量中。
设置环境变量的方法
在Mac中设置环境变量有两种主要方法:临时设置和永久设置。让我们详细探讨这两种方法。
临时设置
临时设置的环境变量只在当前终端会话中有效。一旦关闭终端窗口或重启电脑,这些设置就会失效。
-
使用
export
命令:export MY_VARIABLE="Hello, World!"
这会创建一个名为
MY_VARIABLE
的新环境变量。 -
在命令前设置:
MY_VARIABLE="Hello, World!" python my_script.py
这种方法只为特定命令设置环境变量。
示例:假设你正在开发一个Python应用,需要临时设置一个API密钥:
$ export API_KEY="your-secret-api-key"
$ python
Python 3.9.5 (default, May 4 2021, 03:33:11)
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> print(os.environ.get('API_KEY'))
your-secret-api-key
>>> exit()$ echo $API_KEY
your-secret-api-key$ # 关闭终端后,再次打开新的终端窗口
$ echo $API_KEY
# 此时不会显示任何内容,因为环境变量已经失效
永久设置
如果你希望环境变量在重启后依然有效,你需要将它们添加到shell的配置文件中。对于大多数Mac用户来说,默认的shell是Zsh。
-
编辑
~/.zshrc
文件:nano ~/.zshrc
-
添加环境变量:
在文件的末尾添加:export MY_VARIABLE="Hello, World!"
-
保存并退出:
按Ctrl+X
,然后按Y
,最后按Enter
。 -
重新加载配置文件:
source ~/.zshrc
示例:让我们永久设置JAVA_HOME
环境变量:
$ echo 'export JAVA_HOME=$(/usr/libexec/java_home)' >> ~/.zshrc
$ source ~/.zshrc
$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home
这个例子中,我们使用java_home
工具动态获取Java安装路径,并将其设置为JAVA_HOME
环境变量。通过将这行配置添加到~/.zshrc
文件中,我们确保每次打开新的终端窗口时,这个环境变量都会被正确设置。
注意:如果你使用的是Bash而不是Zsh,你需要编辑~/.bash_profile
或~/.bashrc
文件。
系统级环境变量
除了用户级的环境变量,Mac还允许设置系统级的环境变量,这些变量对所有用户都有效。
-
创建或编辑
/etc/paths.d/
目录下的文件:sudo nano /etc/paths.d/mypath
-
添加新的路径:
在文件中添加新的路径,每行一个。 -
保存并退出。
这种方法主要用于修改系统的PATH
环境变量。对于其他类型的系统级环境变量,你可以编辑/etc/environment
文件:
sudo nano /etc/environment
在这个文件中,你可以添加键值对形式的环境变量:
SYSTEM_WIDE_VARIABLE="This is a system-wide environment variable"
记住,修改系统级配置需要管理员权限,而且可能影响系统的稳定性,请谨慎操作。
环境变量加载顺序
了解Mac中环境变量的加载顺序对于解决冲突和优化配置至关重要。以下是Mac(使用Zsh作为默认shell)加载环境变量的大致顺序:
/etc/zshenv
~/.zshenv
/etc/zprofile
~/.zprofile
/etc/zshrc
~/.zshrc
/etc/zlogin
~/.zlogin
这个顺序意味着:
- 系统级配置(
/etc/
下的文件)先于用户级配置(~/
下的文件)加载。 zshenv
文件最先加载,适合放置重要的环境变量。zshrc
文件在交互式shell中加载,适合放置别名(alias)和函数定义。zlogin
文件最后加载,适合放置登录后的设置。
理解这个加载顺序可以帮助你更好地组织你的环境变量配置。例如,如果你想要某个环境变量在所有情况下都可用(包括非交互式shell),你应该将它放在~/.zshenv
中。
让我们通过一个实际的例子来说明这个加载顺序的重要性:
# 在 /etc/zshenv 中
export GLOBAL_VAR="Hello from global"# 在 ~/.zshenv 中
export GLOBAL_VAR="Hello from user"
export USER_VAR="User specific"# 在 ~/.zshrc 中
alias print_vars='echo $GLOBAL_VAR && echo $USER_VAR'
在这个例子中:
GLOBAL_VAR
在系统级和用户级在这个例子中:GLOBAL_VAR
在系统级和用户级配置中都被定义了。USER_VAR
只在用户级配置中定义。- 我们在
~/.zshrc
中定义了一个别名来打印这些变量。
当我们打开一个新的终端窗口时,会发生以下情况:
$ echo $GLOBAL_VAR
Hello from user
$ echo $USER_VAR
User specific
$ print_vars
Hello from user
User specific
这个结果说明:
- 用户级的
~/.zshenv
中的设置覆盖了系统级的/etc/zshenv
中的设置。 - 在
~/.zshrc
中定义的别名成功加载并可以使用。
理解这种加载顺序可以帮助你解决环境变量冲突,并确保你的配置按预期工作。
常见问题和解决方案
在使用Mac的环境变量时,开发者可能会遇到一些常见问题。让我们来看看这些问题以及它们的解决方案:
1. 环境变量没有生效
问题: 你设置了一个新的环境变量,但是在新的终端窗口中无法使用。
解决方案:
- 确保你已经正确地设置了环境变量,并且在正确的配置文件中设置(
~/.zshrc
或~/.zshenv
)。 - 使用
source
命令重新加载配置文件:source ~/.zshrc
- 如果问题仍然存在,尝试重启终端应用程序或注销并重新登录。
2. PATH环境变量混乱
问题: 某些命令无法找到,或者系统使用了错误版本的命令。
解决方案:
- 检查你的
PATH
环境变量:echo $PATH
- 确保重要的目录位于
PATH
的前面。你可以在~/.zshrc
中重新设置PATH
:export PATH="/usr/local/bin:$PATH"
- 使用
which
命令检查特定命令的位置:which python
3. 环境变量包含空格
问题: 包含空格的环境变量值导致错误。
解决方案:
- 在设置环境变量时使用引号:
export MY_VAR="This is a value with spaces"
4. 子进程无法访问环境变量
问题: 在脚本或子进程中无法访问某些环境变量。
解决方案:
- 确保变量已经被导出。使用
export
命令而不是简单的赋值:export MY_VAR="value" # 正确 MY_VAR="value" # 错误,不会传递给子进程
- 对于需要在所有情况下都可用的变量,将其设置在
~/.zshenv
文件中。
5. IDE或图形应用程序无法识别环境变量
问题: 在终端中设置的环境变量在IDE或其他图形应用程序中不可用。
解决方案:
- 对于通过Dock启动的应用程序,你可能需要在
~/.zshenv
中设置环境变量。 - 或者,你可以创建一个
launchd.conf
文件来设置全系统的环境变量:
然后重启系统使更改生效。echo 'setenv MY_VAR value' | sudo tee -a /etc/launchd.conf
6. 版本管理工具(如pyenv, rbenv)与系统路径冲突
问题: 安装了版本管理工具后,系统使用了错误版本的解释器。
解决方案:
- 确保版本管理工具的初始化脚本正确添加到你的shell配置文件中。
- 例如,对于pyenv,在
~/.zshrc
中添加:eval "$(pyenv init -)"
- 确保这些初始化命令在
PATH
修改之后。
通过理解这些常见问题和解决方案,你可以更好地管理Mac中的环境变量,避免因配置错误而浪费宝贵的开发时间。
环境变量最佳实践
为了更有效地使用环境变量并避免潜在的问题,这里有一些最佳实践建议:
-
使用有意义的名称:
选择清晰、描述性的名称for 环境变量。例如,使用DATABASE_URL
而不是DB_CONN
。export DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
-
避免敏感信息:
不要在版本控制系统中存储包含敏感信息(如密码、API密钥)的环境变量。Instead,使用.env
文件或专门的秘密管理工具。# .env file (不要提交到版本控制系统) API_KEY=your_secret_api_key
-
使用默认值:
当使用环境变量时,提供默认值以增加代码的健壮性。# In a shell script ENVIRONMENT=${ENVIRONMENT:-development}
-
分组相关变量:
使用前缀来组织相关的环境变量。export APP_NAME="MyApp" export APP_VERSION="1.0.0" export APP_DEBUG="true"
-
文档化:
记录你的环境变量,包括它们的用途、可能的值和默认值。# DATABASE_URL: The connection string for the database # Format: postgresql://user:password@host:port/dbname # Default: postgresql://localhost:5432/myapp export DATABASE_URL="postgresql://localhost:5432/myapp"
-
使用工具管理多环境:
对于需要在不同环境(开发、测试、生产)之间切换的项目,考虑使用如direnv
这样的工具。 -
定期审查和清理:
定期检查你的环境变量,移除不再使用的变量。 -
使用类型安全的封装:
在应用程序代码中,使用类型安全的方法来访问环境变量。import os from typing import Optionaldef get_database_url() -> str:url = os.environ.get('DATABASE_URL')if url is None:raise ValueError("DATABASE_URL must be set")return urldef get_debug_mode() -> bool:return os.environ.get('DEBUG', 'false').lower() == 'true'
-
版本控制环境变量模板:
虽然不应该在版本控制中包含实际的环境变量值,但是可以包含一个模板或示例文件。# .env.example DATABASE_URL=postgresql://user:password@localhost:5432/dbname API_KEY=your_api_key_here DEBUG=false
-
使用环境特定的配置文件:
对于不同的环境,使用不同的配置文件。# .zshrc if [ -f ~/.zshrc_local ]; thensource ~/.zshrc_local fi
然后,在每个环境中创建一个
.zshrc_local
文件,包含特定于该环境的设置。
通过遵循这些最佳实践,你可以创建一个更加健壮、安全和可维护的环境变量配置。这不仅可以提高你的开发效率,还可以减少由于环境配置错误而导致的问题。
高级技巧:使用direnv管理项目特定的环境变量
当你在多个项目之间切换工作时,管理项目特定的环境变量可能会变得复杂。这就是direnv
发挥作用的地方。direnv
是一个扩展shell的工具,它可以根据当前目录加载和卸载环境变量。
安装direnv
在Mac上,你可以使用Homebrew来安装direnv:
brew install direnv
安装后,你需要在你的shell配置文件(如~/.zshrc
)中添加以下行:
eval "$(direnv hook zsh)"
使用direnv
-
创建.envrc文件:
在你的项目目录中创建一个.envrc
文件:cd /path/to/your/project touch .envrc
-
添加环境变量:
在.envrc
文件中添加你的项目特定的环境变量:export PROJECT_NAME="MyAwesomeProject" export DATABASE_URL="postgresql://localhost:5432/myproject" export API_KEY="your_secret_api_key"
-
允许direnv:
首次创建或修改.envrc
文件后,你需要显式地允许direnv加载它:direnv allow
现在,每次你进入这个项目目录时,这些环境变量就会自动加载。当你离开目录时,它们会自动卸载。
高级direnv用法
-
继承环境变量:
你可以使用dotenv
命令来加载.env
文件:# .envrc dotenv .env
-
根据环境加载不同的配置:
# .envrc if [ "$ENVIRONMENT" = "production" ]; thendotenv .env.production elsedotenv .env.development fi
-
添加目录到PATH:
# .envrc PATH_add bin
-
设置项目特定的shell别名:
# .envrc alias run="python manage.py runserver"
-
自动激活虚拟环境:
# .envrc layout python3
通过使用direnv,你可以大大简化项目间的切换过程,确保每个项目都有正确的环境设置,而不会污染全局环境。
总结
在这篇文章中,我们深入探讨了Mac中环境变量的方方面面。我们学习了什么是环境变量,为什么它们如此重要,以及如何在Mac系统中查看、设置和管理它们。我们还讨论了常见问题及其解决方案,分享了一些最佳实践,并介绍了如何使用direnv这样的高级工具来管理项目特定的环境变量。
理解和正确使用环境变量可以:
- 提高开发效率
- 增强应用程序的安全性
- 简化配置管理
- 使项目更易于在不同环境之间迁移
记住,环境变量是强大的工具,但也需要谨慎使用。始终遵循安全最佳实践,特别是在处理敏感信息时。定期审查和更新你的环境变量配置,确保它们始终符合你的需求。
最后,我鼓励你深入探索本文中提到的工具和技术。实践是掌握这些概念的最好方法。尝试在你的下一个项目中应用这些知识,你会发现它们如何改变你的开发工作流程。
通过掌握Mac中的环境变量,你将成为一个更高效、更专业的开发者。祝你编码愉快!
相关文章:

一文讲懂Mac中的环境变量
你是否曾经因为环境变量配置不当而浪费了宝贵的开发时间?你是否好奇为什么有时候在终端输入命令会提示"command not found",而有时候又能正常运行?如果你是一名Mac用户,并且希望真正掌握环境变量的奥秘,那么这篇文章将为你揭开Mac中环境变量的神秘面纱,帮助你成为一…...

将硬盘的GPT 转化为MBR格式
遇到的问题 在重新安装系统时,磁盘遇到无法空间分配给系统。 解决方式 使用Windows10镜像 U盘安装,选择磁盘时,转换磁盘格式为MBR。然后退出安装程序。 Shift F10# 输入 diskpart# 查看磁盘信息 list disk# 选择需要转换的磁盘࿰…...

C++基于select和epoll的TCP服务器
select版本 服务器 #include <arpa/inet.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <string> #include <pthread.h> #include <sys/select…...

SpringBoot 读取配置文件的4种方式
文章目录 1. Value 注解读取单个属性2. 使用 ConfigurationProperties 注解3. 通过 Environment 对象读取属性4. 使用 PropertySource 注解加载额外的配置文件 在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/…...

【车载开发系列】ParaSoft单元测试环境配置(三)
【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三) 【车载开发系列】ParaSoft单元测试环境配置(三)一. 去插桩设置Step1:静态解析代码Step2:编辑Parasoft文件Step3:确认去插桩二. 新增测试用例Step1:生成测试用例Step2:执…...

如何让Threejs的canvas背景透明?
在Three.js中,要让Canvas的背景透明,只显示场景中的模型或物体,有两个关键点: 一、对渲染器(Renderer)进行alpha为true配置; 二、通过CSS设置,使canvas设定为透明背景模式。 以下是代…...

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法
Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…...

[性能]高速收发的TCP/MQTT通信
Nagle算法是一种TCP/IP协议中的优化算法,旨在减少小数据包的数量,从而减少网络拥塞的可能性。该算法规定,在一个TCP连接上最多只能有一个未被确认的小分组。当数据被发送后,如果收到确认(ACK)之前&#x…...

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(下)
往期知识点记录: OpenHarmony(鸿蒙南向开发)——轻量系统STM32F407芯片移植案例 OpenHarmony(鸿蒙南向开发)——Combo解决方案之W800芯片移植案例 OpenHarmony(鸿蒙南向开发)——小型系统STM32M…...

网络安全学习(五)Burpsuite实战
bp功能确实强大,记录一个bp手机验证码的实例。 当然,首先要打开bp,设置好浏览器的代理。 浏览器访问实例网址www.xxx.com(隐藏真实网址)。 真实网址有个注册功能,需要手机验证码。 好的,我们…...

ego-planner开源代码之simulator.xml介绍分析
ego-planner开源代码之simulator.xml介绍&分析 1. 源由2. simulator配置2.1 配置入参2.2 mockamap_node 地图生成节点2.3 quadrotor_simulator_so3 四旋翼仿真节点2.4 Nodelet机制 四旋翼控制节点2.5 odom_visualization 里程计数据2.6 pcl_render_node 本地感知 3. 总结 1…...

论文阅读笔记 --- 图模互补:知识图谱与大模型融合综述 --- 按参考文献整理
Large Language Models’ Understanding of Math: Source Criticism and Extrapolation Submitted on 12 Nov 2023大模型在处理结构化推理方面(如解决数学问题[99])表现不佳 Tree of Thoughts: Deliberate Problem Solving with Large Language Models S…...

Cpp类和对象(上)(3)
文章目录 前言一、面向过程与面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及类的封装类的访问限定符类的封装 五、类的作用域(类域)六、类的实例化七、类对象模型如何计算类对象的大小类对象的存储方式猜测 八、this指针this指针的引出this指针的特性 九、C语言…...

【微信小程序】连续拍照功能实现
前言: 最近在使用uniapp开发微信小程序,遇到这样一个需求,用户想要连续拍照,拍完之后可以删除照片,保留自己想要的照片,然后上传到服务器上。由于原生的方法只能一个个拍照上传,所以只能自己通过…...

JavaSE:11、内部类
学习 资源1 学习资源 2 1、成员内部类 import com.test.*;public class Main {public static void main(String [] argv){Person personnew Person();//Person构造函数Person.Woman womanperson.new Woman();//woman构造函数} }package com.test;public class Person {publ…...

VTD激光雷达(7)——07_OptiX_Variables_Advanced
文章目录 前言一、总结 前言 一、 1 和上图蓝绿的区别在于 总结...

运维工程师面试整理-自动化运维
自动化运维是现代运维工作中不可或缺的一部分,它可以大幅提升效率,减少人为错误,并使得大规模环境管理变得可行。在面试中,面试官通常会通过自动化运维相关的问题来评估你在自动化工具使用、脚本编写、CI/CD 实践以及系统监控等方面的能力。以下是关于自动化运维的详细内容…...

【JAVA基础】实现Tomcat基本功能
文章目录 TCP/IP协议Socket编程ServletTomcat 在搜索了两三天之后,也是大概弄懂了Tomcat是个什么东西,我们在说Tomcat之前,先来了解一下下面这三个东西: TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP(传输控制协议…...

风力发电叶片缺陷检测数据集
风力发电叶片缺陷检测数据集】nc: 4 names: [Burn Mark, Coating_defects, Crack, EROSION ] 名称:【烧伤痕迹, 涂层缺陷, 裂缝,侵蚀】共1095张,8:1:1比例划分,(train;876张,val:109张ÿ…...

数据类型自动转换的解决方案
数据类型自动转换的解决方案 java8、jdk8背景 为方便测试框架数据处理以及方便查看一些数据,弄了一个工具类,部分要点简要说明。 主要涉及到字符串与其他类型的相互转换,无其他类型之间的相互转换。 轻量测试框架实现与使用的总篇可见此文…...

大厂校招:唯品会Java面试题及参考答案
SortedSet 的原理 SortedSet 是一个有序的集合接口,它继承自 Set 接口。在 Java 中,常见的实现类有 TreeSet。 TreeSet 实现了 SortedSet 接口,它使用红黑树来维护集合中元素的有序性。红黑树是一种自平衡的二叉搜索树,具有以下特点: 每个节点要么是红色,要么是黑色。根节…...

Qt常用控件——QLCDNumber
文章目录 QLCDNumber核心属性倒计时小程序倒计时小程序相关问题 QLCDNumber核心属性 QLCDNumber是专门用来显示数字的控件,类似于这样: 属性说明intValue获取的数字值(int).value获取的数字值(double)和intValue是联动的例如value设为1.5,in…...

专业学习|GERT网络概览(学习资源、原理介绍、变体介绍)
一、GERT 网络概览 GERT(Graphical Evaluation Review Technique,图示评审技术)是一种结合流线图理论(Flow Graphical Theory)、矩母函数(Moment Generating Function)、计划评审技术(Program Evaluation Review Technique)解决随机网络问题的方法,描述各…...

搭建一个基于角色的权限验证框架
说明:基于角色的权限验证(Role-Based Access Control,RBAC)框架,是目前大多数服务端的登录校验框架。本文介绍如何快速搭建一个这样的框架,不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 R…...

下载chromedriver驱动
首先进入关于ChromeDriver最新下载地址:Chrome for Testing availability 进入之后找到与自己所匹配的,在浏览器中查看版本号,下载版本号需要一致。 下载即可,解压,找到 直接放在pycharm下即可 因为在环境变量中早已配…...

在STM32工程中使用Mavlink与飞控通信
本文讲述如何在STM32工程中使用Mavlink协议与飞控通信,特别适合自制飞控外设模块的项目。 需求来源: 1、增稳云台里的STM32单片机需要通过串口接收飞控传来的云台俯仰、横滚控制指令和相机拍照控制指令; 2、自制的有害气体采集器需要接收飞…...

【Elasticsearch】-7.17.24版本接入
官网 https://www.elastic.co/cn/downloads/elasticsearch 本项目基于windows环境下,其他环境操作类似 1、初始化配置 打开config/elasticsearch.yaml 添加如下配置 cluster.name: dams_clusternetwork.host: 127.0.0.1 http.port: 9200# 不开启geo数据库 inge…...

ShouldSniffAttr在自动化测试中具体是如何应用?
在自动化测试中,ShouldSniffAttr 这样的函数名通常暗示它是一个用于断言(assertions)的工具,用于检查某个元素或属性是否符合预期的条件。 虽然这不是一个标准的函数名,但我们可以根据命名推测其用途。 例如…...

前端vue3打印,多页打印,不使用插件(工作中让我写一个打印功能)
说下总体思路,创建一个组件,里面放多个span字段,然后根据父组件传入的参数,生成子组件,最好我们打印子组件的信息即可。通过我多次ai,探索最后成功了。 子组件代码 media print 这个我要讲一下ÿ…...

传感技术是如何实现实时监测和控制的呢
传感技术在力士乐拧紧系统中实现实时监测和控制的方式主要通过以下几个步骤进行: 一、传感器数据采集 1. 传感器种类: 力士乐拧紧系统中可能包含多种传感器,如力矩传感器、角度传感器和转速传感器等。这些传感器各自负责检测拧紧过程中的不…...