Tag: Windows

  • 打造自己的Minecraft服务器控制面板:MCSManager详细教程

    打造自己的Minecraft服务器控制面板:MCSManager详细教程

    在广袤的Minecraft世界中,你是否曾梦想拥有一个自己的服务器,与朋友们畅游其中?MCSManager Panel(简称MCSM Panel)是一个多语言、轻量级、开箱即用、支持多实例的Minecraft服务器控制面板,还支持Docker。它可以帮助你轻松管理多个物理服务器,实时创建游戏服务器,并提供安全可靠的用户权限系统,确保多用户之间的流畅体验。

    在本教程中,我们将详细介绍如何安装、配置和使用MCSManager Panel,以及一些高级功能。让我们一起来打造自己的Minecraft服务器控制面板吧!

    1. 运行环境

    MCSManager Panel可以在Windows和Linux平台上运行,无需复杂的数据库或系统配置。作为一个轻量级控制面板,你只需要安装Node.js即可。

    所需Node.js版本:14.17.6或更高。

    2. 安装

    Windows系统

    对于Windows系统,MCSM Panel已经编译成了一键运行版本。

    1. 从官方网站下载:https://mcsmanager.com/

    Linux系统

    快速安装,只需一条命令:

    wget -qO- https://raw.githubusercontent.com/mcsmanager/Script/master/setup.sh | bash

    这个脚本适用于Ubuntu、Centos、Debian和Archlinux的AMD64架构系统。安装完成后,使用以下命令启动服务:

    systemctl start mcsm-{web,daemon}

    MCSManager的组件和运行目录位于:/opt/mcsmanager/

    如果安装脚本不起作用,你可以尝试手动安装:

    # 切换到安装目录,如果不存在请提前创建
    cd /opt/
    # 下载运行环境(Node.js),如果已经安装了Node.js 14+,请忽略此步骤
    wget https://nodejs.org/dist/v14.17.6/node-v14.17.6-linux-x64.tar.gz
    # 解压缩归档
    tar -zxvf node-v14.17.6-linux-x64.tar.gz
    # 将程序添加到系统PATH
    ln -s /opt/node-v14.17.6-linux-x64/bin/node /usr/bin/node
    ln -s /opt/node-v14.17.6-linux-x64/bin/npm /usr/bin/npm
    
    # 准备安装目录
    mkdir /opt/mcsmanager/
    cd /opt/mcsmanager/
    
    # 下载MCSManager
    wget https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz
    tar -zxf mcsmanager_linux_release.tar.gz
    
    ./install-dependency.sh
    
    # 请打开两个终端或使用Screen
    
    # 首先启动守护程序
    ./start-daemon.sh
    
    # 启动Web服务(在第二个终端中执行)
    ./start-web.sh
    
    # 访问 http://localhost:23333/ 查看Web界面
    # 通常情况下,Web应用程序将自动扫描并连接到本地守护程序。

    需要注意的是,上述步骤没有注册面板组件到系统服务中,你需要使用screen来管理它,或者手动注册系统服务。

    3. 数据目录

    Web配置和数据:/opt/mcsmanager/web/data/

    Daemon配置和数据:/opt/mcsmanager/daemon/data/

    4. 升级

    在每次升级之前,强烈建议备份数据目录。升级步骤参考:https://github.com/MCSManager/MCSManager/wiki/Update-MCSManager

    5. 项目介绍

    MCSManager Panel由三个项目组成,你在安装时使用的代码是编译和集成的结果。

    • Web后端:控制中心,负责后端API、用户数据管理以及与守护程序的通信和身份验证。
    • 前端/UI:后端的用户界面,负责通过Web界面显示统计信息、发送请求以及与守护程序的通信。该项目的最终产品是纯静态文件。
    • 守护程序:被控制的远程节点,负责控制本地的所有实例和管理实际的实例进程。它能够与所有对象通信。

    6. 搭建开发环境

    这部分面向开发者,如果你不是开发者,可以安全地忽略这些内容。一旦这些项目在开发环境中运行,你可以继续开发或预览它们。请确保遵守许可证。

    Web项目

    git clone https://github.com/MCSManager/MCSManager.git
    cd MCSManager
    npm install
    npm run start
    # 默认情况下,使用ts-node来直接运行TypeScript代码
    # 默认运行在端口23333。

    UI项目

    git clone https://github.com/MCSManager/UI.git
    cd UI
    npm install
    npm run serve
    # 在 http://localhost:8080/ 预览界面
    # 所有请求将被重定向到端口23333。

    Daemon项目

    git clone https://github.com/MCSManager/Daemon.git
    cd Daemon
    npm install
    npm run start
    # 运行后,请通过Web界面将守护程序连接到控制面板。
    # 默认情况下,运行在端口24444。

    7. 浏览器兼容性

    MCSManager Panel支持主流现代浏览器,如Chrome、Firefox、Safari和Opera。不再支持IE。

    8. 国际化

    MCSManager的国际化由Lazy、KevinLu2000、zijiren233和Unitwk完成。

    9. 权限管理

    控制面板在运行时会检查用户列表。如果没有可用用户,将创建一个默认的管理员用户。

    如果你忘记了唯一的管理员帐户,你可以备份所有当前用户数据,生成一个新的管理员帐户,然后覆盖以前的帐户。

    用户数据目录:/opt/mcsmanager/web/data/Users/*.json

    10. 贡献

    如果在使用过程中遇到任何问题,你可以在解决后提交Issue或Pull Request。

    代码必须保持其现有格式,不应添加额外的代码。详情请参阅此处。

    11. 报告问题

    欢迎反馈任何遇到的问题,我们将及时回复。

    如果发现严重的安全漏洞,可以通过电子邮件[email protected]进行私下提交。

    在安全问题解决后,你的名字将被列为漏洞发现者。

    12. 许可

    版权所有 2023 MCSManager Dev,采用Apache-2.0许可证。

  • 一篇全面指南:使用Trurl命令行工具进行URL解析和操作

    一篇全面指南:使用Trurl命令行工具进行URL解析和操作

    你是否曾经遇到过需要在URL中进行各种操作的情况?也许你想要更改URL的主机名,重定向URL,提取URL的各个部分,或者对URL的查询进行排序。不管你的需求是什么,Trurl命令行工具可以帮助你轻松完成这些任务。在本篇文章中,我们将深入探讨Trurl工具的功能和用法,带你了解如何在命令行中处理URL。

    开篇故事

    想象一下这样的场景:你正在开发一个网站,需要对上千个URL进行批量更改,以适应新的网站结构。手动一个个修改URL将是一项令人沮丧且耗时的任务。正当你感到困惑时,一位同事告诉你Trurl工具可以帮助你轻松完成这项工作。你感到如释重负,立刻尝试了一下,最终节省了数小时的时间。这就是Trurl工具的威力。

    简介

    Trurl是一个命令行工具,用于解析和操作URL。它可以执行多种任务,包括更改URL的各个部分、重定向URL、提取URL的特定部分以及对查询部分进行排序。无论你是在Linux还是Windows系统上工作,Trurl都可以轻松胜任。现在,让我们深入了解如何使用Trurl来简化URL操作。

    安装

    在Linux上安装Trurl

    在Linux上安装Trurl非常简单,只需执行以下命令:

    $ make
    cc  -W -Wall -pedantic -g   -c -o trurl.o trurl.c
    cc   trurl.o  -lcurl -o trurl

    Trurl还可以在一些Linux发行版中通过包管理器安装,可以尝试使用你喜欢的发行版的包管理器进行搜索和安装。

    在Windows上安装Trurl

    在Windows上安装Trurl需要使用Cygwin工具,按照以下步骤进行:

    1. 下载并运行Cygwin安装程序。
    2. 按照安装程序提供的指导进行操作。在选择要安装的软件包时,确保选择以下软件包:curl、libcurl-devel、libcurl4、make和gcc-core。
    3. (可选)将Cygwin的bin目录添加到系统的PATH变量中。
    4. 使用make命令,就像在Linux上一样。

    在安装Trurl之前,确保已安装libcurl的开发文件,例如libcurl4-openssl-dev或libcurl4-gnutls-dev。Trurl需要libcurl的版本在7.62.0或更高版本才能正常编译和运行。

    使用Trurl进行URL操作

    现在,让我们深入了解如何使用Trurl进行各种URL操作。以下是一些示例:

    1. 替换URL的主机名

    你可以使用以下命令来替换URL的主机名:

    $ trurl --url https://curl.se --set host=example.com
    https://example.com/

    2. 创建具有特定组件的URL

    你可以使用以下命令来创建具有特定组件的URL:

    $ trurl --set host=example.com --set scheme=ftp
    ftp://example.com/

    3. 重定向URL

    你可以使用以下命令来重定向URL:

    $ trurl --url https://curl.se/we/are.html --redirect here.html
    https://curl.se/we/here.html

    4. 更改端口号

    你可以使用以下命令来更改URL的端口号:

    $ trurl --url https://curl.se/we/../are.html --set port=8080
    https://curl.se:8080/are.html

    5. 提取URL的路径

    你可以使用以下命令来提取URL的路径:

    $ trurl --url https://curl.se/we/are.html --get '{path}'
    /we/are.html

    6. 提取URL的端口号

    你可以使用以下命令来提取URL的端口号:

    $ trurl --url https://curl.se/we/are.html --get '{port}'
    443

    7. 在URL中添加路径段

    你可以使用以下命令来在URL中添加路径段:

    $ trurl --url https://curl.se/hello --append path=you
    https://curl.se/hello/you

    8. 在URL中添加查询段

    你可以使用以下命令来在URL中添加查询段:

    $ trurl --url "https://curl.se?name=hello" --append query=search=string
    https://curl.se/?name=hello&search=string

    9. 从stdin读取URL

    你可以从stdin读取URL,并对其进行操作:

    $ cat urllist.txt | trurl --url-file -
    ...

    10. 输出JSON格式

    你可以使用以下命令将URL以JSON格式输出:

    $ trurl "https://fake.host/hello#frag" --set user=::moo:: --json
    [
      {
        "url": "https://%3a%3amoo%3a%[email protected]/hello#frag",
        "parts": {
          "scheme": "https",
          "user": "::moo::",
          "host": "fake.host",
          "path": "/hello",
          "fragment": "frag"
        }
      }
    ]

    11. 删除查询中的跟踪元组

    你可以使用以下命令从查询中删除特定的跟踪元组:

    $ trurl "https://curl.se?search=hey&utm_source=tracker" --trim query="utm_*"
    https://curl.se/?search=hey

    12. 显示特定查询键的值

    你可以使用以下命令来显示特定查询键的

    值:

    $ trurl "https://example.com?a=home&here=now&thisthen" -g '{query:a}'
    home

    13. 对查询组件中的键/值对进行排序

    你可以使用以下命令来对查询组件中的键/值对进行排序:

    $ trurl "https://example.com?b=a&c=b&a=c" --sort-query
    https://example.com?a=c&b=a&c=b

    14. 处理使用分号分隔符的查询

    如果URL的查询使用分号分隔符,你可以使用以下命令进行处理:

    $ trurl "https://curl.se?search=fool;page=5" --trim query="search" --query-separator ";"
    https://curl.se?page=5

    15. 允许URL路径中的空格

    如果URL路径中包含空格,你可以使用以下命令进行处理:

    $ trurl "https://curl.se/this has space/index.html" --accept-space
    https://curl.se/this%20has%20space/index.html

    现在,你已经了解了Trurl工具的基本用法和功能。无论你是进行批量操作还是处理单个URL,Trurl都能为你提供强大的工具。

    结语

    Trurl是一个强大的命令行工具,可用于解析和操作URL。无论你是开发人员、系统管理员还是普通用户,都可以受益于Trurl的功能。通过本文,你已经学会了如何安装Trurl并使用它来执行各种URL操作。希望本文能帮助你更轻松地处理URL,提高工作效率。

    无论你是处理个别URL还是需要批量操作大量URL,Trurl都能满足你的需求。现在,尝试一下Trurl,看看它如何简化你的URL操作工作!

  • 解锁Steam乐趣:Watt Toolkit游戏工具包全面指南

    解锁Steam乐趣:Watt Toolkit游戏工具包全面指南

    在这个数字化时代,游戏已经成为人们生活中不可或缺的一部分。而Steam作为最大的数字游戏发行平台之一,提供了数千款游戏供玩家畅玩。但是,你是否曾经遇到过一些Steam上的烦人问题,例如管理多个账户、整理游戏库存或者强制使用无边框窗口模式?如果是的话,那么你绝对不能错过今天要介绍的神奇工具——Watt Toolkit ?!

    开篇故事

    在一个漫长而炎热的夏天,你终于决定将电脑上的游戏库整理一下。但是,当你尝试一一打开Steam账户时,发现这是一个相当费时费力的任务。每次都要输入用户名和密码,然后等待登录完成,实在是太烦人了。

    正当你准备放弃时,一个朋友告诉了你一个关于Watt Toolkit的秘密武器。你决定尝试一下,结果发现这个工具非常神奇!你不仅能够轻松切换已登录的Steam账户,还能够方便地管理你的游戏库存和成就。此外,你还可以使用它来强制游戏窗口使用无边框窗口模式,让你的游戏体验更加顺畅。

    这就是我们今天要讨论的Watt Toolkit,一个能够让你的Steam游戏体验更加便捷和愉快的开源工具。

    功能一览

    账户切换

    Watt Toolkit让切换Steam账户变得轻而易举。如果你已经在当前电脑上登录了多个Steam账户,只需点击一下,即可迅速切换到其他账户。此外,你还可以方便地管理你的共享游戏库,进行排序等操作。

    游戏库存管理

    不仅可以通过Watt Toolkit下载老旧的Steam游戏,还可以直接管理你的Steam游戏库存。它支持解锁的成就和未解锁的成就,让你更好地了解自己在游戏中的成就。

    本地身份验证

    Watt Toolkit还支持本地身份验证。你可以将手机令牌保存在电脑上,目前仅支持Steam令牌,但未来将开发更多令牌类型,并支持云同步令牌。

    ArchiSteamFarm集成

    Watt Toolkit与ArchiSteamFarm集成,提供了在应用内挂卡和掉卡的功能。这对于Steam卡片收藏者来说是一个非常有用的功能。

    游戏工具

    如果你希望游戏窗口使用无边框窗口模式,Watt Toolkit也可以满足你的需求。这将提高游戏的流畅性和用户体验。

    支持的操作系统

    Watt Toolkit跨平台支持,适用于多种操作系统,包括:

    • Windows 11
    • Windows 10 版本1809(内部版本17763)或更高版本
    • macOS 10.15或更高版本
    • Ubuntu 20.04或更高版本
    • Debian 11或更高版本
    • Fedora 37或更高版本
    • Deepin(UOS)20或更高版本
    • iOS 11或更高版本(正在开发中…)
    • Android 5.0(API 21)或更高版本

    无论你使用哪种操作系统,你都可以轻松地在Watt Toolkit中享受到所有这些强大的功能。

    下载途径

    如果你对Watt Toolkit产生了兴趣,你可以从以下途径下载它:

    无论你是Windows用户、macOS用户还是Linux用户,都可以根据自己的需要选择适合的下载途径。

    下载指南

    如果你需要下载和安装Watt Toolkit,可以参考以下步骤:

    1. 打开你选择的下载途径,例如Microsoft Store、官方网站或GitHub Releases。
    2. 在下载页面上,选择适用于你操作系统的版本,然后点击下载按钮。
    3. 下载完成后,运行安装程序,并按照提示完成安装过程。
    4. 安装完成后,启动Watt Toolkit。

    现在,你已经成功安装了Watt Toolkit,可以开始享受其强大的功能了!

    开发环境

    如果你是开发人员,可能会对Watt Toolkit的开发环境感兴趣。以下是Watt Toolkit的开发环境:

    • Visual

      Studio 2022

    • Visual Studio 2022 for Mac
    • JetBrains Rider
    • Visual Studio Code
    • OpenJDK 17
    • Android Studio Electric Eel或更高版本
    • Xcode 14或更高版本

    无论你是C#开发者、Java开发者还是移动应用开发者,你都可以使用适合自己的开发环境来贡献和定制Watt Toolkit。

    项目结构

    如果你想深入了解Watt Toolkit的项目结构,可以查看项目根目录下的src/README.md文件。这里提供了详细的项目结构信息,可以帮助你更好地理解项目的组织和架构。

    开源库

    Watt Toolkit是一个开源项目,它依赖于许多开源库来实现其功能。如果你想了解这些开源库的详细信息,可以查看项目根目录下的doc/open-source-library.md文件。这里列出了所有使用的开源库以及它们的作用。

    未来路线图

    Watt Toolkit的未来路线图充满了激动人心的计划。你可以在项目中查看详细的路线图,了解即将推出的功能和改进。如果你有任何问题或建议,都可以随时与开发团队交流。

    结语

    Watt Toolkit是一个强大的开源工具,旨在让Steam游戏体验更加便捷和愉快。它提供了许多有用的功能,包括账户切换、游戏库存管理、本地身份验证和游戏工具。无论你是普通玩家还是开发人员,都会发现Watt Toolkit是一个不可多得的工具。

    现在,你已经了解了Watt Toolkit的各种功能和特点,可以尝试下载并开始使用它,提升你的Steam游戏体验吧!

  • 快速入门:ZeroNSD DNS服务器指南

    快速入门:ZeroNSD DNS服务器指南

    你是否曾经遇到DNS问题,而最后的答案总是”这一定是DNS问题”?ZeroNSD是专为ZeroTier用户设计的DNS服务器,它可以帮助你解决与ZeroTier网络相关的DNS查询问题。本文将引导你快速入门使用ZeroNSD,以便在ZeroTier网络上提供高效的DNS服务。

    简介

    ZeroNSD是一个专为ZeroTier用户设计的DNS服务器,它允许你为ZeroTier网络提供定制的DNS解析服务。通过ZeroNSD,你可以实现以下目标:

    • 为ZeroTier网络提供高性能的DNS解析服务。
    • 自定义DNS记录以满足你的需求。
    • 通过ZeroTier网络轻松访问DNS服务器。

    请注意,ZeroNSD目前仍处于Beta测试阶段,但它已经可以在你的ZeroTier网络上提供可靠的DNS解析服务。

    先决条件

    在开始使用ZeroNSD之前,请确保你已经满足以下先决条件:

    概念上的先决条件

    • 当ZeroTier加入一个网络时,它会创建一个虚拟网络接口。
    • 当ZeroTier加入多个网络时,将会存在多个网络接口。
    • 当ZeroNSD启动时,它会绑定到一个ZeroTier网络接口。
    • 当ZeroTier加入多个网络时,需要多个ZeroNSD实例,每个网络接口对应一个实例。

    这意味着:

    • ZeroNSD将从运行它的节点访问。
    • ZeroNSD将从ZeroTier网络上的其他节点访问。
    • ZeroNSD将与节点可能连接的其他网络隔离开来。

    技术上的先决条件

    本快速入门使用了两台机器 – 一个是在Digital Ocean上的Ubuntu虚拟机,另一个是在住宅ISP上的OSX笔记本电脑。为了一步一步跟随本文,你需要提供类似的基础设施。如果你使用不同的平台,你应该能够以最少的努力弄清楚应该怎么做。

    步骤

    创建一个ZeroTier网络

    首先,你需要手动通过ZeroTier Central WebUI创建一个ZeroTier网络。

    1. 登录ZeroTier Central WebUI。
    2. 创建一个新的网络。

    安装ZeroTier

    接下来,你需要安装ZeroTier并将其加入你打算提供DNS服务的网络中。以下是在大多数平台的CLI上执行的命令。Windows用户可以从ZeroTier下载页面下载MSI安装程序。在本文的其余部分,请将示例网络ID“af78bf94364e2035”替换为你自己的网络ID。

    在Ubuntu上执行以下命令:

    $ curl -s https://install.zerotier.com | sudo bash
    $ sudo zerotier-cli join af78bf94364e2035
    $ sudo zerotier-cli set af78bf94364e2035 allowDNS=1

    授权节点

    在ZeroTier Central WebUI的成员部分,通过点击“Auth”按钮,将节点授权加入网络。

    获取ZeroTier Central的API令牌

    在开始之前,我们需要登录到my.zerotier.com并在“帐户”部分创建一个API令牌。ZeroNSD将使用此令牌读取网络成员以生成记录,并更新DNS设置。

    执行以下命令将API令牌存储到文件中,以便ZeroNSD读取:

    $ sudo bash -c "echo YOUR_ZEROTIER_CENTRAL_TOKEN > /var/lib/zerotier-one/token"
    $ sudo chown zerotier-one:zerotier-one /var/lib/zerotier-one/token
    $ sudo chmod 600 /var/lib/zerotier-one/token

    安装ZeroTier Systemd Manager

    ZeroTier Systemd Manager发布了rpm和deb软件包,可以在这里下载。

    下载并安装ZeroTier Systemd Manager:

    $ wget https://github.com/zerotier/zerotier-systemd-manager/releases/download/v0.1.9/zerotier-systemd-manager_0.1.9_linux_amd64.deb
    $ sudo dpkg -i zerotier-systemd-manager_0.1.9_linux_amd64.deb

    最后,重新启动所有的ZeroTier服务:

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart zerotier-one
    $ sudo systemctl enable zerotier-systemd-manager.timer
    $ sudo systemctl start zerotier-systemd-manager.timer

    安装ZeroNSD

    ZeroNSD应该只在网络中的一个节点上运行。由于DNS的延迟非常重要,请尽量将其放置在距离客户端最近的位置。

    使用软件包安装

    ZeroNSD发布了rpm、deb和msi软件包,可以在这里找到最新版本。以下是示例命令,注意要替换为最新版本:

    $ wget https://github.com/zerotier/zeronsd/releases/download/v0.1.7/zeronsd_0.1.7_amd64.deb
    $ sudo dpkg -i zeronsd_0.1.7_amd64.deb

    使用Cargo安装

    如果对于你的平台没有提供软件包,你仍然可以使用Cargo进行安装:

    $ sudo /usr/bin/apt-get -y install net-tools librust-openssl-dev pkg-config cargo
    $ sudo /usr/bin/cargo install zeronsd --root /usr/local

    提供DNS服务

    对于你希望提供DNS服务的每个网络,请执行以下操作(将“af78bf94364e2035”替换为你的网络ID):

    $ sudo zeronsd supervise -t /var/lib/zerotier-one/token -w -d YOUR_DOMAIN af78bf943
    
    64e2035
    $ sudo systemctl start zeronsd-af78bf94364e2035
    $ sudo systemctl enable zeronsd-af78bf94364e2035

    验证功能

    你应该能够通过DNS名称ping到笔记本电脑(或任何前置子域名,因为我们设置了通配符标志):

    $ ping laptop.YOUR_DOMAIN
    PING laptop.YOUR_DOMAIN (172.22.192.177) 56(84) bytes of data.
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=1 ttl=64 time=50.1 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=2 ttl=64 time=49.5 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=3 ttl=64 time=48.6 ms

    或者:

    $ ping travel.laptop.YOUR_DOMAIN
    PING travel.laptop.YOUR_DOMAIN (172.22.192.177) 56(84) bytes of data.
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=1 ttl=64 time=50.1 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=2 ttl=64 time=49.5 ms
    64 bytes from 172.22.192.177 (172.22.192.177): icmp_seq=3 ttl=64 time=48.6 ms

    更新标志设置

    如果要更改设置(例如TLD),请执行以下操作(将“af78bf94364e2035”替换为你的网络ID):

    $ sudo zeronsd supervise -t /var/lib/zerotier-one/token -w -d YOUR_DOMAIN af78bf94364e2035
    $ sudo systemctl daemon-reload
    $ sudo systemctl enable zeronsd-af78bf94364e2035

    测试DNS查询

    要在没有zerotier-systemd-manager的情况下测试与ZeroNSD的DNS查询,请找到ZeroNSD绑定的IP地址,并使用dig命令明确对其进行查询。执行以下命令:

    $ sudo lsof -i -n | grep ^zeronsd | grep UDP | awk '{ print $9 }' | cut -f1 -d:
    172.22.245.70

    然后使用dig命令直接查询DNS服务器:

    对Ubuntu机器执行:

    $ dig +short @172.22.245.70 zt-3513e8b98d.YOUR_DOMAIN
    172.22.245.70
    $ dig +short @172.22.245.70 server.YOUR_DOMAIN
    172.22.245.70

    对OSX笔记本电脑执行:

    $ dig +short @172.22.245.70 zt-eff05def90.YOUR_DOMAIN
    172.22.245.70
    $ dig +short @172.22.245.70 laptop.YOUR_DOMAIN
    172.22.192.177

    添加到/etc/hosts并再次查询

    如果要添加自定义DNS记录,请执行以下操作:

    $ sudo bash -c 'echo "1.2.3.4 test" >> /etc/hosts'
    $ dig +short @172.22.245.70 test.YOUR_DOMAIN
    1.2.3.4

    验证通向公共DNS的查询

    为了验证失败的情况下,查询会落到公共DNS服务器,执行以下命令:

    $ dig +short @172.22.245.70 example.com
    93.184.216.34

    附加信息

    OSX上的DNS解析

    在OSX上,DNS解析使用dns-sd。遗憾的是,nslookup、host和dig在OSX上可能无法正常工作,但ping可以。

    $ ping server.YOUR_DOMAIN
    PING server.YOUR_DOMAIN (172.22.245.70): 56 data bytes
    64 bytes from 172.22.245.70: icmp_seq=0 ttl=64 time=37.361 ms
    64 bytes from 172.22.245.70: icmp_seq=1 ttl=64 time=38.129 ms
    64 bytes from 172.22.245.70: icmp_seq=2 ttl=64 time=37.569 ms

    要检查系统解析器设置,使用以下命令:scutil --dns。

    对于Ubuntu机器,可以执行以下查询:

    $ dns-sd -G v4 server.YOUR_DOMAIN
    $ dns-sd -G v4 zt-3513e8b98d.YOUR_DOMAIN

    对于OSX机器,可以执行以下查询:

    $ dns-sd -G v4 laptop.YOUR_DOMAIN
    $ dns-sd -G v4 zt-eff05def90.YOUR_DOMAIN

    Windows

    如果你是Windows用户,请尝试使用默认设置。如果有任何问题,请提供反馈或提交拉取请求以帮助改进ZeroNSD在Windows上的兼容性。

    提供非ZeroTier记录

    注意: 以下部分主要面向希望充分利用zeronsd的服务的高级用户。

    zeronsd还将在两种情况下提供非ZeroTier记录:

    1. 在TLD不匹配时,它将转发/etc/resolv.conf中的名称服务器。此行为类似于Linux上常用的DNS服务器dnsmasq。

    2. 为了提供自定义记录,你可以使用-f标志和一个hosts格式的文件,它将在提供的TLD下提供来自该文件的记录,与ZeroTier节点合并。以下是示例。

    注意: 如果按照上述步骤进行了操作,请在继续之前执行以下命令以停止ZeroNSD的服务和监督:

    $ systemctl stop zeronsd-<network id>
    $ zeronsd unsupervise <network id>

    创建一个名为hosts的文件,将以下内容放入其中:

    1.1.1.1 cloudflare-dns

    然后,我们将只使用zeronsd的start子命令启动一个临时服务器。这将在前台运行,因此请在新终端中运行或使用&运行。

    $ zeronsd start -t
    
     /var/lib/zerotier-one/token -f ./hosts -d YOUR_DOMAIN <network id>

    最后,我们可以查询cloudflare-dns.YOUR_DOMAIN以查找CloudFlare的DNS服务器,速度非常快!

    $ host cloudflare-dns.YOUR_DOMAIN 1.2.3.4
    cloudflare-dns.YOUR_DOMAIN has address 1.1.1.1

    结论

    使用ZeroNSD,你可以为你的ZeroTier网络提供高性能的DNS解析服务,并根据需要自定义DNS记录。这可以帮助你更好地管理你的网络,提高性能,减少DNS查询的延迟,并提供更好的用户体验。

    如果你是ZeroTier用户,ZeroNSD绝对值得一试。通过按照本指南的步骤进行操作,你可以轻松地将ZeroNSD集成到你的网络中,并提供可靠的DNS解析服务。

  • Linux Kernel 6.5发布:初步支持Wi-Fi 7和USB4

    Linux Kernel 6.5发布:初步支持Wi-Fi 7和USB4

    是时候迎来新的Linux内核发布了!

    Linux 6.5内核已经发布,它在之前的Linux 6.4内核基础上进行了改进,并引入了一些显著的变化和新增功能。

    Linus Torvalds提到这次发布非常顺利:

    过去的一周没有发生特别奇怪或可怕的事情,因此没有理由推迟6.5版本的发布。

    我仍然有一种烦人的感觉,认为很多人都在度假,事情之所以安静,部分原因是因为这个。但这次发布进展顺利,所以这可能只是我多疑。上周最大的补丁只是针对我们自己的自测。

    ? Linux Kernel 6.5:有什么新特性?
    用户应该注意,这是一个非LTS版本。如果你想要尝试最新功能,那么这个版本适合你。否则,升级是不必要的,除非它修复了特定问题或提高了性能。

    以下是新内核版本的主要亮点:

    1. 支持AMD FreeSync视频的开箱即用:在此版本中,重新引入了对AMD FreeSync视频模式的支持,并默认启用。它早在Linux内核5.8中引入过,但由于存在错误而被撤销。启用AMD FreeSync模式后,可以通过将显示器的刷新率与显卡的帧率匹配来大大减少游戏和视频中的画面撕裂和卡顿。

    2. 默认的P-State “Active”模式适用于AMD CPU:现代AMD CPU,特别是那些使用Zen 2及以上架构的CPU,现在将使用amd-pstate作为默认的CPU性能调节驱动程序。此前,默认情况下由CPUFreq管理CPU缩放机制。现在,amd-pstate提供了三种模式:active、passive和guided autonomous。在这个版本中,默认启用了”active”模式,取代了先前Linux内核6.4中使用的guided autonomous模式。据Phoronix的一些基准测试显示,amd-pstate的性能优于CPUFreq。

    3. ASUS ROG Ally声音优化:ASUS ROG Ally是AMD Z1和Z1 Extreme SoCs驱动的Windows掌上游戏电脑的直接竞争对手。它于今年7月发布。拥有ASUS ROG Ally的Linux玩家可以期待看到该系统音频设备的补丁发布,多亏了这个提交。

    4. USB4 v2和WiFi 7的初步支持:下一代无线标准WiFi 7的工作已经进行了相当长的时间。作为一个快速的事实,WiFi 7支持6GHz频段,最大数据传输速率为23Gbps!此外,下一代USB4标准的开发工作也已经开始。USB4支持80Gbps的数据传输速率!通过WiFi的合并和WiFi 7的请求,早期支持已经集成到Linux 6.5内核中。

    ?️ 其他变更和改进
    除了主要亮点之外,还有一些需要提及的事项:

    • 修复了Intel P-State的CPU缩放问题
    • 对Btrfs的性能改进和其他存储优化
    • 对最新的Xbox控制器提供了震动支持
    • 为AMD Radeon RX 7000系列显卡提供了超频支持
    • 为AMD和英特尔图形驱动程序提供了各种改进和优化
    • 增加了更多的Rust代码转换

    官方发布公告会提供自上一次发布候选版以来的简短日志。如果你对技术细节感兴趣,可以参考更新日志。

    安装Linux Kernel 6.5
    你可以使用像Arch或Fedora这样的滚动发布的发行版轻松升级到Linux Kernel 6.5。这些发行版在发布后不久就会提供最新的内核。

    另一方面,使用Ubuntu及其衍生发行版的用户应该期待在Ubuntu 23.10中看到这个Linux内核版本的使用。通过使用Pop OS和Linux Lite等发行版,你可以更早地期待这个内核版本。

    你可以从官方网站下载最新Linux Kernel的tarball(发布后需要一些时间才能获得)。

    ? 在评论中分享你对最新内核发布的看法。

  • 让你的Windows系统准备好运行虚拟机

    让你的Windows系统准备好运行虚拟机

    你是否曾经遇到过在使用VirtualBox时出现“无法打开虚拟机会话”的错误?这可能是因为你的系统没有启用虚拟化技术。

    为了在Windows系统上创建虚拟机,你需要确保系统已经做好了一些准备工作。在本篇文章中,我将为你介绍如何准备你的Windows系统以运行虚拟机。

    开篇故事

    想象一下这个场景:你正准备在Windows系统上运行一个重要的虚拟机,但突然出现了一个让你束手无策的错误信息。这是每个使用虚拟机的人都可能遇到的问题。但是不要担心,我将向你展示如何准备你的Windows系统,以避免这些问题的发生,并顺利运行虚拟机。

    第一步:启用虚拟化技术

    如果你使用的是预装了Windows 10/11的系统,那么很可能已经启用了虚拟化技术,你无需进行任何设置。但如果你手动安装了Windows操作系统,那么你需要检查BIOS设置,看看是否支持虚拟化技术。

    虚拟化技术的启用对于虚拟机程序的正常运行至关重要。如果未启用虚拟化技术,虚拟机程序将无法工作并显示错误信息。

    以下是检查虚拟化技术是否启用的基本步骤:

    1. 进入UEFI固件设置(或BIOS菜单)。通常,你可以通过按下“Del”键或F1、F2、F10或F12键来访问它。

      根据主板制造商的不同,用户界面可能会有所不同。但在大多数情况下,你需要导航到其中的“高级”选项,并访问“CPU配置”设置。

    2. 在CPU配置中,你需要启用“Intel (VMX)虚拟化技术”或“SVM模式”(适用于AMD处理器)。

    启用虚拟化技术后,你就可以顺利使用虚拟机程序了。

    第二步:选择虚拟机程序

    要创建和管理虚拟机,你需要选择一个虚拟机程序。在Windows系统中,有两个主要选择:Hyper-V和第三方虚拟机程序。

    Hyper-V

    Hyper-V是Microsoft内置的虚拟机程序,如果你使用的是Windows Pro/Education/Enterprise版本,那么可以很容易地启用它。以下是启用Hyper-V的步骤:

    1. 在控制面板中搜索“Windows功能”或通过“控制面板” -> “程序” -> “打开或关闭Windows功能”来找到它。

    2. 点击“Hyper-V”并点击“确定”。

    3. 系统将自动应用更改并获取所需的文件。你只需要等待一段时间。

    4. 完成后,系统会要求你重新启动以生效新功能。

    请注意,Hyper-V不适用于Windows 10/11家庭版。

    第三方虚拟机程序

    虽然使用Hyper-V可以获得更好的虚拟机性能,但它不太容易使用。因此,我们建议普通用户使用第三方虚拟机程序。

    其中,VirtualBox是一个不错的选择。它是一个开源程序,具有丰富的功能和用户友好的界面。你可以在Windows、Linux和macOS上使用它。

    你还可以选择像VMware Workstation这样的专有选项,它也非常流行。

    第三步:检查系统资源和要求

    创建和使用虚拟机并不是非常消耗资源的过程。然而,有一些变量可能需要你关注:

    • 确保你的系统至少有4 GB的RAM(越多越好)。
    • 64位处理器,具有双核或更多核心。

    如果你不知道,虚拟机会使用你系统的资源,即使它们是独立的虚拟机。大多数最低规格建议包括4 GB的RAM,但我建议使用8 GB以上。

    如果你想运行两个虚拟机,那么在Windows上可能需要更多的RAM。

    除了内存外,你应该拥有一个拥有多个核心的处理器。这样,一些核心可以用于虚拟机,另一些可以用于主机上的其他任务。

    最后,要注意磁盘空间。对于虚拟机,磁盘通常是动态分配的,这意味着随着操作系统和文件的增加,物理存储驱动器上的空间会被占用。

    在某些类型的虚拟磁盘中,它会保留你指定的整个空间。因此,在执行此操作之前,请检查启动之前的可用磁盘空间。通常情况下,选择一个不安装Windows系统的分区作为虚拟机磁盘是一个不错的选择。

    结论

    通过按照以上步骤来准备你的Windows系统,你可以轻松地运行和管理虚拟机。现在,你可以在Windows上轻松安装Linux虚拟机,开始你的虚拟化之旅。

    如果你还有其他关于虚拟机的问题或想要了解更多信息,欢迎在下面的评论中与我们分享你的想法。

  • 如何创建一个自动化按键和鼠标点击工具

    如何创建一个自动化按键和鼠标点击工具

    在日常计算机使用中,我们常常需要进行重复性的操作,例如定时按下某个键盘按键或模拟鼠标点击。这可能涉及到玩游戏、自动化测试、数据录入等各种场景。为了实现这些功能,你可以创建一个自动化按键和鼠标点击工具。本教程将介绍如何使用Python和一些库来创建这样的工具。

    1. 开场故事

    想象一下,你正在玩一个需要不断点击鼠标的游戏,或者你需要在浏览器上定期执行某项任务。每次都手动点击或按下键盘按键是多么繁琐和乏味!那么,有没有一种方法可以自动化这些操作,让计算机来代劳呢?答案是肯定的,本文将向你展示如何创建一个自动化按键和鼠标点击的工具,让你告别重复性操作的困扰。

    2. 准备工作

    在开始之前,我们需要准备一些工具和库。首先,你需要安装Python,如果你还没有安装,可以从官方网站下载并安装。接下来,我们将使用以下库:

    • PyQt5:用于创建图形用户界面。
    • pynput:用于监听键盘和鼠标事件。
    • pygetwindow:用于获取当前活动窗口的信息。
    • pyautogui:用于模拟键盘按键和鼠标点击事件。

    你可以使用以下命令安装这些库:

    pip install PyQt5 pynput pygetwindow pyautogui

    3. 创建图形用户界面

    首先,我们将创建一个图形用户界面(GUI),以便用户可以轻松地控制自动化工具。我们将使用PyQt5库来构建GUI。以下是一个示例GUI的代码:

    from PyQt5 import QtWidgets, uic
    from PyQt5.QtGui import QPainter, QColor, QCursor
    from PyQt5.QtCore import Qt, QRectF
    from pynput.mouse import Button, Controller
    import pyautogui
    import threading
    import time
    import os
    
    # ... 其他代码 ...
    
    class Ui(QtWidgets.QMainWindow):
        def __init__(self):
            super(Ui, self).__init__()
            uic.loadUi(ui_path, self)
    
            # ... 创建GUI元素 ...
    
            self.show()
    
    # ... 其他代码 ...

    在这个GUI中,我们可以添加按键、设置时间间隔、监控按键状态等功能。

    4. 监听键盘和鼠标事件

    接下来,我们将创建一个用于监听键盘和鼠标事件的类。我们使用pynput库来实现这一功能。以下是一个示例代码片段:

    from pynput import keyboard, mouse
    import pygetwindow as gw
    
    class Controller:
        def __init__(self):
            self.mouse_controller = mouse.Controller()
            self.mouse_pressed = False
            self.keyboard_stop_flag = True
            self.mouse_auto_stop_flag = True
    
        def on_press(self, key):
            try:
                # 检查游戏是否运行并且是当前活动窗口
                # game_windows = gw.getWindowsWithTitle(self.game_title)
                # if game_windows and gw.getActiveWindow() in game_windows:
                if key == keyboard.Key.f1:
                    if self.keyboard_stop_flag:
                        self.keyboard_stop_flag = False
                        window.statusButton.setChecked(True)
                        self.start_keyboard_press_key()
                    else:
                        self.keyboard_stop_flag = True
                        window.statusButton.setChecked(False)
                elif key == keyboard.Key.f2:
                    # 鼠标连点
                    if self.mouse_auto_stop_flag:
                        self.mouse_auto_stop_flag = False
                        window.mouseStatusButton.setChecked(True)
                        self.start_mouse_auto_click_key(self.MOUSE_STATUS_CLICK)
                    else:
                        self.mouse_auto_stop_flag = True
                        window.mouseStatusButton.setChecked(False)
                elif key == keyboard.Key.f3:
                    # 鼠标长按
                    if self.mouse_auto_stop_flag:
                        self.mouse_auto_stop_flag = False
                        window.mouseStatusButton.setChecked(True)
                        self.start_mouse_auto_click_key(self.MOUSE_STATUS_PRESS)
                    else:
                        self.mouse_auto_stop_flag = True
                        window.mouseStatusButton.setChecked(False)
                elif key == keyboard.Key.f4:
                    # 按键映射
                    pass
                elif key == keyboard.Key.f12:
                    mouse_pos = QCursor.pos()
                    global mouseX, mouseY
                    mouseX = mouse_pos.x()
                    mouseY = mouse_pos.y()
                    window.xPos.setText(str(mouseX))
                    window.yPos.setText(str(mouseY))
                else:
                    print(f"{key} pressed")
            except Exception as e:
                import traceback
                traceback.print_exc()
    
        # ... 其他代码 ...

    在这个类中,我们定义了一个Controller类,用于监听键盘和鼠标事件。根据按键的不同,我们可以执行不同的操作,例如启动键盘按键模拟、鼠标点击等。

    5. 创建自动化操作

    现在,我们可以创建自动化的操作,例如模拟键盘按键和鼠标点击。以下是示例代码:

    class Controller:
        # ... 其他代码 ...
    
        def start_keyboard_press_key(self):
            for key, interval in key_time_dict.items():
                if key in pyautogui.KEYBOARD_KEYS:
                    print("启动线程, 按键: ", key, " 间隔: ", interval)
                    t = threading.Thread(target=self.press_key, args=(key, interval))
                    t.daemon = True
                    t.start()
                else:
                    print(f"Key: {key} is not a valid key")
    
        def press_key(self, key, interval):
            print("按键: ", key, " 间隔: ", interval)
            while True:
                if self.keyboard_stop_flag:
                    break
                pyautogui.press(key)
                time.sleep(interval)
    
        def start_mouse_auto_click_key(self, status):
            print("启动鼠标自动点击线程... ")
            if status == self.MOUSE_STATUS_CLICK:
                print(f"鼠标自动点击... delay:{window.mouseDelay.value()}")
                delay = window.mouseDelay
    
    .value()
                t = threading.Thread(target=self.mouse_click, args=(delay,))
                t.daemon = True
                t.start()
            elif status == self.MOUSE_STATUS_PRESS:
                print("鼠标长按... ")
                mouseC = mouse.Controller()
                pyautogui.mouseDown()
                t = threading.Thread(target=self.mouse_press)
                t.daemon = True
                t.start()
    
        def mouse_click(self, interval):
            print("鼠标自动点击, 间隔: ", interval)
            while True:
                if self.mouse_auto_stop_flag:
                    break
                # 获取鼠标当前位置
                print("指定的坐标... {}, {}".format(mouseX, mouseY))
                if mouseX == 0 and mouseY == 0:
                    mouseXx, mouseYy = pyautogui.position()
                else:
                    mouseXx = mouseX
                    mouseYy = mouseY
                pyautogui.click(int(mouseXx), int(mouseYy))
                time.sleep(interval)
    
        def mouse_press(self):
            print("开启鼠标长按... ")
            while True:
                if self.mouse_auto_stop_flag:
                    # 释放鼠标左键并退出循环
                    pyautogui.mouseUp()
                    print("鼠标长按结束")
                    break
                print("鼠标长按中... ")
                time.sleep(0.3)

    这个部分的代码用于启动键盘按键模拟和鼠标点击操作。根据用户的设置,它可以实现自动点击、长按和模拟按键等功能。

    6. 启动监听器

    最后,我们需要启动监听器来监控键盘和鼠标事件。我们在主程序中创建了一个start_listener函数,该函数启动了监听键盘和鼠标事件的线程。以下是示例代码:

    def start_listener():
        game_title = "Your Game Title"  # 替换为你的游戏窗口标题
        global controller
        controller = Controller()
        # 启动一个守护线程
        print("启动线程监听...")
        daemon = threading.Thread(target=keyboard_listener, args=(controller,))
        daemon.daemon = True
        daemon.start()
        daemon = threading.Thread(target=mouse_listener, args=(controller,))
        daemon.daemon = True
        daemon.start()
    
    def keyboard_listener(args):
        print("启动线程监听键盘...")
        controller = args
        with keyboard.Listener(
                on_press=controller.on_press,
                on_release=controller.on_release) as listener:
            listener.join()
    
    def mouse_listener(args):
        print("启动线程监听鼠标...")
        controller = args
        with mouse.Listener(
                on_click=controller.on_mouse_press,
                on_release=controller.on_mouse_release) as listener:
            listener.join()

    通过这些代码,我们可以启动监听器来监控键盘和鼠标事件,然后根据用户的设置执行相应的自动化操作。

    7. 总结

    通过创建一个自动化按键和鼠标点击工具,你可以轻松地执行重复性的操作,提高工作效率。这个工具可以用于各种应用场景,包括游戏、自动化测试、数据录入等。希望本教程对你有所帮助,让你更好地掌握自动化操作的技巧。

  • 如何刷机并安装OpenWrt系统到360 T7路由器

    如何刷机并安装OpenWrt系统到360 T7路由器

    嗨,各位技术达人!你是否曾想过将你的360 T7路由器升级到更强大的OpenWrt系统,以获得更多的功能和性能?如果是的话,你来对地方了。本文将为你详细介绍如何刷机并安装OpenWrt系统到你的360 T7路由器,让你充分释放这个性价比极高的设备的潜力。

    第一步:准备工作

    在开始刷机之前,确保你已经准备好以下材料和条件:

    • 一台360 T7路由器
    • 一台运行Windows的电脑(需要有以太网插口)
    • USB转TTL模块(可以在淘宝等平台购买)
    • 一根公对母的杜邦线(用于连接TTL模块和路由器)
    • 下载好的OpenWrt固件

    第二步:开启Telnet

    开始之前,我们需要将路由器进入Telnet模式,这需要一些步骤:

    1. 打开360 T7路由器的底部,你会看到两颗螺丝,用螺丝刀将它们拧下来。注意:底盖可能会有很多卡扣,需要用力打开。
    2. 打开底部后,你会看到TTL串口,上面有RXD、TXD、GND三个引脚。使用杜邦线将这些引脚连接到TTL模块(路由器的RXD连接到模块的TXD,路由器的TXD连接到模块的RXD,GND连接到GND)。
    3. 使用串口调试助手(如Termius)连接到TTL模块,选择正确的COM口和波特率115200,然后连接。

    现在,你将能够看到路由器的开机日志输出。接下来,我们将进入Failsafe模式,输入”f”(需要回车换行)并观察日志,直到看到成功进入Failsafe模式的信息。

    第三步:刷入U-Boot

    在Failsafe模式下,你可以输入以下命令来刷入U-Boot:

    fw_setenv bootmenu_delay 3
    mount_root
    sed -i 's/.*local debug=.*/\tlocal debug=1/' /etc/init.d/telnet
    passwd root
    # 输入两次相同的密码
    password
    password
    reboot

    这些命令的作用是开启U-Boot控制台菜单、挂载rootfs并开启Telnet,然后修改root密码并重启路由器。

    第四步:刷入U-Boot并安装OpenWrt

    重启后,你将能够正常配置你的路由器。现在,你可以通过Telnet连接到路由器的U-Boot界面,并使用以下命令来刷入U-Boot并安装OpenWrt:

    cd /tmp
    wget https://sebs.oss-cn-shanghai.aliyuncs.com/360t7-fip-fixed-parts.bin
    mtd write 360t7-fip-fixed-parts.bin fip

    刷入U-Boot后,路由器将自动重启并进入新的OpenWrt固件。你可以重新安装好底盖并开始享受OpenWrt系统的强大功能。

    第五步:配置OpenWrt

    要配置OpenWrt系统,你可以通过浏览器访问默认的后台地址:192.168.6.1。默认的用户名是root,密码是你之前设置的密码(在刷U-Boot时设置)。

    现在,你可以自由配置OpenWrt系统,包括Wi-Fi设置、网络配置、安全性等。

    性能测试

    你的360 T7现在已经刷入了OpenWrt系统,让我们看看它的性能表现:

    • CoreMark跑分:8803.7,显示CPU性能较好。
    • 科学性能:在合适的设置下,能够达到800Mbps以上的性能,这将满足大多数家庭的需求。
    • HWNAT硬件加速:能够轻松达到1000Mbps宽带,而CPU几乎不占用。

    无线信号也非常强大,能够在近距离和隔墙距离下提供快速稳定的连接。

    结语

    通过刷机并安装OpenWrt系统,你的360 T7路由器将获得更多功能和更强大的性能,让你充分发挥这个性价比极高的设备的潜力。虽然刷机需要一些技术操作,但遵循正确的步骤,你将能够成功完成并享受更好的路由器性能。

    希望这篇教程对你有所帮助。如果你有任何问题或需要更多帮助,请随时留言。

  • 制作一个二维码识别工具:使用Python和PyQt5

    制作一个二维码识别工具:使用Python和PyQt5

    你是否曾经想过制作一个简单的二维码识别工具,让你能够通过摄像头捕捉二维码并获取其中的信息?如果是的话,那么你来对地方了!在本教程中,我们将使用Python和PyQt5创建一个简单的二维码识别工具。无需担心编程经验,我们将逐步引导你完成整个过程。

    准备工作

    在开始之前,确保你的计算机上已经安装了以下工具和库:

    • Python:确保你已经安装了Python。如果没有,你可以从Python官方网站下载并安装。

    • PyQt5:PyQt5是一个用于创建GUI应用程序的Python库。你可以使用以下命令安装它:

      pip install PyQt5
    • OpenCV:OpenCV是一个计算机视觉库,用于处理图像和视频。你可以使用以下命令安装它:

      pip install opencv-python
    • pyzbar:pyzbar是一个用于解码二维码的库。你可以使用以下命令安装它:

      pip install pyzbar

    创建二维码识别工具

    现在,让我们开始创建我们的二维码识别工具。

    导入必要的库

    首先,我们需要导入必要的Python库和模块。这些库包括PyQt5、OpenCV和pyzbar。此外,我们还需要一些其他的库来帮助我们管理图形用户界面(GUI)。

    import cv2
    from PIL import Image
    from pyzbar.pyzbar import decode
    import sys
    from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit, QLabel, QGridLayout, QMessageBox
    from PyQt5.QtCore import QTimer, QCoreApplication

    创建GUI

    接下来,我们将创建一个简单的GUI,用于显示摄像头捕捉的图像以及解码后的二维码信息。

    class MyQRRec(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.setGeometry(300, 200, 850, 650)
            self.setWindowTitle('二维码识别')
            grid = QGridLayout()
            self.setLayout(grid)
            grid.setSpacing(10)
    
            titleEdit = QTextEdit()
            titlePrompt = QLabel('把二维码放在摄像头前面:')
            grid.addWidget(titlePrompt, 1, 1)
            grid.addWidget(titleEdit, 2, 1)
    
            self.show()

    在上述代码中,我们创建了一个名为MyQRRec的QWidget子类,该子类用于显示GUI界面。我们使用QGridLayout来管理界面布局,并在界面上添加了一个用于显示解码后信息的文本框。

    捕捉摄像头图像

    现在,让我们添加代码来捕捉摄像头的图像并进行二维码识别。

    class MyQRRec(QWidget):
        # ...(之前的代码)
    
        def start_camera(self):
            self.cap = cv2.VideoCapture(0)
    
            cv2.namedWindow('Camera Feed')
            while not isExit:
                ret, frame = self.cap.read()
                frame = cv2.flip(frame, 1)
    
                cv2.imshow('Camera Feed', frame)
                x = decode(frame)
                app.processEvents()
                if x:
                    y = x[0].data.decode()
                    if y != lastResult:
                        titleEdit.setPlainText(titleEdit.toPlainText() + y)
                        lastResult = y
    
            self.cap.release()
            cv2.destroyAllWindows()
            sys.exit()
            QCoreApplication.instance().quit
    
        # ...(之后的代码)

    在上述代码中,我们创建了一个名为start_camera的方法,该方法用于启动摄像头并捕捉图像。我们使用OpenCV来访问摄像头,并在窗口中显示摄像头捕捉的图像。然后,我们使用pyzbar来解码图像中的二维码,并将解码结果显示在GUI的文本框中。

    关闭应用程序

    最后,我们需要添加代码来关闭应用程序。

    class MyQRRec(QWidget):
        # ...(之前的代码)
    
        def closeEvent(self, event):
            global isExit
            isExit = True

    在上述代码中,我们创建了一个名为closeEvent的方法,该方法在关闭应用程序时被调用,它将全局变量isExit设置为True,以停止摄像头捕捉。

    主函数

    最后,我们创建了主函数来运行应用程序。

    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = MyQRRec()
        sys.exit(app.exec_())

    运行二维码识别工具

    现在,你已经创建了一个简单的二维码识别工具,可以通过摄像头捕捉二维码并显示其内容。要运行应用程序,只需运行上述代码。

    总结

    通过本教程,你学会了如何使用Python和PyQt5创建一个简单的二维码识别工具。这个工具可以捕捉摄像头的图像,识别二维码,并显示其内容。你可以进一步扩展这个工具,添加更多功能,如保存识别的二维码图片或将识别结果保存到文件中。

    希望这个教程能帮助你开始使用Python和PyQt5创建自己的图形用户界面应用程序。祝你好运!

  • 如何用Python编写一个有趣的贪吃蛇小游戏

    如何用Python编写一个有趣的贪吃蛇小游戏

    在这个快节奏的时代,人们总是寻找能够娱乐和挑战自己的方式。其中,小游戏一直是大家喜欢的消遣方式之一。在这篇文章中,我们将带你一起探索如何使用Python编写一个有趣的贪吃蛇小游戏。无需编程经验,只要跟随本教程,你就能轻松创建自己的游戏。接下来,让我们开始这个游戏开发之旅吧!

    准备工作

    在开始编写贪吃蛇游戏之前,你需要确保已经安装了Python和Pygame库。如果你还没有安装,可以按照以下步骤进行操作:

    1. 安装Python:访问Python官方网站,下载并安装最新版本的Python。

    2. 安装Pygame库:打开命令行(Windows用户可以使用命令提示符,Mac和Linux用户可以使用终端),运行以下命令来安装Pygame库:

      pip install pygame

      这将自动下载并安装Pygame库。

    现在,我们已经准备好开始编写贪吃蛇游戏了。

    编写游戏代码

    导入所需的库

    首先,我们需要导入Pygame库以及一些其他必要的库。这些库将帮助我们创建游戏窗口、处理用户输入和管理游戏逻辑。

    import pygame
    import random

    初始化游戏

    在我们开始创建游戏窗口之前,我们需要初始化Pygame。

    pygame.init()

    设置游戏窗口

    我们将定义游戏窗口的尺寸和标题。

    window_width = 400
    window_height = 400
    window = pygame.display.set_mode((window_width, window_height))
    pygame.display.set_caption("贪吃蛇游戏")

    定义游戏颜色

    为了在游戏中使用颜色,我们需要定义一些常见的颜色。

    black = (0, 0, 0)
    green = (0, 255, 0)

    定义蛇的初始位置和速度

    我们需要为蛇定义初始位置、长度和移动速度。

    snake_x = 50
    snake_y = 50
    snake_speed = 10

    定义蛇的初始长度和方向

    蛇的初始长度为1,方向为向右移动。

    snake_length = 1
    snake_direction = 'right'

    主循环

    游戏的核心部分是一个无限循环,该循环在用户关闭游戏窗口之前一直运行。在每次循环中,我们需要检查用户的输入,移动蛇并更新游戏界面。

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

    绘制蛇和食物

    我们需要编写函数来绘制蛇和食物。这些元素将在游戏窗口上显示。

    def draw_snake(snake_x, snake_y, snake_list):
        for segment in snake_list:
            pygame.draw.rect(window, green, [segment[0], segment[1], 10, 10])
    
    def draw_food(food_x, food_y):
        pygame.draw.rect(window, green, [food_x, food_y, 10, 10])

    移动蛇

    在主循环中,我们将根据用户输入来移动蛇。

    if snake_direction == 'right':
        snake_x += snake_speed
    elif snake_direction == 'left':
        snake_x -= snake_speed
    elif snake_direction == 'up':
        snake_y -= snake_speed
    elif snake_direction == 'down':
        snake_y += snake_speed

    检测碰撞

    我们需要编写函数来检测蛇是否碰到了边界或食物。如果蛇吃到了食物,我们将增加蛇的长度并生成新的食物。

    def check_collision(snake_x, snake_y, snake_list, food_x, food_y):
        if snake_x >= window_width or snake_x < 0 or snake_y >= window_height or snake_y < 0:
            return True
        for segment in snake_list:
            if segment == [food_x, food_y]:
                return True
        return False

    游戏结束

    如果游戏结束,我们将显示游戏结束消息,并在用户按下空格键后重新开始游戏。

    def game_over():
        font = pygame.font.Font(None, 36)
        text = font.render("游戏结束!", True, black)
        window.blit(text, [window_width / 2 - 100, window_height / 2 - 50])
        pygame.display.update()
        pygame.time.wait(2000)
    
        # 重新初始化游戏
        snake_x = 50
        snake_y = 50
        snake_length = 1
        snake_direction = 'right'
        snake_list = []

    主游戏循环

    现在,我们需要将上面的所有代码整合到主游戏循环中。在每个循环中,我们将检查用户的输入,移动蛇,检测碰撞并更新游戏窗口。

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
    
        # 检测用户输入并改变蛇的方向
        keys = pygame.key.get_pressed()
        if keys[pygame.K_RIGHT]:
            snake_direction = 'right'
        if keys[pygame.K_LEFT]:
            snake_direction = 'left'
        if keys[pygame.K_UP]:
            snake_direction = 'up'
        if keys[pygame.K_DOWN
    
    ]:
            snake_direction = 'down'
    
        # 移动蛇
        if snake_direction == 'right':
            snake_x += snake_speed
        elif snake_direction == 'left':
            snake_x -= snake_speed
        elif snake_direction == 'up':
            snake_y -= snake_speed
        elif snake_direction == 'down':
            snake_y += snake_speed
    
        # 检测碰撞
        if check_collision(snake_x, snake_y, snake_list, food_x, food_y):
            game_over()
    
        # 更新蛇的位置
        snake_head = [snake_x, snake_y]
        snake_list.append(snake_head)
        if len(snake_list) > snake_length:
            del snake_list[0]
    
        # 生成新的食物
        if snake_x == food_x and snake_y == food_y:
            food_x = random.randrange(0, window_width, 10)
            food_y = random.randrange(0, window_height, 10)
            snake_length += 1
    
        # 清空游戏窗口
        window.fill(black)
    
        # 绘制蛇和食物
        draw_snake(snake_x, snake_y, snake_list)
        draw_food(food_x, food_y)
    
        pygame.display.update()

    运行游戏

    现在,你已经完成了贪吃蛇游戏的编写。要运行游戏,只需在命令行中运行你的Python脚本,你将看到一个小窗口中的贪吃蛇游戏。

    结语

    通过本教程,你学会了如何使用Python和Pygame库编写一个简单的贪吃蛇小游戏。这只是游戏开发的入门,你可以进一步扩展和改进游戏,添加更多功能和特效,使其更加有趣和挑战性。

    希望你喜欢这个项目,玩得开心!如果你有任何问题或想要了解更多游戏开发的内容,请随时留言,我们会尽力提供帮助。


    这篇文章教你如何使用Python编写一个有趣的贪吃蛇小游戏,无需编程经验,只要跟随本教程,你就能轻松创建自己的游戏。我们首先介绍了准备工作,然后详细讲解了游戏代码的编写过程,包括初始化游戏、设置游戏窗口、定义游戏颜色、蛇的初始位置和速度、蛇的初始长度和方向、主循环、绘制蛇和食物、移动蛇、检测碰撞、游戏结束以及主游戏循环。最后,我们教你如何运行游戏,并鼓励你扩展和改进游戏,添加更多功能和特效,使其更加有趣和挑战性。希望这个教程对你有所帮助,玩得开心!