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

Mac 使用脚本批量导入 Apple 歌曲

最近呢,买了一个 iPad,虽然家里笔记本台式都有,显示器都是 2个,比较方便看代码(边打游戏边追剧)。

但是在床上拿笔记本始终还是不方便,手机在家看还是小了点,自从有 iPad 之后,拿个大屏在家里用着确实舒服不少。

能追剧,能玩玩其他应用,那还得听听音乐不是,但是懂的都懂,苹果里导入文件是个麻烦事,更别说音乐播放。

所以这件事就得研究研究,因为在电脑上已经把音乐都按照文件夹整理好了。

在 Android 中很简单,adb 一推到 Music 目录中,更新一下就行。


但是 iOS 搜了一圈发现还真不好弄,基本都是要通过 Apple 这个音乐导入到资料库,接着再通过 iTunes(新版已经合并在 Finder 中) 进行同步。

我试了下音乐这个应用,确实是可以通过新建歌单后,把需要添加的音乐文件夹直接拖入到歌单中,这样一次就可以添加多首,这个虽然要操作一下,但是也还可以接受。

正当我发现这个方案可行的时候,我看了一眼歌单,发现只有部分歌,就有点纳闷为啥部分歌曲没有导入。

请添加图片描述

在网上一搜,发现原来不支持无损,就是 FLAC 格式的文件。

这不是尴尬了么,所以看来还需要一个操作把 FLAC 文件转为 mp3 格式再导入才可以。

如果选第三方的工具,比如格式工厂或者狸窝,文件夹太多的情况,都要自己动手就太折腾了,比如我这里有几十个文件夹。(别问为啥这么多,强迫症就是歌手区分,各种风格也要区分)

用过 shell 的朋友都知道,这种批量的工作最好就交给脚本来做,遍历文件夹批量转化所有文件就行。

批量转化音乐

当然这里还有一些其他的逻辑,比如歌曲中已经是 mp3 的格式了,那应该就直接复制,除了 mp3 还有 wav 格式,同理针对 lrc 歌词文件也应该是直接复制。

所以和 ChatGPT “对线”几轮后,终于得到了一个满意的脚本,就不卖关子了。(对线真的考验心态和血压,最好自己能懂部分,可以自己动手改一下 shell)

