基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
摘要
本文分为两部分:Linux开发环境搭建和软件基础。Linux开发环境搭建介绍了Ubuntu虚拟机安装及SSH、Samba配置,可以实现用VSCode操作虚拟机。为了后续工作,搭建了乐鑫ESP32 SDK环境。软件基础介绍了Linux开发常用的软件基础,包括Linux指令、Git、Makefile、裸机和RTOS。
环境搭建
ESP32学习方法:主要看API手册和历程
API和寄存器的关系:因为寄存器的操作太复杂了,所以原厂工程师把寄存器的操作封装成API
1. UI交互图和程序流程图
在设计软件之前,要先画UI交互图和程序流程图
2. Ubuntu虚拟机安装及SSH、Samba配置
2.1 安装虚拟机
安装VMware Workstation,我安装的版本是17.6。VMware17.6 软件安装包下载及安装教程
2.2 安装Ubuntu
官网:https://ubuntu.com/download/desktop
实测不用“科学方法”下载速度较慢。我下载的是Ubuntu 24.04.1 LTS
参考Ubuntu 20.04 LTS安装教程:超详细VMware安装Ubuntu虚拟机步骤
顺序略有不同,但大体一致。
2.3 在虚拟机中安装SSH
打开Ubuntu的终端,输入
sudo apt-get install openssh-server
sudo /etc/init.d/ssh start
ps -e|grep ssh
2.4 Samba服务器搭建
Samba 允许不同操作系统(如 Windows、Linux 或 macOS)的设备访问和管理该文件夹中的内容。通过 Samba 共享的文件夹可以在网络上的其他设备之间共享文件。
在Ubuntu的终端中,输入
sudo apt-get update
sudo apt-get install samba
sudo apt-get install gedit
sudo gedit /etc/samba/smb.conf
会弹出一个文档,在文档底部加入下面配置。其中share
是共享文件夹的名称,可以改为别的。
[share]valid user = xzhpath = /home/xzh/sharepublic = yeswritable = yescreate mask = 0644force create mode = 0644directory mask = 0755force directory mode = 0755available = yes
改完之后保存
在Ubuntu终端中继续输入下面命令重启Samba服务:
sudo service smbd restart
sudo ufw allow samba
输入sudo smbpasswd -a xzh
创建Samba用户名,我取名为xzh
,然后根据提示设置密码。
重启下一Samba:
sudo /etc/init.d/smbd restart
在Ubuntu终端中输入ip addr show
查询Samba的IP地址
Interface ens33
表示我的网络接口,通常表示有线网络连接。
inet 192.168.62.128/24 是我当前机器的 IPv4 地址,即 192.168.62.128。这就是其他设备用来连接到我 Samba 服务器的 IP 地址。
inet6 fe80::20c:29ff:fe2c/64 是我机器的 IPv6 地址,但通常局域网内共享文件更多使用 IPv4 地址。
在Windows系统上按下“Windows
键+R
”,输入\\192.168.62.128
,点击确定。
Windows安全中心会出现弹窗“输入网络凭据”,输入刚刚创建的Samba用户名和密码,然后点击确定就可以进入共享文件夹了。
2.5 在Window的VSCode中通过SSH命令行方式访问Ubuntu
在Windows中打开VSCode,安装C/C++和SSH插件
配置连接Ubuntu
添加配置信息:
Host ubuntuHostName 192.168.62.128User xzh
192.168.62.128
为Ubuntu的IP,xzh为我Ubuntu的用户名。
保存之后刷新一下,出现ubuntu。
选择linux
选择continue
输入密码,按回车
成功连接
3. 乐鑫ESP32 SDK环境搭建
3.1 安装环境依赖工具
在VSCode的终端中输入
sudo apt-get update
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
3.2 下载源码
在终端中输入:
mkdir esp
cd ~/esp
git clone -b release/v4.4 --recursive https://github.com/espressif/esp-idf.git
在git clone时遇到了这个问题:
error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)
error: 780 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
fatal: clone of 'https://github.com/espressif/esp32-wifi-lib.git' into submodule path '/home/xzh/esp/esp-idf/components/esp_wifi/lib' failed
Failed to clone 'components/esp_wifi/lib' a second time, aborting
error: RPC failed; curl 92 HTTP/2 stream 5 was not closed cleanly: CANCEL (err 8)
这是由于在使用 HTTP/2 协议通过 curl 下载时,网络连接中断或被取消。可能是因为网络不稳定或远程服务器的问题。
error: 780 bytes of body are still expected
Git 期望从服务器接收到更多数据,但数据传输中途中断了。
fetch-pack: unexpected disconnect while reading sideband packet
在 Git 从服务器读取数据时连接被意外断开。
fatal: early EOF
和 fatal: fetch-pack: invalid index-pack output
Git 收到了一个不完整的包,导致它在处理包时失败。EOF 表示文件或数据流提前结束。
fatal: clone of 'https://github.com/espressif/esp32-wifi-lib.git' into submodule path '/home/xzh/esp/esp-idf/components/esp_wifi/lib' failed
Git 无法完成克隆操作,因此将子模块克隆到指定路径失败。
Failed to clone 'components/esp_wifi/lib' a second time, aborting
Git 尝试重新克隆,但再次失败,因此操作中止。
解决办法:
进入esp_idf文件夹内
cd /home/xzh/esp/esp-idf/components/esp_wifi/lib
单独更新子模块
git submodule update --init --recursive
3.3 安装编译链
进入到解压的esp-idf文件中,安装编译代码需要的工具链
cd ~/esp/esp-idf
export IDF_GITHUB_ASSETS="dl.espressif.com/github_assets"
./install.sh
出现报错:
pip 24.0 from /usr/lib/python3/dist-packages/pip (python 3.12)
Installing virtualenv
error: externally-managed-environment× This environment is externally managed
╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz is the package you are trying toinstall.If you wish to install a non-Debian-packaged Python package,create a virtual environment using python3 -m venv path/to/venv.Then use path/to/venv/bin/python and path/to/venv/bin/pip. Makesure you have python3-full installed.If you wish to install a non-Debian packaged Python application,it may be easiest to use pipx install xyz, which will manage avirtual environment for you. Make sure you have pipx installed.See /usr/share/doc/python3.12/README.venv for more information.note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.
Traceback (most recent call last):File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1587, in action_install_python_envimport virtualenv # noqa: F401^^^^^^^^^^^^^^^^^
ModuleNotFoundError: No module named 'virtualenv'During handling of the above exception, another exception occurred:Traceback (most recent call last):File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1996, in <module>main(sys.argv[1:])File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1992, in mainaction_func(args)File "/home/xzh/esp/esp-idf/tools/idf_tools.py", line 1590, in action_install_python_envsubprocess.check_call([sys.executable, '-m', 'pip', 'install', '--user', 'virtualenv'],File "/usr/lib/python3.12/subprocess.py", line 413, in check_callraise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['/usr/bin/python3', '-m', 'pip', 'install', '--user', 'virtualenv']' returned non-zero exit status 1.
分析:
error: externally-managed-environment
这条错误提示表明你的 Python 环境受到了外部管理(即,操作系统的包管理系统控制了这个环境),而不允许通过 pip
在全局安装 Python 包。这是为了保护系统环境不被破坏,因为不同的包管理系统之间可能会发生冲突。
This environment is externally managed
你的操作系统(例如,Ubuntu 或 Debian)将 Python 环境标记为外部管理,阻止 pip 在全局环境中安装包,以避免系统依赖关系被破坏。
ModuleNotFoundError: No module named 'virtualenv'
你尝试运行的 Python 脚本 idf_tools.py
需要使用 virtualenv
模块,但这个模块在系统中并未安装。
解决办法:
使用 apt
安装系统范围的包
sudo apt install python3-virtualenv
3.4 设置环境
把esp-idf路径设为本地路径,在终端执行:
. /home/xzh/esp/esp-idf/export.sh
3.5 判断是否搭建成功
通过idf.py --version
查看 ESP-IDF 版本
得到输出:
通过 git log
查看当前代码状态
得到输出:
提交历史和 Git 标签都表明我的代码库已经成功同步到最新版本,克隆没有问题,ESP-IDF 环境应该已经搭建完成。
软件基础
4. Linux 指令
4.1 cd (Change Directory)
cd
命令用于在目录之间切换或更改当前的工作目录。
cd <目录路径>
: 切换到指定的目录。cd ..
: 切换到上一级目录。
示例:如果当前在 /home/user/Documents,执行cd ..
将切换到 /home/user。cd ~
: 切换到当前用户的主目录。
示例:cd ~
将切换到类似 /home/username 的路径。cd -
: 切换到上一个工作目录。
示例:如果你从 /home/user 切换到 /var/log,执行cd -
将回到 /home/user。
4.2 ls (List Directory Contents)
ls
命令用于显示当前目录或指定目录中的文件和子目录的列表。
ls
: 显示当前目录中的文件和子目录。ls <目录路径>
: 显示指定目录中的文件和子目录。
4.3 mkdir (Make Directory)
mkdir
命令用于创建新的目录。
mkdir <目录名>
: 创建一个新的目录。
示例:mkdir my_folder
会在当前目录下创建一个名为 my_folder 的目录。mkdir -p <路径>
: 创建目录及其父目录(如果不存在)。
示例:mkdir -p /home/user/docs/project
如果 docs 或 project 目录不存在,它们都会被创建。
4.4 rm (Remove)
rm
命令用于删除文件或目录。
- rm <文件名>: 删除指定文件。
- rm -r <目录名>: 递归删除目录及其内部所有内容。
4.5 cp (Copy)
cp 命令用于复制文件或目录。
cp <源文件> <目标路径>
: 复制文件到目标路径。
示例:cp file.txt /home/user/Documents/
将 file.txt 复制到 /home/user/Documents/ 目录。cp <源文件> <目标文件>
: 复制文件并重命名。
示例:cp file.txt newfile.txt 将 file.txt
复制为 newfile.txt。cp -r <源目录> <目标路径>
: 递归复制目录及其内容。
示例:cp -r my_folder /home/user/backup/
将整个 my_folder 目录及其所有内容复制到 /home/user/backup/ 目录。
4.6 mv (Move)
mv
命令用于移动或重命名文件或目录。它将文件从一个位置移动到另一个位置,或者将文件/目录重命名。
mv <源文件> <目标路径>
: 移动文件到目标路径。
示例:mv file.txt /home/user/Documents/
将 file.txt 移动到 /home/user/Documents/ 目录。mv <源文件> <新文件名>
: 重命名文件。
示例:mv oldname.txt newname.txt
将 oldname.txt 重命名为 newname.txt。mv <源目录> <目标路径>
: 移动整个目录到目标路径。
示例:mv my_folder /home/user/backup/
将 my_folder 目录移动到 /home/user/backup/。
5. Git 使用
Git是一个版本管理工具。
5.1 编辑文件
cd share
mkdir esp_demo1
cd esp_demo1
vim test.c
新建了一个test.c文件,随便输入点啥,按Esc
+:
+w
+q
保存该文件。输入ls
命令,可以看到输出test.c。
用git init创建本地仓库
然后设置用户名和邮箱
用git status
查看当前状态。输出显示test.c是新添加的文件
用git add *
把当前路径下所有文件都添加进本地仓库。
用git commit -m "标签名"
去打标签
用git log
看一下日志
如果需要修改test.c文件,用vim test.c
进入文件,保存完之后,再用git add *
指令添加一下。然后打个标签git commit -m "fix xxx function"
用git log
可以看到修改记录
用git show <哈希值>
可以看到,某一次修改的内容
再用vim test.c
加点东西,然后用git diff
查看区别
5.2 添加分支
分支(branch)允许你在不同的开发线上工作,避免干扰主项目的稳定版本,并为不同的功能、修复或实验提供独立的空间。
用git checkout -b dev
添加分支,用git branch -a
查看本地仓库有哪些分支。
用vim test.c
修改文件。用git add *
添加,用git commit -m
打标签。用git log
用git checkout main
回到主分支,用git log
查看日志,发现主分支的日志没被污染。
5.3 结束打标签
在软件发布时一般用git tag -a v1.0 -m "v1.0 version"
打标签。输入git tag -l
查看,输出显示:
6. Makefile
Makefile 是由 GNU Make 工具使用的文件,定义了项目的编译规则。它描述了如何从源代码生成可执行文件或其他目标文件,主要通过一系列的规则、依赖关系和命令来完成。
CMake 是一个跨平台的构建系统工具,比 Makefile 更高级,适合管理更复杂的项目。CMake 的主要作用是生成平台特定的构建文件(如 Makefile 或 Visual Studio 工程文件),简化跨平台构建流程。CMake 使用 CMakeLists.txt 文件来定义项目的构建规则。CMake 通过解析这个文件,根据目标平台生成相应的构建文件。
- Makefile:较为基础,适用于单一平台和相对简单的项目,依赖于开发者自己定义的规则和依赖关系。
- CMake:跨平台,适用于大型和复杂项目,自动处理依赖并生成平台特定的构建文件。
7. “裸机”和实时操作系统(RTOS)
在嵌入式系统开发中,"裸机"和"实时操作系统(RTOS)"是两种常见的编程模式。它们在资源管理、任务调度和系统复杂性等方面有显著的区别。
7.1 裸机编程
裸机编程(Bare Metal Programming)指的是直接在硬件上运行代码,不依赖任何操作系统。所有的系统资源、外设和任务调度由程序员手动管理。这种编程方式通常用于资源受限、系统简单且对实时性要求不高的嵌入式设备。
7.2 实时操作系统(RTOS)
实时操作系统(RTOS)是一类专门为实时应用设计的操作系统,能够提供确定性的任务调度,保证任务在严格的时间限制内完成。RTOS通过内核来管理任务调度、中断处理、资源共享等功能。
推荐链接
- ESP-IDF 编程指南 release-v4.4
- ESP-IDF 编程指南 版本 v5.3.1
- DesktopScreen 1 环境搭建
相关文章:

基于ESP32的桌面小屏幕实战[6]:环境搭建和软件基础
摘要 本文分为两部分:Linux开发环境搭建和软件基础。Linux开发环境搭建介绍了Ubuntu虚拟机安装及SSH、Samba配置,可以实现用VSCode操作虚拟机。为了后续工作,搭建了乐鑫ESP32 SDK环境。软件基础介绍了Linux开发常用的软件基础,包…...

接口(完)
大家好,今天我们着重来总结一下接口的知识,并且将接口和抽象类的区别罗列一下,帮助我们更好的认识抽象类和接口。 2.7 抽象类和接口的区别. 抽类和接口都是Java中多态的常见使用方式,都需要重点掌握,同时又要认清两者的区别(重要!!…...

数据结构——实验七·排序
欢迎各位大佬们来到Tubishu的博客🌟 Tubishu是一名计算机本科生,不定期发送一些在学校的成果供佬们消遣~希望能为佬的编程之路添砖加瓦⭐🔥 求各位大佬们垂怜🔥点赞评论一下呗🔥🔥 本文专栏 ➡️ 数据结构 …...
JVM堆空间
JVM(Java虚拟机)堆空间是Java内存管理的核心区域之一,用于存储Java对象实例。以下是关于JVM堆空间的详细介绍: 1. 堆空间的作用 • 存储对象实例:几乎所有的Java对象实例(通过new关键字创建的对象…...
【详细】SSH公私钥认证与渗透测试攻击场景
SSH(Secure Shell)是一个用于远程登录和执行命令的网络协议,其认证方式通常有两种:基于密码的认证和基于公私钥的认证。本文将详细介绍SSH公私钥认证机制,并探讨在渗透测试场景中,如何利用对靶机具有读取和…...

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)
1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架,它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架! 官方网址:https://ffmpeg.org/ FFmpeg 的主要特点和功能: 编解码器支持: FFmpe…...

C++异步future
🌎 C11异步futrue 文章目录: C11异步futrue future介绍 应用场景 future操作 std::async函数模版 std::packaged_task类模版 std::promise类模版 🚀future介绍 std::future是C11标准库…...
Oracle 12c 中的 CDB和PDB的启动和关闭
一、简介 Oracle 12c引入了多租户架构,允许一个容器数据库(Container Database, CDB)托管多个独立的可插拔数据库(Pluggable Database, PDB)。本文档旨在详细描述如何启动和关闭CDB及PDB。 二、容器数据库 (CDB) 2.1…...
Vue组件开发-使用 html2canvas 和 jspdf 库实现PDF文件导出 设置页面大小及方向
在 Vue 项目中实现导出 PDF 文件、调整文件页面大小和页面方向的功能,使用 html2canvas 将 HTML 内容转换为图片,再使用 jspdf 把图片添加到 PDF 文件中。以下是详细的实现步骤和代码示例: 步骤 1:安装依赖 首先,在项…...

chrome插件:网页图片高清下载
前置条件: 安装有chrome谷歌浏览器的电脑 使用步骤: 1.打开chrome扩展插件 2.点击管理扩展程序 3.加载已解压的扩展程序 4.选择对应文件夹 5.成功后会出现一个扩展小程序 6.点击对应小程序 7.输入需要访问的网址,点击扩展插件即可进行图片…...

汽车定速巡航
配备定速巡航功能的车型,一般在方向盘附近设有4~6个按键(可能共用键位)。 要设置定速巡航,不仅需要方向盘上的按键,还要油门配合。 设置的一般流程: 开关:类似步枪上的“保险”,按…...

CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)
CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据) 目录 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测(Matlab完整源码和数据)预测效果基本介绍 CNN-BiLSTM卷积双向长短期记忆神经网络时间序列预测一…...

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel
WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel 一、前言二、Grid 布局:万能的布局王者2.1 Grid 布局基础:构建网格世界2.2 子元素定位与跨行列:布局的精细操控2.3 自适应布局:灵活应变的秘诀 三、StackPanel…...

