分类 信息技术 下的文章

前文

关于 mcsmanager

省流:一整套现代化的智能管理系统

mcsmanager 是一款开源、分布式、轻量级的游戏服务器管理面板,由国人使用 node.js 开发。它最初 为 我的世界(Minecraft)服务器而生,因此得名,但现在它的能力已经扩展到了多种 ​Steam 服务器(如泰拉瑞亚)以及其它多种游戏服务端

它的核心是一个 Web 控制台,你只需要在服务器上安装好面板服务,就可以通过任何浏览器(比如你的手机、家里的电脑,甚至是手表或电视)来远程管理和控制你的游戏服务器

还有,你甚至可以把他当做守护进程(?)

主要优势

  1. 不需要命令行访问,他只是一个 Web 面板!
  2. 支持在线文件管理,不需要 ftp 、 sftp 这种一点就炸的东西
  3. 多实例管理
  4. 实时控制台
  5. 厉害的用户权限系统
  6. 计划任务与备份
  7. 资源监控
  8. 多节点管理
  9. 开源、免费、轻量、安全

其实,一开始 mcsmanager 只是一个管理 Minecraft 服务器的管理面板,后来功能逐渐强大,甚至支持管理 泰拉瑞亚 等 Steam 游戏

Github开源:MCSManager/MCSManager: Quick deployment, distributed, multi-user, modern management panel for Minecraft and Steam game servers / 一键安装,分布式架构,多用户销售,现代化的 Minecraft 和 Steam 游戏服务器管理面板

Wiki:MCSManager | Free, Secure, Distributed, Modern Control Panel for Minecraft and Steam Game Servers. 不要以为这是英文 wiki 了,你可以切换为简体中文

正文

我们如何部署这么强势的服务器管理面板捏,我们可以使用同样强势的雨云,部署成功率为 200%
你在购买好后,需要安装宝塔面板,并自行配置 lnmp 和 docker 环境
切记安装 docker 的方式:

方法1:命令部署

适用于:海外用户
可见 wiki 【快速开始】【Linux 自动安装】

sudo su -c "wget -qO- https://script.mcsmanager.com/setup_cn.sh | bash"

直接打开服务器 ssh ,直接运行即可

方法2:Docker 部署

适用于:国内用户

首先,你肯定已经安装好了 Docker
打开 bt ,左边 docker ,应用商店搜索 Mcsmanager ,两个 Web 和 Deamon 都需要安装
image.png
image.png

温馨提示,你可以点击【已安装】对应的实例的安装进度
bt_successful 就是安装成功> 我知道你看不懂,但是你可以前往 DeepSeek - 探索未至之境 | 豆包 - 字节跳动旗下 AI 智能助手

image.png
上图为【日志】按钮的位置


我相信你已经成功部署了,那么...

访问你的 mcsmanager

打开浏览器,访问 http://<server_ip>:23333

选择简体中文->开始->输入用户信息->老用户

你就会进入
image.png

选择方法 1 安装的用户可直接跳转到【创建 Minecraft 服务器】

