一名初中生开发者，平时喜欢折腾点小项目、做点好玩的小玩意
反编译pyinstaller打包的程序最近遇到一个用py写的小工具（123盘不限每日下载流量），只有.exe可执行文件，想看看底层的API调用逻辑，于是顺手做了一次反编译本教程使用的反编译工具仅支持Python3.9及以上版本用pyinstaller打包的程序，就以目前较新的Python 3.12为例，记录一下从.exe到.py源码的逆向扒过程准备工作在开始之前，你需要准备好以下工具链：Linux 环境：拥有gcc和cmake编译环境（虽然win的MSVC也能编译，但是我不建议，win的开发环境太难说了）一个比较好的ai（ds、gemini、gpt）：用于最后反编译出的残缺代码的补全和修复提取PyInstaller打包的EXE中的字节码PyInstaller其实就是把py解释器、依赖库和脚本这些打包成了一个自解压的压缩包，首先要用pyinstxtractor.py把它解开python pyinstxtractor.py test.exe这里有一个坑点：必须使用和目标程序打包时相同的Python版本 来运行这个提取脚本如果你用Python3.10去解包一个用Python3.12打包的程序，脚本会弹出警告[!] Skipping pyz extraction，因为最核心的业务代码（保存在 PYZ-00.pyz 中）因为底层marshal格式不兼容，根本没有被解开如果提取顺利，你会得到一个 xxx.exe_extracted 文件夹，然后就可以去看下一步了寻找主程序与修复Magic Number解包出来的目录中，有很多以pyi_开头的文件，这些是PyInstaller的引导装载程序，不用管。你的反编译目标通常是和软件同名的 .pyc 文件，或者看起来像入口脚本的名字（我这次的是 android.pyc）魔数问题高版本的pycdc也许是解决好了，我这里不用做什么处理在 Manjaro 下编译 pycdc 并执行反编译面对Python3.12这种高版本，老牌的uncompyle6早就全军覆没了。我们现在唯一能指望的是C++编写的pycdc（Decompyle++）在终端下把它Clone下来并编译：git clone https://github.com/zrax/pycdc.git cd pycdc-master cmake . make编译完成后，同目录下会生成pycdc可执行文件。拿着我们刚才在Windows下修好魔数的.pyc文件喂给它：./pycdc ../pan.exe_extracted/android.pyc > source_code.py把残缺的代码丢给ai进行逻辑重建打开生成的source_code.py，你会发现对于Python 3.12，pycdc目前的支持依然是个半残状态。代码里大部分地方都有这注释：# WARNING: Decompyle incomplete此时的反编译产物通常是一个半成品骨架：控制流丢失：while 循环可能被错误解析成了 if。对象丢失：很多链式调用会变成 None.json() 或 None.headers。上下文管理器断层：with open(...) 这种涉及文件流读写的核心逻辑大概率会从中间直接断掉。面对几百行残缺的代码，如果手动去推导底层汇编还原逻辑，那是纯纯的体力活，这时候就该让ai登场了你可以直接把残缺的代码片段复制给你常用的 AI 助手（比如我平时写代码用的那些大模型），并附上提示词：这是一段用pycdc反编译不完整的Python3.12代码，请修复成一个可以直接运行的完整Python脚本经过ai修复后应该就能正常跑起来，我这里使用Gemini修复后是可以了总结虽然高版本Python的反编译不能做到100%完美无损还原，但通过 pyinstxtractor 提取 + pycdc 转换结构 + ai补全逻辑 这套组合拳，逆向出核心的 API 接口和数据结构已经是轻而易举的事。如果你要我反编译后的文件请在这里下载：https://fl.1p.hk:12229/download/sharefile/123pan.zip
在windows上从源码编译wxWidgets (VS2022 + CMake)
在windows上从源码编译wxWidgets (VS2022 + CMake)关于我为什么咕了这么久这么久没更新了，主要是在做点小项目（最近又想写个小工具玩玩，C++下的跨平台GUI库最为人所知的就是Qt，但Qt在国内都快成开源刺客了，风评很差，所以我看了下其他选择，我有一位朋友在用wxWidgets库写软件，我就跑去玩了下，还挺不错的，主要是能自绘控件虽然官网有预编译包，但是我不推荐去下载，这东西编译后会在编译出的exe目录下带一大堆wxWidgets动态库文件，在其他电脑上就算和exe在同个目录下，运行也会报错缺少dll，只适合在配置了wxwidgets环境的电脑上玩这篇文章就一步步教你如何在win上搭建这个库的静态开发环境，静态编译不需要那一大堆动态库了，只有exe单文件（helloworld编译出来是4MB大小），希望可以帮助你入门这个库（第一步：下载源码首先去官网下载源码https://www.wxwidgets.org/downloads/注意哦，不要下那个 "Windows Binaries"（预编译库），我们要下 Source Code我选的是 Windows ZIP，解压到哪里都行，但路径尽量别带中文和空格我就直接丢在 G:\Documents\wxWidgetsBuild 了第二步：编译 wxWidgets 静态库解压完后，进入 build\msw 目录因为我用的是VS2022，所以打开 wx_vc17.sln 这个解决方案文件（选vc16也行）打开后，在顶部的工具栏里，把配置改成 x64 Release（要编译静态库得选这个）wxWidgets 的 Release 配置默认就是编译静态库的，不需要额外找选项，编译出来就是 .lib，这点挺好的选好后，在工具栏栏点击 生成 -> 生成解决方案这个过程会比较慢，可能需要5-15分钟，因为它要编译整个GUI框架编译完成后，lib\vc_x64_lib目录下就是静态库的文件了如果看到一堆.lib文件，而且没有dll文件，那就说明编译成功了第三步：创建 CMake 项目库准备好了，接下来开始写wxwidgets的helloworld打开 VS2022，创建新项目再选择 CMake 项目选这个也方便后面的跨平台，我这里就简单给个在Linux上用g++编译的命令：g++ main.cpp `wx-config --cxxflags` -o main给项目起个名字，我这里取wx 第四步：配置 CMakeLists.txt项目建好后，VS会生成一个默认的 CMakeLists.txt，我们需要修改它，让它能找到我们刚才编译好的 wxWidgets 库这是我的目录结构：把 CMakeLists.txt 改成这样：cmake_minimum_required(VERSION 3.15) project(wx) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) # 定义 wxWidgets 的根目录 (这里改成你自己的路径，就是你解压wxwidgets源代码的位置) set(wxWidgets_ROOT_DIR "G:/Documents/wxWidgetsBuild") # 指定库文件目录 (指向编译好后的静态库) set(wxWidgets_LIB_DIR "${wxWidgets_ROOT_DIR}/lib/vc_x64_lib") # 开启静态链接模式 set(wxWidgets_USE_STATIC ON) # 指定配置为 Unicode Release (mswu) set(wxWidgets_CONFIGURATION mswu) # 查找组件 (core base 是必须的) find_package(wxWidgets REQUIRED COMPONENTS core base) # 包含 wx 的配置 include(${wxWidgets_USE_FILE}) # 添加可执行文件 (记得加上 WIN32，不然会有个黑框框) add_executable(wx WIN32 wx.cpp) # 链接库 target_link_libraries(wx ${wxWidgets_LIBRARIES}) 这里最关键的就是 wxWidgets_ROOT_DIR 和 wxWidgets_LIB_DIR 别填错了第五步：编写Hello World配置完了，写个helloworld试试这里我直接用wxWidgets官方提供的HelloWorld示例代码（稍微精简了一下），贴到 wx.cpp 里：// wxWidgets "Hello World" Program // For compilers that support precompilation, includes "wx/wx.h". #include <wx/wxprec.h> #ifndef WX_PRECOMP #include <wx/wx.h> #endif // 定义应用程序类 class MyApp : public wxApp { public: virtual bool OnInit(); }; // 定义主窗口类 class MyFrame : public wxFrame { public: MyFrame(); private: void OnHello(wxCommandEvent& event); void OnExit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); }; // 告诉 wxWidgets 这是主程序入口 wxIMPLEMENT_APP(MyApp); // 应用程序初始化 bool MyApp::OnInit() { MyFrame *frame = new MyFrame(); frame->Show(true); return true; } // 主窗口构造函数 MyFrame::MyFrame() : wxFrame(NULL, wxID_ANY, "Hello World from Nekopara Dev") { wxMenu *menuFile = new wxMenu; menuFile->Append(1, "Hello...\tCtrl-H", "Help string shown in status bar for this menu item"); menuFile->AppendSeparator(); menuFile->Append(wxID_EXIT); wxMenu *menuHelp = new wxMenu; menuHelp->Append(wxID_ABOUT); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append(menuFile, "&File"); menuBar->Append(menuHelp, "&Help"); SetMenuBar( menuBar ); CreateStatusBar(); SetStatusText( "Welcome to wxWidgets!" ); // 绑定事件 Bind(wxEVT_MENU, &MyFrame::OnHello, this, 1); Bind(wxEVT_MENU, &MyFrame::OnAbout, this, wxID_ABOUT); Bind(wxEVT_MENU, &MyFrame::OnExit, this, wxID_EXIT); } void MyFrame::OnExit(wxCommandEvent& event) { Close( true ); } void MyFrame::OnAbout(wxCommandEvent& event) { wxMessageBox( "This is a wxWidgets Hello World example", "About Hello World", wxOK | wxICON_INFORMATION ); } void MyFrame::OnHello(wxCommandEvent& event) { wxLogMessage("Hello world from wxWidgets!"); } 第六步：运行测试好了，代码写完了，准备点击运行等一下，这里有一个坑因为我们在 CMakeLists.txt 里手动指定了 set(wxWidgets_CONFIGURATION mswu)，这代表我们要链接的是 Release 版 的库但是，VS的CMake项目默认会给你选成Debug配置如果你在x64 Debug模式下编译，就会出现一大堆不明报错，像这样：要在顶部的下拉菜单中，将配置切换为x64 Release切换好之后，点击工具栏的“生成“ -> “全部生成“生成的wx.exe已经在out/build/x64-release/wx目录下了点开exe，窗口弹出来了（虽然界面很简陋），但它是静态链接的，直接把exe给别人也能直接运行结尾好了，本篇教程就到这里，希望能帮助到你入门这个库
安装 waydroid_script克隆项目：git clone https://github.com/casualsnek/waydroid_script如果您无法访问github也可以在本站下载：waydroid_script-main.zip进入目录cd waydroid_script新建虚拟环境、安装依赖python3 -m venv venv venv/bin/pip install -r requirements.txt安装模块（这里必须进入虚拟环境操作！不进入虚拟环境安装会导致waydroid闪退无法启动）sudo venv/bin/python3 main.py install {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg, mitm}如您出现以下错误，就单独安装模块或更换终端：卸载模块sudo venv/bin/python3 main.py uninstall {gapps, magisk, libndk, libhoudini, nodataperm, smartdock, microg}使用交互式终端安装模块sudo venv/bin/python3 main.py这里需根据您waydroid安装的系统选择选择Install这里作者另外还提到在AMD上libndk表现比libhoudini更好，但是在我电脑上有些问题，还是推荐安装libhoudini安装类似桌面的启动器执行以下命令安装：sudo venv/bin/python3 main.py install smartdock作者给出的预览图：直接点击无法启动waydroid您只需执行一次以下命令来启动waydroid，以后启动不需要使用这条命令了waydroid session start结尾这里我只写出了安装和部分美化的教程，另外的美化可以去github上阅读：https://github.com/casualsnek/waydroid_script
前几天，我的服务器遭受了2次DDoS，然后博客直接挂了1天，Cuckoo主题交流群的一位群友也接着被打掉了，搜索引擎还好没怎么掉排名，这也提醒了我要搞好备份和备用服务器的切换，claw这个厂商如果你被DDoS的次数太多就可能会被删鸡，我昨天也买了个1.5GB网页和数据库空间的带防护的虚拟主机作备份然后今天就给服务器写了个定时备份并FTP同步到备用虚拟主机的Python脚本，再写好自动监测服务器在线并自动切换dns的脚本自动切换DNS记录的Python脚本原理是这样的：那个监测的WebUpTimeAPI是我自己用的监测，文章后面发出来的脚本那一段会更改为用request去请求你服务器上搭建的网站（有重试机制）定时备份上传的脚本原理大致是这样：py脚本监测服务器在线、自动切换dns依赖库安装命令pip install requests paramiko cloudflare smtplib retrying import time import requests import paramiko import smtplib from email.mime.text import MIMEText from CloudFlare import CloudFlare from retrying import retry TARGET_URL = "https://example.com" REQUEST_TIMEOUT = 10 # 单次请求超时时间（秒） SSH_HOST = "ssh_host" SSH_PORT = 22 SSH_USER = "ssh_username" SSH_PASS = "ssh_password" CLOUDFLARE_API_TOKEN = "cloudflare_api_token" ZONE_NAME = "example.com" RECORD_NAME = "www.example.com" # 要修改的 DNS 主机名 NEW_IP = "127.0.0.1" # 替换为要指向的新 IP 地址 SMTP_SERVER = "smtp.qiye.aliyun.com" SMTP_PORT = 465 SMTP_USER = "you@yourcompany.com" SMTP_PASSWORD = "your_email_password_or_auth_code" EMAIL_TO = "3775610318@qq.com" @retry(stop_max_attempt_number=3, wait_fixed=5000) def check_website(): try: print(f"正在请求 {TARGET_URL}") response = requests.get(TARGET_URL, timeout=REQUEST_TIMEOUT) if response.status_code == 200: print("网站正常") return True else: print(f"返回状态码: {response.status_code}") raise Exception("网站返回非200状态码") except Exception as e: print(f"请求失败: {e}") return False def ssh_connect(retries=2): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) for i in range(retries): try: print(f"正在尝试连接... 第 {i + 1} 次") ssh.connect(SSH_HOST, port=SSH_PORT, username=SSH_USER, password=SSH_PASS, timeout=10) print("连接成功") ssh.close() return True except Exception as e: print(f"连接失败: {e}") time.sleep(5) return False def update_dns_record(): try: cf = CloudFlare(token=CLOUDFLARE_API_TOKEN) zones = cf.zones.get(params={"name": ZONE_NAME}) zone_id = zones[0]["id"] records = cf.zones.dns_records.get(zone_id, params={"name": RECORD_NAME}) record_id = records[0]["id"] update_data = { "type": "A", "name": RECORD_NAME, "content": NEW_IP, "ttl": 120, "proxied": False } cf.zones.dns_records.put(zone_id, record_id, data=update_data) print("DNS记录已更新") return True except Exception as e: print(f"更新失败: {e}") return False def send_email(subject, body): msg = MIMEText(body, 'plain', 'utf-8') msg['Subject'] = subject msg['From'] = SMTP_USER msg['To'] = EMAIL_TO try: server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) server.login(SMTP_USER, SMTP_PASSWORD) server.sendmail(SMTP_USER, [EMAIL_TO], msg.as_string()) server.quit() print("通知邮件已发送") except Exception as e: print(f"发送失败: {e}") def handle_exception(): print("网站无法访问，开始尝试SSH连接...") if not ssh_connect(): print("SSH连接失败，更改DNS并发送邮件通知") if update_dns_record(): send_email( subject="⚠️ 服务器异常切换通知", body=f"检测到 {TARGET_URL} 无法访问且无法通过SSH连接，已将DNS记录 {RECORD_NAME} 指向备用服务器IP：{NEW_IP}" ) else: print("DNS更新失败，未发送邮件") else: print("SSH连接正常") if __name__ == "__main__": while True: try: is_up = check_website() if not is_up: handle_exception() except: print("请求过程中发生异常") handle_exception() time.sleep(600) # 10分钟 自动备份Mysql/MariaDB数据上传到FTP依赖库安装命令pip install schedule requests import os import time import datetime import subprocess import schedule from ftplib import FTP import requests db_config = { "host": "localhost", # 数据库连接地址 "user": "root", # 数据库用户名 "password": "your_password", # 数据库密码 "database": "typecho", # 数据库名 } backup_dir = "/data/dbackup" # 本地sql文件保存地址（临时的，上传到FTP后会自动删除） ftp_config = { "host": "127.0.0.1", # FTP连接地址 "user": "username", # FTP用户名 "passwd": "password", #FTP密码 "backup_folder": "/backupdb" # FTP sql文件保存位置（需提前创建） } notification_url = "https://back.xiaorin.com/backupdb/in.php" def backup_database(): try: # 创建备份目录（如果不存在） if not os.path.exists(backup_dir): os.makedirs(backup_dir) backup_file = os.path.join(backup_dir, f"{db_config['database']}.sql") # 构建 mysqldump 命令 command = ( f"mysqldump -h {db_config['host']} -u{db_config['user']} " f"-p{db_config['password']} {db_config['database']} > {backup_file}" ) # 执行命令 subprocess.run(command, shell=True, check=True) print(f"数据库已备份到: {backup_file}") if upload_to_ftp(backup_file): os.remove(backup_file) print(f"本地备份文件已删除: {backup_file}") send_notification() else: print("上传失败，未删除本地备份文件。") except Exception as e: print(f"数据库备份失败: {e}") def upload_to_ftp(local_file_path): try: with FTP(ftp_config["host"]) as ftp: ftp.login(user=ftp_config["user"], passwd=ftp_config["passwd"]) # 切换到远程备份文件夹 ftp.cwd(ftp_config["backup_folder"]) # 读取本地文件并上传 with open(local_file_path, 'rb') as file: remote_filename = os.path.basename(local_file_path) ftp.storbinary(f'STOR {remote_filename}', file) print(f"文件已上传到FTP: {remote_filename}") return True except Exception as e: print(f"上传到FTP失败: {e}") return False def send_notification(): try: response = requests.get(notification_url, timeout=10) if response.status_code == 200: print(f"[通知] 已成功访问远程通知地址: {notification_url}") else: print(f"[警告] 访问通知地址返回状态码: {response.status_code}") except Exception as e: print(f"[错误] 无法访问通知地址: {e}") def set_backup_schedule(interval_minutes): schedule.every(interval_minutes).minutes.do(backup_database) print(f"已设置每 {interval_minutes} 分钟自动备份一次，并上传至FTP。") set_backup_schedule(60) # 启动定时任务 if __name__ == "__main__": print("启动自动备份服务...") while True: schedule.run_pending() time.sleep(1) 总结其实如果你有两台服务器的话可以搞相互同步的，我这里是虚拟主机就不搞了（其实不太推荐这样做，数据库可能会炸）主服务器被打暂停期间我是不会写文章的，主服务器恢复过来我也懒得同步数据库过去，有时候估计也会丢一两条评论，就不恢复了，毕竟被DDoS也是小概率的事情
写了个快速把CPU和内存占用满的程序
3月份的时候使用Python后端写了一个API，使用Flask库这个文档已经是3月写的了，因为在开发其他的项目，没什么时间开发主题商店这个功能（文档原本是写了主题商店的使用方法及功能的，因为没开发好这个功能就暂时删掉了那一大段，后面开发出来了会写篇文章说明如何使用）图片是后端实时生成的，没有客户端的处理返回的图片是png类型，也可以自定义背景图（背景图不一定也要png）Url参数参数名描述默认值是否可选限制bg背景图片Url无是有Url长度限制w生成的图片宽度（px）1024是1080h生成的图片高度（px）576是1920lt文字到图片左上角的距离50是无l文字到图片左边的距离50是无fs文字的字号40是无rdfs图片右下角作者声明的字号18是不小于8字号wf在Url中加载字体无是只支持TTF格式的字体，以后版本可能会支持更多c（未开发完）更改纯色背景颜色无是未设置bg参数时才显示纯色fc更改字体颜色FFFFFF是不允许带#号如果您设置了wf或bg参数，则会先等待字体或图片加载完成，经过后端处理后，才会将图片发送至客户端为了节省服务器的网络流量，生成的图片最多只能为1080P分辨率，如设置超过限制则会自动设回1080P分辨率一个小功能如果您忘记了API的调用地址，只记得api.xiaorin.com，没关系，我给根Uri做了个小页面用来导航虽然导航页的页面简陋了点，但也不是不能用（小提示您在调用API时必须使用https协议，Nginx不会给您自动从http重定向到https您如果使用http协议访问就会显示下图的错误请求示例如果您想把它放在自己博客的侧边栏，可以这样调用：高126,宽300,字号12https://api.xiaorin.com/get_image?h=126&w=300&fs=12&lt=5&l=5&rdfs=8效果当然，您也可以使用随机图片的API来当随机背景图片，就拿GTX690的随机猫娘乐园图片API来示例（API里套API）https://api.xiaorin.com/get_image?bg=https://www.nekopara.uk/pic_api如果您的随机图片API炸掉了，则会自动换回默认的背景图片效果如果您的背景太杂乱，可以更换字体颜色，或者实现js检测图片包含哪种颜色最多就换成它最显眼的文字颜色，这个功能就由你们自己去实现了文字颜色更换效果（黑色）这里有一个小坑，fc参数的16进制颜色代码不允许带"#"，一旦带了就会显示如下错误：之后可能会添加的功能主题商店这个得要搞一段时间才搓的出来，会比较久点
前言有时候我们需要让网页加载自定义字体文件，但是通常的字体格式（TTF、OTF）体积太大了，这就需要我们将其转换为更小体积的字体文件格式（WOFF2）经过我的研究，找到了一种本地压缩字体可行的方法压缩第一步首先是取子集，大概意思是只保留指定的文字或者字符如果你还没有安装FontTools，请使用以下终端命令安装$ pip install fonttools取子集我们需要定义一个纯文本文件，里面包含所有要保留的字符，这里分享一个包含7000汉字和全/半角字符和英文的txt文件：zfj.zip然后使用以下命令对字体取子集$ fonttools subset "（输入的字体文件名）" --text-file="（字符txt文件）" --output-file="（输出的字体文件名）"我测试对全濑体（应该是吧）取子集后，文件体积从 36MB 减少到了 5.9MB，足足小了84%压缩第二步取完子集后，我们将对字体文件进行压缩，主要是压缩成 WOFF2 格式，这一步其实也可以使用在线工具转换并压缩压缩命令很简单： $ fonttools ttLib.woff2 compress "（输入的字体文件名）" -o "（输出的字体文件名）"对上面已经取过子集的字体经过压缩后，体积差不多减少了55%，从 5.9MB 减小到了 2.7MB操作完上面两个步骤后，字体的体积减少了90%还要小，网站字体加载的时候就不会因为字体太大而导致页面加载缓慢了但是有时候我们需要用到一些非常用但是又不是很生僻的汉字，这里分两种情况：如果文本是确定的，可以将这些字加入到定义保留字符的文件中即可；如果有用户输入，又对字体要求较高，我们也可以仅仅执行压缩步骤，也能将字体体积减小到70%，总比没有好）
一个肝了4天的项目（这次自己用Python写了一个监测的，部分叫了通义千问AI写不会受API的影响，可以调监测间隔时间，暂时只有网站图标、服务名称、状态、上次检查时间计划下一个小版本新增一个友链网站在线率新访问地址：status.xiaorin.com开源地址Github：https://github.com/kylin930/WebUpTime监测页面
2024年过得真快啊！2023~2024的跨年跨的什么几乎都不记得了因为站长不太擅长写文章，所以就将就看吧（关于今年在IT方面捣鼓的东西C++的学习C++网课学了几个月换到线下了，换到线下学C++后学习效率就提高了不少，算法也掌握了一些，目前在洛谷刷了点题明年计划去弄个CSP-J/S比赛易语言项目今年就只开发了2个项目，一个烂尾了，以后想办法补上吧（说下我那个易语言没烂尾的项目：NESM这个是结合了e4a的“客户端”组件（e4a相当于是专门开发手机端应用的易语言）然后易语言的“服务端”组件就连接e4a的“客户端”组件上这个应用功能大概是可以从外地查看到家里的“MC服务器”的运行状态，开关机等界面我就不放出来了，因为是自用的，设计的挺难看原理你但凡学过点易语言都可以摸懂的，这里也不说了玩QQBot前段时间自己用Koishi+LiteLoaderOneBot搭了个机器人，qq号是2041894415拿自己家里云搭的，CPU经常占用70以上，目前运行还算稳定（已经加入了6个群，群友日常基本都只玩（不是插件没装全，应该是懒得玩🙄）”签到、开始打工、停止打工“关于我是什么时候接触到Linux的大概就在我刚买阿里云服务器不久，一个抖音的人找上我，和他进行了点技术交流，当他问到我云服务器系统的时候，我说是Win Server2019，他就说你这服务器配置太低了，用win太浪费！就叫我换了CentoS7.6(现在系统是Alpine3.20)现在那位抖音用户因为过度推销自己的跑路云被禁掉私信了😂跑路云官网:q6a8.cn(别真买，听用户说很不稳定）关于日常生活星期一到星期五每天都可以碰到电脑，但是没太多时间弄，最多也就写写博客文章、学习下前端节假日的话会学点C++、整网站、搞电脑、看书这些，其它日常生活也就像大部分学生差不多今年去的地方图片懒得压缩了，干脆不放出来了4月7日至5月2日贵州省凯里市贵州省剑河县贵州省镇远县国庆节重庆游戏废品机械师steam上的游戏，bug太多了(穿模占一半🙄)，不太推荐去玩，但玩法自由度和社区还是可以的城市天际线因为自己轻薄本性能太低了，没咋玩原神今年大概2月份入坑的，当时好像是3.4版本（应该吧）现在冒险等级已经54了森林书和沙漠书已经做完了，主线推到纳塔的了UID：269083228蔚蓝档案7月份左右入坑的，现在53级了，主线没咋推，很少上线了，厨白子2025年网站改进计划买一个.com域名换阿里云的轻量服务器哔哩哔哩年度总结以下是官方给出的总结：转眼间过去了4年，你成为了Lv.5用户2024年，你有318天在b站留下回忆（观看超366小时，超过了85%的b站人，用热情守护珍贵时刻）今年你在多个领域倾注热爱，达成“六边形战士”成就（在游戏冲浪达到7777分钟，相当于循环了2065遍《极乐净土》，超过了90%的同好）累计观看时长367小时，总观看视频数14997个总结：网易云喜欢的歌我收藏的歌有550多首，在这里我就放几首最喜欢的出来1.Poison AND÷OR Affection2.Hand in Hand3.Winter ↑cube↓（Original Mix）4.Now -BPM50以上も上げるってどんだけぇRMX-5.Journey To The Rainbows（Rizline Edit）6.野花香（Haocore Mix）7.Re：End of a Dream（long ver.）顺便把网易云音乐的年度总结放出来吧对新一年的展望希望交到更多和我兴趣相投的朋友吧希望未来还有时间和精力去捣鼓这些东西