14-6-2C++STL的list
(一)list对象的带参数构造 1.list(elem);//构造函数将n个elem拷贝给本身 #include <iostream> #include <list> using namespace std; int main() { list<int> lst(3,7); list<int>::iterator it; for(itlst.begi…...

【AI论文】Sigma:对查询、键和值进行差分缩放,以实现高效语言模型
摘要:我们推出了Sigma,这是一个专为系统领域设计的高效大型语言模型,其独特之处在于采用了包括DiffQKV注意力机制在内的新型架构,并在我们精心收集的系统领域数据上进行了预训练。DiffQKV注意力机制通过根据查询(Q&…...

私域流量池构建与转化策略:以开源链动2+1模式AI智能名片S2B2C商城小程序为例
摘要:随着互联网技术的快速发展,流量已成为企业竞争的关键资源。私域流量池,作为提升用户转化率和增强用户粘性的有效手段,正逐渐受到企业的广泛关注。本文旨在深入探讨私域流量池构建的目的、优势及其在实际应用中的策略…...

vofa++使用方法
控件区可以添加控件用来啊多样显示 点击一个控件然后右键可以选择要添加显示的数据,点all表全部显示, 点auto可以自动布局 要用控件需要选择协议,不知道协议具体格式可以点击问号看看,并且最好用printf重定义来实现 比如我要实现F…...

LogicFlow 一款流程图编辑框架
LogicFlow是什么 LogicFlow是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码…...

HTML<kbd>标签
例子 在文档中将一些文本定义为键盘输入: <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…...

PyQt6医疗多模态大语言模型(MLLM)实用系统框架构建初探(上.文章部分)
一、引言 1.1 研究背景与意义 在数字化时代,医疗行业正经历着深刻的变革,智能化技术的应用为其带来了前所未有的发展机遇。随着医疗数据的指数级增长,传统的医疗诊断和治疗方式逐渐难以满足现代医疗的需求。据统计,全球医疗数据量预计每年以 48% 的速度增长,到 2025 年将…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...