选择上面的节点(如果你点不了,请把 url 改成 http://<server_ip>:23333/#/node)

如图
image.png

如何获取节点密钥?

进入宝塔,docker,已安装,选择 daemon 的文件管理
image.png

依次进入 /daemon/data/Config

你会看到一个文件,叫做global.json,双击编辑他

key 字段就是节点密钥

image.png

wow 在线了 太好力

创建 Minecraft 服务器

进入 应用实例
新建应用
自由选择安装

安装完毕...

前文

假设你是一个运维小白,你不会使用 mysql 命令管理数据库,你只会使用 phpmyadmin ,但是,如果你的服务器线路差了那么一点点,那么你的访问 phpmyadmin 的速度跟你从百度网盘下载文件的速度差不多,非常头疼,这里有个解决方案。

正文

观察你的 phpmyadmin

当你进入宝塔,选择数据库,选择 mysql ,进入 phpmyadmin
image.png
image.png

你会发现,你的 phpmyadmin 主页下面有一个 warn 警告
image.png

为什么无法访问呢...

深度思考

其实你可以买一台更好的服务器
如果你有一点运维经验,你应该会知道【无法访问】可能有以下几种情况

  • 文件/目录权限
  • PHP 配置
  • 会话配置

当然我觉得你可能不知道后面两个是什么意思,但是如果是用宝塔安装的 phpmyadmin ,那么你有极大的可能性,是因为文件/目录权限

实操

先进入 bt 的文件管理,进入 phpmyadmin 提示的无法访问的目录,不要进入 /tmp,应该会有以下文件

image.png

解决问题已经很简单了,右键 tmp 文件夹,点击权限,全勾 + root ,然后确定
image.png

你勾和输入权限达到的效果是一样的

然后,当你重新进入 phpmyadmin ,你会发现,这个 warn 没了,速度也似乎变快了

...

感谢阅读

低价购买云服务器

关于 Openlist & Alist

首先你要知道一个概念,Openlist 是 Alist 的继承者,因为 Alist 想要获取用户信息

下文中,我不会说 Alist ,我会说 Openlist

推荐使用雨云服务器进行搭建,200% 成功

Openlist & Alist 是什么

Openlist 是一个开源的、支持多种存储方式的目录文件列表程序。你可以把它想象成一个“通行证(?)”或者“网盘聚合器”,它能将你分散在不同地方的存储空间(如阿里云盘、百度网盘、OneDrive、天翼云盘、本地存储等几十种网盘)统一到一个界面中进行管理和访问。

为什么他这么令人喜爱?

通用项
本机存储
Mediafire
OpenList
阿里云盘 Open
115 开放平台
115 网盘 / 分享
OneDrive / 分享
OneDrive APP
电信天翼云盘
中国联通云盘
中国移动云盘
四川电信魔盘
123 开放平台
123 网盘 / 分享 / 直链
百度网盘
一刻相册
蓝奏云盘
蓝奏云优享版
小飞机网盘
Crypt(加密)
又拍云存储
对象存储(S3)
谷歌云盘
谷歌相册
腾讯微云
Teambition
PikPak / 分享
超星星小组盘
迅雷云盘 / X / 浏览器
联想家庭储存链接分享
网易云音乐云盘
夸克网盘 / TV / Open
UC / TV
地址树
Teldrive
分秒帧
6盘
SMB
FTP
SFTP
Strm
MEGA Disk
Seafile
FebBox
可道云
WebDAV
Dropbox
别名(Alias)
Yandex云盘
Cloudreve V3
Cloudreve V4 / 分享
Misskey Drive
Terabox(海外百度)
CNB 发行版
GitHub API
GitHub 发行版
Degoo
  • 快速部署,支持 Docker 、 Docker compose 、 守护进程等多种方式

但是

安装其实一个脚本就能搞定,但是你国内可能安装不上,这怎么办呢?

正文

Openlist 官方 Wiki

先贴上官方 wiki ,里面涉及到了很多的 faq ,可在读后自行查看,快速开始 - OpenList 文档

安装 Openlist

海外用户

在自己的电脑上,打开 wiki ,可以看见有很多的安装方式
image.png
Which choose?
都可以,这边推荐一键脚本
就是在服务器上直接运行这条脚本,就可了

curl -fsSL https://res.oplist.org/script/v4.sh > install-openlist-v4.sh && sudo bash install-openlist-v4.sh

第一步

image.png

这里输入【1】进行安装

第二步

image.png

这里直接按 enter 即可

安装成功

image.png

然后去放一个防火墙,直接访问,大功告成!

国内用户

可以先试试上面的脚本,没准能安装成功

你依旧得先运行这条脚本

curl -fsSL https://res.oplist.org/script/v4.sh > install-openlist-v4.sh && sudo bash install-openlist-v4.sh```

到选择代理 url 的时候,你需要键入下面这个 url

https://gh.llkk.cc/

没有为什么,网上找的,你也可以去Github Proxy 文件代理加速自由选择

其他步骤如海外用户,安装成功!

先改个密码

控制台键入

openlist

先选【5】进入密码管理

再选【2】自定义密码

输入密码,回车,完成

如何使用 openlist

重复一句,先放行防火墙
image.png

image.png

用户名为 admin ,密码就是你刚刚键入的密码

两张图,了解一下
image.png

image.png

如何挂载存储可以前往 wiki ,前文已经提及

感谢阅读

请问

你是否厌倦了在线文件传输工具的缺点?速度慢?限制文件大小?限制访问日期?
那么,我们就来自己搭建一个在线文件传输工具!

Filecodebox

什么是 FileCodeBox?

FileCodeBox 是一个开箱即用的文件分享工具,具有以下特色:

  • 快速部署​:Docker 一键部署
  • ​大文件支持​:轻松分享大型文件
  • ​安全可靠​:密码保护和过期时间
  • 简洁界面​:用户友好的操作界面
  • 数据统计​:下载次数和流量监控

正文

购买服务器

推荐使用雨云搭建 filecodebox ,绝对性成功

注册后,实名认证,然后购买一台服务器
有备案的买国内,没备案的买海外
操作系统建议选择 ubuntu 22.04
filecodebox 非常轻量,1-1 也能运行

安装宝塔面板

打开雨云自带的 ssh 连接工具,键入账密,使用下列命令安装宝塔面板

if [ -f /usr/bin/curl ];then curl -sSO https://download.bt.cn/install/install_panel.sh;else wget -O install_panel.sh https://download.bt.cn/install/install_panel.sh;fi;bash install_panel.sh ed8484bec

在询问处键入 Y 以确认安装
image.png
安装速度取决于服务器带宽,大约为 2 分钟

注意,期间不能关于浏览器窗口和 ssh 窗口,不然会出现玄学事件

安装完成如图:

image.png

如何维护宝塔面板?
使用 bt 命令

使用宝塔配置服务器环境

使用浏览器打开 ssh 中显示的 url

如出现下图页面,请点击【高级】-【继续访问】
image.png

输入连接信息
image.png

滑到最后,同意条款,进入面板
image.png

到这一步,你可以选择绑定账号,也可以选择跳过
image.png

到初始化这一步,你直接点击 lnmp 的安装按钮即可
image.png

然后点击左侧 docker ,立即安装
image.png

一定要选择如下方式安装
image.png

你可以点击左上角服务器 ip 的小气泡查看安装进度

安装 filecodebox

安装完成后,依旧是 docker,应用商店,搜索文件快递柜,找到对应的,点击安装
image.png
这里的安装配置一般不用改

等待 1-3 分钟

可在 docker 应用商店的 已安装 里面查看安装进度

如图所示即为安装成功
image.png

然后宝塔左边点击【安全】,【添加端口规则】,【端口】填12345,确定
image.png

体验 filecodebox

浏览器访问 http://服务器ip:12345

如图即为一切都正常
image.png

后台管理

后台地址为 http://服务器ip:12345/#/admin/

密码默认为 FileCodeBox2023

一定要先修改密码

image.png

视频

https://www.bilibili.com/video/BV17HWnzAEWx/?share_source=copy_web&vd_source=c2640429ffb126a929d74212d5168b1f

注意

文稿与视频实际内容可能存在出入,以视频为准

关于评论区的一些评论

很少能看到这么正确的科普视频,居然用的是devcpp

本来是想用VSCode的,但是我当时忘记了就用Devc++

都是基本功,还算可以。不过工程上极度不推荐用这个万能头文件和using namespace std 虽然大概率你是打算法竞赛的,不太可能会重视这种东西。

是OI

文稿

1. 变量初始化之谜

cpp

#include <iostream>
using namespace std;

int main() {
    int x;
    cout << "未初始化的x = " << x << endl;
    return 0;
}

​功能​:演示未初始化局部变量的行为
你以为是确定性的0吗?
实际上是随机垃圾值的!
​原理​:局部变量在栈上分配,不会自动初始化,值是之前使用该内存的残留数据

2. 浮点数精度陷阱

cpp

#include <iostream>
using namespace std;

int main() {
    double a = 0.1;
    double b = 0.2;
    double c = 0.3;
    cout << "0.1 + 0.2 == 0.3 ? " << (a + b == c) << endl;
    cout << "实际值: " << a + b << endl;
    return 0;
}

​功能​:验证浮点数精度问题
你以为是精确相等的吗?
实际上是不相等的!
​原理​:浮点数在二进制中无法精确表示0.1、0.2这样的十进制小数,存在精度误差

3. 数组越界不报错

cpp

#include <iostream>
using namespace std;

int main() {
    int arr[3] = {1, 2, 3};
    cout << "arr[5] = " << arr[5] << endl;
    cout << "程序还在运行!" << endl;
    return 0;
}

​功能​:测试数组越界访问的行为
你以为是会崩溃的吗?
实际上是可能正常输出的!
​原理​:C++不检查数组边界,越界访问是未定义行为,可能读到随机内存值而不崩溃

4. 布尔值的算术运算

cpp

#include <iostream>
using namespace std;

int main() {
    bool b = true;
    cout << "b + 5 = " << (b + 5) << endl;
    cout << "b * 10 = " << (b * 10) << endl;
    return 0;
}

​功能​:展示bool类型在算术运算中的行为
你以为是true/false的吗?
实际上是1/0参与运算的!
​原理​:bool在算术运算中会隐式转换为int,true为1,false为0

5. 自增运算符的迷惑行为

cpp

#include <iostream>
using namespace std;

int main() {
    int i = 5;
    int j = i++ + ++i;
    cout << "j = " << j << endl;
    return 0;
}

​功能​:演示序列点问题
你以为是确定结果的吗?
实际上是编译器随缘的!
​原理​:同一表达式中对同一变量多次修改是未定义行为,结果取决于编译器实现

6. 空结构体的大小

cpp

#include <iostream>
using namespace std;

struct Empty {};

int main() {
    cout << "空结构体大小: " << sizeof(Empty) << endl;
    return 0;
}

​功能​:探究空结构体的内存占用
你以为是0字节的吗?
实际上是1字节的!
​原理​:为了确保每个对象都有唯一地址,空结构体被分配1字节大小

7. const变量的"不可修改"

cpp

#include <iostream>
using namespace std;

int main() {
    const int x = 10;
    int* p = const_cast<int*>(&x);
    *p = 20;
    cout << "x = " << x << endl;
    cout << "*p = " << *p << endl;
    return 0;
}

​功能​:测试const_cast的能力和限制
你以为是真正不可变的吗?
实际上是可以绕过的!
​原理​:const_cast可以移除const属性,但修改const对象是未定义行为

2025年10月14日,别了,Windows10!

感谢你!Windows10!

Windows编年史

前奏:MS-DOS

1981年
这是一个基于命令行的磁盘操作系统,是早期IBM个人电脑的核心。用户必须通过输入文本指令来执行所有操作,为最初的Windows提供了运行基础。

Windows 1.0

1985年11月20日发布
这是微软对图形用户界面的第一次尝试。它不是一个独立的操作系统,而是在MS-DOS上运行的操作环境。它引入了窗口管理、鼠标控制和有限的协同多任务功能。

Windows 2.0

1987年12月9日发布
相比前代,它允许应用程序窗口相互重叠,并改进了键盘和鼠标性能。著名的桌面出版软件Aldus PageMaker于此版本登陆Windows,为其带来了商业价值。

Windows 3.0

1990年5月22日发布
这是第一个取得巨大商业成功的Windows版本。它拥有重新设计的用户界面,支持16色,并改进了对Intel 8086/8088处理器的利用。它引入了程序管理器和文件管理器。

Windows 3.1

1992年4月6日发布
这是一个重要的更新版本,引入了TrueType字体,使Windows成为一个可行的桌面出版平台。它还首次包含了Windows徽标键支持,并普及了扫雷游戏。

Windows 95

1995年8月24日发布
这是一个里程碑式的版本。它带来了许多定义现代操作系统的元素,包括开始菜单、任务栏和桌面图标。它是一个独立的操作系统,不再需要单独购买DOS。

Windows 98

1998年6月25日发布
这个版本深度集成了Internet Explorer浏览器和Windows桌面,推动了互联网的普及。它改进了对USB和外设的支持,并引入了快速启动栏。

Windows ME

2000年9月14日发布
这个面向家庭用户的版本旨在提供丰富的多媒体体验。它引入了系统还原功能,但因其不稳定和基于DOS内核的限制而饱受批评,被认为是寿命最短的Windows版本之一。

Windows 2000

2000年2月17日发布
这是一个面向商业环境的强大且稳定的操作系统,源于Windows NT架构。它显著改进了安全性和网络功能,主要部署于企业和工作站。

Windows XP

2001年10月25日发布
这是微软史上最成功和最受欢迎的操作系统之一。它统一了消费级和企业级产品线,拥有全新的Luna用户主题,极大的提高了系统的稳定性和易用性,生命周期极长。

Windows Vista

2007年1月30日发布
这个版本引入了华丽的Aero Glass视觉特效,包括毛玻璃效果和窗口动态翻转。它加强了安全机制,但也因资源需求过高、兼容性差和频繁的用户账户控制提示而受到广泛批评。

Windows 7

2009年10月22日发布
它被视为对Vista的修正和升华。Windows 7保留了Vista的优点,同时大幅提升了性能、稳定性和兼容性。它改进了任务栏,增加了钉钉功能和触摸屏支持,获得了用户的一致好评。

Windows 8

2012年10月26日发布
这是一个为触摸时代设计的激进改革版本。它移除了传统的开始菜单和开始按钮,引入了全新的Metro风格开始屏幕。这一改动虽然针对平板优化,但却让许多桌面用户感到困惑和不便。

Windows 8.1

2013年10月17日发布
这是一个重要的更新,回应了用户对Windows 8的批评。它重新引入了开始按钮,并允许系统直接启动到桌面,改善了传统桌面模式下的使用体验。

Windows 10

2015年7月29日发布
微软宣称这是“最后一个Windows版本”,采用“Windows即服务”的模式进行持续更新。它带回了熟悉的开始菜单,并将其与现代动态磁贴相结合。引入了新的浏览器Microsoft Edge,并内置了智能语音助手Cortana。

Windows 10 Version 1507 (Build 10240)

2015年7月发布。这是Windows 10的初始正式版本,代号"Threshold 1"。它确立了Windows 10的核心体验:

  • 回归的开始菜单:结合了Windows 7的传统布局和Windows 8的动态磁贴。
  • Microsoft Edge浏览器:全新打造,取代IE成为默认浏览器,初始项目代号为"Spartan"。
  • 任务视图与虚拟桌面:方便用户在不同任务和空间之间切换。
  • Cortana集成:深度集成到任务栏的智能语音助手。
  • 设置与应用:引入了现代化的“设置”应用,并推广可在电脑、平板、手机等多设备上运行的通用Windows应用。

Windows 10 Version 1511 (Build 10586) - 十一月更新

2015年11月发布。这是Windows 10的第一个重大更新,带来了多项改进和新功能:

  • 性能提升:显著改进了Edge浏览器性能、启动时间和电池续航。
  • 默认应用设置:在设置中简化了按文件类型设置默认应用的流程。
  • Skype集成:将Skype消息、通话和视频集成到系统中,取代了之前的“Messaging”应用。
  • 用户界面微调:对开始菜单、任务栏和操作中心进行了视觉和功能上的细微调整。

Windows 10 Version 1607 (Build 14393) - 周年更新

2016年8月发布。这是一个非常重大的更新,代号"Redstone 1",带来了大量新特性:

  • Windows Ink 工作区:为触控笔用户提供快速访问草图板、屏幕草图和白板的功能。
  • Cortana增强:支持在锁屏界面使用,并可以识别手写笔记中的提醒。
  • Windows Defender 安全中心:统一的安全管理和查看界面。
  • Bash on Ubuntu on Windows:通过WSL子系统,原生支持运行Ubuntu Linux二进制可执行文件,对开发者意义重大。
  • Edge浏览器扩展:为Edge浏览器引入了扩展插件支持。

Windows 10 Version 1703 (Build 15063) - 创意者更新

2017年4月发布。此更新侧重于创意和娱乐体验,代号"Redstone 2":

  • Paint 3D:全新的3D画图工具,鼓励用户创建和编辑3D对象。
  • Microsoft Edge:新增电子书阅读功能,并改进了标签页管理。
  • 游戏模式:优化系统资源分配,为游戏提供更高的CPU和GPU优先级,以提升游戏性能。
  • 夜灯模式:通过减少屏幕蓝光来缓解视觉疲劳。

Windows 10 Version 1709 (Build 16299) - 秋季创意者更新

2017年10月发布。继续深化创意体验,代号"Redstone 3":

  • Fluent Design System:引入了微软全新的流畅设计语言,带来更具深度、动画和透明效果的视觉体验。
  • Story Remix:后来演变为"视频编辑器",可自动将照片和视频生成带有3D效果、转场和背景音乐的视频。
  • OneDrive文件随选:允许用户在不占用本地空间的情况下,在文件资源管理器中看到所有云端文件。
  • 与手机的深度链接:改进了与iOS和Android设备的连接体验。

Windows 10 Version 1809 (Build 17763) - 2018年十月更新

2018年11月发布。此版本因发布初期严重的文件删除Bug而闻名,但最终稳定后包含了一些关键功能,代号"Redstone 5":

  • 云剪贴板:支持跨设备同步剪贴板历史记录(通过Win+V调用)。
  • 截图与草图:全新的截图工具,取代了旧的“截图工具”,并与通知中心更好地集成。
  • 暗色主题文件资源管理器:为文件资源管理器引入了完整的暗色主题。
  • 你的手机应用:开始更紧密地连接Android手机,实现短信同步和照片查看。

Windows 10 Version 2004 (Build 19041) - 2020年五月更新

2020年5月发布。这是一个重要的功能更新,内部版本号从v1809的17xxx跃升至19xxx:

  • 新版Cortana:作为一个独立应用发布,专注于生产力,支持拖拽和聊天式界面。
  • Windows Subsystem for Linux 2 (WSL 2):使用了完整的Linux内核,带来了显著的性能提升和完整的系统调用兼容性。
  • 虚拟桌面重命名:允许用户为不同的虚拟桌面自定义名称。
  • DirectX 12 Ultimate:为游戏带来了新的图形技术,如光线追踪、可变速率着色等。

Windows 10 Version 21H2 (Build 19044)

2021年11月发布。这是Windows 10最后一个功能更新,主要专注于安全性和底层改进,新功能非常有限:

  • WPA3 H2E标准支持:增强了Wi-Fi安全性。
  • Windows Hello改进:为无密码登录提供了更好的支持。
  • 此后,Windows 10转入仅接收安全更新和次要修补的支持阶段,开发重心全面转向Windows 11。

Windows 10 22H2 终极版本

Windows 10 版本 22H2(操作系统内部版本 19045)是 Windows 10 的最后一个功能更新版本。微软已明确表示,此后不会再为 Windows 10 推出任何新功能更新,22H2 即为该系统的终极版本。

22H2 在 21H2 的基础上,引入了一系列新功能和改进,旨在提升用户体验、生产力和系统性能:

  • 用户界面与个性化:

    • Windows Spotlight 桌面:你可以将桌面壁纸设置为由 Microsoft 提供的、每日更新的 Bing 精美图像。
    • 增强的锁屏界面:锁屏界面不仅显示天气,还新增了体育、财经和交通信息等更多动态内容。
    • 开始菜单改进:支持创建应用文件夹,方便更好地组织和管理应用。
  • 生产力与多任务处理:

    • 任务栏拖放功能:改进了任务栏的拖放操作体验,使用更加流畅。
    • 新的任务管理器:提供了更先进的界面和功能,便于监控和管理系统资源。
    • 改进的分享功能:可以直接将网页链接(URL)分享到 WhatsApp、Gmail、Facebook 和 LinkedIn 等应用程序。
  • 辅助功能与工具:

    • 实时字幕:为系统中的音频内容提供实时字幕,提升无障碍体验。
    • 语音访问:允许用户通过语音命令来控制和操作电脑。
    • 优化的截图工具:修复了在开启“讲述人”辅助功能时可能出现的卡顿问题。
  • 性能、安全与兼容性:

    • 对最新硬件的支持:为新型号的 CPU、GPU 和其他硬件提供了更好的兼容性和支持。
    • 增强的安全防护:包括更新的易受攻击驱动程序阻止列表,以防范 BYOVD(自带易受攻击驱动程序)攻击。
    • Windows Subsystem for Linux (WSL) 改进:带来了更高效的性能。

Windows 11

2021年10月5日发布
这是目前最新的主要版本。它拥有全新的、以居中式任务栏和开始菜单为中心的现代化界面设计。加强了窗口管理和多任务功能,并直接集成了Android子系统,允许用户在电脑上运行移动应用。对硬件安全有更高要求,需要TPM 2.0支持。

“The Next Chapter” & “A more human way to do.” (下一篇章 & 一种更人性化的操作方式)

Windows 10 宣传标语

再见了,Windows10!

永别了,Windows 10!

致Windows 10:一个时代的温暖告别

在科技的长河里,每一个操作系统的更迭都像是一段岁月的书签。当微软宣布Windows 10将在2025年走向生命终点时,无数人的心中泛起了一丝难以名状的涟漪。这不只是一款软件的退役,更是一个数字时代的温情谢幕。

回想2015年的夏天,Windows 10带着“升得精彩”的承诺翩然而至。那时的我们,刚从Windows 8的颠覆性变革中回过神来,迫切需要一个既熟悉又创新的归宿。你来了,带着回归传统的开始菜单,却又巧妙地融入了现代的动态磁贴——这何尝不是一种对过去的尊重与对未来的拥抱?

你的出现,像极了人生中的某个重要驿站。记得那些深夜,Cortana温柔的声音陪伴着赶工的我;记得任务视图让繁杂的工作变得井然有序;更记得Edge浏览器虽然稚嫩,却代表着重新出发的勇气。你见证了多少人的青春——从校园到职场,从青涩到成熟。

你最大的温柔,在于懂得平衡。不像前辈Windows 8那般激进,也不像后继者Windows 11那样追求极致的现代感。你保留了足够的传统元素让老用户感到安心,又引入了恰到好处的新功能满足时代的需要。这种中庸之道,让你成为了最多人愿意停留的港湾。

在兼容性方面,你几乎做到了极致。从古老的办公软件到最新的游戏,你都能从容应对。那些在其他系统上可能无法运行的经典程序,在你这里总能找到生存的空间。这种包容,让多少人在数字转型的洪流中得以喘息。

你的设计语言或许不够惊艳,但足够温暖。那个被称为“亚克力”的半透明效果,那些圆润的窗口角落,还有那些恰到好处的动画——它们共同营造了一个既专业又不失亲和的工作环境。在这里,创造力与生产力得以和谐共处。

如今,当我们即将迎来你的告别之时,不禁要问:为什么我们如此怀念?也许是因为你代表了一个特定的时代——那个移动互联网刚刚成熟、人工智能初露锋芒、工作与生活开始深度交融的时代。你是这个时代的数字见证者。

更让人感慨的是,你的离去标志着一个理念的终结。微软曾说你是“最后一个Windows版本”,承诺通过持续更新让你永葆青春。这个美好的愿景最终还是在技术的洪流中改变了方向。你的存在,提醒着我们:在追求创新的路上,有时也需要停下来巩固与完善。

在无数人的记忆里,你不仅是工具,更是伙伴。那些通过你完成的毕业论文,那些在你平台上运行的游戏时光,那些依靠你完成的工作项目——所有这些生活的碎片,都与你紧密相连。

告别从来都不容易,特别是告别一个陪伴了近十年的老朋友。但正如生命的轮回,技术的进步从不停歇。当我们在更新的系统上继续前行时,会记得曾经有一个系统,它平衡了创新与传承,在变革的时代为我们提供了温暖的栖息之地。

再见,Windows 10。你不仅是操作系统演进中的重要一环,更是无数人数字生活中难以磨灭的记忆坐标。在科技的编年史里,你永远拥有一个独特而温暖的位置。

同时,感谢AI!

乙巳岁九月十四修博客服务器感怀

2025年10月5日修理博客服务器有感

时间线

2025年10月2日

?一夜醒来,服务器崩溃了

不知道咋修

2025年10月3日

忘了

2025年10月4日

开始琢磨怎么修

但又不知道怎么修

尝试过重启服务器、重装主题

不敢动数据库

2025年10月5日

重装数据库(保留数据),无用

我草他妈的,直接删掉数据(导出)

我草他妈的,能进去了

然后在查看导出的数据

image.png

???少了一个括号

猎奇

关于double和float精度丢失的问题

起因

这个问题,我记得我是在五年级的时候就有了,情况大概如下

现在,你需要将π放进一个变量中,需要保留到小数点后100位

过程

完成代码

第一次代码

当时,我想着,不是so easy嘛,然后编写出了如下代码

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     float x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<x;
 }

