Compare commits

...

2 Commits

Author SHA1 Message Date
87ae91d0a1 chore: update image sizing format
All checks were successful
部署文档 / build (push) Successful in 45s
due to deps update.
2025-06-18 01:39:31 +08:00
e7d787d84e New Note: Self Hosted Server 2025-06-18 01:31:22 +08:00
8 changed files with 153 additions and 16 deletions

View File

@@ -94,7 +94,7 @@ star: true
这种“等待条件”的现象与高中数学讨论的“若 p 则 q”命题即条件命题非常类似。一个条件命题要能判断其真伪条件就必不可少同样的一个触发要能执行首先要等待前置事件完成。在程序框图中像这种具有前置条件的语义用**条件分支**表示(如下图),又称**选择结构**。
![流程图中的“选择结构”](https://image.woshipm.com/wp-files/2017/08/8Ynwb53uWeo9QMHb7Xi5.png =480x)
![流程图中的“选择结构” =480x](https://image.woshipm.com/wp-files/2017/08/8Ynwb53uWeo9QMHb7Xi5.png)
从游戏实际运行的现象来看,触发会在条件满足(为真)后执行相应的“处理程序”(也就是行为),这一点符合基本印象。而当条件**尚未满足**时,触发则阻塞等待。
假如**逻辑上**就是希望判断条件不满足(为假),由于触发一直等不到条件满足,则直到游戏结束为止这个条件都得不到任何处理。如此看来,触发的逻辑本质就是如上左图的**条件单分支结构**。
@@ -227,7 +227,7 @@ if anyEvent: # P8 任何事件(当*单独使用*时,它会令触发*立即
对于循环结构,[已知的触发教程](https://www.bilibili.com/video/BV1Zw411y7DZ?spm_id_from=333.1387.collection.video_card.click)大概会让你关注触发的「重复类型」:
![英文原版直接称作 Type<br>早期汉化也直接译作“类型”](fa2_trigger_ui.webp =408x)
![英文原版直接称作 Type<br>早期汉化也直接译作“类型” =408x](fa2_trigger_ui.webp)
通常来说,选择 *2 - Repeating OR* 那一项便足以满足很多简单的重复需求。
@@ -244,7 +244,7 @@ while True:
分析这个运行表现不难发现,它是类似下图图二的流程:首先它走到`while`处执行判断,由于条件恒满足,往下执行`print`;然后循环并没有结束,它重新回到`while`重复执行前面说的流程,将坏掉的乐土打字机事业推进下去~~爱莉希雅死辣~~。
![流程图中的循环结构](https://image.woshipm.com/wp-files/2017/08/HRej5VdT9M9sRxXBYTJv.png =400x)
![流程图中的循环结构 =400x](https://image.woshipm.com/wp-files/2017/08/HRej5VdT9M9sRxXBYTJv.png)
上面的`Hello World`案例也是类似图二的流程。于是,重复触发可以用`while`循环表示:
```python

View File

@@ -24,7 +24,7 @@ date: 2025-05-16
[^moewiki_catboy]: 这种分类取自[萌娘百科](https://zh.moegirl.org.cn/%E7%8C%AB%E9%83%8E)。简而言之就是“猫少年”,或者说“具有猫部分特征的男孩子”。
![Ca^2+^](Ca.webp =200x)
![Ca^2+^ =200x](Ca.webp)
最早启用的设定。虽然理论上任何钙离子组成的盐都可以指代我,但中学阶段最常见的沉淀果然还是 CaCO~3~ 吧。然后“碳酸钙摘掉两个氧”最初的名字——Caco 就确定下来了。后来又衍生出音译“卡扣”、Casheen 和相应音译“卡伸”。
老朋友们大抵还是愿意叫我“卡”这组名字,特别是接触过的红警 2 modder 和地图师。
@@ -51,7 +51,7 @@ date: 2025-05-16
- 喜欢的:听故事和讲故事
- 讨厌的:毫无营养的信源
![Cl^-^ 的 Q 版头图](Cl.webp =128x)
![Cl^-^ 的 Q 版头图 =128x](Cl.webp)
在 Caco 因故被一撮原神同人女攻击之后不久,钙的形象弃用,咱也随即改名为 Chloride Pussemi即 ChlorideP 了。而后有人因为末尾这个 P 以为我是 VOCALOID 曲师P 主),加上这个昵称全小写起来并不方便手写,遂又更名为 NyaCl.
@@ -78,7 +78,7 @@ date: 2025-05-16
- 喜欢的:涩涩(无论主动被动)
- 讨厌的:烦心事
![暂时拿过来充数的猫娘图](Ag.webp =200x)
![暂时拿过来充数的猫娘图 =200x](Ag.webp)
> [!note]
> 将来有时间和闲钱的话,再为 Ag 这个形象重新约张稿吧。

View File

@@ -13,4 +13,4 @@ article: false
拍的时候主包可能已经 85+kg 了。最近有在减肥喵,但说实话对于女装,我不抱希望。
![刻晴裤袜](../../public/dress/keqing-202501.webp =360x)
![刻晴裤袜 =360x](../../public/dress/keqing-202501.webp)

View File

@@ -6,8 +6,8 @@ article: false
稍微减了减肥,现在拍完自我感觉不会太难看了……吧。当然由于条件有限,体毛什么的没办法除得特别利索。如有影响观感还请见谅。
![白丝大 jio](../../public/dress/white_250604_1.webp =300x)
![白丝大 jio =300x](../../public/dress/white_250604_1.webp)
![和之前一样地凹第一视角姿势](../../public/dress/white_250604_2.webp =300x)
![和之前一样地凹第一视角姿势 =300x](../../public/dress/white_250604_2.webp)
![“侧面描写”](../../public/dress/white_250604_3.webp =300x)
![“侧面描写” =300x](../../public/dress/white_250604_3.webp)

View File

@@ -89,7 +89,7 @@ Windows 启不动我们会尝试修复引导Arch 亦然。修复 Grub 引导
### ii. 补充回退启动项
事实上,需要反复重建 Grub 引导的一大原因就在于Grub 只会写入它自己的`grubx64.efi`,以及原生启动项:
![群友的 ESP 分区目录树](./esp_without_bootARCH.png =200x)
![群友的 ESP 分区目录树 =200x](./esp_without_bootARCH.png)
那么办法也很简单:像 Windows 那样也建一个回退路径启动项。具体来说,在 ESP 分区里建立`EFI\BOOT`目录,复制`grubx64.efi`重命名成`bootx64.efi`嘛。~~Windows 不也干了(~~
当然如果是像图中那样不止一个 Grub甚至同盘 Windows 和 Arch 双系统,那我不推荐你这么做。

View File

@@ -46,7 +46,7 @@ Bottles 是由 [bottlesdevs](https://github.com/bottlesdevs) 开发的可视化
初次运行 Bottles 会弹出一个向导跟你 blabla无脑下一步即可。
到最后一步时 Bottles 会下载一些组件包。由于众所周知的原因,可能会花费比较长的时间。
![Bottles 主界面](bottles_main.webp =350x)
![Bottles 主界面 =350x](bottles_main.webp)
## 二、部署 Bottle
@@ -76,7 +76,7 @@ Bottles 是由 [bottlesdevs](https://github.com/bottlesdevs) 开发的可视化
> [!warning]
> 如果你在全局设置里改过默认目录,千万不要在新建这里又改到同一个位置,否则会报**符号占用,创建失败**。
![新建 Bottle](./bottles_new_venv.webp =350x)
![新建 Bottle =350x](./bottles_new_venv.webp)
然后在右上角点击“创建”即可。
@@ -138,7 +138,7 @@ unzip -O GBK -o '~/Documents/0.6.2 离线更新包.zip' -d '~/Documents/Extreme
然后点开你的 Bottle 进入详情页,为客户端`Extreme Starry.exe`添加快捷方式,这样就不需要每次都点“运行可执行程序”找半天了。
![Bottle 详情](bottle_preferences.webp =350x)
![Bottle 详情 =350x](bottle_preferences.webp)
> [!tip]
> 在“选择可执行文件”对话框中,若找不到 exe请在“过滤”那里改为`Supported Executables`。
@@ -189,7 +189,7 @@ unzip -O GBK -o '~/Documents/0.6.2 离线更新包.zip' -d '~/Documents/Extreme
::: info 再次启动客户端没有反应
可能是因为进程还驻留在 Wine 环境当中,需要“强制停止所有进程”手动干掉:
![位于详情页标题栏的“电源”图示](bottle_kill_proc.webp =128x)
![位于详情页标题栏的“电源”图示 =128x](bottle_kill_proc.webp)
:::
## 附录:关于 Syringe 命令行

View File

@@ -260,7 +260,7 @@ EXPORT_FUNC(funcname)
浓缩版就是,向`hook`的地址那里写入`jmp`无条件跳转指令。由于`jmp`指令码本身占 1B后面跟的虚拟地址总是占 4B故`size`至少得是 5。
那倘若要覆盖超过 5B 的机器代码呢?答案是多余部分用`nop`(空指令,什么也不做)填充。
![西瓜猫猫头](https://imgs.aixifan.com/content/2020_7_22/1.5954261313865685E9.gif =150x150)
![西瓜猫猫头 =150x150](https://imgs.aixifan.com/content/2020_7_22/1.5954261313865685E9.gif)
:::
### 注意事项

137
docs/notes/SelfHosted.md Normal file
View File

@@ -0,0 +1,137 @@
---
tag:
- RDP
- 串流
- SSH
---
# 自组服务:让老机器“物尽其用”
这问题最初还真是为了分担《原神》这种重负载。毕竟 2.8 版本的海岛成功把我的轻薄本干烧了。~~虽然轻薄本拿去直播《原神》讲真也挺抽象的。~~ 然后次年下旬,我折腾 Hyper-V 时发现它似乎是通过远程提供的虚拟机界面,于是便走上了“自组服务”的不归路。
说白了,“把重负载分摊出去”的做法,某种意义上也顺应如今的各种“云”服务——把重活脏活甩给有能力负担的机器(对于绝大多数用户而言当然就是企业的云服务器),并提供轻量的终端接口给用户。何尝不是一种 C/S 模式呢?
---
话虽如此,自组服务也并非是自己买台服务器——那功耗和噪音注定不是家庭可承受的。所以让老机器“物尽其用”,也就成了我的首选。
> [!important]
> - 量力而行。这里的“力”指**老机器的配置、性能**。你毕竟不能强求赛扬 CPU 去跑《原神》PC 客户端。
> - 下面无论何种部署方式,均要求**在能够建立远程连接之前,首先有块屏幕**。
> - 本文只提供大概流程(或者说思路),**恕不详述具体操作流程**。信息检索能力很重要喔,哪怕是问 AI 呢?
## 前置准备
首先,需要固定机器在内网的 IP。你可以在路由器或是在 Windows 的控制面板或者设置里操作。具体的教程还请百度,恕不展开。
::: details Linux 如何固定
必应了一下,有介绍`/etc/sysconfig/network-scripts`的,有介绍最新版 Ubuntu 使用的`netplan`工具的,五花八门。
Arch Linux 安装时可以用`systemd-networkd`配置。
首先`ip link`(有的教程用`ip a`)查看网络设备号,然后编辑`/etc/systemd/network/网络设备号.network`,之后重启`systemd-networkd`服务。
:::
然后有条件的话可以尝试异地互联,比如出门可以用手机连回家里的老主机,用 Emby 看电影之类的。家里**有公网 IP 最好,但建议认真配置防火墙**;没有公网的也可以尝试 Zerotier 等工具**组虚拟内网**。
:::: details 配置 Zerotier One
首先当然得有那么个内网。在 [Zerotier](https://my.zerotier.com/login) 上注册/登录账号(可能比较卡,毕竟国外平台),`Create A Network`创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
接下来图省事的朋友点进新建的网络,记一下`Network ID`就可以直接安装 Zerotier 客户端了。
Windows 有挂在任务栏里的 GUI 客户端,右键图标直接`Join Network`,粘贴刚刚的`Network ID`回车,进账号里同意加入、给它分配固定 IP 即可;
Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方式安装 Zerotier One。
::: details 或者,进一步配置虚拟内网
主要关注以下项:
- `Basics` 网络基础设置
- `Name` 给你的内网重新起个拟人的名字。
- `Access Control`一般来说保持默认的`Private`(也就是必须你在账号上同意设备加入)即可。
- `Advanced` 高级设置
- `Manage Routes`相当于路由表了(左边是被访的内网网段,右边是 Zerotier 虚拟 IP
可以看看[这篇博客](https://stray.love/jiao-cheng/zerotier-zhong-jie-jiao-cheng)了解一下。
- `IPv4 Auto-Assign`里挑一个容易记的 IP 池。比如我就选`10.147.17.*`
- `IPv6 Auto-Assign`就随意了。说来 IPv6 现阶段不就是公网吗(
- `DNS`参见[英文文档](https://docs.zerotier.com/dns/)。
然后在设备加入虚拟内网之后,可以在`Members`里找到这个设备,手工给它分配个静态 IP。
:::
安装之后记得确认一下 Zerotier 服务是否开启Docker 容器还请额外注意端口映射。
```bash
sudo systemctl status zerotier-one.service
```
`systemctl`显示该服务`disabled``inactive (dead)`,说明没有启动,启用并立即启动它:
```bash
sudo systemctl enable --now zerotier-one.service
```
于是就可以使用 Zerotier CLI 了。我的场景比较简单,不考虑自建 moon 的情况下直接`sudo zerotier-cli join Network_ID`,然后也是在账号上给它放行、分配固定 IP 就可以了。
::::
## Windows——远程、串流、文件共享
Windows 想必大家都很熟。但既然把老主机当作“服务”来看待,便没有必要守在它旁边操作。也就是说,我们可以通过远程、串流等方式连上这台电脑,就好像云原神一样:游戏是在电脑上跑的,玩家是在手机上玩的。
Windows 开启 RDP 远程可以通过“高级系统设置”的“远程”选项卡Win7、8.1 可在**控制面板—系统**信息页跳转)、**设置—系统—远程桌面**Win10、11启用。
而如需像云原神般串流,则需要 Sunshine被控服务端和 Moonlight控制终端两个软件。~~当然也有别的串流方案,但 Moonlight 我折腾成了。~~ 由于间隔比较久远,相关的教程可以去 B 站搜索“自制云原神”词条,或者搜“阿西西”这个 UP 主,我也就不多展开了。
至于文件共享,最简单的方式是 Samba也就是右键文件属性里的“共享”选项卡。记得遵照指引去“网络和共享中心”先“启用文件和打印机共享”喵。
### 可部署的服务
我个人倒是有过这些实践:
- 开着 BiliBili 直播姬做推流机,从内网接收 OBS 流,并推上 B 站;
- 挂着各种网盘(尤其百度网盘)下载;
- RDP 玩剑三Moonlight 实测会屏蔽键盘输入)、串流玩崩原铁;
- 远程过去 P 图,开 After Effect 2018 做视频;
- ……
总的来说你平时怎么用那台牢机器的那就怎么对待它就是了。3 代 i3老老实实办公、文件共享玩些老游戏差不多就得了。10 代 i5那可以试试串流玩点新游戏After Effects 2020 做点视频特效,之类的。要是还有 AMD/NVIDIA 显卡,嚯,那甚至可以试试大模型。
**还是那句话,有什么样的性能办什么样的事**,不要学我一下子把负载全都倒到老 ASUS 上VSCode Remote+WSL+网易云+百度云+……,一下子给 7 代 i5、4GB 物理内存、32GB 虚拟内存(甚至才吃了 14GB整不会了。
### 常驻开机
作为自组服务器,肯定不兴像平日的 Windows 那般被自动更新、启动修复等扰得无法远程。
自动更新可以在**组策略`gpedit.msc`—计算机配置—管理模板—Windows 组件—Windows 更新—配置自动更新**一项中配置“已禁用”;若需禁止进 WinRE 启动修复,可以考虑以下两行批处理:
```batch
bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {current} recoveryenabled No
```
当然我已经换用 Ubuntu Server 了,这两行有没有用我也没有底(
## Linux——开发、常驻服务、文件存取
不得不说Linux 能作为日用的服务确实不多(特别是无图形界面的服务器端),绝大多数部署起来可能还并不轻松。~~但部署好了之后是真好用啊(~~
那么既然不需要日用,为了节省图形资源,干脆就把老主机当作服务器,装个无图形界面的 Linux 吧。可以百度“Ubuntu Server 家庭云服务器”,有不少教程。
Linux 的主要远程手段是 SSH。在此之前需要安装`openssh`,并启用(和启动)`sshd`服务。
控制端则可以装一些便捷的工具去维护 SSH 连接,比如 [Xshell](https://www.xshell.com/zh/xshell/) 和 [Xftp](https://www.xshell.com/zh/xftp/)。
### 可部署的服务
1. 代理服务器(不光是服务器本机,在内网范围内其他电脑都可以过这台机的代理)
> 为什么是代理优先呢?因为像`docker`、`npm`等很多服务都需要代理。这或许也是一种“分层结构”吧。
2. `docker`容器服务(这种就基本上是服务器在跑,也是作为下层服务去提供别的服务)
3. `aria2`下载服务BT/PT乃至直链[^direct_http]),配合`ariaNg`等 WebUI
[^direct_http]: 有些浏览器下载比较慢的,借助`aria2`和代理或许能明显改善速度。!!比如已似的 Pandownload。!!
4. `emby` `jellyfin`影音服务(但总的来说和国内的手机 APP 一样,资源管理比较单一,莫得音、视、图同时管理,可能大多数人对这些资源分类比较门清吧)
5. 跨平台前、后端开发(`nodejs` `python` ...,搭配 VSCode Remote-SSH
6. 文件存取服务Xftp
7. 其他定时服务、脚本……
## 后记
通篇看下来,我的服务场景也挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。