Category: 技术折腾

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

  • 如何使用tiktoken计算文本中的标记数

    如何使用tiktoken计算文本中的标记数

    在现代自然语言处理中,标记是一种重要的概念,因为它们是语言模型处理文本的基本单元。本教程将向您展示如何使用OpenAI开源的快速分词工具tiktoken来计算文本中的标记数。通过了解文本中有多少标记,您可以:

    1. 判断文本是否太长以至于超出模型处理的限制。
    2. 了解使用OpenAI API调用的成本,因为计费是按标记计算的。

    1. 引言故事

    假设您是一名程序员,正在为自己的聊天应用项目编写代码。您已经集成了一个强大的自然语言处理模型,但现在需要确定用户输入的文本有多少标记,以便确保不会超出模型的限制。在解决这个问题之前,您曾不止一次被意想不到的文本长度问题困扰。一天,您在互联网上发现了一个名为tiktoken的开源工具,它能够快速准确地计算文本中的标记数。这似乎是您解决问题的完美工具,因此您决定深入了解它并开始使用它来解决您的标记计数问题。

    2. 安装tiktoken

    首先,您需要安装tiktoken工具。您可以使用pip来安装它:

    pip install --upgrade tiktoken

    安装完成后,您就可以开始使用tiktoken来计算文本中的标记数了。

    3. 导入tiktoken

    在您的Python项目中,首先导入tiktoken库:

    import tiktoken

    4. 加载编码

    接下来,您需要加载一个编码,以告诉tiktoken如何将文本转换为标记。不同的模型使用不同的编码。在本示例中,我们使用了“cl100k_base”编码,它适用于一些OpenAI模型,包括gpt-4和gpt-3.5-turbo。您可以这样加载编码:

    encoding = tiktoken.get_encoding("cl100k_base")

    5. 使用编码.encode()方法将文本转换为标记

    现在,您可以使用编码对象的.encode()方法将文本转换为标记。该方法将文本字符串转换为标记的整数列表。例如,如果我们有文本字符串”tiktoken is great!”,您可以这样做:

    tokens = encoding.encode("tiktoken is great!")

    这将返回一个整数列表,代表文本中的标记。在这个示例中,返回的标记列表为[83, 1609, 5963, 374, 2294, 0]。

    要计算文本中的标记数,只需查看标记列表的长度:

    num_tokens = len(tokens)

    这将给您文本中的标记数,本例中为6个标记。

    6. 使用编码.decode()方法将标记转换回文本

    如果您需要将标记转换回文本,可以使用编码对象的.decode()方法。例如,如果我们有标记列表[83, 1609, 5963, 374, 2294, 0],您可以这样做:

    text = encoding.decode([83, 1609, 5963, 374, 2294, 0])

    这将返回文本字符串”tiktoken is great!”。

    请注意,虽然.decode()方法可以应用于单个标记,但对于不在utf-8边界上的标记,它可能会导致信息丢失。对于单个标记,.decode_single_token_bytes()方法可以安全地将单个整数标记转换为其表示的字节。

    7. 比较不同编码

    不同编码在分割单词、分组空格和处理非英文字符方面有所不同。使用上述方法,我们可以比较不同编码在几个示例字符串上的效果。以下是一个比较不同编码的函数示例:

    def compare_encodings(example_string: str) -> None:
        """打印三种字符串编码的比较结果。"""
        # 打印示例字符串
        print(f'\n示例字符串: "{example_string}"')
        # 对于每个编码,打印标记数、标记整数和标记字节
        for encoding_name in ["r50k_base", "p50k_base", "cl100k_base"]:
            encoding = tiktoken.get_encoding(encoding_name)
            token_integers = encoding.encode(example_string)
            num_tokens = len(token_integers)
            token_bytes = [encoding.decode_single_token_bytes(token) for token in token_integers]
            print()
            print(f"{encoding_name}: {num_tokens} 个标记")
            print(f"标记整数: {token_integers}")
            print(f"标记字节: {token_bytes}")
    
    compare_encodings("antidisestablishmentarianism")

    8. 为聊天完成API调用计算标记数

    对于像gpt-3.5-turbo和gpt-4这样的ChatGPT模型,它们使用标记方式与较早的完成模型相同,但由于它们基于消息格式,因此更难计算消息将使用多少标记。

    以下是一个用于计算传递给gpt-3.5-turbo或gpt-4的消息标记数的示例函数。请注意,从消息中计算标记的方式可能会因模型而异。考虑到下面的函数中计算的标记数量是一个估计值,而不是一个永恒的保证。

    def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613"):
        """返回消息列表使用的标记数。"""
        try:
            encoding
    
     = tiktoken.get_encoding(model)
        except Exception as e:
            print(f"获取编码时发生错误:{e}")
            return None
    
        total_tokens = 0
        for message in messages:
            tokens = encoding.encode(message["content"])
            num_tokens = len(tokens)
            # 添加额外的标记以表示用户或系统角色
            if message["role"] == "system":
                num_tokens += 1
            else:
                num_tokens += 2  # 一个用于角色,一个用于分隔符
            total_tokens += num_tokens
    
        return total_tokens
    
    # 示例消息列表
    messages = [
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Tell me a joke."},
        {"role": "assistant", "content": "Why did the chicken cross the road?"},
        {"role": "user", "content": "I don't know, why did the chicken cross the road?"}
    ]
    
    total_tokens = num_tokens_from_messages(messages, model="gpt-3.5-turbo-0613")
    print(f"消息列表中的总标记数:{total_tokens}")

    这个函数可以帮助您估算给定消息列表的标记数,以便控制文本长度和计费。请注意,不同模型的标记数限制可能会有所不同,因此在实际使用中请谨慎估算。

  • 如何使用PHP获取本机IPv4和IPv6地址

    如何使用PHP获取本机IPv4和IPv6地址

    在这个高度互联的时代,我们对于网络连接的依赖无处不在。无论是在服务器上运行网站,还是在树莓派上搭建物联网项目,获取本机的IPv4和IPv6地址都是至关重要的。这些地址是我们设备与互联网交流的通道,也是实现各种网络功能的基础。在这篇文章中,我们将探讨如何使用PHP编程语言获取本机的IPv4和IPv6地址,以便更好地管理网络连接和实现各种应用。

    步骤一:了解IPv4和IPv6的区别

    IPv4和IPv6都是用于标识网络上设备的地址协议,但它们有一些重要的区别。IPv4采用32位地址,而IPv6采用128位地址。IPv4地址已经枯竭,而IPv6地址则更为充足。在开始获取本机地址之前,了解这些基本知识对于正确选择适当的地址协议至关重要。

    步骤二:使用PHP编写获取IPv4地址的代码

    首先,我们将探讨如何使用PHP编写代码来获取本机的IPv4地址。PHP提供了一些内置函数和变量,可以轻松实现这一目标。以下是一个简单的示例:

    <?php
    $ipv4 = gethostbyname(gethostname());
    echo "本机IPv4地址是:" . $ipv4;
    ?>

    这段代码中,我们使用了gethostbyname()函数来获取主机名对应的IPv4地址,并将结果打印出来。这是一个简单而有效的方法来获取本机的IPv4地址。

    步骤三:使用PHP编写获取IPv6地址的代码

    如果你的网络环境支持IPv6,并且你需要获取IPv6地址,那么我们也可以使用PHP编写相应的代码。以下是一个示例:

    <?php
    $ipv6 = gethostbyname("ipv6.google.com");
    echo "本机IPv6地址是:" . $ipv6;
    ?>

    这段代码中,我们使用gethostbyname()函数来获取ipv6.google.com的IPv6地址。这个地址通常是本机的IPv6地址之一。请注意,获取IPv6地址可能需要确保网络环境已经启用了IPv6支持。

    步骤四:处理异常情况

    在获取IPv4和IPv6地址时,可能会遇到一些异常情况,例如网络连接断开或无法解析主机名。为了确保代码的稳定性,我们可以使用异常处理机制来捕获并处理这些异常。以下是一个简单的异常处理示例:

    <?php
    try {
        $ipv4 = gethostbyname(gethostname());
        echo "本机IPv4地址是:" . $ipv4;
    } catch (Exception $e) {
        echo "无法获取IPv4地址:" . $e->getMessage();
    }
    
    try {
        $ipv6 = gethostbyname("ipv6.google.com");
        echo "本机IPv6地址是:" . $ipv6;
    } catch (Exception $e) {
        echo "无法获取IPv6地址:" . $e->getMessage();
    }
    ?>

    这段代码中,我们使用try和catch块来捕获可能发生的异常,并提供相应的错误消息。

    步骤五:完善和优化代码

    获取本机的IPv4和IPv6地址只是一个简单的示例。在实际应用中,你可能需要更多的错误处理、地址验证和网络连接管理。此外,你还可以考虑将获取地址的功能封装成一个函数,以便在不同的项目中重复使用。

    结论

    获取本机的IPv4和IPv6地址是网络编程中的一个基本任务。使用PHP编程语言,我们可以轻松实现这一目标,无论是在服务器上还是在树莓派等嵌入式设备上。通过了解IPv4和IPv6的区别,编写相应的PHP代码,并进行异常处理,我们可以更好地管理网络连接并实现各种网络应用。

    无论你是一个网络管理员还是一个网络编程爱好者,掌握如何获取本机地址的技能都将为你在网络世界中的冒险提供强大的支持。

  • 使用Python创建带有特殊二维码的教程

    使用Python创建带有特殊二维码的教程

    有一天,王大神在他的办公室里坐着,思考着如何将编程技能与二维码相结合,以创建一种特殊的二维码。这个特殊的二维码不仅可以存储信息,还可以嵌入一些有趣的元素。于是,他开始了一项探索之旅,想要与你分享他的发现。

    准备工作

    在开始之前,我们需要准备一些东西:

    • Python编程知识
    • 一个二维码生成库(我们将使用qrcode库)
    • 一些有趣的元素,例如彩色的图像或徽标

    步骤1:安装qrcode库

    首先,确保你已经安装了qrcode库。如果没有安装,你可以使用以下命令在Python中安装它:

    pip install qrcode[pil]

    步骤2:生成基本二维码

    我们将从生成基本的二维码开始。下面是一个简单的Python代码示例,用于生成一个包含文本信息的基本二维码:

    import qrcode
    
    data = "Hello, World!"  # 你可以替换成你想要的文本信息
    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(data)
    qr.make(fit=True)
    
    img = qr.make_image(fill_color="black", back_color="white")
    img.save("basic_qr.png")

    运行上述代码后,你将在当前目录下看到一个名为basic_qr.png的图片,其中包含了你输入的文本信息的二维码。

    步骤3:添加特殊元素

    现在,让我们来让这个二维码变得特殊起来。你可以添加一些有趣的元素,比如一张图片,作为二维码的一部分。这将使你的二维码更加吸引人。

    首先,确保你有一张你想要添加到二维码中的图片。然后,使用以下代码示例来将图片嵌入到二维码中:

    from PIL import Image
    
    # 打开你想要嵌入的图片
    icon = Image.open("icon.png")  # 替换成你的图片文件名
    
    # 创建一个新的QRCode对象
    qr_with_icon = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_H,
        box_size=10,
        border=4,
    )
    qr_with_icon.add_data(data)
    qr_with_icon.make(fit=True)
    
    # 创建一个二维码图片
    img_with_icon = qr_with_icon.make_image(fill_color="black", back_color="white")
    
    # 将图标嵌入到二维码中心
    img_with_icon.paste(icon, (50, 50))  # 调整图标的位置
    
    # 保存最终的特殊二维码图片
    img_with_icon.save("special_qr.png")

    这段代码将打开你选择的图片,并将其嵌入到二维码中心。保存后,你将得到一个特殊的二维码,其中包含了你的文本信息和添加的图片元素。

    结论

    通过这个教程,我们学会了如何使用Python和qrcode库创建特殊的二维码。你可以进一步探索,添加更多有趣的元素,以使你的二维码更加个性化和吸引人。希望你能享受这个创意的过程!

  • 优化签到流程:如何轻松自动签到并获取验证码

    优化签到流程:如何轻松自动签到并获取验证码

    你是否曾经厌倦了每天手动签到的重复工作?是否希望能够自动化这一过程,省下宝贵的时间?在这篇文章中,我将向你展示如何通过Python编写一个自动签到脚本,使签到过程更加便捷和高效。我们将使用Python的requests库来发送网络请求,并借助第三方验证码识别服务,自动获取验证码并完成签到。让我们一起来看看如何实现这一目标吧。

    步骤一:获取验证码

    首先,我们需要从签到网站获取验证码图片。这个过程涉及发送GET请求来获取验证码图片,然后将其传递给验证码识别服务。在这里,我们使用了一个名为imgcode_online的函数来完成这个任务。这个函数接受验证码图片的URL作为参数,将其转换为base64编码的数据,并将其发送到一个在线验证码识别服务。该服务将返回识别后的验证码文本。

    def imgcode_online(imgurl):
        data = {
            'token': token,  # 验证码识别服务的token
            'type': 'online',
            'uri': imgurl
        }
        response = requests.post('http://www.bhshare.cn/imgcode/', data=data)
        result = json.loads(response.text)
        if result['code'] == 200:
            return result['data']
        else:
            return 'error'

    步骤二:检查签到时间

    在签到之前,我们需要检查是否到达签到时间。为了做到这一点,我们首先需要发送GET请求来获取上次签到的时间,并将其转换为时间戳。然后,我们将当前时间与上次签到时间进行比较,如果时间间隔大于24小时,就说明可以进行签到。

    def tly():
        signUrl = "https://tly30.com/modules/index.php"
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
            'Cookie': cookie
        }
    
        res = requests.get(url=signUrl, headers=header).text
        signtime = getmidstring(res, '<p>上次签到时间:<code>', '</code></p>')
        timeArray = time.strptime(signtime, "%Y-%m-%d %H:%M:%S")
        timeStamp = int(time.mktime(timeArray))
        t = int(time.time())
    
        if t - timeStamp > 86400:
            print("距上次签到时间大于24小时啦,可以签到")
            # 签到操作
            captchaUrl = "https://tly30.com/other/captcha.php"
            signurl = "https://tly30.com/modules/_checkin.php?captcha="
            header = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
                'Cookie': cookie
            }
            res1 = requests.get(url=captchaUrl, headers=header)
            base64_data = base64.b64encode(res1.content)
            oocr = imgcode_online('data:image/jpeg;base64,' + str(base64_data, 'utf-8'))
            res2 = requests.get(url=signurl + oocr.upper(), headers=header).text
            print(res2)
        else:
            print("还未到时间!", t - timeStamp)

    总结

    通过这个简单的Python脚本,我们可以轻松地自动签到并获取验证码,省去了手动操作的麻烦。你可以将这个脚本设置为定时任务,每天自动完成签到。这不仅提高了签到的效率,还让你有更多的时间专注于其他重要的事情。

    希望这篇文章对你有所帮助,让你更好地理解如何使用Python自动化网站操作。如果你有任何问题或建议,欢迎在评论中分享。祝你签到顺利!

  • 从进程池到线程池:实现高效图片下载

    从进程池到线程池:实现高效图片下载

    在数字时代,我们每天都能够轻松访问到各种各样的图片,不论是美景、艺术品还是有趣的表情包。然而,有时候我们需要大量的图片数据,例如用于机器学习的训练集或者简单的个人收藏。在这种情况下,如何高效地获取和保存这些图片就成了一个挑战。今天,我将向大家介绍一种使用进程池和线程池相结合的方法,以实现高效的图片下载。

    准备工作

    首先,让我们明确一下需要的准备工作。我们将使用Python来完成这个任务,所以确保你已经安装了Python环境。此外,我们还需要以下库:

    • requests:用于发送HTTP请求和获取网页内容。
    • lxml:用于解析HTML文档。
    • multiprocessing:用于创建进程池和进程共享变量。
    • concurrent.futures:用于创建线程池。

    确保你已经安装了这些库,如果没有,可以使用pip来安装。

    获取图片地址

    首先,我们需要获取要下载的图片的地址。在这个例子中,我们将从一个网站上抓取动漫壁纸的图片地址。我们使用了requests库来发送GET请求,然后使用lxml来解析HTML文档,提取出图片的地址。这些地址将被放入一个进程队列中,以便后续的下载。

    # 获取图片地址
    def get_url(url, que):
        resp = requests.get(url, headers=headers)
        resp.encoding = resp.apparent_encoding
        date = resp.text
        tree = etree.HTML(date)
        list_url = tree.xpath('//ul[@class="clearfix"]/li/a')
        for i in list_url:
            url_img = i.xpath('./img/@src')
            que.put('https://pic.netbian.com' + str(*url_img))  # put写入进程变量队列中
        resp.close()

    下载并保存图片

    接下来,我们需要编写函数来下载并保存图片。我们使用requests库发送GET请求,然后将图片保存到本地。为了避免文件名冲突,我们可以使用一个共享的数值型变量来为每张图片分配一个唯一的文件名。这个变量会在多个进程之间共享,确保每张图片的文件名都不同。

    # 下载并保存图片
    def download_ove(url, name):
        try:
            resp = requests.get(url, headers=headers)
            path_img = os.path.join(path, f'{name.value}.jpg')
            with open(path_img, 'wb') as f:
                f.write(resp.content)
            print(f'保存成功{name.value}.jpg')
            name.value += 1  # 数值型进程变量自增
        except Exception as ex:
            print('下载出错', ex)

    下载图片的主函数

    现在,让我们来编写下载图片的主函数。我们使用了线程池来并发下载图片,这样可以提高下载速度。通过创建一个ThreadPoolExecutor对象,我们可以指定同时运行的线程数量,这里设置为20。然后,我们从进程队列中获取图片地址,并将下载任务提交给线程池处理。

    # 获取进程队列中的url并启用线程池下载保存图片
    def download_img(que, name):
        # 创建线程池,指定20个线程处理数据
        with ThreadPoolExecutor(20) as t:
            while True:
                try:
                    s = que.get(timeout=3)  # 获取进程队列中的数据,等待3秒若是还没获取到数据抛出异常
                    t.submit(download_ove, s, name)  # 添加进线程池
                except Exception as ec:
                    print(ec)
                    break

    异常处理

    在我们的代码中,我们还加入了异常处理机制。如果下载出现错误,我们会捕获异常并打印出错信息。这有助于我们及时发现问题并进行处理。

    # 接收进程池与线程池异常的回调函数
    def err_call_back(err):
        print(f'出错啦~ error:{str(err)}')

    执行主程序

    最后,我们在主程序中执行上述函数。我们首先创建了一个进程共享的队列变量和一个数值型的共享变量,用于存储图片地址和文件名计数。然后,我们根据需要获取多个页面的图片地址,将下载任务提交给进程池,并等待任务完成。这样,我们就能够高效地下载大量图片了。

    if __name__ == '__main__':
        if not os.path.exists(path):
            os.mkdir(path)
        que = multiprocessing.Manager().Queue()  # 创建一个进程之间共享的队列变量
        name = multiprocessing.Manager().Value('i', 0)  # 创建一个进程之间共享的数值型变量,'i'表示整型数字,0表示从0开始
        for i in range(1, 4):
            if i != 1:
                url = f'https://pic.netbian.com/4kdongman/index_{i}.html'
            else:
                url = 'https://pic.netbian.com/4kdongman/'
            get_url(url, que)
            #  创建进程池,并将函数添加到进程池内,指定最多开辟1个进程处理数据(开多了怕把网址玩崩)
            with multiprocessing.Pool(1) as pool:
                pool.apply(download_img, args=(que, name))  # 将函数以同步的方式添加进进程池
        pool.close()  # 结束进程池,不在往内添加数据
        pool.join()  # 等待进程池运行结束
        print('结束')

    结束语

    通过使用进程池和线程池的组合,我们能够高效地下载大量图片,提高了任务的并发性和效率。这种方法对于需要大规模获取图片数据的任务非常有用,例如构建图像数据集或爬取网站上的图片资源。

    希望这个教程对你有所帮助,如果你有任何问题或建议,欢迎在评论中留言。祝愿你在图片下载任务中取得成功!

  • 争议背后的AI伦理问题:GitHub Copilot与开源许可证

    争议背后的AI伦理问题:GitHub Copilot与开源许可证

    在数字时代,人工智能(AI)的迅猛发展已经深刻地影响了软件开发和编程领域。GitHub Copilot作为一款由微软开发的机器学习驱动的代码助手,为程序员提供了强大的功能,然而,它也引发了一系列关于AI伦理的争议。在本文中,我们将深入探讨GitHub Copilot的争议,特别是与开源软件许可证相关的问题。

    GitHub Copilot:AI革命的一部分

    GitHub Copilot的出现被许多人视为编程领域的一项巨大突破。它是一款与Visual Studio等集成开发环境(IDE)合作的插件,通过为开发者提供代码建议来提高编程效率。Copilot的背后动力源是名为Codex的AI系统,它可以分析代码上下文,生成代码片段,并提供实时建议。

    然而,正是这个看似神奇的工具引发了一场关于AI伦理的争议。其中一个争议焦点是,Copilot从何处学习并生成代码。

    开源代码与许可证问题

    GitHub Copilot的AI引擎Codex声称是通过在数以千万计的公开代码仓库中进行训练而得来的。这包括了GitHub上的开源项目,其中包含了众多开发者自愿贡献的代码。然而,这也引发了一个重要的问题:这些代码是否受到适当的许可证保护,以及Copilot是否遵守了这些许可证?

    开源软件通常会根据特定的许可证发布,这些许可证规定了在何种情况下可以使用、修改和分发代码。常见的开源许可证包括MIT许可证、GNU通用公共许可证(GPL)和Apache许可证等。这些许可证通常要求在使用或分发代码时保留原始许可证和版权信息。

    然而,GitHub Copilot不仅提供了代码建议,还能够生成逐字逐句的代码部分。这就引发了一个关键问题:当Copilot生成代码时,它是否遵循了原始代码的许可证要求?

    争议的核心问题

    在GitHub Copilot的争议中,有几个核心问题值得深入探讨:

    1. AI学习的道德责任

    Copilot的AI引擎Codex是通过在大量开源代码仓库中进行训练而得来的。这些代码很可能包含多种不同的许可证,包括MIT、GPL和Apache等。由于AI并不具备道德判断能力,它可能无意中生成侵犯许可证规定的代码。这引发了一个重要问题:AI是否应该对许可证规定负有道德责任?

    2. 许可证的遵守

    开发者使用GitHub Copilot生成的代码时,通常会忽略原始代码的许可证信息,因为他们可能认为这是AI生成的内容。然而,这是否合法?如果AI生成的代码侵犯了原始代码的许可证规定,那么开发者可能会面临法律责任。因此,确保Copilot生成的代码符合许可证要求至关重要。

    3. 微软的立场

    微软作为GitHub的母公司,对GitHub Copilot的争议问题采取了什么样的立场?微软是否认为Copilot生成的代码符合合理使用原则,还是认为开发者应该对生成的代码负有更多的法律责任?

    4. 开源社区的看法

    开源社区一直是开发者和创新的摇篮,许多项目依赖于社区的共享和合作。GitHub Copilot的出现是否会改变开源社区的动态?会不会有更多的开发者对开源项目采取保守态度,担心其代码会被AI滥用?

    结论

    GitHub Copilot无疑是一项令人印象深刻的技术创新,它为开发者提供了强大的工具,提高了编程效率。然而,与许多新技术一样,它也引发了一系列复杂的伦理问题,特别是与开源软件许可证相关的问题。

    解决这些争议并不容易,需要深入的讨论和合作。开发者、法律专家、AI研究者以及企业需要共同努力,找到平衡点,确保AI技术的发展与伦理原则的遵守相互协调。

    在未来,我们可以期待看到更多关于AI伦理的讨论,以及更多关于GitHub Copilot如何与开源许可证保持一致的解决方案的出现。

  • 电子游戏发展史:从早期探索到现代娱乐的演变

    电子游戏发展史:从早期探索到现代娱乐的演变

    想象一下,回到20世纪中叶的那个时代,电子游戏还没有像今天这样普及,计算机技术还在蓬勃发展的初期阶段。屏幕上的小点点、简单的图形,正是电子游戏的萌芽期。本文将带你穿越时光,探索早期电子游戏的历史,了解它们是如何从技术演示和学术研究中崭露头角,成为现代文化中不可或缺的一部分的。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    早期电子游戏的踪迹

    早期的电子游戏历史可以追溯到1947年,那时诞生了第一款结合屏幕的交互电子类游戏。这个时期的游戏主要是为了技术演示和学术研究而存在的,比如1950年的《大脑伯蒂》和1951年的Nimrod。研究机构开始开发一系列模拟现实世界棋盘游戏的游戏,以探索编程、人机交互、电脑算法等领域。其中包括了1952年的《OXO》(首款结合阴极射线管显示器的游戏程序),以及数款国际象棋和西洋跳棋程序。这些早期游戏奠定了电子游戏领域的基础,尽管它们在当时仅为少数计算机专家所熟知。

    电子游戏的初露锋芒

    随着计算机技术的不断进步,电脑体积变得越来越小,运算速度亦越来越快。到了20世纪50年代末,大学学生和员工都可以使用电脑进行工作。这一时期,一群热衷于编程的程序员开始利用电脑编写与学术无直接关系的程序,其中包括了一款里程碑式的游戏,《太空战争!》,它于1962年推出。这款游戏成为了首款可以在单一机构以外接触到的电子游戏,标志着电子游戏的娱乐时代的开启。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    电子游戏的蓬勃发展

    随着60年代的到来,越来越多的程序员开始开发数字电脑游戏,它们有时甚至出现在程序目录内,供商品销售。电脑成本逐渐下降,电子游戏的受众扩大至数十个研究机构,同时不同编程语言的出现有利于开发更多种类的游戏。70年代初,伴随着投币式街机游戏《银河游戏》原型机的亮相,以及《电脑太空战》和《乓》等游戏的登场,商业电子游戏产业正式成形。与此同时,1972年家用电子游戏机米罗华奥德赛的推出,为第一世代游戏机的诞生打开了序幕,为家庭娱乐带来了全新的可能性。

    电子游戏的技术定义

    早期的电子游戏是如何定义的呢?从技术上讲,一个产品只有向显示器发送视频信号,才能被称为电子游戏。这个显示器可以是阴极射线管、示波器、液晶显示器等。然而,这个定义并不包括早期的电脑游戏,因为它们通常将结果输出到打印机或电传打字机,而不是显示器上。这个术语的演变反映了技术的发展,从最初的硬件依赖性到更广泛的娱乐概念。

    电子游戏的更广泛定义

    随着时间的推移,电子游戏的定义已经变得更加广泛。现在,电子游戏不再仅仅依赖于硬件,它们包括任何在具有电子逻辑电路的硬件上进行的游戏,具有交互元素,并将玩家行动的结果输出到显示器上。这个更广泛的定义使得电子游戏可以涵盖多种形式,从早期的实验项目到今天的主流娱乐。

    电子游戏的早期探索

    早期的电子游戏起源于20世纪50年代初,它们通常与大学和大公司的研究项目相关。这些早期游戏往往是为了设备宣传或学术研究而存在的,而不是娱乐用途。然而,它们为电子游戏的未来奠定了基础,尤其是那些使用阴极射线管屏幕的设备。

    阴极射线管娱乐设备的诞生

    最早的交互电子类游戏之一是阴极射线管娱乐设备。它是已知最早的电子游戏,于1947年注册专利。该设备包括一个连接到示波器的阴极射线管,以及一组旋钮和开关,玩家需要利用旋钮来调整投射点的运动轨道,尝试击中覆盖在显示器上的塑胶目标。尽管这个设备仅基于模拟电路,没有使用数字计算机或程序,但它被认为是电子游戏的先驱之一。

    电子游戏的不断发展

    随着时间的推移,电子游戏不断发展壮大。从早期的实验项目到今天的全球文化现象,电子游戏已经成为了娱乐的主要形式之一。它们的演变不仅受到技术的推动,还受到玩家社区的贡献和创新。

    电脑游戏的技术诞生

    电脑游戏的故事始于第二次世界大战后,当时世界各国投入巨大的资源来开发计算机技术,以协助战争努力。随着战争的结束,这些庞大的电子机器没有闲下来,而是成为了电脑游戏的诞生地。曼彻斯特大学、剑桥大学、宾夕法尼亚大学、普林斯顿大学等学术机构率先颁布了首个存储程序架构,为电脑重新编程提供了可能性。这一技术进步推动了雷明顿兰德公司、费兰提公司、IBM等机构在20世纪50年代初将电脑商业化,也促使大学、政府组织和大型公司开始采用电脑。正是在这种技术和学术氛围下,电脑游戏开始崭露头角。

    20世纪50年代的电脑游戏

    20世纪50年代的电脑游戏可以分为三类:培训和指导程序,人工智能领域的研究程序,以及旨在娱乐公众的示范程序。然而,这些游戏面临着独特的挑战,因为它们是为特定的硬件开发的,难以在不同系统之间移植。而且,由于当时的硬件资源有限,许多游戏在达到其目的后就被拆除或丢弃,因此它们并没有对整个游戏行业的发展产生直接影响。

    电脑游戏的早期亮点

    尽管电脑游戏的早期历史充满了挑战,但也有一些亮点。据已知,最早公开展示的电脑游戏之一是在1950年诞生的《大脑伯蒂》。这款游戏是井字棋的街机版本,由约瑟夫·凯特为加拿大博览会制作。他设计了一台专用电脑,用于展示自己设计的新型真空管。这台机器吸引了众多参观者,成为博览会的亮点之一。然而,这台电脑在博览会结束后就被拆除,成为了历史的一部分。

    Nimrod电脑和尼姆游戏

    在电脑游戏的发展中,英国的费兰提公司也有一席之地。他们制作了Nimrod电脑,这台电脑专门用于玩尼姆游戏。Nimrod电脑拥有巨大的尺寸,专门为游戏玩家设计,展示了电脑在娱乐方面的潜力。虽然最初的目的是展示电脑的设计和编程能力,但大多数参与者更感兴趣的是玩游戏。这台电脑在不列颠节和柏林工业展上展出后也被拆除,但它为电脑游戏的未来奠定了基础。

    电脑游戏的早期成就

    在电脑游戏的早期历史中,还有一些非视觉游戏的探索。克里斯托弗·斯特雷奇开发了模拟西洋跳棋的程序,成为已知首款为通用电脑创建的电脑游戏。此外,亚瑟·李·塞谬尔在IBM 701上开发了自己的西洋跳棋游戏,具备初步的人工智能能力。这些早期的努力为电脑游戏领域的未来打下了坚实的基础。

    井字棋的诞生

    在电子游戏的早期,计算机的用途主要分为三类:培训和指导程序、人工智能研究、以及娱乐示范程序。由于当时的计算机硬件各不相同,系统之间的移植极为困难,因此这些早期游戏主要是为了展示计算机的功能而制作,并没有影响到后来的游戏产业。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    然而,已知最早的公开展示电子游戏可以追溯到1950年。这款游戏名为《大脑伯蒂》,是一款井字棋街机游戏,由约瑟夫·凯特为1950年加拿大博览会而制作。为了展示他设计的新型真空管,凯特制作了一台专用电脑,玩家可以在这台机器上与电脑对弈井字棋。这款游戏在博览会上大获成功,吸引了众多参观者。

    然而,这款游戏并没有长久存在,因为当时的电脑是为特定目的而制作的,游戏只是一个短暂的展示项目。不过,《大脑伯蒂》的诞生标志着电子游戏的开端,为后来的发展奠定了基础。

    井字棋到交互视觉游戏

    随着时间的推移,电子游戏逐渐发展壮大。在1952年,亚历山大·S·道格拉斯在延迟存储电子自动计算器上创建了井字棋游戏《OXO》。这台计算机是最早的存储程序电脑之一,具有可读写的内存,占据了整个房间。玩家可以使用拨号盘控制器输入他们的选择,然后电脑会进行回应,双方的走法都会在屏幕上显示出来。尽管这款游戏并没有对公众开放,只有获得剑桥大学特别许可的人才能够亲身体验,但它标志着电子游戏进一步的发展。

    在1950年代末,电子游戏逐渐演变成了交互视觉游戏。1958年,威廉·希金伯泰创建了一款网球模拟游戏《双人网球》。这是一款纯粹为了娱乐而设计的游戏,目的是在公众开放日为参观者提供更有趣的娱乐体验。玩家可以使用控制器控制击球角度,游戏会计算并模拟球的轨迹。这款游戏取得了巨大的成功,让更多人认识了电子游戏的娱乐价值。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    此外,在1950年代末,各种电脑游戏继续在大学电脑和编程研究的背景下诞生。这些游戏不仅展示了电脑的运算能力,还为当时的计算机科学家和学生提供了娱乐方式。其中一些游戏包括井字棋和老鼠迷宫,它们是由本科生开发的,并在大学的电脑上运行。这些早期的尝试为电子游戏产业的崛起铺平了道路。

    早期大型计算机游戏的诞生

    电子游戏的历史可以追溯到20世纪50年代末和60年代初,当时大型计算机刚刚问世,它们的体积庞大、价格昂贵,只能在大学和研究机构中找到。这些庞大的机器往往被用于科学研究和数据处理,但一些创造性的程序员开始将它们用于娱乐目的。

    《太空战争!》:首款跨机构传播的游戏

    在1961年,麻省理工学院获得了数字设备公司生产的PDP-1小型计算机,这一机器在当时被认为是小型计算机的巅峰之作。PDP-1使用矢量显示系统,其处理速度和性能超越了之前的大型计算机,使其成为创新的平台。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    在PDP-1上,员工史帝芬·罗素与马丁·格雷茨、韦恩·维塔宁等人合作开发了《太空战争!》,这是一款双人游戏,玩家在随机生成的星空背景下,操控宇宙飞船进行战斗。这款游戏的开发理念包括展示计算机的性能、保持游戏的多样性以及使游戏具有娱乐性。它在PDP-1上取得了巨大成功,并在其他PDP-1电脑上得以散播,成为首款跨机构传播的电子游戏。

    电子游戏的早期探索

    除了《太空战争!》之外,20世纪60年代后半期,高级编程语言(如BASIC)的出现进一步扩大了游戏的传播范围。这些游戏包括了棒球模拟、宾果、篮球模拟、棒球模拟和更多。其中,《星际旅行》因其在Multics操作系统上的开发,成为UNIX操作系统的催化剂,开启了新的计算机时代。

    电子游戏的崛起

    在早期大型计算机游戏的基础上,电子游戏开始迎来真正的崛起。20世纪70年代初,出现了第一批商业电子游戏,标志着游戏行业的诞生。

    第一批商业电子游戏

    1971年,Atari公司发布了第一款商业街机游戏《Pong》,这是一款模拟乒乓球比赛的游戏,引发了电子游戏行业的爆发。随着《Pong》的成功,电子游戏开始进入娱乐场所,成为人们娱乐的一部分。

    家用游戏机的兴起

    20世纪70年代末和80年代初,家用游戏机开始兴起。Atari的2600系列和任天堂的家用游戏机带给家庭娱乐一个全新的维度。这些游戏机推出了许多经典游戏,如《超级马里奥》和《坦克大战》,让更多人能够在家中享受电子游戏的乐趣。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    电子游戏的普及

    随着个人计算机的普及,电子游戏的传播范围继续扩大。20世纪90年代,电子游戏开始进入个人计算机、游戏机和移动设备,玩家可以在各种平台上畅玩游戏。

    互联网时代的游戏

    随着互联网的发展,多人在线游戏(MMO)开始崭露头角。游戏如《魔兽世界》和《星际争霸》引领了互联网游戏的潮流,让玩家可以在全球范围内互相竞技和合作。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    移动游戏的崛起

    21世纪初,智能手机的普及催生了移动游戏的热潮。游戏如《愤怒的小鸟》和《糖果粉碎传奇》成为全球范围内的现象级游戏,将电子游戏带入了数以亿计的手机用户的生活中。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    街机电子游戏的崛起

    街机电子游戏的崛起源于之前由机电游戏机主导的街机游戏行业。1966年,世嘉推出了一款名为《潜望镜》的机电游戏机,它引领了一场由具备”视听”效果的新机电游戏机所推动的”技术复兴”。这一复兴为商业电子游戏的引入奠定了基础。

    而第一款商业街机电子游戏便是在1971年亮相的《电脑太空战》。这款游戏由诺兰·布什内尔和泰德·达布尼共同开发,灵感源自于1962年的游戏《太空战争!》。布什内尔曾在电子游戏厅工作,当他看到《太空战争!》后深信这款游戏的街机版本将会非常受欢迎。于是,他和达布尼着手开发这个游戏,并将它推向市场。

    然而,游戏开发并不是一帆风顺的。最初,他们计划使用诺瓦电脑作为游戏的基础,但很快遇到了技术上的困难。电脑的性能不够强大,无法同时运行多个游戏,而且刷新显示器的速度也无法满足游戏的要求。但他们并没有气馁,而是决定自行制作游戏机柜,并成功地推出了游戏原型。1971年8月,游戏原型在斯坦福大学附近的一家酒吧亮相,并获得了巨大成功。游戏备受欢迎,促使布什内尔与纳廷联合合作生产游戏机柜,正式推向市场,这标志着商业电子游戏的诞生。

    另一款早期街机电子游戏:《银河游戏》

    除了《电脑太空战》,另一款早期投币式街机电子游戏是1971年的《银河游戏》。这款游戏由比尔·皮茨和休·塔克开发,利用具备矢量显示器的PDP-11小型计算机。他们受到1962年的游戏《太空战争!》启发,认为投币版本将会取得成功。然而,游戏的成本很高,无法投入生产,最终未能实现商业化。

    电子游戏发展史:从早期探索到现代娱乐的演变 电子游戏发展史:从早期探索到现代娱乐的演变

    家用电子游戏机的崛起

    1972年,电子游戏行业迎来了另一个重要事件:首款可以连接至电视机的家用电子游戏机——米罗华奥德赛的发行。这个家用游戏机由工程师拉夫·亨利·贝尔发明,他早在1951年就萌生了在电视机上制作交互游戏的想法,但当时的技术无法实现。经过多年的努力,他终于在1972年将奥德赛推向市场,它成为了首款面向家庭消费者的电子游戏设备。

    奥德赛的成功在一定程度上归功于流行的乒乓球运动,因为游戏中包括了乒乓球游戏。这款游戏机定价合理,销量迅速突破十万台,为家用电子游戏机的兴起打下了基础。

    结语

    20世纪70年代初,电子游戏行业经历了巨大的变革,商业电子游戏开始崭露头角。街机电子游戏和家用电子游戏机的崛起为电子游戏产业的发展开辟了新的道路,成为电子游戏史上的重要里程碑。

    这个时代的重要事件和创新为电子游戏的未来奠定了坚实的基础,也启示我们,不论是技术的进步还是创意的迸发,都能够推动一个行业的蓬勃发展。

  • 搬瓦工服务器测速与选购指南

    搬瓦工服务器测速与选购指南

    在当今数字化时代,互联网已经成为我们日常生活的一部分,而虚拟专用服务器(VPS)则是托管网站、应用程序和数据的理想选择。然而,在选择和购买VPS时,服务器的性能、网络速度和稳定性是至关重要的考虑因素。本文将向你介绍如何在搬瓦工(BandwagonHost)上测速不同机房的服务器,并提供服务器选购建议。

    搬瓦工官网

    首先,让我们从访问搬瓦工的官方网站开始。你可以点击以下链接访问:

    搬瓦工各节点服务器官方测速地址

    现在,让我们来了解如何测速不同机房的搬瓦工服务器。以下是各个机房的官方测速地址和相关信息:

    香港机房(HKHK_8)

    • 测试IP:93.179.124.235
    • 全国延迟测试:hk.bwg.wiki
    • 测速文件:暂无

    日本大阪机房(JPOS_1)

    • 测试IP:185.212.58.133
    • 全国延迟测试:jp.bwg.wiki
    • 测速文件:25MB

    洛杉矶机房(USCA_6,DC6 CN2 GIA)

    • 测试IP:173.242.113.114
    • 全国延迟测试:dc6.bwg.wiki
    • 测速文件:25MB

    洛杉矶机房(USCA_9,DC9 CN2 GIA)

    • 测试IP:89.208.246.192
    • 全国延迟测试:dc9.bwg.wiki
    • 测速文件:25MB

    洛杉矶机房(USCA_2,DC2 QNET KVM)

    • 测试IP:104.225.153.186
    • 全国延迟测试:dc2.bwg.wiki
    • 测速文件:25MB

    洛杉矶机房(USCA_3,DC3 CN2 KVM)

    • 测试IP:104.243.21.212
    • 全国延迟测试:dc3.bwg.wiki
    • 测速文件:25MB

    洛杉矶机房(USCA_4,DC4 MCOM)

    • 测试IP:104.245.188.20
    • 全国延迟测试:dc4.bwg.wiki
    • 测速文件:25MB

    洛杉矶机房(USCA_8,DC8 ZNET KVM)

    • 测试IP:198.181.42.121
    • 全国延迟测试:dc8.bwg.wiki
    • 测速文件:25MB

    弗里蒙特机房(USCA_FMT)

    • 测试IP:174.137.48.242
    • 全国延迟测试:暂无
    • 测速文件:100MB

    新泽西机房(USNJ)

    • 测试IP:23.29.138.5
    • 全国延迟测试:暂无
    • 测速文件:暂无

    纽约机房(USNY_2)

    • 测试IP:208.167.227.122
    • 全国延迟测试:暂无
    • 测速文件:100MB

    荷兰机房(EUNL_3)

    • 测试IP:45.62.120.202
    • 全国延迟测试:暂无
    • 测速文件:100MB

    荷兰联通高级线路(EUNL_3)

    • 测试IP:104.255.64.1
    • 全国延迟测试:暂无
    • 测速文件:暂无

    以上是各个机房的官方测速地址和相关信息。你可以通过这些地址测试不同机房服务器的Ping延迟和文件下载速度,以便选择最适合你需求的服务器。

    搬瓦工服务器选购建议

    在选择搬瓦工的服务器时,以下是一些建议:

    • 如果预算充足,且对网络稳定性要求较高,香港机房是一个不错的选择,但价格较高。
    • 电信、移动和联通用户可以考虑搬瓦工的CN2 GIA-E套餐,这是一种性价比较高的选择,适用于各种需求。
    • 预算有限的用户可以选择搬瓦工的CN2 GT便宜套餐,年付费用较低。
    • 无论选择哪种套餐,都要根据自己的需求和预算进行权衡。

    结语

    希望这篇文章能帮助你更好地了解搬瓦工服务器测速和选购的相关信息。

    网络性能和稳定性对于在线活动至关重要,所以选择合适的服务器非常重要。如果你有任何问题或疑问,可以前往搬瓦工的官方网站或咨询他们的客户支持,他们将竭诚为你提供帮助。祝你在网络世界中一切顺利!

  • 搬瓦工IP更换教程:如何顺利更换你的VPS IP地址

    搬瓦工IP更换教程:如何顺利更换你的VPS IP地址

    在数字时代,网络是我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐,我们都依赖于互联网。而虚拟专用服务器(VPS)则成为了许多人在网络上托管网站、应用程序和数据的理想选择。搬瓦工(BandwagonHost)作为一家知名的VPS提供商,为用户提供了高性能的VPS服务。然而,有时你可能需要更换你的VPS的IP地址。本文将详细介绍如何在搬瓦工上进行IP地址更换。

    步骤一:登陆搬瓦工官网

    首先,打开你的浏览器,前往搬瓦工的官方网站。如果你已经有账户,请登录。如果没有账户,你需要先注册一个。

    步骤二:进入IP更换申请页面

    一旦你成功登录,进入搬瓦工的用户控制面板。在控制面板中,你可以找到一个名为“IP更换申请”的选项。点击它,进入IP更换的申请页面。

    步骤三:选择需要更换IP的VPS实例

    在IP更换申请页面上,你将看到列出了你拥有的所有VPS实例。选择你想要更换IP的实例,然后点击相应实例后面的“请求更换IP”按钮。

    步骤四:生成工单

    点击“请求更换IP”后,系统将自动生成一个工单(Ticket)。这个工单是你IP更换请求的记录,包括付费信息和IP更换进度。在工单中,你需要支付IP更换的费用。

    步骤五:等待IP更换完成

    一旦你支付了IP更换的费用,搬瓦工将在24小时内为你更换一个新的IP地址。通常情况下,新IP会在30分钟内自动更换成功,你可以在工单中查看进度。

    步骤六:完成IP更换

    在新IP更换成功后,你可以回到搬瓦工的首页,在“Home”下方确认付款已完成。现在,你已成功完成了IP更换。

    结语

    无论你是因为安全问题还是其他原因需要更换IP,搬瓦工为你提供了便捷的解决方案。记住,网络安全和稳定性非常重要,所以在更换IP时,务必确保你的VPS在全球范围内可以正常访问。现在,你已经学会了如何在搬瓦工上更换IP地址,希望这个教程对你有所帮助。

  • 放下花里胡哨,用音乐点亮工作日常 – Musicfox(网易云音乐终端版)

    放下花里胡哨,用音乐点亮工作日常 – Musicfox(网易云音乐终端版)

    工作时听歌已成为我的习惯,一边工作一边将歌曲作为背景音乐,仿佛它们是我工作的伴奏。这个习惯早在我高中时就养成了,但为什么要选择在命令行终端中听歌呢?这其实有个故事:

    我的工作笔记本相对老旧,如果同时运行太多应用程序,它会像一辆老拖拉机一样嗡嗡作响,影响工作效率;
    桌面上的网页云音乐应用虽然好用,但它总是让我分心。或许因为它让查找歌曲变得太容易,我总是不知不觉地花费太多时间在上面,无法集中精力工作;
    那么,有没有一款既包含了常见音乐应用的功能,又不会占用系统资源的工具,能够让我专注地享受音乐呢?答案是有的:Go-Musicfox,这是我日常听歌的终端界面。

    放下花里胡哨,用音乐点亮工作日常 - Musicfox(网易云音乐终端版) 放下花里胡哨,用音乐点亮工作日常 – Musicfox(网易云音乐终端版)

    Go-Musicfox是一个用Go语言编写的网易云音乐命令行客户端,它支持各种音质级别、UnblockNeteaseMusic、Last.fm、MPRIS和macOS交互响应(如睡眠暂停、蓝牙耳机连接断开响应以及菜单栏控制等)。如果你对音乐有着同样的热爱,那么Go-Musicfox可能会成为你的新选择。项目链接

    安装步骤

    如果你想在本地安装Musicfox,首先确保你已经安装了Go语言。如果你还没有安装Go语言,可以参考以下步骤:

    1. 下载Musicfox的源代码:

      git clone [email protected]:go-musicfox/go-musicfox.git
    2. 下载必要的依赖:

      cd go-musicfox
      go mod download
    3. 编译和安装:

      make
      make install
    4. 进入到Musicfox的安装目录:

      cd bin

    你会在这里找到刚刚安装的Musicfox可执行文件。

    快捷键

    Musicfox的魅力之一在于它提供了丰富的快捷键,让你可以通过命令行轻松控制音乐的播放和操作。以下是一些常用的快捷键:

    • h/H/←:左移
    • l/L/→:右移
    • k/K/↑:上移
    • j/J/↓:下移
    • g:移到顶部
    • G:移到底部
    • q/Q:退出
    • Space (空格):暂停/播放
    • [:上一曲
    • ]:下一曲
    • -/滚轮下:减小音量
    • =/滚轮上:增大音量
    • n/N/Enter (回车):进入选中的菜单
    • b/B/Escape (退出):返回上级菜单
    • w/W:退出并退出登录
    • p:切换播放方式
    • P:心动模式(仅在歌单中时有效)
    • r/R:重新渲染UI(如果UI界面出现问题)
    • c/C:当前播放列表
    • v/V:快进 5s / 10s
    • x/X:快退 1s / 5s
    • ,:喜欢当前播放歌曲
    • <:喜欢当前选中歌曲
    • .:移除当前播放歌曲出喜欢
    • >:移除当前选中歌曲出喜欢
    • “:当前播放歌曲加入歌单
    • ~:当前播放歌曲移出歌单
    • Tab:当前选中歌曲加入歌单
    • Shift+Tab:当前选中歌曲移出歌单
    • >:当前选中歌曲移除出喜欢
    • >:当前选中歌曲移除出喜欢
    • t:标记当前播放歌曲为不喜欢
    • T:标记当前选中歌曲为不喜欢
    • d:下载当前播放歌曲
    • D:下载当前选中歌曲
    • /:搜索当前列表
    • ?:帮助信息
    • a:播放中歌曲的所属专辑
    • A:选中歌曲的所属专辑
    • s:播放中歌曲的所属歌手
    • S:选中歌曲的所属歌手
    • o:网页打开播放中歌曲
    • O:网页打开选中歌曲/专辑
    • e:添加为下一曲播放
    • E:添加到播放列表末尾
    • \:从播放列表删除选中歌曲
    • ;/:

    :收藏选中歌单

    • '/''":取消收藏选中歌单
    • u/U:清除音乐缓存

    结束语

    Musicfox为那些热爱音乐的人提供了一个极简而高效的方式来欣赏自己喜爱的歌曲,同时又不会占用过多的系统资源。无论是在工作时需要一点背景音乐,还是在休闲时间想要享受音乐,Musicfox都能满足你的需求。不妨尝试一下,让音乐点亮你的日常工作和生活。

    这就是关于Musicfox的介绍,我希望你会喜欢这个简洁而功能强大的终端音乐客户端。如果你也是音乐爱好者,那么不妨尝试一下Musicfox,让音乐成为你生活中的一部分。