然后,我怀着激动的心情,颤抖的手,内心OS:马上就可以AK了!哈哈哈哈!!! ,但是,现实给我了种种一拳

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.14159

我:

?

What FUCK???

这感觉不太对啊,这输出怎么能这样子

哦!我忘了,还有double!

使用double完成

然后编写出了如下代码

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     double x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<x;
 }

一键运行:

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.14159

?

没保存吗

Try again

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.14159

What FUCK?

怎么还是这样?

那时候我情绪崩溃了,不知道咋回事

然后,我突然想起来了保留小数点的方法!即setprecision

使用setprecision的方法完成

然后写出了如下代码

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     double x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<setprecision(100)<<x;
 }

嘿嘿嘿,兄弟们,终于可以AK了!!!

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 PS E:\output> & .\'double.exe'
 3.141592653589793115997963468544185161590576171875

az

好像确实精确了亿点,但没有完全精确吧?

怀疑人生中。。。

哦!还有printf!!!

使用printf的方法完成

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     double x=3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     printf("%.100lf",x);
 }

这下总不能错了,printf可是C语言的,怎么可能错??

可是...

现实又给我了重重一锤

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
PS E:\output> & .\'double.exe'
3.1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000

我是不配学编程吗???

为什么显示总是这么打击我

呜呜呜呜呜呜呜呜

