ztrztr 的博客 - 项目
type: channel
link: https://typecho.ztrztr.top/category/e9-a1-b9-e7-9b-ae/
items: 介绍一些有趣的自托管应用
items: DataMaker 一款基于 C++ 的数据生成器

介绍一些有趣的自托管应用
type: item
date: 2026-02-20T00:31:10+08:00
description: 最近以搞到了一个 4 核 8G 内存的服务器，于是测试了一些之前在 2 核 2G 内存的服务器想尝试但是没有多余的内存的一些自托管应用。Code-server介绍Code Server 是一个自托管的在线 IDE，其实就是把 VSCode 变为了自托管，使得用户可以在线编写代码。使用感受Code-server 大概占用不到 1G 的内存，但是如果安装过多的插件或者编译重型项目那有可能会占用更多。如果服务器的网络延迟比较高，或者服务器带宽比较低，在加载文件和新建文件和使用命令行的时候会比较卡，或者加载时间较长，所以如果只是自己用，那么推荐用本地的 VSCode 或者用 Tailscale 来建立 P2P 连接，这样能显著降低延迟。至于其他感受，主要是需要自己设置 CodeServer 插件市场的源，不然由于预装的源和 VSCode 不一样，导致一些插件有可能缺失。其他编写代码的感受和本地的 VSCode 差不多。OpenList（原 Alist）注：由于原本的 Alist 貌似被收购了，所以有开发者在原来的 Alist 基础上继续开发 OpenList。介绍OpenList 是一个云盘自托管项目，其有着界面美观，能挂载各种网盘到本地的特点。使用感受确实是一个很好的项目，能把其他网盘比如说百度网盘或者阿里网盘挂在在本地，很方便，而且界面也确实很美观。Stirling PDF介绍一个 PDF 工具箱，可以方便免费的编辑 PDF 和使用其他 PDF 工具箱。个人感受界面很有现代的风格，其解析和编辑 PDF 的方法我猜测是先转换为 JSON，然后再识别原本的排版，最后再把编辑的按原本的排版渲染回去，我的说法有可能不对，因为我不了解。这个工具箱确实能解决很多时候想加水印等但是需要付费的软件或者需要上传到第三方网站。KaraKeep介绍一个稍后阅读的自托管应用，界面美观。其快照的主要原理在开了一个轻量级的 Chrome 专门用来渲染页面然后截图，效果和普通的获取截图的相比效果尤其的好。使用感受我测试了多个平台，包括但不限于微信公众号，少数派，某个 Wordpress 博客。在微信公众号的文章爬取中，这个无法正确显示图片，初步分析是因为其在显示的时候需要把 data-src 正确解析为 src，而且还要加上 Referer。这一点做的不如 Wallabag。少数派的文章中这个爬取的比 Wallabag 效果好，至少大部分图片能正常显示，但是对代码的渲染不够好。对于 Wordpress 博客，Wallabag 和这个的效果差不多，但是Wallabag 的页面美观程度远比不上这个。Wallabag介绍同上，但是页面美观度不如上面，但是时间更久远。使用感受和上一个差不多吧，只不过颜值确实不如。。。。Freshrss介绍功能强大的 RSS 阅读软件，也是自托管的，但是颜值就一般了。使用感受还可以，能用，但是颜值方面比不上一些本地的阅读软件。Linkding介绍一个自托管的书签管理应用，可以一键从各大浏览器导入。使用感受颜值方面是很不错的，而且其搜索功能也很强大，UI 交互上还算挺好的（相比起前面所说的部分应用）。总结我大概就安装了这些，算上 Nginx，Mysql 8，PHP 和各种其他东西内存大概占了 4GB，对我来说很富裕。

DataMaker 一款基于 C++ 的数据生成器
type: item
date: 2024-02-02T22:21:08+08:00
description: 注意：由于这个是作者早期写的，过于烂，所以作者准备重构。[github author="ZhongTianrui" project="DataMaker"][/github]如果访问不了 Github，可以访问 Gitee 中的仓库。一个为OIer准备的数据制造系统，想要造出数据？只需要打开makedata.cpp，用cout和我们提供的随机函数，即可造出多组强大的数据优点：依赖于 c++，OIer 的福利自动生成 zip 文件，不用手动生成自动配置捆绑速度快用法：打开 makedata.cpp，使用函数库自定义随机数，用cout进行输出。主程序的第一行必须是 pre();打开 std.cpp，放上标程记得保存。打开 config.json 在 mode 中选择模式：模式 0：no subtask，模式 1：subtask 捆绑，模式 2：subtask 不捆绑 在 name 中写入测试组的名称 在 std 中写入参考程序的路径 如果启用 subtask: 在 subtasks 中写入一个 json 的列表，每一个内容里包含两个个值，begin 代表测试点的开始，end 代表测试点的结束。 ​ 在 exename 中写入输入生成器的路径 ​ 可以在输入生成器中区分不同层次的数据范围，注意写完后调试输入生成器。使用方法如：#include <bits/stdc++.h> #include "includes/make.hpp" using namespace std; int main(int argc, char* argv[]) { ios::sync_with_stdio(false); pre(); /*make your data here use cout in output */ if (argv[1][0] == '0') cout << randint(1, 1e4) << " " << randint(1, 1e4);//第一种情况 else if (argv[1][0] == '1') cout << randint(1, 1e7) << " " << randint(1, 1e7);//第二种 else if (argv[1][0] == '2') cout << randint(1, 1e9) << " " << randint(1, 1e9);//第三种 else cout << "err";//如果 config 写的是对的话，这种情况不会发生 //每一个 subtask 对应一个 return 0; }如果不启用 subtask: 在 exename 中写入输入生成器的路径 注意上述的所有写入的程序路径均不以 ./ 开头或 .exe 结尾，应该用 / 作为路径分隔符而不是 \\。 程序会自动获取测试点的数量，只要你的测试点开头和结尾是按规范填的，而且每一个 subtask 的开头等于上一项的结尾的编号 + 1。运行 run.bat/run.sh，程序如果运行了一会后自动结束了，那么说明你成功了！（注意，如果发现程序卡住了，且电脑风扇转的很快，请关闭程序后重新打开）。直接把 “data-文件夹名.zip”上传到洛谷上就行了。储存库中的 sample 文件夹包含一些示例。函数库：randint() ：随机整型，支持 long longrandch\_up() ：随机大写字母randch\_lo() ：随机小写字母randstr\_h(int length) ：随机大小写字母和数字综合的字符串randstr\_up(int length) ：随机大写字符串randstr\_lo(int length) ：随机小写字符串randstr\_num(int length) ：随机数字串randarr(int n, int l, int r) ：随机数组，范围 [l, r]，返回 int*randqujian(int m, int l, int r) ：随机区间，生成 m 个 [l, r] 的区间，自动打印randtree(int n, bool with\_num, int r = 0) ：随机树，生成n个点，n-1 条边，可以选择是否带权，权值 [1, r]，自动打印。(如果不需要权值，不用传入 r)。randgra(int n, int m, bool with\_num) ：随机无向联通图，需自行打印 n 和 m，自动打印建边的输入，如果想有权值，with\_num = 1，否则 with\_num = 0update:datesummaryversion-移除随机名称功能，部分重构 make.cpp，移除task\_amount参数3.12024/2/3原本的捆绑选项变为模式选项，增加数据分层模式，把…