Category: 技术折腾

服务器、网络、硬件与自建工具的实践记录。

  • 如何实现在当前会话断开后程序的暂停和后台继续运行

    如何实现在当前会话断开后程序的暂停和后台继续运行

    在快节奏的现代生活中,我们经常需要在SSH会话中运行程序,但如果会话断开了,程序也会随之中断,这让人颇为苦恼。曾经有一位名叫BellaCampen的用户在社交媒体上提出了这个问题,引发了大家的讨论。今天,我们将为你解答这个问题,让你的程序能够在当前会话断开后暂停或者后台继续运行,让你的工作更加高效。

    解决方案

    1. 使用nohup

    Nohup是一个强大的工具,可以让你的程序在会话断开后继续运行。你只需要在命令前加上nohup,就可以实现这个效果。比如:

    nohup your_command &

    这样,你的程序将会在后台继续运行,而且不受SSH会话的影响。这是一个简单而有效的方法。

    2. 使用tmux

    Tmux是另一个强大的工具,可以帮助你管理会话并让程序在断开后继续运行。你可以使用以下步骤:

    1. 安装tmux(如果未安装):在终端中运行 sudo apt-get install tmux 或者 sudo yum install tmux,具体命令根据你的Linux发行版而定。

    2. 启动tmux会话:运行 tmux 命令,这会创建一个新的tmux会话。

    3. 在tmux会话中运行你的程序。

    4. 断开SSH会话:即使你断开了SSH连接,tmux会话和你的程序仍然在后台运行。

    5. 重新连接:当你再次连接到服务器时,可以使用 tmux attach 命令重新附加到之前的tmux会话,继续查看和操作你的程序。

    3. 使用screen

    Screen是类似于tmux的工具,也可以实现在会话断开后继续运行程序的效果。你可以按照以下步骤使用screen:

    1. 启动一个新的screen会话:运行 screen 命令。

    2. 在screen会话中运行你的程序。

    3. 断开SSH会话:就像tmux一样,即使你断开了SSH连接,screen会话和程序仍然在后台运行。

    4. 重新连接:当你再次连接到服务器时,可以使用 screen -r 命令重新连接到之前的screen会话,继续操作你的程序。

    结语

    通过使用nohup、tmux或者screen,你可以轻松实现在当前会话断开后程序的暂停和后台继续运行。这些工具提供了灵活性和效率,让你的工作更加顺畅。不再担心会话断开导致程序中断,让你可以更专注地完成任务。

    如果你是一个经常需要在SSH会话中工作的人,不妨尝试这些方法,提高你的工作效率吧!

  • 修复GitLab-CE数据库丢失的全过程

    修复GitLab-CE数据库丢失的全过程

    在2023年4月24日,我收到了GitLab的升级通知,于是开始了升级操作,然而,这次例行升级引发了一个严重的问题,导致GitLab数据库丢失。这篇文章将记录我是如何修复GitLab的,同时也会提及一些我在这个过程中犯下的错误。虽然中途有一些操作没有及时记录截图,但我会尽量用备份的一些场景来还原过程。

    基本情况

    • 当前版本:GitLab-CE 15.9.5
    • 升级版本:GitLab-CE 15.11.0
    • 操作系统:Linux Debian 10
    • 硬件配置:2核8GB内存50GB硬盘
    • 500+仓库和13个GitLab Runner用于执行任务

    问题出现

    一切都开始于一次升级操作,我执行了升级命令,但不幸的是,一旦升级完成,问题就接踵而至。这是我犯下的第一个错误,没有在升级前对虚拟机进行快照备份,而是直接升级了内部应用。以前的升级都没有问题,因此我没有太多的警觉性。此外,由于我使用Docker部署GitLab已经有5年之久,每次更新都是按照相同的步骤进行,所以我没有过多地考虑到备份的必要性。以下是我执行的命令:

    docker rm -f docker && docker pull gitlab/gitlab-ce:latest && docker run -it --log-opt max-size=10m --log-opt max-file=3 -p 443:443 --name gitlab --restart always -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

    第一次报错

    然而,升级命令执行后,我遇到了第一个错误,错误信息如下:

    SELECT COUNT(*) FROM container_repositories WHERE migration_state = 'import_skipped'
    ERROR:  column "migration_state" does not exist at character 51

    错误信息明确指出了解决方法,它建议我添加一个参数 -e GITLAB_SKIP_UNMIGRATED_DATA_CHECK=true 来重新启动实例,以绕过升级检查。于是我添加了这个参数,重新启动了GitLab实例。

    第二次报错

    然而,第二次启动后,又出现了问题,错误信息如下:

    Starting the database
    Error starting the database. Please fix the error before continuing
    Expected process to exit with [0], but received '1'

    这次的错误是关于数据库启动的问题,GitLab试图升级PostgreSQL版本,但出现了问题。它提供了另一个解决方案,要求我添加 -e GITLAB_SKIP_PG_UPGRADE=true 参数来跳过数据库升级。于是我使用了GitLab之前的版本 gitlab/gitlab-ce:15.9.5-ce.0 来重新启动。

    第三次报错

    第三次启动后,我遇到了文件权限的问题,错误信息如下:

    failed to read meta.json for a block during repair process; skipping" dir=/var/opt/gitlab/prometheus/data/01GYSNK1JKD2X5125MP0ZRPKFH err="open /var/opt/gitlab/prometheus/data/01GYSNK1JKD2X5125MP0ZRPKFH/meta.json: permission denied"

    通过分析日志,我发现只是一个权限问题,于是我毫不犹豫地将相关目录的权限设置为777:

    chmod -R 777 /root/gitlab/config
    chmod -R 777 /root/gitlab/logs
    chmod -R 777 /root/gitlab/data

    然后进行了第三次重启。

    第四次报错

    第四次启动后,我遇到了与邮件

    通知相关的错误,错误信息如下:

    Could not determine email for job (please check DB for incomplete objects)

    这个错误并没有提供直接的解决方案,但它暗示了可能存在数据库问题。在这一点上,我开始感到紧张,因为我没有数据库备份。但我决定尝试一个解决方案,我执行了以下命令:

    sudo gitlab-rake gitlab:db:bootstrap

    这个命令似乎修复了一些数据库问题,然后我进行了第四次重启。

    第五次报错

    第五次启动后,终于没有再次报错,GitLab看起来正常运行了。我尝试登录,并确保所有存储库和项目都存在。但是,当我尝试访问一个项目时,我遇到了一个新的问题,即无法获取存储库的内容,错误信息如下:

    The repository could not be found.

    这个问题让我感到非常焦虑,因为我拥有的存储库非常重要。我开始寻找解决方法,但在这个过程中,我再次犯了一个错误,没有停止GitLab容器,而是继续尝试解决问题。这导致了我在一次数据恢复尝试中误删除了存储库数据。

    数据恢复

    在数据丢失之后,我感到非常沮丧,但我没有放弃。我开始尝试从GitLab备份文件中恢复数据。幸运的是,我之前有一个定期备份GitLab数据的任务,这些备份文件位于 /root/gitlab/backups 目录下。我决定尝试从这些备份中恢复数据。

    恢复备份

    首先,我列出了可用的备份文件,使用以下命令:

    ls /root/gitlab/backups

    然后,我选择了最近的一个备份文件,执行了以下命令来恢复数据:

    docker exec -t gitlab gitlab-backup restore BACKUP=xxx

    在这里,xxx 是我选择的备份文件名。恢复过程可能需要一些时间,因为它涉及到将数据从备份文件还原到数据库中。

    恢复存储库

    一旦数据恢复完成,我还需要恢复存储库的数据。由于我之前误删了存储库数据,我只能尝试从GitLab Runner的备份中恢复存储库。这是我犯下的又一个错误,因为我应该在执行任何操作之前停止GitLab容器以防止进一步的数据丢失。

    我列出了GitLab Runner的备份文件,使用以下命令:

    ls /root/gitlab/data/gitlab-runner/data

    然后,我选择了最近的一个备份文件,执行了以下命令来恢复数据:

    docker run --rm -v /root/gitlab/data/gitlab-runner/data:/data ubuntu cp -R /backup /data

    这将备份文件从Runner容器复制到了宿主机的Runner数据目录中。

    修复存储库

    然而,这还不够,因为存储库数据仍然无法访问。我需要执行以下命令来修复存储库数据:

    docker exec -t gitlab gitlab-rake gitlab:storage:rollback ORIG_STORAGE=/var/opt/gitlab/git-data/backups/

    这个命令将存储库数据从备份中还原到正确的位置。

    结论

    经过多次尝试和一些错误,我终于成功地修复了GitLab数据库丢失的问题,并且成功恢复了存储库数据。这次经历教训深刻,我意识到了数据备份的重要性,以及在遇到问题时要及时停止容器以防止进一步的损失。同时,我也学到了如何从GitLab备份中恢复数据,以及如何修复存储库数据。希望这篇文章对其他遇到类似问题的人有所帮助。

    下一步计划

    在修复了GitLab的问题后,我计划进一步改进我的GitLab部署策略,确保数据的安全性和可恢复性。我还会继续学习并提升自己的技术能力,以更好地应对类似问题。同时,我也会分享这次经历和教训,希望能够帮助其他人避免类似的困境。

  • 如何避免Qt和qt-creator的坑:商用闭源软件开发指南

    如何避免Qt和qt-creator的坑:商用闭源软件开发指南

    大家好,我是王大神,今天我将和大家分享一个关于Qt和qt-creator的故事。这个故事将引出我们为什么要写这篇文章,以及如何在开发商用闭源软件时避免一些潜在的法律坑。废话不多说,让我们开始吧!

    引子:梦想与挑战

    很多年前,有一位名叫小李的年轻开发者,他有一个伟大的梦想——创建一款革命性的软件,可以自动化生成代码和配置代码,从而大幅提高开发效率。他对Qt的强大功能和跨平台特性感到着迷,于是决定基于Qt来实现他的梦想。

    小李的梦想是美好的,但他并不知道在商用闭源软件开发的道路上,隐藏着一些坑。让我们一起跟随小李的脚步,了解这些坑以及如何避免它们。

    第一章:Qt和qt-creator的开源协议

    小李开始了他的开发之旅,但很快他就发现了一个重要的事实——Qt采用了GNU通用公共许可证(GPL)协议,而qt-creator使用GNU较宽通用公共许可证(LGPL)。这两个协议都要求开发者在分发软件时开源源代码。

    小李陷入了思考中:难道他的商用软件也需要开源吗?这将是他的梦想破灭的开始吗?

    第二章:商用闭源的挑战

    小李并不是唯一一个面对这一问题的开发者。有人曾尝试使用动态连接来规避开源要求,但结果并不总是顺利。有报道称,Qt公司可能会向依赖Qt的商业应用程序发出律师函,要求它们遵守开源协议。这让小李更加焦虑,他不知道该如何继续前行。

    第三章:选择其他开发工具?

    在面对Qt和qt-creator的开源协议时,小李开始考虑是否应该寻找其他开发工具。他听说了Electron和Flutter等工具,它们在商用闭源方面可能更加灵活。但小李也明白,选择开发工具取决于项目的需求和开发者的偏好。

    第四章:智慧的选择

    最后,小李做出了智慧的选择。他明白了Qt和qt-creator的开源协议要求,在商用软件中开源源代码是法律底线。虽然有人可能尝试使用动态连接来规避,但Qt公司积极维护协议,可能会采取法律行动。

    因此,小李决定购买Qt的企业版授权,以确保他的项目合法并受到支持。他明白,作为开发者,时刻关注开源协议的要求是非常重要的,这将有助于保护自己和自己的项目。

    结语:智慧之路

    在软件开发的道路上,我们都会面临各种挑战和坑。了解开源协议的要求,明智地选择开发工具,购买合适的授权,这些都是帮助我们避免坑的关键步骤。不管你是像小李一样有梦想的年轻开发者,还是经验丰富的老手,这些建议都将对你有所帮助。

    希望这篇文章能够为你提供有价值的信息,并帮助你在商用闭源软件开发中走得更远。如果你有任何其他问题或需要更多信息,请随时向我提问。

  • 实现情侣在线同步观影的绝佳方案

    实现情侣在线同步观影的绝佳方案

    异地恋或者在不同地方的情侣常常会面临一个共同的问题:如何在线同步观看电影,以分享电影时刻和增进感情?在这篇文章中,我们将探讨一些可行的解决方案,帮助情侣们享受电影的乐趣,而不必担心播放不同步或质量下降的问题。

    问题的背景

    让我们首先了解一下问题的背景。许多情侣在不同的地方,或者由于各种原因无法亲自相聚,但他们仍然希望能够一起观看电影,分享这种特殊的时刻。然而,现有的视频会议软件并不总是满足他们的需求。录屏和录音的质量可能会受到限制,导致观影体验下降。因此,他们寻求一种更好的解决方案,使观看电影成为愉快的体验。

    解决方案一:使用媒体服务器

    一个解决方案是使用媒体服务器来共享电影。有一些免费和开源的媒体服务器软件,如Jellyfin和Plex,可以让你轻松地建立自己的媒体库。这些软件支持同步播放,允许你和你的伴侣同时观看相同的电影,而不必担心播放不同步的问题。你可以上传自己喜欢的电影,并与伴侣共享。

    解决方案二:使用专业的工具

    如果你希望更专业一点的解决方案,可以考虑使用专门设计的工具,如VideoTogether或Parsec。这些工具专为多人在线观影而设计,提供了高质量的视频流和低延迟的同步播放。它们通常需要适度的付费,但可以为你提供极好的观影体验。

    解决方案三:利用现有的技术

    一些用户提到了利用现有的技术,如Apple的SharePlay功能和FaceTime。这些功能允许你和你的伴侣同时观看电影,而不必依赖第三方工具。然而,这些功能通常仅适用于苹果设备,如果你和你的伴侣都使用macOS和其他苹果设备,这可能是一个不错的选择。

    解决方案四:自建直播间

    如果你想要更多的控制权,你可以考虑自建一个直播间,用来播放你想看的电影。这可以通过各种方式实现,包括使用OBS进行推流,或者使用腾讯的云直播服务。这种方法可以提供高质量的视频和音频流,但可能需要一些技术知识和付费。

    解决方案五:自定义的解决方案

    最后,如果你有一些编程或技术方面的知识,你还可以考虑创建自定义的解决方案。例如,你可以编写一个能够远程同步触发的程序,以控制播放和暂停电影。这个方法需要一些额外的工作,但可以为你提供最大的自由度。

    结论

    无论你选择哪种解决方案,都要根据你和你的伴侣的需求和技术水平来做出决定。每个解决方案都有其优点和局限性,所以请根据你的情况选择最

    适合你的方法。重要的是,能够共享电影时刻,增进感情,无论你们身在何处。

    在未来,我们也期待看到更多的技术创新,以满足情侣们在不同地点共享电影时刻的需求。

  • 构建自己的NAS家庭服务器:省钱、省心、省心事

    构建自己的NAS家庭服务器:省钱、省心、省心事

    在这个数字化时代,我们积累了大量的数据和服务需求。无论是照片、视频还是文档,数据的存储和访问对于每个人都至关重要。然而,云存储和订阅服务的费用逐渐攀升,使人们陷入了昂贵的存储解决方案和复杂的订阅费用之中。如果你正寻求一种方法来摆脱这一困境,那么自己构建一个便宜的DIY NAS家庭服务器可能是一个更好的选择。

    DIY NAS与购买现成产品的对比

    在决定是否走DIY NAS的路线之前,值得考虑一下你对设备的需求。QNAP或Synology等品牌的NAS产品提供了更为简单、不费时的选择。它们提供了预安装的操作系统和全面的软件套件,可以处理云文档、备份等各种任务。此外,它们支持Docker容器、硬件RAID,并且可以扩展到许多NVMe和SATA端口,满足高级用途。但请准备好支付高昂的价格以换取即插即用的便捷性。

    相比之下,DIY NAS涉及的步骤更多,不仅包括选择硬件,还包括设置软件。但优势也是显而易见的:DIY路线为你的预算提供更多的性能,具有更大的硬件和升级灵活性,而且你可以通过重新利用旧笔记本电脑、PC或树莓派来节省大量费用。我多年来一直在我的树莓派4上运行家庭服务器,直到最近才升级。

    选择适合建造廉价NAS的硬件

    要从零开始构建NAS有两种主要方法:一种是使用类似PC的专用外壳,另一种是使用带有直接附加存储(DAS)的迷你PC。前者是重新利用旧CPU的绝佳方式,可以提供大量的NVMe和SATA端口,以实现最佳性能和存储。然而,选择主板、内存、电源和机箱等部件相对复杂,如果没有零件在手,成本可能会迅速超过预制NAS的价格。

    如果你从零开始并且不需要特别复杂的配置,我建议选择迷你PC和DAS路线。它们价格便宜,设置简单,而且在需要额外处理能力或可扩展存储时仍然非常容易升级。唯一的缺点是与较大的主板相比,NVMe/SATA硬盘连接数有限。要获得外部存储的良好性能,你需要一个USB 3.0(5Gbps)端口或更高版本,但即使这样,如果打算在同一DAS中在多个SSD之间传输大量数据,这也可能成为瓶颈。你可以通过使用10Gbps USB 3.1 Gen 2端口、电缆和DAS来解决这个问题,但这些更昂贵。但对于存储照片、音乐和文件来说,5Gbps的USB速度已经足够了,特别是与旋转硬盘一起使用时。

    选择适用于DIY NAS的CPU/迷你PC

    选择合适的CPU/迷你PC是关键决策。由于NAS始终处于开启状态,低待机功耗是一个很大的优点,但这需要与提供的最大性能进行权衡。基本的NAS用例,如文件共享,需要非常少的功率,但如果你想进行AI图像识别或HDR视频转码,需求会迅速增加。

    例如,1W的基于Arm架构的Raspberry Pi 3可以用于Plex媒体服务器,但只支持直接播放。而4W的树莓派4型号勉强可以运行低比特率的1080p x265软件转码。但要实现4K转码,通常需要Intel Core i5或i7处理器,伴随着大约60W的系统空闲功耗。幸运的是,现代移动芯片上的Intel Quick Sync或类似的硬件转码效果相当不错,可以大幅降低功耗。我编制了一个大致的硬件指南,以满足特定用例的需求,但不可能涵盖每一种硬件。

    芯片组 TDP范围 用例
    极低功耗 Raspberry Pi 3 1-3W 文件共享和备份、媒体服务器(仅直接播放)、基本的Minecraft服务器
    低功耗 Raspberry Pi 4B、Intel J、AMD Ryzen嵌入式(无GPU) 5-20W 文件共享和备份、媒体服务器、低用户数1080p视频转码、基本的图片机器学习、低玩家数量的Minecraft服务器、家庭助手
    平衡功耗 Intel N、AMD Ryzen嵌入式(带GPU) 10-30W 文件共享和备份、媒体服务器、多用户4K视频转码、图片机

    器学习、Minecraft服务器、家庭助手
    高级 | Intel Core i3、i5、i7、AMD Ryzen 3、5、7 | 45-200W | 文件共享和备份、媒体服务器、高质量多用户视频转码、图片机器学习、Minecraft服务器、家庭助手

    在我的最新构建中,我选择了一台新的搭载Intel N100处理器的Trigkey G5迷你PC(来自亚马逊,售价200美元),配备了过剩的16GB LPDDR5内存、双2.5Gbps LAN以及一块性价比较高的500GB NMVe操作系统固态硬盘。这款迷你PC在空闲状态下的功耗仅略低于6W(几乎与树莓派4相当),但却配备了四个3.4GHz的Alder Lake E核心和硬件转码功能。在峰值时可以达到30W的功耗,足以处理广泛的应用程序和我测试过的四个4K HDR HVEC到1080p的转码流。这远远超过了中端NAS市场上充斥着的Intel Celeron J和AMD Ryzen V1000芯片所提供的性能。

    5W和60W待机功耗之间的差距可能会带来每年100美元的差异。

    搭配一台4盘位的Terramaster DAS(来自亚马逊,售价170美元),可以获得高达80TB的存储容量,这个配置比高端的Synology DS923+(售价600美元)还要强大,成本不到其三分之二。尽管没有硬件RAID支持(我不需要),但你可以为你的DAS添加这个功能,成本相对较低。

    这只是高端DIY选项的一个例子。你可以选择一台搭载Intel N5095、8GB内存的迷你PC(来自亚马逊,售价149美元)和一个双盘位外壳(来自亚马逊,售价80美元),价格大致与入门级的Synology DS223相当。但同样,这款芯片的性能显著更强,足以处理数个4K转码流,并从庞大的库中创建图片缩略图。廉价DIY NAS配置的另一个好处是,迷你PC可以自带一个2.5英寸硬盘或两个,如果这正是你所需要的,你可以廉价地将一个2.5英寸硬盘连接到USB硬盘上,或者选择适合你的存储需求并根据需要进行升级的多种两盘、四盘甚至更多盘位的DAS选项。

    安装DIY NAS软件的技巧

    到目前为止,一切都很容易,但安装软件是为了省钱而进行的努力所需要付出的时间。虽然我不能在这里涵盖所有可能的配置选项,但我可以提供一些初学者友好的简短提示,帮助你入门。

    为你的NAS选择操作系统

    尽管坚持使用熟悉的操作系统如Windows可能很诱人,但NAS更适合没有显示器的操作系统,比如众多的Linux发行版之一。此外,我们还可以享受到Docker的好处。然而,对于未经培训的人来说,安装和使用Linux命令行可能会感到困难。幸运的是,OpenMediaVault提供了可启动的ISO媒体,使安装过程非常简单,所以我不需要在这里重复步骤。只需将一个USB驱动器刻录成可启动盘,在你的PC上引导它,然后按照步骤在全新硬盘上安装OMV即可。TrueNAS Scale也是一个不错的选择,因为它提供了可启动的ISO媒体,但本文重点介绍了OMV。

    但值得注意的是,我的最新设置无法检测到我的迷你PC的LAN硬件,在使用新硬件时可能会出现问题。因此,我安装了最新版本的Debian(包括最新的Linux内核),并确保在安装过程中启用了SSH,以便我可以在启动时访问命令行。如果需要命令行访问,你需要找到你的NAS本地IP地址,并使用像Putty这样的服务进行隧道连接。

    然后,我使用了这个非常有帮助的脚本来在其上安装OMV——这与在树莓派上安装OMV的过程相同。一旦安装完成,你需要从路由器的设置中找到NAS/PC的本地IP地址(例如192.168.1.10),然后通过Web浏览器登录到OMV。就是这样,你将不再需要触及命令行。

    添加应用程序和服务

    OMV默认提供了管理硬盘驱动器、设置网络文件共享、同步备份和监视系统所需的一切。但我们还需要安装一些应用程序来更充分地利用我们的设置。这就是Docker派上用场的地方。首先,你需要在System > omv_extras > Docker-repo下启用Docker,然后在System > Plugins中安装Compose插件(如果尚未安装omv_extras,你也可以在这里找到它)。

    现在,你应该能够看到Service > Compose菜单。进入Files开始添加应用程序。OMV提供了

    一些示例,你可以添加它们,其中包括Deluge、Plex、Pihole、Syncthing等流行的应用程序。但在保存和启动服务之前,我们需要了解一些关于docker-compose文件的基础知识,特别是volumes参数。

    Docker可能令人生畏,但一旦你掌握了它,就能够访问广阔的自托管软件世界。选择太多,因此我列出了一个非穷尽的列表,以便你入门。

    媒体服务器

    • Jellyfin — 开源媒体服务器,支持良好的客户端。
    • Plex — 闭源媒体服务器,支持广泛的客户端。
    • Navidrome — 开源音乐服务器。

    图片查看器

    • Photoprism — 具有机器学习功能的照片库。
    • Lychee — 开源画廊管理工具。
    • Immich — 早期开发的Google照片替代方案。

    办公/文件

    • Nextcloud — 开源的自托管云存储。
    • Owncloud — 半开源的自托管云存储。

    有用的工具

    • Home Assistant — 在一个地方管理你的智能家居设备。
    • Nginx反向代理管理器 — 通过你自己的子域名将服务暴露在网上。
    • Pihole — 通过将流量路由通过你的服务器来阻止广告。

    从简单的备份到自托管的替代品,以替代昂贵的云服务,构建一个廉价的DIY NAS可以割断与日俱增的昂贵云服务的联系。现成的NAS硬件是入门的好方法,尤其是如果你时间有限。但希望这篇指南能够说服你,自己构建PC或Mini-PC/DAS设置是掌控自己设置的好方法。而且成本要低得多,硬件要多得多,比Synology或QNAP多得多。

    如果你对自己的DIY NAS有更多的需求和野心,那么自己动手搭建一个NAS可能是个不错的选择。不仅可以根据自己的需求定制硬件,还可以掌控整个系统,提供更多的性能和灵活性。当然,这需要更多的时间和精力,但最终的结果可能会更加令人满意。

    最后,不要忘记备份你的数据,因为DIY NAS虽然强大,但也有风险。无论你选择哪种方式,都要确保你的数据安全,这样你就可以享受到自己构建的NAS带来的自由和性能优势。

  • 如何快速检索上亿数据

    如何快速检索上亿数据

    在现代信息时代,我们每天都生成和处理着海量的数据。无论是互联网公司、金融机构还是科学研究,都需要处理大规模的数据集。在这个背景下,如何快速、高效地检索上亿条数据成了一个重要的问题。假设你正在开发一个应用程序,需要根据一个或两个字段进行模糊查询,那么应该选择什么样的中间件或搜索方法呢?本文将为你提供一些解决方案和建议。

    1. Elasticsearch

    Elasticsearch是一个强大的全文搜索引擎,广泛用于处理大规模数据集的检索和分析。它具有出色的性能和可伸缩性,特别适用于全文搜索和模糊查询。Elasticsearch可以轻松地处理上亿条数据,并提供高效的检索功能。它还支持分布式部署,可以根据需求扩展集群规模,确保性能和可用性。

    2. ClickHouse

    ClickHouse是一个用于分析和查询大数据集的列式数据库管理系统。它在处理大规模数据时表现出色,特别适用于快速的聚合和分析操作。如果你的搜索结果通常是返回少量数据,ClickHouse可以在毫秒级别内提供响应,确保出色的用户体验。

    3. MeiliSearch

    MeiliSearch是一个开源的全文搜索引擎,专注于提供简单而快速的搜索解决方案。它可以轻松应对上亿条数据的模糊查询,并具有高度可配置性。MeiliSearch支持多种编程语言,因此可以与PHP、Java等常见的编程语言轻松集成。

    4. Manticore Search

    Manticore Search是一个开源的全文搜索引擎,具有强大的文本检索和分析功能。它支持多种查询类型,包括全文搜索、模糊查询和范围查询。Manticore Search可以处理大规模数据集,并提供出色的性能。

    5. N-gram索引

    如果你使用Elasticsearch或其他搜索引擎的模糊查询功能,但性能不如预期,可以考虑使用N-gram索引。N-gram索引将文本分成连续的N个字符,并将它们存储在索引中。这种方法可以提高模糊查询的性能,尤其是在处理大规模数据时。

    6. 硬件优化

    无论你选择哪种搜索方法,硬件优化都是至关重要的。确保你的服务器具有足够的内存、处理器和存储容量,以应对大规模数据的检索需求。此外,使用SSD硬盘可以提高数据访问速度,进一步提升性能。

    总结

    在处理上亿条数据的模糊查询时,选择合适的搜索方法和中间件至关重要。Elasticsearch、ClickHouse、MeiliSearch和Manticore Search都是强大的工具,可以根据你的具体需求选择合适的解决方案。此外,使用N-gram索引和硬件优化可以进一步提高性能,确保你的应用程序能够高效地处理大规模数据。

  • 如何选择Python中的本地键值存储库

    如何选择Python中的本地键值存储库

    在编程的世界里,有时我们需要在本地存储一些数据,以便后续使用。通常情况下,我们会使用各种配置文件,如INI、JSON、TOML、YAML等,来存储这些信息。然而,对于大量数据的存储需求,配置文件并不总是最好的选择。在这种情况下,我们通常会考虑使用本地数据库,比如SQLite。但是,如果你希望有一个类似Redis的键值存储接口,既不需要复杂的安装,又能够高效地存储和访问数据,那么该怎么选择呢?本文将为你提供一些解决方案和建议。

    1. 使用pickle模块

    Python中有一个pickle模块,可以用于序列化和反序列化数据,将数据存储为二进制格式。你可以使用pickle将数据存储在本地文件中,并在需要时加载它们。这种方法可以实现键值存储,但需要自己管理文件和数据的读写。不过,如果数据量较小,这是一个简单而有效的选择。

    2. 使用sqlite自行封装

    如果你希望具有更多的灵活性和功能,可以考虑使用SQLite,并自行封装一个键值存储系统。SQLite是一个轻量级的本地数据库,不需要额外的安装,可以作为单个文件存储。你可以创建一个表,其中包含键和值的列,然后编写代码来管理数据的存储和检索。这种方法相对灵活,适用于不同规模和复杂度的数据存储需求。

    3. 使用diskcache库

    diskcache是一个Python库,提供了本地键值存储的功能,类似于Redis。它使用本地文件系统作为存储引擎,支持随机键值的存储和访问。diskcache还提供了一些高级功能,如缓存过期、最大缓存大小、存储压缩等。这个库的优势在于它是一个独立的键值存储解决方案,无需依赖其他数据库系统。

    4. 使用dbm模块

    Python标准库中有一个dbm模块,提供了简单的键值存储接口。你可以使用dbm来创建本地键值存储,它使用本地文件作为存储引擎。不过,需要注意的是,dbm的性能可能会受到底层实现的影响,因为它依赖于不同的dbm实现,如dbm.gnu、dbm.ndbm和dbm.dumb。

    5. 使用第三方库

    除了上述方法外,还有一些第三方库可以用于本地键值存储,如sqlitedict、leveldb和plyvel等。这些库提供了不同的特性和性能,可以根据你的具体需求选择合适的库。

    总结

    选择合适的本地键值存储库取决于你的项目需求和偏好。如果你需要一个简单的解决方案,可以考虑使用pickle或自行封装SQLite。如果需要更多功能和灵活性,可以使用diskcache或其他第三方库。最终,选择合适的工具可以帮助你高效地管理和访问本地数据。

  • 抖音无人直播详细拆解及流程

    抖音无人直播详细拆解及流程

    曾经,在抖音这个充满创意和机会的平台上,有一群聪明的创作者,他们利用无人直播的独特玩法和变现方式,成功地实现了低成本引流、卖货和赚钱。今天,我们将深入拆解抖音无人直播的详细流程和变现方式,带你了解这个令人兴奋的领域。

    项目介绍

    抖音无人直播是一种独特的直播方式,它通过事先录制好的直播内容,并以重复播放的方式在抖音平台上进行直播,从而实现低成本引流、卖货和打赏赚钱的目标。以下是无人直播的几种玩法:

    1. 挂机类:

    这种玩法通过推流软件将影视剧等内容同步到直播平台上。虽然对普通人来说入局难度较高,需要拥有百万粉丝,并经过平台的考核,但这种方法存在版权风险,除非平台有定向邀约。

    2. 解说类:

    解说类包括漫画解说、动漫解说、历史解说等方向。在拿到版权后,创作者需要选品,并模仿他人的文案,快速从零到一。制作素材内容通常需要使用PS、配音工具、剪映等工具。这个玩法需要前期对账号进行精准运营,以提高直播间活跃度。

    3. 弹幕互动类:

    这类无人直播以互动游戏为主,通常在B站平台上开展弹幕互动玩法。在抖音平台上,这种玩法相对不受重视,需要等待机会。创作者需要不定期更新弹幕玩法,除B站外的平台还需要追加投资。

    4. 组合直播间:

    这是一种将以上三种玩法和不同的变现模式结合起来的新型直播间,旨在创造更多收益机会。

    变现方式

    成功进行抖音无人直播后,创作者可以通过多种方式实现变现。以下是一些常见的变现方式:

    1. APP和小程序的拉新收益:

    这是无人直播的主要盈利手段之一,一般以各个软件的拉新为主,观众转化率和佣金比例较高。

    2. 小黄车:

    创作者可以根据直播间的内容选择相关商品进行推广,如动漫、游戏周边和各大运营商的流量卡等。

    3. 礼物打赏:

    这是最常见的变现模式之一。观众可以在直播中通过送礼物来支持创作者。对于弹幕互动类的直播间,创作者可以增加游戏元素,提高礼物率。

    注意事项

    在进行抖音无人直播时,创作者需要注意以下事项:

    1. 达到开播标准:

    为了进行直播,创作者需要按部就班地制作视频、发布视频,并加入抖音的公会,达到0粉后使用抖音伴侣软件。也可以使用一些非常规方法来增加粉丝。

    2. 避免被封禁:

    为了避免被封禁,创作者可以在直播间提供一个数码时钟,避免长时间直播。合理使用OBS推流软件和抖音的直播伴侣。

    3. 最佳下播时机:

    在直播间较为活跃时下播,因为下次开播时流量会更多。

    抖音无人直播是一个充满潜力的领域,它提供了创新和赚钱的机会。如果你有兴趣尝试,记住这些玩法和变现方式,可能会是你在抖音平台上实现成功的关键。

  • Python 3.12发布:哪个改动最有吸引力?

    Python 3.12发布:哪个改动最有吸引力?

    Python,这门被誉为“蟒蛇”的编程语言,在不断演进中迎来了全新的版本——Python 3.12。对于众多Python开发者和爱好者而言,每一次版本更新都像是一场期待已久的盛宴。而今天,我们将带您一探Python 3.12的新变化,看看哪些改动最有吸引力。

    Python 3.12的主要改动

    Python 3.12带来了一系列令人期待的改动,让我们逐一了解:

    1. f-string更复杂的解析:新版本的Python增强了f-string的功能,使其支持更复杂的解析。虽然这一改动或许对某些开发者来说并没有太大用处,但它为字符串格式化提供了更多的灵活性。

    2. Per-Interpreter GIL:在Python的多线程编程中,全局解释器锁(Global Interpreter Lock,简称GIL)一直是个热门话题。Python 3.12引入了Per-Interpreter GIL,但需要注意的是,这个改动仅限于C-API。所以,如果您是Python的裸写(不依赖C扩展的纯Python代码)爱好者,GIL仍然存在。预计在Python 3.13版本中将会引入可选的No-GIL Python解释器。

    3. 新的类型标注支持:对于类型提示(type hints)的泛型部分,Python 3.12进行了一些补充。虽然还有一些进步空间,但这个改动对于静态类型检查和代码可读性有着积极的影响。

    4. distutils包弃用:对于一些开发者来说,这可能是一个比较大的改动。Python 3.12将distutils包标记为弃用,这可能会对使用它的项目产生一些影响。这个改动表明Python生态系统正在逐渐淘汰旧的工具和库,以推动更现代化的开发方式。

    5. 各模块的优化改进:Python 3.12还带来了各种模块的优化改进,包括os和asyncio等。这些改进有望提高Python的性能和稳定性。

    哪个改动最有吸引力?

    在众多改动中,有哪个最有吸引力呢?从社区的反应来看,人们对Python 3.12的改动持不同意见。有人认为f-string的增强功能很有用,尤其是支持单引号套单引号,这使得字符串格式化更加灵活。同时,新的类型标注支持也受到一些开发者的欢迎,因为它有助于提高代码的可读性。

    然而,也有人对Python的版本更新持保守态度。有开发者表示,他们仍然在使用Python 3.9,而没有感到有必要升级到新版本。对于一些项目来说,稳定性和兼容性可能更重要。

    最后,有人提到了一个看似小改动却颇具吸引力的特性——模块中新增的itertools.batched(iterable, n)函数。对于这些开发者来说,这可能是Python 3.12中最大的改动,因为它为他们的工作带来了便利。

    总之,Python 3.12的改动各有千秋,最有吸引力的改动因人而异。无论您是追求新特性的激进派还是更注重稳定性的保守派,Python的发展始终在为您提供更好的编程体验而不断努力。

    在这个数字化时代,Python仍然是编程世界的明星,我们期待着未来更多令人兴奋的版本更新,以及Python生态系统的持续繁荣。

  • Windows和Mac的Tab切换:哪个更流畅?

    Windows和Mac的Tab切换:哪个更流畅?

    在数字时代,我们经常需要同时打开多个标签页,例如浏览器标签页、应用程序窗口等。而如何高效地在这些标签页之间切换成为一个重要的使用需求。近日,一个关于Windows和Mac的讨论引发了广泛关注,涉及到了这两个操作系统中的标签页切换方式。让我们一起来看看这个话题。

    Windows的标签页切换

    Windows操作系统提供了多种方式来切换标签页。最近的讨论中提到了一种令人惊艳的方法,那就是使用全程三指手势来切换所有打开的标签页。这意味着您可以轻松地在不同的应用程序和窗口之间进行切换,而只需一个简单的手势。这种方式被描述为“非常丝滑”。

    另外,Windows还提供了经典的Alt+Tab组合键,用于在不同的应用程序之间切换。Ctrl+Tab则用于在应用程序内部切换标签页。这种多样的切换方式使得用户可以根据自己的偏好来选择最适合自己的方法。

    Mac的标签页切换

    与Windows不同,Mac操作系统使用了不同的手势和快捷键来切换标签页。最常用的是使用四指滑动手势向上,然后使用单指手势来切换标签页。这需要两个步骤,首先是滑动手势,然后是单指切换,相对于Windows的一步操作来说,可能会感到稍显繁琐。

    此外,Mac还使用了Command+Tab组合键来切换应用程序,但对于切换应用程序内部的标签页,需要使用其他快捷键或手势。虽然这些方法都有其独特之处,但相对于Windows的全程三指切换来说,有时可能会被认为不够流畅。

    选择适合自己的方式

    在Windows和Mac之间,标签页切换的方式各有特点。Windows提供了更多多样的选择,而Mac则更注重手势和快捷键的流畅性。选择哪种方式主要取决于个人偏好和习惯。

    不过,无论您是Windows用户还是Mac用户,最重要的是找到适合自己的方式,以提高工作效率和操作的流畅性。每个人都可以根据自己的需求来定制操作系统,以便更好地满足自己的工作和生活需求。

    在数字时代,标签页切换已经成为了日常生活的一部分,我们期待未来操作系统会继续优化和创新,以提供更好的使用体验。