呜呜呜呜呜呜

现在的情况

2024年,Deepseek-R1模型发布

我草,牛逼!

2025年9月24日,一学校老师向我询问此问题,又够引了我的兴趣

  1. IEEE 754 浮点数标准

计算机使用固定的位数来存储浮点数:

  • float(单精度):32位,约6-7位有效数字
  • double(双精度):64位,约15-16位有效数字
  • long double:通常80位或128位
  1. double 的存储结构

double 使用64位存储:

  • 1位符号位
  • 11位指数位
  • 52位尾数位

这意味着 double 只能精确表示大约15-16位十进制数字。

以上内容来自Deepseek-R1

EMM,似懂非懂,但是大概了解了

浮点数在计算机中以二进制分数形式存储,无法精确表示所有十进制小数。

以上内容来自Deepseek-R1

《二进制分数》

我嘞个二进制分数

依旧是补码,对吧???

二进制存储原理

double 的52位尾数只能表示有限精度的分数:

3.141592653588888... = 无法用有限二进制精确表示

计算机找到最接近的可表示二进制分数,这就是你看到的"奇怪"数字。

以上内容来自Deepseek-R1

我的评价:六百六十六

  1. 浮点数都是近似值
  2. 不要用 == 直接比较浮点数
  3. 需要高精度时使用特殊库或整数运算

