Category: 技术折腾

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

  • 声音魔法:VITS音频转换框架揭秘

    声音魔法:VITS音频转换框架揭秘

    在一个安静的夜晚,我坐在电脑前,思考着如何将我的声音转化成我的最爱的音乐人的声音。这似乎是一个不可能的任务,但却充满了神秘感。突然,我发现了一个名为Retrieval-based-Voice-Conversion-WebUI的项目,它基于VITS(Voice Inference from Text and Speech)框架,提供了一个轻松易用的声音转换工具。于是,我踏上了声音魔法之旅,今天我将与大家分享这一奇妙的经历。

    声音转换的魅力

    在开始揭秘Retrieval-based-Voice-Conversion-WebUI之前,让我们先来聊聊声音转换的魅力。声音是一种神奇的媒介,可以传达情感、表达个性,甚至改变现实。你是否曾经梦想过能够像你喜爱的歌手一样唱歌?或者是在特定场合中,用某位名人的声音发表演讲?声音转换技术为这些梦想提供了可能性。

    但是,要将声音从一种变成另一种,这绝非易事。声音转换涉及复杂的信号处理、深度学习模型和大量的数据。幸运的是,现在有了一些强大的工具和框架,它们使声音转换变得更加容易和有趣。

    Retrieva-based-Voice-Conversion-WebUI简介

    Retrieval-based-Voice-Conversion-WebUI是一个基于VITS框架的声音转换工具,它可以将一种声音转换为另一种声音,同时保留语音的自然感觉。这个项目的目标是让声音转换变得容易,并且可以在普通电脑上进行,无需高端硬件。

    以下是这个项目的一些关键特点:

    • 通过使用top1检索将源特征替换为训练集特征,减少音调泄漏。
    • 即使在相对较差的显卡上,也可以进行轻松快速的训练。
    • 即使使用少量数据进行训练,也可以获得相对好的结果(建议使用不少于10分钟的低噪音语音)。
    • 支持模型融合以改变音色。
    • 提供易于使用的WebUI界面。
    • 使用UVR5模型快速分离声音和乐器。
    • 使用最强大的高音提取算法InterSpeech2023-RMVPE来防止消音问题,提供了显著更好的结果,速度更快,资源消耗更低。

    现在,让我们一起来探索如何使用Retrieval-based-Voice-Conversion-WebUI进行声音转换。

    准备环境

    首先,确保你的Python版本是3.8或更高。然后,执行以下命令以安装主要依赖项:

    # 安装PyTorch相关核心依赖项,如果已安装,请跳过
    pip install torch torchvision torchaudio

    接下来,可以使用Poetry来安装其他依赖项:

    # 安装Poetry依赖管理工具,如果已安装,请跳过
    curl -sSL https://install.python-poetry.org | python3 -
    
    # 安装项目依赖项
    poetry install

    或者,你也可以使用pip来安装它们:

    # 对于Nvidia显卡
    pip install -r requirements.txt
    
    # 对于Windows上的AMD/Intel显卡(DirectML):
    pip install -r requirements-dml.txt
    
    # 对于Linux / WSL上的Intel ARC显卡,使用Python 3.10:
    pip install -r requirements-ipex.txt
    
    # 对于Linux上的AMD显卡(ROCm):
    pip install -r requirements-amd.txt

    接下来,你需要下载其他预模型文件,可以在项目的Huggingface空间中找到它们。这些文件包括了用于推断和训练的预模型文件。确保将它们放在正确的目录下。

    开始声音转换

    一旦你的环境准备好了,你可以使用以下命令启动WebUI:

    python infer-web.py

    如果你使用的是Windows或macOS,你可以直接下载并解压RVC-beta.7z文件,然后使用go-web.bat(Windows)或sh ./run.sh(macOS)来启动WebUI。

    结束语

    声音转换是一门神奇的艺术,它使我们能够在声音的世界中自由穿越。Retrieval-based-Voice-Conversion-WebUI为我们提供了一个便捷的工具,让我们能够将声音转换成我们想要的样子。无论是在娱乐还是工作中,这个项目都有着巨大的潜力。探索声音的可能性,释放声音的魔法吧!

  • 编程的奇妙之旅:Python多线程爬虫下载PDF教材

    编程的奇妙之旅:Python多线程爬虫下载PDF教材

    有一天,当我坐在电脑前,思考着编程的奇妙之处时,一种冒险的感觉涌上心头。我想,为什么不用编程来探索互联网的深处,下载一些有趣的教材呢?于是,我开始了这次奇妙的编程之旅,带着好奇心和激情,我将向你展示如何使用Python编写一个多线程爬虫,用于下载各种教材的PDF文件。

    准备工作

    在我们踏上这次冒险之前,我们需要做一些准备工作。

    初始化日志

    首先,我们需要设置日志记录,以便随时跟踪我们的编程冒险。

    import logging
    
    def init_logging():
        logging_format = '%(asctime)s\t[%(levelname)s]\t[%(name)s]\t[%(threadName)s]\t%(message)s'
        logging.basicConfig(format=logging_format, level=logging.INFO)

    导入必要的库

    为了让我们的编程冒险变得更加容易,我们需要使用requests库来进行网络请求和数据下载。如果你还没有安装这个库,请使用以下命令来安装它:

    pip install requests

    设置下载目录和线程数量

    这两个变量将在后面的代码中使用,你可以根据需要进行调整。

    download_base_dir = 'd:/book3'  # 设置下载文件保存的文件夹
    thread_count = 8  # 设置线程数量

    开始编写爬虫

    请求数据版本

    首先,我们需要获取教材数据的版本信息,这将有助于我们确定要下载的文件。

    def request_data_version() -> [str]:
        # 目标URL
        data_url = "https://s-file-1.ykt.cbern.com.cn/zxx/ndrs/resources/tch_material/version/data_version.json"
        try:
            logging.info("开始请求URL: %s", data_url)
            response = requests.get(data_url)
            logging.info("状态码 %s, 响应内容: %s", response.status_code, response.text)
            if response.status_code == 200:
                data = response.json()
                return data["urls"].split(",")
            else:
                logging.warning("无法获得正确的响应,程序退出 -1。")
                sys.exit(-1)
        except requests.exceptions.RequestException as e:
            logging.exception("请求数据版本失败", e)

    请求单个数据URL

    接下来,我们将请求每个教材的数据URL,并解析教材信息。

    def request_single_data_url(data_url: str) -> [dict]:
        try:
            logging.info("开始请求URL: %s", data_url)
            response = requests.get(data_url)
            logging.info("状态码 %s", response.status_code)
            if response.status_code == 200:
                data = response.json()
                books = []
                for d in data:
                    book_data = parse_book_data(d)
                    if len(book_data) != 0:
                        books.append(book_data)
                    else:
                        logging.warning("跳过此教材: %s", d['title'])
                return books
        except requests.exceptions.RequestException as e:
            logging.exception("请求单个数据URL失败", e)

    解析教材数据

    我们将解析每本教材的数据,包括教材名称和标签。

    def parse_book_data(data: dict) -> dict:
        book_id = data['id']
        book_name = data['title']
        book_tags = data['tag_list']
        book_tags = sorted(book_tags, key=custom_sort_tag_list, reverse=True)
        if '版' not in (book_tags[0]['tag_name']):
            return {}
        return {"id": book_id, "name": book_name, "dirs": get_dirs_from_tags(book_tags)}

    获取目录信息

    我们将从标签中提取目录信息,以便稍后创建文件夹。

    def get_dirs_from_tags(book_tags) -> str:
        return f"{book_tags[0]['tag_name']}/{book_tags[1]['tag_name']}/{book_tags[2]['tag_name']}"

    自定义标签排序

    为了确保我们获取的是正确的教材版本,我们需要自定义排序标签。

    def custom_sort_tag_list(tag):
        tag_name = tag['tag_name']
        school_level, edition, grade, semester, course_name = '', '', '', '', ''
        if "版" in tag_name:
            edition = tag_name
        elif "年级" in tag_name:
            grade = tag_name
        elif "册" in tag_name:
            semester = tag_name
        elif '小学' in tag_name or '初中' in tag_name or '高中' in tag_name:
            school_level = tag_name
        elif '教材' not in tag_name:
            course_name = tag_name
    
        return edition, school_level, grade, course_name, semester

    下载教材

    最后,我们将下载每本教材的PDF文件。

    def download_book(book):
        file_dir = f"{download_base_dir}/{book['dirs']}"
        file_name = f"{book['name']}.pdf"
        file_full_path = os.path.join(file_dir, file_name)
        logging.info("开始下载教材: %s/%s", file_dir, file_name)
        try:
            if not os.path.exists(file_dir):
                os.makedirs(file_dir)
        except FileExistsError:
            logging.warning("文件夹 %s 已经存在", file_dir)
    
        download_url = f"https://r1-ndr.ykt.cbern.com.cn/edu_product/esp/assets_document/{book['id']}.pkg/pdf.pdf"
        response = requests.get(download_url)
        if response.status_code == 200:
            with open(os.path.join(file_dir, file_name), "wb") as file:
                file.write(response.content)
                logging.info("教材下载成功: %s", file_full_path)
        else:
            logging.warning("教材下载失败,状态码: %s", response.status_code)

    多线程下载

    我们将使用多线程来提高下载速度。

    def multi_thread_download
    
    _books(shared_queue: queue.Queue):
        try:
            while True:
                item = shared_queue.get_nowait()
                download_book(item)
                shared_queue.task_done()
        except queue.Empty:
            logging.warning("队列为空")

    请求所有教材

    最后,我们将请求所有教材的信息并将其添加到共享队列中。

    def request_all_books_to_shared_queue():
        shared_queue = queue.Queue(maxsize=3000)
        urls = request_data_version()
        for url in urls:
            books = request_single_data_url(url)
            for book in books:
                shared_queue.put(book)
        return shared_queue

    执行下载

    现在,我们已准备好执行下载任务。

    if __name__ == '__main__':
        init_logging()
    
        # 下载文件保存的文件夹
        download_base_dir = 'd:/book3'
        # 线程数量
        thread_count = 8
    
        all_books_queue = request_all_books_to_shared_queue()
        with concurrent.futures.ThreadPoolExecutor(max_workers=thread_count) as executor:
            futures = [executor.submit(multi_thread_download_books, all_books_queue) for i in range(thread_count)]
            concurrent.futures.wait(futures)
    
        logging.info("完成下载!!!")

    结束语

    通过这个教程,你已经学会了如何使用Python编写一个多线程爬虫,用于下载各种教材的PDF文件。这个项目不仅展示了编程的实际应用,还提供了深入探索网络资源的机会。希望你能充分利用这些技能,探索更多有趣的项目和挑战!

  • 探索SmartKnob:开源虚拟刻度旋钮的未来

    探索SmartKnob:开源虚拟刻度旋钮的未来

    想象一下,你坐在办公桌前,试图调整电脑屏幕的亮度。你手中握着一个旋钮,不同寻常的是,它不只是冷冰冰的金属,而是有着柔软质感的材料。当你旋转它时,感觉到一种微妙的阻力,仿佛是在探索一个真实的世界。屏幕的亮度随着旋钮的转动而逐渐改变,仿佛与你亲手操作有关。这不再是普通的旋钮,这是SmartKnob,数字时代的旋钮。

    SmartKnob是什么?

    SmartKnob是一款开源的输入设备,它与众不同之处在于,它具备软件可配置的终点和虚拟刻度。SmartKnob采用了磁性编码器和无刷云台电机,实现了闭环扭矩反馈控制。这意味着用户可以感受到真实的点击和弹性,使得调整变得更加精确和令人愉悦。

    这个项目的灵感源自Jesse Schoch的视频”haptic textures and virtual detents“,以及在SimpleFOC社区中的相关讨论。SmartKnob的目标是将这种虚拟刻度的触感带入我们的数字生活中,使用户能够更加自由和精确地进行各种调整。

    项目背后的创作者

    这个激动人心的项目的创造者是Scott Bezek,他是一位热衷于开源硬件和软件的电子爱好者。他将自己的技术和创意投入到SmartKnob中,旨在为用户提供一种全新的、令人愉悦的控制体验。

    SmartKnob的特点

    SmartKnob拥有一系列引人注目的特点,使其成为一个备受期待的项目。

    闭环扭矩反馈

    SmartKnob采用磁性编码器和无刷云台电机,实现了闭环扭矩反馈控制。这一技术使用户可以感受到真实的点击和弹性,使调整更加精确和令人愉悦。无论你是在调整音响音量还是控制车辆的空调温度,SmartKnob都能提供与实体旋钮一样的触感。

    软件可配置

    SmartKnob的终点和虚拟刻度是软件可配置的。这意味着用户可以根据自己的需求动态地调整旋钮的触感,使其适应不同的应用场景。无论是需要快速调整还是进行精确的微调,SmartKnob都能满足你的需求。这种灵活性是传统旋钮无法比拟的。

    开源项目

    SmartKnob是一个开源项目,这意味着任何人都可以查看和修改其设计和代码。这鼓励了创新和社区参与,使项目不断发展和改进。如果你有自己的创意或改进建议,你可以积极参与到SmartKnob的发展中,为用户提供更好的体验。

    SmartKnob View

    SmartKnob View:更直观的控制体验

    SmartKnob项目中的一个令人兴奋的亮点是SmartKnob View,它提供了一种高级的SmartKnob体验。该版本具有一个集成的显示屏,使用户能够更直观地控制各种参数。它正在积极开发中,为用户提供了更多功能和便利性。

    令人振奋的特性

    SmartKnob View具有一系列令人振奋的特性,包括:

    • 240×240圆形LCD,由39.5mm的表玻璃保护。
    • 带有中空轴的BLDC云台电机,用于机械和电气连接LCD。
    • 由ESP32-PICO-V3-02(Lilygo TMicro32 Plus模块)供电。
    • PCB弯曲和SMD电阻用作压力检测的应变计(通过电机提供刚性和动态的角度变化)。

    SmartKnob View的目标是为用户提供更直观的控制体验,让他们能够更轻松地进行各种调整和设置。无论是在音乐制作中需要精确的音量控制,还是在设计工

    程中需要精确的参数调整,SmartKnob View都能胜任。

    结语

    SmartKnob是一个令人兴奋的开源项目,它将虚拟刻度的触感引入了数字世界,为用户提供了更加自由和精确的控制体验。创作者Scott Bezek的激情和创意使这个项目成为可能,而SmartKnob View的推出将进一步提升用户的体验。

    如果你对SmartKnob项目感兴趣,可以在GitHub上查看其代码库。这个项目还在不断发展,你可以通过参与社区来贡献你的想法和技能。

    未来,我们可以期待更多类似的创新项目,将物理世界的触感带入数字领域,为用户提供更出色的交互体验。SmartKnob只是众多可能性中的一个,它为我们打开了一扇通向未来的大门。

  • 如何下载PT资源:是否需要整双网卡?

    如何下载PT资源:是否需要整双网卡?

    想象一下,你是一个热衷于下载PT资源的电影爱好者。每当有新的电影资源发布,你都迫不及待地想要获取。但是,你在下载时是否应该考虑使用两张网卡呢?这就是我们今天要讨论的问题。

    IP不一样要小心封号

    有人认为,使用两张网卡下载PT资源可以带来一些好处。首先,如果你使用两张网卡,你可以分别用于下载和上传。这意味着你可以在下载资源的同时,保持一个良好的上传速度,提高了你的分享比例。然而,需要注意的是,如果你使用两个不同的IP地址,你需要小心被PT站点封号的风险。因此,在使用两张网卡时,确保你的IP地址不会相互冲突至关重要。

    无需上传下载分开

    另一方面,也有人认为,完全没有必要使用两张网卡进行下载。现在的以太网连接都是全双工的,意味着它们可以同时进行上传和下载,而不会互相干扰。如果你的网络带宽足够大,很可能不需要额外的网卡。此外,PT资源下载通常更侧重于挂机时间,而不是上传速度。只有在你有大带宽上行速度,且不担心被运营商查封的情况下,使用两张网卡才有可能带来明显的好处。

    风险和建议

    然而,需要注意的是,如果你过于频繁地切换IP地址或者被PT站点认定为共享账号,你可能会面临被封禁的风险。因此,在决定是否使用两张网卡时,务必谨慎考虑你的网络环境和站点政策。最好的建议是,首先尝试使用单张网卡,如果你感觉下载和上传速度都满足需求,那么就不需要额外的网卡了。如果你追求更高的分享比例,可以考虑升级你的网络带宽,而不是使用两张网卡。

    结论

    综上所述,是否需要整双网卡来下载PT资源取决于你的个人需求和网络环境。如果你追求更高的分享比例,并且可以管理好两个不同IP地址的风险,那么使用两张网卡可能对你有利。但如果你的网络带宽足够大,并且不想面临封禁的风险,那么单张网卡可能已经足够。最重要的是,始终遵守PT站点的规则,以确保你的下载体验顺畅而安全。

    这就是今天关于是否需要整双网卡来下载PT资源的讨论。希望这些观点和建议对你有所帮助,让你能够更好地享受PT资源下载的乐趣。

  • 如何使用Python自动发送批量邮件

    如何使用Python自动发送批量邮件

    在现代社交网络和电子通信的时代,电子邮件仍然是一种重要的沟通工具。无论是向客户发送营销邮件,还是向团队成员发送通知,自动化发送批量邮件是提高效率的关键。在本教程中,我们将学习如何使用Python编写一个自动发送批量邮件的脚本。

    背景故事

    假设你是一名市场营销专家,你需要向数百位潜在客户发送个性化的邮件,以推广你的产品或服务。手动一个一个发送邮件将是一项繁琐且耗时的任务。但是,有了Python的帮助,你可以轻松地自动化这个过程,将你的邮件发送到每个收件人。

    准备工作

    在我们开始之前,让我们先进行一些准备工作:

    1. SMTP邮箱设置:你需要一个支持SMTP(Simple Mail Transfer Protocol)的邮箱,例如Gmail或QQ邮箱。确保开启SMTP服务,并获取SMTP服务器地址和端口号以及你的发件人邮箱和密码。

    2. CSV收件人列表:将你要发送邮件的收件人列表保存为CSV文件,每行一个邮箱地址。这个列表可以包含数百个收件人。

    使用Python编写自动发送邮件脚本

    我们将使用Python编写一个脚本,它将完成以下任务:

    1. 连接SMTP服务器:与SMTP服务器建立连接,使用TLS协议进行安全连接。

    2. 登录邮箱:使用你的发件人邮箱和密码登录SMTP服务器。

    3. 构造邮件内容:创建一封包含主题、正文、图片和附件的邮件。

    4. 发送邮件:将邮件发送给收件人。

    以下是Python代码的主要部分:

    import smtplib
    import csv
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText
    from email.mime.image import MIMEImage
    
    def send_email(sender_email, sender_password, receiver_email):
        # 与SMTP服务器建立连接
        smtp_server = 'smtp.qq.com'
        server_port = 587
        server = smtplib.SMTP(smtp_server, server_port)
        server.starttls()
    
        try:
            # 登录邮箱账号
            server.login(sender_email, sender_password)
    
            # 构造邮件内容
            msg_root = MIMEMultipart('related')
            msg_root['Subject'] = '测试一下'
            msg_root['From'] = sender_email
            msg_root['To'] = receiver_email
    
            subject = '测试一下111111'
            message = '''
            <html>
              <body>
                <p><img src="cid:image1" alt="升学教育图片" style="width:300px;height:200px;"></p>
                <p>班上新来一位学生,名字叫“马騳骉”。</p>
                <p>开学点名了,班主任不知怎么念,就说 : 马叉叉到了没?</p>
                <p>语文老师有点文学素养,点名道:万马奔腾到了没?</p>
              </body>
            </html>
            '''
    
            # 添加文本内容
            html_part = MIMEText(message, 'html')
            msg_root.attach(html_part)
    
            # 添加图片附件
            with open('path/to/your/image.jpg', 'rb') as image_file:
                image_part = MIMEImage(image_file.read())
                image_part.add_header('Content-Disposition', 'attachment; filename=image.jpg')
                image_part.add_header('Content-ID', '<image1>')
                msg_root.attach(image_part)
    
            # 添加附件
            with open('path/to/your/attachment.pdf', 'rb') as file:
                attachment_part = MIMEApplication(file.read(), Name='attachment.pdf')
                attachment_part.add_header('Content-Disposition', 'attachment; filename=attachment.pdf')
                msg_root.attach(attachment_part)
    
            # 发送邮件
            server.sendmail(sender_email, receiver_email, msg_root.as_string())
            print(f"邮件发送成功: {receiver_email}")
        except smtplib.SMTPException as e:
            print(f"邮件发送失败: {receiver_email},错误信息: {str(e)}")
    
        # 关闭连接
        server.quit()
    
    # 创建收件人邮箱列表
    receiver_emails = []
    
    # 读取CSV文件并获取收件人邮箱列表
    with open('path/to/your/email.csv', 'r') as file:
        reader = csv.reader(file)
        for row in reader:
            receiver_emails.append(row[0])
    
    # 循环发送邮件给收件人列表中的每个邮箱
    for receiver_email in receiver_emails:
        send_email(sender_email, sender_password, receiver_email)

    批量发送邮件

    要批量发送邮件,我们将创建一个函数 send_emails,它将循环遍历收件人列表,并在每个邮箱上启动一个线程以异步发送邮件。这可以大大提高邮件发送速度。

    以下是如何批量发送邮件的代码:

    import threading
    
    def send_emails(sender_email, sender_password, thread_count):
        # 创建线程列表
        threads = []
    
        # 创建发送邮件的函数
        def send_email_thread(receiver_email):
            send_email(sender_email, sender_password, receiver_email)
    
        # 创建并启动发送邮件的线程
        for receiver_email in receiver_emails:
            t = threading.Thread(target=send_email_thread, args=(receiver_email,))
            threads.append(t)
            t.start()
    
            # 控制最大线程数
            if len(threads) >= thread_count:
                for thread in threads:
                    thread.join()
                threads = []
    
        # 等待剩余线程完成
        for thread in threads:
            thread.join()
    
    # 调用批量发送邮件函数
    send_emails(sender_email, sender_password, thread_count)

    结论

    通过使用Python编写自动发送批量邮件的脚本,我们可以轻松地将邮件发送给大量收件人,提高工作效率。无论是市场营销还是通知,这个自动化方法都可以帮助你节省时间和精力。

    希望这篇教程对你有所帮助!如果你有任何问题或需要进一步的指导,请随时联系我们。

  • 如何自动加密和删除文件夹中的文件

    如何自动加密和删除文件夹中的文件

    你是否曾经担心过将重要文件存储在电脑上,担心它们可能被他人访问或丢失?在本教程中,我们将介绍如何使用Python编写一个自动化脚本,将文件夹中的文件压缩、加密,并安全地删除原始文件,以保护你的数据。让我们一起来看看如何做到这一点!

    背景故事

    假设你有一个包含敏感文件的文件夹,你希望将这些文件压缩并加密,以确保它们不会被未经授权的人访问。同时,你也想要删除原始文件,以释放磁盘空间并减少风险。这个任务可能会变得非常繁琐,但幸运的是,我们可以使用Python来自动化这个过程。

    准备工作

    在我们深入讨论代码之前,让我们先了解一些准备工作。首先,我们需要确保你的计算机上安装了WinRAR软件,因为我们将使用它来进行文件的压缩和加密。另外,你需要提供一个密码,用于加密压缩文件。

    使用Python编写自动化脚本

    我们将使用Python编写一个自动化脚本,执行以下操作:

    1. 压缩文件夹:我们将使用WinRAR来压缩文件夹中的文件,创建一个加密的压缩文件。

    2. 加密压缩文件:我们将设置密码来加密压缩文件,确保只有知道密码的人才能解压文件。

    3. 删除原始文件:一旦文件成功压缩并加密,我们将安全地删除原始文件夹中的文件,以保护数据。

    以下是Python代码的主要部分:

    import shutil
    import subprocess
    import os
    import time
    from pathlib import Path
    
    def encrypt_folder_with_winrar(folder_path, password):
        # WinRAR命令
        winrar_command = r'C:\Program Files\WinRAR\WinRAR.exe'
    
        # 获取当前日期
        current_date = time.strftime("%Y-%m-%d", time.localtime())
    
        # 获取桌面BD文件夹路径
        desktop_path = str(Path.home() / "Desktop")
        bd_folder_path = os.path.join(desktop_path, "DB")
    
        # 创建DB文件夹(如果不存在)
        if not os.path.exists(bd_folder_path):
            os.mkdir(bd_folder_path)
    
        # 压缩包文件名
        compressed_filename = f'压缩包-{current_date}.rar'
    
        # 压缩包路径
        compressed_filepath = os.path.join(bd_folder_path, compressed_filename)
    
        # 加密命令
        encryption_command = [winrar_command, 'a', '-r', '-hp' + password, compressed_filepath, folder_path]
    
        # 执行加密命令
        subprocess.run(encryption_command)
    
        return compressed_filepath
    
    def encrypt_and_delete_folder(folder_path, password):
        try:
            # 压缩并加密文件夹
            compressed_file = encrypt_folder_with_winrar(folder_path, password)
    
            # 等待一段时间,确保压缩文件完成
            time.sleep(10)
    
            # 删除源文件夹中的文件
            for root, dirs, files in os.walk(folder_path):
                for file in files:
                    os.remove(os.path.join(root, file))
    
            print("加密打包操作成功")
        except Exception as e:
            print(f"加密打包操作失败:{e}")
    
            # 出现错误时,删除已创建的压缩文件
            if os.path.exists(compressed_file):
                os.remove(compressed_file)
                print("压缩文件已删除.")
    
    # 文件夹路径
    folder_path = r'D:\BACK'
    
    # 密码
    password = '123456'
    
    # 加密并删除文件夹中的文件
    encrypt_and_delete_folder(folder_path, password)

    使用定时任务自动化操作

    如果你希望定期执行这个操作,我们可以使用Python的schedule库来安排任务。在上述代码中,我们创建了一个名为encrypt_and_delete_folder的函数,它将压缩、加密和删除文件夹中的文件。然后,我们使用schedule库来定期执行这个函数。

    以下是如何设置定时任务的代码:

    import schedule
    import time
    
    # 文件夹路径
    folder_path = r'D:\BACK'
    
    # 密码
    password = '123456'
    
    # 每天定时执行加密打包操作
    schedule.every().day.at("12:20").do(encrypt_and_delete_folder, folder_path=folder_path, password=password)
    
    # 循环执行任务,并写入日志
    while True:
        schedule.run_pending()
        time.sleep(60)

    结论

    通过使用Python编写自动化脚本和定时任务,我们成功地实现了文件夹中文件的

    压缩、加密和删除操作。这种自动化方法可以帮助你更好地保护你的敏感数据,同时也节省了你的时间和精力。

    希望这篇教程对你有所帮助,如果你有任何疑问或需要进一步的指导,请随时联系我们。保持数据安全,保持自动化!

  • 如何用克拉默法则解决罗盘谜题

    如何用克拉默法则解决罗盘谜题

    在这个教程中,我们将介绍如何使用克拉默法则解决一个有趣的罗盘谜题。这个谜题涉及三个旋转的圆盘,每个圆盘都可以按照不同的规则旋转,目标是将它们都旋转到特定的角度。我们将使用克拉默法则来解决这个谜题,找到满足条件的解。让我们开始吧!

    背景故事

    想象一下,你被困在一个神秘的房间里,房间的中心有一个奇怪的装置,上面有三个旋转的圆盘。每个圆盘都有不同的旋转规则,包括旋转方向和步长。你的任务是将这三个圆盘都旋转到角度为180度的位置,但是你不知道如何操作这些圆盘。

    幸运的是,你有一本关于克拉默法则的笔记,你决定使用这个方法来解决这个问题。你开始分析每个圆盘的旋转规则和它们之间的联动规则,然后使用克拉默法则计算出每个圆盘需要旋转的次数,最终找到了解决这个谜题的方法。

    罗盘谜题

    这个罗盘谜题涉及三个圆盘,分别是内圈、中圈和外圈。每个圆盘都有以下属性:

    • 旋转方向:可以是逆时针或顺时针。
    • 旋转步长:用亮着的星星数量表示。
    • 初始角度:以角度/60的值表示。

    除此之外,还有联动规则,规定了哪些圆盘会联动旋转,哪些不会。这些规则以列表的形式给出,其中0表示内圈,1表示中圈,2表示外圈,-1表示不联动。

    使用克拉默法则解决问题

    要解决这个罗盘谜题,我们可以使用克拉默法则,该方法通常用于解决线性方程组。我们将每个圆盘的旋转次数表示为x、y和z,然后设置以下方程:

    • 内圈旋转次数:存在(self.coordination[0], 0) x + 存在(self.coordination[1], 0) y + 存在(self.coordination[2], 0) * z = 计算(self.disk[0][“init”], self.disk[0][“direction”], self.disk[0][“rotate”])
    • 中圈旋转次数:存在(self.coordination[0], 1) x + 存在(self.coordination[1], 1) y + 存在(self.coordination[2], 1) * z = 计算(self.disk[1][“init”], self.disk[1][“direction”], self.disk[1][“rotate”])
    • 外圈旋转次数:存在(self.coordination[0], 2) x + 存在(self.coordination[1], 2) y + 存在(self.coordination[2], 2) * z = 计算(self.disk[2][“init”], self.disk[2][“direction”], self.disk[2][“rotate”])

    这些方程中的系数矩阵可以用克拉默法则来解决,我们首先计算原行列式值D。然后,我们可以通过遍历的方式,找到满足整数解和非负解的x、y和z。这将是解决罗盘谜题的答案。

    下面是用Python实现的代码和算法:

    import copy
    
    class CompassPuzzleSolver:
        def __init__(self):
            # 初始化罗盘信息...
            # 省略了与文章中相同的初始化部分
            # ...
    
        # 计算到达180度所需的次数
        @staticmethod
        def count(angle: int, direction: int, rotate: int) -> int:
            b = 0
            while True:
                if angle % 180 == 0 and angle % 360 != 0:
                    return b
                else:
                    angle = angle - direction * rotate
                    b += 1
    
        # 行列式计算
        @staticmethod
        def calculate(matrix_temp: list, replace: list = [], index: int = -1) -> int:
            matrix = copy.deepcopy(matrix_temp)
            if index != -1:
                matrix[0][index], matrix[1][index], matrix[2][index] = replace[0], replace[1], replace[2]
            return \
            matrix[0][0] * matrix[1][1] * matrix[2][2] + \
            matrix[0][1] * matrix[1][2] * matrix[2][0] + \
            matrix[0][2] * matrix[1][0] * matrix[2][1] - \
            matrix[0][2] * matrix[1][1] * matrix[2][0] - \
            matrix[0][1] * matrix[1][0] * matrix[2][2] - \
            matrix[0][0] * matrix[1][2] * matrix[2][1]
    
        # 答案计算主程序
        def solve_puzzle(self) -> bool:
            # 最终目标:三圈状态均为180
            # x, y, z 三个变量,分别对应三个联动规则所需次数
            # ...
    
            # 使用克拉默法则计算...
            # 省略了计算部分的代码
            # ...
    
            # 找到满足条件的解
            # 省略了遍历部分的代码
            # ...
    
    # 创建罗盘谜题解决器对象
    solver = CompassPuzzleSolver()
    # 解决谜题并打印答案
    if solver.solve_puzzle():
    
     print("成功找到解决罗盘谜题的方法!")
    else:
        print("未找到解决罗盘谜题的方法。")
    

    结论

    通过使用克拉默法则和Python编程,我们成功解决了这个有趣的罗盘谜题,找到了每个圆盘需要旋转的次数。这个方法可以用于解决类似的问题,其中涉及多个变量和约束条件。

    如果你也喜欢解决谜题和挑战性的问题,不妨尝试一下这个罗盘谜题,看看你能否找到更快的解决方法!

    希望这篇教程对你有所帮助,如果你对克拉默法则或其他数学方法有更多的兴趣,请继续关注我的博客,我们将继续分享有趣的数学和科学知识。

  • 用AI助手Copilot在Windows上提高工作效率

    用AI助手Copilot在Windows上提高工作效率

    大家好,我是王大神,欢迎来到我的AI技术博客。今天,我将向大家介绍一项令人兴奋的新技术——Copilot在Windows上的应用。这个新的AI助手可以帮助你在Windows系统中更高效地完成各种任务,让你的工作变得更轻松。

    开篇故事

    在我们深入了解Copilot在Windows的功能之前,让我先和你分享一个故事。想象一下,你正在进行一项复杂的项目,需要同时使用多个应用程序。在过去,这可能会让你感到头疼,因为你需要不断切换和调整这些应用程序。但是现在,有了Copilot在Windows,一切都变得不同了。

    Copilot在Windows是什么?

    Copilot在Windows是一款集中的生成式AI助手,专为Windows 11设计。它与Bing Chat紧密集成,可以帮助你更轻松地实现各种创意和项目。不再需要费力地查找、启动和切换多个应用程序,Copilot在Windows可以帮你在Windows系统中完成任务,释放更多时间和精力。

    如何开始使用Copilot在Windows?

    要开始使用Copilot在Windows,只需在任务栏上选择新按钮,或按Win键 + C快捷键。Copilot在Windows将会连接到Bing Chat,使用与登录Windows的Microsoft账户或Azure Active Directory(Azure AD)账户相同的账户。如果你使用的是本地账户登录,Copilot在Windows将不可用。如果你使用工作或学校账户登录,你的体验可能会有所不同。

    与Copilot在Windows互动

    Copilot在Windows会出现在屏幕右侧,作为一个侧边栏,不会遮挡你的桌面内容,可以随时与其互动,而不会干扰你打开的应用程序窗口。当你使用Alt + Tab将焦点切换到Copilot在Windows中的特定应用程序时,需要时可以使用Win键 + C将焦点切换回Copilot在Windows。如果你需要关闭Copilot在Windows,只需像关闭其他应用程序一样选择窗口右上角的关闭按钮。当你重新打开Copilot在Windows时,它会恢复到之前的状态,包括之前的聊天内容。

    与Copilot在Windows聊天

    你可以向Copilot在Windows提出各种问题,从简单到复杂,就像你可以与Bing Chat一样。如果你想给在塞浦路斯的家人打电话,你可以快速查看当地时间,以确保不会在深夜唤醒他们。想要计划一次塞浦路斯之行吗?只需询问Copilot在Windows,让它为你找到中冬季度假的机票和住宿。要开始新的聊天会话,只需使用“新话题”按钮清除之前的聊天内容。

    Copilot在Windows还可以利用Microsoft Edge的上下文来增强回答。你可以要求它总结你正在浏览的网页,而无需提供网址或复制粘贴长文本。Copilot在Windows与剪贴板集成,可以拖放图片以进行丰富的交互,让你更快地完成任务。

    三种不同的聊天语调

    Copilot在Windows提供了三种不同的聊天语调。你可以切换聊天的语调,从“精确”模式,专注于提供更短、更关注搜索的回答,到“创意”模式,提供更长、更详细的回答。中间的设置,“平衡”模式,介于两者之间。

    Copilot在Windows可以帮助你更高效

    Copilot在Windows允许你执行常见任务并更改Windows的设置。你可以从浅色主题切换到深色模式,打开免打扰模式,或添加蓝牙设备。你甚至可以打开应用程序、整理应用窗口等等!

    在聊天窗格中,尝试以下任何操作:

    • 打开深色模式
    • 静音音量
    • 更改壁纸
    • 拍摄屏幕截图
    • 设置30分钟的专注时间
    • 打开文件浏览器
    • 使用窗口捕捉
    • 启动故障排除程序

    Copilot在Windows:工作和学校账户

    Copilot在Windows使用Bing Chat,但如果你使用工作或学校账户登录Windows设备,Copilot在Windows可能会使用Bing Chat Enterprise。你的IT管理员可能会制定更改或禁用Copilot在Windows的政策。

    当你使用Bing Chat Enterprise时,聊天历史记录不可用,聊天窗格会显示以下消息:“在此聊天中保护了您的个人和公司数据。”

    学生通常无法访问Copilot在Windows,但教职员工可能可以访问Bing Chat Enterprise。

    微软对负责任AI和隐私的承诺

    微软自2017年以来一直在负责任AI的道路上前行,我们定义了我们的原则和方法,以确保这项技术以人为本的伦理原则驱动。关于我们负责任AI之旅、指导我们的伦理原则以及我们为确保负责任开发AI技术而创建的工具和能力的更多信息,请参见“负责任AI”。

  • 如何保护你的数据和隐私在Windows Copilot中

    如何保护你的数据和隐私在Windows Copilot中

    嗨,各位大神网的读者们!今天,我要和你们聊聊一个备受瞩目的话题——Windows Copilot。或许你已经听说过它,或者正好你是第一次了解。无论如何,我都会在这篇文章中带你深入了解,因为保护你的数据和隐私是我们所有人都应该关心的事情。

    Windows Copilot是一款在Windows 11中的AI助手,通过必应聊天的帮助,它可以为你提供集中式的AI帮助。听起来很酷,对吧?但是,随之而来的问题是,它会使用你的数据来帮助你,那么你的数据和隐私是否受到保护呢?在接下来的内容中,我将详细介绍Windows Copilot如何使用你的数据,以及你可以采取哪些措施来保护自己的隐私。

    Windows Copilot的工作原理

    首先,让我们了解一下Windows Copilot的工作原理。当你在Windows中与Copilot交互时,它会收集你的请求和响应,形成一份聊天历史记录。这包括你与Copilot的文字聊天和任何图像。这个聊天历史记录可以在Microsoft帐户的隐私仪表板上找到,你可以随时单独删除以前的聊天。

    另外,如果你请求Windows Copilot汇总Microsoft Edge中活动选项卡的内容,它会首先检查你是否授予权限。如果你同意,Copilot将使用Edge页面内容来生成响应。这涉及到一些敏感信息,因此保护权限非常重要。

    保护你的数据和隐私

    既然我们知道了Windows Copilot的工作方式,接下来让我们谈谈如何保护你的数据和隐私。

    1. 定期清理聊天历史记录

    首先,你可以定期清理聊天历史记录。这样可以确保你的个人信息不会一直保留在Copilot的数据库中。你可以在Microsoft帐户的隐私仪表板上找到聊天历史记录,并选择删除需要删除的聊天。

    2. 谨慎授权Edge页面内容

    如果你决定授权Windows Copilot使用Edge页面内容,一定要仔细考虑。只允许它访问你认为安全的网页,并在不需要时撤销权限。你可以随时在Windows Copilot的设置中开启或关闭这个权限。

    3. 使用强密码和双重验证

    这是保护你的数据的基本步骤。确保你的Windows帐户具有强密码,并启用双重验证以增加安全性。这将使任何潜在的入侵者难以访问你的帐户。

    4. 定期更新操作系统

    保持你的Windows操作系统处于最新状态。微软会定期发布安全更新,以修复已知的漏洞。通过更新操作系统,你可以降低被黑客攻击的风险。

    Windows Copilot企业版

    如果你是使用工作或学校帐户登录到Windows设备的用户,可能会遇到Windows Copilot企业版。它使用必应聊天企业版,保护你的个人和公司数据。在这种情况下,你无法使用聊天历史记录,但可以请求汇总Edge中的活动选项卡内容。

    结语

    在这篇文章中,我们深入探讨了Windows Copilot如何使用你的数据以及如何保护你的数据和隐私。请记住,保护个人信息是每个人的责任,采取一些简单的措施可以帮助你更安全地使用Windows Copilot。无论你是普通用户还是企业用户,都应该意识到数据隐私的重要性。

  • 手把手教你建立个人网站:零基础搭建WordPress网站

    手把手教你建立个人网站:零基础搭建WordPress网站

    大家好,我是一名混迹网络多年的IT从业者,如今又成为IT圈的一员。我曾经搭建过各种大小的网站,今天我想为你们详细讲解如何从零开始建立个人网站。如果你有一定的动手能力,相信看完这篇教程后,你就能轻松搭建自己的网站了。

    开篇故事:为什么需要个人网站?

    在数字时代,拥有一个个人网站是展示自己的最佳方式。无论你是一名创作者、自由职业者、企业家还是只是想与世界分享你的兴趣爱好,个人网站都是一个强大的工具。通过个人网站,你可以:

    • 展示自己的作品和成就。
    • 建立个人品牌和在线身份。
    • 与全球观众或客户互动。
    • 分享知识和经验。
    • 探索无限的创造和商业机会。

    因此,建立一个个人网站是一个有意义的举措,而WordPress是一个出色的工具,帮助你实现这一目标。

    使用WordPress搭建个人网站

    1. 准备工作

    在开始搭建个人网站之前,你需要做一些准备工作:

    2. 大致步骤

    接下来,让我们来看看搭建个人网站的大致步骤:

    步骤1:购买域名

    在域名注册服务商购买一个域名,这将成为你的网站地址。例如,我注册了域名mlhgzs.com。

    步骤2:购买主机

    选择一家主机服务提供商,我推荐使用优网主机的CN2高防博客主机V3版。在购买时,填写你的域名,稍后你也可以自行修改。

    步骤3:解析域名

    在域名服务商处,进行域名解析,将你的域名与主机的IP地址关联起来。这个过程通常包括添加DNS记录,确保域名能正确指向你的主机。

    步骤4:配置SSL

    安装SSL安全证书,以确保你的网站在浏览器中获得安全标识。优网主机的管理面板提供一键申请SSL证书的功能,非常便捷。

    步骤5:登录WordPress管理后台

    登录你的WordPress管理后台,你可以使用主机管理面板内置的一键登录功能。管理后台的地址通常是你的域名/wp-admin/。

    3. 总结

    通过以上步骤,你已经成功建立了一个基本的WordPress网站。优网主机内置WordPress,省去了手动上传和配置的麻烦,使整个过程更加简单。但这只是一个开始,接下来你可以根据自己的需求,不断完善和优化你的网站。

    最后,我想给那些希望成功的朋友一些建议。搭建WordPress网站并不难,关键在于坚持和持续输出优质内容。如果你喜欢这篇文章,记得关注我,为那些认真付出的人点赞!

    希望你们都能成功建立自己的个人网站,享受网络带来的无限可能性!