#!/bin/bash# 检查是否安装了 ffmpeg
if ! command -v ffmpeg &> /dev/null
thenecho "Error: ffmpeg 未安装。请先安装 ffmpeg。"exit 1
fi# 检查参数是否足够
if [ "$#" -ne 2 ]; thenecho "Usage: $0 <import_directory> <export_directory>"exit 1
fi# 输入和输出目录
import_dir="$1"
export_dir="$2"
error_log="$export_dir/error_log.txt"# 检查导入目录是否存在
if [ ! -d "$import_dir" ]; thenecho "Error: 导入目录 $import_dir 不存在。"exit 1
fi# 创建导出目录(如果不存在)
mkdir -p "$export_dir"# 清空错误日志文件
: > "$error_log"# 查找所有文件并计算文件总数
total_files=$(find "$import_dir" -type f | wc -l)
if [ "$total_files" -eq 0 ]; thenecho "Error: 未找到文件。"exit 1
fiecho "共找到 $total_files 个文件,开始处理..."# 初始化计数器
counter=1# 遍历所有歌手目录
for artist_dir in "$import_dir"/*; doif [ -d "$artist_dir" ]; then# 遍历每个歌手目录下的所有文件for song in "$artist_dir"/*; doif [ -f "$song" ]; then# 确定输出文件夹结构rel_path="${song#$import_dir/}"output_dir="$export_dir/$(dirname "$rel_path")"mkdir -p "$output_dir"# 获取文件扩展名ext="${song##*.}"# 处理不同文件类型if [ "$ext" = "flac" ]; then# 转换 FLAC 文件为 MP3,指定比特率 320k,并显式指定编码器output_file="$output_dir/$(basename "${song%.flac}.mp3")"echo "正在转换文件 ($counter/$total_files): $song -> $output_file"# 使用 libmp3lame 编码器,忽略非音频流,并增加 analyzeduration 和 probesizeffmpeg -analyzeduration 100M -probesize 50M -i "$song" -vn -c:a libmp3lame -b:a 320k "$output_file" > /dev/null 2> ffmpeg_errors.txtif [ $? -ne 0 ]; thenecho "Error: 转换 $song 失败。" | tee -a "$error_log"elseecho "转换成功: $output_file"fielif [ "$ext" = "lrc" ] || [ "$ext" = "mp3" ] || [ "$ext" = "wav" ]; then# 直接复制 LRC 和 MP3 文件echo "正在复制文件 ($counter/$total_files): $song -> $output_dir/"cp "$song" "$output_dir/"if [ $? -ne 0 ]; thenecho "Error: 复制 $song 失败。" | tee -a "$error_log"elseecho "复制成功: $song"fielseecho "跳过不支持的文件 ($counter/$total_files): $song"fi# 更新计数器counter=$((counter + 1))fidonefi
doneecho "所有文件已处理完成。"

总结几个点:

  1. 这里是通过 ffmpeg 进行转换,毕竟这个开源工具很强大,视频都能随便处理,音频处理不是手到擒来么。
  2. 加入了处理进度,会在控制台输出,这样我们比较好知道处理到哪了,大概还有多久的时间。
  3. 第三是加入了错误日志导出,这样知道哪些歌曲出错了,没有处理。

因为脚本上也有对应的注释,如果知道一点编程的朋友应该能知道怎么修改一下。但是呢,考虑到可能会有非程序员的朋友看到该文章,还是简单讲一下这里的操作的流程。


打开终端应用。

在这里插入图片描述

在里面输入下面的语句,这个是通过 brew 命令安装 ffmpeg 库。

brew install ffmpeg

当命令行自己运行一会,光标重新开始闪烁时一般就是安装完毕。可以通过查看下 ffmpeg 版本看下是否安装好了。

ffmpeg --version

在这里插入图片描述

这样就完成了第一步 ffmpeg 安装。接着我们通过命令要新建一个普通文件,命名为 cvt.sh ,意思就是 converte 缩写,当然可以换个任意你喜欢的名字。

touch cvt.sh

一般来说命令行首次打开会在自己的 home 目录下,那么新建也是在这里。

在这里插入图片描述

如果会用命令修改的话可以直接通过 vi 打开复制,不会的朋友找到这个文件,然后用文本编辑应用打开。把刚刚那一长串代码复制进去,就像这样,记得保存一下。(Command + s)

在这里插入图片描述

第二部脚本文件可以说准备好了,但这里还差一点,就是新建的脚本文件需要加上可执行的权限。

在命令行中输入,这样我们一会才能执行这个转化的脚本。

chmod 711 cvt.sh

万事具备,讲一讲这个用法。(输出的文件夹可以不用存在,会自动创建)

#这里需要把对应的文件夹名字换一下。
bash cvt.sh <输入的文件夹> <输出的文件夹>

这里还要说明一下,脚本扫描的路径层级是这样:

输入的文件夹 - 二级目录(一般是歌手或者歌曲风格) - 该目录下所有歌曲

如果二级目录这个位置是歌曲是不会处理的,因为这么设计是为了方便后续导入 Apple 歌单.

我这里示范一下,假如我的音乐 testMusic 和脚本在一个地方,都在 home 目录下。

bash cvt.sh testMusic outputMusic

在这里插入图片描述
在这里插入图片描述

这样就开始了,可以看到有复制的,有转换的,也有对应进度。

需要注意的是,因为这里把错误信息导出到文件了,所以当第一次跑脚本,中途取消了,重新跑会发现,命令行卡着不动,实际上可以在当前目录中看到有错误日志,这里提示问是否覆盖。

在这里插入图片描述

所以建议如果用这个脚本,就一次性跑完,或者需要重新跑的时候把目标文件夹清除一下。

当然更优秀的朋友应该知道根据自己需求改下脚本,比如文件是直接强行覆盖不用询问么,或者还是需要手动对比。当然每个人的想法不一样,这里就是抛砖引玉。

这样的话,音乐的转换就完成了。

如果只有几个歌单需要添加的朋友,那么手动拖一下到 音乐 中就可以解决问题了。


批量导入歌单

接着就是到歌曲导入为 Apple 的歌单了。

从我前面的强迫症发言来看,就知道我需要导入的歌单不少,那这么多都需要操作一遍岂不是很麻烦,所得想个招,比如有没有办法用脚本来做,所以懒惰才是人类的第一生产力。

问了下 gpt ,好消息-有方案,坏消息-是其他脚本。

Gpt 提到可以用 Mac 自带的脚本编辑器来做,虽然我不会它这个脚本的语法,但是我有 gpt 呀,它会≈我会。😎

把导入的诉求告诉了它,又是一顿 battle 。

算是最后拿出了一个脚本,你还别说,shell 都算语法奇怪的了,苹果这个更奇怪,不过 …… 反正能跑就是好代码不是。

照例加入进度打印,错误输出。

on run argv-- 确保传入的参数数量正确if (count of argv) is not 1 thenerror "请提供一个参数:音乐文件夹的根路径。"end if-- 获取传入路径set inputPath to item 1 of argv-- 检查是否为相对路径,若是则转换为绝对路径if inputPath does not start with "/" thenset currentDirectory to (POSIX path of (do shell script "pwd"))set rootFolderPathString to currentDirectory & "/" & inputPathelseset rootFolderPathString to inputPathend if-- 转换路径为 POSIX file 类型set rootFolderPath to POSIX file rootFolderPathString-- 设置日志文件路径set logFilePath to POSIX file (rootFolderPathString & "/import_log.txt")-- 强制启动音乐应用tell application "Music"launch -- 确保 Music 应用已启动end tell-- 获取根文件夹下的所有文件夹tell application "Finder"set musicFolders to every folder of folder rootFolderPathend tell-- 清空日志文件tryset logFile to open for access logFilePath with write permissionset eof of logFile to 0 -- 清空文件close access logFileon error-- 如果日志文件不存在,则创建它set logFile to open for access logFilePath with write permissionclose access logFileend try-- 总文件夹数量set totalFolders to count of musicFolders-- 遍历每个文件夹repeat with musicFolder in musicFoldersset playlistName to name of musicFolder -- 使用文件夹名作为播放列表名称set musicFolderPath to (musicFolder as alias)tell application "Music"-- 检查是否已经存在同名播放列表set playlistExists to falserepeat with aPlaylist in (get user playlists)if (name of aPlaylist) is equal to playlistName thenset playlistExists to trueset existingPlaylist to aPlaylistexit repeatend ifend repeat-- 如果不存在同名播放列表,则创建新的播放列表if playlistExists thenset targetPlaylist to existingPlaylistelseset targetPlaylist to make new user playlist with properties {name:playlistName}log "Created new playlist: " & playlistNameend if-- 获取该文件夹中的所有音乐文件tell application "Finder"set musicFiles to every file of musicFolderend tell-- 当前文件夹的已处理文件计数set processedFilesInFolder to 0 -- 初始化当前文件夹处理计数-- 将每个文件导入到音乐应用并添加到播放列表repeat with aFile in musicFilesset fileName to name of aFileset fileExtension to (name extension of aFile)log "Checking fileName " & fileName & " ;fileExtension: " & fileExtension-- 只处理 .mp3 和 .wav 文件if fileExtension is "mp3" or fileExtension is "wav" thentry-- 检查文件是否已经在播放列表中set songAlreadyInPlaylist to falselog "File name: " & (name of aFile) -- 查看文件名repeat with aTrack in (get tracks of targetPlaylist)if (name of aTrack) is equal to fileName thenset songAlreadyInPlaylist to truelog "Found existing song in playlist: " & fileNameexit repeatend ifend repeat-- 如果歌曲尚未在播放列表中,才导入if not songAlreadyInPlaylist thenlog "Importing song to playlist: " & fileName-- 确保 aFile 以 alias 形式导入set importedTrack to add (aFile as alias) to targetPlaylistlog "Successfully added: " & fileName--delay 1 -- 添加 1 秒的延迟elselog "Skipping already existing song: " & fileName--delay 1 -- 添加 1 秒的延迟end ifon error errorMsg-- 处理可能的错误,记录详细信息set logMessage to "Error importing file: " & fileName & return & errorMsgmy appendToLog(logMessage, logFilePath)end tryelse-- 记录不支持的文件到日志文件log "Skipping unsupported file: " & fileNameend if-- 增加当前文件夹的已处理文件数量set processedFilesInFolder to processedFilesInFolder + 1-- 打印当前进度my displayProgress(processedFilesInFolder, (count of musicFiles), playlistName)end repeatend tellend repeat-- 打印总的处理完成信息display dialog "所有歌曲已处理完成!" buttons {"OK"} default button 1
end run-- 函数:将消息附加到日志文件
on appendToLog(logMessage, logFilePath)set logFile to open for access logFilePath with write permissionwrite logMessage to logFile starting at eofclose access logFile
end appendToLog-- 函数:显示处理进度
on displayProgress(folderProcessed, totalInFolder, playlistName)set progressPercent to (folderProcessed / totalInFolder) * 100set formattedProgress to round progressPercent * 10 / 10.0 -- 保留一位小数-- 在终端输出进度log "Processing " & playlistName & ": " & (folderProcessed as string) & "/" & (totalInFolder as string) & " (" & (formattedProgress as string) & "%)"
end displayProgress

关于这个脚本的用法,简单讲一下,估计大部分朋友都没有接触过,毕竟不通用。

在这里插入图片描述

打开这个编辑器,把刚才的脚本拷贝上,然后保存为 脚本格式。

在这里插入图片描述

我这里文件名用的是 importMusic.scpt ,说一下用法。

osascript <脚本名称> <导入的文件夹>

和刚才一样,我的命令行在 home 目录下,新建的 importMusic.scpt 也挪到这个目录,处理后的音乐还在刚才的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
那我就可以这么用。

osascript importMusic.scpt outputMusic

接下来就是见证奇迹的时刻。

在这里插入图片描述

轻轻松松导入,真是省大心。

当然最后可以把这一段执行代码再组合在前面的 shell 文档中,不过分开一下也好,各个朋友有各自的需求,需求什么用什么。

脚本真是提升效率的利器。

在这里插入图片描述

后续计划录个视频把操作和代码上传一下,如果有看视频来的朋友用起来就比较方便了。

如果对你有帮助请点赞收藏支持一下,感谢 ~

相关文章:

Mac 使用脚本批量导入 Apple 歌曲

最近呢&#xff0c;买了一个 iPad&#xff0c;虽然家里笔记本台式都有&#xff0c;显示器都是 2个&#xff0c;比较方便看代码&#xff08;边打游戏边追剧&#xff09;。 但是在床上拿笔记本始终还是不方便&#xff0c;手机在家看还是小了点&#xff0c;自从有 iPad 之后&…...

全桥PFC电路及MATLAB仿真

一、PFC电路原理概述 PFC全称“Power Factor Correction”&#xff08;功率因数校正&#xff09;&#xff0c;PFC电路即能对功率因数进行校正&#xff0c;或者说是能提高功率因数的电路。是开关电源中很常见的电路。功率因数是用来描述电力系统中有功功率&#xff08;实际使用…...

【安当产品应用案例100集】025-确保数据安全传输——基于KMS与HSM的定期分发加密解决方案

引言&#xff1a; 在当今快速发展的数字化时代&#xff0c;企业面临着前所未有的信息安全挑战。尤其是在需要向供应商定期分发敏感数据的情况下&#xff0c;如何保证这些数据在传输过程中的安全性变得至关重要。为此&#xff0c;我们推出了结合安当KMS密钥管理平台与HSM密码机…...

十 缺陷检测解决策略之三:频域+空域

十 缺陷检测解决策略之三:频域空域 read_image (Image, 矩形) * 中间低频&#xff0c;四周高频 fft_image (Image, ImageFFT) * 中间低频&#xff0c;四周高频 fft_generic (Image, ImageFFT1, to_freq, -1, sqrt, dc_center, complex) * 中间高频&#xff0c;四周低频 rft_ge…...

有望第一次走出慢牛

A股已走完30多年历程。 大约每十年&#xff0c;会经历一轮牛熊周期。特点是每一轮周期&#xff0c;大约九成的时间都是熊市主导。就是我们常说的 快牛慢熊。 这一次&#xff0c;会不会重复历史? 历史不会简单重复。已经感受到了盘面的变化。 有人说&#xff0c;股市爆涨爆…...

计算机网络(十二) —— 高级IO

#1024程序员节 | 征文# 目录 一&#xff0c;预备 1.1 重新理解IO 1.2 五种IO模型 1.3 非阻塞IO 二&#xff0c;select 2.1 关于select 2.2 select接口参数解释 2.3 timeval结构体和fd_set类型 2.4 socket就绪条件 2.5 select基本工作流程 2.6 简单select的服务器代…...

电力行业 | 等保测评(网络安全等级保护)工作全解

电力行业为什么要做网络安全等级保护&#xff1f; 电力行业是关系到国家安全和社会稳定的基础性行业&#xff0c;电力行业信息化程度相对较高&#xff0c;是首批国家信息安全等级保护的重点行业。 01 国家法律法规的要求 1994《计算机信息系统安全保护条例》&#xff08;国务…...

总裁主题CeoMax-Pro主题7.6开心版

激活方式&#xff1a; 1.授权接口源码ceotheme-auth-api.zip搭建一个站点&#xff0c;绑定www.ceotheme.com域名&#xff0c;并配置任意一个域名的 SSL 证书。 2.在 hosts 中添加&#xff1a;127.0.0.1 www.ceotheme.com 3.上传class-wp-http.php到wp-includes目录&#xff…...

深入探讨编程的核心概念、学习路径、实际应用以及对未来的影响

在当今这个数字化时代&#xff0c;编程已成为连接现实与虚拟世界的桥梁&#xff0c;它不仅塑造了我们的生活方式&#xff0c;还推动了科技的飞速发展。从简单的网页制作到复杂的人工智能系统&#xff0c;编程无处不在&#xff0c;其重要性不言而喻。本文旨在深入探讨编程的核心…...

IDEA如何将一个分支的代码合并到另一个分支(当前分支)

前言 我们在使用IDEA开发Java应用时&#xff0c;经常是和git一起使用的。我们对于git常用的操作包括提交&#xff0c;推送&#xff0c;拉取代码等。还有一个重要的功能是合并代码。 那么&#xff0c;我们应该如何合并代码呢&#xff1f; 如何合并代码 首先&#xff0c;我们…...

Python实现基于WebSocket的stomp协议调试助手工具

stomp协议很简单&#xff0c;但是搜遍网络竟没找到一款合适的客户端工具。大多数提供的都是客户端库的使用。可能是太简单了吧&#xff01;可是即便这样&#xff0c;假如有一可视化的工具&#xff0c;将方便的对stomp协议进行抓包调试。网上类似MQTT的客户端工具有很多&#xf…...

基于neo4j的旅游知识图谱维护与问答系统

你还在为毕业设计发愁吗&#xff1f;试试这个基于Neo4j的旅游知识图谱维护与问答系统吧&#xff01;这套系统不仅功能强大&#xff0c;而且几乎涵盖了你需要的一切&#xff0c;完美助力你的毕业项目&#xff01; 系统介绍 该系统是专门针对旅游景点信息的知识图谱工具&#x…...

竞赛学习路线推荐(编程基础)

关于学习路线的推荐&#xff0c;总体上&#xff0c;分两步学习&#xff0c;第一步学习编程语言&#xff08;C、C、java&#xff09;&#xff0c;第二步是学习数据结构和算法 不少初学者会选择C语言或C作为首选&#xff0c;笔者这里也推荐C或C作为入门&#xff0c;需要注意的是&…...

webRTC搭建:STUN 和 TURN 服务器 链接google的有点慢,是不是可以自己搭建

如果使用 Google 提供的 STUN/TURN 服务器速度较慢&#xff0c;你完全可以自己搭建 STUN 和 TURN 服务器。这有助于提升网络连接速度和稳定性&#xff0c;特别是在需要穿透 NAT 或防火墙的网络环境下。 下面是如何自己搭建 STUN 和 TURN 服务器的具体步骤&#xff1a; 1. 选择…...

利用Pix4D和ArcGIS计算植被盖度

除了水文分析和沟道形态分析之外&#xff0c;在实际工作中还要计算植被盖度&#xff01; 植被盖度&#xff0c;也称为植被覆盖率或植物覆盖度&#xff0c;是指某一地表面积上植物冠层垂直投影面积占该地表面积的比例。它通常以百分比的形式表示&#xff0c;是描述地表植被状况的…...

用docker Desktop 下载使用thingsboard/tb-gateway

1、因为正常的docker pull thingsboard/tb-gateway 国内不行了&#xff0c;所以需要其它工具来下载 2、在win下用powershell管理员下运行 docker search thingsboard/tb-gateway 可以访问到了 docker pull thingsboard/tb-gateway就可以下载了 3、docker Desktop就可以看到…...

从视频中学习的SeeDo:VLM解释视频并生成规划、代码(含通过RGB视频模仿的人形机器人OKAMI、DexMV)

前言 在此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的1.1节开头有提到 机器人收集训练数据一般有多种方式&#xff0c;比如来自人类视频的视觉演示 有的工作致力于从视频数据——例如YouTube视频中进行策略学习 即最常见…...

项目集群部署定时任务重复执行......怎么解决???

项目集群部署在不同服务器&#xff0c;导致定时任务重复执行 1、可以在部署时只让一个服务器上有定时任务模块&#xff0c;不过这样如果这台服务器宕机&#xff0c;就会导致整个定时任务崩溃 2、使用分布式锁&#xff0c;使用redis setNX命令加lua脚本在定时任务执行的时候只…...

使用JUC包的AtomicXxxFieldUpdater实现更新的原子性

写在前面 本文一起来看下使用JUC包的AtomicXxxxFieldUpdater实现更新的原子性。代码位置如下&#xff1a; 当前有针对int&#xff0c;long&#xff0c;ref三种类型的支持。如果你需要其他类型的支持的话&#xff0c;也可以照葫芦画瓢。 1&#xff1a;例子 1.1&#xff1a;普…...

vue3组件通信--props

目录 1.父传子2.子传父 最近在做项目的过程中发现&#xff0c;props父子通信忘的差不多了。下面写个笔记复习一下。 1.父传子 父组件&#xff08;FatherComponent.vue&#xff09;&#xff1a; <script setup> import ChildComponent from "/components/ChildComp…...

leetcode-75-颜色分类

题解&#xff08;方案二&#xff09;&#xff1a; 1、初始化变量n0&#xff0c;代表数组nums中0的个数&#xff1b; 2、初始化变量n1&#xff0c;代表数组nums中0和1的个数&#xff1b; 3、遍历数组nums&#xff0c;首先将每个元素赋值为2&#xff0c;然后对该元素进行判断统…...

【嵌入式原理设计】实验三:带报警功能的数字电压表设计

目录 一、实验目的 二、实验环境 三、实验内容 四、实验记录及处理 五、实验小结 六、成果文件提取链接 一、实验目的 熟悉和掌握A/D转换及4位数码管、摇杆、蜂鸣器的联合工作方式 二、实验环境 Win10ESP32实验开发板 三、实验内容 1、用摇杆传感器改变接口电压&…...

C#中的接口的使用

定义接口 public interface IMyInterface {int MyProperty { get; set; }void MyMethod(); } 实现类 internal class MyClass : IMyInterface {public int MyProperty { get; set; }public void MyMethod(){Console.WriteLine("MyMethod is called");} } 目录结构…...

记一次真实项目的性能问题诊断、优化(阿里云redis分片带宽限制问题)过程

前段时间&#xff0c;接到某项目的压测需求。项目所有服务及中间件&#xff08;redis、kafka&#xff09;、pg库全部使用的阿里云。 压测工具&#xff1a;jmeter(分布式部署)&#xff0c;3组负载机&#xff08;每组1台主控、10台linux 负载机&#xff09; 问题现象&#xff1…...

LeetCode - 4. 寻找两个正序数组的中位数

. - 力扣&#xff08;LeetCode&#xff09; 题目 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 …...

算法设计与分析——动态规划

1.动态规划基础 1.1动态规划的基本思想 动态规划建立在最优原则的基础上&#xff0c;在每一步决策上列出可能的局部解&#xff0c;按某些条件舍弃不能得到最优解的局部解&#xff0c;通过逐层筛选减少计算量。每一步都经过筛选&#xff0c;以每一步的最优性来保证全局的最优性…...

【实战篇】GEO是什么?还可以定义新的数据类型吗?

背景 之前&#xff0c;我们学习了 Redis 的 5 大基本数据类型&#xff1a;String、List、Hash、Set 和 Sorted Set&#xff0c;它们可以满足大多数的数据存储需求&#xff0c;但是在面对海量数据统计时&#xff0c;它们的内存开销很大&#xff0c;而且对于一些特殊的场景&…...

SpringBoot最佳实践之 - 项目中统一记录正常和异常日志

1. 前言 此篇博客是本人在实际项目开发工作中的一些总结和感悟。是在特定需求背景下&#xff0c;针对项目中统一记录日志(包括正常和错误日志)需求的实现方式之一&#xff0c;并不是普适的记录日志的解决方案。所以阅读本篇博客的朋友&#xff0c;可以参考此篇博客中记录日志的…...

【Flutter】状态管理:高级状态管理 (Riverpod, BLoC)

当项目变得更加复杂时&#xff0c;简单的状态管理方式&#xff08;如 setState() 或 Provider&#xff09;可能不足以有效地处理应用中状态的变化和业务逻辑的管理。在这种情况下&#xff0c;高级状态管理框架&#xff0c;如 Riverpod 和 BLoC&#xff0c;可以提供更强大的工具…...

OAK相机的RGB-D彩色相机去畸变做对齐

▌低畸变标准镜头的OAK相机RGB-D对齐的方法 OAK相机内置的RGB-D管道会自动将深度图和RGB图对齐。其思想是将深度图像中的每个像素与彩色图像中对应的相应像素对齐。产生的RGB-D图像可以用于OAK内置的图像识别模型将识别到的2D物体自动映射到三维空间中去&#xff0c;或者产生的…...

建网站 北京/产品推广网站

今天我们讲讲利用sessionStorage来做数据字典的存储&#xff0c;不需要每个页面都要请求接口&#xff0c;获取字典值。老规矩先来了解一下什么是sessionStorage&#xff1f;sessionStorage用于本地存储一个会话(session)当中的数据&#xff0c;这些数据只有在同一个会话当中的页…...

门户网站建设周期/汕头网站建设方案维护

等待中的任务编辑 有一些任务只能由主节点去处理&#xff0c;比如创建一个新的 索引或者在集群中移动分片。由于一个集群中只能有一个主节点&#xff0c;所以只有这一节点可以处理集群级别的元数据变动。在 99.9999% 的时间里&#xff0c;这不会有什么问题。元数据变动的队列基…...

北京建设工程网站/长沙关键词优化首选

鼠标连点器是一款非常便捷的工具&#xff0c;可以帮助我们自动进行鼠标点击操作。这种工具尤其适用于一些需要反复点击同一个位置的软件或游戏&#xff0c;在这些情况下手动点击会非常费时费力&#xff0c;而鼠标连点器就能够为我们节省很多宝贵的时间。但是&#xff0c;对于没…...

百色高端网站建设/优化大师的三大功能

目录知识点总结&#xff1a; Note&#xff1a; 1.创建一个/server/scripts目录,用于存放脚本&#xff08;命令&#xff1a;mkdir -p /server/scripts&#xff09; 2.安装软件时&#xff0c;安装路径统一为/usr/local/软件名-版本号 3.安装完软件后&#xff0c;需做软链接&#…...

4核8g云服务器/专业排名优化工具

仅作为操作记录&#xff0c;大佬请跳过。 plt.subplot(2,2,1);plt.plot(sig) plt.subplot(2,2,2);plt.plot(sigrand) plt.subplot(2,1,2);plt.plot(sigrandsig)传送门...

有没有代做ppt的网站/竞价推广开户

1 update api: people/person/2/_update {"doc": {"Lastname": "海峡2"} } 2 script: 这时候当API不能满足要求时&#xff0c;Elasticsearch允许你使用脚本实现自己的逻辑。脚本支持非常多的API&#xff0c;例如搜索、排序、聚合和文档更新。脚本…...