以上内容来自Deepseek-R1

我的评价:近似值???

现在看来,我为什么不使用先乘再除呢?

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     unsigned long long x=31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
     cout<<double(x/99);
 }

于是,我就发现了

*  正在执行任务: C:\SOFTWARE\Dev-Cpp\MinGW64\bin\g++.EXE -Wall -Wextra -g3 -std=c++23 e:\double.cpp -o e:\output\double.exe 
 ​
 e:\double.cpp:5:26: warning: integer constant is too large for its type
     5 |     unsigned long long x=31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679;
       |                          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 PS E:\output> & .\'double.exe'
 1.07941e+17

哦对对对对对对对,范围啊,我草

奇怪了,为什么我们不使用高精度数组呢?

使用数组

#include <bits/stdc++.h>
 using namespace std;
 ​
 int main(){
     string x="31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679";
     cout<<x;
 }

运行!

PS E:\output> & .\'double.exe'
 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

耶!成功!

完

致谢

什么是浮点数?

浮点数就是用来表示小数(实数)的数据类型。让我用通俗易懂的方式解释:

什么是浮点数?

浮点数 = 科学计数法的二进制版本

就像我们写很大的数会用科学计数法:

  • 1,200,000 = 1.2 × 10⁶
  • 0.000012 = 1.2 × 10⁻⁵

