分类: 站长笔记

虚拟人生记录,站长思维沉淀

  • 风华是一指流沙:NAS与那些年的DOS游戏

    你是否还记得那些温暖的午后,你躲在被窝里,手握游戏机投入到一个个瑰丽奇幻的游戏世界中?是否还记得那段时间的喜悦、紧张和不舍,当屏幕上出现“Game Over”的时候?

    如果你还记得,那么今天,我要告诉你一个好消息:那个时代的美好,可以重现!

    在这里,我要为你揭示一个你可以回溯那些年、探寻儿时记忆的秘密花园。只要你跟随我的指引,你将有机会再次体验那些曾让你痴迷不已的DOS游戏的魅力。

    唤醒记忆的神秘网站

    首先,让我来告诉你一个网站:DOS游戏回顾

    在这个网站上,你可以找到近2000款的经典DOS游戏,从《仙剑奇侠传》到《红色警戒》,从《大富翁》到《大航海时代》,每一款都能勾起你无尽的回忆。

    群晖+Docker:创建你的私人游戏库

    不过,我知道,有些朋友更喜欢在自己的设备上建立一个私人的游戏库,那么,接下来我就要告诉你一个秘诀:如何在群晖NAS上搭建你的DOS游戏库。

    第一步:准备Docker容器

    在你的群晖NAS上,找到Docker注册表,然后搜索dosgame。你将看到一个名为oldiy/dosgame-web-docker的项目。不用犹豫,双击它进行下载。这位oldiy大佬为我们准备了很多有趣的项目,有空可以多多探索哦!

    st=>start: 开始
    op1=>operation: 打开Docker注册表
    op2=>operation: 搜索 dosgame
    op3=>operation: 选择并下载 oldiy/dosgame-web-docker
    e=>end
    
    st->op1->op2->op3->e

    第二步:端口设置

    下载完成后,进入容器的设置页面,将端口设置为262(或者你喜欢的任何其他端口)。

    st=>start: 开始
    op1=>operation: 进入容器设置页面
    op2=>operation: 设置端口为262
    e=>end
    
    st->op1->op2->e

    第三步:访问并享受游戏

    现在,打开你的浏览器,输入http://群晖:262 ,你将看到一个崭新的游戏界面,里面已经预装了42款经典的DOS游戏。

    st=>start: 开始
    op1=>operation: 打开浏览器
    op2=>operation: 输入 http://群晖:262
    op3=>operation: 选择并享受游戏
    e=>end
    
    st->op1->op2->op3->e

    第四步:自定义你的游戏库

    如果你觉得这些还不够,那么可以按照以下步骤,为你的游戏库增加更多的游戏:

    1. 在docker文件夹中创建一个名为dosgame的新文件夹,并找到它的绝对路径。
    2. 使用SSH登录到群晖,并在命令行执行文件拷贝操作,将游戏文件拷贝到你刚才创建的文件夹中。
    3. 如果你需要下载更多游戏,记得在创建容器时将/app/static/games挂载到足够空间的硬盘上。
    4. 你还可以找到一个名为all-geme-list.txt的文件,里面有更多游戏的下载地址,可以根据需要下载更多游戏。
    5. 如果你想下载所有游戏,可以在SSH界面执行一系列命令,即可完成全部游戏的下载。
    st=>start: 开始
    op1=>operation: 创建dosgame文件夹
    op2=>operation: SSH登录到群晖
    op3=>operation: 执行文件拷贝操作
    op4=>operation: 进行挂载
    op5=>operation: 找到并使用游戏下载地址
    op6=>operation: SSH界面执行命令下载所有游戏
    e=>end
    
    st->op1->op2->op3->op4->op5->op6->e

    后序:儿时的梦再次启航

    如今,你手中拥有了一个私人的DOS游戏库,再次回顾那些儿时的梦想和冒险,是不是觉得时间仿佛回流,你又回到了那个纯真的年代?

    当初的DOS游戏,诞生了无数的经典。即使到现在,它们依然充满了魅力,让人无法抗拒。希望通过这个小教程,我能帮你找回那段最珍贵的记忆,重新点燃你的热情。

    现在,拾起你的童心,开始你的新冒险吧!

    结语

    感谢你陪我走过这段旅程,重新找回我们共

    同的记忆。如果你有任何问题或建议,欢迎留言与我交流。

    再次感谢你的阅读,希望我们可以在游戏的世界里相见。

  • 如何使用Python自动获取Steam限时免费游戏信息并推送通知

    你是否是一位游戏爱好者,经常关注Steam上的限时免费游戏活动?如果是的话,你可能会发现每天都需要手动查看这些游戏信息,以确保不错过任何一个免费游戏的机会。但是,有没有一种方法可以让你自动获取这些信息并及时通知你呢?答案是肯定的!在本教程中,我们将介绍如何使用Python编写一个自动获取Steam限时免费游戏信息并通过推送通知告诉你的工具。

    故事开头

    你是一名热衷于游戏的玩家,每天都会关注Steam上的限时免费游戏活动。然而,由于工作繁忙,你经常会错过这些免费游戏的机会。你曾经试图使用提醒功能,但发现它并不是特别方便,因为你需要手动设置提醒时间并确保不错过。因此,你决定寻找一种更智能的方式来获取这些信息,以便在游戏免费时能够第一时间得知。

    准备工作

    在开始编写自动获取Steam限时免费游戏信息的工具之前,你需要准备以下几个要素:

    1. Python环境: 确保你已经安装了Python,并且可以在你的计算机上运行Python程序。

    2. 必要的库: 本教程中使用了requestsBeautifulSoup库来进行网页爬取和解析,以及用于发送推送通知的功能。你需要确保这些库已经安装在你的Python环境中。

    3. 推送通知平台: 你需要选择一个推送通知平台,本教程中使用的是PushPlus。你需要在PushPlus上注册账户并获取一个用于发送通知的Token。

    4. Steam限时免费游戏页面: 你需要知道Steam限时免费游戏信息所在的页面URL。在本例中,我们使用的是steamstats.cn提供的页面。

    编写自动获取游戏信息工具

    发送推送通知

    首先,我们来编写一个函数,用于发送推送通知。在本教程中,我们使用了PushPlus来发送通知。你需要替换下面代码中的token为你在PushPlus上获取的Token。

    def pushplus(_item, _message):
        token = 'your_token_here'  # 替换为你的PushPlus Token
        api = 'http://www.pushplus.plus/send'
        _d = {
            "token": token,
            "title": _item,
            "content": _message
        }
        req = requests.post(api, data=_d)
        #print(req.text)

    网页爬取和信息提取

    接下来,我们需要编写代码来进行网页爬取和信息提取。我们使用requests库来获取网页内容,使用BeautifulSoup库来解析HTML。

    url = 'https://steamstats.cn/xi'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.41'
    }
    
    r = requests.get(url, headers=headers)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    soup = BeautifulSoup(r.text, "html.parser")

    解析游戏信息

    现在,我们需要解析网页中的游戏信息。在Steam限时免费游戏页面上,游戏信息通常在tbody标签中。我们使用BeautifulSoup来查找并提取这些信息。

    tbody = soup.find('tbody')
    desp = "? 当前可领限时免费游戏 ?" + '\n'
    if tbody is not None:
        tr = tbody.find_all('tr')
        i = 1
        for tr in tr:
            # 提取游戏信息
            # ...(省略其他代码)
            desp = desp + "序号:" + str(i) + '\n' + "游戏名称:" + name + '\n' + "类型:" + gametype + '\n' + "开始时间:" + start + '\n' + "结束时间:" + end + '\n' + "是否永久:" + time + '\n' + "平台:" + oringin + '\n' + "链接:" + http + '\n'
            i = i + 1
        else:
            desp = desp + "无"

    发送推送通知

    最后,我们将获取的游戏信息发送到我们之前编写的pushplus函数,以便通过PushPlus发送通知。

    pushplus("? 今日喜加一 ?", desp)

    结束语

    通过本教程,你已经学会了如何使用Python编写一个自动获取Steam限时免费游戏信息并通过PushPlus推送通知的工具。这个工具可以帮助你及时获取最新的游戏信息,确保不错过任何一个免费游戏的机会。

    如果你对Python编程和自动化任务有更多的兴趣,不妨深入学习,探索更多有趣的应用领域!

    现在,你已经了解如何编写一个自动获取Steam限时免费游戏信息的工具了。希望这个教程对你有所帮助,让你在游戏世界中更加便捷和智能!

  • 如何使用Python编写一个自动抢码工具

    你是否曾经想过如何利用编程技能来自动化一些重复性任务?或者是否曾经想过如何编写一个程序,能够在特定条件下执行某些操作?如果你是一名编程爱好者,那么你来对地方了!在本教程中,我们将介绍如何使用Python编写一个自动抢码工具,以帮助你在特定场景下完成自动化任务。无论是抢购热门商品、自动化游戏任务还是其他需要快速响应的情况,这个工具都能派上用场。

    故事开头

    假设你是一名玩家,热衷于某款热门游戏。游戏中有一项活动,需要扫描游戏中的二维码进行抢码操作,以获得珍贵的奖励。然而,这个活动的二维码每次都在不同的位置出现,手动扫描非常不方便,而且容易错过。于是,你决定使用自己的编程技能来解决这个问题,编写一个自动抢码工具,让你轻松抢到奖励。

    准备工作

    在开始编写自动抢码工具之前,你需要准备以下几个要素:

    1. Python环境: 确保你已经安装了Python,并且可以在你的计算机上运行Python程序。

    2. 必要的库: 本教程中使用了许多Python库,包括cv2(用于图像处理)、pyzbar(用于二维码识别)、http.client(用于网络请求)、tkinter(用于创建窗口界面)等。你需要确保这些库已经安装在你的Python环境中。

    3. 米游社账户: 你需要一个米游社账户,以便在游戏中进行抢码操作。确保你已经登录米游社,并且知道自己的UID和Cookie信息。

    4. 游戏类型和设备信息: 确定你要抢码的游戏类型(在本例中为4,表示某款游戏),以及生成一个唯一的设备标识符。

    编写自动抢码工具

    创建一个Tkinter窗口

    首先,我们将创建一个Tkinter窗口,这个窗口将用于显示屏幕截图以及识别到的二维码。这个窗口将始终保持在屏幕最前方,不会干扰你的操作。

    # 创建一个Tkinter窗口
    root = tk.Tk()
    # 隐藏窗口标题栏和边框
    root.overrideredirect(True)
    # 将窗口置顶
    root.wm_attributes("-topmost", True)
    # 设置窗口大小和位置
    win_width = 300
    win_height = 300
    screen_width = root.winfo_screenwidth()
    screen_height = root.winfo_screenheight()
    x_pos = (screen_width // 2) - (win_width // 2)
    y_pos = (screen_height // 2) - (win_height // 2)
    root.geometry('{}x{}+{}+{}'.format(win_width, win_height, x_pos, y_pos))
    # 将窗口背景设为透明
    root.attributes('-transparentcolor', 'white')
    # 将窗口的画布设为透明
    canvas = tk.Canvas(root, bg='white', highlightthickness=0)
    canvas.pack(fill='both', expand=True)
    # 绘制一个红色空心正方形
    canvas.create_rectangle(
        5, 5, win_width-5, win_height-5, outline='red', width=2)
    # 进入循环让窗口保持打开状态
    root.mainloop()

    设置扫描区域

    我们需要确定在屏幕上哪个区域进行二维码扫描。在这个例子中,我们将屏幕分成一个300×300的区域,用于扫描。

    # 设置扫描区域
    width, height = 300, 300
    # 获取屏幕尺寸
    screen_width = tk.Tk().winfo_screenwidth()
    screen_height = tk.Tk().winfo_screenheight()
    # 计算识别区域左上角
    left = (screen_width - width) // 2
    top = (screen_height - height) // 2
    # 计算识别区右下角
    right = left + width
    bottom = top + height

    截取屏幕截图

    编写一个函数来截取指定区域的屏幕截图,并将其转换为灰度图像。这个函数将会在后续的识别过程中使用。

    def capture_screen():
        saveDC = dc.CreateCompatibleDC()
    
        # 创建位图对象
        saveBitMap = win32ui.CreateBitmap()
        saveBitMap.CreateCompatibleBitmap(dc, right-left, bottom-top)
    
        # 将位图选入到DC中
        saveDC.SelectObject(saveBitMap)
    
        # 截屏并保存到位图中
        saveDC.BitBlt((0, 0), (right-left, bottom-top),
                      dc, (left, top), win32con.SRCCOPY)
    
        # 将位图对象转换为numpy数组并进行颜色空间转换
        bmpinfo = saveBitMap.GetInfo()
        bmpstr = saveBitMap.GetBitmapBits(True)
        screenshot = np.frombuffer(bmpstr, dtype='uint8').reshape(
            (bmpinfo['bmHeight'], bmpinfo['bmWidth'], 4))[:, :, :3]
        screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
    
        # 释放资源
        saveDC.DeleteDC()
        win32gui.DeleteObject(saveBitMap.GetHandle())
    
        return screenshot

    识别二维码

    使用pyzbar库来

    识别屏幕截图中的二维码。如果成功识别到二维码,我们将进一步处理它。

    # 截取屏幕截图
    screenshot = capture_screen()
    # 尝试使用pyzbar库识别二维码
    codes = decode(screenshot, symbols=[pyzbar.ZBarSymbol.QRCODE])
    
    # 如果找到了二维码,输出其内容
    if codes:
        print("扫码成功!")
        pattern = r"ticket=([a-f0-9]+)"
        match = re.search(pattern, codes[0].data.decode())
        # 正则请求地址
        if match:
            print(match.group(1))
            # 进入抢码
            start_time = time.time()
            retcode = Request(match.group(1))
            end_time = time.time()
            if retcode == 0:
                # 计算代码执行时间并输出
                elapsed_time = end_time - start_time
                print("抢码成功耗时 %.3f 秒" % elapsed_time)
                random = 1.3
                time.sleep(random)
                print("防止过快被察觉插入随机延迟")
                # 确认登陆
                start_time = time.time()
                ConfirmRequest(match.group(1))
                end_time = time.time()
                # 计算代码执行时间并输出
                elapsed_time = end_time - start_time
                print("确认登陆成功耗时 %.3f 秒" % elapsed_time)
                # print("作者by:吾爱破解tseed")
                # 等待一下
                time.sleep(1)
        else:
            print("未知二维码抢码失败")
            # 等待一下
            time.sleep(1)

    记录FPS和退出

    最后,我们可以记录每秒的帧数,并在按下键盘上的任意键时退出程序。

    # 记录每秒帧数
    frame_count = 0
    frame_start_time = time.time()
    while True:
        # ...(省略其他代码)
    
        # 记录每秒帧数
        frame_count += 1
        if time.time() - frame_start_time >= 1:
            fps = frame_count
            print(f"FPS:{fps}" + "\r", end='', flush=True)
            frame_count = 0
            frame_start_time = time.time()
    
        # 在窗口中显示截图
        cv2.imshow("QR Code Scanner", screenshot)
    
        # 检查是否按下了键盘上的任意键
        if cv2.waitKey(1) != -1:
            break
    # 关闭窗口
    cv2.destroyAllWindows()

    结束语

    通过本教程,你已经学会了如何使用Python编写一个自动抢码工具。这个工具可以用于各种需要自动化的场景,只需稍微调整代码即可。希望这个教程能帮助你更好地理解Python编程和自动化任务的原理,同时也能让你在特定情况下提高工作效率。

    如果你对Python编程和自动化有更多的兴趣,不妨深入学习,探索更多有趣的应用领域!

  • 一款“裸奔”博客的守护神:巧妙的网站防御策略大揭秘

    你也许有一个小博客,偶尔在空闲时间涂涂写写,分享那些细水长流的岁月或者突如其来的灵感。你也许不想投入太多的金钱和精力在这个没有人访问的小角落。但,你依然想守护它不受攻击。好消息!这里有一个超实用、贴心的网络防御指南等你来拥抱。让我们一起打造一个安全、快速且具有防御力的博客王国吧!

    一、引言

    曾几何时,你或许也有过这样的困扰:“这只是一个小博客,我只是想安安静静地写些东西。” 是的,我们很理解你的心情。在这个网络安全风险层出不穷的时代,就算是个小博客也需要一份“保险”。

    今天,我们就来谈谈如何轻松、经济、有效地保护你的博客免受攻击,让你可以安心地继续你的写作旅程!

    二、初识网络防御

    在开始之前,让我们先来简单了解一下网络防御的两个主要层面:

    1. 主机层面:针对主机的保护,能够有效抵御大部分常见的网络攻击。
    2. 应用层面:主要针对博客应用本身的保护,可以避免一些特定的安全风险。

    保证了这两个层面的安全,你的博客就能稳稳当当,不怕外界的侵扰了!

    三、步入实战:DIY 你的网络防御系统

    3.1 主机层面的加固

    首先,我们要确保主机的安全。这不是什么高深的技术,只要按照以下步骤,你也可以轻松做到!

    st=>start: 开始
    op1=>operation: 安装安全软件
    op2=>operation: 设置强壮的密码
    op3=>operation: 定期更新系统
    op4=>operation: 开启防火墙
    op5=>operation: 监控系统日志
    e=>end: 结束
    
    st->op1->op2->op3->op4->op5->e

    1. 安装安全软件

    选择一款可靠的安全软件,能够有效防止恶意软件和病毒的侵入。

    2. 设置强壮的密码

    为你的系统和数据库设置一个强壮的密码,这是最基本也是最有效的防御手段。

    3. 定期更新系统

    保持系统的更新是非常重要的,因为每一个更新都可能是对已知漏洞的修复。

    4. 开启防火墙

    防火墙可以有效阻止未授权的访问,是网络安全的第一道屏障。

    5. 监控系统日志

    定期检查系统日志可以帮你及时发现任何异常行为,从而提前做好准备。

    3.2 应用层面的保护

    应用层面的保护主要针对博客应用本身。以下是一些你可以尝试的方法:

    st=>start: 开始
    op1=>operation: 使用安全的博客平台
    op2=>operation: 定期备份博客数据
    op3=>operation: 安装 WAF (网站应用防火墙)
    e=>end: 结束
    
    st->op1->op2->op3->e

    1. 使用安全的博客平台

    选择一款安全可靠的博客平台,例如 WordPress 官方服务。

    2. 定期备份博客数据

    定期备份你的博客数据,以防万一。

    3. 安装 WAF (网站应用防火墙)

    安装一款 WAF 软件可以为你的博客提供一层额外的保护屏障。

    四、实用小技巧:智能解析与地域限制

    除了上述的基本防护措施,还有一些实用小技巧可以帮助你更好地保护你的博客。

    4.1 智能解析

    通过智能解析,你可以实现分线路解析,即国内使用腾讯云 CDN,国外则接入 CF(Cloudflare),这样能够有效防御大多数 DDos 攻击。

    4.2 地域限制

    如果你只想让国内的用户访问你的博客,可以考虑设置地域限制,只允许大陆用户访问。这样可以有效避免大多数来自国外的网络攻击。

    五、结语

    小博客,大世界。即使是一个小小的博客,也有它存在的价值和意义。通过这篇文章,希望你已经学会了如何保护你的小博客,让它安心地生长在这个大世界中。

    博客不只是一个写作的空间,它也是你的精神家园。希望你能

    用心呵护它,让它成为一个温馨、安全的港湾。

    现在,你已经准备好开始你的博客保护之旅了吗?让我们一起行动吧!

  • 在Ubuntu上启用SSH服务和配置交换分区

    在使用Ubuntu操作系统时,启用SSH服务是一个常见的需求,因为它允许你通过远程访问来管理你的服务器。此外,配置适当的交换分区也是重要的,以便在系统内存不足时提供额外的资源。本教程将向你展示如何在Ubuntu上启用SSH服务并配置交换分区。

    1. 安装和启用SSH服务

    SSH(Secure Shell)是一种安全的网络协议,用于远程连接到Linux服务器。默认情况下,Ubuntu未启用SSH服务,因此你需要手动安装和启用它。

    首先,打开终端并使用以下命令来更新系统并安装OpenSSH服务器:

    sudo apt update
    sudo apt install openssh-server

    安装完成后,SSH服务将自动启动。你可以使用以下命令来验证SSH是否正在运行:

    sudo systemctl status ssh

    如果服务正在运行,你将看到类似于以下内容的输出:

    ● ssh.service - OpenBSD Secure Shell server
       Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
       Active: active (running) since Thu 2023-09-xx xx:xx:xx UTC; xxmin ago
     Main PID: xxxxx (sshd)
        Tasks: xx (limit: xxxxx)
       Memory: xxx.xxxM

    2. 配置防火墙(可选)

    Ubuntu自带一个配置防火墙的工具称为UFW(Uncomplicated Firewall)。如果你使用了防火墙,请确保允许SSH端口通过防火墙。

    使用以下命令来允许SSH端口(默认为22)通过UFW:

    sudo ufw allow ssh

    然后,使用以下命令来启用UFW并查看防火墙状态:

    sudo ufw enable
    sudo ufw status

    如果防火墙状态显示为"active",则表示防火墙已启用。如果没有启用UFW,你可以忽略此步骤。通常情况下,Ubuntu默认情况下是关闭防火墙的。

    3. 修改SSH端口(可选)

    默认情况下,SSH服务使用端口22。为了提高安全性,你可以考虑更改SSH端口,使其不那么容易被恶意攻击。以下是如何更改SSH端口的步骤:

    1. 使用文本编辑器打开SSH配置文件:
    sudo nano /etc/ssh/sshd_config
    1. 在文件中找到以下行:
    Port 22
    1. 将端口22更改为你选择的新端口号,例如60000:
    Port 60000
    1. 保存文件并退出文本编辑器。

    2. 重新启动SSH服务以使更改生效:

    sudo systemctl restart ssh

    现在,SSH服务将使用新的端口。请确保在连接时指定正确的端口号。

    4. 配置交换分区

    交换分区是Linux系统的一部分,用于在物理内存不足时提供额外的资源。如果你的服务器上没有足够的物理内存,配置适当的交换分区非常重要。

    查看当前的交换分区

    你可以使用以下命令来查看当前的交换分区:

    cat /proc/swaps

    停止默认的交换分区

    首先,停止默认的交换分区。使用以下命令,其中/cyberpanel.swap是默认的交换分区文件路径:

    sudo swapoff /cyberpanel.swap

    删除默认的交换分区

    接下来,删除默认的交换分区文件:

    sudo rm /cyberpanel.swap

    创建新的交换分区

    你可以使用以下命令来创建一个新的交换分区。以下示例创建一个大小为10GB的交换分区文件:

    sudo dd if=/dev/zero of=swapfile bs=1024 count=10000000

    设置新交换分区的权限

    sudo chmod 600 swapfile

    格式化新交换分区

    sudo mkswap -f
    
     swapfile

    启用新交换分区

    sudo swapon swapfile

    永久启用新交换分区

    为了在系统启动时自动加载新的交换分区,你需要将其添加到/etc/fstab文件中。使用以下命令:

    echo '/root/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

    5. 调整内核参数(可选)

    你可以调整Linux内核参数以更好地管理内存和交换分区。一个重要的参数是vm.swappiness,它控制了何时将数据从内存移至交换分区。默认情况下,其值为60,表示当内存使用率超过40%时开始使用交换分区。你可以根据需要调整此值。以下是如何修改它的步骤:

    1. 查看当前vm.swappiness的值:
    cat /proc/sys/vm/swappiness
    1. 如果你想临时调整参数值,可以使用以下命令(将50替换为你想要的值):
    sudo sysctl vm.swappiness=50
    1. 若要永久调整参数值,使用文本编辑器打开/etc/sysctl.conf文件:
    sudo nano /etc/sysctl.conf
    1. 在文件末尾添加以下行,将50替换为你想要的值:
    vm.swappiness=50
    1. 保存文件并退出文本编辑器。

    2. 使用以下命令重新加载参数:

    sudo sysctl -p

    6. 开启TCP BBR拥塞控制(可选)

    TCP BBR是Google开发的一种拥塞控制算法,可以显著提高网络吞吐量和减少延迟。如果你的Ubuntu内核版本高于4.9,则已默认包含TCP BBR。你可以使用以下命令来启用TCP BBR:

    1. 检查内核版本:
    uname -r
    1. 如果内核版本高于4.9,可以使用以下命令启用BBR:
    echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    1. 让修改后的BBR参数生效:
    sysctl -p
    1. 使用以下命令来验证是否成功启用BBR:
    sysctl net.ipv4.tcp_available_congestion_control

    如果输出中包含bbr,则表示BBR已成功启用。

    这就是在Ubuntu上启用SSH服务和配置交换分区的步骤。通过这些操作,你可以更安全地远程访问服务器,并确保系统在内存不足时拥有额外的资源。

  • 打造自己的Virtual DSM:在Docker中体验Synology的强大功能

    你是否曾想过在自己的硬件上体验Synology的Virtual DSM,但不想购买他们的硬件?那么,你来对地方了。在这篇文章中,我们将介绍如何在Docker容器中运行Virtual DSM,让你能够在自己的计算机上享受Synology DSM的众多功能,而无需购买他们的NAS硬件。

    开篇故事

    想象一下,你在寻找一种方法来备份家庭照片和视频,或者建立一个私人云来存储重要文件。你听说过Synology的强大NAS设备,但你不想花大笔资金购买一台。然后,你听说有人将Virtual DSM安装在Docker容器中,并且一切都运行得非常出色。你兴奋地开始探索这个想法,想知道如何在自己的计算机上实现这一目标。

    好消息是,你来对地方了。在接下来的教程中,我们将逐步向你展示如何在Docker中运行Virtual DSM,并让你享受Synology DSM的全部功能。

    准备工作

    在开始之前,你需要满足一些要求:

    • 一台装有Docker的计算机。
    • 安装了docker-compose(如果你使用docker-compose)。
    • 能够运行KVM的硬件,并且已启用KVM虚拟化支持。

    安装Virtual DSM

    通过docker-compose.yml安装

    首先,你可以通过创建一个docker-compose.yml文件来配置Virtual DSM容器。这个文件将告诉Docker如何运行容器以及如何配置它。

    version: "3"
    services:
        dsm:
            container_name: dsm
            image: kroese/virtual-dsm:latest
            environment:
                DISK_SIZE: "16G"
            devices:
                - /dev/kvm
                - /dev/vhost-net
            cap_add:
                - NET_ADMIN                       
            ports:
                - 5000:5000
            volumes:
                - /opt/dsm:/storage
            restart: on-failure
            stop_grace_period: 1m

    这个docker-compose.yml文件的关键部分包括:

    • image:容器使用的Virtual DSM Docker镜像。
    • environment:可以设置的环境变量,例如磁盘大小(默认为16GB,你可以根据需要进行修改)。
    • devices:指定了容器可以访问的设备,包括KVM支持。
    • ports:将容器内的端口映射到主机的端口(例如,将容器的5000端口映射到主机的5000端口)。
    • volumes:将主机文件夹挂载到容器内,以便在容器中存储数据。
    • restart:设置容器在故障时自动重启。
    • stop_grace_period:定义了容器在关闭之前等待的时间。

    一旦你创建了docker-compose.yml文件,只需在包含该文件的目录中运行以下命令来启动Virtual DSM容器:

    docker-compose up -d

    通过docker run安装

    如果你不使用docker-compose,也可以通过以下命令手动运行Virtual DSM容器:

    docker run -it --rm -p 5000:5000 --device=/dev/kvm --cap-add NET_ADMIN --stop-timeout 60 kroese/virtual-dsm:latest

    这个命令将以交互式模式启动容器,同时映射端口并配置KVM支持。

    配置Virtual DSM

    一旦容器运行,你可以通过浏览器访问 http://localhost:5000 来配置Virtual DSM。你将看到Synology DSM的初始设置页面,类似于在Synology硬件上的设置过程。

    你可以使用默认的管理员用户名和密码进行登录(通常是admin / admin)。登录后,你可以根据需要配置和使用Virtual DSM的各种功能,包括文件共享、备份、媒体服务器等。

    常见问题解答

    以下是一些常见问题的解答,以帮助你更好地配置和使用Virtual DSM。

    如何更改虚拟磁盘的大小?

    要扩展默认大小(16GB),只需在docker-compose.yml文件中找到DISK_SIZE设置并将其修改为所需的容量:

    environment:
        DISK_SIZE: "256G"

    这也可以用于在不丢失数据的情况下将现有磁盘的大小增加到更大的容量。

    如何更改虚拟磁盘的位置?

    要更改虚拟磁盘的位置,可以在docker-compose.yml文件中包含以下绑定挂载:

    volumes:
        - /home/user/data:/storage

    将示例路径/home/user/data替换为所需的存储文件夹。

    如何更改虚拟磁盘的空间保留方式?

    默认情况下,磁盘空间会提前保留。要创建一个只保留实际使用空间的可扩展磁盘,请添加以下环境变量:

    environment:
        ALLOCATE: "N"

    请注意,这不会影响任何现有磁盘,它只适用于新创建的磁盘。

    如何增加CPU或RAM的分配?

    默认情况下,容器分配了一个核心和512MB的RAM。要增加这些资源,添加以下环境变量:

    environment:
        CPU_CORES: "4"
        RAM_SIZE: "2048M"

    如何验证我的系统是否支持KVM?

    要验证系统是否支持KVM,运行以下命令:

    sudo apt install cpu-checker
    sudo kvm-ok

    如果kvm-ok返回错误,表示无法使用KVM加速,请检查你的BIOS设置。

    如何为容器分配独立的IP地址?

    默认情况下,容器使用桥接网络,与主机共享IP地址。

    如果要为容器分配独立的IP地址,你可以创建一个macvlan网络,如下所示:

    docker network create -d macvlan \
        --subnet=192.168.0.0/24 \
        --gateway=192.168.0.1 \
        --ip-range=192.168.0.100/28 \
        -o parent=eth0 vdsm

    确保修改这些值以匹配你的本地子网。

    一旦创建了网络,将你的docker-compose.yml文件更改如下:

    services:
        dsm:
            container_name: dsm
            ..
            networks:
                vdsm:             
                    ipv4_address: 192.168.0.100
    
    networks:
        vdsm:
            external: true

    这种方法的额外好处是,你不再需要执行任何端口映射,因为所有端口都将默认公开。

    请注意,由于macvlan的设计不允许两者之间的通信,因此来自Docker主机的IP地址将无法访问这个容器。如果这是一个问题,你需要创建第二个macvlan作为解决方法。

    如何让容器从我的路由器获取IP地址?

    在配置容器为macvlan(如上所述)后,DSM可以通过从你的路由器请求IP来成为你家庭网络的一部分,就像其他设备一样。

    要启用这个功能,请将以下行添加到你的docker-compose.yml文件中:

    environment:
        DHCP: "Y"
    devices:
        - /dev/vhost-net
    device_cgroup_rules:
        - 'c *:* rwm'

    请注意,即使你不需要DHCP,也建议启用此功能,因为它可以防止NAT问题,并通过使用macvtap接口来提高性能。

    如何安装特定版本的vDSM?

    默认情况下,将安装7.2版本,但如果你喜欢较旧的版本,可以将其URL添加到你的docker-compose.yml文件中,如下所示:

    environment:
        URL: "https://global.synologydownload.com/download/DSM/release/7.0.1/42218/DSM_VirtualDSM_42218.pat"

    使用这种方法,你可以在保留文件数据的同时在不同版本之间切换。

    与标准DSM相比有什么区别?

    与标准DSM相比,只有两个小的区别:不提供Virtual Machine Manager软件包,Surveillance Station不包含任何免费许可证。

    这个项目是否合法?

    是的,这个项目只包含开源代码,不分发任何受版权保护的材料。它也没有试图绕过任何版权保护措施。因此,在所有适用的法律下,这个项目都被认为是合法的。

    然而,通过安装Synology的Virtual DSM,你必须接受他们的最终用户许可协议,该协议不允许在非Synology硬件上安装。因此,请只在官方Synology NAS上运行这个项目,因为任何其他用途都将违反他们的条款和条件。

    结论

    现在,你已经知道了如何在Docker容器中运行Virtual DSM,并且可以自己在计算机上体验Synology DSM的强大功能。无论你是想创建私人云、媒体服务器还是备份解决方案,Virtual DSM都为你提供了一个灵活且成本效益的选择。

    请记住,Synology的Virtual DSM仍然受其最终用户许可协议的约束,因此只能在官方Synology硬件上合法使用。希望这篇文章对你有所帮助,让你更好地理解如何配置和使用Virtual DSM。

  • 探索全新的虚拟世界:《Biomes》- 基于Web的开放世界MMORPG

    有一天,当你打开你的浏览器,你将迎来一个全新的世界——《Biomes》。这是一款由全球知名公司OpenAI收购的Global Illumination公司开发的大型多人在线角色扮演游戏。它不同于传统的游戏下载安装方式,而是采用了现代的Web技术,包括React、Next.js、TypeScript和WebAssembly,为你呈现一个开放世界的沉浸式体验。

    开启全新的冒险之旅

    一开始,你会被引入到一个充满奇幻色彩的故事中。在《Biomes》的世界里,你是一位勇敢的冒险者,来到了一个神秘的大陆。这个大陆被神秘的力量所主宰,分为不同的生态系统,被称为“生态区”。每个生态区都有其独特的生物、植被和地理特征,等待你去探索。

    这是一个真正开放的世界,没有固定的任务线,没有强制性的剧情,一切都由你来决定。你可以选择成为一名强大的战士,探索危险的地下迷宫;你也可以成为一名巧妙的商人,建立自己的商业帝国;或者你可以选择和其他玩家合作,建造壮丽的城市,探索未知的地域。在《Biomes》中,决策由你来制定,冒险由你来书写。

    玩法与技术的完美融合

    《Biomes》的开发团队采用了一系列最先进的Web技术,以实现无缝的游戏体验。游戏使用React和响应式编程范式,为你呈现出精美的游戏画面和流畅的操作。而WebAssembly技术的运用则保证了游戏的高性能,让你能够在浏览器中尽情畅玩,而无需担心卡顿或加载时间过长。

    共同建设的世界

    在《Biomes》中,社交和合作是游戏的重要一部分。你可以与来自世界各地的其他玩家建立联系,组成团队,共同探索未知的领域。合作不仅仅限于战斗,你还可以合作建造城市、交换资源、甚至是开展文化交流。

    游戏采用了分布式架构,但你也可以选择在本地单人游玩,享受宁静的探险。如果你希望为游戏贡献自己的一份力量,欢迎加入我们友好的开发者社区,一起让《Biomes》变得更加精彩。

    游戏截图

    file

    如何开始冒险

    要开始你的冒险之旅,首先需要在本地运行游戏服务器。这个过程可能需要一些技术操作,但我们的官方文档会为你提供详细的指导,确保你可以顺利启动游戏。

    更多详情

    如果你对《Biomes》产生了浓厚的兴趣,不妨访问我们的官方网站 https://www.biomes.gg 或查阅我们的官方文档,这里有更多关于游戏的详细信息和教程,帮助你更好地开始你的冒险之旅。

    结语

    《Biomes》是一款颠覆传统的大型多人在线角色扮演游戏,采用了现代Web技术,为玩家提供了一个无与伦比的冒险体验。在这个开放的世界里,你可以成为自己想成为的角色,探索未知的领域,建立友谊和合作。无需下载,只需打开浏览器,你就可以开始你的冒险之旅。快来加入我们,一起探索《Biomes》的奇幻世界吧!

  • 探索未知的游戏世界:Citra 3DS 模拟器

    你是否曾怀念起那些在任天堂3DS上度过的美好时光?那些令人难忘的冒险、精彩的角色和充满创意的游戏?如今,有一个令人兴奋的项目,可以带你回到那个美好的时代——Citra 3DS 模拟器。
    file

    开篇故事

    还记得当初第一次拿起任天堂3DS掌机,那种全新的游戏体验吗?无论是探索《塞尔达传说》的神秘王国,还是在《口袋妖怪》世界中捕捉可爱的精灵,那些瞬间都令人难以忘怀。但是,时光不饶人,3DS已经逐渐退出历史舞台,留下了我们对那些游戏的美好回忆。

    然而,Citra 模拟器的出现改变了一切。这是一个令人兴奋的开源项目,它允许你在计算机上模拟运行任天堂3DS游戏,重新体验那些经典的冒险。无论你是怀念某个特定的游戏,还是想要发掘3DS世界的无限可能性,Citra都能满足你的需求。

    什么是Citra?

    Citra是世界上最受欢迎的开源任天堂3DS模拟器。这个项目采用C++编写,注重可移植性,并积极维护适用于Windows、Linux、Android和macOS的不同版本。无论你使用哪种操作系统,你都可以轻松地在Citra上运行你喜爱的3DS游戏。

    游戏兼容性

    一款好的模拟器必须具备强大的游戏兼容性,而Citra绝对不会让你失望。只要你满足必要的硬件要求,Citra能够以全速运行大多数商业游戏。想要查看Citra支持的游戏清单?请访问他们的兼容性页面

    如何获取Citra?

    Citra提供两种主要版本:夜版(Nightly)和金丝雀版(Canary)。

    • 夜版基于主分支构建,包含已经经过审查和测试的功能。
    • 金丝雀版也基于主分支,但包含仍在审查中的附加功能。带有"canary-merge"标签的PR仅合并到金丝雀版。

    无论你选择哪个版本,你都可以在Citra官方网站上找到安装程序。此外,如果你正在寻找特定版本或独立发布的版本,也可以在夜版和金丝雀版本的发布标签中找到它们。

    对于Android用户,你可以直接从Google Play商店下载Citra。

    如果你使用Flatpak,也可以在Flathub上找到Citra的Flatpak版本。关于构建过程的详细信息可以在他们的Flathub存储库中找到。

    参与开发

    Citra的大部分开发工作都在GitHub上进行。这也是他们的中央存储库的托管地。如果你想参与开发讨论,请加入他们的Discord服务器,或者在libera的#citra-dev频道中与他们互动。

    如果你想为项目做出贡献,请查看贡献者指南开发者信息。你也可以在Discord上联系任何一位开发者,了解模拟器的当前状态。

    如果你想为用户界面翻译做出贡献,请查看Citra在Transifex上的项目。他们在那里集中进行翻译工作,并定期上游翻译。

    构建你自己的Citra

    Citra的多平台支持使得构建过程非常简单。无论你是使用Windows、Linux、macOS还是Android,你都可以找到相应的构建指南。

    支持Citra

    如果你喜欢Citra项目并想在财务上支持他们,可以考虑成为他们的Patron。你的捐赠将有助于项目的持续发展和改进。

    此外,Citra团队也非常乐意接受捐赠的游戏和硬件。如果你愿意捐赠3DS掌机、游戏或其他相关设备,请查看他们的捐赠页面,了解如何贡献给Citra项目。所有捐赠收到的资金将用于购买3DS掌机供开发人员研究硬件、进行游戏测试以及构建所需的基础设施。

    此外,他们也欢迎使用过的3DS

    掌机!如果你想要捐赠你的3DS掌机,请加入他们的Discord服务器,与他们的团队联系。

    结语

    Citra是一个令人兴奋的项目,它允许你重新探索任天堂3DS的游戏世界。无论你是怀念经典的游戏还是想要发掘未知的游戏宝藏,Citra都为你提供了一个机会。赶快下载并开始你的冒险吧!

    希望你会喜欢Citra,一款带你重返3DS游戏时光的模拟器。

  • 如何将网页保存为本地PDF并分享给家人和朋友

    开篇故事: 你曾经遇到过这样的情况吗?你在浏览网页时,发现一篇非常有趣或者有用的文章,想要保存下来以备将来阅读或分享给亲朋好友。然而,由于网页链接可能会失效或者你不想依赖互联网连接,将网页保存为本地PDF成了一个明智的选择。在这篇文章中,我们将分享一些简单而有效的方法,教你如何将网页存储为本地PDF,并且可以轻松分享给你的家人和朋友。

    步骤一:使用浏览器内置功能

    有些现代浏览器已经内置了将网页保存为PDF的功能,最常见的是Edge和Opera浏览器。

    • Edge浏览器: 打开你想要保存的网页,然后按下CTRL+Shift+S组合键,即可捕获整个网页并保存为PDF格式。

    • Opera浏览器: 同样地,打开目标网页,然后点击浏览器菜单中的“文件”选项,选择“保存页面为PDF”。

    这两种方法都非常简单,适用于单页网页的保存。

    步骤二:使用浏览器扩展

    如果你需要保存多层级的网页,包括图片和文字,那么你可以考虑使用浏览器扩展来更灵活地操作。以下是一些常用的浏览器扩展:

    • SingleFile(Chrome扩展): SingleFile是一个Chrome扩展,它可以将整个网页保存为单个HTML文件,包括文字、图片和样式。你可以在Chrome网上应用商店中找到并安装它。

    • Print Friendly(Chrome扩展): 这个扩展可以将网页保存为干净的、易于打印的PDF文件。它通常会去除广告和多余的元素,使保存的PDF更具可读性。

    • GoFullPage(Chrome插件): 这款插件可以将整个网页(包括未显示的滚动区域)保存成长截图,然后导出为PDF。

    • IDM(Internet Download Manager): 如果你需要下载包含内部跳转链接的网站,IDM是一个非常方便的工具,它可以帮助你离线保存网站内容。

    步骤三:使用专业工具

    如果你需要更高级的功能,如全文搜索、服务器部署等,你可以考虑以下工具:

    • Hamsterbase: 这是一个功能强大的工具,可以完美保存几乎任何网站的文字、图片和样式,支持全文搜索,并且可以离线使用。你可以查找相关信息并了解如何使用它。

    • ArchiveBox: 这是一个开源工具,可以帮助你保存整个网站的快照,支持多层级的网页保存。你可以在官方网站archivebox.io上找到更多信息。

    步骤四:分享给家人和朋友

    保存好网页后,你可以轻松地分享给家人和朋友。将保存的PDF文件发送给他们,或者使用云存储服务如Google Drive或Dropbox分享链接,让他们可以方便地访问。

    无论是保存有趣的文章、备份重要信息,还是分享有价值的内容,将网页保存为本地PDF是一个非常实用的技巧,让你更好地管理和分享网络资源。

    在今天的教程中,我们分享了多种方法,希望它们对你有所帮助。现在,你可以尝试使用这些方法,将你最喜欢的网页保存为本地PDF,并与你的亲朋好友一起分享!

    结束语

    在数字时代,信息爆炸,如何高效地管理和分享网络内容成了一个重要的问题。通过将网页保存为本地PDF,你可以更好地掌控自己的信息流,随时随地访问你需要的内容。希望这些方法对你有所帮助,让你的网络生活更加便捷!

  • 挖矿与AI结合:能否降低AI训练成本?

    在数字化时代的浪潮下,人工智能(AI)已经成为了创新的引擎,驱动着各个领域的发展。然而,AI的训练成本一直以来都是一个令人头疼的问题。最近,有一位网友提出了一个非常有趣的问题:是否可以将加密货币和AI结合,以降低AI的训练成本呢?

    这个问题涉及到了两个备受关注的话题:加密货币和人工智能。让我们一起来探讨一下这个想法是否可行。

    加密货币的概念

    首先,让我们了解一下加密货币是什么。加密货币是一种数字或虚拟的货币,它使用密码学技术来保护交易的安全,并且不依赖于中央银行或政府发行。最著名的加密货币之一是比特币,但还有许多其他加密货币,如以太坊、莱特币等。

    加密货币的价值是由市场供需决定的,因此其价值可能会波动。一些人投资加密货币,希望其价值会上涨,而另一些人则使用加密货币进行交易或支付。

    AI训练的挑战

    AI的训练是一个计算密集型任务,通常需要大量的计算资源和时间。特别是在深度学习领域,训练大型神经网络模型可能需要数百台高性能计算机和大量的电力资源。这导致了高昂的训练成本,使得只有大型科技公司或研究机构才能承担这些费用。

    这也意味着许多有潜力的AI项目和研究受到了资金限制,无法充分发展。因此,减少AI训练成本对于推动AI技术的发展至关重要。

    将加密货币和AI结合

    现在,让我们回到问题本身:是否可以将加密货币和AI结合,以降低AI的训练成本?

    1. 加密货币用于购买训练资源

    一种可能的方法是将加密货币用于购买AI训练所需的计算资源。例如,矿场可以提供计算算力,用户可以使用加密货币购买这些资源来进行AI训练。这将为AI项目提供了一种新的筹资方式,使更多的人能够参与AI研究和开发。

    2. 分布式机器学习

    另一个潜在的好处是分布式机器学习。如果将AI训练任务分解成多个子任务,并分发到全球的矿机上,那么参与资格将大幅降低。这种分布式方法可以加速训练过程,同时也减少了中央控制的依赖。

    然而,这个想法也面临着一些挑战和限制。

    潜在挑战与限制

    1. 计算资源需求

    首先,即使使用加密货币购买计算资源,大型AI训练仍然需要大量的计算资源。即便分布式机器学习可以降低单个任务的难度,但全球范围内仍然需要大量的算力,这可能会限制项目的可行性。

    2. 数据可靠性和隐私

    AI训练需要大量的数据,而这些数据可能包含敏感信息。确保分布式计算过程中数据的可靠性和隐私保护是一个复杂的问题。此外,数据的质量也是一个重要问题,因为训练模型的结果取决于输入数据的质量。

    3. 算法设计

    分布式AI训练需要重新设计算法,以确保计算可以被拆分、验证计算结果的正确性,并协调计算任务。这需要深入的研究和开发,以适应加密货币的特殊环境。

    4. 加密货币市场波动

    加密货币市场价格的波动可能导致资源成本不稳定。如果加密货币价格大幅波动,训练成本可能会快速上升或下降,这对项目的稳定性构成威胁。

    结论

    将加密货币和AI结合是一个引人注目的想法,可能为AI项目提供了新的筹资方式和分布式计算的机会。然而,这个想法也面临着许多挑战和限制,包括计算资源需求、数据可靠性、算法设计和市场波动等问题。

    目前,要实现这个想法可能需要大量的研究和开发工作,以解决上述问题。尽管如此,这个想法仍然激发了人们对于创新的热情,为AI和加密货币领域的未来发展提供了更多可能性。

    所以,虽然现在实现这个想法可能还存在一些不确定性,但我们可以期待未来会有更多关于加密货币与AI结合的创新和发展。