计算机用类似的方法表示小数,但是使用二进制。

浮点数的组成

浮点数由三部分组成(以32位float为例):

[符号位] [指数部分] [小数部分]
  1位      8位       23位

举例: 数字 -13.625 在计算机中如何表示?

  1. 符号位:负号 → 1
  2. 转换为二进制:

    • 整数部分:13 = 1101(二进制)
    • 小数部分:0.625 = 0.101(二进制)
    • 合并:13.625 = 1101.101(二进制)
  3. 科学计数法:1101.101 = 1.101101 × 2³

    • 小数部分:1.101101 → 去掉前面的1,得到 101101
    • 指数部分:3

为什么叫"浮点数"?

"浮点"的意思是小数点的位置可以浮动:

// 这些数都是浮点数,小数点位置不同
float a = 123.45;     // 小数点在第3位后
float b = 1.2345;     // 小数点在第1位后  
float c = 12345.0;    // 小数点在第5位后

浮点数的实际问题

#include <stdio.h>

int main() {
    // 问题1:有些十进制小数无法精确表示为二进制小数
    float f = 0.1f;  // 0.1在十进制中很简单,但在二进制中是无限循环的!
    
    printf("0.1 的实际存储值: %.20f\n", f);
    
    // 问题2:连续相加会产生误差
    float sum = 0.0f;
    for (int i = 0; i < 10; i++) {
        sum += 0.1f;
    }
    printf("0.1相加10次: %.10f\n", sum);  // 可能不是精确的1.0
    
    return 0;
}

生活中的类比

想象一把尺子:

  • 整数:只能量整厘米(1cm, 2cm, 3cm...)
  • 浮点数:可以量毫米(1.1cm, 1.2cm, 1.25cm...),但精度有限

关键点:

  1. 浮点数不是绝对精确的(就像尺子有最小刻度)
  2. 表示范围很大,可以表示非常小或非常大的数
  3. 运算可能产生微小误差

编程中的浮点数类型

#include <stdio.h>
#include <float.h>

int main() {
    printf("float 精度: 约%d位有效数字\n", FLT_DIG);
    printf("double 精度: 约%d位有效数字\n", DBL_DIG);
    
    printf("float 范围: %e 到 %e\n", FLT_MIN, FLT_MAX);
    printf("double 范围: %e 到 %e\n", DBL_MIN, DBL_MAX);
    
    return 0;
}

简单总结: 浮点数就是计算机用来表示小数的近似方法,虽然不完美,但足够应对大多数科学计算和工程应用的需求。

经典疑问

float 和 double 的区别

特性floatdouble
大小4字节 (32位)8字节 (64位)
精度约6-7位有效数字约15-16位有效数字
范围±3.4e-38 到 ±3.4e+38±1.7e-308 到 ±1.7e+308
关键字floatdouble

printf 中的格式说明符

#include <stdio.h>

int main() {
    float f = 3.141592653589793f;    // 注意后面的 f
    double d = 3.141592653589793;
    
    // 正确的格式说明符
    printf("float: %f\n", f);        // 默认显示6位小数
    printf("double: %lf\n", d);      // %lf 用于 double
    
    // 控制小数位数
    printf("float(2位): %.2f\n", f);
    printf("double(4位): %.4lf\n", d);
    
    // 科学计数法表示
    printf("科学计数法: %e\n", f);
    printf("科学计数法: %le\n", d);
    
    return 0;
}

浮点数的玄学问题

#include <stdio.h>
#include <math.h>

int main() {
    // 问题1:精度损失
    float a = 0.1f;
    float b = 0.2f;
    float c = a + b;
    printf("0.1 + 0.2 = %.10f\n", c);  // 可能不是精确的 0.3
    
    // 问题2:比较浮点数不要直接用 ==
    if (fabs(c - 0.3f) < 1e-6) {      // 使用误差范围比较
        printf("c ≈ 0.3\n");
    }
    
    // 问题3:大数吃小数
    float big = 1e8f;
    float small = 1.0f;
    printf("大数 + 小数 = %f\n", big + small);  // 可能还是 100000000
    
    return 0;
}

四舍五入的正确用法

#include <stdio.h>
#include <math.h>

int main() {
    double numbers[] = {3.4, 3.5, 3.6, -2.3, -2.7};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    
    printf("四舍五入示例:\n");
    for (int i = 0; i < size; i++) {
        printf("%.1f -> %.0f\n", numbers[i], round(numbers[i]));
    }
    
    // 其他相关的舍入函数
    double x = 2.7;
    printf("\n其他舍入函数:\n");
    printf("round(%.1f) = %.0f  (四舍五入)\n", x, round(x));
    printf("ceil(%.1f) = %.0f   (向上取整)\n", x, ceil(x));
    printf("floor(%.1f) = %.0f  (向下取整)\n", x, floor(x));
    printf("trunc(%.1f) = %.0f  (向零取整)\n", x, trunc(x));
    
    return 0;
}