<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>SrP-BloG</title><description>技术分享与实践</description><link>https://blog.srprolin.top/</link><language>zh_CN</language><item><title>SrP-CFG 游戏设置预设文件 | CS2</title><link>https://blog.srprolin.top/posts/srp-cfg/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/srp-cfg/</guid><description>有关游戏CS2的全面配置文件解读，分享自用的CFG预设文件组，提升游戏体验与统一度</description><pubDate>Sat, 12 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Bilibili视频链接：&lt;a href=&quot;https://www.bilibili.com/video/BV1n7C2BzE11/&quot;&gt;BV1n7C2BzE11&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在这篇文章中将一步步地帮助你完成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;找到 CFG 存储位置，定制个性化功能，编写 CFG 文件，并成功应用；&lt;/li&gt;
&lt;li&gt;在必要时刻还原 CFG，避免操作不当产生的后果；&lt;/li&gt;
&lt;li&gt;根据文件实时查看所更改设置的指令，辅助编写 CFG 文件；&lt;/li&gt;
&lt;li&gt;在本人提供的预设 CFG 基础上，使用或魔改；&lt;/li&gt;
&lt;li&gt;向本人联系，为你的预设添加进仓库，得到同步更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;CFG 简介&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;CFG&lt;/code&gt; 是 config(设置)的简写，能够以代码写入文件中，来保存游戏设置，在多账号和多设备登录情况下非常好用。&lt;/p&gt;
&lt;p&gt;另外，一些特殊的指令，只有使用&lt;code&gt;CFG&lt;/code&gt;才能在游戏中快速使用。&lt;/p&gt;
&lt;h2&gt;CFG 存放位置&lt;/h2&gt;
&lt;p&gt;首先，&lt;code&gt;Steam云&lt;/code&gt;是 Valve 帮助单机玩家保存存档备份的一项功能，但它也同样被运用到了&lt;code&gt;CS2&lt;/code&gt;中。&lt;/p&gt;
&lt;p&gt;由于国内裸连 Steam 甚至打不开商店和社区，所以&lt;code&gt;Steam云&lt;/code&gt;的效果可想而知，特别是&lt;code&gt;CS2&lt;/code&gt;在多次启动的情况下，会不断调用&lt;code&gt;Steam云&lt;/code&gt;，如果某一时刻网络不佳，就会导致&lt;code&gt;同步失败&lt;/code&gt;，进而影响游戏设置。&lt;/p&gt;
&lt;p&gt;为了避免这种混乱，建议使用本地存档的位置来保存&lt;code&gt;CFG&lt;/code&gt;，并禁用&lt;code&gt;CS2&lt;/code&gt;的&lt;code&gt;Steam云&lt;/code&gt;功能。&lt;/p&gt;
&lt;p&gt;根据以上说明，那么&lt;code&gt;CFG&lt;/code&gt;就会有两个位置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;游戏全局CFG&lt;/code&gt;(上文中的&lt;code&gt;本地存档&lt;/code&gt;)：&lt;code&gt;...\SteamLibrary\steamapps\common\Counter-Strike Global Offensive\game\csgo\cfg** 或 **...\Steam\steamapps\common\Counter-Strike Global Offensive\game\csgo\cfg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;个人用户CFG&lt;/code&gt;(上文中&lt;code&gt;Steam云&lt;/code&gt;保存的位置)：&lt;code&gt;...\Steam\userdata\123456789\730\local\cfg&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要注意的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;根据游戏安装位置的不同，&lt;code&gt;游戏全局CFG&lt;/code&gt;可能是在两种位置中的一种，
&lt;ul&gt;
&lt;li&gt;根据&lt;code&gt;Steam&lt;/code&gt;本体和游戏安装位置是否相同确认，如果你的游戏存放盘符与 &lt;code&gt;steam&lt;/code&gt; 存放盘符不同，就参考前者，若相同，则后者。&lt;/li&gt;
&lt;li&gt;建议将要用的&lt;code&gt;CFG&lt;/code&gt;文件放在&lt;code&gt;游戏全局CFG&lt;/code&gt;位置。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;个人用户CFG&lt;/code&gt;位置中的&lt;code&gt;123456789&lt;/code&gt;为 &lt;code&gt;steamID&lt;/code&gt;(同时也是文件夹名称)，可用于添加好友，如果你的 PC 上有多个 steam 账号登录过，那么在 &lt;code&gt;userdata&lt;/code&gt; 文件夹中你会看到多个用户文件夹。
&lt;ul&gt;
&lt;li&gt;请前往&lt;code&gt;Steam-&amp;gt;好友-&amp;gt;添加好友&lt;/code&gt;处查看当前账号的&lt;code&gt;steamID&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;与&lt;code&gt;游戏全局CFG&lt;/code&gt; 不同，&lt;code&gt;个人用户CFG&lt;/code&gt;不止能设置&lt;code&gt;CFG&lt;/code&gt;文件，还多了一个 &lt;code&gt;cs2_video.txt&lt;/code&gt; 配置文件,它能够对游戏的画面设置进行设置，后文会提到。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cs2_video.txt&lt;/code&gt;的位置：&lt;code&gt;...\Steam\userdata\123456789\730\local\cfg\cs2_video.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面是使用&lt;code&gt;Steam&lt;/code&gt;应用可视化查找&lt;code&gt;游戏全局CFG&lt;/code&gt;位置的操作流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 steam 库，找到 &lt;code&gt;Counter-Strike 2&lt;/code&gt;，右击选择属性&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-12-52.B2QdYoJb_Z1xnsqt.webp&quot; alt=&quot;steam&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;选择“已安装文件”，点击浏览&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-14-48.BT99fMRK_1LzA1I.webp&quot; alt=&quot;steam2&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入“&lt;code&gt;game&lt;/code&gt;”，进入“&lt;code&gt;csgo&lt;/code&gt;”，选择“&lt;code&gt;cfg&lt;/code&gt;”，该目录下就是存放 &lt;code&gt;cfg&lt;/code&gt; 文件的位置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-16-27.JoMBsW8T_2w1RP.webp&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-18-32.mt_fFI2Y_2iwuqV.webp&quot; alt=&quot;2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-19-00.49FE4MXR_LD3hq.webp&quot; alt=&quot;3&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;一个特殊的 CFG 模板&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Steam启动项&lt;/code&gt;是 steam 在启动游戏时自动为游戏执行的命令，位置依旧是在前文提到的&lt;code&gt;游戏属性&lt;/code&gt;中。
&lt;code&gt;exec&lt;/code&gt;指令可以理解为&lt;code&gt;加载&lt;/code&gt;的意思，例如&lt;code&gt;exec auto.cfg&lt;/code&gt;就是加载&lt;code&gt;auto.cfg&lt;/code&gt;这个文件，这样&lt;code&gt;CFG&lt;/code&gt;的功能才能被启用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在众多&lt;code&gt;CFG&lt;/code&gt;文件中，有一个名为&lt;code&gt;autoexec.cfg&lt;/code&gt;的文件是极其特殊的，无论你是否在&lt;code&gt;Steam&lt;/code&gt;启动项中添加了&lt;code&gt;exec&lt;/code&gt;指令，它都会被游戏启动时自动加载，因此它非常适合放一些基础功能。&lt;/p&gt;
&lt;p&gt;这里给出&lt;code&gt;autoexec.cfg&lt;/code&gt;的文件模板：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//键位
bind &quot;w&quot; &quot;+forward&quot; //前进
bind &quot;s&quot; &quot;+back&quot; //后退
bind &quot;a&quot; &quot;+left&quot; //向左
bind &quot;d&quot; &quot;+right&quot; //向右
bind &quot;mouse1&quot; &quot;+attack&quot; //左键攻击
bind &quot;mouse2&quot; &quot;+attack2&quot; //右键特殊攻击
bind &quot;e&quot; &quot;+use&quot; //使用
bind &quot;f&quot; &quot;+lookatweapon&quot; //检视
bind &quot;space&quot; &quot;+jump&quot;  //跳跃
bind &quot;ctrl&quot; &quot;+duck&quot;  //蹲下
bind &quot;tab&quot; &quot;+showscores&quot; //打开计分板
bind &quot;g&quot; &quot;drop&quot;   //丢弃装备
bind &quot;m&quot; &quot;teammenu&quot; //选择队伍
bind &quot;shift&quot; &quot;+sprint&quot; //静步
bind &quot;b&quot; &quot;buymenu&quot; //购买菜单
bind &quot;z&quot; &quot;slot6&quot; //雷
bind &quot;x&quot; &quot;slot7&quot; //闪
bind &quot;c&quot; &quot;slot8&quot; //烟
bind &quot;6&quot; &quot;slot9&quot; //诱饵弹
bind &quot;v&quot; &quot;slot10&quot; //火
bind &quot;y&quot; &quot;+spray_menu&quot; //打开涂鸦菜单
bind &quot;i&quot; &quot;messagemode2&quot;//团队聊天框
bind &quot;u&quot; &quot;messagemode&quot;//全局聊天框
bind &quot;mouse4&quot; &quot;+voicerecord&quot;//打开麦克风
bind &quot;mouse5&quot; &quot;player_ping&quot;//玩家示意标志
bind &quot;mwheeldown&quot; &quot;+jump&quot; //滚轮下跳
bind &quot;mwheelup&quot; &quot;+jump&quot;//滚轮上跳
bind &quot;`&quot; &quot;toggleconsole&quot;//打开控制台
bind &quot;t&quot; &quot;switchhands&quot;//切换左右手持枪
bind &quot;h&quot; &quot;toggleradarscale&quot; //切换小地图缩放
bind &quot;ralt&quot; &quot;radio2;slot12&quot; //无线电与X光

//准星
cl_crosshair_drawoutline &quot;0&quot; // 禁用十字准星的轮廓线
cl_crosshair_dynamic_maxdist_splitratio &quot;1&quot; // 动态十字准星的最大分离距离比例
cl_crosshair_dynamic_splitalpha_innermod &quot;0&quot; // 动态十字准星内部分离部分的透明度
cl_crosshair_dynamic_splitalpha_outermod &quot;1&quot; // 动态十字准星外部分离部分的透明度
cl_crosshair_dynamic_splitdist &quot;3&quot; // 动态十字准星的分离距离
cl_crosshair_friendly_warning &quot;0&quot; // 禁用对友军的十字准星警告
cl_crosshair_outlinethickness &quot;1&quot; // 十字准星轮廓线的厚度
cl_crosshair_sniper_show_normal_inaccuracy &quot;0&quot; // 禁用狙击枪十字准星显示正常不准确度
cl_crosshair_t &quot;0&quot; // 禁用T形十字准星
cl_crosshairalpha &quot;255&quot; // 十字准星的透明度（255为完全不透明）
cl_crosshaircolor 5 // 设置十字准星颜色为自定义（5表示自定义颜色）
cl_crosshaircolor_b &quot;255&quot; // 自定义十字准星的蓝色分量（255为最大）
cl_crosshaircolor_g &quot;255&quot; // 自定义十字准星的绿色分量（255为最大）
cl_crosshaircolor_r &quot;0&quot; // 自定义十字准星的红色分量（0为最小）
cl_crosshairdot &quot;0&quot; // 禁用十字准星中心点
cl_crosshairgap &quot;-3.644676&quot; // 设置十字准星的间隙（负值表示向内收缩）
cl_crosshairgap_useweaponvalue &quot;0&quot; // 禁用根据武器值调整十字准星间隙
cl_crosshairsize &quot;0.901125&quot; // 设置十字准星的大小
cl_crosshairstyle &quot;4&quot; // 设置十字准星样式为经典静态（4表示经典静态）
cl_crosshairthickness &quot;0.961664&quot; // 设置十字准星的厚度
cl_crosshairusealpha &quot;1&quot; // 启用十字准星的透明度设置

//狙击枪瞄准线宽度
cl_crosshair_sniper_width &quot;2&quot;

//鼠标灵敏度
sensitivity 0.50

//持枪视角
viewmodel_fov 68 // 设置第一人称视角的视野范围（FOV），值越大，视野越广
Viewmodel_offset_x 2.5 // 调整武器模型在水平方向（X轴）上的偏移，正值向右，负值向左
Viewmodel_offset_y 0 // 调整武器模型在垂直方向（Y轴）上的偏移，正值向上，负值向下
Viewmodel_offset_z -1.5 // 调整武器模型在深度方向（Z轴）上的偏移，正值向前，负值向后
viewmodel_presetpos 2 // 使用预设的武器模型位置（2表示经典位置）

//雷达
cl_radar_always_centered &quot;0&quot; // 禁用雷达始终以玩家为中心，雷达会显示地图的完整区域
cl_radar_scale &quot;0.37&quot; // 设置雷达的缩放比例，值越小，雷达显示的范围越大
cl_hud_radar_scale &quot;1&quot; // 设置HUD上雷达的缩放比例，1为默认大小
cl_teammate_colors_show 2 // 设置队友颜色显示模式，2表示显示队友的轮廓颜色
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;如何创建一个&lt;code&gt;CFG&lt;/code&gt;文件&lt;/h2&gt;
&lt;p&gt;在接触&lt;code&gt;CFG&lt;/code&gt;文件之前，我们似乎很少见到后缀为&lt;code&gt;.cfg&lt;/code&gt;的文件，它是一种专为配置文件所产生的格式。&lt;/p&gt;
&lt;p&gt;我们可以通过新建&lt;code&gt;.txt&lt;/code&gt;文本格式文件，更改其后缀名为&lt;code&gt;.cfg&lt;/code&gt;得到&lt;code&gt;CFG&lt;/code&gt;文件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在桌面新建一个文本文档(也就是 &lt;code&gt;txt&lt;/code&gt;)，可以直接在这个 &lt;code&gt;txt&lt;/code&gt; 文件中编写配置(当然&lt;code&gt;.cfg&lt;/code&gt;文件也可以用&lt;code&gt;记事本&lt;/code&gt;打开并编辑)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-38-17.GUwS649-_2p9Wdb.webp&quot; alt=&quot;1&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编写完成后，找到这个文件，更改后缀为 &lt;code&gt;.cfg&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;如果你无法显示后缀，请按照下面操作：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-12_23-41-02.DROY1uhH_jCLm8.webp&quot; alt=&quot;2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;视频设置文件&lt;/h2&gt;
&lt;p&gt;虽然视频设置文件是以&lt;code&gt;.txt&lt;/code&gt;格式保存的，但它也是一种&lt;code&gt;Config&lt;/code&gt;也即&lt;code&gt;CFG&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;下面是一个&lt;code&gt;cs2_video.txt&lt;/code&gt;文件的模板，需要注意的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所有的注释要删除掉，文件功能才能被正常启用。&lt;/li&gt;
&lt;li&gt;该文件要放入&lt;code&gt;个人用户CFG&lt;/code&gt;目录下：&lt;code&gt;...\Steam\userdata\123456789\730\local\cfg&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;&quot;video.cfg&quot;
{
	&quot;Version&quot;		&quot;16&quot;  // 配置文件版本号
	&quot;VendorID&quot;		&quot;4318&quot;  // 显卡厂商识别码，此处为NVIDIA
	&quot;DeviceID&quot;		&quot;10464&quot;  // 显卡设备识别码，此处为RTX 4060
	&quot;setting.cpu_level&quot;		&quot;3&quot; // CPU 性能等级梯队
	&quot;setting.gpu_mem_level&quot;		&quot;3&quot; // GPU 显存性能等级梯队
	&quot;setting.gpu_level&quot;		&quot;3&quot; // GPU 性能等级梯队
	&quot;setting.knowndevice&quot;		&quot;0&quot; // 优先使用的GPU设备（0 为主显卡）
	&quot;setting.monitor_index&quot;		&quot;0&quot; // 显示器索引（0 为主显示器）
	&quot;setting.defaultres&quot;		&quot;1280&quot; // 分辨率宽度
	&quot;setting.defaultresheight&quot;		&quot;960&quot; // 分辨率高度
	&quot;setting.aspectratiomode&quot;		&quot;0&quot; // 宽高比模式（0 为自动，1 为 4:3，2 为 16:9）
	&quot;setting.refreshrate_numerator&quot;		&quot;0&quot; // 刷新率分子（0 表示使用默认值）
	&quot;setting.refreshrate_denominator&quot;		&quot;0&quot; // 刷新率分母（0 表示使用默认值）
	&quot;setting.fullscreen&quot;		&quot;0&quot; // 是否启用全屏模式（0 为否，1 为是）
	&quot;setting.coop_fullscreen&quot;		&quot;1&quot; // 合作模式是否启用全屏（1 为是）
	&quot;setting.nowindowborder&quot;		&quot;1&quot; // 是否启用无边框窗口模式（1 为是）
	&quot;setting.fullscreen_min_on_focus_loss&quot;		&quot;0&quot; // 失去焦点时是否最小化全屏窗口（0 为否）
	&quot;setting.high_dpi&quot;		&quot;0&quot; // 是否启用高 DPI 缩放（0 为否）
	&quot;setting.mat_vsync&quot;		&quot;0&quot; // V-sync 是否启用垂直同步（0 为否，1 为是）
	&quot;setting.r_low_latency&quot;		&quot;0&quot; // 是否启用低延迟模式（1 为是）
	&quot;AutoConfig&quot;		&quot;2&quot; // 自动配置等级（2 为自定义配置）
	&quot;setting.msaa_samples&quot;		&quot;2&quot; // 多重采样抗锯齿（MSAA）采样数（2 为 2x MSAA）
	&quot;setting.r_csgo_cmaa_enable&quot;		&quot;1&quot; // 是否启用 CMAA 抗锯齿（0 为否）
	&quot;setting.videocfg_shadow_quality&quot;		&quot;3&quot; // 全局阴影效果（0 为低，1 为中，2 为高，3 为非常高）
	&quot;setting.videocfg_dynamic_shadows&quot;		&quot;1&quot; // 动态阴影的启用（1 为是）
	&quot;setting.videocfg_texture_detail&quot;		&quot;1&quot; // 模型/贴图细节（0 为低，1 为中，2 为高）
	&quot;setting.r_texturefilteringquality&quot;		&quot;3&quot; // 贴图过滤模式（0-5，双线性、三线性、异项2X、4X、8X、16X）
	&quot;setting.shaderquality&quot;		&quot;0&quot; // 光影细节（0 为低，1 为高）
	&quot;setting.videocfg_particle_detail&quot;		&quot;0&quot; // 粒子细节（0 为低，1 为中，2 为高，3 为非常高）
	&quot;setting.videocfg_ao_detail&quot;		&quot;0&quot; // 环境光遮蔽（AO）细节（0 为禁用，2 为中，3 为高）
	&quot;setting.videocfg_hdr_detail&quot;		&quot;3&quot; // 高动态范围 （-1为品质，3为性能）
	&quot;setting.videocfg_fsr_detail&quot;		&quot;0&quot; // 超级分辨率FSR（0 为禁用，1、2、3、4分别为超高品质、品质、均衡、性能）
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;还原与备份&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;进入&lt;code&gt;CS2&lt;/code&gt;游戏，在&lt;code&gt;设置&lt;/code&gt;中将&lt;code&gt;启用控制台&lt;/code&gt;选择为&lt;code&gt;是&lt;/code&gt;，默认情况下可以按 &lt;code&gt;`&lt;/code&gt;来打开控制台
如果不行，请切换为&lt;code&gt;英文输入法&lt;/code&gt;或者点击按键&lt;code&gt;CAPS&lt;/code&gt;来切换&lt;code&gt;锁定大小写&lt;/code&gt;，直到 &lt;code&gt;`&lt;/code&gt; 被游戏正确读取并打开控制台&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果你使用了网络上的&lt;code&gt;CFG&lt;/code&gt;预设后按键不知道怎么恢复？或者应该如何试用他人的&lt;code&gt;CFG&lt;/code&gt;预设？&lt;/p&gt;
&lt;p&gt;让我们先进入游戏，打开&lt;code&gt;控制台&lt;/code&gt;来解决这两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输入 &lt;code&gt;host_writeconfig backup&lt;/code&gt; 可生成 &lt;code&gt;backup.cfg&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;这是你当前按键绑定的一个备份，需要在&lt;code&gt;试用他人的CFG预设前&lt;/code&gt;操作，可在必要时在控制台输入 &lt;code&gt;exec backup&lt;/code&gt; 恢复原按键绑定设置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;输入 &lt;code&gt;binddefaults&lt;/code&gt;后，将按键绑定改为默认按键。
&lt;ul&gt;
&lt;li&gt;此时输入&lt;code&gt;key_listboundkeys&lt;/code&gt; 可在控制台输出里查看所有的按键绑定功能&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;一些有趣的控制台指令&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;在&lt;a href=&quot;https://developer.valvesoftware.com/wiki/List_of_Counter-Strike_2_console_commands_and_variables&quot;&gt;Vavle 开发者社区的 CS2 板块&lt;/a&gt;找到所有控制台指令
也可以在游戏中输入&lt;code&gt;cvar list&lt;/code&gt;，控制台则会输出全部的指令。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;了解控制台指令功能，可以将其绑定在按键上，并写入 &lt;code&gt;CFG&lt;/code&gt; 文件，实现一键功能。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sv_cheats 1 // 开启作弊模式，允许使用作弊命令
bot_kick // 踢出所有机器人
mp_buy_anywhere 1 // 允许在任意位置购买装备
mp_freezetime 0 // 设置赛前准备时间为0秒
mp_maxmoney 99999 // 设置最大金钱数为99999
mp_startmoney 99999 // 设置起始金钱数为99999
mp_buytime 99999 // 设置购买时间为99999秒
mp_ignore_round_win_conditions 1 // 回合永不结束
mp_respawn_on_death_ct 1 // CT阵营无限复活
mp_respawn_on_death_t 1 // T阵营无限复活
mp_friendlyfire 1 // 开启队友伤害
ammo_grenade_limit_total 6 // 设置手榴弹最大可携带数为6
mp_spectators_max 9 // 设置游戏观察者最大数为9
mp_autokick 0 // 禁用自动踢出服务器功能
mp_restartgame 1 // 在1秒后重启回合
sv_grenade_trajectory_prac_pipreview 1 // 启用手榴弹轨迹的预览
sv_grenade_trajectory_prac_trailtime 8 // 设置手榴弹轨迹可见时间为8秒
sv_infinite_ammo 2 // 设置无限弹药模式（道具无限），但仍需换弹夹
sv_showimpacts 1 // 开启弹痕显示
exec autoexec.cfg // 执行 autoexec.cfg 配置文件，加载自定义设置
key_listboundkeys // 列出所有已绑定的按键及其对应的命令
toggle cl_teamid_overhead_mode 1 3 // 切换队友头顶标识模式（1 为简单标识，3 为详细标识）
toggle cl_draw_only_deathnotices 1 0 // 切换是否仅显示死亡通知（1 为仅显示，0 为显示完整 HUD）
toggle cl_drawhud_force_radar 1 0 // 切换是否强制显示雷达（1 为强制显示，0 为正常显示）
cl_hud_color &quot;11&quot; // 设置 HUD 颜色为粉色
con_enable &quot;1&quot; // 启用控制台功能
fps_max 0 // 设置 FPS 无上限，允许游戏以最高帧率运行
cl_join_advertise &quot;2&quot; // 显示玩家计划加入反恐精英队的信息
cl_use_opens_buy_menu &quot;0&quot; // 禁用在靠近购买区域时按下使用键（E键）自动打开购买菜单的功能
cl_dm_buyrandomweapons 0 // 在死亡竞技模式中禁用自动购买随机武器
gameinstructor_enable &quot;0&quot; // 禁用游戏指导功能
cl_autohelp &quot;false&quot; // 禁用自动帮助提示
mm_dedicated_search_maxping &quot;70&quot; // 优先选择延迟在 70 毫秒以内的服务器
func_break_max_pieces 0 // 游戏会根据物体的属性生成默认数量的碎片
r_drawtracers_firstperson 1 // 开启第一人称视角中的子弹轨迹显示
r_fullscreen_gamma 3.0 // 调整游戏画面伽马值为 3.0
cl_teamid_overhead_mode 3 // 始终显示队友名称与装备信息
echo AutoConfig Enabled! // 在控制台打印 &quot;AutoConfig Enabled!&quot; 提示信息
mp_damage_headshot_only 1 // 仅爆头才能造成伤害，其他部位攻击无效
ent_create chicken // 在游戏中生成一只鸡（娱乐功能）
custom_bot_difficulty 5 // 设置自定义 BOT 难度为最高（5 为最高难度）
mp_plant_c4_anywhere 1 // 允许在任何位置安放 C4 炸弹
mp_c4timer 40 // 设置 C4 炸弹的倒计时为 40 秒
sv_regeneration_force_on 1 // 开启生命值自动回复功能
cl_showpos 1 // 在屏幕上显示玩家当前的位置、速度和角度信息
mp_weapons_glow_on_ground 1 // 开启地面武器的高亮显示功能
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;如何即时查看&lt;code&gt;CFG&lt;/code&gt;的命令参数&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;我们知道既然游戏设置可以被&lt;code&gt;CFG&lt;/code&gt;文件所&lt;code&gt;设置&lt;/code&gt;，那么这些&lt;code&gt;游戏设置项&lt;/code&gt;的参数也一定是被记录在了&lt;code&gt;文件&lt;/code&gt;中，在这里我们就是要找到这样的&lt;code&gt;参数&lt;/code&gt;，来辅助编写&lt;code&gt;CFG&lt;/code&gt;文件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;场景一：使用&lt;code&gt;CFG&lt;/code&gt;文件来配置准星&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CS2&lt;/code&gt;提供的方式是使用&lt;code&gt;准星代码&lt;/code&gt;导入导出来实现准星更改，但这样我们还是不知道哪条指令的哪个参数改变了该准星的样貌，并且&lt;code&gt;CFG&lt;/code&gt;文件也并不能根据&lt;code&gt;准星代码&lt;/code&gt;来设置准星；&lt;/p&gt;
&lt;p&gt;如果你详细查看了前文的&lt;code&gt;autoexec.cfg&lt;/code&gt;文件内容，不难发现我们是用&lt;code&gt;cl_crosshair_.. &quot;0&quot;&lt;/code&gt;类似的指令来更改准星的，那么这些指令和参数在哪里找到？&lt;/p&gt;
&lt;p&gt;场景二：目标功能为按下&lt;code&gt;C&lt;/code&gt;键切换为烟雾弹，但是不知道什么指令是&lt;code&gt;切换为烟雾弹&lt;/code&gt;，在哪里找？&lt;/p&gt;
&lt;p&gt;虽然这一小节解决问题的方法是&lt;code&gt;即时查看所更改的设置&lt;/code&gt;，但是场景二可以在&lt;a href=&quot;https://www.cs2bindsgenerator.com/&quot;&gt;CS2BindGenerator&lt;/a&gt;网站上自动生成对应指令。&lt;/p&gt;
&lt;p&gt;场景三：游戏中有一个&lt;code&gt;快捷轮盘&lt;/code&gt;功能，我想要自定义设置它每一个语音指令的位置，并且保存下来，它们的指令是什么？&lt;/p&gt;
&lt;p&gt;针对以上三种场景，我们可以打开&lt;code&gt;即时保存设置&lt;/code&gt;的文件来查看当我们在游戏中进行操作后，对应文件会有什么样的信息，来确定某项功能的对应指令：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到如下路径 &lt;code&gt;...\Steam\userdata\123456789\730\local\cfg&lt;/code&gt; ,找到如下文件打开。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/20250420121101.CY93yX01_1m2eLX.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;这里的参数就是准星参数，在导入&lt;code&gt;准星代码&lt;/code&gt;后，重新打开或刷新该文件，此部分参数就会更改，届时保存即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/20250420121153.BXfBp9o7_1hRkNj.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下面这个文件里就是所有的按键绑定即时操作，可以查看所有刚刚更改的按键绑定。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_03-18-22.aD3htQDP_2vyLUq.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;下面这个文件为快捷轮盘&lt;code&gt;chatwheel&lt;/code&gt;的各语音关键词代码：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_03-20-46.C8eiZjEu_Z1BQxDx.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_03-23-37.zzFMZjPd_ZQh3Q.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;设置启动项&lt;/h2&gt;
&lt;p&gt;启动项是在游戏运行时即刻执行的命令，严格来说这也是一种&lt;code&gt;Config&lt;/code&gt;配置&lt;/p&gt;
&lt;p&gt;下面使一些常用启动项，需要注意的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每一条指令之间要有一个&lt;code&gt;空格&lt;/code&gt;来分割。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;-novid  //关闭过场动画,CS2中已失效
-high  //提高CSGO程序优先级，有可能负优化
-nojoy //关闭手柄相关，降低内存占用
-perfectworld  //直接进入国服
-worldwide  //直接进入国际服
-w 1920 -h 1080  //设置分辨率1920x1080
-noborder //无边框窗口化
+exec auto.cfg  //加载auto.cfg
+fps_max 300  //限制fps最大300
-allow_third_party_software  //允许OBS等第三方软件
-noreflex //取消游戏内的reflex功能，可以在NVIDIA控制面板中开启
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面是本人的启动项：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-allow_third_party_software -worldwide
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动项设置位置已在前文提出，下面是位置图例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-04-13_00-11-22.Dqv_H3J6_1J7Jrl.webp&quot; alt=&quot;qidong&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;SrP-CFG_ForCS2&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本人的&lt;code&gt;CFG&lt;/code&gt;预设文件已经在&lt;code&gt;GitHub仓库&lt;/code&gt;&lt;a href=&quot;https://github.com/RolinShmily/SrP-CFG_ForCS2&quot;&gt;SrP-CFG_ForCS2&lt;/a&gt;中发布&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是本人所使用的一套&lt;code&gt;CFG&lt;/code&gt;预设文件，包含了多个场景的&lt;code&gt;CFG&lt;/code&gt;使用需求，另外还开发了该套&lt;code&gt;CFG&lt;/code&gt;的官方网站和一键安装程序，且长期维护更新，保证有效可用。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;RolinShmily/SrP-CFG_ForCS2&quot;}&lt;/p&gt;
&lt;p&gt;你会需要的链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cfg.srprolin.top/&quot;&gt;官方网站 | cfg.srprolin.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cfg.srprolin.top/download&quot;&gt;下载地址 | cfg.srprolin.top&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cfg.srprolin.top/docs&quot;&gt;文档指南 | cfg.srprolin.top&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是一些SrP-CFG-Installer-V3版本的一些程序页面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-19_15-24-52.BGTzooX3_Ze31p6.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-19_15-25-28.CKCK2Z-1_2vOESo.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-19_15-26-13.CpZ6oHtr_NcQcV.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-19_15-27-34.CjgEEWEV_2CIbz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>在Windows上使用MSYS2+MinGW工具链 | gcc | gdb | cmake | make | Ninja | VScode</title><link>https://blog.srprolin.top/posts/msys/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/msys/</guid><description>通过在Windows系统上安装MSYS2模拟Linux环境，并使用pacman包管理器安装MinGW版的gcc、gdb、cmake、make工具链，并使用VScode搭建有关C/Cpp、嵌入式Stm32的开发环境。</description><pubDate>Sun, 10 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.msys2.org/&quot;&gt;MSYS2官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VScode官网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;MSYS2+VScode安装与配置&lt;/h1&gt;
&lt;p&gt;前往&lt;a href=&quot;https://www.msys2.org/&quot;&gt;MSYS2官方文档&lt;/a&gt;和&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VScode官网&lt;/a&gt;下载安装包，并进行安装(推荐安装路径均为默认)。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-17-10.DJ9GdF6c_Z1V3Gyo.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;VScode常用插件(拓展)与设置&lt;/h2&gt;
&lt;p&gt;建议登录一个Microsoft微软或GitHub账户，用于开启&lt;strong&gt;同步设置&lt;/strong&gt;，并在&lt;strong&gt;默认配置文件&lt;/strong&gt;或&lt;strong&gt;新建配置文件&lt;/strong&gt;中进行常用设置，后面根据语言可以新建配置文件复制通用配置，再安装对应的拓展，进行拓展分离。&lt;/p&gt;
&lt;p&gt;VScode设置(&lt;code&gt;settings.json&lt;/code&gt;)文件内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  // 自动保存文件
  &quot;files.autoSave&quot;: &quot;afterDelay&quot;,
  // 自动猜测文件编码
  &quot;files.autoGuessEncoding&quot;: true,
  // 列表、光标移动、编辑器、光标闪烁样式平滑
  &quot;workbench.list.smoothScrolling&quot;: true,
  &quot;editor.cursorSmoothCaretAnimation&quot;: &quot;on&quot;,
  &quot;editor.smoothScrolling&quot;: true,
  &quot;editor.cursorBlinking&quot;: &quot;smooth&quot;,
  // 按住 Ctrl 滚轮缩放编辑器字体
  &quot;editor.mouseWheelZoom&quot;: true,
  // 粘贴、输入、保存时自动格式化
  &quot;editor.formatOnPaste&quot;: true,
  &quot;editor.formatOnType&quot;: true,
  &quot;editor.formatOnSave&quot;: true,
  // 自动换行(避免横向滚动条)
  &quot;editor.wordWrap&quot;: &quot;on&quot;,
  // 括号配对引导线
  &quot;editor.guides.bracketPairs&quot;: true,
  // 允许代码片段触发快速建议
  &quot;editor.suggest.snippetsPreventQuickSuggestions&quot;: false,
  // 回车键智能接受建议（仅当没有其他文本建议时）
  &quot;editor.acceptSuggestionOnEnter&quot;: &quot;smart&quot;,
  // 建议列表优先显示最近使用的项
  &quot;editor.suggestSelection&quot;: &quot;recentlyUsed&quot;,
  // 使用自定义对话框样式
  &quot;window.dialogStyle&quot;: &quot;custom&quot;,
  // 在概览标尺中显示断点
  &quot;debug.showBreakpointsInOverviewRuler&quot;: true,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-29-00.DxcoHowL_Vc7ii.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开VScode设置(&lt;code&gt;Ctrl+,&lt;/code&gt;)后，点击打开&lt;code&gt;json&lt;/code&gt;文件，即可粘贴设置；下面是一些常用拓展：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MS-CEINTL.vscode-language-pack-zh-hans&quot;&gt;Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code&lt;/a&gt;：简中语言包。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-23-46.0JyggkCj_Z1bo1JB.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.hexeditor&quot;&gt;Hex Editor&lt;/a&gt;：16进制文件查看编辑器。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-30-57.DtbFEQh7_1ufKO9.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens&quot;&gt;Error Lens&lt;/a&gt;：报错高亮。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-33-58.CTrtvlyz_2gpW0L.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=buuug7.GBK2UTF8&quot;&gt;GBK to UTF8 for vscode&lt;/a&gt;：编码格式快速转换。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-37-12.CsOgyFpK_Z1OT1u9.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=cschlosser.doxdocgen&quot;&gt;Doxygen Documentation Generator&lt;/a&gt;：注释生成器。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-37-24.-vixuN-s_Z2lW7Mg.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=jasonlhy.hungry-delete&quot;&gt;Hungry Delete&lt;/a&gt;：快速删除空行、缩进。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-37-32.NU8PIj8Y_wImeT.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=kisstkondoros.vscode-gutter-preview&quot;&gt;Image preview&lt;/a&gt;：图片预览器。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-38-14.DVwpwMQ6_1agtYF.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme&quot;&gt;Material Icon Theme&lt;/a&gt;：文件Icon主题美化。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-39-14.Bk7LnbFB_KqMIO.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme&quot;&gt;One Dark Pro&lt;/a&gt;：VScode编辑器主题美化。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-40-02.p7OOiMgY_Z1KyTTR.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense&quot;&gt;Path Intellisense&lt;/a&gt;：路径补全。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-40-39.CSA6dJOE_ZkWIlN.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot;&gt;Prettier - Code formatter&lt;/a&gt;：代码格式自动优化。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-41-18.BDzMPbsR_Z1HmzRx.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh&quot;&gt;Remote - SSH&lt;/a&gt;：SSH链接远程项目地址，似本地一般的编辑体验。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-42-32.QzXb4BT6_1V5kIg.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=WakaTime.vscode-wakatime&quot;&gt;WakaTime&lt;/a&gt;：代码编辑时间统计，需要登录。
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-43-25.BML5eNSD_Z1xVpPo.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;MSYS2集成终端&lt;/h2&gt;
&lt;p&gt;在&lt;a href=&quot;https://www.msys2.org/docs/ides-editors/&quot;&gt;MSYS2文档中&lt;/a&gt;，提供了将MSYS2终端集成到VScode的方法，便是在&lt;code&gt;settings.json&lt;/code&gt;文件中添加如下字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 注意最外层大括号已在settings.json中存在
// 注意该配置的路径为默认安装路径
{
    &quot;terminal.integrated.profiles.windows&quot;: {
        &quot;MSYS2 UCRT&quot;: {
            &quot;path&quot;: &quot;cmd.exe&quot;,
            &quot;args&quot;: [
                &quot;/c&quot;,
                &quot;C:\\msys64\\msys2_shell.cmd -defterm -here -no-start -ucrt64&quot;
            ]
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后便可在VScode中打开MSYS2终端, 除此之外也可以在Windows搜索中输入&lt;code&gt;ucrt&lt;/code&gt;打开终端：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_13-52-09.Ca7Rg5ew_1pX0jw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;C/C++环境配置&lt;/h1&gt;
&lt;p&gt;打开MSYS2的UCRT64终端，输入如下命令安装工具链：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 编译器、调试器、构建系统、构建工具
pacman -S mingw-w64-ucrt-x86_64-{gcc,gdb,cmake,ninja,make}
# 版本检查
gcc -v
gdb -v
cmake --version
ninja --version
mingw32-make --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开VSCODE，创建配置文件，复制继承上文中的通用配置，随后激活后，在拓展中安装：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools&quot;&gt;C/C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-extension-pack&quot;&gt;C/C++ Extension Pack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools-themes&quot;&gt;C/C++ Themes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpp-devtools&quot;&gt;C/C++ DevTools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools&quot;&gt;CMake Tools&lt;/a&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_14-01-40.D9SSsiat_jkLvu.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_14-01-49.DwHz9u4u_Z1MYGvw.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_14-01-53.DIv3rX5d_Z1yLeSy.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_14-01-57.bKpvpPpw_1Cczc1.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/snipaste_2026-05-10_23-42-57.ZWul1hMX_Z1Vx9H1.webp&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于上文已经安装了MinGW工具链，因此拓展会自动寻找环境变量中的gcc编译器，MSYS2安装在默认位置下便无需手动配置路径了。&lt;/p&gt;
&lt;h1&gt;Stm32环境配置&lt;/h1&gt;
&lt;p&gt;安装&lt;a href=&quot;https://www.st.com/en/development-tools/stm32cubemx.html#get-software&quot;&gt;Stm32CubeMX&lt;/a&gt;用于下载固件库和创建工程。&lt;/p&gt;
&lt;p&gt;打开MSYS2的UCRT64终端，输入如下命令安装工具链：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 交叉编译器
pacman -S mingw-w64-ucrt-x86_64-arm-none-eabi-gcc
# 版本检查
arm-none-eabi-gcc --version 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;打开VSCODE，创建配置文件，复制继承上文中的通用配置，随后激活后，在拓展中安装：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=stmicroelectronics.stm32-vscode-extension&quot;&gt;STM32CubeIDE-for-Visual-Studio-Code&lt;/a&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-10_14-09-19.CCkDvBoV_1VPGIM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;同样的，我们已在前文中配置好了gcc、cmake等工具链，拓展在安装完必要的组件后，会自行查找所需工具路径，现在点击左侧小蝴蝶，就能用上Stm32CubeIDE的功能了。&lt;/p&gt;
</content:encoded></item><item><title>ClaudeCode安装与使用 | Agent | CC-Switch</title><link>https://blog.srprolin.top/posts/agent-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/agent-1/</guid><description>分享使用agent工具时的一些小心得</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://code.claude.com/docs/zh-CN/overview&quot;&gt;Claude Code Docs 中文文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.microsoft.com/detail/9mz1snwt0n5d?hl=zh-CN&amp;amp;gl=SG&quot;&gt;Powershell - Microsoft Store&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nodejs.org/zh-cn&quot;&gt;Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ccswitch.ai/&quot;&gt;CC-Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/install/windows&quot;&gt;Git For Windows&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://git-scm.com/book/zh/v2&quot;&gt;Git Book中文版&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文基础平台为Windows操作系统。(WSL操作逻辑同Linux)&lt;/p&gt;
&lt;h1&gt;Windows终端&lt;/h1&gt;
&lt;p&gt;按&lt;code&gt;win+x&lt;/code&gt;组合键，点击&lt;strong&gt;终端&lt;/strong&gt;会打开&lt;code&gt;Windows PowerShell&lt;/code&gt;终端，但这是早期的&lt;code&gt;version5&lt;/code&gt;版本，我们需要在&lt;a href=&quot;https://apps.microsoft.com/&quot;&gt;微软应用商店&lt;/a&gt;里下载&lt;code&gt;version7&lt;/code&gt;版本，应用名称为&lt;code&gt;PowerShell&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_20-53-35.D9ysukXw_2dpvn6.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_20-48-42.C1qM7NFP_1qvaPY.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后呼出终端，右键顶部选择设置，将默认终端选择为&lt;code&gt;PowerShell&lt;/code&gt;，输入如下命令检查版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查PowerShell版本
$PSVersionTable.PSVersion
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Node环境&lt;/h1&gt;
&lt;p&gt;前往&lt;a href=&quot;https://nodejs.org/zh-cn&quot;&gt;Node.js&lt;/a&gt;官网安装，此步会同步安装&lt;code&gt;npm&lt;/code&gt;包管理器和&lt;code&gt;npx&lt;/code&gt;快捷运行工具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_20-49-05.50KQQhLl_Z2kRbzB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后呼出终端，输入如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 允许PowerShell运行本地脚本
Set-ExecutionPolicy RemoteSigned

# 检查node、npm是否安装成功
node -v
npm -v
npx -v
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;ClaudeCode安装&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_20-54-41.CvDzZlhV_TiOmS.webp&quot; alt=&quot;&quot; /&gt;
在官方文档中，推荐的原生安装命令为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;irm https://claude.ai/install.ps1 | iex
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但由于国内网络问题，通常是无法持续正常访问的，因此我对脚本进行了解耦：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;param(
    [Parameter(Position=0)]
    [ValidatePattern(&apos;^(stable|latest|\d+\.\d+\.\d+(-[^\s]+)?)$&apos;)]
    [string]$Target = &quot;latest&quot;
)

Set-StrictMode -Version Latest
$ErrorActionPreference = &quot;Stop&quot;
$ProgressPreference = &apos;SilentlyContinue&apos;

# Check for 32-bit Windows
if (-not [Environment]::Is64BitProcess) {
    Write-Error &quot;Claude Code does not support 32-bit Windows. Please use a 64-bit version of Windows.&quot;
    exit 1
}

$DOWNLOAD_BASE_URL = &quot;https://downloads.claude.ai/claude-code-releases&quot;
$DOWNLOAD_DIR = &quot;$env:USERPROFILE\.claude\downloads&quot;

# Use native ARM64 binary on ARM64 Windows, x64 otherwise
if ($env:PROCESSOR_ARCHITECTURE -eq &quot;ARM64&quot;) {
    $platform = &quot;win32-arm64&quot;
} else {
    $platform = &quot;win32-x64&quot;
}
New-Item -ItemType Directory -Force -Path $DOWNLOAD_DIR | Out-Null

# Always download latest version (which has the most up-to-date installer)
try {
    $version = Invoke-RestMethod -Uri &quot;$DOWNLOAD_BASE_URL/latest&quot; -ErrorAction Stop
}
catch {
    Write-Error &quot;Failed to get latest version: $_&quot;
    exit 1
}

try {
    $manifest = Invoke-RestMethod -Uri &quot;$DOWNLOAD_BASE_URL/$version/manifest.json&quot; -ErrorAction Stop
    $checksum = $manifest.platforms.$platform.checksum

    if (-not $checksum) {
        Write-Error &quot;Platform $platform not found in manifest&quot;
        exit 1
    }
}
catch {
    Write-Error &quot;Failed to get manifest: $_&quot;
    exit 1
}

# Download and verify
$binaryPath = &quot;$DOWNLOAD_DIR\claude-$version-$platform.exe&quot;
try {
    Invoke-WebRequest -Uri &quot;$DOWNLOAD_BASE_URL/$version/$platform/claude.exe&quot; -OutFile $binaryPath -ErrorAction Stop
}
catch {
    Write-Error &quot;Failed to download binary: $_&quot;
    if (Test-Path $binaryPath) {
        Remove-Item -Force $binaryPath
    }
    exit 1
}

# Calculate checksum
$actualChecksum = (Get-FileHash -Path $binaryPath -Algorithm SHA256).Hash.ToLower()

if ($actualChecksum -ne $checksum) {
    Write-Error &quot;Checksum verification failed&quot;
    Remove-Item -Force $binaryPath
    exit 1
}

# Run claude install to set up launcher and shell integration
Write-Output &quot;Setting up Claude Code...&quot;
try {
    if ($Target) {
        &amp;amp; $binaryPath install $Target
    }
    else {
        &amp;amp; $binaryPath install
    }
}
finally {
    try {
        # Clean up downloaded file
        # Wait a moment for any file handles to be released
        Start-Sleep -Seconds 1
        Remove-Item -Force $binaryPath
    }
    catch {
        Write-Warning &quot;Could not remove temporary file: $binaryPath&quot;
    }
}

Write-Output &quot;&quot;
Write-Output &quot;$([char]0x2705) Installation complete!&quot;
Write-Output &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据脚本内容，我们先要获取版本号，访问&lt;code&gt;https://downloads.claude.ai/claude-code-releases/latest&lt;/code&gt;即可。&lt;/p&gt;
&lt;p&gt;然后获取&lt;code&gt;claude.exe&lt;/code&gt;本体，下载链接(以x64平台为例)为&lt;code&gt;https://downloads.claude.ai/claude-code-releases/2.1.133/win32-x64/claude.exe&lt;/code&gt;，如果后有更新，可以更改这里的版本号获取最新版。&lt;/p&gt;
&lt;p&gt;随后指定版本号并执行程序即可：&lt;code&gt;.\claude.exe install 2.1.133&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_21-03-24.Cybbpn9b_ujaxb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这时，我们需要将Claude的程序目录&lt;code&gt;C:\Users\&amp;lt;yourname&amp;gt;\.local\bin\&lt;/code&gt;添加进系统环境变量，以便于直接&lt;code&gt;claude&lt;/code&gt;命令启动。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_23-10-44.Dck8P4BQ_Z28l5Wf.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;CC-Switch应用&lt;/h1&gt;
&lt;p&gt;前往&lt;a href=&quot;https://ccswitch.ai/&quot;&gt;CC-Switch&lt;/a&gt;官网下载该应用，下面是该项目的简介：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;CC Switch 把供应商切换、MCP / Prompts / Skills、代理接管、会话检索和云同步收进同一个桌面应用，你不再需要反复手改 JSON、TOML 或 .env。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_23-18-53.PTiKrrnH_2ssIko.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里以&lt;code&gt;GLM Coding Plan&lt;/code&gt;的配置为例，&lt;code&gt;API KEY&lt;/code&gt;、&lt;strong&gt;请求地址&lt;/strong&gt;和&lt;strong&gt;主模型&lt;/strong&gt;是最重要的三个配置，这里也对应到&lt;code&gt;settings.json&lt;/code&gt;文件中的配置，随后启动&lt;code&gt;ClaudeCode&lt;/code&gt;就可以跳过登录了。&lt;/p&gt;
&lt;h1&gt;ClaudeCode基础使用&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 进入项目文件夹
cd ./pjc1/

# 启动参数
# 新会话启动
claude
# 继续上次对话启动
claude -c
# 自动式(完全权限)启动
claude --dangerously-skip-permissions

# 使用过程中
# 检查安装情况
/doctor
# 加载之前的会话上下文
/resume
# 清除上下文
/clear
# 显示上下文占用
/context
# 适时压缩上下文
/compact
# 回滚历史会话与修改 (快捷键：两次Esc)
/rewind
# 审查做出的代码更改 (自动调优review)
/simplify
# 创建项目记忆文件 (CLAUDE.md)
/init
# 编辑记忆文件 (全局/项目/文件夹)
/memory
# 创建子agent (subagents)
/agent
# 指定文件
@anyfile.md
# 退出ClaudeCode会话 (快捷键：两次Ctrl+C)
/exit

# 命令帮助
/help
# 配置信息
/config
# 模型更改
/model
# Skill工具
/skills
# MCP工具
/mcp
# ClaudeCode插件
/plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;快捷键&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+Tab&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;切换工作模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Ctrl+Enter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;换行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;取消当前操作 / 退出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;! &amp;lt;command&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;直接执行 shell 命令并返回输出&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;Git For Windows&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-05-08_23-58-15.DyGAke1I_Z7ilJ2.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;请前往 &lt;a href=&quot;https://git-scm.com/install/windows&quot;&gt;Git For Windows&lt;/a&gt; 官网进行下载，关于&lt;code&gt;Git&lt;/code&gt;相关的命令可以参考&lt;a href=&quot;https://git-scm.com/book/zh/v2&quot;&gt;Git Book中文版&lt;/a&gt;并结合&lt;code&gt;Agent&lt;/code&gt;来学习应用。&lt;/p&gt;
&lt;p&gt;首先，&lt;code&gt;Git&lt;/code&gt;本身作为代码版本管理工具，具有非常大的作用，方便我们随时保存和恢复代码版本；&lt;/p&gt;
&lt;p&gt;其次在Windows系统下，&lt;code&gt;Shell&lt;/code&gt;工具只有&lt;code&gt;PowerShell&lt;/code&gt;和&lt;code&gt;CMD&lt;/code&gt;，像&lt;code&gt;Bash&lt;/code&gt;工具就需要通过&lt;code&gt;WSL&lt;/code&gt;在Linux子系统中使用；&lt;/p&gt;
&lt;p&gt;但&lt;code&gt;Git Bash&lt;/code&gt;随着&lt;code&gt;Git&lt;/code&gt;安装也会被安装，这就很好的为&lt;code&gt;Agent&lt;/code&gt;提供了良好的命令行&lt;code&gt;Shell&lt;/code&gt;环境，这也是&lt;code&gt;ClaudeCode&lt;/code&gt;官方文档中推荐安装的原因。&lt;/p&gt;
</content:encoded></item><item><title>Windows Defender 卸载程序 | Bluetooth Audio Receiver</title><link>https://blog.srprolin.top/posts/2026-05-07-windows-defender-%E5%8D%B8%E8%BD%BD%E7%A8%8B%E5%BA%8F-bluetooth-audio-receiver/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-05-07-windows-defender-%E5%8D%B8%E8%BD%BD%E7%A8%8B%E5%BA%8F-bluetooth-audio-receiver/</guid><description>安利两款Windows软件，用于卸载Windows自带的杀毒软件、将PC作为蓝牙声音接收设备收听移动设备音频。</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ionuttbara/windows-defender-remover&quot;&gt;Defender Remover / Defender Disabler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.microsoft.com/detail/9n9wclwdqs5j&quot;&gt;Bluetooth Audio Receiver&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Defender Remover&lt;/h1&gt;
&lt;p&gt;前往GitHub的release页下载对应版本的程序，随后以管理员方式运行即可。&lt;/p&gt;
&lt;h1&gt;Bluetooth Audio Receiver&lt;/h1&gt;
&lt;p&gt;打开PC的蓝牙和手机蓝牙，在手机端连接PC即可；&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/snipaste_2026-05-08_00-02-13.B7FpYzAf_1hFSqC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后点击这里的设备，再点击&lt;code&gt;Open Connection&lt;/code&gt;即可获取手机音频；&lt;/p&gt;
&lt;p&gt;如果仍无声音，尝试切换一下PC的音频设备，一般就会恢复连接。&lt;/p&gt;
</content:encoded></item><item><title>树莓派Pico2W实现无线DualSense手柄(PS5)的满血功能 | Raspberry Pi | Play Station5</title><link>https://blog.srprolin.top/posts/2026-04-22-ps-ds5/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-04-22-ps-ds5/</guid><description>记录一下使用树莓派Pico2W实现DualSense手柄的仿满血无线(模拟有线连接)</description><pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;将 Pico2W 变成 DS5 手柄的无线适配器&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/awalol/DS5Dongle&quot;&gt;DS5Dongle-项目地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://controller.dl.playstation.net/controller/lang/cs/2100004.html&quot;&gt;PlayStation®Accessories&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;使用简述&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;准备一根&lt;code&gt;USB A to C&lt;/code&gt;的连接线&lt;/li&gt;
&lt;li&gt;按住Pico2W的按钮，连接到PC电脑上，再松开按钮&lt;/li&gt;
&lt;li&gt;打开识别到的新磁盘，存储空间大概在125MB左右&lt;/li&gt;
&lt;li&gt;将项目中的&lt;code&gt;.uf2&lt;/code&gt;文件拖入磁盘&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;等待磁盘消失后即为刷写成功&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;手柄连接&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;建议关掉连接过DualSense手柄设备的蓝牙开关&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下载 &lt;a href=&quot;https://controller.dl.playstation.net/controller/lang/cs/2100004.html&quot;&gt;PlayStation®Accessories&lt;/a&gt; ，并打开该程序。&lt;/p&gt;
&lt;p&gt;同时按住DualSense手柄的 &lt;strong&gt;创建键&lt;/strong&gt;(左上按钮) 和 &lt;strong&gt;Home键&lt;/strong&gt;(中心PS-logo)，等待设备指示灯进入闪烁状态，即可进入配对状态；&lt;/p&gt;
&lt;p&gt;观察Pico2W的指示灯是否亮起，如果未亮起，请保持DualSense手柄在配对状态时，重新插拔Pico2W，直至指示灯亮起，此时PlayStation®Accessories程序中应该会显示设备，连接成功。&lt;/p&gt;
&lt;h1&gt;关于&lt;/h1&gt;
&lt;p&gt;该项目截至&lt;code&gt;2026-04-22&lt;/code&gt;,仅支持手柄设备的操作信号传输，无法支持DualSense原生扬声器、麦克风等功能。&lt;/p&gt;
</content:encoded></item><item><title>使用Docker部署Umami统计服务 | Nginx | PostgreSQL</title><link>https://blog.srprolin.top/posts/umami-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/umami-1/</guid><description>一个使用docker在Debian13服务器上搭建Umami统计服务的部署记录。</description><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://umami.is/&quot;&gt;Umami官网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Docker-Compose配置&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 创建应用目录
cd ~
mkdir umami


# 编辑docker-compose.yml（参考下文配置）
# 请将&amp;lt;yourpassword&amp;gt;和&amp;lt;yourhashsalt&amp;gt;更改
nano ~/umami/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置内容参考如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.9&apos;
services:
  postgres:
    image: postgres:17-alpine
    container_name: umami-postgres
    restart: always
    environment:
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: &amp;lt;yourpassword&amp;gt;
      POSTGRES_DB: umami_db
    volumes:
      - ./postgres-data:/var/lib/postgresql/data
    ports:
      - &quot;5432:5432&quot;
    networks:
      - umami-network
    healthcheck:
      test: [&quot;CMD-SHELL&quot;, &quot;pg_isready -U umami -d umami_db&quot;]
      interval: 5s
      timeout: 5s
      retries: 5
  umami:
    image: docker.umami.is/umami-software/umami:latest
    container_name: umami
    restart: always
    environment:
      DATABASE_URL: postgresql://umami:&amp;lt;yourpassword&amp;gt;@postgres:5432/umami_db
      DATABASE_TYPE: postgresql
      HASH_SALT: &amp;lt;yourhashsalt&amp;gt;
    ports:
      - &quot;3001:3000&quot;
    networks:
      - umami-network
    depends_on:
      postgres:
        condition: service_healthy
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;10m&quot;
        max-file: &quot;3&quot;
networks:
  umami-network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后启动容器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 可以先拉取所需的两个镜像
sudo docker pull postgres:17-alpine
sudo docker pull docker.umami.is/umami-software/umami:latest

# 拉取成功后启动容器
cd ~/umami
sudo docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;PostgreSQL数据库备份与恢复&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 备份数据库
docker exec -t &amp;lt;容器名umami-postgres&amp;gt; pg_dump -U &amp;lt;用户名umami&amp;gt; -c &amp;lt;数据库名umami_db&amp;gt; &amp;gt; ~/backup.sql

# 恢复数据库
cat ~/backup.sql | docker exec -i &amp;lt;容器名umami-postgres&amp;gt; psql -U &amp;lt;用户名umami&amp;gt; &amp;lt;数据库名umami_db&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Nginx+Certbot配置&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 安装启动Nginx、Certbot
apt-get update &amp;amp;&amp;amp; apt-get install -y nginx
systemctl enable nginx &amp;amp;&amp;amp; systemctl start nginx
apt-get install -y certbot
apt-get install -y python3-certbot-nginx

# 申请SSL证书
# 将&amp;lt;your-domain&amp;gt;改为已在DNS处解析过的域名
sudo certbot certonly --nginx -d &amp;lt;your-domain&amp;gt;

# 编辑Nginx配置文件（参考下文）
nano /etc/nginx/sites-available/default

# 启用软链接
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

# 测试文件格式
nginx -t

# 重载Nginx服务
systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置文件内容参考：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ==================== Umami - HTTP ====================
server {
    listen 80;
    server_name &amp;lt;your-domain&amp;gt;;


    # HTTP自动跳转HTTPS
    return 301 https://$host$request_uri;
}


# ==================== Umami - HTTPS ====================
server {
    listen 443 ssl http2;
    server_name &amp;lt;your-domain&amp;gt;;


    ssl_certificate /etc/letsencrypt/live/&amp;lt;your-domain&amp;gt;/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/&amp;lt;your-domain&amp;gt;/privkey.pem;


    location / {
        proxy_pass http://127.0.0.1:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认账号密码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Username: &lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Password: &lt;code&gt;umami&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;上述方法建立在长期使用，且有域名的前提下，此方法不需要开放云服务器厂商处的端口。&lt;/li&gt;
&lt;li&gt;当然你可以使用宝塔、1Panel等服务器面板管理应用，一键安装配置。&lt;/li&gt;
&lt;li&gt;如果你只是测试，可以不进行Nginx配置，只在docker容器跑通后，开放云服务器厂商的3001TCP端口，即可通过http://ip:3001访问Umami后台。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Docker部署自建Bitwarden密码管理器 | Nginx</title><link>https://blog.srprolin.top/posts/2026-04-18-bitwarden-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-04-18-bitwarden-1/</guid><description>一个使用docker在Debian13服务器上搭建私人Bitwarden的部署记录。</description><pubDate>Sat, 18 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bitwarden.com/&quot;&gt;Bitwarden官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/dani-garcia/vaultwarden&quot;&gt;VaultWarden项目&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bitwarden是有商业化服务的，理论上你可以付费享用官方提供的密码托管服务；VaultWarden是基于Bitwarden可自托管特性，开源的一个密码托管服务，在后续的手机APP、浏览器拓展里，均需访问&lt;strong&gt;自托管&lt;/strong&gt;站点来链接到自建Vaultwarden密码库。&lt;/p&gt;
&lt;h1&gt;Docker-Compose配置&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 进入用户目录，新建应用目录
cd ~
mkdir bitwarden

# 编辑compose文件(参考下文)
nano ~/bitwarden/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件内容参考:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.9&apos;
services:
    srprolin:
        image: &apos;vaultwarden/server:1.35.4&apos;
        ports:
            - &apos;3012:3012&apos;
            - &apos;8080:80&apos;
        restart: unless-stopped
        volumes:
            - &apos;/vw-data/:/data/&apos;
        container_name: vaultwarden
        environment:
            - WEBSOCKET_ENABLED=true
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;你可以提前使用&lt;code&gt;docker pull&lt;/code&gt;来拉取镜像。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;随后，执行启动命令即可跑通该容器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入应用目录
cd ~/bitwarden

# 启动容器
sudo docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Nginx+Certbot配置&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 安装certbot
apt-get install -y certbot
apt-get install -y python3-certbot-nginx

# 申请Let&apos;s Encrypt的免费SSL证书
# 将&amp;lt;your-domain&amp;gt;改为已在DNS处解析过的域名
sudo certbot certonly --nginx -d &amp;lt;your-domain&amp;gt;

# 安装启动Nginx
apt-get update &amp;amp;&amp;amp; apt-get install -y nginx
systemctl enable nginx &amp;amp;&amp;amp; systemctl start nginx

# 编辑配置文件（参考下文）
nano /etc/nginx/sites-available/default

# 启用软链接
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

# 测试文件格式
nginx -t

# 重载Nginx服务
systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置文件内容参考：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ==================== Bitwarden - HTTP ====================
server {
    listen 80;
    server_name &amp;lt;your-domain&amp;gt;;

    # HTTP自动跳转HTTPS
    return 301 https://$host$request_uri;
}

# ==================== Bitwarden - HTTPS ====================
server {
    listen 443 ssl http2;
    server_name &amp;lt;your-domain&amp;gt;;

    ssl_certificate /etc/letsencrypt/live/&amp;lt;your-domain&amp;gt;/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/&amp;lt;your-domain&amp;gt;/privkey.pem;

    location /notifications/hub {
        proxy_pass http://172.17.0.1:3012;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }

    location / {
        proxy_pass http://172.17.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection &quot;upgrade&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;上述方法建立在长期使用，且有域名的前提下，此方法不需要开放云服务器厂商处的端口。&lt;/li&gt;
&lt;li&gt;当然你可以使用宝塔、1Panel等服务器面板管理应用，一键安装配置Bitwarden&lt;/li&gt;
&lt;li&gt;如果你只是测试，可以不进行Nginx配置，只在docker容器跑通后，开放云服务器厂商的8080TCP端口，即可通过&lt;code&gt;http://ip:8080&lt;/code&gt;访问vaultwarden后台。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>使用Spire.Doc将代码块插入Word文档中  | Python </title><link>https://blog.srprolin.top/posts/2026-04-16-srp-scripts-2/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-04-16-srp-scripts-2/</guid><description>一个PyPI包，功能是将代码格式、高亮保留，并以RTL布局写入Word文档中，有效解决在Word报告中粘贴代码块不规范问题。</description><pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html&quot;&gt;Spire.Doc ── PyPI工具包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;脚本说明&lt;/h1&gt;
&lt;h2&gt;功能特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;扫描脚本所在目录下的代码文件（自动排除脚本自身，不会递归子目录）&lt;/li&gt;
&lt;li&gt;自动识别文件语言并应用语法高亮&lt;/li&gt;
&lt;li&gt;输出为 &lt;code&gt;.docx&lt;/code&gt; Word 文档&lt;/li&gt;
&lt;li&gt;统一使用 &lt;code&gt;Consolas&lt;/code&gt; 等宽字体&lt;/li&gt;
&lt;li&gt;默认字号约为 &lt;code&gt;10.5pt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;批量处理多个文件，逐个输出成功或失败结果&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;依赖要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Python 3.10+&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pygments&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spire.doc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install pygments spire.doc
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;当前支持的代码文件类型&lt;/h2&gt;
&lt;p&gt;脚本当前会处理以下扩展名：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.m&lt;/code&gt;、&lt;code&gt;.py&lt;/code&gt;、&lt;code&gt;.c&lt;/code&gt;、&lt;code&gt;.cpp&lt;/code&gt;、&lt;code&gt;.java&lt;/code&gt;、&lt;code&gt;.cs&lt;/code&gt;、&lt;code&gt;.js、&lt;/code&gt;.ts&lt;code&gt;、&lt;/code&gt;.go&lt;code&gt;、&lt;/code&gt;.rs`&lt;/p&gt;
&lt;p&gt;如果文件扩展名无法被 &lt;code&gt;Pygments&lt;/code&gt; 正确识别，脚本会回退到 &lt;code&gt;MatlabLexer&lt;/code&gt; 进行高亮处理。&lt;/p&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;h3&gt;1. 准备代码文件&lt;/h3&gt;
&lt;p&gt;将需要转换的代码文件和 &lt;code&gt;gen_word.py&lt;/code&gt; 放在同一个目录下。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;code-to-word/
├── gen_word.py
├── main.py
├── utils.cpp
└── test.m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 运行脚本&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;code-to-word&lt;/code&gt; 目录中执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python gen_word.py
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 查看输出结果&lt;/h3&gt;
&lt;p&gt;脚本会在当前目录下生成同名的 &lt;code&gt;.docx&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main.py    -&amp;gt; main.docx
utils.cpp  -&amp;gt; utils.docx
test.m     -&amp;gt; test.docx
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;脚本内容&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;
&quot;&quot;&quot;
批量将代码文件转为带语法高亮的 Word 文档
依赖安装: pip install pygments spire.doc
&quot;&quot;&quot;

import os
from pygments import highlight
from pygments.lexers import MatlabLexer, get_lexer_for_filename
from pygments.formatters import RtfFormatter
from spire.doc import Document, FileFormat


CODE_DIR = os.path.dirname(os.path.abspath(__file__))
FONT_SIZE = r&quot;\fs21&quot;  # 10.5pt ≈ fs21


def code_to_rtf(code: str, lexer) -&amp;gt; str:
    &quot;&quot;&quot;将代码转为 RTF 格式（带语法高亮）&quot;&quot;&quot;
    formatter = RtfFormatter(fontface=&quot;Consolas&quot;)
    rtf_text = highlight(code, lexer, formatter)
    # 设置字体大小
    rtf_text = rtf_text.replace(r&quot;\f0&quot;, r&quot;\f0&quot; + FONT_SIZE)
    return rtf_text


def process_file(filepath: str) -&amp;gt; None:
    &quot;&quot;&quot;将单个代码文件转为 Word 文档&quot;&quot;&quot;
    basename = os.path.basename(filepath)
    filename_no_ext = os.path.splitext(basename)[0]
    output_path = os.path.join(CODE_DIR, filename_no_ext + &quot;.docx&quot;)

    # 读取代码
    with open(filepath, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:
        code = f.read()

    # 自动识别语言
    try:
        lexer = get_lexer_for_filename(basename)
    except Exception:
        lexer = MatlabLexer()

    # 转为 RTF
    rtf_text = code_to_rtf(code, lexer)

    # 生成 Word 文档（新建空文档，不加载源文件）
    doc = Document()
    section = doc.AddSection()
    para = section.AddParagraph()
    para.AppendRTF(rtf_text)
    doc.SaveToFile(output_path, FileFormat.Docx2016)
    doc.Close()

    print(f&quot;[OK] {basename} -&amp;gt; {filename_no_ext}.docx&quot;)


def main():
    # 支持的代码文件扩展名
    extensions = {&quot;.m&quot;, &quot;.py&quot;, &quot;.c&quot;, &quot;.cpp&quot;, &quot;.java&quot;, &quot;.cs&quot;, &quot;.js&quot;, &quot;.ts&quot;, &quot;.go&quot;, &quot;.rs&quot;}
    # 排除自身
    self_name = os.path.basename(os.path.abspath(__file__))

    files = [
        f for f in os.listdir(CODE_DIR)
        if os.path.isfile(os.path.join(CODE_DIR, f))
        and f != self_name
        and os.path.splitext(f)[1].lower() in extensions
    ]

    if not files:
        print(&quot;未找到代码文件&quot;)
        return

    print(f&quot;找到 {len(files)} 个代码文件，开始转换...\n&quot;)

    for f in sorted(files):
        filepath = os.path.join(CODE_DIR, f)
        try:
            process_file(filepath)
        except Exception as e:
            print(f&quot;[FAIL] {f}: {e}&quot;)

    print(f&quot;\n完成！文件保存在: {CODE_DIR}&quot;)


if __name__ == &quot;__main__&quot;:
    main()
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;个人脚本仓库&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;RolinShmily/SrP-Scripts&quot;}&lt;/p&gt;
&lt;p&gt;如果觉得有用，欢迎给个 Star！如果有问题或建议，欢迎提 Issue 或 PR。&lt;/p&gt;
</content:encoded></item><item><title>使用yt-dlp下载互联网上的任何音视频 | FFmpeg | Python</title><link>https://blog.srprolin.top/posts/2026-04-16-yt-dlp/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-04-16-yt-dlp/</guid><description>基于pip中的yt-dlp工具包打造的快速获取音频(AAC编码m4a)、视频(H.264编码mp4)脚本。</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yt-dlp/yt-dlp&quot;&gt;yt-dlp&lt;/a&gt; — 视频下载核心（上游仓库）&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ffmpeg.org/&quot;&gt;ffmpeg&lt;/a&gt; — 视频合并与转码&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;yt-dlp 实用工具集&lt;/h1&gt;
&lt;p&gt;基于 &lt;a href=&quot;https://github.com/yt-dlp/yt-dlp&quot;&gt;yt-dlp&lt;/a&gt; 封装的 Python 脚本工具集，提供一键下载、自动转码功能。&lt;/p&gt;
&lt;h1&gt;脚本说明&lt;/h1&gt;
&lt;h2&gt;依赖&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;FFmpeg&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装 yt-dlp 完整版：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pip install &quot;yt-dlp[default]&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;quick_grab.py — 快速获取视频&lt;/h2&gt;
&lt;p&gt;下载任意网站视频，自动确保输出为 H.264 + AAC 的 MP4 文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;特性：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动检测并使用 GPU 硬件加速（NVIDIA NVENC / AMD AMF / Intel QSV），无 GPU 回退 CPU&lt;/li&gt;
&lt;li&gt;探测源视频码率，按源码率匹配目标画质，避免转码后文件暴涨&lt;/li&gt;
&lt;li&gt;支持断点续传，网络中断后重新运行可从上次位置继续&lt;/li&gt;
&lt;li&gt;内置失败重试（10 次重试 + 指数退避）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;基本用法：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载最高画质（自动转码为 H.264 MP4）
python quick_grab.py &quot;https://www.youtube.com/watch?v=VIDEO_ID&quot;

# 指定输出目录
python quick_grab.py &quot;URL&quot; -d D:/Downloads

# 下载 720P
python quick_grab.py &quot;URL&quot; -q 720

# 仅下载音频
python quick_grab.py &quot;URL&quot; --audio

# 下载中英字幕
python quick_grab.py &quot;URL&quot; --subtitle

# 下载整个播放列表
python quick_grab.py &quot;URL&quot; --playlist

# 自定义编码质量（CRF 越小质量越高，默认 23）
python quick_grab.py &quot;URL&quot; --crf 18 --preset slow

# 强制使用 CPU 编码（禁用 GPU 加速）
python quick_grab.py &quot;URL&quot; --no-gpu

# 指定输出文件名
python quick_grab.py &quot;URL&quot; -o &quot;my_video.mp4&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;转码流程：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;yt-dlp 下载视频（自动合并视频+音频流）&lt;/li&gt;
&lt;li&gt;ffprobe 检测编码格式&lt;/li&gt;
&lt;li&gt;如果已经是 H.264 + AAC + MP4 → 跳过（无需转码）&lt;/li&gt;
&lt;li&gt;如果编码正确但容器非 MP4 → 仅 remux（无损，极快）&lt;/li&gt;
&lt;li&gt;如果需要转码 → 自动探测源码率，按源码率匹配目标画质：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NVENC&lt;/strong&gt;：&lt;code&gt;-rc vbr -cq -b:v {源码率}k -maxrate {源码率}k&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMF/QSV&lt;/strong&gt;：类似 VBR 码率控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;：高码率用 &lt;code&gt;-b:v&lt;/code&gt; 码率模式，低/未知码率用 &lt;code&gt;-crf&lt;/code&gt; 质量模式&lt;/li&gt;
&lt;li&gt;低码率（&amp;lt; 2000k）自动降低 CRF 至 20 以保画质&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;quick_audio.py — 快速获取音频&lt;/h2&gt;
&lt;p&gt;下载任意网站音频，转为 AAC 编码的 M4A 文件，兼容 iPhone / Android / Windows / Mac / 车载等所有主流播放器。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本用法：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载音频，输出 AAC/M4A (192kbps)
python quick_audio.py &quot;https://www.youtube.com/watch?v=VIDEO_ID&quot;

# 指定输出目录
python quick_audio.py &quot;URL&quot; -d D:/Downloads

# 320kbps 高音质
python quick_audio.py &quot;URL&quot; -b 320

# 输出 MP3 格式（兼容极老旧设备）
python quick_audio.py &quot;URL&quot; --mp3

# 下载整个播放列表的音频
python quick_audio.py &quot;URL&quot; --playlist
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;脚本内容&lt;/h1&gt;
&lt;h2&gt;quick_grab.py&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&quot;&quot;&quot;
快速获取 - 使用 yt-dlp 下载任意网站视频，确保输出 H.264 + AAC MP4

ffmpeg 调用链:
  1. yt-dlp 内部调用 ffmpeg 合并分离的视频/音频流 (自动, -c copy)
  2. 脚本调用 ffprobe 检测编码格式
  3. 自动检测 GPU (NVIDIA NVENC), 优先使用硬件加速转码
  4. 如需转码, 有 GPU 时用 h264_nvenc, 无 GPU 时用 libx264 + aac
  5. 如编码已正确但容器非 mp4, 仅做 remux (-c copy 到 mp4 容器)

用法:
    python quick_grab.py &amp;lt;URL&amp;gt;
    python quick_grab.py &amp;lt;URL&amp;gt; -d D:/Downloads
    python quick_grab.py &amp;lt;URL&amp;gt; --audio
    python quick_grab.py &amp;lt;URL&amp;gt; -q 720
    python quick_grab.py &amp;lt;URL&amp;gt; --crf 18 --preset slow   # 高质量转码
&quot;&quot;&quot;

import argparse
import io
import os
import subprocess
import sys

# Fix Windows console encoding
if sys.platform == &quot;win32&quot;:
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;)
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;)


# ---------------------------------------------------------------------------
# ffmpeg / ffprobe helpers
# ---------------------------------------------------------------------------

def probe_codecs(filepath: str) -&amp;gt; tuple[str, str]:
    &quot;&quot;&quot;用 ffprobe 检测视频和音频编码格式&quot;&quot;&quot;
    result = subprocess.run(
        [&quot;ffprobe&quot;, &quot;-v&quot;, &quot;error&quot;,
         &quot;-show_entries&quot;, &quot;stream=codec_type,codec_name&quot;,
         &quot;-of&quot;, &quot;csv=p=0&quot;, filepath],
        capture_output=True, text=True, timeout=10,
        encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;,
    )
    vcodec = acodec = &quot;none&quot;
    for line in result.stdout.strip().split(&quot;\n&quot;):
        # ffprobe csv=p=0 输出格式: codec_name,codec_type (如 &quot;h264,video&quot;)
        parts = line.strip().split(&quot;,&quot;)
        if len(parts) == 2:
            cname, ctype = parts
            if ctype == &quot;video&quot;:
                vcodec = cname
            elif ctype == &quot;audio&quot;:
                acodec = cname
    return vcodec, acodec


def remux_to_mp4(input_path: str) -&amp;gt; bool:
    &quot;&quot;&quot;仅更换容器为 mp4 (不重新编码, 极快)&quot;&quot;&quot;
    output_path = os.path.splitext(input_path)[0] + &quot;.mp4&quot;
    if input_path == output_path:
        return True
    cmd = [
        &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
        &quot;-c&quot;, &quot;copy&quot;, &quot;-movflags&quot;, &quot;+faststart&quot;,
        &quot;-y&quot;, output_path,
    ]
    result = subprocess.run(cmd)
    if result.returncode == 0 and os.path.isfile(output_path):
        os.remove(input_path)
        return True
    if os.path.isfile(output_path):
        os.remove(output_path)
    return False


def _detect_nvenc() -&amp;gt; bool:
    &quot;&quot;&quot;检测 ffmpeg 是否支持 NVIDIA NVENC 硬件编码&quot;&quot;&quot;
    try:
        result = subprocess.run(
            [&quot;ffmpeg&quot;, &quot;-hide_banner&quot;, &quot;-encoders&quot;],
            capture_output=True, text=True, timeout=10,
            encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;,
        )
        return &quot;h264_nvenc&quot; in result.stdout
    except (FileNotFoundError, subprocess.TimeoutExpired):
        return False


def _detect_hardware_encoder() -&amp;gt; str:
    &quot;&quot;&quot;检测可用的硬件编码器, 返回编码器名称 (h264_nvenc / h264_amf / h264_qsv / libx264)&quot;&quot;&quot;
    try:
        result = subprocess.run(
            [&quot;ffmpeg&quot;, &quot;-hide_banner&quot;, &quot;-encoders&quot;],
            capture_output=True, text=True, timeout=10,
            encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;,
        )
        for enc in (&quot;h264_nvenc&quot;, &quot;h264_amf&quot;, &quot;h264_qsv&quot;):
            if enc in result.stdout:
                return enc
    except (FileNotFoundError, subprocess.TimeoutExpired):
        pass
    return &quot;libx264&quot;


def _probe_source_bitrate(filepath: str) -&amp;gt; int:
    &quot;&quot;&quot;获取源视频流码率 (kbps), 获取失败返回 0&quot;&quot;&quot;
    # 优先从流信息获取
    try:
        result = subprocess.run(
            [&quot;ffprobe&quot;, &quot;-v&quot;, &quot;error&quot;,
             &quot;-select_streams&quot;, &quot;v:0&quot;,
             &quot;-show_entries&quot;, &quot;stream=bit_rate&quot;,
             &quot;-of&quot;, &quot;csv=p=0&quot;, filepath],
            capture_output=True, text=True, timeout=10,
            encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;,
        )
        br = result.stdout.strip()
        if br and br not in (&quot;N/A&quot;, &quot;&quot;):
            return int(br) // 1000  # bps → kbps
    except (FileNotFoundError, subprocess.TimeoutExpired, ValueError):
        pass
    # 回退: 从文件大小 × 时长估算
    try:
        result = subprocess.run(
            [&quot;ffprobe&quot;, &quot;-v&quot;, &quot;error&quot;,
             &quot;-show_entries&quot;, &quot;format=duration&quot;,
             &quot;-of&quot;, &quot;csv=p=0&quot;, filepath],
            capture_output=True, text=True, timeout=10,
            encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;,
        )
        duration = float(result.stdout.strip())
        file_size = os.path.getsize(filepath)
        return int(file_size * 8 / duration * 0.85 / 1000)  # 视频约占85%
    except (FileNotFoundError, subprocess.TimeoutExpired, ValueError, OSError):
        return 0


def transcode(input_path: str, crf: int = 23, preset: str = &quot;medium&quot;,
              use_gpu: bool = True) -&amp;gt; bool:
    &quot;&quot;&quot;转码为 H.264 + AAC MP4 (参考源码率匹配画质, 优先硬件加速)&quot;&quot;&quot;
    base, ext = os.path.splitext(input_path)
    output_path = base + &quot;_h264_tmp.mp4&quot;

    # 探测源视频码率
    source_kbps = _probe_source_bitrate(input_path)
    # CRF 根据源码率调整: 低码率用更高质量
    crf_value = 20 if 0 &amp;lt; source_kbps &amp;lt; 2000 else crf
    # 缓冲区 = 码率 × 2
    buf_kbps = source_kbps * 2 if source_kbps &amp;gt; 0 else 0

    # 选择编码器
    encoder = _detect_hardware_encoder() if use_gpu else &quot;libx264&quot;

    # --- NVENC ---
    if encoder == &quot;h264_nvenc&quot;:
        _preset_map = {
            &quot;ultrafast&quot;: &quot;p1&quot;, &quot;superfast&quot;: &quot;p1&quot;, &quot;veryfast&quot;: &quot;p2&quot;,
            &quot;faster&quot;: &quot;p3&quot;, &quot;fast&quot;: &quot;p4&quot;, &quot;medium&quot;: &quot;p4&quot;,
            &quot;slow&quot;: &quot;p5&quot;, &quot;slower&quot;: &quot;p7&quot;, &quot;veryslow&quot;: &quot;p7&quot;,
        }
        nvenc_preset = _preset_map.get(preset, &quot;p4&quot;)
        if source_kbps &amp;gt; 0:
            print(f&quot;    [GPU/NVENC] 源码率: {source_kbps}k | 目标: {source_kbps}k | cq={crf_value} | preset={nvenc_preset}&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;h264_nvenc&quot;, &quot;-preset&quot;, nvenc_preset,
                &quot;-rc&quot;, &quot;vbr&quot;, &quot;-cq&quot;, str(crf_value),
                &quot;-b:v&quot;, f&quot;{source_kbps}k&quot;, &quot;-maxrate&quot;, f&quot;{source_kbps}k&quot;, &quot;-bufsize&quot;, f&quot;{buf_kbps}k&quot;,
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]
        else:
            print(f&quot;    [GPU/NVENC] 未知源码率 | cq={crf_value} | preset={nvenc_preset}&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;h264_nvenc&quot;, &quot;-preset&quot;, nvenc_preset,
                &quot;-rc&quot;, &quot;vbr&quot;, &quot;-cq&quot;, str(crf_value),
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]

    # --- AMD AMF ---
    elif encoder == &quot;h264_amf&quot;:
        if source_kbps &amp;gt; 0:
            print(f&quot;    [GPU/AMF] 源码率: {source_kbps}k | 目标: {source_kbps}k&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;h264_amf&quot;, &quot;-quality&quot;, &quot;speed&quot;, &quot;-rc&quot;, &quot;vbr&quot;,
                &quot;-b:v&quot;, f&quot;{source_kbps}k&quot;, &quot;-maxrate&quot;, f&quot;{source_kbps}k&quot;, &quot;-bufsize&quot;, f&quot;{buf_kbps}k&quot;,
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]
        else:
            print(f&quot;    [GPU/AMF] 未知源码率&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;h264_amf&quot;, &quot;-quality&quot;, &quot;speed&quot;, &quot;-rc&quot;, &quot;vbr&quot;,
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]

    # --- Intel QSV ---
    elif encoder == &quot;h264_qsv&quot;:
        if source_kbps &amp;gt; 0:
            print(f&quot;    [GPU/QSV] 源码率: {source_kbps}k | 目标: {source_kbps}k | quality={crf_value}&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;h264_qsv&quot;, &quot;-preset&quot;, &quot;medium&quot;,
                &quot;-b:v&quot;, f&quot;{source_kbps}k&quot;, &quot;-maxrate&quot;, f&quot;{source_kbps}k&quot;, &quot;-bufsize&quot;, f&quot;{buf_kbps}k&quot;,
                &quot;-global_quality&quot;, str(crf_value),
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]
        else:
            print(f&quot;    [GPU/QSV] 未知源码率 | quality={crf_value}&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;h264_qsv&quot;, &quot;-preset&quot;, &quot;medium&quot;,
                &quot;-global_quality&quot;, str(crf_value),
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]

    # --- CPU libx264 ---
    else:
        if source_kbps &amp;gt; 0 and source_kbps &amp;gt;= 2000:
            print(f&quot;    [CPU/x264] 源码率: {source_kbps}k | 目标: {source_kbps}k | preset={preset}&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;libx264&quot;, &quot;-preset&quot;, preset,
                &quot;-b:v&quot;, f&quot;{source_kbps}k&quot;, &quot;-maxrate&quot;, f&quot;{source_kbps}k&quot;, &quot;-bufsize&quot;, f&quot;{buf_kbps}k&quot;,
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]
        else:
            print(f&quot;    [CPU/x264] 未知/低码率 | crf={crf_value} | preset={preset}&quot;)
            cmd = [
                &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
                &quot;-c:v&quot;, &quot;libx264&quot;, &quot;-preset&quot;, preset, &quot;-crf&quot;, str(crf_value),
                &quot;-c:a&quot;, &quot;aac&quot;, &quot;-b:a&quot;, &quot;192k&quot;,
                &quot;-movflags&quot;, &quot;+faststart&quot;, &quot;-y&quot;, output_path,
            ]

    result = subprocess.run(cmd)

    if result.returncode == 0 and os.path.isfile(output_path):
        os.replace(output_path, base + &quot;.mp4&quot;)
        # 清理原始文件 (如果扩展名不同)
        original = input_path
        if os.path.isfile(original) and original != base + &quot;.mp4&quot;:
            os.remove(original)
        return True

    if os.path.isfile(output_path):
        os.remove(output_path)
    return False


# ---------------------------------------------------------------------------
# yt-dlp helpers
# ---------------------------------------------------------------------------

def _progress_hook(d: dict):
    &quot;&quot;&quot;yt-dlp 下载进度回调&quot;&quot;&quot;
    if d[&quot;status&quot;] == &quot;downloading&quot;:
        pct = d.get(&quot;_percent_str&quot;, &quot;?&quot;)
        spd = d.get(&quot;_speed_str&quot;, &quot;?&quot;)
        eta = d.get(&quot;_eta_str&quot;, &quot;?&quot;)
        print(f&quot;\r  下载中: {pct} | 速度: {spd} | 剩余: {eta}&quot;, end=&quot;&quot;, flush=True)
    elif d[&quot;status&quot;] == &quot;finished&quot;:
        print(&quot;\n  下载完成，正在合并...&quot;)


def _find_output_file(ydl, info: dict) -&amp;gt; str | None:
    &quot;&quot;&quot;根据 yt-dlp info 定位实际输出文件&quot;&quot;&quot;
    expected = ydl.prepare_filename(info)
    if os.path.isfile(expected):
        return expected
    # 合并后扩展名可能变为 mp4
    base, _ = os.path.splitext(expected)
    for ext in (&quot;.mp4&quot;, &quot;.mkv&quot;, &quot;.webm&quot;, &quot;.ts&quot;):
        if os.path.isfile(base + ext):
            return base + ext
    return None


# ---------------------------------------------------------------------------
# 主流程
# ---------------------------------------------------------------------------

def grab(url: str, output_dir: str = &quot;.&quot;, output_name: str | None = None,
         audio_only: bool = False, quality: int | None = None,
         playlist: bool = False, subtitle: bool = False,
         crf: int = 23, preset: str = &quot;medium&quot;, use_gpu: bool = True) -&amp;gt; int:
    &quot;&quot;&quot;下载视频并确保 H.264 + AAC MP4 输出&quot;&quot;&quot;
    try:
        import yt_dlp
    except ImportError:
        print(&quot;错误: 未安装 yt-dlp，请先执行 pip install yt-dlp&quot;)
        return 1

    os.makedirs(output_dir, exist_ok=True)

    outtmpl = (os.path.join(output_dir, output_name) if output_name
               else os.path.join(output_dir, &quot;%(title)s.%(ext)s&quot;))

    ydl_opts: dict = {
        &quot;outtmpl&quot;: outtmpl,
        &quot;progress_hooks&quot;: [_progress_hook],
        # 断点续传 &amp;amp; 重试
        &quot;continuedl&quot;: True,
        &quot;retries&quot;: 10,
        &quot;fragment_retries&quot;: 10,
        &quot;file_access_retries&quot;: 10,
        &quot;retry_sleep_functions&quot;: {&quot;http&quot;: 5, &quot;fragment&quot;: 5, &quot;file_access&quot;: 3},
    }

    # 格式选择
    if audio_only:
        ydl_opts[&quot;format&quot;] = &quot;bestaudio/best&quot;
        ydl_opts[&quot;postprocessors&quot;] = [{
            &quot;key&quot;: &quot;FFmpegExtractAudio&quot;,
            &quot;preferredcodec&quot;: &quot;best&quot;,
        }]
    elif quality:
        ydl_opts[&quot;format&quot;] = (
            f&quot;bestvideo[height&amp;lt;={quality}]+bestaudio&quot;
            f&quot;/best[height&amp;lt;={quality}]/best&quot;
        )
        ydl_opts[&quot;merge_output_format&quot;] = &quot;mp4&quot;
    else:
        ydl_opts[&quot;format&quot;] = &quot;bestvideo+bestaudio/best&quot;
        ydl_opts[&quot;merge_output_format&quot;] = &quot;mp4&quot;

    if not playlist:
        ydl_opts[&quot;noplaylist&quot;] = True
    if subtitle:
        ydl_opts[&quot;writesubs&quot;] = True
        ydl_opts[&quot;writeautomaticsub&quot;] = True
        ydl_opts[&quot;subtitleslangs&quot;] = [&quot;zh&quot;, &quot;en&quot;]

    print(f&quot;\n正在获取: {url}\n&quot;)

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(url, download=True)

    if info is None:
        print(&quot;错误: 无法获取视频信息&quot;)
        return 1

    # --- 后处理: 确保 H.264 + AAC MP4 ---
    if audio_only:
        print(&quot;\n音频模式，跳过视频编码检查。&quot;)

    else:
        # 收集所有需要检查的文件
        if &quot;entries&quot; in info:
            entries = [e for e in info[&quot;entries&quot;] if e]
        else:
            entries = [info]

        print(&quot;\n[ 编码检查 ]&quot;)
        for entry in entries:
            filepath = _find_output_file(ydl, entry)
            if not filepath:
                continue

            vcodec, acodec = probe_codecs(filepath)
            name = os.path.basename(filepath)
            print(f&quot;  {name}&quot;)
            print(f&quot;    视频编码: {vcodec} | 音频编码: {acodec}&quot;)

            is_h264 = vcodec == &quot;h264&quot;
            is_aac = acodec in (&quot;aac&quot;, &quot;none&quot;)
            is_mp4 = filepath.lower().endswith(&quot;.mp4&quot;)

            if is_h264 and is_aac and is_mp4:
                print(&quot;    ✓ 已是 H.264 + AAC MP4，跳过&quot;)

            elif is_h264 and is_aac and not is_mp4:
                print(&quot;    → 编码正确，封装为 MP4...&quot;)
                if remux_to_mp4(filepath):
                    print(&quot;    ✓ 封装完成 (remux, 无损)&quot;)
                else:
                    print(&quot;    ✗ 封装失败，保留原始文件&quot;)

            else:
                print(f&quot;    → 需要转码 ({vcodec}/{acodec} → h264/aac)...&quot;)
                if transcode(filepath, crf=crf, preset=preset, use_gpu=use_gpu):
                    print(&quot;    ✓ 转码完成&quot;)
                else:
                    print(&quot;    ✗ 转码失败，保留原始文件&quot;)

    print(&quot;\n全部完成!&quot;)
    return 0


def main():
    p = argparse.ArgumentParser(
        description=&quot;快速获取 - 下载任意网站视频 (H.264 + AAC MP4)&quot;,
    )
    p.add_argument(&quot;url&quot;, help=&quot;视频 URL&quot;)
    p.add_argument(&quot;-o&quot;, &quot;--output&quot;, help=&quot;输出文件名&quot;)
    p.add_argument(&quot;-d&quot;, &quot;--output-dir&quot;, default=&quot;.&quot;, help=&quot;输出目录 (默认: 当前目录)&quot;)
    p.add_argument(&quot;-a&quot;, &quot;--audio&quot;, action=&quot;store_true&quot;, help=&quot;仅下载音频&quot;)
    p.add_argument(&quot;-q&quot;, &quot;--quality&quot;, type=int, help=&quot;最高分辨率 (如 720, 1080)&quot;)
    p.add_argument(&quot;-p&quot;, &quot;--playlist&quot;, action=&quot;store_true&quot;, help=&quot;下载整个播放列表&quot;)
    p.add_argument(&quot;-s&quot;, &quot;--subtitle&quot;, action=&quot;store_true&quot;, help=&quot;下载字幕&quot;)
    p.add_argument(&quot;--crf&quot;, type=int, default=23,
                   help=&quot;H.264 CRF 质量值 (默认: 23, 范围 0-51, 越小质量越高)&quot;)
    p.add_argument(&quot;--preset&quot;, default=&quot;medium&quot;,
                   choices=[&quot;ultrafast&quot;, &quot;superfast&quot;, &quot;veryfast&quot;, &quot;faster&quot;,
                            &quot;fast&quot;, &quot;medium&quot;, &quot;slow&quot;, &quot;slower&quot;, &quot;veryslow&quot;],
                   help=&quot;编码速度预设 (默认: medium)&quot;)
    p.add_argument(&quot;--no-gpu&quot;, action=&quot;store_true&quot;,
                   help=&quot;禁用 GPU 加速, 强制使用 CPU 软编码&quot;)

    args = p.parse_args()
    sys.exit(grab(
        url=args.url,
        output_dir=args.output_dir,
        output_name=args.output,
        audio_only=args.audio,
        quality=args.quality,
        playlist=args.playlist,
        subtitle=args.subtitle,
        crf=args.crf,
        preset=args.preset,
        use_gpu=not args.no_gpu,
    ))


if __name__ == &quot;__main__&quot;:
    main()

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;quick_audio.py&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&quot;&quot;&quot;
快速获取音频 - 使用 yt-dlp 下载任意网站音频，转为 AAC 编码的 M4A 文件

输出 M4A (AAC) — 兼容 iPhone / Android / Windows / Mac / 车载 / 所有主流播放器。
可选 --mp3 输出 MP3 格式以兼容极老旧设备。

用法:
    python quick_audio.py &amp;lt;URL&amp;gt;
    python quick_audio.py &amp;lt;URL&amp;gt; -d D:/Downloads
    python quick_audio.py &amp;lt;URL&amp;gt; -b 320       # 320kbps 高音质
    python quick_audio.py &amp;lt;URL&amp;gt; --mp3         # 输出 MP3 格式
&quot;&quot;&quot;

import argparse
import io
import os
import subprocess
import sys

# Fix Windows console encoding
if sys.platform == &quot;win32&quot;:
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;)
    sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;)


# ---------------------------------------------------------------------------
# helpers
# ---------------------------------------------------------------------------

def _progress_hook(d: dict):
    &quot;&quot;&quot;yt-dlp 下载进度回调&quot;&quot;&quot;
    if d[&quot;status&quot;] == &quot;downloading&quot;:
        pct = d.get(&quot;_percent_str&quot;, &quot;?&quot;)
        spd = d.get(&quot;_speed_str&quot;, &quot;?&quot;)
        eta = d.get(&quot;_eta_str&quot;, &quot;?&quot;)
        print(f&quot;\r  下载中: {pct} | 速度: {spd} | 剩余: {eta}&quot;, end=&quot;&quot;, flush=True)
    elif d[&quot;status&quot;] == &quot;finished&quot;:
        print(&quot;\n  下载完成，正在处理音频...&quot;)


def _find_file(ydl, info: dict) -&amp;gt; str | None:
    &quot;&quot;&quot;定位 yt-dlp 实际输出的文件&quot;&quot;&quot;
    expected = ydl.prepare_filename(info)
    if os.path.isfile(expected):
        return expected
    base, _ = os.path.splitext(expected)
    for ext in (&quot;.m4a&quot;, &quot;.mp3&quot;, &quot;.ogg&quot;, &quot;.opus&quot;, &quot;.webm&quot;, &quot;.wav&quot;, &quot;.flac&quot;, &quot;.wma&quot;, &quot;.aac&quot;):
        if os.path.isfile(base + ext):
            return base + ext
    return None


def _probe_audio_codec(filepath: str) -&amp;gt; str:
    &quot;&quot;&quot;检测音频编码格式&quot;&quot;&quot;
    result = subprocess.run(
        [&quot;ffprobe&quot;, &quot;-v&quot;, &quot;error&quot;,
         &quot;-select_streams&quot;, &quot;a:0&quot;,
         &quot;-show_entries&quot;, &quot;stream=codec_name&quot;,
         &quot;-of&quot;, &quot;csv=p=0&quot;, filepath],
        capture_output=True, text=True, timeout=10,
        encoding=&quot;utf-8&quot;, errors=&quot;replace&quot;,
    )
    return result.stdout.strip() or &quot;unknown&quot;


def _convert(input_path: str, bitrate: int = 192, output_mp3: bool = False) -&amp;gt; bool:
    &quot;&quot;&quot;转码音频为 AAC/M4A 或 MP3&quot;&quot;&quot;
    base, _ = os.path.splitext(input_path)
    target_ext = &quot;.mp3&quot; if output_mp3 else &quot;.m4a&quot;
    output_path = base + &quot;_tmp&quot; + target_ext

    if output_mp3:
        codec = &quot;libmp3lame&quot;
        quality_arg = [&quot;-b:a&quot;, f&quot;{bitrate}k&quot;]
        print(f&quot;    → 转码为 MP3 ({bitrate}kbps)...&quot;)
    else:
        codec = &quot;aac&quot;
        quality_arg = [&quot;-b:a&quot;, f&quot;{bitrate}k&quot;]
        print(f&quot;    → 转码为 AAC/M4A ({bitrate}kbps)...&quot;)

    cmd = [
        &quot;ffmpeg&quot;, &quot;-i&quot;, input_path,
        &quot;-c:a&quot;, codec, *quality_arg,
        &quot;-movflags&quot;, &quot;+faststart&quot;,
        &quot;-y&quot;, output_path,
    ]
    result = subprocess.run(cmd)

    if result.returncode == 0 and os.path.isfile(output_path):
        final_path = base + target_ext
        os.replace(output_path, final_path)
        # 清理原始文件
        if os.path.isfile(input_path) and input_path != final_path:
            os.remove(input_path)
        return True

    if os.path.isfile(output_path):
        os.remove(output_path)
    return False


# ---------------------------------------------------------------------------
# 主流程
# ---------------------------------------------------------------------------

def grab_audio(url: str, output_dir: str = &quot;.&quot;, output_name: str | None = None,
               bitrate: int = 192, playlist: bool = False,
               output_mp3: bool = False) -&amp;gt; int:
    &quot;&quot;&quot;下载音频并转为 AAC/M4A 或 MP3&quot;&quot;&quot;
    try:
        import yt_dlp
    except ImportError:
        print(&quot;错误: 未安装 yt-dlp，请先执行 pip install yt-dlp&quot;)
        return 1

    os.makedirs(output_dir, exist_ok=True)

    target_ext = &quot;.mp3&quot; if output_mp3 else &quot;.m4a&quot;
    outtmpl = (os.path.join(output_dir, output_name) if output_name
               else os.path.join(output_dir, &quot;%(title)s.%(ext)s&quot;))

    ydl_opts: dict = {
        &quot;outtmpl&quot;: outtmpl,
        &quot;format&quot;: &quot;bestaudio/best&quot;,
        &quot;progress_hooks&quot;: [_progress_hook],
        # 断点续传 &amp;amp; 重试
        &quot;continuedl&quot;: True,
        &quot;retries&quot;: 10,
        &quot;fragment_retries&quot;: 10,
        &quot;file_access_retries&quot;: 10,
        &quot;retry_sleep_functions&quot;: {&quot;http&quot;: 5, &quot;fragment&quot;: 5, &quot;file_access&quot;: 3},
    }

    if not playlist:
        ydl_opts[&quot;noplaylist&quot;] = True

    target_format = &quot;MP3&quot; if output_mp3 else &quot;AAC/M4A&quot;
    print(f&quot;\n正在获取音频 ({target_format}, {bitrate}kbps): {url}\n&quot;)

    with yt_dlp.YoutubeDL(ydl_opts) as ydl:
        info = ydl.extract_info(url, download=True)

    if info is None:
        print(&quot;错误: 无法获取音频信息&quot;)
        return 1

    # 收集条目
    if &quot;entries&quot; in info:
        entries = [e for e in info[&quot;entries&quot;] if e]
    else:
        entries = [info]

    # 目标编码
    target_codec = &quot;mp3&quot; if output_mp3 else &quot;aac&quot;

    print(f&quot;\n[ 音频检查 ]&quot;)
    for entry in entries:
        filepath = _find_file(ydl, entry)
        if not filepath:
            print(f&quot;  ⚠ 未找到文件: {entry.get(&apos;title&apos;, &apos;?&apos;)}&quot;)
            continue

        name = os.path.basename(filepath)
        codec = _probe_audio_codec(filepath)
        _, ext = os.path.splitext(filepath)
        is_target = (codec == target_codec and ext.lower() == target_ext)

        print(f&quot;  {name}&quot;)
        print(f&quot;    编码: {codec}&quot;)

        if is_target:
            print(f&quot;    ✓ 已是目标格式 ({target_codec}{target_ext})，跳过&quot;)
        else:
            _convert(filepath, bitrate=bitrate, output_mp3=output_mp3)
            print(f&quot;    ✓ 转码完成 → {target_codec}{target_ext}&quot;)

    print(&quot;\n全部完成!&quot;)
    return 0


def main():
    p = argparse.ArgumentParser(
        description=&quot;快速获取音频 - 下载任意网站音频 (AAC/M4A 或 MP3)&quot;,
    )
    p.add_argument(&quot;url&quot;, help=&quot;音频/视频 URL&quot;)
    p.add_argument(&quot;-d&quot;, &quot;--output-dir&quot;, default=&quot;.&quot;, help=&quot;输出目录 (默认: 当前目录)&quot;)
    p.add_argument(&quot;-o&quot;, &quot;--output&quot;, help=&quot;输出文件名&quot;)
    p.add_argument(&quot;-b&quot;, &quot;--bitrate&quot;, type=int, default=192,
                   help=&quot;音频码率 kbps (默认: 192, 建议: 128/192/256/320)&quot;)
    p.add_argument(&quot;-p&quot;, &quot;--playlist&quot;, action=&quot;store_true&quot;, help=&quot;下载整个播放列表&quot;)
    p.add_argument(&quot;--mp3&quot;, action=&quot;store_true&quot;,
                   help=&quot;输出 MP3 格式 (默认: AAC/M4A)&quot;)
    args = p.parse_args()

    sys.exit(grab_audio(
        url=args.url,
        output_dir=args.output_dir,
        output_name=args.output,
        bitrate=args.bitrate,
        playlist=args.playlist,
        output_mp3=args.mp3,
    ))


if __name__ == &quot;__main__&quot;:
    main()

&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;个人脚本仓库&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;RolinShmily/SrP-Scripts&quot;}&lt;/p&gt;
&lt;p&gt;如果觉得有用，欢迎给个 Star！如果有问题或建议，欢迎提 Issue 或 PR。&lt;/p&gt;
</content:encoded></item><item><title>LGnewUI-2 部署 | Docker | PHP | MySQL | Nginx | Certbot</title><link>https://blog.srprolin.top/posts/lgnewui2/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/lgnewui2/</guid><description>基于docker部署的PHP站点，使用MySQL数据库，并以Nginx作为反向代理上线。</description><pubDate>Fri, 03 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.kikiw.cn/&quot;&gt;Ki&apos;s Blog--LGnewUI作者的博客空间&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loveli.kikiw.cn/&quot;&gt;LG_Demo - 演示站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://auth-love.kikiw.cn/&quot;&gt;LGNewUi-Auth - 情侣小站在线授权系统&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本教程基于Debian13的阿里云服务器，使用Docker部署项目适配的 &lt;strong&gt;PHP7.4&lt;/strong&gt;、&lt;strong&gt;MySQL5.7&lt;/strong&gt; (其实是APT包已经不支持这两个老版本...)，并在宿主机安装 &lt;strong&gt;Nginx&lt;/strong&gt;+&lt;strong&gt;Certbot&lt;/strong&gt; 实现站点上线。&lt;/p&gt;
&lt;h1&gt;项目资源获取&lt;/h1&gt;
&lt;p&gt;LGnewUI-2采用授权下载方式，需要在 &lt;a href=&quot;https://auth-love.kikiw.cn/&quot;&gt;LGNewUi-Auth - 情侣小站在线授权系统&lt;/a&gt; 登录并经授权后，下载项目源代码。&lt;/p&gt;
&lt;h1&gt;Docker的安装配置&lt;/h1&gt;
&lt;p&gt;参考&lt;a href=&quot;https://help.aliyun.com/zh/ecs/user-guide/install-and-use-docker&quot;&gt;阿里云给出的文档&lt;/a&gt;,按序执行即可:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#删除Docker相关源
sudo rm -f /etc/apt/sources.list.d/*docker*.list
#卸载Docker和相关的软件包
for pkg in docker.io docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-compose-plugin docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y $pkg; done

#添加 GPG 密钥
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
#将该软件源添加到 Apt 源列表中。
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF
Types: deb
URIs: http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;$VERSION_CODENAME&quot;)
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
#安装Docker社区版本，容器运行时containerd.io，以及Docker构建和Compose插件
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#启动Docker
sudo systemctl start docker
#设置Docker守护进程在系统启动时自动启动
sudo systemctl enable docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置镜像源:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/docker/daemon.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docker.xuanyuan.me/&quot;&gt;轩辕镜像&lt;/a&gt; 一键配置脚本:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(wget -qO- https://xuanyuan.cloud/docker.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;镜像源配置示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;registry-mirrors&quot;: [
    &quot;https://docker.m.daocloud.io&quot;,
    &quot;https://docker.1panel.live/&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果配置后仍然无法拉取(&lt;code&gt;docker pull&lt;/code&gt;)镜像，请考虑使用科学上网工具。&lt;/p&gt;
&lt;p&gt;对于不同设备，可以使用以下命令传输离线镜像包：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 拉取镜像(设备1)
docker pull ...

# 打包镜像(设备1) | &amp;lt;path&amp;gt;/&amp;lt;name&amp;gt;.tar为自定义路径的tar文件，&amp;lt;image_name&amp;gt;为拉取的镜像名称
docker save -o &amp;lt;path&amp;gt;/&amp;lt;name&amp;gt;.tar &amp;lt;image_name&amp;gt;

# 将&amp;lt;name&amp;gt;.tar上传到服务器中，然后加载镜像(设备2--服务器)
docker load -i &amp;lt;path&amp;gt;/&amp;lt;name&amp;gt;.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;MySQL的compose配置&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 创建docker文件夹
mkdir ~/mysql57

# [2h2g3m小水管服务器] 创建 MySQL 自定义优化配置文件(参考下文给出的 low-memory.cnf)
sudo mkdir -p /data/mysql/conf
sudo nano /data/mysql/conf/low-memory.cnf

# 编辑mysql的docker-compose(参考下文给出的 docker-compose.yml)
nano ~/mysql57/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# low-memory.cnf
[mysqld]
# ===== 内存核心调优 =====
innodb_buffer_pool_size = 256M
innodb_buffer_pool_instances = 1

# ===== 连接优化 =====
max_connections = 30            
thread_cache_size = 4
table_open_cache = 64
table_definition_cache = 256

# ===== 临时表和排序 =====
tmp_table_size = 16M
max_heap_table_size = 16M
sort_buffer_size = 256K        
join_buffer_size = 256K
read_buffer_size = 128K
read_rnd_buffer_size = 128K

# ===== 日志优化 =====
innodb_log_file_size = 32M
innodb_log_buffer_size = 4M
innodb_flush_log_at_trx_commit = 2
sync_binlog = 0                 

# ===== 其他 =====
performance_schema = OFF        
innodb_flush_method = O_DIRECT
skip-name-resolve    
max_allowed_packet = 64M
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# docker-compose.yml
version: &apos;3.9&apos;
services:
    mysql:
        image: &apos;mysql:5.7.44&apos;
        volumes:
            - &apos;/data/mysql:/var/lib/mysql&apos;
            # 优化配置文件
            - &apos;/data/mysql/conf:/etc/mysql/conf.d&apos;
        environment:
            - MYSQL_DATABASE=LGnewUI2
            - MYSQL_ROOT_PASSWORD=yourpassword
        ports:
            - &apos;3306:3306&apos;
        restart: always
        container_name: mysql57
        # 内存限制(优化)
        deploy:
            resources:
                limits:
                    memory: 512M
                reservations:
                    memory: 256M
        # MySQL启动参数(优化)
        command: &amp;gt;
            --character-set-server=utf8mb4
            --collation-server=utf8mb4_general_ci
            --default-storage-engine=InnoDB
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以先拉取镜像，或者参考上一节的内容，加载离线镜像包:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 拉取镜像 (方式1)
sudo docker pull mysql:5.7.44

# 加载镜像 (方式2)
sudo docker load -i &amp;lt;path&amp;gt;/&amp;lt;name&amp;gt;.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后就可以启用容器了:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/mysql57
sudo docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;PHP-FPM的compose配置&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;笔者已将构建好的镜像 &lt;code&gt;rol1n/lgnewui2-php74-fpm:latest&lt;/code&gt; 上传至 Docker Hub
由于需要安装PHP的一些拓展和依赖，纯净的官方镜像并不能满足需求，所以需要：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;从 &lt;code&gt;Dockerfile&lt;/code&gt; 配置本地构建新镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 创建docker文件夹
mkdir ~/php74-fpm

# 拉取官方纯净镜像
sudo docker pull php:7.4-fpm

# 将SourceGuardian加密文件放进构建目录，这里以x86-64文件为例
cd ~/php74-fpm/build
wget https://raw.githubusercontent.com/BaseMax/sourceguardian-loader-linux-x86-64/refs/heads/main/ixed.7.4.lin

# 创建构建目录并编辑 Dockerfile(参考下文给出的 Dockerfile)
mkdir -p ~/php74-fpm/build  
nano ~/php74-fpm/build/Dockerfile

# [2h2g3m小水管服务器] 创建 PHP-FPM 自定义优化配置(参考下文给出的 zz-cusom.conf)
sudo mkdir -p /data/php/conf
sudo nano /data/php/conf/zz-custom.conf

# [2h2g3m小水管服务器] 创建 PHP 自定义优化 ini 配置(参考下文给出的 performance.ini)
sudo mkdir -p /data/php/php-conf
sudo nano /data/php/php-conf/performance.ini

# 编辑php-fpm的docker-compose(参考下文给出的 docker-compose.yml)
nano ~/php74-fpm/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Dockerfile
FROM php:7.4-fpm

# ===== 换阿里云apt源 =====
RUN echo &quot;deb http://mirrors.aliyun.com/debian bullseye main contrib non-free&quot; &amp;gt; /etc/apt/sources.list \
 &amp;amp;&amp;amp; echo &quot;deb http://mirrors.aliyun.com/debian-security bullseye-security main contrib non-free&quot; &amp;gt;&amp;gt; /etc/apt/sources.list

# ===== 安装系统依赖 =====
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends \
    libpng-dev libjpeg-dev libwebp-dev libzip-dev libicu-dev \
    libmagickwand-dev default-mysql-client ffmpeg \
 &amp;amp;&amp;amp; rm -rf /var/lib/apt/lists/*

# ===== PHP内置扩展 =====
RUN docker-php-ext-install pdo_mysql mysqli exif

# GD扩展（图片处理）
RUN docker-php-ext-configure gd --with-jpeg --with-webp \
 &amp;amp;&amp;amp; docker-php-ext-install gd

# Zip扩展（压缩）
RUN docker-php-ext-install zip

# Intl扩展（国际化）
RUN docker-php-ext-install intl

# ===== PECL扩展 =====
RUN pecl install imagick &amp;amp;&amp;amp; docker-php-ext-enable imagick

# ===== SourceGuardian =====
# 将 ixed.7.4.lin 放在同目录下，构建时复制进去
COPY ixed.7.4.lin /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
RUN echo &quot;extension=ixed.7.4.lin&quot; &amp;gt; /usr/local/etc/php/conf.d/ixed.ini \
 &amp;amp;&amp;amp; echo &quot;sourceguardian.enable_vm_hybrid=1&quot; &amp;gt;&amp;gt; /usr/local/etc/php/conf.d/ixed.ini

# ===== PHP基础配置 =====
RUN echo &quot;upload_max_filesize = 20M&quot; &amp;gt; /usr/local/etc/php/conf.d/custom.ini \
 &amp;amp;&amp;amp; echo &quot;post_max_size = 20M&quot; &amp;gt;&amp;gt; /usr/local/etc/php/conf.d/custom.ini

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;; zz-cusom.conf
[www]
; 进程管理 - 动态模式
pm = dynamic
pm.max_children = 8             
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 200      

; 慢日志（排查问题用）
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 3s
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;; performance.ini
; 内存限制
memory_limit = 128M              
; OPcache 优化
[opcache]
opcache.enable = 1
opcache.memory_consumption = 32        
opcache.interned_strings_buffer = 4
opcache.max_accelerated_files = 2000    
opcache.validate_timestamps = 0        
opcache.save_comments = 1
opcache.fast_shutdown = 1
; 执行时间限制
max_execution_time = 120
max_input_time = 120
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# docker-compose.yml
version: &apos;3.9&apos;
services:
    php:
        build:
            context: ./build      
            dockerfile: Dockerfile
        image: &apos;lgnewui2-php74-fpm&apos;
        ports:
            - &apos;9000:9000&apos;
        volumes:
            - &apos;/var/www:/var/www&apos;
            # PHP-FPM优化配置
            - &apos;/data/php/conf/zz-custom.conf:/usr/local/etc/php-fpm.d/zz-custom.conf&apos;  
            # PHP优化配置
            - &apos;/data/php/php-conf:/usr/local/etc/php/conf.d/custom-performance&apos;          
        restart: always
        container_name: php74-fpm
        # 内存限制(优化)
        deploy:
            resources:
                limits:
                    memory: 512M
                reservations:
                    memory: 256M
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 进入根目录
cd ~/php74-fpm

# 构建镜像
sudo docker compose build

# 启动容器
sudo docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;MySQL与PHP通信&lt;/h1&gt;
&lt;p&gt;我们需要创建新的docker网络，用于连通php与mysql：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker network create mynet
sudo docker network connect mynet php74-fpm
sudo docker network connect mynet mysql57
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Nginx、Certbot安装与配置(网站上线)&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;# 使用apt-get获取nginx、certbot
apt-get update &amp;amp;&amp;amp; apt-get install -y nginx
apt-get install -y certbot
apt-get install -y python3-certbot-nginx

# 开机自启动与即刻运行nginx
systemctl enable nginx &amp;amp;&amp;amp; systemctl start nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建源码存放目录，并上传资源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 需要以root身份
mkdir /var/www/love
cd /var/www/love
# 随后通过SFTP等工具上传源码至此
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用certbot(自动续签)申请ssl证书(确保域名都已在DNS处解析过)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 将&amp;lt;your-main-domain&amp;gt;更换为你的主要站点域名
sudo certbot certonly --nginx -d &amp;lt;your-main-domain&amp;gt;

# 一些相关命令
# 查看所有已安装的证书
sudo certbot certificates
# 删除证书
sudo certbot delete --cert-name example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;your-main-domain&amp;gt;&lt;/code&gt;示例: &lt;code&gt;love.example.com&lt;/code&gt; | 作为主要访问地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编辑Nginx配置文件，并上线网站:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 编辑配置(参考下文)
sudo nano /etc/nginx/sites-available/default

# 创建启用软链接
ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default

# 测试配置格式正确否
nginx -t

# 重载nginx使配置生效
sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nginx(LGnewUI-2)配置文件(将&lt;code&gt;&amp;lt;your-main-domain&amp;gt;&lt;/code&gt;替换为自定义域名):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ==================== Love站点 - HTTP ====================
server {
    listen 80;
    server_name &amp;lt;your-main-domain&amp;gt;;

    # HTTP自动跳转HTTPS
    return 301 https://$host$request_uri;
}

# ==================== Love站点 - HTTPS ====================
server {
    listen 443 ssl http2;
    server_name &amp;lt;your-main-domain&amp;gt;;

    ssl_certificate /etc/letsencrypt/live/&amp;lt;your-main-domain&amp;gt;/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/&amp;lt;your-main-domain&amp;gt;/privkey.pem;

    root /var/www/love;
    index index.php index.html index.htm;

    client_max_body_size 100m;
    client_body_timeout 180s;

    gzip on;
    gzip_comp_level 5;              
    gzip_min_length 1k;             
    gzip_vary on;
    gzip_buffers 4 8k;
    gzip_http_version 1.1;
    gzip_proxied any;
    gzip_types
        text/plain
        text/css
        text/javascript
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/xml+rss
        image/svg+xml
        font/woff2
        font/ttf;

    location ~ ^.+?\.php(/.*)?$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        set $path_info $fastcgi_path_info;
        fastcgi_param PATH_INFO $path_info;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_read_timeout 300;
        fastcgi_send_timeout 300;
        fastcgi_connect_timeout 300;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;防IP直连的Nginx配置(选用)&lt;/h2&gt;
&lt;p&gt;直接给出配置文件新增字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ==================== 防IP访问 - HTTP ====================
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    # 匹配所有未绑定的域名和直接 IP 访问
    # 444直接关闭连接，不返回任何信息，比 403 更安全
    server_name _;
    return 444;
}

# ==================== 防IP访问 - HTTPS ====================
server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name _;

    # 配置一个无效或自签名的 SSL 证书，或指向不存在的证书路径
    # 目的是让通过 IP 的 HTTPS 访问因证书错误而失败
    ssl_certificate /data/customSSL/dummy.crt;
    ssl_certificate_key /data/customSSL/dummy.key;

    # 也可以直接返回错误，但证书错误通常能阻止连接建立
    return 444;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启用之前，需要先使用&lt;strong&gt;openssl&lt;/strong&gt;申请自签名无效证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /data/customSSL
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
  -keyout /data/customSSL/dummy.key \
  -out /data/customSSL/dummy.crt \
  -subj &quot;/CN=unused&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;LGnewUI-2 杂项处理&lt;/h1&gt;
&lt;h2&gt;路径权限问题&lt;/h2&gt;
&lt;p&gt;在上文中，&lt;strong&gt;PHP&lt;/strong&gt; 的挂载路径为&lt;code&gt;/var/www/&lt;/code&gt;，而docker容器的权限身份一般是&lt;code&gt;uid=33(www-data) gid=33(www-data) groups=33(www-data)&lt;/code&gt;，需要保持路径所属身份一致：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 确认容器权限身份，一般为uid=33(www-data) gid=33(www-data) groups=33(www-data)
docker exec php74-fpm id www-data
# 1. 创建与容器内匹配的用户和组（UID/GID 都是 33）
sudo groupadd -g 33 www-data 2&amp;gt;/dev/null
sudo useradd -u 33 -g 33 -M -s /sbin/nologin www-data 2&amp;gt;/dev/null
# 2. 设置项目目录所有者
sudo chown -R 33:33 /var/www/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;MySQL数据库填写&lt;/h2&gt;
&lt;p&gt;在上文的&lt;strong&gt;compose&lt;/strong&gt;文件中，已经创建了一个数据库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;地址：&lt;code&gt;mysql57&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;库名：&lt;code&gt;LGnewUI2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用户：&lt;code&gt;root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;密码：&lt;code&gt;yourpassword&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;MySQL数据库备份与恢复&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 备份数据库
docker exec &amp;lt;容器名mysql57&amp;gt; mysqldump -u &amp;lt;用户名root&amp;gt; -p&amp;lt;密码yourpassword&amp;gt; --single-transaction --hex-blob --default-character-set=utf8mb4 --add-drop-table &amp;lt;数据库名LGnewUI2&amp;gt; &amp;gt; ~/backup.sql

# 恢复数据库
docker exec -i &amp;lt;容器名mysql57&amp;gt; mysql -u &amp;lt;用户名root&amp;gt; -p&amp;lt;密码yourpassword&amp;gt; --default-character-set=utf8mb4 &amp;lt;数据库名LGnewUI2&amp;gt; &amp;lt; ~/backup.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;和风天气API--生成Ed25519密钥对&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cd ~
# 生成私钥文件
openssl genpkey -algorithm Ed25519 -out private.pem
# 导出公钥文件
openssl pkey -in private.pem -pubout -out public.pem
# 查看内容
cat private.pem
cat public.pem
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;获取CDN客户端真实IP&lt;/h2&gt;
&lt;p&gt;在Nginx配置文件的&lt;code&gt;Server&lt;/code&gt;字段中，添加如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;set_real_ip_from 0.0.0.0/0;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接受来自所有IP的请求(理论上该使用场景只需填写CDN的IP段)&lt;/li&gt;
&lt;li&gt;从&lt;code&gt;X-Forwarded-For&lt;/code&gt;请求头获取真实IP&lt;/li&gt;
&lt;li&gt;递归搜索，从右向左排除所有信任IP段，取第一个不信任IP(当前配置下默认取最左侧第一个IP，通常为CDN自动填写的客户端真实IP)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;阿里云ESA(开启HTTP请求头添加后)的默认请求头为&lt;code&gt;ali-real-client-ip&lt;/code&gt;，如有开启请替换掉&lt;code&gt;X-Forwarded-For&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;敏感目录拒绝访问&lt;/h2&gt;
&lt;p&gt;在Nginx配置文件的&lt;code&gt;Server&lt;/code&gt;字段中，添加如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ── 敏感目录 ──
location ^~ /storage/ { return 404; }
location ^~ /config/ { return 404; }
location ^~ /vendor/ { return 404; }
location ^~ /phpmailer/ { return 404; }
location ^~ /cron/ { return 404; }
location ^~ /install/ { return 404; }

# ── 敏感根目录文件 ──
location = /composer.json { return 404; }
location = /readme.txt { return 404; }
location = /config.php { return 404; }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;服务器性能优化：添加Swap分区&lt;/h2&gt;
&lt;p&gt;2G内存没有 Swap 很危险，OOM 时会直接杀进程。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建 2G swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 持久化配置
echo &apos;/swapfile none swap sw 0 0&apos; | sudo tee -a /etc/fstab

# 降低swap使用倾向（优先用物理内存）
echo &apos;vm.swappiness = 10&apos; | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 验证
free -h
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;其他工具&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://dbeaver.io/&quot;&gt;DBeaver&lt;/a&gt; | 数据库管理(此处可用来转移、备份MySQL)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://winscp.net/eng/docs/lang:chs&quot;&gt;WinSCP&lt;/a&gt; | SFTP工具(上传文件到服务器)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mobaxterm.mobatek.net/download-home-edition.html&quot;&gt;MobaXterm&lt;/a&gt; | SSH工具(连接服务器、编辑文件)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>通过Docker搭建Minecraft服务器 | MacMini、ArchLinux实战</title><link>https://blog.srprolin.top/posts/docker-mc/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/docker-mc/</guid><description>详细介绍Docker的安装配置、Frp的安装配置，涵盖各个操作系统，并提供Minecraft镜像的两种compose版本，以供搭建MC服务器作为参考。</description><pubDate>Wed, 25 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.docker.com/desktop/setup/install/windows-install/&quot;&gt;DockerDesktop安装文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://get.docker.com/&quot;&gt;get-docker脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docker.xuanyuan.me/&quot;&gt;轩辕镜像&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/itzg/docker-minecraft-server&quot;&gt;itzg/docker-minecraft-server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docker-minecraft-server.readthedocs.io/en/latest/&quot;&gt;minecraft-server文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.natfrp.com/?page=panel&amp;amp;module=addproxy&quot;&gt;樱花内网穿透&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Docker的安装与配置&lt;/h1&gt;
&lt;h2&gt;在Windows上安装docker&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Win&lt;/code&gt;+&lt;code&gt;R&lt;/code&gt;打开运行窗，输入&lt;code&gt;optionalfeatures&lt;/code&gt;打开Windows功能面板，勾选 &lt;strong&gt;适用于Linux的Windows子系统&lt;/strong&gt; 和 &lt;strong&gt;虚拟机平台&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-25_13-06-02.wPAbf-4R_Z1x3dlT.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;来到 &lt;a href=&quot;https://docs.docker.com/desktop/setup/install/windows-install/&quot;&gt;DockerDesktop安装文档&lt;/a&gt;，选择你的架构，Windows日用机一般为&lt;code&gt;x86_64&lt;/code&gt;，你也可以在这里安装 &lt;strong&gt;Linux&lt;/strong&gt; 和 &lt;strong&gt;MacOS&lt;/strong&gt; 的桌面版。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;随后在我们要使用docker命令时，需要保持 &lt;strong&gt;DockerDesktop&lt;/strong&gt; 运行中。&lt;/p&gt;
&lt;h2&gt;Debian系安装docker&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 获取官方脚本
curl -fsSL https://get.docker.com -o install-docker.sh

# 执行安装脚本
sudo sh install-docker.sh

# 启动 Docker 服务
sudo systemctl start docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://help.aliyun.com/zh/ecs/user-guide/install-and-use-docker&quot;&gt;阿里云服务器参考教程&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#删除Docker相关源
sudo rm -f /etc/apt/sources.list.d/*docker*.list
#卸载Docker和相关的软件包
for pkg in docker.io docker-buildx-plugin docker-ce-cli docker-ce-rootless-extras docker-compose-plugin docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove -y $pkg; done

#添加 GPG 密钥
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
#将该软件源添加到 Apt 源列表中。
sudo tee /etc/apt/sources.list.d/docker.sources &amp;lt;&amp;lt;EOF
Types: deb
URIs: http://mirrors.cloud.aliyuncs.com/docker-ce/linux/debian
Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;$VERSION_CODENAME&quot;)
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update
#安装Docker社区版本，容器运行时containerd.io，以及Docker构建和Compose插件
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#启动Docker
sudo systemctl start docker
#设置Docker守护进程在系统启动时自动启动
sudo systemctl enable docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ArchLinux安装docker&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 使用pacman直接安装
sudo pacman -S docker docker-compose

# 启动 Docker 服务
sudo systemctl start docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;MacOS安装docker&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 检查版本
brew --version

# (选)安装Homebrew
curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash

# 安装orbstack作为docker的运行平台，再安装docker和compose
brew install --cask orbstack docker docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;orbstack&lt;/strong&gt; 相关命令(使用docker时保持开启)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 开机
orb start

# 状态
orb status

# 下机
orb stop

# 配置docker
orb config docker
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;docker配置镜像源、开机自启动&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 启用开机自启
sudo systemctl enable docker

# 查看状态
sudo systemctl status docker

# Linux手动配置镜像源
sudo nano /etc/docker/daemon.json

# MacOS基于orbstack配置镜像源
orb config docker

# Windows在文件资源管理器中输入以下地址
%USERPROFILE%\.docker\daemon.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://docker.xuanyuan.me/&quot;&gt;轩辕镜像&lt;/a&gt; 一键配置脚本:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bash &amp;lt;(wget -qO- https://xuanyuan.cloud/docker.sh)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;镜像源配置示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;registry-mirrors&quot;: [
    &quot;https://docker.m.daocloud.io&quot;,
    &quot;https://docker.1panel.live/&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常用的docker命令&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;  # 查看镜像列表
  docker image ls

  # 拉取镜像
  docker pull &amp;lt;镜像名&amp;gt;

  # 删除镜像
  docker rmi &amp;lt;镜像名&amp;gt;

  # 强制删除
  docker rmi -f &amp;lt;镜像名&amp;gt;

  # 查看运行中的容器
  docker ps

  # 查看所有容器（包括停止的）
  docker ps -a

  # 运行容器
  docker run -d --name &amp;lt;容器名&amp;gt; &amp;lt;镜像名&amp;gt;

  # 停止容器
  docker stop &amp;lt;容器名或ID&amp;gt;

  # 启动容器
  docker start &amp;lt;容器名或ID&amp;gt;

  # 删除容器
  docker rm &amp;lt;容器名或ID&amp;gt;

  # 强制删除运行中的容器
  docker rm -f &amp;lt;容器名或ID&amp;gt;

  # 查看容器日志
  docker logs &amp;lt;容器名&amp;gt;

  # 实时查看日志
  docker logs -f &amp;lt;容器名&amp;gt;

  # 进入容器内部
  docker exec -it &amp;lt;容器名&amp;gt; /bin/bash

  # 启动所有服务
  docker compose up -d

  # 停止所有服务
  docker compose down

  # 查看服务状态
  docker compose ps

  # 查看日志
  docker compose logs -f

  # 重启服务
  docker compose restart

  # 清理所有未使用的镜像
  docker image prune -a

  # 清理未使用的卷
  docker volume prune

  # 打包镜像文件为jar包离线使用
  docker save -o &amp;lt;文件名&amp;gt;.tar &amp;lt;镜像名&amp;gt;

  # 加载离线镜像jar包
  docker load -i &amp;lt;文件名&amp;gt;.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;minecraft-server镜像&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/itzg/docker-minecraft-server&quot;&gt;itzg/docker-minecraft-server&lt;/a&gt; 是一个提供Minecraft镜像的一个仓库，我们只需根据 &lt;a href=&quot;https://docker-minecraft-server.readthedocs.io/en/latest/&quot;&gt;minecraft-server文档&lt;/a&gt;，选择合适的镜像和配置，即可完成一键启动Minecraft服务器。&lt;/p&gt;
&lt;p&gt;根据 &lt;a href=&quot;https://hub.docker.com/r/itzg/minecraft-server&quot;&gt;Docker-Hub的镜像仓库&lt;/a&gt; 选择不同Java版本的镜像。本文将以 &lt;strong&gt;Minecraft-Paper-1.21.4&lt;/strong&gt;  和 &lt;strong&gt;BetterMCv54-Forge-1.20.1&lt;/strong&gt; 这两个服务器举例，并分别部署在 &lt;strong&gt;ArchLinux&lt;/strong&gt; 和 &lt;strong&gt;MacMini&lt;/strong&gt; 上，所选用的 &lt;strong&gt;Java&lt;/strong&gt; 版本为 &lt;code&gt;java21&lt;/code&gt;，作者还提供了一个用于备份的镜像 &lt;a href=&quot;https://hub.docker.com/r/itzg/mc-backup&quot;&gt;mc-backup&lt;/a&gt;，这里我选择使用&lt;code&gt;2026.3.2&lt;/code&gt;版本。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 拉取docker镜像(必要时使用sudo)
docker pull itzg/minecraft-server:java21
docker pull itzg/mc-backup:2026.3.2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;BetterMCv54的compose配置&lt;/h2&gt;
&lt;p&gt;在作者的GitHub仓库中，提供了这么一个示例配置：&lt;a href=&quot;https://github.com/itzg/docker-minecraft-server/blob/master/examples/docker-compose-forge-bettermcplus&quot;&gt;docker-compose-forge-bettermcplus&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;笔者在此基础上结合&lt;a href=&quot;https://github.com/itzg/docker-mc-backup&quot;&gt;docker-mc-backup&lt;/a&gt;进行了进一步配置，请确保文件名为&lt;code&gt;docker-compose.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;services:

  # 备份预热:启动restore-tar-backup脚本，如果在backups目录中有备份tar包，便对data目录进行覆盖，并在执行后停止。
  restore-backup:
    image: itzg/mc-backup:2026.3.2   # 检查镜像名
    restart: &quot;no&quot;
    entrypoint: restore-tar-backup
    volumes:
      - ./minecraft-data:/data       # 服务器文件
      - ./mc-backups:/backups:ro     # 备份文件夹

  # 服务器本体容器
  mc_bmp:
    image: itzg/minecraft-server:java21-jdk  # 检查镜像名
    container_name: mc_bmp                   # 自定义容器显示名称
    healthcheck:                             # 容器健康检查
      interval: 30s                          # 多久检查一次
      timeout: 60s                           # 单次检查的超时时间
      retries: 10                            # 连续失败多少次算不健康
      start_period: 300s                     # 容器启动后多久才开始检查（等待启动时间）
    ports:
      - 25565:25565                          # 游戏连接端口
      - 2222:2222                            # SSH命令传入端口
    restart: unless-stopped
    environment:
      EULA: &quot;true&quot; 
      ENABLE_SSH: true                       # 开启SSH命令传入
      TYPE: FORGE                            # 游戏类型
      VERSION: 1.20.1                        # 游戏版本
      FORGE_VERSION: 47.4.10                 # Forge版本
      MEMORY: &quot;8G&quot;                           # 内存分配
      GENERIC_PACK: /modpacks/BMC4_Server_Pack_v54.zip   # (整合包)服务器压缩文件位置

      # JVM虚拟机优化参数
      JVM_OPTS: &quot;-server&quot;
      JVM_XX_OPTS: &quot;-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:+UseStringDeduplication -XX:+UseCompressedOops -XX:+UseCompressedClassPointers&quot;
      JVM_DD_OPTS: &quot;-Dfml.readTimeout=180 -Dfml.debugRegistryEntries=true -Dfile.encoding=UTF-8&quot;  
      
      TZ: &quot;Asia/Shanghai&quot;                    # 时区
      OVERRIDE_SERVER_PROPERTIES: &quot;false&quot;    # 是否覆盖Server_properties文件
      DIFFICULTY: &quot;normal&quot;                   # 游戏难度
      MAX_TICK_TIME: &quot;-1&quot;                       
      VIEW_DISTANCE: &quot;6&quot;                     # 视距
      ALLOW_FLIGHT: &quot;true&quot;                   # 是否允许飞行
      OPS: &quot;RoL1n_SrP&quot;                       # 管理员
      MAX_PLAYERS: 10                        # 最大玩家数
      PVP: &quot;false&quot;                           # 是否开启PVP
      LEVEL_TYPE: &quot;biomesoplenty&quot;                    
      RCON_PASSWORD: &quot;yourpassword&quot;          # Rcon、SSH共用密码
    volumes:
      - ./modpacks:/modpacks:ro              # 只读(整合包)服务器压缩文件
      - ./minecraft-data:/data               # 服务器游戏数据

    # 仅当备份预热脚本结束后才进行服务器加载
    depends_on:
      restore-backup:
        condition: service_completed_successfully
  
  # 常驻备份容器
  backups:
    image: itzg/mc-backup:2026.3.2           # 检查镜像名
    
    # 仅在 mc_bmp 容器健康运行后才运行此容器
    depends_on:
      mc_bmp:                                # 检查服务器容器名(Services名称)
        condition: service_healthy
    environment:
      BACKUP_INTERVAL: &quot;2h&quot;                  # 每2小时进行一次备份
      PRUNE_BACKUPS_COUNT: 8                 # 最大备份文件数量
      BACKUP_ON_STARTUP: true                # 是否在启动时进行备份
      RCON_HOST: mc_bmp                      # Rcon所连接的(服务器)容器名(Services名称)
      INITIAL_DELAY: 30m                     # 在启动后30min才执行计时/备份
      PAUSE_IF_NO_PLAYERS: false             # 是否在无玩家时暂停计时/备份
      PLAYERS_ONLINE_CHECK_INTERVAL: 5m      # 间隔5分钟检查服务器中是否有玩家
    volumes:
      - ./minecraft-data:/data:ro            # 只读服务器文件数据
      - ./mc-backups:/backups                # 备份文件目录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;备份机制是这样的 (备份并不需要关闭服务器):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;发送游戏指令&lt;code&gt;save-off&lt;/code&gt;，禁用自动保存&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;save-all&lt;/code&gt;，将所有数据写入磁盘&lt;/li&gt;
&lt;li&gt;对服务器目录进行全量打包，并备份至备份文件夹&lt;/li&gt;
&lt;li&gt;发送指令&lt;code&gt;save-on&lt;/code&gt;，开启自动保存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此外，betterMC是一款整合包，其他整合包作者也通常会发布 &lt;strong&gt;服务端整合包&lt;/strong&gt;，你需要将&lt;code&gt;GENERIC_PACK: /modpacks/BMC4_Server_Pack_v54.zip&lt;/code&gt;中的&lt;code&gt;BMC4_Server_Pack_v54.zip&lt;/code&gt;改写为你所使用的服务端整合包名称，并在&lt;code&gt;docker-compose.yml&lt;/code&gt;同目录下创建&lt;code&gt;modpacks&lt;/code&gt;文件夹，来存放这个服务端整合包，这样docker容器在运行时才能生成正确的服务器文件。&lt;/p&gt;
&lt;h2&gt;Paper插件服的compose配置&lt;/h2&gt;
&lt;p&gt;相比于 &lt;strong&gt;BetterMC&lt;/strong&gt;，&lt;strong&gt;Paper&lt;/strong&gt; 的配置会简单不少，因此笔者只对不同部分做注释：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &quot;3&quot;
services:
  restore-backup:
    image: itzg/mc-backup:2026.3.2
    restart: &quot;no&quot;
    entrypoint: restore-tar-backup
    volumes:
      - ./minecraft-data:/data
      - ./mc-backups:/backups:ro
      
  mc_paper:                                 # 这里的服务名定义为 mc_paper
    image: itzg/minecraft-server:java21-jdk
    container_name: mc_paper                # 容器名也是 mc_paperr
    ports:
      - &quot;25565:25565&quot;
      - &quot;2222:2222&quot;
    environment:
      EULA: &quot;TRUE&quot;
      ENABLE_SSH: true
      TYPE: &quot;PAPER&quot;                         # 游戏类型为 Paper
      VERSION: &quot;1.21.4&quot;                     # 游戏版本
      VIEW_DISTANCE: 8         
      MEMORY: 4G
      ENABLE_WHITELIST: &quot;FALSE&quot;             # 是否启用白名单
      OPS: &quot;RoL1n_SrP&quot;
      ONLINE_MODE: &quot;TRUE&quot;                   # 是否开启正版验证
      SERVER_NAME: &quot;SrP-Server&quot;             # 服务器名称
      MOTD: &quot;It&apos;s provided by RoL1n.&quot;       # 服务器列表欢迎语
      ICON: &quot;/icon.png&quot;                     # 这里可以自定义你的服务器图标(容器内路径)
      OVERRIDE_SERVER_PROPERTIES: &quot;FALSE&quot;
      RCON_PASSWORD: &quot;yourpassword&quot;
    tty: true
    stdin_open: true
    restart: unless-stopped
    volumes:
      - ./minecraft-data:/data
      - ./icon.png:/icon.png                # 需要在这里挂载上服务器图标位置(容器 &quot;外-&amp;gt;内&quot; 路径映射)
    depends_on:
      restore-backup:
        condition: service_completed_successfully

  backups:
    image: itzg/mc-backup:2026.3.2
    depends_on:
      mc_paper:                             # 注意这里的服务名
        condition: service_healthy
    environment:
      BACKUP_INTERVAL: &quot;2h&quot;
      PRUNE_BACKUPS_COUNT: 8
      BACKUP_ON_STARTUP: true
      RCON_HOST: mc_paper                   # 这里也是服务名
      INITIAL_DELAY: 30m
      PAUSE_IF_NO_PLAYERS: false
      PLAYERS_ONLINE_CHECK_INTERVAL: 5m
    volumes:
      - ./minecraft-data:/data:ro
      - ./mc-backups:/backups
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Docker启动与命令通信&lt;/h2&gt;
&lt;p&gt;当一切准备就绪，就可以使用docker-compose命令来启动服务器了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入docker-compose.yml所在目录
cd ...

# 启动容器链，并持久化运行(必要时sudo提权)
docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;itzg/minecraft-server&lt;/code&gt;镜像默认有一个开启在&lt;code&gt;2222&lt;/code&gt;端口上的SSH，直接连接到容器内部的游戏服务器，你可以通过ssh命令连接服务器，查看游戏实时日志并发送命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ssh命令标准
ssh &amp;lt;username&amp;gt;@&amp;lt;server_address&amp;gt; -p 2222

# 示例(如果是在本地运行的容器)
ssh root@127.0.0.1 -p 2222
# 输入在compose中的RCON_PASSWORD值(无键盘输入显示，需要盲打)
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;内网穿透Frp&lt;/h1&gt;
&lt;p&gt;如果你能够租到10M及以上带宽的云服务器，那么你可以使用自建内网穿透，否则还是直接使用 &lt;a href=&quot;https://www.natfrp.com/?page=panel&amp;amp;module=addproxy&quot;&gt;樱花内网穿透&lt;/a&gt; 服务吧。&lt;/p&gt;
&lt;p&gt;在这里我们并不需要下载任何 &lt;a href=&quot;https://www.natfrp.com/?page=panel&amp;amp;module=addproxy&quot;&gt;樱花内网穿透&lt;/a&gt; 的软件，在Windows和Debian系Linux中，完全可以 &lt;a href=&quot;https://github.com/fatedier/frp/releases&quot;&gt;下载原版frp的对应版本&lt;/a&gt;，然后配置使用&lt;code&gt;frpc&lt;/code&gt;即可，配置文件由 &lt;a href=&quot;https://www.natfrp.com/tunnel/&quot;&gt;隧道列表&lt;/a&gt; 提供：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-27_16-31-30.DAdIUaMG_2dgz7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;手动下载Frp并配置，请参考笔者的往期文章: &lt;a href=&quot;https://blog.srprolin.top/posts/frp-1/#frpc-%E5%AE%A2%E6%88%B7%E7%AB%AF&quot;&gt;内网穿透Frp搭建 &lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Mac中安装frp与配置樱花映射&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 使用brew安装
brew install frpc

# 查看安装位置与验证版本
which frpc
frpc --version

# 编辑配置文件(将获取到的配置粘贴至此)
sudo nano $(brew --prefix)/etc/frp/frpc.toml

# 启动服务
brew services start frpc

# 查看状态
brew services list
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;ArchLinux中安装frp与配置樱花映射&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 使用pacman安装
sudo pacman -S frpc

# 查看安装位置与验证版本
which frpc
frp --version

# 编辑配置文件
sudo nano /etc/frp/frpc.toml

# 启动服务
systemctl enable frpc
systemctl start frpc

# 查看状态
systemctl status frpc
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>【重置版】在Windows系统中安装深度学习框架Pytorch与TensorFlow</title><link>https://blog.srprolin.top/posts/pytorch-2/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/pytorch-2/</guid><description>深度学习框架pytorch、tensorflow的安装，涉及conda环境、python版本、cuda检测等，最终用vscode验证使用。</description><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接与前情提要&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.anaconda.com/download/success?reg=skipped&quot;&gt;Anaconda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pytorch.org/get-started/locally/&quot;&gt;Pytorch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tensorflow.org/install/pip?hl=zh-cn#windows&quot;&gt;Tensorflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pytorch是一个深度学习框架，一般使用Python语言进行调用；&lt;/p&gt;
&lt;p&gt;Anaconda是一个Python版本、包管理工具，可以在一台机器上创建多个conda环境，每个conda环境使用不同的Python版本和包，而pytorch就是一个包；&lt;/p&gt;
&lt;p&gt;Cuda是NVIDIA推出的并行计算平台和编程模型，安装NVIDIA显卡驱动，即可自带所支持的Cuda。对于pytorch等深度学习框架来说，就是可以加速计算、训练。&lt;/p&gt;
&lt;h1&gt;使用anaconda管理python版本&lt;/h1&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://www.anaconda.com/download/success?reg=skipped&quot;&gt;Anaconda下载地址&lt;/a&gt;，这里下载miniconda即可，只是用到conda来管理环境，安装过后添加系统环境变量：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-20_10-37-20.CNa31OTY_1lPjgV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;conda相关命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查当前的conda环境(默认创建了base环境，搭配了最新版本的Python解释器)
conda env list
# 创建新的conda环境(以python3.11的&quot;pytorch&quot;环境为例)(&quot;pytorch&quot;为conda环境名)
conda create -n pytorch python=3.11 -y
# 激活(进入)目标环境&quot;pytorch&quot;
conda activate pytorch
# 检查当前环境中的包、库(会列出通过conda、pip安装的包、库)
conda list
# 删除目标环境(&quot;pytorch&quot;为例)
conda env remove -n pytorch
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Pytorch-GPU 安装&lt;/h1&gt;
&lt;p&gt;Pytorch-GPU版需要拥有NVIDIA支持Cuda的显卡，可以用该命令检查是否安装NVIDIA驱动和Cuda版本：&lt;code&gt;nvidia-smi&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;进入&lt;a href=&quot;https://pytorch.org/get-started/locally/&quot;&gt;Pytorch快速开始页面&lt;/a&gt;，选择 &lt;strong&gt;Stable&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Windows&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Pip&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Python&lt;/strong&gt;-&amp;gt;&lt;strong&gt;(选择≤你的Cuda版本号)&lt;/strong&gt;，复制命令。&lt;/p&gt;
&lt;p&gt;回到powershell终端，进入创建好的pytorch虚拟环境(&lt;code&gt;conda activate pytorch&lt;/code&gt;)，输入命令安装即可(Cuda13为例)：&lt;code&gt;pip install torch torchvision --index-url https://download.pytorch.org/whl/cu130&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;在Vscode中验证Pytorch-GPU可用性&lt;/h2&gt;
&lt;p&gt;编辑一个python文件(test.py)，根据VScode提示安装Python拓展包:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import torch
print(torch.cuda.is_available())
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按下&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;Shift&lt;/code&gt;+&lt;code&gt;P&lt;/code&gt;打开命令面板，输入&lt;code&gt;python: select interpreter&lt;/code&gt;，选择到conda虚拟环境&lt;strong&gt;pytorch&lt;/strong&gt;中的python3.11解释器。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-20_12-06-00.Bv1i9RrJ_FCCB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按下&lt;code&gt;F5&lt;/code&gt;，进行调试，或者&lt;code&gt;Ctrl&lt;/code&gt;+&lt;code&gt;F5&lt;/code&gt;直接运行，将看到如下结果，&lt;code&gt;True&lt;/code&gt;即表明Pytorch-GPU安装成功。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-20_12-10-08.Bx7TjJ1H_Z5neH3.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;TensorFlow-GPU 安装&lt;/h1&gt;
&lt;p&gt;这里针对Windows Native的NVIDIA显卡版本的TensorFlow，幽默的是，在 &lt;a href=&quot;https://www.tensorflow.org/install/pip?hl=zh-cn#windows&quot;&gt;TensorFlow的中文安装页面&lt;/a&gt; 中，提示安装的TensorFlow2是CPU、GPU混合最新版本：&lt;code&gt;pip install --upgrade tensorflow&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;而TensorFlow对Windows原生NVIDIA显卡支持的GPU版最终版本是TensorFlow2.10, 最新版本在笔者此时已经是2.21了，绝对不可能支持Cuda；但将该页面改为&lt;a href=&quot;https://www.tensorflow.org/install/pip#windows-native&quot;&gt;英文指引&lt;/a&gt;，却赫然写明了 &lt;strong&gt;TensorFlow 2.10 was the last TensorFlow release that supported GPU on native-Windows.&lt;/strong&gt; 这让不少人踩了坑。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-20_12-20-16.DK5yg7tg_2deacL.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/Snipaste_2026-03-20_12-27-40.C6JRMzha_Z97jjv.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;那么我们便按照 &lt;a href=&quot;https://www.tensorflow.org/install/pip#windows-native&quot;&gt;英文指引&lt;/a&gt; 来安装tensorflow-gpu版：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建conda环境：&lt;code&gt;conda create -n tf python=3.9 -y&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;激活conda环境：&lt;code&gt;conda activate tf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安装cuda和cuDNN：&lt;code&gt;conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安装TensorFlow：&lt;code&gt;pip install &quot;tensorflow&amp;lt;2.11&quot; &lt;/code&gt;&lt;/li&gt;
&lt;li&gt;验证CPU配置：&lt;code&gt;python -c &quot;import tensorflow as tf; print(tf.reduce_sum(tf.random.normal([1000, 1000])))&quot; &lt;/code&gt;&lt;/li&gt;
&lt;li&gt;验证GPU配置：&lt;code&gt;python -c &quot;import tensorflow as tf; print(tf.config.list_physical_devices(&apos;GPU&apos;))&quot; &lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在验证安装环节，由于tensorflow2.10是使用的numpy1.x，而笔者此时miniconda自带的是numpy2.x，遇到报错，只需要对numpy进行降级：&lt;code&gt;pip install &quot;numpy&amp;lt;2&quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;下面给出笔者的验证响应，说明笔者已经成功安装：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# CPU配置
tf.Tensor(-1373.9692, shape=(), dtype=float32)
# GPU配置
[PhysicalDevice(name=&apos;/physical_device:GPU:0&apos;, device_type=&apos;GPU&apos;)]
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>笔记本重装Windows系统 | 软件推荐</title><link>https://blog.srprolin.top/posts/2026-03-17-windows-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-03-17-windows-1/</guid><description>记录一次Windows装机，并不是一个详细的教程，只是一个流程，包含一些常用软件推荐。</description><pubDate>Tue, 17 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ventoy.net/cn/download.html&quot;&gt;Ventoy-一款写盘工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/zh-cn/software-download/windows11&quot;&gt;Windows11官方镜像&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://otp.landian.vip/zh-cn/&quot;&gt;Office Tool Plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://massgrave.dev/index.html&quot;&gt;MAS-Windows脚本激活工具&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;重装前的准备&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;笔者使用的是华硕的笔记本电脑，仅以此为例。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;将必要的文件进行备份&lt;/li&gt;
&lt;li&gt;准备一个8G以上U盘&lt;/li&gt;
&lt;li&gt;下载&lt;a href=&quot;https://www.microsoft.com/zh-cn/software-download/windows11&quot;&gt;Windows11官方镜像&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;下载笔记本厂商驱动，以华硕为例，前往&lt;a href=&quot;https://www.asus.com.cn/support/download-center/&quot;&gt;下载中心&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;装机流程&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;华硕主板需要在BIOS中&lt;a href=&quot;https://www.asus.com.cn/support/faq/1044458/&quot;&gt;关闭VMD&lt;/a&gt;，防止在系统无法识别磁盘控制器。注:关闭VMD技术将会导致您的电脑无法使用 RAID 磁盘阵列。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;使用Ventoy将U盘刷写&lt;/li&gt;
&lt;li&gt;将Windows镜像ISO和笔记本厂商驱动等文件copy到刷好的U盘内&lt;/li&gt;
&lt;li&gt;插上U盘，进行重启，期间按&lt;code&gt;F2&lt;/code&gt;进入BIOS&lt;/li&gt;
&lt;li&gt;将U盘设置为第一启动项&lt;/li&gt;
&lt;li&gt;若无法进入ventoy的引导界面，请根据&lt;a href=&quot;https://www.ventoy.net/cn/doc_secure.html&quot;&gt;官方教程&lt;/a&gt;操作，或者直接关闭 &lt;strong&gt;Secure Boot&lt;/strong&gt;，但会影响到反作弊程序的运行。&lt;/li&gt;
&lt;li&gt;进入Windows 11系统镜像安装界面后，重点将分区列表清理干净(建议如此)，比如原系统安装在磁盘0,建议提前将磁盘0中的重要文件转移到磁盘1或者其他存储设备中，然后在这里清空所有磁盘0的分区，再选中磁盘0进行装载系统。&lt;/li&gt;
&lt;li&gt;等待Windows 11安装系统，直到引导界面出现，这里默认需要插上网线，进行联网驱动更新，但也可以手动选择提前在U盘中准备的厂商驱动。&lt;/li&gt;
&lt;li&gt;在进入系统后，依次安装准备好的笔记本厂商提供的驱动程序，随后进行关机重启。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Windows初始化&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;重新进入系统后，进入 &lt;strong&gt;隐私和安全性&lt;/strong&gt; -&amp;gt; &lt;strong&gt;设备加密&lt;/strong&gt;，选择关闭。(这里重装完系统后，趁文件还没有那么多，解密很快)如果你有设备加密的需要，可以选择保持开启，但一定要在激活Windows之后，登录微软账户，因为恢复密钥只有微软官方提供给你。&lt;/li&gt;
&lt;li&gt;下载&lt;a href=&quot;https://otp.landian.vip/zh-cn/&quot;&gt;Office Tool Plus&lt;/a&gt;，进入程序后，遵照&lt;a href=&quot;https://blog.yerong.org/archives/11&quot;&gt;官方给的快速配置教程&lt;/a&gt;，点击命令按钮或者按下 &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;P&lt;/code&gt; 打开命令框，输入以下命令，安装office三件套(Word、PPT、Excel)：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;deploy /add O365ProPlusRetail_zh-cn /O365ProPlusRetail.exclapps Access,Groove,Lync,OneDrive,OneNote,Outlook,OutlookForWindows,Publisher,Teams /channel Current /dlfirst /edition 64
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;虽然在 Office Tool Plus 中有使用KMS激活Office的功能，但这里还是推荐使用 &lt;a href=&quot;https://massgrave.dev/index.html&quot;&gt;MAS&lt;/a&gt; 来激活Windows和Office，遵照官网，打开Windows自带的Powershell终端(只需要右键任务栏的Windows图标，然后选择终端打开即可)，输入命令：&lt;code&gt;irm https://get.activated.win | iex&lt;/code&gt; 如果网络通畅，即可进入交互式脚本。&lt;/li&gt;
&lt;li&gt;进入脚本后，键入&lt;code&gt;1&lt;/code&gt;即可使用数字权利激活Windows，跟随提示回到首页，键入&lt;code&gt;2&lt;/code&gt;安装Ohook即可激活Office。关于 &lt;strong&gt;KMS&lt;/strong&gt;、&lt;strong&gt;HWID&lt;/strong&gt;、&lt;strong&gt;Ohook&lt;/strong&gt; 的相关信息，可以来到 &lt;a href=&quot;https://www.mintimate.cn/2023/12/26/whatOhook/&quot;&gt;雨月空间站的文章&lt;/a&gt; 了解。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;软件推荐&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dogfight360.com/blog/18682/&quot;&gt;Steamcommunity 302&lt;/a&gt; | 这是由羽翼城大佬制作的加速工具，可以用来直连GitHub、Steam等一些国外平台。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://g-helper.com/&quot;&gt;g-helper&lt;/a&gt; | 一款用来代替华硕笔记本奥创中心的软件，主要进行CPU和GPU频率、风扇的调整，比较好用的是独显直连和三种预设切换的丝滑，可以释放出奥创达不到的性能。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.voidtools.com/zh-cn/downloads/&quot;&gt;everything&lt;/a&gt; | 一款强大的检索工具，笔者的日常使用已经脱离不开了，能够极其快速的找到你电脑上的任意一个文件。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zh.snipaste.com/&quot;&gt;Snipaste&lt;/a&gt; | 一款简洁好用的截图贴图工具&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rizonesoft.com/downloads/notepad3/&quot;&gt;notepad3&lt;/a&gt; | 一款记事本平替工具，一定程度上还能平替vscode编辑器，提供多种语法的高亮，启动快速，简洁好用。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imageglass.org/&quot;&gt;imageglass&lt;/a&gt; | 图片查看器(支持一定的图片编辑)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hooke007/mpv_PlayKit&quot;&gt;mpv_PlayKit(原mpv-lazy)&lt;/a&gt; | 由mpv爱好者打造的魔改版视频浏览器，主打懒人一键配置，启动速度快，简洁好用。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nanazip.com/&quot;&gt;NanaZip&lt;/a&gt; | 基于7Zip的现代化压缩工具，可在微软商店一键下载安装。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt; | 好用的笔记软件&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://store.steampowered.com/&quot;&gt;Steam&lt;/a&gt; | 官方网址&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.freedownloadmanager.org/zh/download.htm&quot;&gt;FDM下载器&lt;/a&gt; | IDM免费平替版，可在微软商店一键下载安装&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://apps.microsoft.com/detail/9n9wclwdqs5j?hl=zh-cn&amp;amp;gl=CN&quot;&gt;bluetooth audio receiver&lt;/a&gt; | 使用蓝牙技术让PC作为手机的扬声器&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>将任意视频转换为单通道音频、H.264编码的mp4格式视频 | FFmpeg</title><link>https://blog.srprolin.top/posts/script-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/script-1/</guid><description>个人脚本集合仓库介绍，以及视频音频合并与重编码脚本的详细使用说明</description><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ffmpeg.org/documentation.html&quot;&gt;FFmpeg 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;脚本说明&lt;/h1&gt;
&lt;p&gt;这是一个跨平台的视频处理工具，能够一键合并视频中的所有音频轨道并重新编码，特别适合处理录播、视频编辑等场景。&lt;/p&gt;
&lt;h2&gt;系统要求&lt;/h2&gt;
&lt;h3&gt;依赖软件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FFmpeg&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Windows：首次运行时脚本会自动下载&lt;/li&gt;
&lt;li&gt;Linux：&lt;code&gt;sudo apt install ffmpeg&lt;/code&gt; 或 &lt;code&gt;sudo yum install ffmpeg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;macOS：&lt;code&gt;brew install ffmpeg&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;硬件加速条件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Intel QSV&lt;/strong&gt;：Intel 4代酷睿及以上集显/独显&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AMD AMF&lt;/strong&gt;：AMD Radeon 及以上显卡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA NVENC&lt;/strong&gt;：GTX 600系列及以上显卡&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VideoToolbox&lt;/strong&gt;：Mac 2013年及以后机型&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;h3&gt;Linux/macOS&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 1. 克隆仓库或下载脚本
git clone https://github.com/RolinShmily/SrP-Scripts.git
cd SrP-Scripts/video-merge-audio-reencode

# 2. 赋予执行权限（首次使用）
chmod +x video-merge-audio-reencode.sh

# 3. 运行脚本
./video-merge-audio-reencode.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Windows&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:: 1. 克隆仓库或下载脚本
git clone https://github.com/RolinShmily/SrP-Scripts.git
cd SrP-Scripts\video-merge-audio-reencode

:: 2. 双击运行或使用命令行
video-merge-audio-reencode.bat
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;工作流程&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;扫描视频文件&lt;/strong&gt;：递归扫描当前目录下的所有视频文件（支持 mp4、mkv、avi、mov 等常见格式）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检测硬件编码器&lt;/strong&gt;：自动检测系统可用的硬件编码器，选择最优方案&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;处理音轨&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;提取所有音频轨道&lt;/li&gt;
&lt;li&gt;合并为一个立体声轨道（降混）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重新编码&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;视频流：使用硬件编码器重新编码为 H.264&lt;/li&gt;
&lt;li&gt;音频流：重新编码为 AAC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出文件&lt;/strong&gt;：在原文件同目录生成 &lt;code&gt;_output.mp4&lt;/code&gt; 后缀的新文件&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;使用示例&lt;/h2&gt;
&lt;h3&gt;基本使用&lt;/h3&gt;
&lt;p&gt;将脚本放入包含视频文件的目录中运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 当前目录结构：
# ├── video-merge-audio-reencode.sh
# ├── 录播1.mkv
# ├── 录播2.mp4
# └── 子文件夹/
#     └── 录播3.avi

./video-merge-audio-reencode.sh

# 输出：
# ├── 录播1_output.mp4
# ├── 录播2_output.mp4
# └── 子文件夹/
#     └── 录播3_output.mp4
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;处理单个视频&lt;/h3&gt;
&lt;p&gt;如果只想处理特定视频，可以将脚本移动到视频所在目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 目录结构：
# ├── 我的视频/
# │   ├── 原始视频.mkv
# │   └── video-merge-audio-reencode.sh

./video-merge-audio-reencode.sh

# 输出：原始视频_output.mp4
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;Batch脚本内容&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;@echo off
REM Video Processing Script (Windows)
REM Merge audio tracks and re-encode video to H.264
REM Author: RoL1n
REM License: MIT

setlocal enabledelayedexpansion

cd /d &quot;%~dp0&quot;

echo Starting video processing script...
echo Working directory: %CD%
echo.

REM Check dependencies
echo Checking ffmpeg...

REM Try to find ffmpeg in system PATH
set &quot;FFMPEG_PATH=&quot;
where ffmpeg &amp;gt;nul 2&amp;gt;&amp;amp;1
if not errorlevel 1 (
    set &quot;FFMPEG_PATH=ffmpeg&quot;
    goto :ffmpeg_found
)

REM Check local cache directory
set &quot;CACHE_DIR=%USERPROFILE%\.srp-scripts\ffmpeg&quot;
set &quot;LOCAL_FFMPEG=%CACHE_DIR%\ffmpeg.exe&quot;

if exist &quot;%LOCAL_FFMPEG%&quot; (
    set &quot;FFMPEG_PATH=%LOCAL_FFMPEG%&quot;
    goto :ffmpeg_found
)

REM Download ffmpeg automatically
echo ffmpeg not found in system PATH or local cache
echo.
echo [INFO] Downloading ffmpeg automatically...
echo This will only happen once. Future runs will use the cached version.
echo.

REM Create cache directory
if not exist &quot;%CACHE_DIR%&quot; mkdir &quot;%CACHE_DIR%&quot;

REM Download ffmpeg using curl
set &quot;DOWNLOAD_URL=https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip&quot;
set &quot;ZIP_FILE=%CACHE_DIR%\ffmpeg.zip&quot;

echo Downloading from: %DOWNLOAD_URL%
echo.

curl -L -o &quot;%ZIP_FILE%&quot; &quot;%DOWNLOAD_URL%&quot;
if errorlevel 1 (
    echo.
    echo [ERROR] Failed to download ffmpeg
    echo Please check your internet connection or download manually:
    echo %DOWNLOAD_URL%
    echo.
    pause
    exit /b 1
)

echo Download completed. Extracting...
echo.

REM Extract zip to a temporary subfolder
set &quot;TEMP_EXTRACT_DIR=%CACHE_DIR%\temp_extract&quot;
if exist &quot;%TEMP_EXTRACT_DIR%&quot; rmdir /s /q &quot;%TEMP_EXTRACT_DIR%&quot;
mkdir &quot;%TEMP_EXTRACT_DIR%&quot;

powershell -Command &quot;Expand-Archive -Path &apos;%ZIP_FILE%&apos; -DestinationPath &apos;%TEMP_EXTRACT_DIR%&apos; -Force&quot;
if errorlevel 1 (
    echo.
    echo [ERROR] Failed to extract zip file
    del &quot;%ZIP_FILE%&quot;
    rmdir /s /q &quot;%TEMP_EXTRACT_DIR%&quot;
    pause
    exit /b 1
)

REM Find and move ffmpeg binaries from subfolder
REM gyan.dev ffmpeg structure: ffmpeg-X.X.X-essentials_build/bin/*.exe
for /d %%D in (&quot;%TEMP_EXTRACT_DIR%\*&quot;) do (
    echo Found ffmpeg folder: %%~nxD
    if exist &quot;%%D\bin\ffmpeg.exe&quot; (
        echo Found ffmpeg.exe in bin subfolder
        move /Y &quot;%%D\bin\*.exe&quot; &quot;%CACHE_DIR%\&quot; &amp;gt;nul
        move /Y &quot;%%D\bin\*.dll&quot; &quot;%CACHE_DIR%\&quot; &amp;gt;nul
    ) else (
        echo Found ffmpeg.exe in root folder
        move /Y &quot;%%D\*.exe&quot; &quot;%CACHE_DIR%\&quot; &amp;gt;nul
        move /Y &quot;%%D\*.dll&quot; &quot;%CACHE_DIR%\&quot; &amp;gt;nul
    )
)

REM Cleanup
del &quot;%ZIP_FILE%&quot; 2&amp;gt;nul
rmdir /s /q &quot;%TEMP_EXTRACT_DIR%&quot; 2&amp;gt;nul

REM Verify extraction
if not exist &quot;%LOCAL_FFMPEG%&quot; (
    echo.
    echo [ERROR] Failed to extract ffmpeg
    echo ffmpeg.exe not found at: %LOCAL_FFMPEG%
    echo.
    echo Contents of cache directory:
    dir /b &quot;%CACHE_DIR%&quot;
    echo.
    pause
    exit /b 1
)

echo ffmpeg installed successfully to: %CACHE_DIR%
echo.
echo [INFO] Verifying ffmpeg...
&quot;%LOCAL_FFMPEG%&quot; -version | findstr &quot;ffmpeg version&quot;
echo.
echo [INFO] You can delete this cache anytime to reclaim space:
echo   %CACHE_DIR%
echo.

:ffmpeg_found
echo [OK] ffmpeg found
echo [INFO] Using ffmpeg at: %FFMPEG_PATH%
echo.

REM Set ffprobe path based on ffmpeg location
set &quot;FFPROBE_PATH=&quot;
if &quot;%FFMPEG_PATH%&quot;==&quot;ffmpeg&quot; (
    set &quot;FFPROBE_PATH=ffprobe&quot;
) else (
    set &quot;FFPROBE_PATH=%FFMPEG_PATH:\ffmpeg.exe=\ffprobe.exe%&quot;
)

REM Verify ffprobe exists
if not &quot;%FFPROBE_PATH%&quot;==&quot;ffprobe&quot; (
    if not exist &quot;%FFPROBE_PATH%&quot; (
        echo [WARN] ffprobe not found at: %FFPROBE_PATH%
        echo [INFO] Will try to use ffprobe from PATH
        set &quot;FFPROBE_PATH=ffprobe&quot;
    )
)

echo [INFO] Using ffprobe at: %FFPROBE_PATH%
echo.

REM Create output directory
if not exist &quot;output&quot; mkdir &quot;output&quot;

REM Find video files
echo Scanning for video files...

set COUNT=0
for %%F in (*.mkv *.mov *.mp4) do set /a COUNT+=1

for /d %%D in (*) do (
    if /i not &quot;%%D&quot;==&quot;output&quot; (
        for %%F in (&quot;%%D\*.mkv&quot; &quot;%%D\*.mov&quot; &quot;%%D\*.mp4&quot;) do (
            if exist &quot;%%F&quot; set /a COUNT+=1
        )
    )
)

echo Found %COUNT% video file(s)
echo.

if %COUNT%==0 (
    echo [ERROR] No video files found
    pause
    exit /b 1
)

REM Detect encoder
set &quot;HW_ENCODER=libx264&quot;
echo Detecting encoder...

&quot;%FFMPEG_PATH%&quot; -hide_banner -encoders 2&amp;gt;nul | findstr /C:&quot;h264_nvenc&quot; &amp;gt;nul
if !errorlevel! equ 0 (
    set &quot;HW_ENCODER=h264_nvenc&quot;
    echo   Using: NVIDIA NVENC
)

if &quot;!HW_ENCODER!&quot;==&quot;libx264&quot; (
    &quot;%FFMPEG_PATH%&quot; -hide_banner -encoders 2&amp;gt;nul | findstr /C:&quot;h264_amf&quot; &amp;gt;nul
    if !errorlevel! equ 0 (
        set &quot;HW_ENCODER=h264_amf&quot;
        echo   Using: AMD AMF
    )
)

if &quot;!HW_ENCODER!&quot;==&quot;libx264&quot; (
    &quot;%FFMPEG_PATH%&quot; -hide_banner -encoders 2&amp;gt;nul | findstr /C:&quot;h264_qsv&quot; &amp;gt;nul
    if !errorlevel! equ 0 (
        set &quot;HW_ENCODER=h264_qsv&quot;
        echo   Using: Intel Quick Sync
    )
)

if &quot;!HW_ENCODER!&quot;==&quot;libx264&quot; echo   Using: CPU (libx264)
echo.

REM Process videos in current directory
set SUCCESS=0
set FAIL=0

for %%F in (*.mkv *.mov *.mp4) do (
    set &quot;INPUT_FILE=%%F&quot;
    set &quot;FILENAME=%%~nxF&quot;
    set &quot;OUTPUT_FILE=output\%%~nF.mp4&quot;

    echo [INFO] Processing: !FILENAME!

    REM Get audio count
    &quot;%FFPROBE_PATH%&quot; -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 &quot;!INPUT_FILE!&quot; 2&amp;gt;nul &amp;gt; &quot;%TEMP%\audio_tmp.txt&quot;
    for /f %%A in (&apos;type &quot;%TEMP%\audio_tmp.txt&quot; ^| find /c /v &quot;&quot;&apos;) do set AUDIO_COUNT=%%A
    del &quot;%TEMP%\audio_tmp.txt&quot; 2&amp;gt;nul
    echo   Audio tracks: !AUDIO_COUNT!

    REM Get bitrate
    &quot;%FFPROBE_PATH%&quot; -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 &quot;!INPUT_FILE!&quot; 2&amp;gt;nul &amp;gt; &quot;%TEMP%\bitrate_tmp.txt&quot;
    set /p SOURCE_BITRATE=&amp;lt;&quot;%TEMP%\bitrate_tmp.txt&quot;
    del &quot;%TEMP%\bitrate_tmp.txt&quot; 2&amp;gt;nul
    if &quot;!SOURCE_BITRATE!&quot;==&quot;&quot; set SOURCE_BITRATE=0

    REM Calculate target bitrate
    set TARGET_BITRATE=0
    if !SOURCE_BITRATE! GTR 0 (
        set /a TARGET_BITRATE=!SOURCE_BITRATE!/1000
        echo   Source bitrate: !TARGET_BITRATE! kbps
    )

    REM Build encoding parameters
    set CRF_VALUE=23
    if !TARGET_BITRATE! GTR 0 (
        if !TARGET_BITRATE! LSS 2000 set CRF_VALUE=20
    )

    REM Set video params based on encoder
    if &quot;!HW_ENCODER!&quot;==&quot;h264_nvenc&quot; (
        REM Use simple NVENC params for compatibility with older ffmpeg
        if !TARGET_BITRATE! GTR 0 (
            set &quot;VIDEO_PARAMS=-c:v h264_nvenc -preset fast -cq !CRF_VALUE! -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k&quot;
        ) else (
            set &quot;VIDEO_PARAMS=-c:v h264_nvenc -preset fast -cq !CRF_VALUE!&quot;
        )
    ) else if &quot;!HW_ENCODER!&quot;==&quot;h264_amf&quot; (
        if !TARGET_BITRATE! GTR 0 (
            set /a BUF_SIZE=!TARGET_BITRATE!*2
            set &quot;VIDEO_PARAMS=-c:v h264_amf -quality speed -rc vbr -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k&quot;
        ) else (
            set &quot;VIDEO_PARAMS=-c:v h264_amf -quality speed -rc vbr&quot;
        )
    ) else if &quot;!HW_ENCODER!&quot;==&quot;h264_qsv&quot; (
        if !TARGET_BITRATE! GTR 0 (
            set /a BUF_SIZE=!TARGET_BITRATE!*2
            set &quot;VIDEO_PARAMS=-c:v h264_qsv -preset medium -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k -global_quality !CRF_VALUE!&quot;
        ) else (
            set &quot;VIDEO_PARAMS=-c:v h264_qsv -preset medium -global_quality !CRF_VALUE!&quot;
        )
    ) else (
        if !TARGET_BITRATE! GEQ 2000 (
            set /a BUF_SIZE=!TARGET_BITRATE!*2
            set &quot;VIDEO_PARAMS=-c:v libx264 -preset medium -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k&quot;
        ) else (
            set &quot;VIDEO_PARAMS=-c:v libx264 -preset medium -crf !CRF_VALUE!&quot;
        )
    )

    set &quot;AUDIO_PARAMS=-c:a aac -b:a 192k -ac 2&quot;

    echo   Encoding...

    REM Execute ffmpeg with output visible for debugging
    if !AUDIO_COUNT! GTR 1 (
        &quot;%FFMPEG_PATH%&quot; -i &quot;!INPUT_FILE!&quot; -filter_complex &quot;amix=inputs=!AUDIO_COUNT!:duration=longest[a]&quot; -map 0:v -map &quot;[a]&quot; !VIDEO_PARAMS! !AUDIO_PARAMS! -movflags +faststart -y &quot;!OUTPUT_FILE!&quot;
    ) else (
        &quot;%FFMPEG_PATH%&quot; -i &quot;!INPUT_FILE!&quot; !VIDEO_PARAMS! !AUDIO_PARAMS! -movflags +faststart -y &quot;!OUTPUT_FILE!&quot;
    )

    REM Check output
    if exist &quot;!OUTPUT_FILE!&quot; (
        for %%S in (&quot;!OUTPUT_FILE!&quot;) do set FILE_SIZE=%%~zS
        if !FILE_SIZE! GTR 0 (
            echo   Done
            set /a SUCCESS+=1
        ) else (
            echo   Failed: Output file is empty
            set /a FAIL+=1
        )
    ) else (
        echo   Failed: Output file not created
        set /a FAIL+=1
    )
    echo.
)

REM Process subdirectories (excluding output)
for /d %%D in (*) do (
    if /i not &quot;%%D&quot;==&quot;output&quot; (
        pushd &quot;%%D&quot;
        for %%F in (*.mkv *.mov *.mp4) do (
            set &quot;INPUT_FILE=%%F&quot;
            set &quot;FILENAME=%%~nxF&quot;
            set &quot;OUTPUT_FILE=..\output\%%~nF.mp4&quot;

            echo [INFO] Processing: %%D\!FILENAME!

            REM Get audio count
            &quot;%FFPROBE_PATH%&quot; -v error -select_streams a -show_entries stream=codec_type -of csv=p=0 &quot;!INPUT_FILE!&quot; 2&amp;gt;nul &amp;gt; &quot;%TEMP%\audio_tmp.txt&quot;
            for /f %%A in (&apos;type &quot;%TEMP%\audio_tmp.txt&quot; ^| find /c /v &quot;&quot;&apos;) do set AUDIO_COUNT=%%A
            del &quot;%TEMP%\audio_tmp.txt&quot; 2&amp;gt;nul
            echo   Audio tracks: !AUDIO_COUNT!

            REM Get bitrate
            &quot;%FFPROBE_PATH%&quot; -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 &quot;!INPUT_FILE!&quot; 2&amp;gt;nul &amp;gt; &quot;%TEMP%\bitrate_tmp.txt&quot;
            set /p SOURCE_BITRATE=&amp;lt;&quot;%TEMP%\bitrate_tmp.txt&quot;
            del &quot;%TEMP%\bitrate_tmp.txt&quot; 2&amp;gt;nul
            if &quot;!SOURCE_BITRATE!&quot;==&quot;&quot; set SOURCE_BITRATE=0

            REM Calculate target bitrate
            set TARGET_BITRATE=0
            if !SOURCE_BITRATE! GTR 0 (
                set /a TARGET_BITRATE=!SOURCE_BITRATE!/1000
                echo   Source bitrate: !TARGET_BITRATE! kbps
            )

            REM Build encoding parameters
            set CRF_VALUE=23
            if !TARGET_BITRATE! GTR 0 (
                if !TARGET_BITRATE! LSS 2000 set CRF_VALUE=20
            )

            REM Set video params based on encoder
            if &quot;!HW_ENCODER!&quot;==&quot;h264_nvenc&quot; (
                if !TARGET_BITRATE! GTR 0 (
                    set /a BUF_SIZE=!TARGET_BITRATE!*2
                    set &quot;VIDEO_PARAMS=-c:v h264_nvenc -preset p4 -rc vbr -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k -cq !CRF_VALUE!&quot;
                ) else (
                    set &quot;VIDEO_PARAMS=-c:v h264_nvenc -preset p4 -rc vbr -cq !CRF_VALUE!&quot;
                )
            ) else if &quot;!HW_ENCODER!&quot;==&quot;h264_amf&quot; (
                if !TARGET_BITRATE! GTR 0 (
                    set /a BUF_SIZE=!TARGET_BITRATE!*2
                    set &quot;VIDEO_PARAMS=-c:v h264_amf -quality speed -rc vbr -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k&quot;
                ) else (
                    set &quot;VIDEO_PARAMS=-c:v h264_amf -quality speed -rc vbr&quot;
                )
            ) else if &quot;!HW_ENCODER!&quot;==&quot;h264_qsv&quot; (
                if !TARGET_BITRATE! GTR 0 (
                    set /a BUF_SIZE=!TARGET_BITRATE!*2
                    set &quot;VIDEO_PARAMS=-c:v h264_qsv -preset medium -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k -global_quality !CRF_VALUE!&quot;
                ) else (
                    set &quot;VIDEO_PARAMS=-c:v h264_qsv -preset medium -global_quality !CRF_VALUE!&quot;
                )
            ) else (
                if !TARGET_BITRATE! GEQ 2000 (
                    set /a BUF_SIZE=!TARGET_BITRATE!*2
                    set &quot;VIDEO_PARAMS=-c:v libx264 -preset medium -b:v !TARGET_BITRATE!k -maxrate !TARGET_BITRATE!k -bufsize !BUF_SIZE!k&quot;
                ) else (
                    set &quot;VIDEO_PARAMS=-c:v libx264 -preset medium -crf !CRF_VALUE!&quot;
                )
            )

            set &quot;AUDIO_PARAMS=-c:a aac -b:a 192k -ac 2&quot;

            echo   Encoding...

            REM Execute ffmpeg
            if !AUDIO_COUNT! GTR 1 (
                &quot;%FFMPEG_PATH%&quot; -i &quot;!INPUT_FILE!&quot; -filter_complex &quot;amix=inputs=!AUDIO_COUNT!:duration=longest[a]&quot; -map 0:v -map &quot;[a]&quot; !VIDEO_PARAMS! !AUDIO_PARAMS! -movflags +faststart -y &quot;!OUTPUT_FILE!&quot;
            ) else (
                &quot;%FFMPEG_PATH%&quot; -i &quot;!INPUT_FILE!&quot; !VIDEO_PARAMS! !AUDIO_PARAMS! -movflags +faststart -y &quot;!OUTPUT_FILE!&quot;
            )

            REM Check output
            if exist &quot;!OUTPUT_FILE!&quot; (
                for %%S in (&quot;!OUTPUT_FILE!&quot;) do set FILE_SIZE=%%~zS
                if !FILE_SIZE! GTR 0 (
                    echo   Done
                    set /a SUCCESS+=1
                ) else (
                    echo   Failed: Output file is empty
                    set /a FAIL+=1
                )
            ) else (
                echo   Failed: Output file not created
                set /a FAIL+=1
            )
            echo.
        )
        popd
    )
)

echo ===================================
echo Processing completed!
echo   Success: %SUCCESS%
echo   Failed: %FAIL%
echo   Total: %COUNT%
echo ===================================
echo.
endlocal
pause
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;个人脚本仓库&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;RolinShmily/SrP-Scripts&quot;}&lt;/p&gt;
&lt;p&gt;这个脚本是我根据实际需求开发的，主要用于处理录播文件的音轨合并和格式统一。如果觉得有用，欢迎给个 Star！如果有问题或建议，欢迎提 Issue 或 PR。&lt;/p&gt;
</content:encoded></item><item><title>SrP-IMG | 零成本随机图片API与现代化画廊</title><link>https://blog.srprolin.top/posts/srp-img/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/srp-img/</guid><description>基于Cloudflare Pages/Workers部署的无限流量、零成本、多分类随机图片解决方案。</description><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RolinShmily/SrP-IMG&quot;&gt;SrP-IMG 项目地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://eo-img.srprolin.top&quot;&gt;在线演示地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/&quot;&gt;Cloudflare Pages 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SrP-IMG&lt;/strong&gt; 是一个基于 Cloudflare Pages/Workers 部署的现代化随机图片解决方案。它通过 Python 预构建技术，将静态存储转化为动态随机 API，并提供一个现代化的瀑布流画廊展示界面。&lt;/p&gt;
&lt;h1&gt;目录结构&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;├── oriImg/           # [核心] 原始素材目录
│   ├── h/            # 横屏图片素材（强转为 .jpg）
│   ├── v/            # 竖屏图片素材（强转为 .jpg）
│   └── gif/          # 自定义分类（自动保留 .gif 后缀）
├── public/           # 构建产物目录（存放生成的十六进制图片和元数据）
│   ├── h/、v/、gif/   # 映射后的图片集合
│   └── counts.json   # 自动生成的全站索引文件
├── functions/        # Cloudflare Pages Functions
│   └── pic.js        # 由脚本生成的服务端重定向接口
├── components/       # Next.js 组件
│   └── image-gallery.tsx # 核心画廊组件（映射表逻辑）
├── gen_img.py        # 构建大脑：处理图片命名、后缀识别及生成元数据
├── index.js          # Cloudflare Workers 入口
└── README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;部署指南&lt;/h1&gt;
&lt;h2&gt;1. 素材准备&lt;/h2&gt;
&lt;p&gt;在根目录 &lt;code&gt;oriImg/&lt;/code&gt; 下创建分类文件夹。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;API 专用&lt;/strong&gt;：创建 &lt;code&gt;h&lt;/code&gt; 和 &lt;code&gt;v&lt;/code&gt; 目录，放入横/竖屏图片（这些图片在输出时会固定为 &lt;code&gt;.jpg&lt;/code&gt; 以兼容所有 API 客户端）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自定义分类&lt;/strong&gt;：创建如 &lt;code&gt;gif&lt;/code&gt;、&lt;code&gt;anime&lt;/code&gt; 等目录。脚本会自动取该目录第一张图片的后缀作为该分类的输出后缀&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. Cloudflare Pages/Workers 生产构建&lt;/h2&gt;
&lt;p&gt;在 Cloudflare Pages 仪表板配置如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;框架预设&lt;/strong&gt;：&lt;code&gt;Next.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建命令&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;python3 gen_img.py --hash-length 2 &amp;amp;&amp;amp; npm run build
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输出目录&lt;/strong&gt;：&lt;code&gt;out&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;环境变量&lt;/strong&gt;：确保 Python 环境为 3.8+&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果使用 Cloudflare Workers，则需要配置根目录的 &lt;code&gt;wrangler.jsonc&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;srp-img-worker&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;compatibility_date&quot;: &quot;2026-01-05&quot;,
  &quot;compatibility_flags&quot;: [&quot;nodejs_compat&quot;],
  &quot;assets&quot;: {
    &quot;directory&quot;: &quot;./out&quot;,
    &quot;binding&quot;: &quot;ASSETS&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：请将 &lt;code&gt;name&lt;/code&gt; 改为你要部署的Worker名称；将 &lt;code&gt;compatibility_date&lt;/code&gt; 改为你的部署日期。&lt;/p&gt;
&lt;p&gt;部署命令：&lt;code&gt;npx wrangler deploy&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;使用方式&lt;/h2&gt;
&lt;p&gt;演示地址：&lt;code&gt;https://eo-img.srprolin.top&lt;/code&gt; 仅支持A、B方式。&lt;/p&gt;
&lt;h3&gt;方式 A：服务端 API (JS 重定向)&lt;/h3&gt;
&lt;p&gt;由生成的 &lt;code&gt;functions/pic.js&lt;/code&gt; / &lt;code&gt;index.js&lt;/code&gt; 提供支持，适合在 Markdown 或其他网页中直接引用。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能描述&lt;/th&gt;
&lt;th&gt;调用地址&lt;/th&gt;
&lt;th&gt;返回结果&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;随机横图&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pic?img=h&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;302 重定向至 &lt;code&gt;/h/xxx.jpg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;随机竖图&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pic?img=v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;302 重定向至 &lt;code&gt;/v/xxx.jpg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UA 自动选择&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pic?img=ua&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;手机返回竖图，电脑返回横图&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;方式 B：前端可视化画廊&lt;/h3&gt;
&lt;p&gt;访问部署后的根域名（如 &lt;code&gt;https://your-domain.pages.dev&lt;/code&gt;）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自动适配&lt;/strong&gt;：顶部导航会自动切换 &lt;code&gt;h&lt;/code&gt;、&lt;code&gt;v&lt;/code&gt; 或 &lt;code&gt;gif&lt;/code&gt; 模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;瀑布流展示&lt;/strong&gt;：基于 Next.js 的高性能瀑布流加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;沉浸式预览&lt;/strong&gt;：集成 Fancybox，支持放大、旋转、全屏及下载&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;方式 C：URL 重写 (无感随机)&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;需在 Cloudflare 仪表板手动配置 &lt;strong&gt;Transform Rules&lt;/strong&gt;：&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;请将下列表达式与 &lt;code&gt;&amp;lt;your-domain&amp;gt;&lt;/code&gt; 换成你的域名&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;URL重写规则一：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;匹配表达式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;(http.host eq &quot;&amp;lt;your-domain&amp;gt;&quot; and starts_with(http.request.uri.path, &quot;/h&quot;) and not ends_with(http.request.uri.path, &quot;.jpg&quot;)) or (http.host eq &quot;&amp;lt;your-domain&amp;gt;&quot; and starts_with(http.request.uri.path, &quot;/v&quot;) and not ends_with(http.request.uri.path, &quot;.jpg&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;路径&lt;strong&gt;重写至&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;concat(http.request.uri.path, &quot;/&quot;, substring(uuidv4(cf.random_seed), 0, 2), &quot;.jpg&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;URL重写规则二：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;匹配表达式&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;(http.host eq &quot;&amp;lt;your-domain&amp;gt;&quot; and starts_with(http.request.uri.path, &quot;/gif&quot;) and not ends_with(http.request.uri.path, &quot;.gif&quot;))
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;路径&lt;strong&gt;重写至&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;concat(http.request.uri.path, &quot;/&quot;, substring(uuidv4(cf.random_seed), 0, 2), &quot;.gif&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：如果你的构建命令中 &lt;code&gt;--hash-length&lt;/code&gt; 值为 &lt;code&gt;3&lt;/code&gt;，那么这里 &lt;code&gt;cf.random_seed&lt;/code&gt; 的随机范围右边边界也要从 &lt;code&gt;2&lt;/code&gt; 改为 &lt;code&gt;3&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;URL访问示例：&lt;code&gt;https://your-domain.pages.dev/h&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;关于 &lt;code&gt;gen_img.py&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;脚本执行时会进行以下操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;哈希扩散&lt;/strong&gt;：通过 &lt;code&gt;--hash-length&lt;/code&gt; 指定随机空间。若设为 &lt;code&gt;3&lt;/code&gt;，每个分类会生成 $16^3$ 个访问路径&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后缀策略&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;检查 &lt;code&gt;oriImg&lt;/code&gt; 下每个子目录&lt;/li&gt;
&lt;li&gt;若目录名为 &lt;code&gt;h&lt;/code&gt; 或 &lt;code&gt;v&lt;/code&gt;，输出后缀强制遵循命令行参数（默认 &lt;code&gt;.jpg&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;否则，自动探测该目录首张图片后缀&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元数据导出&lt;/strong&gt;：生成 &lt;code&gt;counts.json&lt;/code&gt;，记录每个分类的图片总数 (&lt;code&gt;counts&lt;/code&gt;) 和对应后缀 (&lt;code&gt;category_exts&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>安装Archlinux+ClaudeCode，PVE小主机焕发第二春</title><link>https://blog.srprolin.top/posts/archlinux-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/archlinux-1/</guid><description>在PVE中安装ArchLinux+niri桌面，并启用核显直通，安装ClaudeCode！</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://arch.icekylin.online/guide/rookie/basic-install.html&quot;&gt;ArchLinux简明指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/SHORiN-KiWATA/Shorin-ArchLinux-Guide/wiki&quot;&gt;ShorinLinuxExperience wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LongQT-sea/intel-igpu-passthru&quot;&gt;intel-igpu-passthru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zcf.ufomiao.com/zh-CN/&quot;&gt;ZCF - Zero-Config Code Flow &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;PVE创建ArchLinux虚拟机&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以下过程，继承自上篇文章 &lt;a href=&quot;https://blog.srprolin.top/posts/2026-03-07-pve-1/&quot;&gt;PVE虚拟系统与OpenWrt配置 &lt;/a&gt; 安装好的PVE9.1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先需要安装一个ArchLinux的镜像ISO文件，下面提供 &lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/&quot;&gt;清华大学开源软件镜像站&lt;/a&gt; 的下载地址:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/archlinux-x86_64.iso&quot;&gt;点击下载最新版 ArchLinux-x86_64.iso&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来我们遵循 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/basic-install.html&quot;&gt;ArchLinux简明指南&lt;/a&gt; 的手动安装教程，因此在虚拟机选择阶段，使用UEFI启动模式：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;子列表&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;常规&lt;/td&gt;
&lt;td&gt;名称&lt;/td&gt;
&lt;td&gt;ArchLinux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;操作系统&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;选择你的ISO镜像文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;机型&lt;/td&gt;
&lt;td&gt;q35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;BIOS&lt;/td&gt;
&lt;td&gt;UEFI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;UEFI存储&lt;/td&gt;
&lt;td&gt;local-lvm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;请不要勾选 &lt;strong&gt;预签名&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;磁盘&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;按需分配大小&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;核心&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;类别&lt;/td&gt;
&lt;td&gt;host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;8192MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;默认网桥vmbr0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;ArchLinux手动安装&lt;/h2&gt;
&lt;p&gt;启动后，点击控制台，这时就可以一边看着 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/basic-install.html&quot;&gt;ArchLinux简明指南-archlinux基础安装&lt;/a&gt;，一边对着控制台操作了。&lt;/p&gt;
&lt;p&gt;在进行到 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/basic-install.html#_7-%E5%88%86%E5%8C%BA%E5%92%8C%E6%A0%BC%E5%BC%8F%E5%8C%96-%E4%BD%BF%E7%94%A8-btrfs-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F&quot;&gt;7. 分区和格式化（使用 Btrfs 文件系统）
&lt;/a&gt; 时，我们要先做一步分区前的设置(在指南中也有提到)，具体就是要 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/basic-install-detail.html#%F0%9F%86%95-%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85&quot;&gt;将虚拟机的磁盘变更为&lt;code&gt;gpt&lt;/code&gt;类型&lt;/a&gt;，两边结合即可正确完成分区操作。&lt;/p&gt;
&lt;p&gt;随后，需要进行一些桌面环境安装前的基础配置，参考 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/desktop-env-and-app.html&quot;&gt;Archlinux简明指南-桌面环境与常用应用安装&lt;/a&gt;，进行一步步操作。&lt;/p&gt;
&lt;p&gt;在进行到 &lt;a href=&quot;https://arch.icekylin.online/guide/rookie/desktop-env-and-app.html#_4-%E5%AE%89%E8%A3%85-kde-plasma-%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83&quot;&gt;4. 安装 KDE Plasma 桌面环境 &lt;/a&gt; 时，跳过该桌面环境，先配置一下非root账户的默认编辑器，并安装&lt;code&gt;yay&lt;/code&gt;以便于安装&lt;code&gt;AUR&lt;/code&gt;中的软件:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用 `vim` 编辑 `~/bashrc` 文件
vim ~/.bashrc
# 在适当位置加入以下内容
export EDITOR=&apos;vim&apos;
# cn 源中的签名（archlinuxcn-keyring 在 archlinuxcn）
sudo pacman -S archlinuxcn-keyring
# yay 命令可以让用户安装 AUR 中的软件（yay 在 archlinuxcn）
sudo pacman -S yay
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;桌面环境推荐使用 &lt;a href=&quot;https://github.com/SHORiN-KiWATA/Shorin-ArchLinux-Guide/wiki/%E4%B8%80%E9%94%AE%E9%85%8D%E7%BD%AE%E6%A1%8C%E9%9D%A2%E7%8E%AF%E5%A2%83&quot;&gt;Shorin-kiwata大佬准备的Niri桌面环境一键安装脚本&lt;/a&gt;，因为该桌面环境的内存占用比较低，对于虚拟机寸土寸金的内存来说，尽量少的内存占用是必要的。&lt;/p&gt;
&lt;p&gt;在大佬的Wiki中给的脚本命令是 &lt;code&gt;curl -L shorin.xyz/archsetup | bash &lt;/code&gt;，这里的&lt;code&gt;shorin.xyz/archsetup&lt;/code&gt;其实是一个重定向短链，其实际指向文件为 &lt;a href=&quot;https://github.com/SHORiN-KiWATA/shorin-arch-setup/blob/main/strap.sh&quot;&gt;shorin-arch-setup仓库中的strap.sh&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;如果你遇到了网络问题，可以使用透明代理，或者直接将 &lt;code&gt;strap.sh&lt;/code&gt; 上传到Arch虚拟机来执行。&lt;/p&gt;
&lt;p&gt;启动脚本后，一切配置默认即可，等待完成后，就可以进入到 &lt;code&gt;Shorin&apos;s Niri&lt;/code&gt; 桌面了，我将带头前往Github给大佬点个Star！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/waybar-top.BuB0-5cu_ZHPgy7.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里是大佬脚本中所安装的软件列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# --- 系统基础 ---

# --- 文件系统与快照 (Btrfs/Snapper) ---
snapper                           # Btrfs 快照管理工具
btrfs-assistant                   # Btrfs 图形化管理 (依赖 snapper)
grub-btrfs                        # GRUB 菜单集成快照引导
inotify-tools                     # 监控文件变动 (grub-btrfsd 自动更新需要)
dosfstools                        # FAT 文件系统支持
ntfs-3g                           # NTFS 读写支持
exfat-utils                       # exFAT 支持
f2fs-tools                        # F2FS 支持
udftools                          # 光盘格式支持
xfsprogs                          # XFS 支持
gnome-disk-utility                # 磁盘管理 GUI (Disks)
baobab                            # 磁盘占用分析器

# --- 音频核心 (Pipewire Stack) ---
pipewire                          # 核心音频/视频引擎
lib32-pipewire                    # 32位兼容库 (Steam 必须)
wireplumber                       # 会话管理器
pipewire-pulse                    # PulseAudio 兼容层
pipewire-alsa                     # ALSA 兼容层
pipewire-jack                     # JACK 兼容层
pavucontrol                       # 音量控制面板
sof-firmware                      # 声卡固件 (Sound Open Firmware)
alsa-ucm-conf                     # ALSA 音频路由配置
alsa-firmware                     # 额外声卡固件

# --- 输入法与字体 (Input &amp;amp; Fonts) ---
fcitx5-im                         # Fcitx5 框架元包
fcitx5-chinese-addons             # 中文扩展 (拼音/云拼音)
fcitx5-rime                       # Rime 引擎
rime-ice-git                      # (AUR) 雾凇拼音配置
fcitx5-mozc                       # 日语输入法
adobe-source-han-serif-cn-fonts   # 思源宋体
adobe-source-han-sans-cn-fonts    # 思源黑体
ttf-liberation                    # 红帽基础英文字体
noto-fonts-emoji                  # Emoji 支持
ttf-jetbrains-mono-nerd           # 编程字体 (带图标)
terminus-font                     # TTY 点阵字体

# --- 硬件与电源 (Hardware) ---
power-profiles-daemon             # 电源模式切换 (省电/平衡)
bluez                             # 蓝牙协议栈
bluetui                           # 蓝牙 TUI 管理工具
usbutils                          # lsusb 工具
pciutils                          # lspci 工具
brightnessctl                     # 屏幕亮度控制
lact                              # 显卡控制中心 (A卡/N卡超频监控)
ddcutil-service                   # (AUR) 外接显示器亮度控制服务
iwd                               # networkmanager的网络后端
impala                            # iwd的tui
# --- 基础包管理 ---
flatpak                           # Flatpak 支持
pacman-contrib                    # Pacman 辅助脚本
gvim                              # 系统默认编辑器 (含 vim)
less                              # 分页查看器

# --- Shorin&apos;s Niri 依赖 ---

# --- Niri 核心组件 ---
xwayland-satellite                # Niri 必装：XWayland 兼容守护进程
swayidle                          # 空闲管理 (自动锁屏/息屏)
hyprlock                          # 锁屏工具 (支持炫酷特效)
swayosd                           # 屏幕 OSD (音量/亮度弹窗)
wlsunset                          # 护眼模式 (色温调节)
wlogout                           # (AUR) 注销/关机/重启菜单

# --- 状态栏与壁纸 ---
waybar                            # 状态栏
waybar-niri-taskbar-git           # (AUR) Waybar 专用 Niri 任务栏模块
swww                              # 动态壁纸守护进程
waypaper                          # (AUR) 壁纸设置 GUI (swww 前端)
waifu2x-ncnn-vulkan               # 图片超分工具 (优化壁纸画质)

# --- 截图与录屏 ---
grim                              # 截图后端
slurp                             # 屏幕选区工具
swappy                            # 截图快速编辑
satty                             # 现代化截图标注工具
wf-recorder                       # 屏幕录制
hyprpicker                        # 屏幕取色器

# --- 剪贴板管理 ---
wl-clipboard                      # Wayland 剪贴板命令
cliphist                          # 剪贴板历史记录
xclip                             # X11 剪贴板兼容
clipnotify                        # X11 剪贴板通知兼容

# --- 外观与主题 (Theming) ---
nwg-look                          # GTK3 主题配置
matugen                           # (AUR) Material You 动态主题生成
gnome-font-viewer                 # 字体预览

# --- 命令行增强 (Shell &amp;amp; CLI) ---
fish                              # 交互式 Shell
starship                          # 终端提示符
fastfetch                         # 系统信息展示
btop                              # 终端任务管理器
yazi                              # 终端文件管理器 (TUI)
eza                               # ls 替代品
zoxide                            # cd 替代品 (智能跳转)
bat                               # cat 替代品 (语法高亮)
jq                                # JSON 处理
imagemagick                       # 图片处理工具集
ffmpegthumbnailer                 # 视频缩略图生成
chafa                             # 终端图片预览后端
timg                              # 终端图片查看器

# --- 常用软件 ---

# --- 互联网与社交 ---
firefox                           # 火狐浏览器
python-pywalfox                   # (AUR) Firefox 随系统变色
linuxqq-appimage                  # (AUR) QQ
wechat-appimage                   # (AUR) 微信
flclash-bin                       # (AUR) 网络代理工具
localsend                         # 局域网传输神器
nm-connection-editor              # 高级网络连接管理
transmission-gtk                  # BT 下载
video-downloader                  # (AUR) 视频下载器 (B站/油管)

# --- 游戏 (Gaming) ---
steam                             # 游戏平台
lutris                            # 综合游戏库管理
heroic-games-launcher-bin         # Epic/GOG 启动器
protonplus                        # Proton 版本管理
mangohud                          # 游戏性能监控浮层
mangojuice-bin                    # (AUR) Mangohud 配置 GUI
gamescope                         # 游戏窗口合成器
lsfg-vk-bin                       # (AUR) 游戏补帧工具 (LSFG)

# --- 生产力与多媒体 ---
visual-studio-code-bin            # (AUR) VS Code 代码编辑器
typora-free                       # Markdown 编辑器
mpv                               # 视频播放器
imv                               # 图片查看器
obs-studio                        # 推流与录屏
cava                              # 音频可视化频谱
upscaler                          # 图片无损放大 GUI
mission-center                    # 系统监视器 (Win11 风格)
gnome-calendar                    # 日历
gnome-clocks                      # 时钟
virt-manager                      # KVM 虚拟机管理
wine                              # 运行 Windows 程序

# --- Flatpak 应用 ---
# (建议使用 flatpak install 安装，而非 pacman)
# it.mijorus.gearlever            # AppImage 管理器
# io.github.fabrialberio.pinapp   # 网页转本地应用 (PinApp)
# com.github.wwmm.easyeffects     # 系统级音频特效 (降噪/均衡器)
# com.github.tchx84.Flatseal      # Flatpak 权限管理
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;PVE核显直通&lt;/h1&gt;
&lt;p&gt;这里以 &lt;code&gt;Intel-N100&lt;/code&gt; 芯片为例.&lt;/p&gt;
&lt;p&gt;先去往archlinux虚拟机(要接管核显的系统)，安装intel显卡驱动：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo pacman -S mesa lib32-mesa vulkan-intel lib32-vulkan-intel
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再前往PVE的后台，进入Shell控制台，输入以下命令，屏蔽intel核显，以防止pve率先使用核显:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用nano编辑器，`Ctrl+x`保存修改，`y`确认，再按`enter`保存文件名
nano /etc/modprobe.d/pve-blacklist.conf
# 打开黑名单，添加如下内容
blacklist i915
blacklist snd_hda_intel
# 保存退出后，执行命令
update-initramfs -u -k all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了让核显完美地被archlinux虚拟机调用，需要下载对应的核显ROM，这里给到github上已有的项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LongQT-sea/intel-igpu-passthru&quot;&gt;intel-igpu-passthru&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;复制好对应的核显ROM下载地址，然后回到PVE的Shell，进行导入(使用wget方式)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入kvm目录
cd /usr/share/kvm/
# wget下载对应rom
wget https://github.com/LongQT-sea/intel-igpu-passthru/releases/download/v0.1/ADL-N_TWL_GOPv21_igd.rom
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过命令行方式编辑虚拟机硬件，这里我的archlinux虚拟机编号为&lt;code&gt;101&lt;/code&gt;，因此我需要编辑&lt;code&gt;101.conf&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 编辑虚拟机配置文件
nano /etc/pve/qemu-server/101.conf
# 在文件首行添加如下内容
args: -set device.hostpci0.bus=pci.0 -set device.hostpci0.addr=2.0 -set device.hostpci0.x-igd-opregion=on
# 在文件末尾添加PCI设备(UHD核显+板载声卡)(注意修改rom文件名)
hostpci0: 0000:00:02.0,romfile=ADL-N_TWL_GOPv21_igd.rom
hostpci1: 0000:00:1f.3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回到PVE的archlinux虚拟机硬件，查看声卡IMMUO是否与其他要用的设备冲突，判断是否取消直通声卡，同理，也可以在这里直通USB控制器，以便于连接键鼠。&lt;/p&gt;
&lt;p&gt;最后，先关闭所有虚拟机，再重启PVE系统，连接好显示设备，启动Archlinux虚拟机，就可以看到登录界面了！&lt;/p&gt;
&lt;h1&gt;ClaudeCode AI CLI&lt;/h1&gt;
&lt;p&gt;以我刚刚配置好的archlinux为例。&lt;/p&gt;
&lt;p&gt;这里推荐使用 &lt;a href=&quot;https://zcf.ufomiao.com/zh-CN/&quot;&gt;ZCF - Zero-Config Code Flow &lt;/a&gt; 工具，一键配置ClaudeCode。&lt;/p&gt;
&lt;p&gt;首先确保机器环境中安装了&lt;code&gt;Node.js&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查版本
node -v
npm -v
npx -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若没有，请到 &lt;a href=&quot;https://nodejs.org/zh-cn/download&quot;&gt;Node.js&lt;/a&gt; 官网安装node(这里给到默认安装命令)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 下载并安装 nvm：
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

# 代替重启 shell
\. &quot;$HOME/.nvm/nvm.sh&quot;

# 下载并安装 Node.js：
nvm install 24

# 验证 Node.js 版本：
node -v # Should print &quot;v24.14.0&quot;.

# 验证 npm 版本：
npm -v # Should print &quot;11.9.0&quot;.
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你是Windows系统，我们需要在终端中输入&lt;code&gt;Set-ExecutionPolicy RemoteSigned&lt;/code&gt;，以便于&lt;code&gt;npm&lt;/code&gt;被系统正常识别。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打开终端(Shorin&apos;s Niri默认快捷键&lt;code&gt;Super+T&lt;/code&gt;)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 切换为bash环境(Shorin&apos;s Niri默认使用了fish，提供非常友好的命令补全，但不兼容bash)
bash
# 一键应用zcf
npx zcf init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后就是跟着配置即可，在API配置中可以选择 &lt;strong&gt;稍后进行&lt;/strong&gt;，下面将介绍如何接入 &lt;strong&gt;GLM Coding Plan&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;GLM Coding Plan接入&lt;/h2&gt;
&lt;p&gt;先到&lt;a href=&quot;https://bigmodel.cn/usercenter/proj-mgmt/apikeys&quot;&gt;API Key&lt;/a&gt;中申请一个apikey并复制保存。&lt;/p&gt;
&lt;p&gt;接下来，打开终端，输入以下命令接入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 切换到bash
bash
# 自动化脚本
curl -O &quot;https://cdn.bigmodel.cn/install/claude_code_env.sh&quot; &amp;amp;&amp;amp; bash ./claude_code_env.sh
# 根据提示，输入提前准备好的apikey即可
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>PVE虚拟系统与OpenWrt配置</title><link>https://blog.srprolin.top/posts/2026-03-07-pve-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-03-07-pve-1/</guid><description>基于N100小主机的All-In-One设备，安装PVE并部署OpenWrt。</description><pubDate>Sat, 07 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.buernuc.com/detail?did=9&quot;&gt;BREN6M-N100迷你主机&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://etcher.balena.io/&quot;&gt;balenaEther 写盘工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pve.proxmox.com/wiki/Main_Page&quot;&gt;Proxmox VE 虚拟环境系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.right.com.cn/forum/forum.php&quot;&gt;恩山无线论坛&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;PVE9.1的安装&lt;/h1&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://www.proxmox.com/en/downloads&quot;&gt;Proxmox VE 虚拟环境系统 官方下载页&lt;/a&gt;，下载 &lt;strong&gt;Proxmox VE 9.1 ISO Installer&lt;/strong&gt; 。&lt;/p&gt;
&lt;p&gt;进入  &lt;a href=&quot;https://etcher.balena.io/&quot;&gt;balenaEther 写盘工具&lt;/a&gt; 官网，下载写盘工具，并准备一个不用的 U盘，存储 16G 左右。&lt;/p&gt;
&lt;p&gt;下载完成后，将 U盘 插入个人PC中，打开 &lt;strong&gt;balenaEther&lt;/strong&gt; 软件，选择 PVE9.1的ISO镜像文件，选择存储对象为 U盘，执行烧录。&lt;/p&gt;
&lt;p&gt;请确保N100具有至少一块硬盘设备，用于安装PVE系统本体。&lt;/p&gt;
&lt;p&gt;将刷好ISO的U盘插入 N100 小主机，再连接 显示设备 (HDMI/DP) 和 鼠标、键盘 (USB) 以及 将网口1 (RJ45)连接至PC，然后启动 N100 小主机，在屏幕点亮时，疯狂点按 &lt;code&gt;Delete&lt;/code&gt; 键，进入主板 BIOS。&lt;/p&gt;
&lt;p&gt;开启主板CPU核芯显卡的 &lt;strong&gt;VT-d&lt;/strong&gt; 模式、&lt;strong&gt;初始化iGPU&lt;/strong&gt; 和 &lt;strong&gt;大于4G空间地址解码&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;进入BIOS启动项，将已插入的 U盘设备 设置为 &lt;strong&gt;第一启动项&lt;/strong&gt;，保存并退出BIOS，进行自动重启。&lt;/p&gt;
&lt;h2&gt;PVE界面安装向导&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-03_22-24-45.BX4meRIX_Z1Fqwox.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;默认第一项，使用图形化安装方式，接下来依次是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接收用户协议&lt;/li&gt;
&lt;li&gt;选择安装硬盘&lt;/li&gt;
&lt;li&gt;选择国家、时区&lt;/li&gt;
&lt;li&gt;输入密码、邮箱&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-03_22-36-55.Ca3FHasg_Z1IlDj4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里的第一项是选择管理网口，我们在启动小主机之前，已经将网口1(这里显示为绿色nic0)连接至PC，那么网口1就作为了PVE的管理网口。随后设置 hostname，可以设置为 &lt;code&gt;pve.local&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;我们独立设置一个网段用于All in One设备：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP Address(PVE的IP地址):&lt;code&gt;192.168.22.111&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Gateway(网关):&lt;code&gt;192.168.22.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DNS(阿里云):&lt;code&gt;223.5.5.5&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后等待安装成功，然后 &lt;strong&gt;拔掉U盘&lt;/strong&gt;，再点击 &lt;strong&gt;reboot&lt;/strong&gt; 重启PVE。&lt;/p&gt;
&lt;p&gt;等再次出现界面，就会有提示，Web管理页URL为：&lt;code&gt;http://192.168.22.111:8006&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;随后在PC的网络设置中，手动设置PC的IP处于和PVE同一网段：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-03_22-49-14.Cwv9vlyJ_Z20BbyR.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样设置后，便可在PC浏览器通过&lt;code&gt;http://192.168.22.111:8006&lt;/code&gt;访问PVE后台，默认用户名为 &lt;code&gt;root&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;OpenWrt软路由系统安装&lt;/h1&gt;
&lt;p&gt;首先，&lt;a href=&quot;https://openwrt.org/&quot;&gt;OpenWrt官网&lt;/a&gt; 中的系统镜像是非常纯净的，一些拓展包并没有直接放在系统镜像中，所以这里更推荐去 &lt;a href=&quot;https://www.right.com.cn/forum/forum.php&quot;&gt;恩山无线论坛&lt;/a&gt; 中寻找社区已经打包好的系统。&lt;/p&gt;
&lt;p&gt;这里给到我所使用的一个OpenWrt镜像：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.right.com.cn/forum/thread-8464111-1-1.html&quot;&gt;LsymOS: openwrt-x86-64-generic-squashfs-combined-efi.img&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下载&lt;code&gt;img&lt;/code&gt;镜像文件后，上传至PVE系统。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-06_11-05-14.CptNx3g3_1TS9V.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后，点击 &lt;strong&gt;创建虚拟机&lt;/strong&gt; ，注意虚拟机编号，首个虚拟机默认为 &lt;code&gt;100&lt;/code&gt; ：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;子列表&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;常规&lt;/td&gt;
&lt;td&gt;名称&lt;/td&gt;
&lt;td&gt;OpenWrt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;操作系统&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;不使用任何介质&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;机型&lt;/td&gt;
&lt;td&gt;q35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;BIOS&lt;/td&gt;
&lt;td&gt;UEFI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;UEFI存储&lt;/td&gt;
&lt;td&gt;local-lvm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;系统&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;请不要勾选 &lt;strong&gt;预签名&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;磁盘&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;删除掉默认分配磁盘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;核心&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;类别&lt;/td&gt;
&lt;td&gt;host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;1024MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;网络&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;默认网桥vmbr0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;然后，进入PVE的shell中，为OpenWrt导入系统盘：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;qm importdisk 100 /var/lib/vz/template/iso/openwrt-x86-64-generic-squashfs-combined-efi.img local-lvm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明，一般情况下只需修改镜像文件名：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;100&lt;/code&gt;：虚拟机编号&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openwrt-x86-64-generic-squashfs-combined-efi.img&lt;/code&gt;：镜像文件名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;local-lvm&lt;/code&gt;：虚拟存储地址&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;等待导入完毕后，回到OpenWrt的 &lt;strong&gt;硬件&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;双击未使用磁盘，点击确定以启用。&lt;/p&gt;
&lt;p&gt;再前往 &lt;strong&gt;选项&lt;/strong&gt; -&amp;gt; &lt;strong&gt;引导顺序&lt;/strong&gt;：
仅勾选新添加的磁盘，例如 &lt;strong&gt;scsi0&lt;/strong&gt; ，最后启动该虚拟机。&lt;/p&gt;
&lt;h2&gt;OpenWrt系统配置&lt;/h2&gt;
&lt;p&gt;进入OpenWrt的控制台shell中后，输入如下命令更改基础网络配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;vi /etc/config/network
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改LAN口的 &lt;strong&gt;ip_address&lt;/strong&gt; 为 &lt;code&gt;192.168.22.1&lt;/code&gt; ，这对应着PVE最初设置的网关地址。&lt;/p&gt;
&lt;p&gt;注意，这里用到的vim编辑器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;键入&lt;code&gt;i&lt;/code&gt;进入编辑模式&lt;/li&gt;
&lt;li&gt;键入&lt;code&gt;esc&lt;/code&gt;退出编辑模式，回到阅览模式&lt;/li&gt;
&lt;li&gt;键入&lt;code&gt;:&lt;/code&gt;进入命令模式，紧跟输入&lt;code&gt;wq&lt;/code&gt;进行保存和退出&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后输入命令&lt;code&gt;reboot&lt;/code&gt;或者点击PVE的重启按钮，来重启虚拟机。&lt;/p&gt;
&lt;p&gt;等待重启完成，我们这时就可以用PC来访问OpenWrt的后台了，地址为：&lt;code&gt;http://192.168.22.1&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;网络配置&lt;/h2&gt;
&lt;p&gt;现在我们仍有一个网口，甚至还有一个ax101网卡，那么就有两种方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用物理网口2来作为wan口连接外网&lt;/li&gt;
&lt;li&gt;用无线网卡扫描连接外网Wi-Fi作为wan口上网&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;物理网口2上网&lt;/h3&gt;
&lt;p&gt;首先到PVE后台，创建WAN口网桥：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-07_13-27-27.BMfA73qF_281YLs.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后在OpenWrt虚拟机的硬件里，添加该网络 &lt;code&gt;vmbr1&lt;/code&gt;，并在物理网口2上插上连接外网的网线。&lt;/p&gt;
&lt;p&gt;进入OpenWrt的后台，进入 &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; &lt;strong&gt;网口配置&lt;/strong&gt;，将&lt;code&gt;eth0&lt;/code&gt;(vmbr0、物理网口1)接入&lt;code&gt;LAN&lt;/code&gt;,将&lt;code&gt;eth1&lt;/code&gt;(vmbr1、物理网口2)接入&lt;code&gt;WAN&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;再进入 &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; &lt;strong&gt;防火墙&lt;/strong&gt;，打开数据接收：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-07_13-32-16.Cjd9iQrA_Zl30wM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待网络连接成功，在PVE中将OpenWrt设置为开机自启动，并在PC网络中打开DHCP。&lt;/p&gt;
&lt;h3&gt;无线网卡上网&lt;/h3&gt;
&lt;p&gt;这次我们来到PVE后台，需要为OpenWrt直通AX101(例)无线网卡硬件，请先关闭OpenWrt系统：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-07_13-40-41.C_pq9y-N_1e0rm0.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后启动OpenWrt系统，以便识别直通硬件。&lt;/p&gt;
&lt;p&gt;再进入OpenWrt后台页面，进入 &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; &lt;strong&gt;无线&lt;/strong&gt;，选择识别到的网卡，进行连接Wi-Fi：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-07_13-45-57.CfSobgKO_1st9Ub.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;连接成功后，一般将直接分配一个&lt;code&gt;wwan&lt;/code&gt;配置，作为外网的入点，随后配置防火墙。&lt;/p&gt;
&lt;p&gt;进入 &lt;strong&gt;网络&lt;/strong&gt; -&amp;gt; &lt;strong&gt;防火墙&lt;/strong&gt;，打开数据接收：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-07_13-32-16.Cjd9iQrA_Zl30wM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;等待网络连接成功，在PVE中将OpenWrt设置为开机自启动，并在PC网络中打开DHCP。&lt;/p&gt;
&lt;h3&gt;路由器AP无线WI-FI传播&lt;/h3&gt;
&lt;p&gt;这里我的机器只有两个物理网口，由于要连接路由器做AP，因此我这里以无线网卡上网为例。&lt;/p&gt;
&lt;p&gt;这时我们会空余一个物理网口2，然后进入PVE后台的网络配置，将&lt;code&gt;nic1&lt;/code&gt;(物理网口2)也添加进&lt;code&gt;vmbr0&lt;/code&gt;(LAN)网桥。&lt;/p&gt;
&lt;p&gt;我们要先对路由器进行一些设置，用网线连接PC与路由器，查看网关，在浏览器中输入网关地址，进入路由器后台。&lt;/p&gt;
&lt;p&gt;随后可以参考之前的文章 &lt;a href=&quot;https://blog.srprolin.top/posts/2026-02-11-router_1/&quot;&gt;家庭网络连接 | 路由器接入方式 | 旁路由上网 | Router&lt;/a&gt; 中，关于 &lt;strong&gt;LAN口入网&lt;/strong&gt; 的详细配置。&lt;/p&gt;
&lt;p&gt;主流路由器现在都有工作模式选择的权利，以我使用的 &lt;strong&gt;锐捷 RG-MA3063(中国移动)&lt;/strong&gt; 为例，就可以直接选择 &lt;strong&gt;桥模式&lt;/strong&gt;，以避免繁杂的DHCP与IP设置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-03-07_13-55-54.HZ5WaQJ-_Z1wD3YC.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;深澜Srun校园网认证系统&lt;/h2&gt;
&lt;p&gt;笔者使用无线网卡上网，便是连接的校园网，有幸在 &lt;strong&gt;GitHub&lt;/strong&gt; 上找到了HAUT的OpenWrt自动登录脚本，在此鸣谢：&lt;a href=&quot;https://github.com/yellowpeachxgp/HAUTNetworkGuard&quot;&gt;HAUT Network Guard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;笔者在这里也找到了一些有关深澜Srun系统的项目：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/coffeehat/BIT-srun-login-script&quot;&gt;BIT-srun-login-script&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Mmx233/BitSrunLoginGo&quot;&gt;BitSrunLoginGo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>AstrBot部署 | Mac Mini | Docker容器化</title><link>https://blog.srprolin.top/posts/2026-02-26-astrbot-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-26-astrbot-1/</guid><description>使用MacMini搭建OpenClaw平替机器人——AstrBot，采用docker容器化管理，实现QQ群聊机器人自由。</description><pubDate>Thu, 26 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astrbot.app/what-is-astrbot.html&quot;&gt;AstrBot项目文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://napcat.napneko.icu/guide/start-install&quot;&gt;NapCat项目文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.orbstack.dev/&quot;&gt;orbstack项目文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;精简docker安装&lt;/h1&gt;
&lt;p&gt;首先，确保你的macOS环境中安装了Homebrew：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 检查版本
brew --version
# 安装Homebrew
curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后，安装orbstack作为docker的运行平台，再安装docker和compose：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install --cask orbstack docker docker-compose
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;orbstack相关命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 开机
orb start
# 状态
orb status
# 下机
orb stop
# 配置docker
orb config docker
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确保orbstack处于运行状态，最后运行命令 &lt;strong&gt;配置docker&lt;/strong&gt;，设置一下镜像源：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;registry-mirrors&quot;: [
    &quot;https://docker.m.daocloud.io&quot;,
    &quot;https://docker.1panel.live/&quot;
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里用到了vim编辑器，首次进入是 &lt;strong&gt;查看&lt;/strong&gt; 模式，轻触 &lt;code&gt;I&lt;/code&gt; 键进入写入模式，&lt;code&gt;ESC&lt;/code&gt; 退出当前模式，键入 &lt;code&gt;:&lt;/code&gt; 进入命令模式，输入 &lt;code&gt;wq&lt;/code&gt; 进行保存和退出。&lt;/p&gt;
&lt;h1&gt;部署astrbot和napcat&lt;/h1&gt;
&lt;p&gt;这里使用官方文档自带的部署方式，同时安装napcat：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir astrbot
cd astrbot
wget https://raw.githubusercontent.com/NapNeko/NapCat-Docker/main/compose/astrbot.yml
sudo docker compose -f astrbot.yml up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果网络问题获取不到compose文件，下面是官方的 &lt;code&gt;astrbot.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# docker-compose.yml
# NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker-compose -f ./compose/astrbot.yml up -d
services:
  napcat:
    environment:
      - NAPCAT_UID=${NAPCAT_UID:-1000}
      - NAPCAT_GID=${NAPCAT_GID:-1000}
      - MODE=astrbot
    ports:
      - 6099:6099
    container_name: napcat
    restart: always
    image: mlikiowa/napcat-docker:latest
    volumes:
      - ./data:/AstrBot/data
      - ./napcat/config:/app/napcat/config
      - ./ntqq:/app/.config/QQ
    networks:
      - astrbot_network
    #mac_address: &quot;02:42:ac:11:00:02&quot;
  astrbot:
    environment:
      - TZ=Asia/Shanghai
    image: soulter/astrbot:latest
    container_name: astrbot
    restart: always
    ports:
      - &quot;6185:6185&quot;
      #- &quot;6195:6195&quot;
      #- &quot;6199:6199&quot;
    volumes:
      - ./data:/AstrBot/data
    networks:
      - astrbot_network
networks:
  astrbot_network:
    driver: bridge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署完成后，查看容器日志：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker logs napcat
sudo docker logs astrbot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意查看astrbot和napcat的WebUI地址和token信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;astrbot的账密默认为 &lt;code&gt;astrbot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;napcat的默认token在日志中随机生成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后进入astrbot的webui，设置适配器：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-26_21-33-29.E3HqguCE_Z1huM6m.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后进入napcat的webui，登录要作为机器人的QQ号，进行网络设置:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-26_21-35-08.O8vHNx4a_Z27r9Cd.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;至此，就可以在astrbot的平台日志中，看到机器人接收消息的logs了。&lt;/p&gt;
&lt;p&gt;最后就是配置模型服务商，进行astrbot本体插件的必要设置后，就可以使用了。&lt;/p&gt;
&lt;h2&gt;sandbox沙箱环境配置&lt;/h2&gt;
&lt;p&gt;在astrbot中，如果让大模型调用电脑能力来实现功能(python、matlab画图)，一般需要配置沙箱环境，让AI的操作不伤害到宿主机。&lt;/p&gt;
&lt;p&gt;官方推荐使用 &lt;a href=&quot;https://github.com/AstrBotDevs/shipyard&quot;&gt;Shipyard&lt;/a&gt; 项目来实现沙箱环境：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir astrbot-shipyard
cd astrbot-shipyard
wget https://raw.githubusercontent.com/AstrBotDevs/shipyard/refs/heads/main/pkgs/bay/docker-compose.yml -O docker-compose.yml
# 修改 compose-with-shipyard.yml 文件中的环境变量配置，例如 Shipyard 的 access token 等
docker compose -f docker-compose.yml up -d
docker pull soulter/shipyard-ship:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里还是给出compose文件的内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3.8&apos;

services:
  shipyard:
    image: soulter/shipyard-bay:latest
    ports:
      # API port (public, for agent access)
      - &quot;8156:8156&quot;
      # Dashboard port (optional, can be hidden behind NAT)
      - &quot;8157:8157&quot;
    environment:
      - PORT=8156
      - DATABASE_URL=sqlite+aiosqlite:///./data/bay.db
      - ACCESS_TOKEN=secret-token
      - MAX_SHIP_NUM=10
      - BEHAVIOR_AFTER_MAX_SHIP=reject
      - CONTAINER_DRIVER=docker
      - DOCKER_IMAGE=soulter/shipyard-ship:latest
      - DOCKER_NETWORK=shipyard_network
      - SHIP_DATA_DIR=${PWD}/data/shipyard/ship_mnt_data
      - DEFAULT_SHIP_CPUS=1.0
      - DEFAULT_SHIP_MEMORY=512m
    volumes:
      - ${PWD}/data/shipyard/bay_data:/app/data
      - /var/run/docker.sock:/var/run/docker.sock:ro
    networks:
      - shipyard

networks:
  shipyard:
    name: shipyard_network
    external: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以在compose文件里设置 &lt;code&gt;ACCESS_TOKEN&lt;/code&gt;：将 &lt;code&gt;secret-token&lt;/code&gt; 改为预设值即可。&lt;/p&gt;
&lt;p&gt;随后在astrbot的 &lt;strong&gt;配置文件 -&amp;gt; 普通配置&lt;/strong&gt; 中即可设置启用sandbox环境：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-26_21-39-58.DfGqtRIz_ZFJhYn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;插件的安装&lt;/h2&gt;
&lt;p&gt;在astrbot插件市场中有非常多各种各样的插件，这使得astrbot机器人的功能变得丰富多样，这里以 &lt;strong&gt;API聚合&lt;/strong&gt; 插件为例。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-26_21-46-53.CEkqeawm_Z1cvCmK.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;一般来说点击安装即可，随后会弹出该插件的说明文档，这里通常有一些注意事项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-26_21-50-05._Y28WiYr_b1MsH.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里提到的 &lt;strong&gt;倾梦API&lt;/strong&gt; 需要自行手动获取key，再去到webui界面进行配置。&lt;/p&gt;
&lt;p&gt;由于我们的astrbot安装在docker中，docker的网络端口只有映射出来的，宿主机才能访问。&lt;/p&gt;
&lt;p&gt;因此我们需要对 &lt;code&gt;astrbot.yml&lt;/code&gt; 进行修改:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ...
  astrbot:
# ...
    ports:
      - &quot;6185:6185&quot;
# 在这里添加4141的端口映射
      - &quot;4141:4141&quot;
# ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后重新以docker-compose重启astrbot即可：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/astrbot
sudo docker stop astrbot
sudo docker compose -f astrbot.yml up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时再访问4141端口就可以访问到 &lt;strong&gt;API聚合&lt;/strong&gt; 插件的webUI界面了。&lt;/p&gt;
</content:encoded></item><item><title>中科云数据胶囊——免费大容量的S3云笔记obsidian同步空间</title><link>https://blog.srprolin.top/posts/2026-02-24-s3-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-24-s3-1/</guid><description>中国科技云-数据胶囊-20G免费存储空间，支持S3、WebDav等多种方式，搭配obsidian-remotely_save插件实现笔记云同步。</description><pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://passport.escience.cn/&quot;&gt;中国科技云通行证&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://data.cstcloud.cn/&quot;&gt;中国科技云数据胶囊&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://baike.baidu.com/item/%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81/66719338&quot;&gt;国家网络身份认证--百度百科&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://baike.baidu.com/item/%E3%80%8A%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E5%85%AC%E5%85%B1%E6%9C%8D%E5%8A%A1%E7%AE%A1%E7%90%86%E5%8A%9E%E6%B3%95%E3%80%8B/64707134?fromModule=lemma_inlink&quot;&gt;国家网络身份认证公共服务管理办法--百度百科&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/remotely-save/remotely-save&quot;&gt;remotely-save&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://obsidian.md/download&quot;&gt;obsidian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;中科院国家队的对象存储--中科云数据胶囊&lt;/h1&gt;
&lt;p&gt;首先推荐注册 &lt;a href=&quot;https://passport.escience.cn/&quot;&gt;中国科技云通行证&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1551.DDGsHz1__ZOsh6e.webp&quot; alt=&quot;中科云通行证&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里填写的 &lt;strong&gt;手机号实名信息&lt;/strong&gt; 要与上边的 &lt;strong&gt;真实姓名&lt;/strong&gt; 一致；账号邮箱地址填写国内邮箱，例如qq和163。&lt;/p&gt;
&lt;p&gt;随后前往 &lt;a href=&quot;https://data.cstcloud.cn/&quot;&gt;中国科技云数据胶囊&lt;/a&gt; 选择 &lt;strong&gt;中国科技云通行证&lt;/strong&gt; 进行登录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1555.CFEGPrvJ_Z2tH0UE.webp&quot; alt=&quot;中科云数据胶囊&quot; /&gt;&lt;/p&gt;
&lt;p&gt;未实名用户只有1GB存储空间，且无法使用客户端访问数据(S3、WebDav等)，因此需要进行实名认证，首先到 &lt;a href=&quot;https://data.cstcloud.cn/my/account&quot;&gt;中科云数据胶囊的账户信息&lt;/a&gt;，选择实名认证。&lt;/p&gt;
&lt;p&gt;这里需要用到 &lt;strong&gt;国家网络身份认证&lt;/strong&gt; APP申领网号来进行实名，在手机应用商店中直接搜索即可下载。&lt;/p&gt;
&lt;p&gt;下面引用百度百科的申领教程：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1730.cYnHXPBz_ZtxsDM.webp&quot; alt=&quot;选择证件类型&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1731.DApAd0aJ_25TXQm.webp&quot; alt=&quot;NFC识别身份证&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1732.BD8-oaI7_qdB7R.webp&quot; alt=&quot;进行人脸识别&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1733.CQFSeEKR_KDbpN.webp&quot; alt=&quot;关联手机号&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24-1734.Gm__JsGA_biqHu.webp&quot; alt=&quot;设置凭证口令&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这样就能成功领取到你的 &lt;strong&gt;网号&lt;/strong&gt; ，相关法规科普见 &lt;a href=&quot;https://baike.baidu.com/item/%E3%80%8A%E5%9B%BD%E5%AE%B6%E7%BD%91%E7%BB%9C%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E5%85%AC%E5%85%B1%E6%9C%8D%E5%8A%A1%E7%AE%A1%E7%90%86%E5%8A%9E%E6%B3%95%E3%80%8B/64707134?fromModule=lemma_inlink&quot;&gt;国家网络身份认证公共服务管理办法--百度百科&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;最后在 &lt;strong&gt;国家网络身份认证&lt;/strong&gt; APP中扫描中科云数据胶囊的实名认证二维码，即可获得20GB免费存储空间。&lt;/p&gt;
&lt;p&gt;这里也可以进行微信绑定，可以随时将微信中的文件上传到该数据胶囊。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24_16-05-06.COkJVCTw_Z1DDIwn.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;中科云数据胶囊已经自动分成了几个类别空间，我们最终将使 &lt;strong&gt;笔记&lt;/strong&gt; 作为obsidian云同步的基地。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24_16-07-50.DmGIG6Zr_ZTKJgE.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;获取中科云数据胶囊S3客户端信息&lt;/h1&gt;
&lt;p&gt;选择 &lt;strong&gt;客户端访问&lt;/strong&gt; &lt;strong&gt;笔记&lt;/strong&gt; ，来到S3客户端信息处：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24_16-15-53.B2bVe4BS_Z1Sr9Ni.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;记下信息(例)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Endpoint: s3.endpoint&lt;/li&gt;
&lt;li&gt;Bucket: s3-bucket&lt;/li&gt;
&lt;li&gt;AccessKey ID&lt;/li&gt;
&lt;li&gt;AccessKey Secret&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;使用Remotely Save云同步obsidian笔记&lt;/h1&gt;
&lt;p&gt;首先进入Obsidian的设置页面，选择 &lt;strong&gt;第三方插件&lt;/strong&gt;，关闭 &lt;strong&gt;安全模式&lt;/strong&gt; 后，浏览 &lt;strong&gt;插件市场&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24_16-20-50.Dqom_He-_S031z.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;搜索并安装 &lt;strong&gt;Remotely Save&lt;/strong&gt; 插件，进入选项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24_16-24-54.IxCrItpo_7Dqvu.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;填写完必要信息后，进行连接测试，成功后自行选择同步策略。&lt;/p&gt;
&lt;p&gt;回到obsidian仓库，随意编写一个markdown，在侧边快捷栏会出现 &lt;strong&gt;Remotely Save&lt;/strong&gt; 的同步按钮。&lt;/p&gt;
&lt;p&gt;同步之后，回到中科云数据胶囊的 &lt;strong&gt;笔记&lt;/strong&gt;，即可看到被同步的文件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-24_16-29-52.BWd7UGxG_Z1VjtGD.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Folo创作者所有权认证文章</title><link>https://blog.srprolin.top/posts/2026-02-23-folo/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-23-folo/</guid><description>Folo创作者所有权认证文章</description><pubDate>Mon, 23 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This message is used to verify that this feed (feedId:248766985642333184) belongs to me (userId:202297656391504896). Join me in enjoying the next generation information browser https://folo.is.&lt;/p&gt;
</content:encoded></item><item><title>家庭网络连接 | 路由器接入方式 | 旁路由上网 | Router</title><link>https://blog.srprolin.top/posts/2026-02-11-router_1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-11-router_1/</guid><description>笔者首次摸索家庭网络总结的相关概念和路由设置，附带网络层级相关知识。</description><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;路由器与光猫&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;路由器（Router）是连接两个或多个网络的硬件设备，在网络间起网关的作用，是读取每一个数据包中的地址然后决定如何传送的专用智能性的网络设备。————来自&lt;a href=&quot;https://baike.baidu.com/item/%E8%B7%AF%E7%94%B1%E5%99%A8/108294&quot;&gt;百度百科&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;光调制解调器，也称为单端口光端机或光猫，是针对特殊用户环境而研发的一种三件一套的光纤传输设备。————来自&lt;a href=&quot;https://baike.baidu.com/item/%E5%85%89%E8%B0%83%E5%88%B6%E8%A7%A3%E8%B0%83%E5%99%A8&quot;&gt;百度百科&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于当前普遍光纤入户的家庭网络来说，光猫(光调制解调器)被特殊集成了路由器功能。&lt;/p&gt;
&lt;p&gt;然而光猫的本职工作最初只是将光信号转换为电信号，因此家庭光猫也可以视作一个路由器对待。&lt;/p&gt;
&lt;h1&gt;网络分层与网络类型&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;图片内容来自 &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C&quot;&gt;维基百科&lt;/a&gt; 和 &lt;a href=&quot;https://www.runoob.com/w3cnote/summary-of-network.html&quot;&gt;菜鸟教程&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/screenshot-2026-02-11-at-14-04-31.TkfrDZhT_Z1fdtVt.webp&quot; alt=&quot;网络类型&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/1538030296-7490-20150904094019903-1923900106.NXj9Zztt_AilNe.webp&quot; alt=&quot;网络分层&quot; /&gt;&lt;/p&gt;
&lt;p&gt;路由器是一个工作在网络层的硬件设备，只能作用于网络层及其之上的网络层级。&lt;/p&gt;
&lt;h1&gt;路由器工作方式&lt;/h1&gt;
&lt;p&gt;对于只有一台终端路由设备的家庭网络而言，通常光猫会工作在 &lt;strong&gt;路由&lt;/strong&gt; 模式下，此时这就是一个带光电转换功能的路由器，核心功能是进行 &lt;strong&gt;宽带PPPoE拨号&lt;/strong&gt; 和 &lt;strong&gt;DHCP自动分配IP&lt;/strong&gt;，前者是让光猫通过数据链路层与服务商对接，后者是为家庭内网设备分配子网IP。没有IP的设备无法在广域网中准确接收信息，也就是无法上网，因此家庭网络中一定要有一个启用DHCP功能的设备。&lt;/p&gt;
&lt;p&gt;WLAN无线局域网已然成为刚需，部分光猫尽管带有无线功能，但本身机能有限，因此配备一台无线路由器是针对WLAN下设备提升网络质量的一种方案。对于无线路由器来说，相比于上文中的光纤入户光猫，普遍没有光电转换功能，但拥有了更好的机能和自由度。&lt;/p&gt;
&lt;p&gt;光猫与无线路由器的连接分为两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;光猫的LAN口接路由器的WAN口&lt;/li&gt;
&lt;li&gt;光猫的LAN口接路由器的LAN口&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;路由器WAN口入网&lt;/h2&gt;
&lt;p&gt;此时连入路由器的所有设备都与光猫处于不同网段，相应的光猫和路由器IP也不同。例如，光猫IP为&lt;code&gt;192.168.1.1&lt;/code&gt;，分配给路由器的IP为&lt;code&gt;192.168.1.2&lt;/code&gt;；而路由器也有DHCP功能，因此另找了一个网段，在路由器子域中，它的IP为&lt;code&gt;192.168.3.1&lt;/code&gt;，所连接的设备IP就被分配为为&lt;code&gt;192.168.3.x&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;先讲正确的入网方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将光猫设置为 &lt;strong&gt;桥接&lt;/strong&gt; 模式 | 一般需要咨询服务商/宽带师傅&lt;/li&gt;
&lt;li&gt;将 &lt;strong&gt;宽带PPPoE拨号&lt;/strong&gt;、&lt;strong&gt;DHCP自动分配IP&lt;/strong&gt; 等功能迁移至路由器配置&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光猫&lt;strong&gt;桥接&lt;/strong&gt;后，就简单地“退化”成了一个光电转换设备，此时光猫的所有功能都迁移至无线路由器，因此需要进行拨号和宽带设置，DHCP一般会默认开启。&lt;/p&gt;
&lt;p&gt;非正确入网：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;光猫依然处于 &lt;strong&gt;路由&lt;/strong&gt; 模式，关闭无线模块。&lt;/li&gt;
&lt;li&gt;路由器仅设置 &lt;strong&gt;DHCP自动分配IP&lt;/strong&gt;，开启无线功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这种模式下，所有连入路由器WLAN的设备，会处于二级子网下，如果想要连通广域网，就需要两次NAT转换：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;NAT旨在通过将一个外部 IP 地址和端口映射到更大的内部 IP 地址集来转换 IP 地址。 ————来自&lt;a href=&quot;https://baike.baidu.com/item/nat/320024&quot;&gt;百度百科&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;路由器将设备IP转换为光猫分配的IP&lt;/li&gt;
&lt;li&gt;光猫将分配的IP转换为WAN口的服务商公网IP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果是在游戏场景下(大多数为UDP数据传输)，网络层的NAT转换消耗了传输层的传输时间，在游戏中的表现为延迟不稳定，时常出现网络卡顿，这也是 &lt;strong&gt;校园网&lt;/strong&gt; 的多数工作方式，导致风评极差。&lt;/p&gt;
&lt;h2&gt;路由器LAN口入网&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;这里默认大家的子网掩码为&lt;code&gt;255.255.255.0&lt;/code&gt;，因此DHCP的全段分配地址为&lt;code&gt;192.168.1.2&lt;/code&gt;到&lt;code&gt;192.168.1.254&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于开启&lt;strong&gt;DHCP&lt;/strong&gt;功能的设备来说，下发的默认网关IP地址就是它本身，总之子网设备流量会经过被设置的网关设备；而DNS地址由光猫从运营商自动获取，但这里依旧整理了一些公共DNS地址：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;服务商&lt;/th&gt;
&lt;th&gt;首选地址&lt;/th&gt;
&lt;th&gt;备选地址&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.8.8.8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;8.8.4.4&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.1.1.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.0.0.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;s&gt;Microsoft&lt;/s&gt; Lumen&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.2.2.1&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;4.2.2.2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阿里巴巴&lt;/td&gt;
&lt;td&gt;&lt;code&gt;223.5.5.5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;223.6.6.6&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;腾讯&lt;/td&gt;
&lt;td&gt;&lt;code&gt;119.29.29.29&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;182.254.116.116&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;LAN口入网方式下，连入路由器的所有设备都与光猫处于同一网段，而与上文中的WAN口入网不同。例如，光猫IP为&lt;code&gt;192.168.1.1&lt;/code&gt;，DHCP的范围为&lt;code&gt;192.168.1.2&lt;/code&gt;到&lt;code&gt;192.168.1.100&lt;/code&gt;，则设置路由器的IP为&lt;code&gt;192.168.1.101&lt;/code&gt;，其他连入路由器的设备IP也由光猫的DHCP来分配，因此IP为&lt;code&gt;192.168.1.x&lt;/code&gt;。(x从2~100)&lt;/p&gt;
&lt;p&gt;路由器作为AP进行有线中继：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;光猫保持 &lt;strong&gt;路由&lt;/strong&gt; 模式，关闭无线模块。&lt;/li&gt;
&lt;li&gt;进入光猫后台，破坏DHCP的全段分配，例如设置分配范围为&lt;code&gt;192.168.1.2&lt;/code&gt;到&lt;code&gt;192.168.1.253&lt;/code&gt;，留出&lt;code&gt;192.168.1.254&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;路由器关闭 &lt;strong&gt;DHCP自动分配IP&lt;/strong&gt;，设置网关、DNS为光猫地址&lt;code&gt;192.168.1.1&lt;/code&gt;，举例设置路由器IP为&lt;code&gt;192.168.1.254&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时就是 &lt;em&gt;&lt;strong&gt;光猫无线信号不好&lt;/strong&gt;&lt;/em&gt; 的针对性方案，仅将路由器作为无线模块。&lt;/p&gt;
&lt;h3&gt;旁路由模式&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;此部分比较硬核，笔者也涉猎不多，一般的家庭网络也没有必要如此。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基础设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;光猫保持 &lt;strong&gt;路由&lt;/strong&gt; 模式&lt;/li&gt;
&lt;li&gt;进入光猫后台，破坏DHCP的全段分配，例如设置分配范围为&lt;code&gt;192.168.1.2&lt;/code&gt;到&lt;code&gt;192.168.1.253&lt;/code&gt;，留出&lt;code&gt;192.168.1.254&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;路由器关闭 &lt;strong&gt;DHCP自动分配IP&lt;/strong&gt;，设置网关、DNS为光猫地址&lt;code&gt;192.168.1.1&lt;/code&gt;，举例设置路由器IP为&lt;code&gt;192.168.1.254&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;旁路由系统(OpenWRT)防火墙开启入站、出站数据和转发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;旁路由的最直接应用就是zerotier搭建虚拟局域网和进行附魔操作。&lt;/p&gt;
&lt;p&gt;如果只是单设备流量走旁路由，只需要在连入旁路由的网络设置中，IP分配改为手动，并设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IP地址为例中&lt;code&gt;192.168.1.2&lt;/code&gt;到&lt;code&gt;192.168.1.253&lt;/code&gt;中未占用的IP&lt;/li&gt;
&lt;li&gt;网关和DNS都指向旁路由例中的&lt;code&gt;192.168.1.254&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;子网掩码为&lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果全部流量都想走旁路由(附魔)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入光猫后台，将DHCP的默认网关、DNS指向旁路由，即例中的&lt;code&gt;192.168.1.254&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;进入OpenWrt系统防火墙，开启 &lt;strong&gt;IP动态伪装&lt;/strong&gt; (NAT)功能。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>静态网页的文章管理后端！| Decap-CMS | GitHub-OAuth</title><link>https://blog.srprolin.top/posts/2026-02-09-cms_1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-09-cms_1/</guid><description>开源CMS——DecapCMS的部署指南，及GitHub-OAuth应用部署。</description><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CMS&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;内容管理系统（英语：content management system，缩写为 CMS）是指在一个合作模式下，用于管理工作流程的一套制度。———— 来自&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%86%85%E5%AE%B9%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F&quot;&gt;维基百科&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于静态网站，特别是博客，如果只是编写文章，却需要与Git仓库打交道，未免过于繁琐，因此有这么一类CMS系统，专对静态网站的文章进行管理，且只需要在Web端即可完成文章操作，便于随时随地随心记录点子/修改文章。&lt;/p&gt;
&lt;h1&gt;DecapCMS&lt;/h1&gt;
&lt;p&gt;这是一个基于 Git 的静态站点生成器 CMS，相关链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/decaporg/decap-cms&quot;&gt;GitHub仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://decapcms.org/docs/intro/&quot;&gt;官方文档页&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于该CMS起源于NetlifyCMS，后独立出来，因此大多数教程适用于您的网站托管在Netlify的情况下。
但我这里是基于GitHub_OAuth的认证所做的教程，静态网站可托管至任意平台，当然所有的细枝末节都可以前往&lt;a href=&quot;https://decapcms.org/docs/intro/&quot;&gt;官方文档页&lt;/a&gt;查看请详情。&lt;/p&gt;
&lt;h2&gt;Install | 安装&lt;/h2&gt;
&lt;p&gt;官方提供了两种安装方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过静态路由下的&lt;code&gt;admin&lt;/code&gt;文件夹内编写配置&lt;/li&gt;
&lt;li&gt;通过npm将decap-cms以包的形式安装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里首选第一种安装方式，基于静态网站所使用的框架，确定静态文件夹的所在地，在此目录下创建&lt;code&gt;admin&lt;/code&gt;文件夹。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/screenshot-2026-02-09-at-12-47-27-1.-install-decap-cms-decap-cms-open-source-content-management-system.TVXn05Af_2j2O2g.webp&quot; alt=&quot;admin_location&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后在&lt;code&gt;admin&lt;/code&gt;文件夹下创建文件&lt;code&gt;index.html&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;meta name=&quot;robots&quot; content=&quot;noindex&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Content Manager&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;!-- Include the script that builds the page and powers Decap CMS --&amp;gt;
    &amp;lt;script src=&quot;https://unpkg.com/decap-cms@^3.0.0/dist/decap-cms.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再创建&lt;code&gt;config.yml&lt;/code&gt;文件，按照&lt;a href=&quot;https://decapcms.org/docs/configuration-options/#configuration-file&quot;&gt;官方教程&lt;/a&gt;按需配置即可，下一节将展示我个人的一个模板。&lt;/p&gt;
&lt;p&gt;当配置好config后，就可以通过&lt;code&gt;https://&amp;lt;yoursite&amp;gt;/admin&lt;/code&gt;(将&lt;code&gt;&amp;lt;your-site&amp;gt;&lt;/code&gt;替换为具体网站域名)来访问decap-cms系统。&lt;/p&gt;
&lt;h2&gt;Configuration | 配置&lt;/h2&gt;
&lt;p&gt;首先放出适用于GitHub认证的模板：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 配置好您所选用的后端，这里我用的是GitHub_OAuth作为后端。
backend:
  name: github
  branch: main
  repo: &amp;lt;your-repo-name&amp;gt; # 替换为您的静态网站仓库名
  site_domain: &amp;lt;your-site-domain&amp;gt; # 替换为您的静态网站域名
  base_url: &amp;lt;github-oauth-site-url&amp;gt; # 替换为配置好的GitHub_oAuth后端网站链接(包含https协议头)
  auth_endpoint: auth

  # (可选项)自定义Decap-CMS每次操作的提交信息模板。
  commit_messages:
    create: &quot;CMS:Create {{collection}} “{{slug}}”&quot;
    update: &quot;CMS:Update {{collection}} “{{slug}}”&quot;
    delete: &quot;CMS:Delete {{collection}} “{{slug}}”&quot;
    uploadMedia: &quot;CMS:Upload “{{path}}”&quot;
    deleteMedia: &quot;CMS:Delete “{{path}}”&quot;
    openAuthoring: &quot;CMS:{{message}}&quot;

# Decap-CMS的首页logo
logo_url: https://blog.srprolin.top/favicon/favicon.ico

# 您的网站地址链接(带HTTPS协议头)
site_url: &amp;lt;your-site-url&amp;gt;
display_url: &amp;lt;your-site-url&amp;gt;

# 媒体文件夹，填写图片存放位置
media_folder: &quot;&amp;lt;your-img-location&amp;gt;&quot;
# 引用路由补全，在Decap-CMS选择图片时自动补全的路径头。
public_folder: &quot;&amp;lt;your-img-head-url&amp;gt;&quot;
# 例如你的图片为 &quot;img.png&quot;，存放在 &quot;src/images/&quot;(媒体文件夹)下，文章为 &quot;index.md&quot;，而文章存放在 &quot;src/posts/&quot;下，那么这时候就要补全路径头为 &quot;../images&quot;

# 文档夹(核心)
collections:

  # 分类1(按名称&quot;name&quot;分类)
  - name: &quot;posts&quot; # Used in routes, e.g., /admin/collections/blog
    # 在Decap-CMS网页上的分类名称(只影响web的展示文字)
    label: &quot;Posts&quot; # Used in the UI

    # 填写文章位置
    folder: &quot;&amp;lt;your-posts-location&amp;gt;&quot; # The path to the folder where the documents are stored
    create: true # Allow users to create new documents in this collection
    slug: &quot;{{year}}-{{month}}-{{day}}-{{slug}}&quot; # Filename template

    # CMS编辑器预置项(按需调整)
    fields: # The fields for each document, usually in front matter
      - { label: &quot;标题&quot;, name: &quot;title&quot;, widget: &quot;string&quot; }
      - {
          label: &quot;发布日期&quot;,
          name: &quot;published&quot;,
          widget: &quot;datetime&quot;,
          format: &quot;YYYY-MM-DD&quot;,
        }
      - {
          label: &quot;置顶&quot;,
          name: &quot;pinned&quot;,
          widget: &quot;boolean&quot;,
          default: false,
          required: false,
        }
      - {
          label: &quot;摘要&quot;,
          name: &quot;description&quot;,
          widget: &quot;string&quot;,
          required: false,
        }
      - { label: &quot;封面&quot;, name: &quot;image&quot;, widget: &quot;image&quot;, required: false }
      - {
          label: &quot;标签&quot;,
          name: &quot;tags&quot;,
          widget: &quot;list&quot;,
          minimize_collapsed: true,
          required: false,
        }
      - { label: &quot;分类&quot;, name: &quot;categories&quot;, widget: &quot;list&quot;, required: false }
      - {
          label: &quot;草稿&quot;,
          name: &quot;draft&quot;,
          widget: &quot;boolean&quot;,
          default: false,
          required: false,
        }
      - {
          label: &quot;语言&quot;,
          name: &quot;lang&quot;,
          widget: &quot;string&quot;,
          default: &quot;&quot;,
          required: false,
        }
      - { label: &quot;正文&quot;, name: &quot;body&quot;, widget: &quot;markdown&quot;, required: false }

  # 分类2
  - name: &quot;pages&quot;
    label: &quot;Pages&quot;
    # 单文件陈列
    files:
      - file: &quot;&amp;lt;your-pages-location-head&amp;gt;/about.md&quot; # 替换为你的页面位置前缀
        name: &quot;about&quot;
        label: &quot;关于&quot;
        fields:
          - { label: &quot;内容&quot;, name: &quot;body&quot;, widget: &quot;markdown&quot;, required: false }
      - file: &quot;&amp;lt;your-pages-location-head&amp;gt;/friends.md&quot; # 替换为你的页面位置前缀
        name: &quot;friends&quot;
        label: &quot;友链&quot;
        fields:
          - { label: &quot;内容&quot;, name: &quot;body&quot;, widget: &quot;markdown&quot;, required: false }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在配置单中，除&lt;code&gt;backend&lt;/code&gt;后端选项外，其他均为通用配置项。&lt;/p&gt;
&lt;p&gt;GitHub_OAuth是需要自行申请，并配置后端的，在下一节中将给出教程。&lt;/p&gt;
&lt;p&gt;这个后端，无非就是认证“你是你”这件事，DecapCMS同样也有&lt;a href=&quot;decapcms.org/docs/choosing-a-backend/&quot;&gt;通过Netlify身份认证来做后端的配置&lt;/a&gt;，但那就需要你的网站托管在Netlify了，更何况即使网站托管在Netlify，但多数静态站的源码还是在GitHub上的，那干脆就用GitHub_OAuth做认证后端好了。&lt;/p&gt;
&lt;h2&gt;GitHub_OAuth应用配置&lt;/h2&gt;
&lt;p&gt;这里我们要用到Cloudflare的Workers做真实后端逻辑，(当然其他的CI/CD平台也可以，但我提供的是适用于Worker的代码) 选择从&lt;code&gt;hello,world!&lt;/code&gt;开始，自定义&lt;code&gt;worker_name&lt;/code&gt;后直接部署。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../assets/images/screenshot-2026-02-09-at-13-55-24-%E6%9E%84%E5%BB%BA-%E8%AE%A1%E7%AE%97%E5%92%8C-ai-workers-%E5%92%8C-pages-rolinshmily-outlook.com-s-account-cloudflare.png&quot; alt=&quot;hello,world!&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-09_14-01-21.CJcxGBnZ_Z1tWg2U.webp&quot; alt=&quot;编辑代码&quot; /&gt;
随后在部署好的worker中，选择 &lt;strong&gt;编辑代码&lt;/strong&gt; ，内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default {
  async fetch(request, env) {
    const url = new URL(request.url);

    // 路由 1: 登录入口
    if (url.pathname === &quot;/auth&quot;) {
      const state = crypto.randomUUID();
      const githubAuthUrl = `https://github.com/login/oauth/authorize?client_id=${env.GITHUB_CLIENT_ID}&amp;amp;scope=repo&amp;amp;state=${state}`;

      return new Response(&quot;Redirecting...&quot;, {
        status: 302,
        headers: {
          &quot;Location&quot;: githubAuthUrl,
          &quot;Set-Cookie&quot;: `sx_state=${state}; HttpOnly; Secure; Path=/; Max-Age=600; SameSite=Lax`,
        },
      });
    }

    // 路由 2: 回调处理
    if (url.pathname === &quot;/callback&quot;) {
      const code = url.searchParams.get(&quot;code&quot;);
      const returnedState = url.searchParams.get(&quot;state&quot;);
      const cookies = request.headers.get(&quot;Cookie&quot;) || &quot;&quot;;
      const savedState = cookies.match(/sx_state=([^;]+)/)?.[1];

      if (!returnedState || returnedState !== savedState) {
        return new Response(&quot;安全校验失败：State 不匹配，请求可能已被篡改。&quot;, { status: 403 });
      }

      const response = await fetch(&quot;https://github.com/login/oauth/access_token&quot;, {
        method: &quot;POST&quot;,
        headers: {
          &quot;content-type&quot;: &quot;application/json&quot;,
          &quot;accept&quot;: &quot;application/json&quot;
        },
        body: JSON.stringify({
          client_id: env.GITHUB_CLIENT_ID,
          client_secret: env.GITHUB_CLIENT_SECRET,
          code,
        }),
      });

      const data = await response.json();

      if (!data.access_token) {
        return new Response(&quot;GitHub 授权失败&quot;, { status: 401 });
      }

      // 返回给 Decap CMS 的握手信号
      const content = `
        &amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;script&amp;gt;
        (function() {
          function receiveMessage(e) {
            window.opener.postMessage(
              &apos;authorization:github:success:${JSON.stringify({
                token: data.access_token,
                provider: &quot;github&quot;
              })}&apos;,
              e.origin
            );
          }
          window.addEventListener(&quot;message&quot;, receiveMessage, false);
          window.opener.postMessage(&quot;authorizing:github&quot;, &quot;*&quot;);
        })()
        &amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;`;

      return new Response(content, {
        headers: {
          &quot;content-type&quot;: &quot;text/html&quot;,
          &quot;Set-Cookie&quot;: &quot;sx_state=; HttpOnly; Secure; Path=/; Max-Age=0&quot;,
        }
      });
    }

    return new Response(&quot;OAuth Proxy is running&quot;, { status: 200 });
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;部署后，为该后端添加自定义域名，那么通过&lt;code&gt;https://&amp;lt;your-oauth&amp;gt;&lt;/code&gt;即可访问，若配置成功，则会返回信息&quot;OAuth Proxy is running&quot;，此时后端中仍缺少两项环境变量。&lt;/p&gt;
&lt;p&gt;前往&lt;a href=&quot;https://github.com/settings/developers&quot;&gt;GitHub的开发者设置&lt;/a&gt;中，选择&lt;code&gt;OAuth Apps&lt;/code&gt;，并创建&lt;code&gt;New OAuth App&lt;/code&gt;，按下图填写：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-09_14-16-23.DdXgkV9c_Z1qL2W5.webp&quot; alt=&quot;ghoauth&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-02-09_14-22-48.CBCWeub9_KLOIq.webp&quot; alt=&quot;secrets&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后回到CloudflareWorker中，填写两个键值对环境变量，类型选择为&lt;code&gt;secret&lt;/code&gt;(密钥)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GITHUB_CLIENT_ID&lt;/code&gt; : &lt;code&gt;&amp;lt;Client ID&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GITHUB_CLIENT_SECRET&lt;/code&gt; : &lt;code&gt;&amp;lt;Client secret&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时的GitHub_OAuth后端就算部署完成了。&lt;/p&gt;
</content:encoded></item><item><title>Nintendo_Switch插件仓库列表 | AMS | RDP</title><link>https://blog.srprolin.top/posts/2026-02-08-switch_ams_2/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-08-switch_ams_2/</guid><description>Atmosphere大气层系统Nintendo_Switch的插件及纯净整合包分享，附开源仓库链接。</description><pubDate>Sun, 08 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Nintendo Switch 相关插件仓库列表&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ITotalJustice/sphaira&quot;&gt;sphaira&lt;/a&gt;——任天堂Switch的自制菜单&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/switchbrew/nx-hbmenu&quot;&gt;nx-hbmenu&lt;/a&gt;——任天堂Switch的自制菜单&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Huntereb/Awoo-Installer&quot;&gt;Awoo-Installer&lt;/a&gt;——任天堂Switch的无废话NSP、NSZ、XCI和XCZ安装程序&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cathery/sys-con&quot;&gt;sys-con&lt;/a&gt;——支持第三方控制器的 Nintendo Switch 系统模块&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/impeeza/linkalho&quot;&gt;linkalho&lt;/a&gt;——一款可将 NID 账户链接离线的用户浏览应用。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/exelix11/SwitchThemeInjector&quot;&gt;SwitchThemeInjector&lt;/a&gt;——为任天堂交换机创建自定义主题!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/xfangfang/wiliwili&quot;&gt;wiliwili&lt;/a&gt;——第三方B站客户端。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/J-D-K/JKSV&quot;&gt;JKSV&lt;/a&gt;——JK的保存管理器Switch版。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/rashevskyv/dbi&quot;&gt;DBI&lt;/a&gt;——安装NSP、NSZ、XCI和XCZ的终极解决方案,支持通过MTP、USB、http(来自您的个人服务器)、外部USB等设备进行安装。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ppkantorski/Ultrahand-Overlay&quot;&gt;Ultrahand-Overlay&lt;/a&gt;——完全精巧的任天堂Switch外带执行器。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ppkantorski/Ultrahand-Packages&quot;&gt;Ultrahand-Packages&lt;/a&gt;——已知Ultrahand插件包的完整列表。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/exelix11/SysDVR&quot;&gt;SysDVR&lt;/a&gt;——通过USB或网络将游戏流式传输到电脑。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/WerWolv/EdiZon&quot;&gt;EdiZon&lt;/a&gt;——Homebrew 为任天堂Switch的操作系统Horizon保存文件递质、注射器和控制台编辑器。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;RDP烤鸭包&lt;/h1&gt;
&lt;p&gt;相关链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sskyNS/RoastDuck-CFWPack&quot;&gt;RoastDuck-CFWPack_三上烤鸭AMS纯净整合包_GitHub仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://space.bilibili.com/679023184&quot;&gt;作者来自Bilibili三上烤鸭&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三上烤鸭也提供了RDP付费版，包含多种便利服务的自制插件，请自行前往bilibili个人空间查看详情。&lt;/p&gt;
&lt;p&gt;该AMS整合包默认集成特斯拉插件(Ultrahand)，使用的插件包为&lt;a href=&quot;https://github.com/halop/OC_Toolkit&quot;&gt;OC Toolkit EOS&lt;/a&gt;，Ultrahand-Overlay呼出方式为：&lt;code&gt;ZL+ZR+↓&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;使用Sphaira作为“相册”应用商店，包含插件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sphaira&lt;/li&gt;
&lt;li&gt;Daybreak&lt;/li&gt;
&lt;li&gt;EdiZon&lt;/li&gt;
&lt;li&gt;JKSV&lt;/li&gt;
&lt;li&gt;Linkalho&lt;/li&gt;
&lt;li&gt;DBI&lt;/li&gt;
&lt;li&gt;NXThemesInstaller&lt;/li&gt;
&lt;li&gt;AwooInstaller&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Cloudflare优选原理小记</title><link>https://blog.srprolin.top/posts/2026-02-06-cloudflare_1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-06-cloudflare_1/</guid><description>Cloudflare优选域名/IP原理、Workers路由应用示例。</description><pubDate>Fri, 06 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;CloudflareCDN与优选&lt;/h1&gt;
&lt;p&gt;作为互联网中的重要角色，其CDN节点遍布全球，提供了非常多的入口IP。
由于GFW的存在，中国大陆的访问情况并不是很友好，但总归有访问良好的节点IP。
优选即是对Cloudflare的全球IP进行测试，选择出优于中国大陆访问的IP。&lt;/p&gt;
&lt;h1&gt;DNS——IP与域名的映射表&lt;/h1&gt;
&lt;p&gt;DNS服务器用于针对客户端发送的域名请求，查找并返回客户端相对应的IP，由于CDN节点网络分发技术的存在，访问一个网页的域名(例如baidu.com)，不同地区最终返回的IP是不同的。&lt;/p&gt;
&lt;p&gt;如果我们将Cloudflare优选后的众多IP，与一个域名相绑定，并保留在DNS服务器上，那么这个域名就是优选域名。&lt;/p&gt;
&lt;h1&gt;CloudflareWorkers路由&lt;/h1&gt;
&lt;p&gt;Workers是Cloudflare的一项功能，用于部署静态网页、动态脚本等severless应用，提供两种绑定域名方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自定义域名——自动添加DNS记录&lt;/li&gt;
&lt;li&gt;自定义路由——将指定的域名路由转发至此Worker应用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由上文可知，如果要使用优选域名，就需要自定义DNS记录，将自定义域名指向优选IP/域名，因此对于Worker应用使用优选域名加速，只能使用 &lt;strong&gt;自定义路由&lt;/strong&gt; 方式来绑定自定义域名&lt;/p&gt;
&lt;h1&gt;应用示例&lt;/h1&gt;
&lt;p&gt;假设你有一个worker应用，你的自定义域名为 &lt;code&gt;example.domain.com&lt;/code&gt; , 你所选用的优选域名为 &lt;code&gt;better.cf.com&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入worker应用，选择 &lt;strong&gt;自定义路由&lt;/strong&gt;，绑定至 &lt;code&gt;example.domain.com/*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;进入DNS记录，添加一条CNAME(如果是IP选A类型)解析，将&lt;code&gt;example.domain.com&lt;/code&gt;解析至&lt;code&gt;better.cf.com&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Switch系统更新 | AMS | hekate </title><link>https://blog.srprolin.top/posts/2026-02-05-switch_ams_1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-02-05-switch_ams_1/</guid><description>简要记述switch大气层双系统硬件破解的系统更新步骤，涉及AMS系统的简要认知。</description><pubDate>Thu, 05 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;相关链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Atmosphere-NX/Atmosphere&quot;&gt;Atmosphere_大气层系统_GitHub仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/CTCaer/hekate&quot;&gt;hekate_双系统启动加载GUI界面_GitHub仓库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/sskyNS/RoastDuck-CFWPack&quot;&gt;RoastDuck-CFWPack_三上烤鸭AMS纯净整合包_GitHub仓库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;双系统整体框架&lt;/h1&gt;
&lt;p&gt;硬件破解时植入芯片MCU，构建出了一套拥有机器最高权限的虚拟系统，而AMS实现了该虚拟系统与机身正版系统的共存。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真实系统为带有最高权限的正版系统，仅限于超频等发挥机器性能等操作。&lt;/li&gt;
&lt;li&gt;虚拟系统为与正版系统完全隔离的最高权限系统，无法使用任天堂网络服务。&lt;/li&gt;
&lt;li&gt;正版系统为机身原始系统，常使用于任天堂第一方网络游戏。
hekate可以类比做PC中的BIOS，是在系统加载前的启动页面，用于硬件读取和系统选择，常与AMS一起打入整合包。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;更新步骤&lt;/h1&gt;
&lt;p&gt;请优先关注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大气层系统版本及其所支持的Switch版本&lt;/li&gt;
&lt;li&gt;任天堂Switch最新版本，&lt;a href=&quot;https://support.nintendo.com/jp/switch/system_update/index.html&quot;&gt;点击前往官网最新更新公告页&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果大气层未能支持最新的Switch版本，请不要更新正版系统！&lt;/p&gt;
&lt;h2&gt;硬件准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一台PC/任意设备——用于进行文件替换&lt;/li&gt;
&lt;li&gt;SD内存读卡器/数据线——用于连接Switch与操作平台&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;软件准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AMS整合包/AMS官方包结合hekate——双系统前提&lt;/li&gt;
&lt;li&gt;Firmware固件包——用于虚拟系统的更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;连接Switch与操作平台&lt;/h2&gt;
&lt;p&gt;在Switch重新启动进入hekate界面后，选择USB的SD卡选项，将数据线(或者将Switch关机，取出SD卡，使用读卡器)连接至操作平台，打开SD卡根目录。&lt;/p&gt;
&lt;p&gt;请一定保留文件夹，其他视情况而定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nintendo——正版系统数据&lt;/li&gt;
&lt;li&gt;emuMMC——虚拟系统数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后将AMS整合包解压后目录列表和 &lt;strong&gt;Firmware&lt;/strong&gt; 整个文件夹拖入至SD卡根目录，最后在操作平台安全弹出移动存储设备。&lt;/p&gt;
&lt;h2&gt;更新虚拟系统&lt;/h2&gt;
&lt;p&gt;首先查看AMS系统版本是否为所使用的版本，判断是否更新完成。
随后打开 &lt;strong&gt;相册&lt;/strong&gt; 中的应用 &lt;strong&gt;Daybreak&lt;/strong&gt;，选择固件位置 &lt;strong&gt;Firmware&lt;/strong&gt; 文件夹进行更新安装。&lt;/p&gt;
&lt;h2&gt;更新正版系统&lt;/h2&gt;
&lt;p&gt;正常联网更新即可。&lt;/p&gt;
</content:encoded></item><item><title>SrP-CFG安装器v2版本 | 使用指南</title><link>https://blog.srprolin.top/posts/2026-01-12-cfg_installer_v2/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-01-12-cfg_installer_v2/</guid><description>为SrP-CFG预设打造，但不限于该预设的CFG安装器，GUI版v2发布，本文将简要描述使用指南。</description><pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;请先阅读&lt;a href=&quot;https://blog.srprolin.top/posts/srp-cfg/&quot;&gt;前篇关于CFG的介绍&lt;/a&gt;，必要时阅读&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-1.html&quot;&gt;SrP-CFG项目说明书&lt;/a&gt;。&lt;/p&gt;
&lt;h1&gt;项目地址&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;RolinShmily/SrP-CFG_ForCS2&quot;}&lt;/p&gt;
&lt;p&gt;该安装器仅适用于Windows_x64位系统使用。&lt;/p&gt;
&lt;h1&gt;界面展示&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-01-12_14-17-38.BBgX3crz_ZAA55e.webp&quot; alt=&quot;cfg_installer-1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;默认勾选安装 &lt;strong&gt;CFG文件(全局配置)&lt;/strong&gt; 和 &lt;strong&gt;视频预设文件(用户配置)&lt;/strong&gt; ，请按需勾选所需要安装的预设。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;默认的CFG文件安装路径是全局生效(非730)，而视频预设文件只能在730文件夹的用户级目录生效，所以如果您需要安装视频预设文件&lt;code&gt;cs2_video.txt&lt;/code&gt;,请选定你的steam用户，该码为&lt;strong&gt;steam好友代码&lt;/strong&gt;，下一节将提供好友代码的查找细节。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;文件选择处可以提供单文件形式&lt;code&gt;.zip&lt;/code&gt;、&lt;code&gt;.cfg&lt;/code&gt;、&lt;code&gt;.txt&lt;/code&gt;，也可以选中多个文件/一整个文件夹，选择器会自动滤除掉非&lt;code&gt;.cfg&lt;/code&gt;和&lt;code&gt;.txt&lt;/code&gt;类型文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;备份可以单独执行，在安装时也会强制执行一次备份；如果你的备份需要存档，请手动转移位置，或者更改备份文件名；备份位置右侧可以打开文件夹，并自动选中备份文件，便于用户查找。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;刷新路径按钮，用于手动执行扫描steam安装路径、steam游戏路径、steam用户文件夹，当然如果仍未找到，你可以点击路径右侧的&lt;code&gt;...&lt;/code&gt;手动指定路径。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当一切准备就绪，就可以点击&lt;strong&gt;开始安装&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你的每一步操作都会在日志输出中打印提示信息，如果遇到问题，请先查看日志。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;你会需要的链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-1.html&quot;&gt;项目说明书&lt;/a&gt; | 本项目的一些废话&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-2.html&quot;&gt;下载地址&lt;/a&gt; | 顾名思义&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-3.html&quot;&gt;使用指南&lt;/a&gt; | 按键、控制台命令功能表&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-4.html&quot;&gt;更新日志&lt;/a&gt; | 查看最新更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;steam好友代码查找&lt;/h1&gt;
&lt;p&gt;如果你有更多方便的查找好友代码的方式，欢迎反馈。&lt;/p&gt;
&lt;h2&gt;steam客户端查找&lt;/h2&gt;
&lt;p&gt;方式1:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-01-12_15-00-30.CpntsSTM_ZOWy60.webp&quot; alt=&quot;steam-0&quot; /&gt;&lt;/p&gt;
&lt;p&gt;方式2:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2026-01-12_14-54-28.BO1WaNpH_ZKJY7J.webp&quot; alt=&quot;steam-1&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;steam网页端查找&lt;/h2&gt;
&lt;p&gt;访问链接：&lt;a href=&quot;https://steamcommunity.com/&quot;&gt;Steam社区&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;请先在右上角登录你的steam账户，随后操作同&lt;strong&gt;客户端&lt;/strong&gt;方式2查找一致。&lt;/p&gt;
</content:encoded></item><item><title>基于webDAV的远程文件虚拟盘符挂载</title><link>https://blog.srprolin.top/posts/webdav-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/webdav-1/</guid><description>这是继上一篇关于SMB的续集，因其仅内网性，而虚拟局域网的不稳定性，也促使我去选择另一种文件共享协议，即webDAV，可以借助RaiDrive实现挂载盘符...</description><pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;借助 RaiDrive 实现挂载盘符，同时使用 GitHub 上的开源 webDAV 服务端，避免了 Windows 自带的 IIS 的繁琐配置。&lt;/p&gt;
&lt;p&gt;使用到的外链：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.raidrive.com/&quot;&gt;RaiDrive 官网&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/hacdias/webdav&quot;&gt;hacdias/webdav 项目&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;webdav 服务端的安装与配置&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/hacdias/webdav&quot;&gt;hacdias/webdav 项目&lt;/a&gt; 的 Release 页，以 Windows 系统为例，安装对应的 amd64 版本。&lt;/p&gt;
&lt;p&gt;演示安装目录：&lt;code&gt;E:\Program Files\webdav&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;根据官方的 README 文件，需要自行创建&lt;code&gt;config.yaml&lt;/code&gt;来进行配置，下面是官方配置的 AI 翻译版：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 监听地址：0.0.0.0 表示允许局域网或内网穿透流量访问
address: 0.0.0.0
# WebDAV 服务在本地运行的端口
port: 6065

# TLS 相关设置。如果你不配置域名证书，请保持 false
tls: false
cert: cert.pem
key: key.pem

# WebDAV 路径前缀。默认为 &apos;/&apos;。如果是 &apos;/share&apos;，访问地址需加上该后缀
prefix: /

# 是否启用调试日志。默认 &apos;false&apos;
debug: false

# 是否禁用探测文件内容类型。默认 &apos;false&apos;
noSniff: false

# 服务端是否运行在受信任的代理之后（如 Nginx）。
# 开启后将使用 X-Forwarded-For 记录真实的远程访问地址。
behindProxy: false

# 默认共享目录：当用户没有单独定义 directory 时使用此路径。
# &apos;.&apos; 代表当前可执行文件所在的目录。你可以改为具体路径，如 &quot;D:/MyShare&quot;
directory: .

# 默认权限设置（不区分大小写）。
# C (创建), R (读取), U (更新/修改), D (删除)。
# 如果只想让朋友看和下，设为 &quot;R&quot;；如果需要他能上传和改名，设为 &quot;CRUD&quot;。
permissions: R

# 默认权限规则。规则从下往上应用（最后一条匹配的规则生效）。
# 路径始终相对于用户的根目录。
rules: []

# 用户规则的叠加行为：
# - overwrite: 用户定义的规则将覆盖全局规则。
# - append: 用户的规则将附加在全局规则之后。
rulesBehavior: overwrite

# 日志配置
log:
  # 日志格式 (&apos;console&apos; 易读, &apos;json&apos; 适合分析)。
  format: console
  # 是否开启彩色打印。
  colors: true
  # 日志输出位置，默认为标准错误流 &apos;stderr&apos;。
  outputs:
    - stderr

# CORS 跨域配置（如果你使用网页版客户端访问，需要开启）
cors:
  enabled: true
  credentials: true
  allowed_headers:
    - Depth
  allowed_hosts:
    - http://localhost:8080
  allowed_methods:
    - GET
  exposed_headers:
    - Content-Length
    - Content-Range

# 用户列表。如果列表为空，则不启用身份验证（不安全）。
# 否则，将自动配置基础身份验证 (Basic Auth)。
users:
  # 示例管理员账号 (明文密码)
  - username: admin
    password: YourStrongPassword # 建议修改此密码
    permissions: CRUD # 管理员通常拥有完全权限

  # 示例普通用户 &apos;john&apos;，使用了 bcrypt 加密密码，并指定了专属目录
  - username: john
    password: &quot;{bcrypt}$2y$10$zEP6oofmXFeHaeMfBNLnP.DO8m.H.Mwhd24/TOX2MWLxAExXi4qgi&quot;
    directory: D:/JohnsFiles # 这里必须是绝对路径或有效的相对路径

  # 从系统环境变量中读取用户名和密码的示例
  - username: &quot;{env}ENV_USERNAME&quot;
    password: &quot;{env}ENV_PASSWORD&quot;

  # 具有细分权限规则的用户示例
  - username: basic
    password: basic
    permissions: CRUD # 基础权限是全开
    rules:
      # 禁止该用户访问 /some/file 路径
      - path: /some/file
        permissions: none
      # 允许该用户在 /public/access/ 目录下进行增删改查
      - path: /public/access/
        permissions: CRUD
      # 允许该用户读取和更新所有以 .js 结尾的文件（使用正则表达式）
      - regex: &quot;^.+.js$&quot;
        permissions: RU
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里给到我的简易配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;address: 0.0.0.0
port: 6065
tls: false

cors:
  enabled: false

prefix: /
directory: ./MyShare

log:
  format: console
  colors: true
  outputs:
    - stderr

rulesBehavior: overwrite
users:
  # 管理员
  - username: admin
    password: password # 建议修改此密码
    permissions: CRUD # 管理员通常拥有完全权限
  # 其他用户
  - username: user
    password: user
    permissions: R
    directory: ./MyShare/User
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确保你的根目录下有&lt;strong&gt;MyShare&lt;/strong&gt;和&lt;strong&gt;MyShare/User&lt;/strong&gt;文件夹，且该文件夹权限为全部(支持读写)。&lt;/li&gt;
&lt;li&gt;请考虑修改你的管理员用户名和密码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后双击程序&lt;strong&gt;webdav.exe&lt;/strong&gt;，可以通过&lt;code&gt;http://localhost:6065&lt;/code&gt;检验是否成功运行。&lt;/p&gt;
&lt;p&gt;为了无痛无感启动，可以编写一个&lt;code&gt;start_webdav.vbs&lt;/code&gt;脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CreateObject(&quot;Wscript.Shell&quot;).Run &quot;webdav.exe -c config.yaml&quot;, 0, True
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样启动脚本后，便不会有 cmd 命令窗，程序将静默后台运行。&lt;/p&gt;
&lt;p&gt;随后为该脚本创建一个快捷方式，&lt;code&gt;Win+R&lt;/code&gt;打开运行窗，输入&lt;code&gt;shell:startup&lt;/code&gt;，会打开一个启动文件夹，将快捷方式拖入进去即可。&lt;/p&gt;
&lt;p&gt;这样就获得了一个开机自启的 webdav 服务。&lt;/p&gt;
&lt;h1&gt;RaiDrive 挂载器 | 客户端的安装与配置&lt;/h1&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://www.raidrive.com/&quot;&gt;RaiDrive 官网&lt;/a&gt; 下载安装对应的 Windows_x64 版本。&lt;/p&gt;
&lt;p&gt;我们可以先在自己启动 webdav 服务端的 PC 上，使用 RaiDrive 挂载一下本地的 MyShare 文件夹：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-25_21-09-18.DAcO-TMh_Z1N97qW.webp&quot; alt=&quot;RaiDrive&quot; /&gt;&lt;/p&gt;
&lt;p&gt;随后可以看到电脑中多了一个 X 盘，说明服务端配置成功。&lt;/p&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;到这里，我们就可以利用各种内网穿透服务，通过获取的公网地址，来访问 WebDAV 服务器。&lt;/p&gt;
</content:encoded></item><item><title>基于SMB和Postgres的Davinci协同工作</title><link>https://blog.srprolin.top/posts/davinci-smb/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/davinci-smb/</guid><description>本文将SMB、PostgreSQL和达芬奇应用结合起来，实现了多人远程协同剪辑工作，案例平台均为Windows，需要处于内网环境。</description><pubDate>Sun, 21 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SMB 文件共享&lt;/h1&gt;
&lt;p&gt;百度百科：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMB（全称是 Server Message Block）是一个网络协议名，它能被用于 Web 连接和客户端与服务器之间的信息沟通。SMB 最初是 IBM 的贝瑞·费根鲍姆（Barry Feigenbaum）研制的，其目的是将 DOS 操作系统中的本地文件接口“中断 13”改造为网络文件系统。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本文的 SMB 搭建参考自 &lt;a href=&quot;https://onianbai.com/list_49/137.html&quot;&gt;Windows SMB 正确安全的开启姿势&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;打开 SMB 共享功能&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Win+R&lt;/code&gt;打开运行框，输入&lt;code&gt;optionalfeatures&lt;/code&gt;打开 Windows 功能，勾选&lt;strong&gt;SMB 直通&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025_12_21_1753.KKvI_Uq6_24ldPj.webp&quot; alt=&quot;features&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;创建 SMB 专用用户&lt;/h2&gt;
&lt;p&gt;这里的用户名以&lt;code&gt;SMB&lt;/code&gt;为例。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Win+R&lt;/code&gt;打开运行框，输入&lt;code&gt;compmgmt.msc&lt;/code&gt;打开计算机管理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21_17-49-40.JTs5xECr_ZtTVnP.webp&quot; alt=&quot;useradd&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;必要用户权限的限制与开放&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Win+R&lt;/code&gt;打开运行框，输入&lt;code&gt;gpedit.msc&lt;/code&gt;打开本地组策略。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025_12_21_1756.BHxefAH9_1OfjmL.webp&quot; alt=&quot;gpedit-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-17-57.B8aDdbYc_Edtya.webp&quot; alt=&quot;gpedit-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-17-58.ChTHWNXy_ZCDTqj.webp&quot; alt=&quot;gpedit-3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-17-59.BGSVPEHq_Z1AyrhS.webp&quot; alt=&quot;gpedit-4&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Win+R&lt;/code&gt;打开运行框，输入&lt;code&gt;secpol.msc&lt;/code&gt;打开本地安全策略。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21_18-04-02.CX2sfWX9_u273p.webp&quot; alt=&quot;secpol-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;同样的操作应用于以下选项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-18-05.CH0wQvkH_ZPyxN.webp&quot; alt=&quot;secpol-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Win+I&lt;/code&gt;打开 Windows 设置，按照下图打开必要选项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-18-07.D85LoJxa_14F1sj.webp&quot; alt=&quot;settings&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;设置 SMB 共享文件夹&lt;/h2&gt;
&lt;p&gt;选择任意盘符，创建一个文件夹，名字以&lt;code&gt;SMB&lt;/code&gt;为例。&lt;/p&gt;
&lt;p&gt;随后打开 SMB 文件夹属性：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21_18-21-22.ljWVSicU_2vSDyv.webp&quot; alt=&quot;share&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21_18-27-20.Dd07_e8o_Z1MAHDn.webp&quot; alt=&quot;security&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;其他计算机设备的连接&lt;/h2&gt;
&lt;p&gt;现在在另一台设备上，&lt;code&gt;Win+E&lt;/code&gt;打开资源管理器，选择&lt;strong&gt;此电脑&lt;/strong&gt;，按照下列操作，即可获得一个&lt;strong&gt;Z 盘&lt;/strong&gt;，里面是上文的&lt;strong&gt;SMB&lt;/strong&gt;文件夹内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-1.-WLCSBh-_Z2qG3gr.webp&quot; alt=&quot;pan-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-2.CFnka3cC_Z1qQYQj.webp&quot; alt=&quot;pan-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21-3.vIxo0VgO_ZlbGu7.webp&quot; alt=&quot;pan-3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;请注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这里的&lt;strong&gt;文件夹&lt;/strong&gt;路径中的&lt;strong&gt;10.10.10.1&lt;/strong&gt;为共享机的内网地址，&lt;strong&gt;SMB&lt;/strong&gt;为共享文件夹名&lt;/li&gt;
&lt;li&gt;网络凭据中用户名为上文中创建的&lt;code&gt;SMB&lt;/code&gt;，密码也是上文创建用户时的密码&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;PostgreSQL 数据库&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.blackmagicdesign.com/cn/support/family/davinci-resolve-and-fusion&quot;&gt;达芬奇官方支持中心&lt;/a&gt;中的&lt;strong&gt;DaVinci Resolve Project Server&lt;/strong&gt;本质上是一个 Postgre 数据库，我们可以完全不用这样一个软件，而用 Postgres 代替。&lt;/p&gt;
&lt;p&gt;前往&lt;a href=&quot;https://www.postgresql.org/download/&quot;&gt;Postgres 官方下载中心&lt;/a&gt;，下载 Windows 版本安装包，在安装过程中会设置一个默认的数据库用户名和密码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认用户名：postgres&lt;/li&gt;
&lt;li&gt;(例)密码：password&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在可以&lt;code&gt;Win+R&lt;/code&gt;打开运行框，输入&lt;code&gt;services.msc&lt;/code&gt;并找到&lt;code&gt;postgres&lt;/code&gt;相关服务，查看是否正在运行。&lt;/p&gt;
&lt;h2&gt;数据库连接权限&lt;/h2&gt;
&lt;p&gt;找到 PostgreSQL 的根目录，用记事本打开这个文件：&lt;code&gt;...\PostgreSQL\17\data\pg_hba.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在末尾加上一段通行信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Allow network access
host    all             all             10.10.10.0/24         scram-sha-256
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的&lt;strong&gt;10.10.10.0/24&lt;/strong&gt;对应上文中&lt;strong&gt;10.10.10.1&lt;/strong&gt;的网段，这样位于该网段下的其余设备，才能通过&lt;strong&gt;10.10.10.1&lt;/strong&gt;地址来连接到数据库&lt;/p&gt;
&lt;p&gt;你需要查询自己的内网网段，替换掉&lt;strong&gt;10.10.10.0/24&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;数据库可视化工具测试&lt;/h2&gt;
&lt;p&gt;这里推荐一款可视化数据库管理工具&lt;a href=&quot;https://dbeaver.io/download/&quot;&gt;DBeaver&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;可以在&lt;strong&gt;10.10.10.1&lt;/strong&gt;机器上，连接数据库时，测试地址&lt;strong&gt;10.10.10.1&lt;/strong&gt;看是否能连接成功。&lt;/p&gt;
&lt;p&gt;不过在一般情况下管理，直接用&lt;strong&gt;localhost&lt;/strong&gt;或者&lt;strong&gt;127.0.0.1&lt;/strong&gt;即可。&lt;/p&gt;
&lt;h1&gt;Davinci 达芬奇协同设置&lt;/h1&gt;
&lt;p&gt;在&lt;strong&gt;10.10.10.1&lt;/strong&gt;机器上，打开达芬奇软件，按下列操作：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21_19-23-16.DB_TzKFz_ZDqIqT.webp&quot; alt=&quot;Davinci&quot; /&gt;&lt;/p&gt;
&lt;p&gt;位置填写&lt;strong&gt;10.10.10.1&lt;/strong&gt;可以保持统一。&lt;/p&gt;
&lt;p&gt;在内网的其他机器上，只需要选择&lt;strong&gt;连接&lt;/strong&gt;，填入相同内容即可。&lt;/p&gt;
&lt;h2&gt;项目文件夹设置&lt;/h2&gt;
&lt;p&gt;在&lt;strong&gt;10.10.10.1&lt;/strong&gt;机器上，通过映射网络驱动器操作，获得相同的一个&lt;strong&gt;Z 盘&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在网络数据库中创建一个新项目，前往项目设置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-21_19-44-52.B1sFWwHQ_2qS8U6.webp&quot; alt=&quot;settings&quot; /&gt;&lt;/p&gt;
&lt;p&gt;如图所示确保工作文件夹均在&lt;strong&gt;Z 盘&lt;/strong&gt;内。&lt;/p&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;尽管这样确实能实现两台 PC 的协同工作，但因为种种原因，最好将 Postgres 数据库和项目资源聚合在某一台“服务器”上(比如 NAS)，而不是生产 PC。&lt;/p&gt;
</content:encoded></item><item><title>MC整合包MacMini实装 | rcon远程终端控制 | launchd系统进程守护</title><link>https://blog.srprolin.top/posts/mac-mc-2/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/mac-mc-2/</guid><description>本篇结合之前的MacMini搭建mc服务器，实装一下整合包BetterMCv54服务端，将使用非面板管理，引入rcon技术向服务器发送指令</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;之前发布过一篇在MacMini上借助mcsmanager管理Minecraft服务器的文章: &lt;a href=&quot;https://blog.srprolin.top/posts/mac-mc-1/&quot;&gt;使用MacMini搭建Minecraft服务器&lt;/a&gt; ，但是对于betterMC这样的大型forge整合包，通过JVM运行通常已经很吃内存了。&lt;/p&gt;
&lt;p&gt;又因为实测下来mcsmanager的管理操作其实并不是很好用，他在指令层也会套一层壳，这导致我前段时间误判了服务端JVM已经关闭，但是其并没有释放，在查看硬件后台之后才发现同时运行了多个JVM，导致负载极高且卡顿。&lt;/p&gt;
&lt;p&gt;鉴于mcsmanager的操作并不顺手，且Node.js的后端也同样吃不少内存(相对于要开服务器的16G丐版Mini)，且存在一定的内存泄漏风险，我决定放弃mcsmanager的方案。&lt;/p&gt;
&lt;p&gt;这篇文章将Minecraft服务端启动脚本(自制)写入launchd守护进程，使用rcon远程控制台向服务器发送指令，一切行为经过命令行。&lt;/p&gt;
&lt;h1&gt;BetterMC整合包&lt;/h1&gt;
&lt;p&gt;我们这里安装的服务端，可以说是私人型服务器，即对外不公开地址，仅朋友间游玩整合包使用，因此也选择了较为经典的原版增强型整合包，且使用forge核心，这是一个相当吃配置的选择，但也能印证方案可行性。&lt;/p&gt;
&lt;p&gt;下面是一些相关链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://better-mc.com/&quot;&gt;BetterMC官方网站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.curseforge.com/minecraft/modpacks/better-mc-forge-bmc4&quot;&gt;CurseForge描述页&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modrinth.com/modpack/better-mc-forge-bmc4&quot;&gt;Modrinth描述页&lt;/a&gt; | 这里目前只更新到v43,而最新版为v54&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.curseforge.com/minecraft/modpacks/better-mc-forge-bmc4/files/7299697&quot;&gt;最新v54版本整合包客户端下载链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.curseforge.com/minecraft/modpacks/better-mc-forge-bmc4/files/7303630&quot;&gt;最新v54版本整合包服务端下载链接&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里建议先用Windows下载一份服务端，至于客户端整合包导入这里不多赘述，会的都会了。&lt;/p&gt;
&lt;h2&gt;服务端初始化&lt;/h2&gt;
&lt;p&gt;该整合包的服务端是由&lt;a href=&quot;https://serverpackcreator.de/#/&quot;&gt;ServerPackCreator&lt;/a&gt;工具制作的，且mojang也不允许二次分发Minecraft相关文件，所以该服务端在初始启动时是需要下载模组等，客户端导入时同理。&lt;/p&gt;
&lt;p&gt;这里建议将服务端先下载到PC，解压后进行初始化操作，由于模组源来自 curseforge ，因此需要自行解决网络环境。&lt;/p&gt;
&lt;p&gt;解压后如图中所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-20_12-08-09.B9sf1v7T_Z2uc5gI.webp&quot; alt=&quot;server-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;根据 READ_ME 文件，我们可以找到官方向导地址：https://github.com/chorbintime/LPS-readme/wiki/1.20.1&lt;/p&gt;
&lt;p&gt;官方提供了安装Java的脚本：&lt;code&gt;install_java.ps1&lt;/code&gt;和&lt;code&gt;install_java.sh&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;但相信大家都提前安装过了Java，所以我们打开&lt;code&gt;variables.txt&lt;/code&gt;文件，将跳过Java版本检测设置为true并手动设置自己的Java路径。&lt;/p&gt;
&lt;p&gt;文件在顶部注释中已经说明了Windows的路径写法，可参考如下文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    ###
    # Remember:
    #   Escape \ and : in your Java path on Windows with another \
    #   Example:
    #     From: C:\Program Files\Eclipse Adoptium\jdk-17.0.9.9-hotspot\bin\java.exe
    #     To:   C\:\\Program Files\\Eclipse Adoptium\\jdk-17.0.9.9-hotspot\\bin\\java.exe
    #   More on escape characters at https://en.wikipedia.org/wiki/Escape_character
    # ......
    ###
    MINECRAFT_VERSION=1.20.1
    MODLOADER=Forge
    MODLOADER_VERSION=47.4.10
    LEGACYFABRIC_INSTALLER_VERSION=1.1.0+1
    FABRIC_INSTALLER_VERSION=1.1.0
    QUILT_INSTALLER_VERSION=0.12.1
    RECOMMENDED_JAVA_VERSION=1.20.1
    JAVA_ARGS=&quot;-Xmx4G -Xms4G&quot;
 -- JAVA=&quot;java&quot;
 ++ JAVA=D:\\Program Files\\zulu17.62.17-ca-jdk17.0.17-win_x64\\bin\\java.exe
    WAIT_FOR_USER_INPUT=true
    ADDITIONAL_ARGS=-Dlog4j2.formatMsgNoLookups=true
    RESTART=false
 -- SKIP_JAVA_CHECK=false
 ++ SKIP_JAVA_CHECK=true
    JDK_VENDOR=graalvm
    JABBA_INSTALL_URL_SH=https://github.com/Jabba-Team/jabba/raw/main/install.sh
    JABBA_INSTALL_URL_PS=https://github.com/Jabba-Team/jabba/raw/main/install.ps1
    JABBA_INSTALL_VERSION=0.13.0
    SERVERSTARTERJAR_FORCE_FETCH=true
    SERVERSTARTERJAR_VERSION=latest
    USE_SSJ=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后在Windows环境下，直接双击&lt;code&gt;start.bat&lt;/code&gt;启动脚本，进行初始化下载。&lt;/p&gt;
&lt;p&gt;等待过后键入&lt;code&gt;list&lt;/code&gt;命令看到如下输出，说明启动成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; list
There are 0 of a max of 20 players online:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件结构应当如下所示，&lt;code&gt;myserver_start.sh&lt;/code&gt;是我们稍后要编写的启动脚本：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-20_12-20-56.DG_SUj1U_Z2foMJl.webp&quot; alt=&quot;server-2&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;通过Launchd和rcon管理整合包服务器&lt;/h1&gt;
&lt;p&gt;官方启动脚本过于繁琐，有较多的检测机制，因此我只用于初始化安装必要的文件，而实际的启动用到更简洁的自编写脚本，&lt;code&gt;myserver_start.sh&lt;/code&gt;(适用于Linux和macOS)，修改自&lt;a href=&quot;https://docs.liuliyue.cn/games/mcje/introduction/server-jvm-optimization.html#%F0%9F%94%A7-forge-%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BC%98%E5%8C%96&quot;&gt;MineKuai_Wiki&lt;/a&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

SERVER_DIR=&quot;your/server/path&quot;
JAVA_EXEC=&quot;your/java/path&quot;
MEMORY=&quot;8G&quot;

JAVA_ARGS=&quot;-server -Xms${MEMORY} -Xmx${MEMORY} -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=20 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=16M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:SurvivorRatio=32 -XX:MaxTenuringThreshold=1 -XX:+UseStringDeduplication -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -Dfml.readTimeout=180 -Dfml.debugRegistryEntries=true -Dfile.encoding=UTF-8&quot;

FORGE_UNIX_ARGS=&quot;libraries/net/minecraftforge/forge/1.20.1-47.4.10/unix_args.txt&quot;

cd &quot;${SERVER_DIR}&quot; || exit 1
echo &quot;Starting Minecraft server...&quot;

exec &quot;${JAVA_EXEC}&quot; ${JAVA_ARGS} @&quot;${FORGE_UNIX_ARGS}&quot; nogui
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请将SERVER_DIR变量更改为你的服务器目录值&lt;/li&gt;
&lt;li&gt;请将JAVA_EXEC变量更改为你将使用的JAVA路径值&lt;/li&gt;
&lt;li&gt;JAVA的安装和路径查找请到上篇文章 &lt;a href=&quot;https://blog.srprolin.top/posts/mac-mc-1/&quot;&gt;使用MacMini搭建Minecraft服务器&lt;/a&gt; 中自行查找&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后我们可以将整个文件夹打包，上传至MacMini的SERVER_DIR目录并解压。&lt;/p&gt;
&lt;h2&gt;launchd守护进程&lt;/h2&gt;
&lt;p&gt;我们这里选择使用系统服务，即在&lt;code&gt;/Library/LaunchDaemons/&lt;/code&gt;下创建&lt;code&gt;com.betterMCv54.plist&lt;/code&gt;文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建并编辑plist文件
sudo nano /Library/LaunchDaemons/com.betterMCv54.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;文件内容大致如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;com.betterMCv54&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;YOUR_USERNAME&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;/bin/bash&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;/YOUR/PATH/TO/SERVER_DIR/myserver_start.sh&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;

    &amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;/YOUR/PATH/TO/SERVER_DIR&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;ProcessType&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;Interactive&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;code&gt;YOUR_USERNAME&lt;/code&gt;替换为你的当前用户名&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;/YOUR/PATH/TO/SERVER_DIR&lt;/code&gt;(文件中有两处)替换为你具体的&lt;code&gt;SERVER_DIR&lt;/code&gt;的绝对路径&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;确保权限正确：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown root:wheel /Library/LaunchDaemons/com.betterMCv54.plist
sudo chmod 644 /Library/LaunchDaemons/com.betterMCv54.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;加载配置，并启用服务(即开服)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo launchctl load /Library/LaunchDaemons/com.betterMCv54.plist
sudo launchctl start com.betterMCv54

# 如果在启用服务后修改了配置文件，请确保游戏服务器停止后，停止服务，并重载配置
sudo launchctl stop com.betterMCv54
sudo launchctl unload /Library/LaunchDaemons/com.betterMCv54.plist
sudo launchctl load /Library/LaunchDaemons/com.betterMCv54.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用rcon工具向服务器发送指令&lt;/h2&gt;
&lt;p&gt;Minecraft服务器默认不开启rcon功能，我们需要到&lt;code&gt;SERVER_DIR&lt;/code&gt;的&lt;code&gt;server.properties&lt;/code&gt;文件中修改，默认端口为25575：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    #Minecraft server properties
    #Mon Jun 03 21:13:36 CDT 2024
    allow-flight=true
    allow-nether=true
    broadcast-console-to-ops=true
    broadcast-rcon-to-ops=true
    difficulty=normal
    enable-command-block=true
    enable-jmx-monitoring=false
    enable-query=false
 -- enable-rcon=false
 ++ enable-rcon=true
    enable-status=true
    enforce-secure-profile=true
    enforce-whitelist=false
    entity-broadcast-range-percentage=100
    force-gamemode=false
    function-permission-level=2
    gamemode=survival
    generate-structures=true
    generator-settings={}
    hardcore=false
    hide-online-players=false
    initial-disabled-packs=
    initial-enabled-packs=vanilla
    level-name=world
    level-seed=
    level-type=bclib\:normal
    max-chained-neighbor-updates=1000000
    max-players=20
    max-tick-time=60000
    max-world-size=29999984
    motd=Better MC [FORGE] 1.20.1
    network-compression-threshold=256
    online-mode=true
    op-permission-level=4
    player-idle-timeout=0
    prevent-proxy-connections=false
    pvp=true
    query.port=25565
    rate-limit=0
 -- rcon.password=
 ++ rcon.password=yourpassword
    rcon.port=25575
    require-resource-pack=false
    resource-pack=
    resource-pack-prompt=
    resource-pack-sha1=
    server-ip=
    server-port=25565
    simulation-distance=10
    spawn-animals=true
    spawn-monsters=true
    spawn-npcs=true
    spawn-protection=16
    sync-chunk-writes=true
    text-filtering-config=
    use-native-transport=true
    view-distance=10
    white-list=false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;请注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;code&gt;yourpassword&lt;/code&gt;改为你的密码，确保不要泄露，下面的rcon-cli使用中，也替换为你的密码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们选择的远程控制台工具为&lt;a href=&quot;https://github.com/gorcon/rcon-cli/releases&quot;&gt;rcon-cli&lt;/a&gt;，一款命令行rcon工具。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 回到用户目录
cd ~

# 从GitHub下载rcon-cli并解压，简化路径
curl -O https://github.com/gorcon/rcon-cli/releases/download/v0.10.3/rcon-0.10.3-arm64_darwin.tar.gz
tar -zxvf rcon-0.10.3-arm64_darwin.tar.gz
mv rcon-0.10.3-arm64_darwin.tar.gz rcon

# 进入应用目录并添加环境变量
cd rcon
echo &apos;export PATH=&quot;$PATH:/Users/remote/rcon&quot;&apos; &amp;gt;&amp;gt; ~/.zprofile &amp;amp;&amp;amp; source ~/.zprofile

# 检测版本，验证环境变量
rcon --version

# 单行使用
rcon -a localhost:25575 -p yourpassword
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了使用方便，我们可以编辑&lt;code&gt;rcon.yaml&lt;/code&gt;文件，编写默认的主机地址和密码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 前往rcon目录
cd ~/rcon/

# 编辑rcon.yaml
nano rcon.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容大致如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;default:
  address: &quot;localhost:25575&quot; # host:port, for example 127.0.0.1:16260
  password: &quot;yourpassword&quot;
  log: &quot;rcon-default.log&quot;
  type: &quot;&quot; # rcon, telnet, web.
  timeout: &quot;10s&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样设置后的使用流程就为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入rcon目录，执行rcon命令即可进入rcon控制台
cd ~/rcon
rcon

# 使用举例
username@192 ~ % cd ~/rcon
username@192 rcon % rcon
Waiting commands for localhost:25575 (or type :q to exit)
&amp;gt; list
There are 0 of a max of 20 players online:
&amp;gt; :q
username@192 rcon %
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;服务器关服与重启&lt;/h2&gt;
&lt;p&gt;这里我们将MacMini作为服务器使用，那么硬件机器是长期保持运行的，而macOS的自动休眠机制经常会阻止这样的行为，因此我们使用caffeinate声称一个重要进程，进而阻止休眠。&lt;/p&gt;
&lt;p&gt;依旧使用launchd守护进程：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建并编辑plist
sudo nano /Library/LaunchDaemons/local.caffeinate.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容大致如下(参数选择为&lt;code&gt;-ims&lt;/code&gt;这里不添加&lt;code&gt;-d&lt;/code&gt;参数是防止显示器不会自动熄屏)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;local.caffeinate&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;/usr/bin/caffeinate&amp;lt;/string&amp;gt;
        &amp;lt;string&amp;gt;-ims&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;
    &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;root&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;给予权限并加载运行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chown root:wheel /Library/LaunchDaemons/local.caffeinate.plist
sudo chmod 644 /Library/LaunchDaemons/local.caffeinate.plist
sudo launchctl load /Library/LaunchDaemons/local.caffeinate.plist
sudo launchctl start local.caffeinate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于长期运行的硬件而言，我们的&lt;code&gt;com.betterMCv54&lt;/code&gt;服务也是一直存在的，除非我们&lt;code&gt;stop&lt;/code&gt;这个服务(这里是针对launchd守护进程)。&lt;/p&gt;
&lt;p&gt;正确的关服，只需要通过rcon向服务器发送&lt;code&gt;stop&lt;/code&gt;指令，游戏服务器便会保存当前世界数据。&lt;/p&gt;
&lt;p&gt;服务器重新启动，只需要在命令行唤醒服务，触发脚本即可：&lt;code&gt;sudo launchctl start com.betterMCv54&lt;/code&gt;。&lt;/p&gt;
</content:encoded></item><item><title>使用MacMini搭建Minecraft服务器 | MCSmanger面板 | SakuraFRP樱花映射</title><link>https://blog.srprolin.top/posts/mac-mc-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/mac-mc-1/</guid><description>依靠M4芯片极高的性能功耗比，作为搭建吃单核的Minecraft_Java版服务器再合适不过。本篇将完全使用SSH终端，保姆级搭建起MCSManager面板，依靠它来搭建游戏服务器；并使用樱花映射的客户端frpc，将服务器穿透至互联网，搭建起完整的可公网访问服务器。</description><pubDate>Sun, 07 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;本篇文章将从头手把手：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过命令行搭建起 &lt;a href=&quot;https://www.mcsmanager.com/&quot;&gt;mcsmanager&lt;/a&gt; 服务器面板，依靠它作为服务器终端和文件管理；&lt;/li&gt;
&lt;li&gt;使用 &lt;a href=&quot;https://www.natfrp.com/?page=panel&amp;amp;module=addproxy&quot;&gt;樱花内网映射&lt;/a&gt; 服务来做公网地址，仅使用其魔改版 frpc 客户端，通过启动脚本且仅需命令行无需 GUI 使用；&lt;/li&gt;
&lt;li&gt;并结合自定义域名，设置 SRV 类型 DNS 记录，确定最终的服务器地址。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;依据标题所说，目前搭建 Minecraft 服务器最推荐的设备就是 MacMini_M4 了，能耗比几乎拉满；因此本篇教程是针对 arm64 架构的 macOS 系统，且使用默认终端 shell-Zsh 的命令行，真正手把手跑后台，也避免了 GUI 使用不熟练的理解问题。&lt;/p&gt;
&lt;h1&gt;MCSManager 面板安装&lt;/h1&gt;
&lt;p&gt;这是官方文档：&lt;a href=&quot;https://docs.mcsmanager.com/zh_cn/&quot;&gt;快速开始 | MCSmanager&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官方文档并没有提供 MacOS 系统的教程，但是根据 up 主&lt;a href=&quot;https://space.bilibili.com/52833994&quot;&gt;一只会魔法的梨&lt;/a&gt; 所发布的视频 &lt;a href=&quot;https://www.bilibili.com/video/BV1ykVEzCEni/&quot;&gt;【MC 开服】macOS 如何本地安装 MCSManager&lt;/a&gt; 可知，macOS 本身提供了类似 Unix 的命令行环境，只需要提供 Darwin 内核依靠 arm64 的 M4 芯片所需要的依赖，便可以把 Linux 软件移植到 macOS_M4 运行。&lt;/p&gt;
&lt;p&gt;下面将结合官方 Linux 教程，下载 arm64_macOS 所需依赖，安装 MCSManager。&lt;/p&gt;
&lt;h2&gt;运行时环境 nodeJS&lt;/h2&gt;
&lt;p&gt;MCSManager 所需的运行环境，用于构建 web 服务器，便于我们从浏览器操作服务器。&lt;/p&gt;
&lt;p&gt;这里是&lt;a href=&quot;https://nodejs.org/en/download&quot;&gt;node 官方的下载页面&lt;/a&gt;，下面将先安装&lt;code&gt;Homebrew&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 这里默认你的macOS没有任何命令行操作历史，因此先安装Homebrew工具
curl -o- https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh | bash

# 将homebrew添加进Zsh(默认终端)的PATH(环境变量)
echo &apos;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&apos; &amp;gt;&amp;gt; ~/.zprofile &amp;amp;&amp;amp; source ~/.zprofile

#  测试查看brew版本
brew --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PATH&lt;/code&gt;环境变量，是针对 macOS 的默认终端&lt;code&gt;Zsh&lt;/code&gt;，你可以通过&lt;code&gt;echo $SHELL&lt;/code&gt;来查看当前终端类型；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/opt/homebrew/bin/brew&lt;/code&gt;是 M 系列芯片安装的默认位置，Intel 芯片位置可能不同，自行查询；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~&lt;/code&gt;代表当前用户，也即此 PATH 只添加到当前用户的&lt;code&gt;Zsh&lt;/code&gt;终端中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是安装 node(包含 npm 包管理器)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 通过homebrew安装
brew install node@24

# 为node24添加软链接
brew link node@24

# 测试查看node版本
node -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;tips：这里已经确保&lt;code&gt;homebrew&lt;/code&gt;添加进了 PATH 环境变量，由于安装的 node 是具体版本，所以需要手动创建软链接，以便于在终端中使用命令。&lt;/p&gt;
&lt;h2&gt;安装 Java&lt;/h2&gt;
&lt;p&gt;既然是搭建 Java 的 Minecraft 服务器，那当然需要 Java 了，在官方文档中也提出了某些 Java 版本对应的 Minecraft 版本，这里我只安装 Java17 和 Java21：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 通过brew安装openjdk17
brew install openjdk@17

# 添加软链接
brew link openjdk@17

# 检测版本
java -version

# 安装openjdk21
brew install openjdk@21

# 先取消旧链接，再添加新软链接
brew unlink openjdk@17
brew link openjdk@21

# 检测版本
java -version

# 查看当前Java的绝对路径
ls -l /opt/homebrew/bin/java
# 得到类似信息
lrwxr-xr-x  1 remote  admin  36 Dec  7 17:25 /opt/homebrew/bin/java -&amp;gt; ../Cellar/openjdk@21/21.0.9/bin/java
# 那么你的Java绝对路径为
/opt/homebrew/Cellar/openjdk@21/21.0.9/bin/java
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;学会查看 Java 的绝对路径，后面将使用绝对路径写启动脚本。&lt;/p&gt;
&lt;h2&gt;MCSManager 本体&lt;/h2&gt;
&lt;p&gt;依照官方教程，获取安装包并执行安装脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 前往用户家目录
cd ~

# 获取安装包并解压
curl -O https://github.com/MCSManager/MCSManager/releases/latest/download/mcsmanager_linux_release.tar.gz
tar -xzf mcsmanager_linux_release.tar.gz

# 删除压缩包，进入项目目录
rm mcsmanager_linux_release.tar.gz
cd mcsmanager/

# 为安装脚本授予完全权限并运行
chmod 775 ./install.sh
sh ./install.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来，就需要安装 macOS_M4 所需要的依赖&lt;a href=&quot;https://github.com/MCSManager/PTY&quot;&gt;PTY&lt;/a&gt;和&lt;a href=&quot;https://github.com/MCSManager/Zip-Tools&quot;&gt;Zip-tools&lt;/a&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 前往目标目录
cd ~/mcsmanager/daemon/lib/

# 安装arm64的pty
curl -O https://github.com/MCSManager/PTY/releases/download/latest/pty_darwin_arm64

# 安装arm64的zip-tools
curl -O https://github.com/MCSManager/Zip-Tools/releases/download/latest/file_zip_darwin_arm64
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面执行启动脚本，进行测试，(通过&lt;code&gt;Ctrl+C&lt;/code&gt;来终止)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;./start-daemon.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;./start-web.sh&lt;/code&gt;: 这是官方的 web 页面启动脚本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于有两个脚本，所以需要两个终端来执行，这也是官方文档中的最终使用教程。&lt;/p&gt;
&lt;p&gt;下面我将两个脚本注册为 launchd 系统服务，长期保持在后台，且自动恢复，实现无痕长期运行。&lt;/p&gt;
&lt;h2&gt;launchd 系统服务&lt;/h2&gt;
&lt;p&gt;我们需要先创建一个日志目录，用来存储脚本的运行消息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建日志目录
mkdir -p ~/mcsmanager/logs

# 创建系统服务plist文件(使用nano编辑器)
sudo nano /Library/LaunchDaemons/com.mcsmanager.daemon.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;com.mcsmanager.daemon.plist&lt;/code&gt;文件内容大致如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;com.mcsmanager.daemon&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;这里填写你的start-daemon.sh脚本绝对路径&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;

    &amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;这里填写你的mcsmanager绝对路径&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;PATH&amp;lt;/key&amp;gt;
        &amp;lt;string&amp;gt;/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&amp;lt;/string&amp;gt;
    &amp;lt;/dict&amp;gt;

    &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;这里填写你的daemon.log日志文件绝对路径&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;这里填写你的daemon-error.log日志文件绝对路径&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;这里填写你的服务运行用户名&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明(将文件中的中文改成所需参数)，假设我们的用户名是&lt;code&gt;test&lt;/code&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;start-daemon.sh&lt;/code&gt;脚本绝对路径举例：&lt;code&gt;/Users/test/mcsmanager/start-daemon.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcsmanager&lt;/code&gt;绝对路径举例：&lt;code&gt;/Users/test/mcsmanager/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;daemon.log&lt;/code&gt;日志文件绝对路径举例(上文中已经创建了 logs 用来存储日志)：&lt;code&gt;/Users/test/mcsmanager/logs/daemon.log&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;daemon-error.log&lt;/code&gt;日志文件绝对路径举例：&lt;code&gt;/Users/test/mcsmanager/logs/daemon-error.log&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;服务运行用户名举例：&lt;code&gt;test&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建 web 界面脚本的 plist 服务文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 使用nano编辑器编辑文件
sudo nano /Library/LaunchDaemons/com.mcsmanager.web.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;com.mcsmanager.web.plist&lt;/code&gt;文件内容大致如下，依据上文举例的以&lt;code&gt;test&lt;/code&gt;用户名为例，请按需调整：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;com.mcsmanager.web&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;/Users/test/mcsmanager/start-web.sh&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;

    &amp;lt;key&amp;gt;WorkingDirectory&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;/Users/test/mcsmanager/&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;EnvironmentVariables&amp;lt;/key&amp;gt;
    &amp;lt;dict&amp;gt;
        &amp;lt;key&amp;gt;PATH&amp;lt;/key&amp;gt;
        &amp;lt;string&amp;gt;/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin&amp;lt;/string&amp;gt;
    &amp;lt;/dict&amp;gt;

    &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;/Users/test/mcsmanager/logs/web.log&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;/Users/test/mcsmanager/logs/web-error.log&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;UserName&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;test&amp;lt;/string&amp;gt;
&amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，确保服务文件属于 root，并加载配置，启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 文件所属
sudo chown root:wheel /Library/LaunchDaemons/com.mcsmanager.daemon.plist
sudo chown root:wheel /Library/LaunchDaemons/com.mcsmanager.web.plist

# 加载配置
sudo launchctl load /Library/LaunchDaemons/com.mcsmanager.daemon.plist
sudo launchctl load /Library/LaunchDaemons/com.mcsmanager.web.plist

# 启动服务
sudo launchctl start com.mcsmanager.daemon
sudo launchctl start com.mcsmanager.web

# 查看服务是否运行
sudo launchctl list | grep mcsmanager

# 查看日志
tail -f ~/mcsmanager/logs/daemon.log
tail -f ~/mcsmanager/logs/web.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果需要停止该服务，请按下列执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 先终止服务
sudo launchctl stop com.mcsmanager.daemon
sudo launchctl stop com.mcsmanager.web

# 卸载配置
sudo launchctl unload /Library/LaunchDaemons/com.mcsmanager.daemon.plist
sudo launchctl unload /Library/LaunchDaemons/com.mcsmanager.web.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用面板搭建服务器&lt;/h2&gt;
&lt;p&gt;现在我们已经成功部署了 mcsmanager，如果你在使用 MacMini 的 GUI，也就是说你是本机，请在浏览器输入&lt;code&gt;http://127.0.0.1:23333&lt;/code&gt;访问面板，如果你是远程环境，请自行解决内部网络问题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-07_16-59-33.DfSJoGKN_Z1H2O9k.webp&quot; alt=&quot;mcsmanager-1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在 web 页面内使用 Minecraft 模板创建服务器，都是懒人操作，这里不做详细步骤说明了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-07_17-05-35.ClvNJYR7_Z1tQnU7.webp&quot; alt=&quot;mcsmanager-2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;现在假设你已经创建了一个实例并进入了 web 后台页面，你需要对服务器启动命令进行设置。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-07_17-10-15.DYYGONAP_Z20JonO.webp&quot; alt=&quot;mcsmanager-3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按照图中的例子，&lt;code&gt;1.21.4&lt;/code&gt;的 Minecraft 需要&lt;code&gt;jdk21&lt;/code&gt;版本来运行，内存限制为最小 2G 最高 4G，使用 UTF-8 编码输入输出，且我的服务端核心名为&lt;code&gt;paper-1.21.4-232.jar&lt;/code&gt;，则启动命令为：
&lt;code&gt;/opt/homebrew/Cellar/openjdk@21/21.0.9/bin/java -Xms2G -Xmx4G -Dfile.encoding=utf-8 -Dstdout.encoding=utf-8 -Dstderr.encoding=utf-8 -Djline.terminal=jline.UnsupportedTerminal -jar paper-1.21.4-232.jar -nogui&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;樱花内网穿透&lt;/h1&gt;
&lt;p&gt;如果你会使用 GUI 来运行官方的启动器客户端，是否有过要保持开启该软件的困扰？&lt;/p&gt;
&lt;p&gt;这里将用 frpc 的方式来启用隧道，并将启动脚本注册为系统服务，实现无痕穿透。&lt;/p&gt;
&lt;p&gt;这是官方的 frpc 下载页面：&lt;a href=&quot;https://www.natfrp.com/tunnel/download&quot;&gt;软件下载 | SakuraFrp&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;创建隧道&lt;/h2&gt;
&lt;p&gt;进入&lt;a href=&quot;https://www.natfrp.com/tunnel/&quot;&gt;官方隧道列表&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;选择创建隧道，任意选物理位置较近的节点，按照下面的配置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-07_18-32-33.roLy01DR_ZjHUcz.webp&quot; alt=&quot;隧道&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Minecraft_Java 版服务器，是通过 TCP 协议通信的，比较特殊，端口不进行更改默认为 25565。&lt;/p&gt;
&lt;h2&gt;sfrp 命令启用隧道&lt;/h2&gt;
&lt;p&gt;这里我们是 Mac_mini_M4 硬件，因此选择左侧&lt;code&gt;macOS Apple Silicon (arm64)&lt;/code&gt;，复制下载链接。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入用户家目录，创建SakuraFrp文件夹并进入
cd ~
mkdir sakura_frp
cd sakura_frp/

# 下载樱花官方frpc
curl -O https://nya.globalslb.net/natfrp/client/frpc/0.51.0-sakura-12.3/frpc_darwin_arm64

# 授予执行权限
chmod +x frpc_darwin_arm64

# 添加软链接到Homebrew，注册名为sfrp
# 原因是brew已经在环境变量PATH里了
# 这里的test要替换成你的用户名
ln -s /Users/test/sakura_frp/frpc_darwin_arm64 /opt/homebrew/bin/sfrp

# 检测版本
sfrp -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，已经可以使用官方提到的类似格式&lt;code&gt;frpc -f &amp;lt;访问密钥&amp;gt;:&amp;lt;隧道ID 1&amp;gt;[,隧道ID 2[,隧道ID 3...]]&lt;/code&gt;来启动隧道。
而具体到我们现在的环境，举例密钥为&lt;code&gt;wdnmdtoken6666666&lt;/code&gt;，隧道 ID1 为&lt;code&gt;114514&lt;/code&gt;，隧道 ID2 为&lt;code&gt;114516&lt;/code&gt;，则命令为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启用两个隧道
sfrp -f wdnmdtoken6666666:114514,114516
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样仍然不能解决该终端需要一直保持开启的痛点，下面将提供一个脚本&lt;code&gt;start_sfrp.sh&lt;/code&gt;来保存配置，并注册至 launchd，在系统后台自动运行，且如果有新隧道或更换用户，只需要对&lt;code&gt;start_sfrp.sh&lt;/code&gt;内容进行修改，重载服务配置即可。&lt;/p&gt;
&lt;h2&gt;樱花穿透 launchd 服务&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 进入目标路径
cd ~/sakura_frp/

# 创建编辑start_sfrp.sh脚本
nano start_sfrp.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;start_sfrp.sh&lt;/code&gt;脚本内容大致如下(注意替换&lt;code&gt;test&lt;/code&gt;用户名)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash

FRPC_PATH=&quot;/Users/test/sakura_frp/frpc_darwin_arm64&quot;

ACCESS_KEY=&quot;&amp;lt;key&amp;gt;&quot;
TUNNEL_IDS=&quot;&amp;lt;tunnel_id&amp;gt;&quot;

exec $FRPC_PATH -f $ACCESS_KEY:$TUNNEL_IDS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;key&amp;gt;&lt;/code&gt;:替换为你的访问密钥，在&lt;a href=&quot;https://www.natfrp.com/user/&quot;&gt;官方后台首页&lt;/a&gt;可获得。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;tunnel_id&amp;gt;&lt;/code&gt;：替换为你的隧道 ID，访问&lt;a href=&quot;https://www.natfrp.com/tunnel/&quot;&gt;官方隧道列表&lt;/a&gt;，无需复制，已经展示出来了，例如&lt;code&gt;114514&lt;/code&gt;和&lt;code&gt;1114516&lt;/code&gt;；如果你是单隧道，只填写数字即可，如果是多隧道，以英文&lt;code&gt;,&lt;/code&gt;隔开，例如&lt;code&gt;TUNNEL_IDS=&quot;114514,114516&quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;# 添加执行权限
chmod +x start_sfrp.sh

# 创建日志目录
mkdir log

# 创建服务plist文件
sudo nano /Library/LaunchDaemons/com.frp.sfrp.plist
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;com.frp.sfrp.plist&lt;/code&gt;文件内容大致如下(将&lt;code&gt;test&lt;/code&gt;替换为你的用户名)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;!DOCTYPE plist PUBLIC &quot;-//Apple//DTD PLIST 1.0//EN&quot; &quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;&amp;gt;
&amp;lt;plist version=&quot;1.0&quot;&amp;gt;
&amp;lt;dict&amp;gt;
    &amp;lt;key&amp;gt;Label&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;com.frp.sfrp&amp;lt;/string&amp;gt;

    &amp;lt;key&amp;gt;ProgramArguments&amp;lt;/key&amp;gt;
    &amp;lt;array&amp;gt;
        &amp;lt;string&amp;gt;/Users/test/sakura_frp/start_sfrp.sh&amp;lt;/string&amp;gt;
    &amp;lt;/array&amp;gt;

    &amp;lt;key&amp;gt;StandardOutPath&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;/Users/test/sakura_frp/log/sfrp_stdout.log&amp;lt;/string&amp;gt;
    &amp;lt;key&amp;gt;StandardErrorPath&amp;lt;/key&amp;gt;
    &amp;lt;string&amp;gt;/Users/test/sakura_frp/log/sfrp_stderr.log&amp;lt;/string&amp;gt;

    &amp;lt;/dict&amp;gt;
&amp;lt;/plist&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# 设置权限
sudo chown root:wheel /Library/LaunchDaemons/com.frp.sfrp.plist

# 加载服务并运行
sudo launchctl load /Library/LaunchDaemons/com.frp.sfrp.plist
sudo launchctl start com.frp.sfrp

# 查看日志
tail -f ~/sakura_frp/log/sfrp_stdout.log
tail -f ~/sakura_frp/log/sfrp_stderr.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时在&lt;a href=&quot;https://www.natfrp.com/tunnel/&quot;&gt;官方隧道列表&lt;/a&gt;，可以看到隧道已被启用。&lt;/p&gt;
&lt;p&gt;如果你的脚本内容发生更改，请重载 launchd 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo launchctl stop com.frp.sfrp
sudo launchctl unload /Library/LaunchDaemons/com.frp.sfrp.plist
sudo launchctl load /Library/LaunchDaemons/com.frp.sfrp.plist
sudo launchctl start com.frp.sfrp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此已经可以优雅地进行服务器地址的配置了。&lt;/p&gt;
&lt;h2&gt;服务器地址&lt;/h2&gt;
&lt;p&gt;使用樱花内网穿透，官方已经提供了一个访问地址了，在&lt;a href=&quot;https://www.natfrp.com/tunnel/&quot;&gt;官方隧道列表&lt;/a&gt;，点击那个数字，即可复制到服务器地址，类似&lt;code&gt;frp-art.com:114514&lt;/code&gt;,这个地址已经可以用来连接到服务器了。&lt;/p&gt;
&lt;p&gt;如果你拥有一个域名，那么你可以写一条 SRV 类型的 DNS 记录指向你的自定义域名，来作为服务器地址。&lt;/p&gt;
&lt;p&gt;下面将以 Cloudflare 的 DNS 为例，创建自定义域名地址：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-07_18-28-30.j65sNcS0_2bQnQE.webp&quot; alt=&quot;cloudflare&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;至此，只要你的机器在运行，你随时可以通过 web 面板访问服务器终端，且服务器地址是一直生效的。&lt;/p&gt;
&lt;p&gt;现在你就可以优雅地进行宣传服务器了。&lt;/p&gt;
</content:encoded></item><item><title>内网穿透Frp搭建</title><link>https://blog.srprolin.top/posts/frp-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/frp-1/</guid><description>IPv4的告尽，突破多层NAT实现内网穿透的需求增大，Frp借由公网IP服务器实现内网端口流量转发，突破内网访达限制。</description><pubDate>Fri, 05 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介与摘要&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fatedier/frp&quot;&gt;frp&lt;/a&gt; 是一个专注于内网穿透的高性能的反向代理应用，支持 TCP、UDP、HTTP、HTTPS 等多种协议，且支持 P2P 通信。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。&lt;/p&gt;
&lt;p&gt;市面上的内网穿透服务&lt;a href=&quot;https://www.natfrp.com/?page=panel&amp;amp;module=download&quot;&gt;Sakura FRP&lt;/a&gt;也是基于此实现的。&lt;/p&gt;
&lt;p&gt;本文将以 Ubuntu24 系统公网云服务器为例，Frp 官方压缩包版本为 v0.65.0，分享部署自用内网穿透服务的步骤。&lt;/p&gt;
&lt;p&gt;文中未提到的多处细节，请参考&lt;a href=&quot;https://gofrp.org/zh-cn/docs/&quot;&gt;官方文档&lt;/a&gt;自行了解。&lt;/p&gt;
&lt;h1&gt;Frp 部署&lt;/h1&gt;
&lt;p&gt;官方的 release 界面下载到的压缩包中，会包含 frpc 客户端和 frps 服务端两个程序，我们一般在服务器上保留 frps，在需要穿透的内网机器上保留 frpc，我将分别演示在服务端(Linux)和客户端(Windows)上的操作：&lt;/p&gt;
&lt;h2&gt;Frps 服务端&lt;/h2&gt;
&lt;p&gt;分步总览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载官方压缩包并解压进入项目目录&lt;/li&gt;
&lt;li&gt;删除有关客户端 frpc 的文件&lt;/li&gt;
&lt;li&gt;编辑 frps.toml 以初始化服务端配置&lt;/li&gt;
&lt;li&gt;为 frps 创建 systemd 后台服务文件&lt;/li&gt;
&lt;li&gt;将 frps 归入系统后台服务并开机自启&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;命令行操作(关于&lt;code&gt;wget&lt;/code&gt;网络问题，可以自行下载好压缩包之后，通过&lt;code&gt;sftp&lt;/code&gt;上传至服务器)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 在用户目录下(不必使用sudo)，获取并解压官方amd64(服务器系统框架)版本最新压缩包：
cd ~
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
tar -xvf frp_0.65.0_linux_amd64.tar.gz

# 更名项目文件夹名,并进入项目目录
mv frp_0.65.0_linux_amd64 frps
cd frps/

# 删除客户端frpc相关文件
rm frpc
rm frpc.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在我们需要编辑&lt;code&gt;frps.toml&lt;/code&gt;文件内容，这里使用&lt;code&gt;nano&lt;/code&gt;编辑器：&lt;code&gt;nano frps.toml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;文件内容大致如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# frps.toml

bindAddr = &quot;0.0.0.0&quot;

# 这里是frps服务端口，需要在云厂商安全组和系统防火墙中打开
bindPort = 7000

webServer.addr = &quot;0.0.0.0&quot;

# 这里是frps提供的web页面端口，同样需要开放
webServer.port = 7500

# 这是web页面的初始访问密码
webServer.user = &quot;admin&quot;

webServer.password = &quot;admin&quot;

# 这是用于连通客户端与服务端的凭证码，请设置复杂些
auth.token = &quot;Jdag0XDeMnzcPI&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在按照官方用法，只需要执行&lt;code&gt;./frps -c ./frps.toml&lt;/code&gt;便可开启服务，并在 7500 端口查看 frps 的 web 页面。&lt;/p&gt;
&lt;p&gt;但是此时该服务只能运行在 ssh 终端，也就是说关闭了 ssh 连接，frp 服务也将终止。&lt;/p&gt;
&lt;p&gt;因此按照官方文档的推荐方法，可以将 frps 注册为 systemd 系统服务，跑在服务器后台。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 安装systemd(一般会内置)
sudo apt install systemd

# 创建并编辑frps.service文件(需要sudo权限)
sudo nano /etc/systemd/system/frps.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;内容大致如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# frps.service

[Unit]
# 服务名称，可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令，需修改为您的frps的安装路径
ExecStart = /home/usrname/frps/frps -c /home/usrname/frps/frps.toml

[Install]
WantedBy = multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后通过&lt;code&gt;systemctl&lt;/code&gt;启动&lt;code&gt;frps&lt;/code&gt;服务(&lt;code&gt;systemctl&lt;/code&gt;常用参数:&lt;code&gt;start&lt;/code&gt;、&lt;code&gt;stop&lt;/code&gt;、&lt;code&gt;restart&lt;/code&gt;、&lt;code&gt;status&lt;/code&gt;)：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启动frps，可访问7500端口或用status参数查看是否运行成功
sudo systemctl start frps

# 设置frps为自启动
sudo systemctl enable frps
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Frpc 客户端&lt;/h2&gt;
&lt;p&gt;分步总览：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载并解压官方压缩包&lt;/li&gt;
&lt;li&gt;删除 frps 相关文件&lt;/li&gt;
&lt;li&gt;编辑&lt;code&gt;frpc.toml&lt;/code&gt;配置初始化&lt;/li&gt;
&lt;li&gt;编辑&lt;code&gt;bat&lt;/code&gt;和&lt;code&gt;vbs&lt;/code&gt;文件以达到后台效果&lt;/li&gt;
&lt;li&gt;通过 web 界面编辑穿透服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里以 amd64 的 Windows 系统为例，&lt;a href=&quot;https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_windows_amd64.zip&quot;&gt;点击下载官方压缩包&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以&lt;code&gt;C:\Program Files\frpc&lt;/code&gt;目录为例，存放解压后的文件。&lt;/p&gt;
&lt;p&gt;删除&lt;code&gt;frps.exe&lt;/code&gt;和&lt;code&gt;frps.toml&lt;/code&gt;两个文件。&lt;/p&gt;
&lt;p&gt;编辑&lt;code&gt;frpc.toml&lt;/code&gt;内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# frpc.toml

# 请写入你的服务器公网IP或者域名替换&quot;&amp;lt;IP&amp;gt;&quot;
serverAddr = &quot;&amp;lt;IP&amp;gt;&quot;

# 默认端口为7000
serverPort = 7000

# 这里填写刚才在frps.toml中填写的认证凭证token
auth.token = &quot;Jdag0XDeMnzcPI&quot;

# 默认Web界面使用本机7400端口
webServer.addr = &quot;127.0.0.1&quot;
webServer.port = 7400

# web界面初始用户名密码
webServer.user = &quot;admin&quot;
webServer.password = &quot;admin&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时我们双击运行&lt;code&gt;frpc.exe&lt;/code&gt;文件就能运行该服务，但是它需要跑在终端里。&lt;/p&gt;
&lt;p&gt;下面将使用&lt;code&gt;bat&lt;/code&gt;脚本+&lt;code&gt;vbs&lt;/code&gt;脚本的方式，让该服务跑在后台，不占用前台终端。&lt;/p&gt;
&lt;p&gt;在该目录下创建&lt;code&gt;start_frpc.bat&lt;/code&gt;文件，编辑内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@echo off
title FRP Client
echo starting frp client...
echo logs_output：
echo ==============================

:: 切换到frpc所在目录（请替换为实际路径）
cd /d C:\Program Files\frpc

:: 启动frpc并将日志输出到文件
frpc.exe -c frpc.toml&amp;gt; frpc_log.txt 2&amp;gt;&amp;amp;1

:: 如果启动失败，暂停显示错误信息
if %errorlevel% neq 0 (
    echo FRP Client start failed！
    echo error messages are saved in frpc_log.txt
    pause
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建&lt;code&gt;start_frpc.vbs&lt;/code&gt;文件，编辑内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set objShell = CreateObject(&quot;WScript.Shell&quot;)
objShell.Run &quot;cmd /c start_frpc.bat&quot;, 0, False
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后为&lt;code&gt;start_frpc.vbs&lt;/code&gt;创建一个桌面快捷方式，双击快捷方式即可在后台运行，可访问&lt;code&gt;http://127.0.0.1:7400&lt;/code&gt;检查是否成功。&lt;/p&gt;
&lt;h1&gt;Frp 示例 | 穿透本机游戏端口&lt;/h1&gt;
&lt;p&gt;在上面的教程中，只是成功部署了 frp 服务，我们部署 frpc 客户端也是为了显示本机应用端口的穿透，下面将演示 Minecraft_Java 游戏服务器和 CS2 游戏房间的穿透案例。&lt;/p&gt;
&lt;p&gt;运行&lt;code&gt;start_frpc.vbs&lt;/code&gt;启动客户端后，前往&lt;a href=&quot;http://127.0.0.1:7400&quot;&gt;web 页面&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-05_16-23-31.B99SjkRN_Z29uhCA.webp&quot; alt=&quot;frpc_web&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我这里是已经部署成功后的页面，点击左边&lt;code&gt;configure&lt;/code&gt;可以实现在 web 页面编辑&lt;code&gt;frpc.toml&lt;/code&gt;文件：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-12-05_16-27-30.J75gMyN6_ZlzsJR.webp&quot; alt=&quot;frpc_web_toml&quot; /&gt;&lt;/p&gt;
&lt;p&gt;按照此格式写入后，点击&lt;code&gt;upload&lt;/code&gt;即可更新配置文件，便可实现内网穿透：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[[proxies]]
name = &quot;minecraft&quot;
type = &quot;tcp&quot;
localIP = &quot;127.0.0.1&quot;
localPort = 25565
remotePort = 25565
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;name：只用做服务标识，可以随便设置&lt;/li&gt;
&lt;li&gt;type：对于当前案例来说，多数网游使用&lt;code&gt;udp&lt;/code&gt;，而 Minecraft_Java 版游戏使用&lt;code&gt;tcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;localIP：一般不用更改，127.0.0.1 表示本机。&lt;/li&gt;
&lt;li&gt;localPort：根据需要的服务端口而言，这里 Minecraft 服务器默认跑在 25565 端口，CS2 房间是跑在 27015 端口。&lt;/li&gt;
&lt;li&gt;remotePort：指的是别人需要通过远程服务器上的哪个端口来访问你本机的游戏服务器，该端口需要在云厂商安全组中放行，可与本地游戏服务端口不一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;本人对 Frp 的使用是非常有限的，实际上官方文档中对 Frp 的功能介绍远比我这里多得多，本文旨在展示这么一样东西，了解 Frp 的基础操作逻辑和参数说明，可以帮大家在使用比如 &lt;a href=&quot;https://www.natfrp.com/?page=panel&amp;amp;module=download&quot;&gt;Sakura FRP 樱花内网穿透&lt;/a&gt; 时，不那么茫然。&lt;/p&gt;
</content:encoded></item><item><title>SrP-CFG_Installer_v1.1.1命令行程序 | CS2 | CFG</title><link>https://blog.srprolin.top/posts/cfginstaller/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/cfginstaller/</guid><description>一个方便安装SrP-CFG的命令行程序</description><pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;该项目是为了方便用户安装SrP-CFG而设计的，其功能就是替代了用户手动寻找路径并解压的步骤。&lt;/p&gt;
&lt;p&gt;如果您未知CFG是什么？或者SrP-CFG是什么？请移步访问前篇：&lt;a href=&quot;https://blog.srprolin.top/posts/srp-cfg/&quot;&gt;SrP-CFG 游戏设置预设文件 | CS2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关于SrP-CFG项目，以下为项目文档链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-1.html&quot;&gt;项目说明书&lt;/a&gt; | 本项目的一些废话&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-2.html&quot;&gt;下载地址&lt;/a&gt; | 顾名思义&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-3.html&quot;&gt;使用指南&lt;/a&gt; | 按键、控制台命令功能表&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-4.html&quot;&gt;更新日志&lt;/a&gt; | 查看最新更新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;后续可能会更新GUI版本，并支持&lt;strong&gt;cs2_video.txt&lt;/strong&gt;文件导入目标730文件的需求。&lt;/p&gt;
&lt;h1&gt;功能说明&lt;/h1&gt;
&lt;p&gt;目前版本v1.1.1的功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动识别steam安装路径&lt;/li&gt;
&lt;li&gt;自动识别CS2游戏安装路径(主要是全局cfg文件夹)&lt;/li&gt;
&lt;li&gt;支持多&lt;strong&gt;cfg&lt;/strong&gt;文件或&lt;strong&gt;zip&lt;/strong&gt;压缩包(只筛入cfg文件)拖入&lt;/li&gt;
&lt;li&gt;自动备份用户游戏全局cfg文件夹至上层目录的&lt;strong&gt;cfg_backup.zip&lt;/strong&gt;中&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;使用说明&lt;/h1&gt;
&lt;p&gt;前往&lt;a href=&quot;https://github.com/RolinShmily/SrP-CFG_ForCS2/releases&quot;&gt;项目Release&lt;/a&gt;或者&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-2.html&quot;&gt;文档页下载地址&lt;/a&gt;下载安装器。&lt;/p&gt;
&lt;p&gt;双击运行后如下图所示，推荐下载配套的&lt;strong&gt;SrP-CFG&lt;/strong&gt;压缩包，拖入即可安装。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2025-11-22_17-20-56.79Y4syWK.79Y4syWK_Z2ukM7u.webp&quot; alt=&quot;SrP-CFG_Installer_v1.1.1&quot; /&gt;&lt;/p&gt;
</content:encoded></item><item><title>Autoexec文件详解 | SrP-CFG | CS2</title><link>https://blog.srprolin.top/posts/autoexec/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/autoexec/</guid><description>本篇将详细解析autoexec.cfg文件的功能列表，和部分实现途径</description><pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;这是以我制作的CS2游戏预设文件SrP-CFG中的&lt;strong&gt;autoexec.cfg&lt;/strong&gt;文件为主体的，一篇功能解析文章。&lt;/p&gt;
&lt;p&gt;在Bilibili平台已发布该文件的部分功能的游戏实现演示，请移步访问：&lt;a href=&quot;https://www.bilibili.com/video/BV19pCQB6EPZ/&quot;&gt;BV19pCQB6EPZ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果您未知CFG是什么？或者SrP-CFG是什么？请移步访问前篇：&lt;a href=&quot;https://blog.srprolin.top/posts/srp-cfg/&quot;&gt;SrP-CFG 游戏设置预设文件 | CS2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;截止文章发布时，最新版本为&lt;strong&gt;v1.1.0&lt;/strong&gt;，以此为例进行功能说明。&lt;/p&gt;
&lt;p&gt;下面将对文件进行解析说明。&lt;/p&gt;
&lt;h1&gt;整体框架与使用思路&lt;/h1&gt;
&lt;p&gt;虽然该文件出自&lt;strong&gt;SrP-CFG&lt;/strong&gt;集合，但是其最初或者本应承担的功能，如同它的名字(自动加载)一样，是保存游戏基础设置。&lt;/p&gt;
&lt;p&gt;因此该文件，也可以脱离&lt;strong&gt;SrP-CFG&lt;/strong&gt;进行使用，但是我将不会提供单独的下载链接，如有需要，还请前往文档页进行下载&lt;strong&gt;SrP-CFG&lt;/strong&gt;，再从中提取出&lt;strong&gt;autoexec.cfg&lt;/strong&gt;单独使用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-1.html&quot;&gt;项目说明书&lt;/a&gt; | 本项目的一些废话&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-2.html&quot;&gt;下载地址&lt;/a&gt; | 顾名思义&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-3.html&quot;&gt;使用指南&lt;/a&gt; | 按键、控制台命令功能表&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-4.html&quot;&gt;更新日志&lt;/a&gt; | 查看最新更新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件功能定义分区：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;鼠标相关设置&lt;/li&gt;
&lt;li&gt;基础按键绑定(前后左右跳)&lt;/li&gt;
&lt;li&gt;联动CFG启动按键&lt;/li&gt;
&lt;li&gt;基础准星(自定义准星替换)&lt;/li&gt;
&lt;li&gt;狙击镜准星(粗细、扩散否？)&lt;/li&gt;
&lt;li&gt;投掷物准星(正交坐标系准星)&lt;/li&gt;
&lt;li&gt;准星杂项(❌不准打队友)&lt;/li&gt;
&lt;li&gt;持枪视角(手模型位置)&lt;/li&gt;
&lt;li&gt;雷达&lt;/li&gt;
&lt;li&gt;网络、延迟、帧数显示&lt;/li&gt;
&lt;li&gt;边角小功能设置(曳光弹、亮度、连镜、消音器)&lt;/li&gt;
&lt;li&gt;快捷聊天轮盘(不开麦时神器)&lt;/li&gt;
&lt;li&gt;声音&lt;/li&gt;
&lt;li&gt;HUD界面(血量颜色、回合记分牌位置)&lt;/li&gt;
&lt;li&gt;杂项&lt;/li&gt;
&lt;li&gt;控制台别名功能绑定区&lt;/li&gt;
&lt;li&gt;联动CFG初始化&lt;/li&gt;
&lt;li&gt;控制台导航(在你启动后控制台会弹出的消息菜单)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根据功能分区可以知道，这份文件确实是完全可以单独使用的，必要的一些设置都是涵盖的。&lt;/p&gt;
&lt;p&gt;控制台导航信息是文件自定义功能的一些按键指南，在游戏中如果有忘记的，可以打开控制台一览，快速查询。&lt;/p&gt;
&lt;h1&gt;各分区各功能详解&lt;/h1&gt;
&lt;h2&gt;鼠标相关设置&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sensitivity 0.5625                 // 灵敏度
zoom_sensitivity_ratio 1 		   // 开镜灵敏度
m_yaw 0.022                        // x轴速度
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里前两行都是对标游戏设置里的选项。&lt;/p&gt;
&lt;p&gt;小技巧tips：在设置鼠标灵敏度时，使用控制台，是可以精准设置数字的。例如这里文件中设置的&lt;strong&gt;0.5625&lt;/strong&gt;,如果你在游戏的那个设置条(Bar)上拉一个数字也是&lt;strong&gt;0.562&lt;/strong&gt;,但是你在控制台中输入&lt;strong&gt;sensitivity&lt;/strong&gt;，你会发现控制台提示，你的灵敏度是随机数比如&lt;strong&gt;0.56234536456&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对于第三项&lt;strong&gt;x轴速度&lt;/strong&gt;，严格来说是游戏摄像机的&lt;strong&gt;x轴角度系数&lt;/strong&gt;，但为了方便理解，还是用&lt;strong&gt;x轴速度&lt;/strong&gt;吧，在CS中主要涉及到分辨率相关的问题。
我们知道现在的主流游戏、显示器、视频都是&lt;strong&gt;16:9&lt;/strong&gt;，也就是我们日常使用电脑时的分辨率；而大多数CS玩家的复古分辨率&lt;strong&gt;4:3拉伸&lt;/strong&gt;，会导致画面被水平拉伸至两侧，这样使游戏人物变&lt;strong&gt;宽&lt;/strong&gt;,但也带来的问题就是鼠标的光标也被拉&lt;strong&gt;宽&lt;/strong&gt;、水平速度变&lt;strong&gt;快&lt;/strong&gt;了。&lt;/p&gt;
&lt;p&gt;在游戏中默认&lt;strong&gt;0.022&lt;/strong&gt;的&lt;strong&gt;x轴速度&lt;/strong&gt;为&lt;strong&gt;16:9&lt;/strong&gt;下的默认参数。也就是如果你游戏是&lt;strong&gt;16:9&lt;/strong&gt;，那么鼠标的移动速度是和平时使用一样的；但如果你是&lt;strong&gt;4:3拉伸&lt;/strong&gt;，拉伸带来的速度加快，也是会体现到你游戏视角中的。&lt;/p&gt;
&lt;p&gt;为了匹配鼠标横向和纵向的移动速度，在&lt;strong&gt;4:3拉伸&lt;/strong&gt;的情况下，可以调整参数为&lt;strong&gt;0.0165&lt;/strong&gt;,还原到日常使用鼠标时带来的反馈速度。我这里没有调整，请自行按需尝试修改。&lt;/p&gt;
&lt;h2&gt;基础按键绑定&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;bind &quot;w&quot; &quot;+forward&quot;                // 向前移动
bind &quot;s&quot; &quot;+back&quot;                   // 向后移动
bind &quot;a&quot; &quot;+left&quot;                   // 向左移动
bind &quot;d&quot; &quot;+right&quot;                  // 向右移动
bind &quot;mouse1&quot; &quot;+attack&quot;            // 普通攻击
bind &quot;mouse2&quot; &quot;+attack2&quot;           // 特殊攻击
bind &quot;mouse_x&quot; &quot;yaw&quot;               // 鼠标水平移动控制视角
bind &quot;mouse_y&quot; &quot;pitch&quot;             // 鼠标垂直移动控制视角
bind &quot;e&quot; &quot;+use&quot;                    // 使用/互动
bind &quot;r&quot; &quot;+reload&quot;                 // 装填弹药
bind &quot;f&quot; &quot;+lookatweapon&quot;           // 检视
bind &quot;space&quot; &quot;+jump&quot;               // 跳跃
bind &quot;ctrl&quot; &quot;+duck&quot;                // 蹲下
bind &quot;tab&quot; &quot;+showscores&quot;           // 显示计分板
bind &quot;g&quot; &quot;drop&quot;                    // 丢弃物品
bind &quot;m&quot; &quot;teammenu&quot;                // 打开队伍选择菜单
bind &quot;shift&quot; &quot;+sprint&quot;             // 静步
bind &quot;b&quot; &quot;buymenu&quot;                 // 打开购买菜单
bind &quot;1&quot; &quot;slot1&quot;                   // 主武器
bind &quot;2&quot; &quot;slot2&quot;                   // 副武器
bind &quot;3&quot; &quot;slot3&quot;                   // 匕首
bind &quot;4&quot; &quot;slot11&quot;                  // 电击枪
bind &quot;5&quot; &quot;slot5&quot;                   // C4
bind &quot;z&quot; &quot;slot6;&quot;                  // 雷
bind &quot;x&quot; &quot;slot7&quot;                   // 闪
bind &quot;c&quot; &quot;slot8&quot;                   // 烟
bind &quot;6&quot; &quot;slot9&quot;                   // 诱饵弹
bind &quot;v&quot; &quot;slot10&quot;                  // 火
bind &quot;q&quot; &quot;lastinv&quot;                 // 切换到上一个武器
bind &quot;y&quot; &quot;+spray_menu&quot;             // 打开喷漆菜单
bind &quot;i&quot; &quot;messagemode2&quot;            // 打开团队聊天
bind &quot;u&quot; &quot;messagemode&quot;             // 打开全局聊天
bind &quot;mouse4&quot; &quot;+voicerecord&quot;       // 语音
bind &quot;alt&quot; &quot;+radialradio&quot;          // 快捷聊天轮盘
bind &quot;ralt&quot; &quot;noclip&quot;               // 飞行键
bind &quot;mouse5&quot; &quot;player_ping&quot;		   // 玩家标记
bind &quot;mwheeldown&quot; &quot;+jump&quot;          // 鼠标滚轮向下跳跃
bind &quot;mwheelup&quot; &quot;+jump&quot;            // 鼠标滚轮向上跳跃
bind &quot;`&quot; &quot;toggleconsole&quot;                           // 打开/关闭控制台
bind &quot;t&quot; &quot;switchhands&quot;                             // 切换武器持握方式（左手/右手）
bind &quot;h&quot; &quot;toggleradarscale&quot;                        // 切换雷达缩放比例
bind &quot;n&quot; &quot;toggle cl_teamid_overhead_mode 1 3&quot;      // 切换队友头顶标识模式
bind &quot;&apos;&quot; &quot;radio2;slot12&quot;                           // 打开无线电菜单、X光显示、医疗针
bind &quot;-&quot; &quot;toggle cl_draw_only_deathnotices 1 0&quot;    // 切换是否仅显示死亡通知与准星
bind &quot;=&quot; &quot;toggle cl_drawhud_force_radar 0 1&quot;       // 切换是否强制显示雷达
bind &quot;f1&quot; &quot;vote 1&quot;                                 // 投票选择同意
bind &quot;f2&quot; &quot;vote 2&quot;                                 // 投票选择拒绝
bind &quot;f5&quot; &quot;buy hegrenade&quot;                          // 购买高爆手雷
bind &quot;f6&quot; &quot;buy flashbang&quot;                          // 购买闪光弹
bind &quot;f7&quot; &quot;buy smokegrenade&quot;                       // 购买烟雾弹
bind &quot;f8&quot; &quot;buy molotov;buy incgrenade&quot;             // 购买燃烧瓶/燃烧弹
bind &quot;f9&quot; &quot;buy vest&quot;                               // 购买防弹衣
bind &quot;f10&quot; &quot;buy vesthelm&quot;                          // 购买防弹衣+头盔
bind &quot;f11&quot; &quot;buy defuser&quot;                           // 购买拆弹器
bind &quot;f4&quot; &quot;buy rifle1&quot;                             // 购买主武器（步枪第二槽位）
bind &quot;f3&quot; &quot;buy secondary4&quot;                         // 购买副武器（手枪第五槽位）
bind &quot;backspace&quot; &quot;sellbackall&quot;                     // 出售所有已购买物品
bind &quot;del&quot; &quot;toggle volume 0.10 1.00&quot;               // 切换总音量为30%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;没什么特别要说的，都是直意注释，将你的按键替换掉原来的按键即可。&lt;/p&gt;
&lt;p&gt;飞行键当然只能在跑图作弊模式使用，请不要问我为什么竞技模式按了不能飞。&lt;/p&gt;
&lt;p&gt;队友头顶显示、仅显示雷达、准星等功能可以到视频里观看效果。&lt;/p&gt;
&lt;p&gt;购买主武器和副武器等功能，可以尽情发挥。这里我的游戏中步枪第二槽位放的AK、M4，手枪第五槽位放的沙鹰。&lt;/p&gt;
&lt;p&gt;最后一个一键消音是死斗神器说是，避免枪声过大导致耳聋。&lt;/p&gt;
&lt;p&gt;如果你希望使用游戏默认的4号键轮切投掷物，或者滚轮切换装备请自行使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bind &quot;4&quot; &quot;slot4&quot;
bind &quot;mwheeldown&quot; &quot;invnext&quot;
bind &quot;mwheelup&quot; &quot;invprev&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要注意的是，该套CFG中的4号键切换电击枪是强绑定的。如果你修改了4号键功能，并使用该套CFG(而不是单独使用autoexec)的话，需要删除&lt;code&gt;exec zeus.cfg&lt;/code&gt;代码行或者删除&lt;code&gt;zeus.cfg&lt;/code&gt;文件，否则你的4号键功能会异常。&lt;/p&gt;
&lt;h2&gt;联动CFG启动按键&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;exec zeus.cfg                                      // 默认启动，电击枪自动切换。
bind &quot;o&quot; &quot;exec autoexec;&quot;                          // 恢复默认准星与持枪视角
bind &quot;j&quot; &quot;exec knife.cfg;&quot;                         // 更换匕首模型
bind &quot;p&quot; &quot;exec practice.cfg;&quot;                         // 加载跑图预设
bind &quot;[&quot; &quot;exec crosshair_view;&quot;                    // 准星与持枪预设
bind &quot;]&quot; &quot;exec demo_hlae.cfg;&quot;                     // demo预设
bind &quot;k&quot; &quot;say_team !drop&quot;                          // 一键发刀(平台)
bind &quot;\&quot; &quot;say_team .hp&quot;                            // 伤害统计(5E平台)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看到的兄弟们有福了，虽然说是联动CFG，但我写文章时才发现把一键发刀和报伤害也写到这里了。&lt;/p&gt;
&lt;p&gt;其实是很简单的功能了，你也可以随便写个比如一键暂停，对面掉人了卡投票(很恶意，不提倡)。&lt;/p&gt;
&lt;h2&gt;基础准星&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;crosshair true                                       // 启用准星
//──────────────────────  自定义准星替换区  ─────────────────────────────
cl_crosshair_drawoutline &quot;false&quot;                     // 禁用准星轮廓绘制
cl_crosshair_dynamic_maxdist_splitratio &quot;0.300000&quot;   // 动态准星最大分离距离的比例
cl_crosshair_dynamic_splitalpha_innermod &quot;1.000000&quot;  // 动态准星内部分离部分的透明度
cl_crosshair_dynamic_splitalpha_outermod &quot;0.500000&quot;  // 动态准星外部分离部分的透明度
cl_crosshair_dynamic_splitdist &quot;7&quot;                   // 动态准星分离距离
cl_crosshair_outlinethickness &quot;1.000000&quot;             // 准星轮廓的厚度（如果启用轮廓）
cl_crosshair_recoil &quot;false&quot;                          // 禁用准星随武器后坐力动态变化
cl_crosshair_t &quot;false&quot;                               // 禁用T形准星
cl_crosshairalpha &quot;255&quot;                              // 准星的透明度（255为完全不透明）
cl_crosshaircolor &quot;5&quot;                                // 准星颜色（5为自定义颜色）
cl_crosshaircolor_b &quot;255&quot;                            // 准星颜色的蓝色分量（RGB）
cl_crosshaircolor_g &quot;255&quot;                            // 准星颜色的绿色分量（RGB）
cl_crosshaircolor_r &quot;255&quot;                            // 准星颜色的红色分量（RGB）
cl_crosshairdot &quot;false&quot;                              // 禁用准星中心点
cl_crosshairgap &quot;-3.400000&quot;                          // 准星间隙大小（负值表示准星向内收缩）
cl_crosshairgap_useweaponvalue &quot;false&quot;               // 禁用根据武器调整准星间隙
cl_crosshairsize &quot;0.900000&quot;                          // 准星大小
cl_crosshairstyle &quot;4&quot;                                // 准星样式（4为经典静态准星）
cl_crosshairthickness &quot;0.800000&quot;                     // 准星线条的厚度
cl_crosshairusealpha &quot;true&quot;                          // 启用准星透明度设置
//───────────────────────────────────────────────────────────────────────────
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;唯一要说的也就&lt;code&gt;crosshair true&lt;/code&gt;了吧，说来这是之前有位朋友玩游戏时发现没有准星，我告知它可能是这条命令参数被设置为了0(false)，故将此代码加入至该文件。&lt;/p&gt;
&lt;h2&gt;狙击镜准星&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_crosshair_sniper_width &quot;2&quot;						 // 狙击镜准星线粗细
cl_sniper_show_inaccuracy 1                          // 狙击镜扩散开启
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依旧直意。&lt;/p&gt;
&lt;h2&gt;投掷物准星&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_grenadecrosshair_decoy 1               // 启用诱饵弹的投掷轨迹准星
cl_grenadecrosshair_explosive 1           // 启用爆炸物（如手雷）的投掷轨迹准星
cl_grenadecrosshair_fire 1                // 启用燃烧弹的投掷轨迹准星
cl_grenadecrosshair_flash 1               // 启用闪光弹的投掷轨迹准星
cl_grenadecrosshair_keepusercrosshair 1   // 投掷时保留玩家自定义准星
cl_grenadecrosshair_smoke 1               // 启用烟雾弹的投掷轨迹准星
cl_grenadecrosshairdelay_decoy &quot;0.50&quot;     // 设置诱饵弹投掷轨迹准星的延迟时间
cl_grenadecrosshairdelay_explosive &quot;0.50&quot; // 设置爆炸物投掷轨迹准星的延迟时间
cl_grenadecrosshairdelay_fire &quot;0.50&quot;      // 设置燃烧弹投掷轨迹准星的延迟时间
cl_grenadecrosshairdelay_flash &quot;0.50&quot;     // 设置闪光弹投掷轨迹准星的延迟时间
cl_grenadecrosshairdelay_smoke &quot;0.50&quot;     // 设置烟雾弹投掷轨迹准星的延迟时间
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键就是设置一个延迟时间吧，0.5是差不多拉完栓顿一下就会出现坐标轴准星了。&lt;/p&gt;
&lt;h2&gt;准星杂项&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_observed_bot_crosshair 2               // 观察机器人时显示准星（2为始终显示）
cl_show_observer_crosshair 2              // 观察其他玩家时显示准星（2为始终显示）
cl_teamid_overhead_fade_near_crosshair &quot;0.5&quot; // 设置队友ID在准星附近时的淡出距离
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直意。&lt;/p&gt;
&lt;h2&gt;持枪视角&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;viewmodel_fov 68                  // 设置视角模型（武器）的视野范围
viewmodel_offset_x 2              // 调整视角模型在X轴上的偏移（左右位置）
viewmodel_offset_y 2              // 调整视角模型在Y轴上的偏移（前后位置）
viewmodel_offset_z -1             // 调整视角模型在Z轴上的偏移（上下位置）
viewmodel_presetpos 0             // 预设的视角模型
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直意。&lt;/p&gt;
&lt;h2&gt;雷达&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_radar_always_centered &quot;0&quot;        // 雷达不居中，显示整个地图
cl_radar_scale &quot;0.37&quot;               // 设置雷达缩放比例为 0.37
cl_hud_radar_scale &quot;1&quot;              // 设置 HUD 雷达缩放比例为 1
cl_teammate_colors_show &quot;2&quot;         // 显示队友颜色为 2（默认颜色模式）
cl_radar_icon_scale_min &quot;0.6&quot;       // 设置雷达图标最小缩放比例为 0.6
cl_radar_rotate &quot;1&quot;                 // 雷达随玩家视角旋转
cl_radar_square_always 0            // 不强制方形小地图
cl_radar_square_with_scoreboard 1   // 计分板地图为方形
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个设置是所有地图都可以从小地图看到完整地图的，第一时间获取重要信息。&lt;/p&gt;
&lt;p&gt;设置完整小地图是对单排玩家极其利好的，很多时候队友报点甚至不如自己看到的一手信息。&lt;/p&gt;
&lt;h2&gt;网络、延迟、帧数显示&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_hud_telemetry_frametime_show 2  // 显示帧生成时间及FPS
cl_hud_telemetry_ping_show 2       // 显示延迟
mm_dedicated_search_maxping &quot;70&quot;   // 设置匹配时允许的最大 ping 值
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依旧是直意。&lt;/p&gt;
&lt;p&gt;匹配时最大ping值，如果你使用的加速器效果不好，但又在打国际服，可以把这个参数设置大一些，能让你匹配到除香港之外比如东南亚的玩家。&lt;/p&gt;
&lt;h2&gt;杂项&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_prefer_lefthanded 0             // 右手持枪（默认）
cl_debounce_zoom 0                 // 按住开镜键持续切换
cl_silencer_mode 1                 // 开启卸下消音器
cl_use_opens_buy_menu &quot;0&quot;          // 关闭E键打开购买菜单
cl_dm_buyrandomweapons 0           // 关闭死斗随机买枪
cl_teamcounter_playercount_instead_of_avatars 1 // 显示上层对局存活数字(1)或者头像(0)
r_drawtracers_firstperson 1        // 显示曳光弹
r_fullscreen_gamma 2.6             // 设置亮度
cl_teamid_overhead_mode 3          // 隔墙显示队友位置
cl_teamid_overhead_colors_show 1   // 玩家ID上使用玩家颜色
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直意。&lt;/p&gt;
&lt;h2&gt;快捷聊天轮盘&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;cl_radial_radio_tap_to_ping false  // 关闭“地图标记”功能
cl_radial_radio_tab 0              // 当前激活标签页：0（后续可通过操作切换1/2页）
cl_radial_radio_tab_0_text_1 #Chatwheel_grenade         // 第0页选项1：请求手雷
cl_radial_radio_tab_0_text_2 #Chatwheel_sniperspotted   // 第0页选项2：发现狙击手
cl_radial_radio_tab_0_text_3 #Chatwheel_fire            // 第0页选项3：开火指令
cl_radial_radio_tab_0_text_4 #Chatwheel_fallback        // 第0页选项4：撤退指令
cl_radial_radio_tab_0_text_5 #Chatwheel_smoke           // 第0页选项5：请求烟雾弹
cl_radial_radio_tab_0_text_6 #Chatwheel_gogogo          // 第0页选项6：进攻指令（冲！）
cl_radial_radio_tab_0_text_7 #Chatwheel_flashbang       // 第0页选项7：请求闪光弹
cl_radial_radio_tab_0_text_8 #Chatwheel_needbackup      // 第0页选项8：需要支援
cl_radial_radio_tab_1_text_1 #Chatwheel_requestweapon   // 第1页选项1：请求武器
cl_radial_radio_tab_1_text_2 #Chatwheel_requestspend    // 第1页选项2：请求经济支援
cl_radial_radio_tab_1_text_3 #Chatwheel_bplan           // 第1页选项3：B点战术计划
cl_radial_radio_tab_1_text_4 #Chatwheel_heardnoise      // 第1页选项4：听到动静（有声音）
cl_radial_radio_tab_1_text_5 #Chatwheel_midplan         // 第1页选项5：中路战术计划
cl_radial_radio_tab_1_text_6 #Chatwheel_ihavethebomb    // 第1页选项6：我持有炸弹
cl_radial_radio_tab_1_text_7 #Chatwheel_aplan           // 第1页选项7：A点战术计划
cl_radial_radio_tab_1_text_8 #Chatwheel_requestecoround // 第1页选项8：请求经济局（eco）
cl_radial_radio_tab_2_text_1 #Chatwheel_affirmative     // 第2页选项1：收到/同意
cl_radial_radio_tab_2_text_2 #Chatwheel_negative        // 第2页选项2：拒绝/不同意
cl_radial_radio_tab_2_text_3 #Chatwheel_compliment      // 第2页选项3：称赞（打得好）
cl_radial_radio_tab_2_text_4 #Chatwheel_thanks          // 第2页选项4：感谢
cl_radial_radio_tab_2_text_5 #Chatwheel_cheer           // 第2页选项5：加油/鼓舞
cl_radial_radio_tab_2_text_6 #Chatwheel_peptalk         // 第2页选项6：打气（稳住）
cl_radial_radio_tab_2_text_7 #Chatwheel_sorry           // 第2页选项7：抱歉
cl_radial_radio_tab_2_text_8 #Chatwheel_sectorclear     // 第2页选项8：区域安全
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里没有使用之前很火的轮盘切换道具瞄点(有点太折腾了，效果又不如你在实战中多丢几次，不过回味轮盘买装备倒是挺有趣)，而是直接用游戏内置的一些文本和图标，匹配游戏内置的语音信息。&lt;/p&gt;
&lt;p&gt;这里你可以根据游戏中的效果，自行将&lt;code&gt;#Chatwheel_fire&lt;/code&gt;等参数修改到你想要的位置。&lt;/p&gt;
&lt;h2&gt;声音&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;volume 1                              // 主音量
snd_headphone_eq 0                    // 均衡器
snd_menumusic_volume 0.03             // 主菜单音乐音量
snd_roundstart_volume 0               // 回合开始音量
snd_roundend_volume 0.02              // 回合结束音量
snd_roundaction_volume 0              // 回合开始行动音量
snd_mvp_volume 0.12                   // MVP音量
snd_mapobjective_volume 0.12          // 炸弹/人质音量
snd_tensecondwarning_volume 0.08      // 十秒警告音量
snd_deathcamera_volume 0.08           // 死亡视角音量
snd_mute_mvp_music_live_players 1     // 当双方团队成员都存活时关闭 MVP 音乐
snd_mute_losefocus 0                  // 后台播放声音
voice_modenable 1                     // 启用语音
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直意。&lt;/p&gt;
&lt;h2&gt;HUD界面&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;hud_showtargetid &quot;1&quot;               // 显示队友/敌人的 ID
hud_scaling &quot;0.85&quot;                 // 设置 HUD 缩放比例
safezonex &quot;0.88&quot;                   // 设置 HUD 水平占比
safezoney &quot;0.905&quot;                  // 设置 HUD 竖直占比
cl_color &quot;4&quot;                       // 设置队伍中玩家颜色
cl_hud_color &quot;0&quot;                   // 设置 HUD 颜色
cl_showloadout &quot;0&quot;                 // 不总显示物品栏
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HUD水平和竖直占比，在游戏中拉条(Bar)设置的话，是有极限的，但在控制台，你可以尽可能将HUD集中。我这里的设置是保守的，偏集中，而不是默认的抵住顶部底部边缘。&lt;/p&gt;
&lt;p&gt;HUD颜色可以看下面的颜色代码，自行选择一个默认值，或者利用下面的代码定义别名，控制台输入别名进行更换，默认值0为灰白色。&lt;/p&gt;
&lt;p&gt;不总显示物品栏就是你走路时不切换装备，就会隐藏掉主武器副武器和刀的右下角显示。&lt;/p&gt;
&lt;h2&gt;其他&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;con_enable &quot;1&quot;                     // 启用开发者控制台
fps_max 0                          // 帧率无上限
cl_join_advertise &quot;2&quot;              // 公开游戏会话
gameinstructor_enable &quot;0&quot;          // 禁用教学提示系统
cl_autohelp &quot;false&quot;                // 禁用自动帮助提示
func_break_max_pieces 0            // 可破坏物体破碎时最大碎片数
r_show_build_info 0                // 关闭版本信息
spec_replay_autostart 0            // 关闭被击杀回放
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一些无人在意的小设置。&lt;/p&gt;
&lt;h2&gt;HUD颜色更改&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;alias &quot;lwhite&quot; &quot;cl_hud_color 1;echo HUD更改为灰白色!&quot;
alias &quot;bwhite&quot; &quot;cl_hud_color 2;echo HUD更改为亮白色!&quot;
alias &quot;lblue&quot; &quot;cl_hud_color 3;echo HUD更改为浅蓝色!&quot;
alias &quot;blue&quot; &quot;cl_hud_color 4;echo HUD更改为深蓝色!&quot;
alias &quot;purple&quot; &quot;cl_hud_color 5;echo HUD更改为紫色!&quot;
alias &quot;red&quot; &quot;cl_hud_color 6;echo HUD更改为红色!&quot;
alias &quot;orange&quot; &quot;cl_hud_color 7;echo HUD更改为橙色!&quot;
alias &quot;yellow&quot; &quot;cl_hud_color 8;echo HUD更改为黄色!&quot;
alias &quot;green&quot; &quot;cl_hud_color 9;echo HUD更改为绿色!&quot;
alias &quot;cyan&quot; &quot;cl_hud_color 10;echo HUD更改为青绿色!&quot;
alias &quot;pink&quot; &quot;cl_hud_color 11;echo HUD更改为粉色!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以结合这里的颜色参数(1,2,3...)将上面HUD界面提到的&lt;code&gt;cl_hud_color 0&lt;/code&gt;设置为你想要的颜色。&lt;/p&gt;
&lt;p&gt;这里前边的别名(lwhite、bwhite)是在控制台输入时，即可执行后面的命令。&lt;/p&gt;
&lt;h2&gt;控制台功能别名绑定&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;alias &quot;lefthand&quot; &quot;cl_prefer_lefthanded 1;echo 默认左手持枪!&quot;
alias &quot;debounce&quot; &quot;cl_debounce_zoom 1;echo 关闭连镜切换!&quot;
alias &quot;silencer&quot; &quot;cl_silencer_mode 0;echo 关闭卸下消音器!&quot;
alias &quot;avatars&quot; &quot;cl_teamcounter_playercount_instead_of_avatars 0;echo 显示对局头像!&quot;
alias &quot;numbers&quot; &quot;cl_teamcounter_playercount_instead_of_avatars 1;echo 显示对局数字!&quot;
alias &quot;tracer&quot; &quot;r_drawtracers_firstperson 0;echo 关闭曳光弹!&quot;
alias &quot;ping&quot; &quot;cl_radial_radio_tap_to_ping true;echo 快捷轮盘启用标点!&quot;
alias &quot;squareon&quot; &quot;cl_radar_square_always 1;echo 强制方形小地图!&quot;
alias &quot;squareoff&quot; &quot;cl_radar_square_always 0;echo 取消强制方形小地图!&quot;
alias &quot;round&quot; &quot;cl_radar_square_with_scoreboard 0;echo 计分板地图为圆形!&quot;
alias &quot;sniperon&quot; &quot;cl_sniper_show_inaccuracy 1;echo 已开启狙击镜扩散!&quot;
alias &quot;sniperoff&quot; &quot;cl_sniper_show_inaccuracy 0;echo 已关闭狙击镜扩散!&quot;
alias &quot;flyn&quot; &quot;bind &quot;n&quot; &quot;noclip&quot;;bind &quot;ralt&quot; &quot;toggle cl_teamid_overhead_mode 1 3&quot;;echo 已绑定&quot;n&quot;为飞行，&quot;ralt&quot;为队友标识切换！&quot;
alias &quot;flyralt&quot; &quot;bind &quot;ralt&quot; &quot;noclip&quot;;bind &quot;n&quot; &quot;toggle cl_teamid_overhead_mode 1 3&quot;;echo 已绑定&quot;ralt&quot;为飞行，&quot;n&quot;为队友标识切换！&quot;
alias &quot;ps&quot; &quot;cl_ticktiming print summary;echo 显示服务器tick信息!&quot;
alias &quot;pd&quot; &quot;cl_ticktiming print detail;echo 显示服务器tick详细信息!&quot;
alias &quot;show&quot; &quot;cl_showloadout 1;echo 常显装备栏!&quot;
alias &quot;notshow&quot; &quot;cl_showloadout 0;echo 取消常显装备栏!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体可见控制台导航的提示信息，这一部分是为了实现那里提到的功能。&lt;/p&gt;
&lt;h2&gt;准星、视角查询初始化&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;alias &quot;whoamic&quot; &quot;echo 您还未启动准星视角预设CFG,请按&apos;]&apos;键启动准星视角预设!&quot;
alias &quot;whoamiv&quot; &quot;echo 您还未启动准星视角预设CFG,请按&apos;]&apos;键启动准星视角预设!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里需要搭配&lt;code&gt;crosshair_view.cfg&lt;/code&gt;使用。单独使用&lt;code&gt;autoexec&lt;/code&gt;则可以删掉这部分。&lt;/p&gt;
&lt;h2&gt;更新区&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;unbind F1                          // 取消自定义绑定F1
unbind F2                          // 取消自定义绑定F2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的两行是取消掉任何绑定的F1、F2功能，让它们回到本身的默认功能，也即同意或拒绝投票。
原因是在2025.8.15更新后，平台投票功能，无法使用&lt;code&gt;vote 1/2&lt;/code&gt;来实现，尚未知晓原因，故直接改为默认。&lt;/p&gt;
&lt;h2&gt;控制台导航&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;echo ══════════════════════════════════════════════════════════════════
echo       ____           ____             ____   _____    ____
echo      / ___|   _ __  |  _ \           / ___| |  ___|  / ___|
echo      \___ \  | &apos;__| | |_) |  _____  | |     | |_    | |  _
echo       ___) | | |    |  __/  |_____| | |___  |  _|   | |_| |
echo      |____/  |_|    |_|              \____| |_|      \____|
echo ══════════════════════════════════════════════════════════════════
echo 文档地址：https://doc.srprolin.top/posts/SrP-CFG_CS2/srpcfg-1.html
echo autoexec Enabled!
echo ═════════════════════════════════════════════════════════════
echo ──────────────────────  更新报告  ─────────────────────────────
echo 2025.08.15更新后F1、F2默认绑定为投票，需要取消自定义绑定
echo ──────────────────────  HUD颜色更换  ─────────────────────────────
echo ·输入 lwhite → 灰白色 | cl_hud_color 1;
echo ·输入 bwhite → 亮白色   | cl_hud_color 2;
echo ·输入 lblue →  浅蓝色   | cl_hud_color 3;
echo ·输入 blue  →  蓝色   | cl_hud_color 4;
echo ·输入 purple → 紫色   | cl_hud_color 5;
echo ·输入 red   →  红色   | cl_hud_color 6;
echo ·输入 orange → 橙色   | cl_hud_color 7;
echo ·输入 yellow → 黄色   | cl_hud_color 8;
echo ·输入 green →  绿色   | cl_hud_color 9;
echo ·输入 cyan  →  青绿色   | cl_hud_color 10;
echo ·输入 pink  →  粉色   | cl_hud_color 11;
echo ──────────────────────  常用指令  ─────────────────────────────
echo ·输入 lefthand → 切换默认左手持枪 | cl_prefer_lefthanded 1;
echo ·输入 debounce → 关闭连镜切换         | cl_debounce_zoom 1;
echo ·输入 silencer → 禁用卸下消音器   | cl_silencer_mode 0;
echo ·输入 avatars → 显示对局头像      | cl_teamcounter_playercount_instead_of_avatars 0;
echo ·输入 numbers → 显示对局数字      | cl_teamcounter_playercount_instead_of_avatars 1;
echo ·输入 tracer → 关闭曳光弹         | r_drawtracers_firstperson 0;
echo ·输入 ping → 开启快捷轮盘标点     | cl_radial_radio_tap_to_ping true;
echo ·输入 squareon → 强制方形小地图     | cl_radar_square_always 1;
echo ·输入 squareoff → 取消强制方形小地图  | cl_radar_square_always 0;
echo ·输入 round → 计分板地图为圆形    | cl_radar_square_with_scoreboard 0;
echo ·输入 clear → 清除控制台           | clear;
echo ·输入 cvarlist → 显示所有控制台指令    | cvarlist;
echo ·输入 status → 显示steamID         | status;
echo ·输入 sniperon → 显示狙击镜扩散     | cl_sniper_show_inaccuracy 1;
echo ·输入 sniperoff → 关闭狙击镜扩散     | cl_sniper_show_inaccuracy 0;
echo ·输入 flyn → 开启n键飞行           | bind &quot;n&quot; &quot;noclip&quot;;
echo ·输入 flyralt → 开启ralt键飞行      | bind &quot;ralt&quot; &quot;noclip&quot;;
echo ·输入 ps → 显示当前游戏延迟总结      | cl_ticktiming print summary;
echo ·输入 pd → 显示当前游戏延迟详情      | cl_ticktiming print detail;
echo ·输入 show → 常显装备栏    			| cl_showloadout 1；
echo ·输入 notshow → 取消常显装备栏      | cl_showloadout 0；
echo ────快捷轮盘当前激活标签页：0（切换1/2页）  | cl_radial_radio_tab 0;
echo ───────────────────────  快捷键  ─────────────────────────────
echo ──── 重启autoexec  		    : O键 | exec autoexec
echo ──── 跑图,练习道具  			:  P键 | exec practice
echo ──── 更换匕首模型 			    :  J键 | exec knife
echo ──── demo观赛预设(含HLAE) 	     :  ]键 | exec demo_hlae
echo ──── 一键发刀(平台) 	        :  K键 | say_team !drop
echo ──── 一键伤害提示(5E平台)	    :  \键 | say_team .hp
echo ──── 准星与持枪视角预设         :  [键 | exec crosshair_view
echo ──── 切换雷达缩放比例           :  h键 | toggleradarscale
echo ──── 切换是否仅显示死亡通知与准星:  -键 | toggle cl_draw_only_deathnotices 1 0
echo ──── 切换是否强制显示雷达       :  =键 | toggle cl_drawhud_force_radar 1 0
echo ──── 快捷聊天轮盘              : alt键 | +radialradio
echo ──── 默认飞行键                : ralt键 | noclip
echo ──── 一键消音至30%  		    : delete键 | toggle volume 0.10 1.00
echo ──── 购买雷、闪、烟、火、半甲、全甲、钳 : F5|F6|F7|F8|F9|F9|F10|F11
echo ──── 出售所有已购买物品 		 : backspace键 | sellbackall
echo ──── 以下功能，在跑图模式下，产生按键冲突，后启动的模式按键优先：
echo ──── 切换队友头顶标识模式       : n键 toggle cl_teamid_overhead_mode 1 3
echo ═════════════════════════════════════════════════════════════
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该写的都在导航中写了。&lt;/p&gt;
&lt;h1&gt;结语&lt;/h1&gt;
&lt;p&gt;这里希望大家根据本篇文章可以自己编写属于自己的CFG。&lt;/p&gt;
&lt;p&gt;当然，你可以下载我的整套&lt;strong&gt;SrP-CFG&lt;/strong&gt;使用，或者单独使用其中的&lt;strong&gt;autoexec.cfg&lt;/strong&gt;。如果有需要，我可以帮助你修改&lt;strong&gt;autoexec.cfg&lt;/strong&gt;适应你的需求，并在仓库中进行同步更新。&lt;/p&gt;
&lt;p&gt;最后，这是我的项目地址&lt;a href=&quot;https://github.com/RolinShmily/SrP-CFG_ForCS2&quot;&gt;SrP-CFG&lt;/a&gt;，希望有能力者可以给我一个免费的star⭐，感谢大家的支持。&lt;/p&gt;
</content:encoded></item><item><title>如何安全地使用SSH、SFTP？</title><link>https://blog.srprolin.top/posts/ssh-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/ssh-1/</guid><description>本文将详细介绍如何使用密钥验证SSH连接，如何修改SSH默认端口，如何禁用root、密码登录，以及解决一些SFTP安全传输文件的权限问题。</description><pubDate>Fri, 07 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;SSH 的基本概念&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;SSH&lt;/code&gt;的百科介绍中提到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH 是较可靠，专为远程登录会话和其他网络服务提供安全性的协议。&lt;/li&gt;
&lt;li&gt;SSH 客户端适用于多种平台。几乎所有 UNIX 平台—包括 HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix，以及其他平台，都可运行 SSH。&lt;/li&gt;
&lt;li&gt;SSH 有很多功能，它既可以代替 Telnet，又可以为 FTP、PoP、甚至为 PPP 提供一个安全的“通道” 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SSH 的基本结构和使用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SSH 是由客户端和服务端的软件组成的，有两个不兼容的版本分别是：1.x 和 2.x。 用 SSH 2.x 的客户程序是不能连接到 SSH 1.x 的服务程序上去的。OpenSSH 2.x 同时支持 SSH 1.x 和 2.x。&lt;/li&gt;
&lt;li&gt;服务端是一个守护进程(daemon)，他在后台运行并响应来自客户端的连接请求。服务端一般是 sshd 进程，提供了对远程连接的处理，一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接。&lt;/li&gt;
&lt;li&gt;客户端包含 ssh 程序以及像 scp（远程拷贝）、slogin（远程登陆）、sftp（安全文件传输）等其他的应用程序。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单来说就是用于连接远程服务器(多数为 Linux 系统)的一种加密通信方式；通常情况下，SSH 服务端运行在 22 端口上。&lt;/p&gt;
&lt;h2&gt;SSH 的安全验证方式&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;基于口令的安全验证
只要你知道自己账号和口令，就可以登录到远程主机。所有传输的数据都会被加密，但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器，也就是受到“中间人”这种方式的攻击。&lt;/li&gt;
&lt;li&gt;基于密匙的安全验证
需要依靠密匙，也就是你必须为自己创建一对密匙，并把公用密匙放在需要访问的服务器上。如果你要连接到 SSH 服务器上，客户端软件就会向服务器发出请求，请求用你的密匙进行安全验证。服务器收到请求之后，先在该服务器上你的主目录下寻找你的公用密匙，然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致，服务器就用公用密匙加密“质询”（challenge）并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;云服务器的 SSH 安全策略&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本文中提到的 Linux 系统以&lt;code&gt;Ubuntu24&lt;/code&gt;发行版为例。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;基于上文提到的，SSH 服务端一般运行在 22 端口，大多数云服务器厂商的安全组都默认开放了该端口；因此“攻击者”们也都知道 22 端口为 SSH 连接端口，且 Linux 的超级管理员 root 用户名也是众所周知的：如果“攻击者”采取密码爆破方式取得 SSH 的登录权，那么这台服务器就与你无关了。&lt;/p&gt;
&lt;h2&gt;使用一般用户操作，必要时提权&lt;/h2&gt;
&lt;p&gt;使用云服务器厂商面板 或 其他 SSH 工具登录服务器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh root@&amp;lt;your-server-ip&amp;gt;&lt;/code&gt; | &lt;code&gt;&amp;lt;your-server-ip&amp;gt;&lt;/code&gt;为服务器公网 IP 地址，或者也可以使用域名&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;root&lt;/code&gt;为登录用户，这里是超级管理员；随后将提示您输入密码(只会拾取您的键盘信息而不进行显示)，输入完毕回车即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;创建一个普通用户，作为后续登录用户：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo useradd -m &amp;lt;username&amp;gt;&lt;/code&gt; | 其中&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt;为自定义值，&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-m&lt;/code&gt;参数为自动创建用户家目录，路径为&lt;code&gt;/home/&amp;lt;username&amp;gt;/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为新创建的用户设置密码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo passwd &amp;lt;username&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;密码的输入没有回显，输入完毕后回车确认。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;上文中的命令前置&lt;code&gt;sudo&lt;/code&gt;本质上是将当前命令提升权限至&lt;code&gt;root&lt;/code&gt;组来执行，但我们的上述过程均为&lt;code&gt;root&lt;/code&gt;用户操作，所以可加可不加；那么对于日常登录操作的普通用户，需要为其赋予&lt;code&gt;sudo&lt;/code&gt;权限，以便于管理服务器。&lt;/p&gt;
&lt;p&gt;为普通用户赋予&lt;code&gt;sudo&lt;/code&gt;权限的方式有两种：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;直接将用户添加到&lt;code&gt;sudo&lt;/code&gt;用户组：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo usermod -aG sudo &amp;lt;username&amp;gt;&lt;/code&gt; | 其中&lt;code&gt;-aG&lt;/code&gt;参数表示追加到指定组&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;编辑&lt;code&gt;sudo&lt;/code&gt;配置文件(这里用 nano 编辑器)：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo nano /etc/sudoers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;找到(使用方向键)&lt;code&gt;root ALL=(ALL:ALL) ALL&lt;/code&gt;这一行，在其下一行添加&lt;code&gt;&amp;lt;username&amp;gt; ALL=(ALL:ALL) ALL&lt;/code&gt;，随后&lt;code&gt;Ctrl+X&lt;/code&gt;退出编辑器，在提示框中键入&lt;code&gt;y&lt;/code&gt;保存修改，最后&lt;code&gt;Enter&lt;/code&gt;确认。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在我们就可以切换到这个拥有&lt;code&gt;sudo&lt;/code&gt;权限的用户来进行服务器管理了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;su - &amp;lt;username&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo ls /root&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;这条命令用来展示&lt;code&gt;root&lt;/code&gt;用户目录下的文件；如果正常显示，说明当前用户拥有&lt;code&gt;sudo&lt;/code&gt;权限。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么在下次登录服务器时，就可以使用该用户：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;your-server-ip&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;为用户添加密钥验证方式&lt;/h2&gt;
&lt;p&gt;上文中说到，登录 SSH 时，是需要指定一个登录用户的，那么也就是说 SSH 的验证是基于用户的。&lt;/p&gt;
&lt;p&gt;对于我们(个人 PC，Windows 为例)使用 SSH 连接至远程服务器(Linux)这一方式中，远程服务器提供 ssh 服务端，而我们的个人 PC 是用的 ssh 客户端，因此我们需要在 Windows 上安装客户端；如果你已经使用专用的 ssh 软件(比如 Xshell、FinalShell)，那么它们的终端中都是安装好了 ssh 客户端的。&lt;/p&gt;
&lt;p&gt;不过你也完全可以使用 Windows 自带终端&lt;code&gt;Powershell&lt;/code&gt;来进行 ssh 连接，请先验证是否安装了 ssh 客户端：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh -V&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;输出版本号即表示已安装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 ssh 的客户端，是使用&lt;code&gt;known_hosts&lt;/code&gt;文件来识别远程服务器的；对于 ssh 的服务端，使用&lt;code&gt;authorized_keys&lt;/code&gt;文件来验证客户端连接。&lt;/p&gt;
&lt;p&gt;下面将介绍如何进行密钥连接：&lt;/p&gt;
&lt;p&gt;在 ssh 的客户端(windows)上，打开 powershell，申请密钥对：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh-keygen -t ed25519 -C &quot;your_email@example.com&quot;&lt;/code&gt; | 其中&lt;code&gt;-C&lt;/code&gt;参数为添加注释&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;获取的密钥对文件将会在&lt;code&gt;C:\Users(用户)\&amp;lt;your-username&amp;gt;\.ssh\&lt;/code&gt;路径下。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前往该路径，使用记事本打开&lt;code&gt;id_ed25519.pub&lt;/code&gt;文件，复制其中的全部内容，用于上传至服务器。&lt;/p&gt;
&lt;p&gt;使用上文中提到的普通用户登录服务器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;your-server-ip&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时的路径即为&lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt;的家目录，需要在此处创建并进入&lt;code&gt;.ssh&lt;/code&gt;文件夹：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mkdir .ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd .ssh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之后创建并编辑&lt;code&gt;authorized_keys&lt;/code&gt;文件来保存客户端公钥：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nano authorized_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;将刚刚复制的公钥内容粘贴至此，快捷键&lt;code&gt;Ctrl+Shift+V&lt;/code&gt;，随后保存，退出即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，在下次登录时，服务端可以无需密码即可验证成功；客户端会提示是否保存服务端信息至&lt;code&gt;known_hosts&lt;/code&gt;文件，手动确认保存即可。&lt;/p&gt;
&lt;p&gt;如果想要获得某一服务器的 ssh 客户端认证信息(即&lt;code&gt;known_hosts&lt;/code&gt;中关于该服务器的信息)，请打开你的 powershell：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh-keyscan &amp;lt;your-server-ip&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;保存输出的所有信息
该信息常用于一些自动化部署中，避免因 ssh 登录需手动在客户端确认验证时造成宕机。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;修改默认端口&lt;/h2&gt;
&lt;p&gt;首先，依旧是使用上文中提到的普通用户登录你的服务器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;your-server-ip&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前往 ssh 的配置文件目录(由于修改系统服务，此时我们切换为 root 用户方便操作)：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo su -&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd /etc/ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nano sshd_config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;找到&lt;code&gt;#Port 22&lt;/code&gt;改为&lt;code&gt;Port 22&lt;/code&gt;，在其下方添加&lt;code&gt;Port 2222&lt;/code&gt;即可让 ssh 服务同时在 22 和 2222 端口处开放连接。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;注意如果服务器有 firewall 等防火墙组件，需要开放 2222 端口；如果是云服务器，需要去安全组中开放 2222 端口的 TCP 入规则。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后更新 system 配置，并重启 ssh 服务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemctl daemon-reload&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl restart ssh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意，在我的&lt;code&gt;sshd_config&lt;/code&gt;中有如下字段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# When systemd socket activation is used (the default), the socket
# configuration must be re-generated after changing Port, AddressFamily, or
# ListenAddress.
#
# For changes to take effect, run:
#
#   systemctl daemon-reload
#   systemctl restart ssh.socket
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照提示我的重启 ssh 服务命令为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;systemctl daemon-reload&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl restart ssh.socket&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;systemctl restart ssh&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;随后，新开一个终端，在连接服务器时添加&lt;code&gt;-p&lt;/code&gt;参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ssh &amp;lt;username&amp;gt;@&amp;lt;your-server-ip&amp;gt; -p 2222&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在上述连接成功后，可以返回到原终端，重新编辑配置文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nano sshd_config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;将&lt;code&gt;Port 22&lt;/code&gt;这一行删除，并前往云服务器安全组中，关闭 22 端口的 TCP 入规则。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，在后续使用到 ssh 的命令中，均需加入参数&lt;code&gt;-p 2222&lt;/code&gt;，因为默认的 22 端口已经被关闭；如果你的 SSH 命令长时间未响应，请思考是否是该原因。&lt;/p&gt;
&lt;h2&gt;禁用 root 登录、密码登录&lt;/h2&gt;
&lt;p&gt;继上文内容，依旧使用 root 身份来修改 ssh 服务端配置来实现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo su -&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cd /etc/ssh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nano sshd_config&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;找到&lt;code&gt;#PermitRootLogin yes&lt;/code&gt;，改为&lt;code&gt;PermitRootLogin no&lt;/code&gt;，即可关闭 root 登录，若没找到请在文件末尾自行添加。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;找到&lt;code&gt;#PasswordAuthentication yes&lt;/code&gt;，改为&lt;code&gt;PasswordAuthentication no&lt;/code&gt;，即可关闭密码登录，若没找到请在文件末尾自行添加。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SFTP 安全文件传输以及权限问题&lt;/h1&gt;
&lt;p&gt;不过对于&lt;code&gt;PermitRootLogin&lt;/code&gt;root 用户登录这条，当你使用一些&lt;code&gt;SFTP&lt;/code&gt;文件管理工具软件时，请打开，这样才能以 root 身份登录，以便于浏览和管理整个服务器的文件；&lt;code&gt;sudo&lt;/code&gt;权限只能在命令行临时提权，对于&lt;code&gt;SFTP&lt;/code&gt;软件是无法使用的，你当然是不想在终端中使用&lt;code&gt;nano&lt;/code&gt;编辑器来更改文件或上传文件的，不然你也不会使用&lt;code&gt;SFTP&lt;/code&gt;软件。&lt;/p&gt;
&lt;p&gt;请注意，如果在&lt;code&gt;SFTP&lt;/code&gt;软件中为服务器添加新文件，因为你的登录名为 root，那么新创建的文件也是属于 root 的，如果想要将该文件或路径的所有者改为普通用户，请按以下操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sudo chown &amp;lt;username&amp;gt; &amp;lt;file&amp;gt;&lt;/code&gt; | &lt;code&gt;&amp;lt;file&amp;gt;&lt;/code&gt;为文件名称&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo chown -R &amp;lt;username&amp;gt; &amp;lt;folder&amp;gt;/&lt;/code&gt; | &lt;code&gt;&amp;lt;folder&amp;gt;&lt;/code&gt;为文件夹名称，&lt;code&gt;-R&lt;/code&gt;参数代表递归操作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时用普通用户查看目录中的权限，如果权限不完整可进行调整：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ll&lt;/code&gt; | 查看当前目录下所有文件、文件夹的类型、权限、链接数、所有者、所属组、大小、修改时间、名称&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;如果仅查看目录中的文件名，可以使用&lt;code&gt;ls&lt;/code&gt;命令&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里对权限作简要说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;drwxr-xr-x   4 root root   4096 Nov  7 12:59 ./&lt;/code&gt;；
此时忽略第一个字母&lt;code&gt;d&lt;/code&gt;，它表示这是一个&lt;code&gt;目录&lt;/code&gt;；随后每三个字母都是一组权限标识，分别代表所有者、所属组、其他用户的权限；我们这里只用关心第一组权限标识，&lt;code&gt;rwx&lt;/code&gt;代表可读(read)、可写(write)、可执行(execute)；使用&lt;code&gt;-&lt;/code&gt;则表示无这项权限；在这个例子中也可以清晰的看到两个&lt;code&gt;root&lt;/code&gt;，前一个表示该目录所有者，第二个表示该目录的所属组。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;权限调整命令：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chmod -R u+rwx &amp;lt;folder&amp;gt;/&lt;/code&gt; | 为所有者添加读写执行权&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod g-w &amp;lt;file&amp;gt;&lt;/code&gt; | 为所属组其他用户移除写权限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod a+r &amp;lt;file&amp;gt;&lt;/code&gt; | 为所有人添加读权限&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chmod -R u=rwx,o=x &amp;lt;folder&amp;gt;/&lt;/code&gt; | 为所有者设置读写执行权，为其他用户设置只执行权限&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;至此你已经学会了如何使用 SSH 进行远程服务器连接、为 SSH 连接提供了一定的安全保障，并学习了有关 SFTP 安全文件传输权限的一些知识。&lt;/p&gt;
</content:encoded></item><item><title>SrP-Sakura For Minecraft | 自用插件服务器</title><link>https://blog.srprolin.top/posts/srp-sakura_minecraft/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/srp-sakura_minecraft/</guid><description>本文将介绍自建的插件服务器功能，发布适用于原版生存的辅助性整合包，并为其所添加的mod、资源进行介绍说明</description><pubDate>Mon, 13 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Wiki&lt;/h1&gt;
&lt;p&gt;该文章列写了&lt;code&gt;SrP-Sakura&lt;/code&gt;的客户端和服务端所用的各种资源，详细的命令、按键功能、插件管理说明请到&lt;code&gt;Wiki&lt;/code&gt;文档中查看:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-Sakura_MC/ssmc-1.html&quot;&gt;The Wiki For SrP-Sakura&lt;/a&gt; | (一个用&lt;code&gt;vitepress&lt;/code&gt;搭建的文档页)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SrP-Sakura 服务端&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这并不是一个免费公开的公共服务器，如果你需要的是那样，请关闭该标签页。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是一个自搭建的原版插件服务器的操作指南，用于记录服务器的搭建过程与功能，防止因时间而遗忘掉部分服务器细节。
介于在写这篇指南时，服务器已经完善搭建了 2 个月，部分内容可能有误，但会进行持续更新。
这篇文章中会介绍部分插件的简单使用和会遇到的问题，希望对你有所帮助。
同时，我为该&lt;code&gt;1.21.4&lt;/code&gt;版本整合了一个纯净生存包，它安装了一些&lt;code&gt;mod&lt;/code&gt;、光影、资源包等；当然，这些&lt;code&gt;mod&lt;/code&gt;基本为可客户端单独所用，以便避免与插件服产生冲突；因此它只会对原版生存进行优化辅助，不会更改任何原版游戏内容；资源包和光影将被默认正确加载；部分游戏设置和快捷键将被更改和公示，请详细阅读部分&lt;code&gt;mod&lt;/code&gt;功能与快捷键指南，以便达到良好游玩效果。&lt;/p&gt;
&lt;h2&gt;开放范围&lt;/h2&gt;
&lt;p&gt;这并不是一个由公共服务器搭建的 Minecraft 游戏服，它仅搭建在我自己使用的设备上，因此它并不是 24h 开机，随我个人的意志开关服。
服务器采用两种方案来提供网络地址：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内网地址(需联系本人加入内网)：&lt;code&gt;lin.srprolin.top&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;外网地址(需联系本人开启服务器)：&lt;code&gt;minecraft.srprolin.top&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;核心与版本&lt;/h2&gt;
&lt;p&gt;以&lt;code&gt;1.21.4&lt;/code&gt;为主版本，以&lt;code&gt;paper&lt;/code&gt;作为服务器核心，无任何外置资源包(后续可能考虑)，采用多种插件来建设服务器。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当然&lt;code&gt;paper&lt;/code&gt;核心也不支持任何&lt;code&gt;mod&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面是一些核心的下载地址：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mctimemachine.com/&quot;&gt;Vanilla&lt;/a&gt;原版服务器核心，不支持插件和模组，只提供了一些游戏设置和原版权限组设置(但它也并不是客户端运行的那个游戏，部分客户端红石科技将在此处失效)。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://getbukkit.org/download/spigot&quot;&gt;Spigot&lt;/a&gt;老牌插件服务器核心，对原版游戏性能进行优化(一些红石科技的逻辑将被修改)，同时支持安装插件。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://papermc.io/&quot;&gt;Paper&lt;/a&gt;原&lt;code&gt;Spigot&lt;/code&gt;的一个分支，特点是在&lt;code&gt;spigot&lt;/code&gt;基础上，支持对部分游戏特性进行自定义更改。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fabricmc.net/use/server/&quot;&gt;Fabric&lt;/a&gt;严格上说这是一个模组加载器，但其作为各种&lt;code&gt;mod&lt;/code&gt;服务器的核心，本身并不支持插件，所以一般会用&lt;a href=&quot;https://docs.mcdreforged.com/zh-cn/latest/quick_start/index.html&quot;&gt;MCDReforged(一个服务器管理框架)&lt;/a&gt;来部署&lt;code&gt;fabric&lt;/code&gt;模组服，它提供了外置插件(由插件仓库社区提供)，不与其他插件兼容。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;服务器插件&lt;/h2&gt;
&lt;p&gt;插件资源的来源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.spigotmc.org/resources/categories/tools-and-utilities.15/&quot;&gt;spigot&lt;/a&gt;一些基础性插件依赖库的来源&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.curseforge.com/minecraft&quot;&gt;CurseForge&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modrinth.com/&quot;&gt;Modrith&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/&quot;&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;插件列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://essentialsx.net/wiki/Home.html&quot;&gt;EssentialsX&lt;/a&gt;可以说是一个童年插件了，像有名的&lt;code&gt;/back&lt;/code&gt;、&lt;code&gt;/home&lt;/code&gt;、&lt;code&gt;/tpa&lt;/code&gt;指令基本都来自这个插件。可见它是一个基础性的聚合大插件，我们将以此为基础构建插件生态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://luckperms.net/wiki/Home&quot;&gt;LuckPerms&lt;/a&gt;是一个权限组管理插件，它也是在&lt;code&gt;EssentialsX&lt;/code&gt;文档中被提名的姐妹花，用它管理权限的优势是可以在&lt;code&gt;Web网页端&lt;/code&gt;可视化操作。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://mvplugins.org/&quot;&gt;Multiverse&lt;/a&gt;又名&lt;strong&gt;多元宇宙&lt;/strong&gt;旨在实现一台服务器，无限可能。它是大型服务器必不可少的一款插件，它能在原版服务器地图的基础上创建新的地图，并为新世界创建规则；同时其中的门户组件，又能为世界中构建出类似&lt;strong&gt;地狱门&lt;/strong&gt;的传送门，而不必需要命令行来实现多世界传送。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://worldedit.enginehub.org/en/latest/quickstart/&quot;&gt;WorldEdit&lt;/a&gt;又名创世神，是专为快速建造的模组，同时它也可以作为插件供服务器安装，能够支持&lt;code&gt;WorldEdit&lt;/code&gt;的各种快速建造指令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://worldguard.enginehub.org/en/latest/&quot;&gt;WorldGuard&lt;/a&gt;是一个老牌的世界保护插件，它能够直接在文件中写明对某一世界的规则更改，例如苦力怕的爆炸是否会破坏方块；同时，它也支持对多元宇宙所创建世界的规则更改；结合多元宇宙，和&lt;code&gt;WorldGuard&lt;/code&gt;的区域规则定义，就可以成功建造一个有模有样的&lt;strong&gt;主城&lt;/strong&gt;了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/pop4959/Chunky/wiki/Commands&quot;&gt;Chunky&lt;/a&gt;是一个避免服务器卡顿的预渲染插件，它可以通过终端命令，自行预加载一定范围内的地图资源，这样避免了玩家在跑图时，由于服务器性能不足而导致的卡顿。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jpenilla/MiniMOTD/wiki&quot;&gt;MiniMOTD&lt;/a&gt;能够更改服务器在&lt;code&gt;多人游戏&lt;/code&gt;选项页面的显示效果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.spigotmc.org/resources/tab-1-7-x-1-21-10.57806/&quot;&gt;TAB&lt;/a&gt;是对原版的&lt;code&gt;TAB&lt;/code&gt;面板进行了优化，并显示更多信息，同时又能够在画面上常显示计分板，用来展示一些必要信息十分好用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.decentholograms.eu/&quot;&gt;DecentHolograms&lt;/a&gt;是一款功能非常多样的全息图插件，提供多种功能和自定义选项，可以轻松创建独特的个性化全息图。通过用户友好的命令界面，您可以轻松创建和自定义全息图，而无需编辑任何配置文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://modrepo.de/minecraft/voicechat/overview&quot;&gt;Simple Voice Chat&lt;/a&gt;是一款语音聊天模组，也可以作为服务器插件使用，可以支持在游戏中组队麦克风通信。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://skinsrestorer.net/docs&quot;&gt;SkinsRestorer&lt;/a&gt;是一款用于恢复离线模式服务器和网络皮肤的插件，让玩家只需输入一条命令即可更换皮肤。此外，&lt;code&gt;SkinsRestorer&lt;/code&gt; 还支持在大型网络中缓存皮肤。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://modrinth.com/plugin/infinite-villager-trading?version=1.21.4&amp;amp;loader=spigot&quot;&gt;Infinite Villager Trading&lt;/a&gt;插件旨在增强您的 Minecraft 服务器，提供村民交易的即时补货功能。使用此插件，您可以轻松配置各种交易机制，以适应您的游戏风格。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://gitlab.com/sugarfyi-team/public/mobstoeggs-public/-/wikis/home&quot;&gt;MobsToEggs&lt;/a&gt;是一个趣味插件，可以用鸡蛋将生物进行捕捉，并转化为该生物蛋，请注意该行为是有概率的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/AvarionMC/graves&quot;&gt;Graves&lt;/a&gt;是一个全功能轻量级死亡宝箱插件/玩家墓穴插件！它囊括了您所需的一切功能，甚至更多！同时兼具轻量级和高效性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.spigotmc.org/resources/gsit-modern-sit-seat-and-chair-lay-and-crawl-plugin-1-16-1-21-9.62325/&quot;&gt;GSit&lt;/a&gt;可以让你坐在楼梯/椅子上，在地面上躺下、扑腾、旋转和爬行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://modrinth.com/plugin/imageframe&quot;&gt;ImageFrame&lt;/a&gt;将图像加载到地图和物品展示框上;从 URL 加载图像;支持 PNG、JPEG、WEBP 和 GIF;以地图形式或直接在物品展示框中获取它们！（使用智能选择工具选择您的物品展示框！）;自动图像调整意味着您的图像不会被拉伸！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://modrinth.com/plugin/itemframe&quot;&gt;ItemframeSnipper&lt;/a&gt;是&lt;code&gt;ImageFrame&lt;/code&gt;的一个拓展，它将&lt;strong&gt;剪刀&lt;/strong&gt;的功能拓展为，剪切掉物品展示框的突出显示。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://modrinth.com/plugin/interactivechat&quot;&gt;InteractiveChat&lt;/a&gt;有了这个插件，你就可以和朋友们展示你手中的物品、物品栏内容和末影箱内容了！&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://modrinth.com/plugin/interactionvisualizer&quot;&gt;InteractionVisualizer&lt;/a&gt;有了这个插件，你就可以！在 GUI 中实时查看玩家放入工作台的物品！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;插件依赖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/milkbowl/Vault&quot;&gt;Vault&lt;/a&gt;是一个免费的开源 API 库，并且不需要额外代码；这个插件与之前的插件是具有强关联性的，只有安装了它才能完善它们的功能，例如基于&lt;code&gt;EssentialsX&lt;/code&gt;的经济系统，&lt;code&gt;LuckPerms&lt;/code&gt;的权限组显示等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://wiki.placeholderapi.com/&quot;&gt;PlaceholderAPI&lt;/a&gt;顾名思义是一个占位符插件，也是&lt;code&gt;TAB&lt;/code&gt;插件正常显示的基础，例如&lt;code&gt;%player_name%&lt;/code&gt;的显示。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.spigotmc.org/resources/protocollib.1997/&quot;&gt;ProtocolLib&lt;/a&gt; 是一个允许对 Minecraft 协议进行读写访问的库，它的作用只是让其他插件能够正常运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.papermc.io/adventure/getting-started/&quot;&gt;Adventure&lt;/a&gt;旨在提供与聊天组件交互所需的核心库。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;SrP-Sakura 客户端&lt;/h1&gt;
&lt;p&gt;该&lt;strong&gt;纯净生存辅助整合包&lt;/strong&gt;下载地址在&lt;a href=&quot;https://doc.srprolin.top/posts/SrP-Sakura_MC/ssmc-2.html&quot;&gt;Wiki的附属整合包页&lt;/a&gt;中提供。&lt;/p&gt;
&lt;h2&gt;启动器推荐&lt;/h2&gt;
&lt;p&gt;强烈推荐由&lt;a href=&quot;https://mc.sjtu.cn/welcome/&quot;&gt;上海交通大学 Minecraft 社&lt;/a&gt;自主研发的开源启动器&lt;a href=&quot;https://mc.sjtu.cn/sjmcl/zh/download/latest&quot;&gt;SJMC Launcher&lt;/a&gt;，简要功能见&lt;a href=&quot;https://www.bilibili.com/video/BV1gMnJzGEiM/&quot;&gt;宣传视频页&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;进入&lt;a href=&quot;https://mc.sjtu.cn/sjmcl/zh/download/latest&quot;&gt;下载页&lt;/a&gt;后，选择 portable 版本，便于管理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/hexo/20251013123115171.png&quot; alt=&quot;SJMC launcher下载&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在任意盘符处创建新文件夹，命名为&lt;code&gt;SJMCL&lt;/code&gt;，再将下载好的文件放入其中，双击运行即可。&lt;/p&gt;
&lt;h2&gt;资源列表&lt;/h2&gt;
&lt;p&gt;模组：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fabric API&lt;/li&gt;
&lt;li&gt;Tweakeroo
&lt;code&gt;L_ALT+H&lt;/code&gt;自动切换鞘翅
&lt;code&gt;L_ALT+X&lt;/code&gt;伪潜行
&lt;code&gt;L_ALT+C&lt;/code&gt;灵魂出窍
开启自动补货
开启死亡坐标打印
开启灵活放置，搭配&lt;code&gt;L_CTRL&lt;/code&gt;和&lt;code&gt;L_ALT&lt;/code&gt;使用
&lt;ul&gt;
&lt;li&gt;MaLiLib&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;TweakerMore
&lt;code&gt;K+C&lt;/code&gt;调出面板
&lt;code&gt;R_ALT+P&lt;/code&gt;安全挂机
&lt;code&gt;L_ALT+G&lt;/code&gt;伪夜视&lt;/li&gt;
&lt;li&gt;WI Zoom
&lt;code&gt;Z&lt;/code&gt;键开启&lt;/li&gt;
&lt;li&gt;Sodium 钠&lt;/li&gt;
&lt;li&gt;Xplus 游戏内输入法
&lt;ul&gt;
&lt;li&gt;Kotlin&lt;/li&gt;
&lt;li&gt;cloth config api&lt;/li&gt;
&lt;li&gt;architectury api&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Xplus 自动钓鱼&lt;/li&gt;
&lt;li&gt;3D skin layer&lt;/li&gt;
&lt;li&gt;Searchables 设置键位搜索&lt;/li&gt;
&lt;li&gt;Searchables packs 资源包搜索框&lt;/li&gt;
&lt;li&gt;Remove Reloading Screen 资源包重载移除锁定&lt;/li&gt;
&lt;li&gt;ScalableLux 优化&lt;/li&gt;
&lt;li&gt;sodium options 钠视频画面&lt;/li&gt;
&lt;li&gt;sodium extra 钠扩展&lt;/li&gt;
&lt;li&gt;mod menu
&lt;ul&gt;
&lt;li&gt;text placeholder api&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Modern ui
&lt;ul&gt;
&lt;li&gt;forge config api port&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;mini hud&lt;/li&gt;
&lt;li&gt;lithium 狸 优化&lt;/li&gt;
&lt;li&gt;Custom lan 自定义联机&lt;/li&gt;
&lt;li&gt;klee slabs 更好半砖破坏
&lt;ul&gt;
&lt;li&gt;balm&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;jade 玉 显示&lt;/li&gt;
&lt;li&gt;iris shaders 光影管理&lt;/li&gt;
&lt;li&gt;ice berg 冰山 优化&lt;/li&gt;
&lt;li&gt;item hightlighter 物品拾取高亮&lt;/li&gt;
&lt;li&gt;fps reducer 限制器&lt;/li&gt;
&lt;li&gt;euphoria patches 配合光影 ComplementaryUnbound 的插件&lt;/li&gt;
&lt;li&gt;enity culting 实体渲染优化&lt;/li&gt;
&lt;li&gt;detail armor bar 细节盔甲显示&lt;/li&gt;
&lt;li&gt;detail armor bar compat 舒适显示&lt;/li&gt;
&lt;li&gt;controlling 键位冲突显示&lt;/li&gt;
&lt;li&gt;continuity 连接纹理 （资源包启用）&lt;/li&gt;
&lt;li&gt;chunks fade in 区块淡入动画&lt;/li&gt;
&lt;li&gt;chat heads 聊天头像显示&lt;/li&gt;
&lt;li&gt;chat patches 聊天补丁
&lt;ul&gt;
&lt;li&gt;YetAnotherConfigLib&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;better advancements 更好的成就&lt;/li&gt;
&lt;li&gt;better ping display 更好的延迟显示&lt;/li&gt;
&lt;li&gt;betterstats 更好的统计信息
&lt;ul&gt;
&lt;li&gt;TCDCommons API&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;better mount hud 更好骑乘显示&lt;/li&gt;
&lt;li&gt;better f3 更卡的 f3（不是）&lt;/li&gt;
&lt;li&gt;apple skin 苹果皮显示&lt;/li&gt;
&lt;li&gt;ayame paperdoll 像基岩版的自我显示&lt;/li&gt;
&lt;li&gt;simple voice chat 简单聊天&lt;/li&gt;
&lt;li&gt;inventoryhud+ HUD 显示&lt;/li&gt;
&lt;li&gt;Inventory profiles next 一键整理
&lt;code&gt;R+C&lt;/code&gt;开启设置
&lt;ul&gt;
&lt;li&gt;libIpn&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;lamb dynamic lights 动态光源&lt;/li&gt;
&lt;li&gt;litematica 投影
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;M+C&lt;/code&gt;打开设置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;litematica printer 投影打印机&lt;/li&gt;
&lt;li&gt;replay mod 回放&lt;/li&gt;
&lt;li&gt;rei 物品管理器&lt;/li&gt;
&lt;li&gt;trial spawner timer 试炼塔倒计时&lt;/li&gt;
&lt;li&gt;ydm 武器大师&lt;/li&gt;
&lt;li&gt;worldedit 创世神&lt;/li&gt;
&lt;li&gt;xaero 世界地图&lt;/li&gt;
&lt;li&gt;xaero 小地图&lt;/li&gt;
&lt;li&gt;xaero plus&lt;/li&gt;
&lt;li&gt;Bobby 服务器区块缓存&lt;/li&gt;
&lt;li&gt;carpet 地毯假人模组&lt;/li&gt;
&lt;li&gt;EMF entity 实体渲染
&lt;ul&gt;
&lt;li&gt;ETF&lt;/li&gt;
&lt;li&gt;ESF&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;资源包：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fresh 系列
&lt;ul&gt;
&lt;li&gt;Fresh Animations&lt;/li&gt;
&lt;li&gt;Fresh moves&lt;/li&gt;
&lt;li&gt;Fresh Animations extensions&lt;/li&gt;
&lt;li&gt;Fresh Skeleton Physics&lt;/li&gt;
&lt;li&gt;Fresh Dungeons&lt;/li&gt;
&lt;li&gt;Fresh compats&lt;/li&gt;
&lt;li&gt;Fresh Animations details&lt;/li&gt;
&lt;li&gt;Fresh Animations objects&lt;/li&gt;
&lt;li&gt;Fresh Animations Emissive&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fresh Flower Pots&lt;/li&gt;
&lt;li&gt;low fire&lt;/li&gt;
&lt;li&gt;low on fire&lt;/li&gt;
&lt;li&gt;low shield&lt;/li&gt;
&lt;li&gt;masa mod translation pack&lt;/li&gt;
&lt;li&gt;mob creates&lt;/li&gt;
&lt;li&gt;XK redstone display&lt;/li&gt;
&lt;li&gt;better lanterns&lt;/li&gt;
&lt;li&gt;better bows&lt;/li&gt;
&lt;li&gt;better boat&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;光影:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ComplementaryUnbound (已安装 euphoria patches，请不要卸载原光影)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>一些Markdown语法展示</title><link>https://blog.srprolin.top/posts/markdown-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/markdown-1/</guid><description>主要演示了一些Markdown语法的使用，每一条均有代码块进行源码展示</description><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;一级标题&lt;/h1&gt;
&lt;h2&gt;二级标题&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# 一级标题

## 二级标题
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;一级标题&lt;/h1&gt;
&lt;h2&gt;二级标题&lt;/h2&gt;
&lt;h3&gt;三级标题&lt;/h3&gt;
&lt;h4&gt;四级标题&lt;/h4&gt;
&lt;h5&gt;五级标题&lt;/h5&gt;
&lt;h6&gt;六级标题&lt;/h6&gt;
&lt;pre&gt;&lt;code&gt;# 一级标题

## 二级标题

### 三级标题

#### 四级标题

##### 五级标题

###### 六级标题
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;粗体&lt;/strong&gt;
&lt;strong&gt;粗体&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;**粗体**
**粗体**
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;斜体&lt;/em&gt;
&lt;em&gt;斜体&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;_斜体_
_斜体_
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;粗斜体&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;em&gt;粗斜体&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;**_粗斜体_**
**_粗斜体_**
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;项目 1&lt;/li&gt;
&lt;li&gt;项目 2&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;项目 3
&lt;ul&gt;
&lt;li&gt;子项目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;项目 4&lt;/li&gt;
&lt;li&gt;项目 5&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;- 项目 1
- 项目 2

* 项目 3
  - 子项目

- 项目 4
- 项目 5
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;列表 1
子列表&lt;/li&gt;
&lt;li&gt;列表 2&lt;/li&gt;
&lt;li&gt;列表 3&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;1. 列表 1
   子列表
2. 列表 2
3. 列表 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;s&gt;中划线&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~~中划线~~
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 复选框（未完成）
&lt;ul&gt;
&lt;li&gt;[ ] 子任务复选框&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;[x] 复选框（已完成）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;- [ ] 复选框（未完成）
  - [ ] 子任务复选框

* [x] 复选框（已完成）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://obsidian.md/&quot;&gt;外链&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[外链](https://obsidian.md/)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://obsidian.md/&quot;&gt;这是一条有变量的链接&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[这是一条有变量的链接][这里是变量名]

[这里是变量名]: https://obsidian.md/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://obsidian.md/apple-touch-icon.png&quot; alt=&quot;图片链接&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![图片链接](https://obsidian.md/apple-touch-icon.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://obsidian.md/apple-touch-icon.png&quot; alt=&quot;这是一条有变量的图片&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;![这是一条有变量的图片][图片变量名]

[图片变量名]: https://obsidian.md/apple-touch-icon.png
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;上下各有一条分割线（各一行）&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;---
上下各有一条分割线（各一行）
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;下面还是一条分割线（占三行）&lt;/p&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;下面还是一条分割线（占三行）

---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;依旧是三条分割线（各一行）&lt;/p&gt;
&lt;hr /&gt;
&lt;hr /&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;依旧是三条分割线（各一行）

---

---

---
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;hello,world! 这是一个代码块
这是换行后的代码
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;    hello,world! 这是一个代码块
    这是换行后的代码
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;	printf(&quot;hello,world!&quot;); //这还是一个代码块
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;上面代码块的实现：
```c
printf(&quot;hello,world!&quot;); //这还是一个代码块
```&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;引用单段代码：&lt;code&gt;hello,world!&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;引用单段代码：`hello,world!`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;转义符&lt;code&gt;\&lt;/code&gt;：这是一个双反斜杠\\&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;转义符`\`：这是一个双反斜杠\\\
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这是一段引用文本&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;这是换行的第二段引用
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这是组合引用第一行
这是组合引用第二行&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;这是嵌套引用外层&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这是嵌套引用内层&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; 这是一段引用文本

    这是换行的第二段引用

&amp;gt; 这是组合引用第一行
&amp;gt; 这是组合引用第二行

&amp;gt; 这是嵌套引用外层
&amp;gt;
&amp;gt; &amp;gt; 这是嵌套引用内层
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表头 1&lt;/th&gt;
&lt;th&gt;表头 2&lt;/th&gt;
&lt;th&gt;表头 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;表体 1&lt;/td&gt;
&lt;td&gt;表体 2&lt;/td&gt;
&lt;td&gt;表体 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;表体 4&lt;/td&gt;
&lt;td&gt;表体 5&lt;/td&gt;
&lt;td&gt;表体 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;上面是无对齐，下面是左中右对齐&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;表头 1&lt;/th&gt;
&lt;th&gt;表头 2&lt;/th&gt;
&lt;th&gt;表头 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;表体 1&lt;/td&gt;
&lt;td&gt;表体 2&lt;/td&gt;
&lt;td&gt;表体 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;表体 4&lt;/td&gt;
&lt;td&gt;表体 5&lt;/td&gt;
&lt;td&gt;表体 6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;&lt;code&gt;| 表头 1 | 表头 2 | 表头 3 |
| ------ | ------ | ------ |
| 表体 1 | 表体 2 | 表体 3 |
| 表体 4 | 表体 5 | 表体 6 |

上面是无对齐，下面是左中右对齐

| 表头 1 | 表头 2 | 表头 3 |
| :----- | :----: | -----: |
| 表体 1 | 表体 2 | 表体 3 |
| 表体 4 | 表体 5 | 表体 6 |
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;lt;u&amp;gt;HTML 下划线&amp;lt;/u&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;u&amp;gt;HTML 下划线&amp;lt;/u&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML&lt;code&gt;img&lt;/code&gt;标签让照片变大：&lt;/p&gt;
&lt;p&gt;&amp;lt;img style=&quot;width: 300px&quot; src=&quot;https://obsidian.md/apple-touch-icon.png&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;hr&amp;gt;为这段内容上方添加分割线&amp;lt;/hr&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;span style=&quot;color: orange&quot;&amp;gt;使用 css 改变字体颜色&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img style=&quot;width: 300px&quot; src=&quot;https://obsidian.md/apple-touch-icon.png&quot;&amp;gt;

&amp;lt;hr&amp;gt;为这段内容上方添加分割线&amp;lt;/hr&amp;gt;

&amp;lt;span style=&quot;color: orange&quot;&amp;gt;使用 css 改变字体颜色&amp;lt;/span&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里有两个视频：&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe
src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;amp;aid=80433022&amp;amp;bvid=BV1GJ411x7h7&amp;amp;cid=137649199&amp;amp;p=0&quot;
scrolling=&quot;no&quot;
border=&quot;0&quot;
frameborder=&quot;no&quot;
framespacing=&quot;0&quot;
allowfullscreen=&quot;true&quot;
width=&quot;640&quot;
height=&quot;480&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;lt;iframe
width=&quot;560&quot;
height=&quot;315&quot;
src=&quot;https://www.youtube.com/embed/dQw4w9WgXcQ?si=SrfdRfdqp2FJyQTn&quot; title=&quot;YouTube video player&quot;
frameborder=&quot;0&quot;
allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;iframe
    src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;amp;aid=80433022&amp;amp;bvid=BV1GJ411x7h7&amp;amp;cid=137649199&amp;amp;p=0&quot;
    scrolling=&quot;no&quot;
    border=&quot;0&quot;
    frameborder=&quot;no&quot;
    framespacing=&quot;0&quot;
    allowfullscreen=&quot;true&quot;
    width=&quot;640&quot;
    height=&quot;480&quot;
&amp;gt;&amp;lt;/iframe&amp;gt;

&amp;lt;iframe
	width=&quot;560&quot;
	height=&quot;315&quot;
	src=&quot;https://www.youtube.com/embed/dQw4w9WgXcQ?si=SrfdRfdqp2FJyQTn&quot; title=&quot;YouTube video player&quot;
	 frameborder=&quot;0&quot;
	 allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
	 referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
	 allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$$
x+y=0
$$&lt;/p&gt;
&lt;p&gt;这是一条公式 $x+y=1$&lt;/p&gt;
&lt;p&gt;这是一个分数 $\frac{1}{2}$&lt;/p&gt;
&lt;p&gt;这是一个根式 $\sqrt{2}$&lt;/p&gt;
&lt;p&gt;这是一个 3 次根式 $\sqrt[3]{2}$&lt;/p&gt;
&lt;p&gt;变量 $x_3$ 的平方为 $x^2_3$&lt;/p&gt;
&lt;p&gt;变量 $y_{x_1}$ 的 $z_2$ 次方为 $y^{z_2}_{x_1}$&lt;/p&gt;
&lt;p&gt;这是一个定积分 $\int_1^2xdx$&lt;/p&gt;
&lt;p&gt;这是一个极限 $\lim_{n\rightarrow+\infty}\frac{1}{n + 1}$&lt;/p&gt;
&lt;p&gt;这是一个向量 $\vec{a}$&lt;/p&gt;
&lt;p&gt;这是一个算式 $1+2+3+\cdots+n$&lt;/p&gt;
&lt;p&gt;这是一个范围 $1,2,3\ldots,n$&lt;/p&gt;
&lt;p&gt;这是向量点乘 $\vec{a}\cdot\vec{b}$&lt;/p&gt;
&lt;p&gt;这是从 1 至 n 的累加 $\sum_1^n$&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$$
x+y=0
$$

这是一条公式 $x+y=1$

这是一个分数 $\frac{1}{2}$

这是一个根式 $\sqrt{2}$

这是一个 3 次根式 $\sqrt[3]{2}$

变量 $x_3$ 的平方为 $x^2_3$

变量 $y_{x_1}$ 的 $z_2$ 次方为 $y^{z_2}_{x_1}$

这是一个定积分 $\int_1^2xdx$

这是一个极限 $\lim_{n\rightarrow+\infty}\frac{1}{n + 1}$

这是一个向量 $\vec{a}$

这是一个算式 $1+2+3+\cdots+n$

这是一个范围 $1,2,3\ldots,n$

这是向量点乘 $\vec{a}\cdot\vec{b}$

这是从 1 至 n 的累加 $\sum_1^n$
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这是亿些数学符号&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;代码&lt;/th&gt;
&lt;th&gt;符号&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;\not=&lt;/td&gt;
&lt;td&gt;$\not=$&lt;/td&gt;
&lt;td&gt;不等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\approx&lt;/td&gt;
&lt;td&gt;$\approx$&lt;/td&gt;
&lt;td&gt;约等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\times&lt;/td&gt;
&lt;td&gt;$\times$&lt;/td&gt;
&lt;td&gt;乘号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\div&lt;/td&gt;
&lt;td&gt;$\div$&lt;/td&gt;
&lt;td&gt;除号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\leq&lt;/td&gt;
&lt;td&gt;$\leq$&lt;/td&gt;
&lt;td&gt;小于等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\geq&lt;/td&gt;
&lt;td&gt;$\geq$&lt;/td&gt;
&lt;td&gt;大于等于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\pm&lt;/td&gt;
&lt;td&gt;$\pm$&lt;/td&gt;
&lt;td&gt;正负号&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\sum&lt;/td&gt;
&lt;td&gt;$\sum$&lt;/td&gt;
&lt;td&gt;求和符号（累加）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\prod&lt;/td&gt;
&lt;td&gt;$\prod$&lt;/td&gt;
&lt;td&gt;累乘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\coprod&lt;/td&gt;
&lt;td&gt;$\coprod$&lt;/td&gt;
&lt;td&gt;累除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\overline{a + b + c}&lt;/td&gt;
&lt;td&gt;$\overline{a + b + c}$&lt;/td&gt;
&lt;td&gt;平均值&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\sin&lt;/td&gt;
&lt;td&gt;$\sin$&lt;/td&gt;
&lt;td&gt;正弦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\cos&lt;/td&gt;
&lt;td&gt;$\cos$&lt;/td&gt;
&lt;td&gt;余弦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\tan&lt;/td&gt;
&lt;td&gt;$\tan$&lt;/td&gt;
&lt;td&gt;正切&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\cot&lt;/td&gt;
&lt;td&gt;$\cot$&lt;/td&gt;
&lt;td&gt;余切&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\sec&lt;/td&gt;
&lt;td&gt;$\sec$&lt;/td&gt;
&lt;td&gt;正割&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\csc&lt;/td&gt;
&lt;td&gt;$\csc$&lt;/td&gt;
&lt;td&gt;余割&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\circ&lt;/td&gt;
&lt;td&gt;$\circ$&lt;/td&gt;
&lt;td&gt;度&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\infty&lt;/td&gt;
&lt;td&gt;$\infty$&lt;/td&gt;
&lt;td&gt;无穷&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\int&lt;/td&gt;
&lt;td&gt;$\int$&lt;/td&gt;
&lt;td&gt;定积分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\iint&lt;/td&gt;
&lt;td&gt;$\iint$&lt;/td&gt;
&lt;td&gt;双重积分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\iiint&lt;/td&gt;
&lt;td&gt;$\iiint$&lt;/td&gt;
&lt;td&gt;三重积分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\oint&lt;/td&gt;
&lt;td&gt;$\oint$&lt;/td&gt;
&lt;td&gt;曲线积分&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;x\prime&lt;/td&gt;
&lt;td&gt;$x\prime$&lt;/td&gt;
&lt;td&gt;求导&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\lim&lt;/td&gt;
&lt;td&gt;$\lim$&lt;/td&gt;
&lt;td&gt;极限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\alpha&lt;/td&gt;
&lt;td&gt;$\alpha$&lt;/td&gt;
&lt;td&gt;阿尔法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\beta&lt;/td&gt;
&lt;td&gt;$\beta$&lt;/td&gt;
&lt;td&gt;贝塔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\gamma&lt;/td&gt;
&lt;td&gt;$\gamma$&lt;/td&gt;
&lt;td&gt;伽玛&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\delta&lt;/td&gt;
&lt;td&gt;$\delta$&lt;/td&gt;
&lt;td&gt;德尔塔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\epsilon&lt;/td&gt;
&lt;td&gt;$\epsilon$&lt;/td&gt;
&lt;td&gt;艾普西龙&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\eta&lt;/td&gt;
&lt;td&gt;$\eta$&lt;/td&gt;
&lt;td&gt;依塔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\theta&lt;/td&gt;
&lt;td&gt;$\theta$&lt;/td&gt;
&lt;td&gt;西塔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\pi&lt;/td&gt;
&lt;td&gt;$\pi$&lt;/td&gt;
&lt;td&gt;派&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\omega&lt;/td&gt;
&lt;td&gt;$\omega$&lt;/td&gt;
&lt;td&gt;殴米伽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\rho&lt;/td&gt;
&lt;td&gt;$\rho$&lt;/td&gt;
&lt;td&gt;柔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\sigma&lt;/td&gt;
&lt;td&gt;$\sigma$&lt;/td&gt;
&lt;td&gt;西格玛&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\mu&lt;/td&gt;
&lt;td&gt;$\mu$&lt;/td&gt;
&lt;td&gt;缪&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\lambda&lt;/td&gt;
&lt;td&gt;$\lambda$&lt;/td&gt;
&lt;td&gt;拦姆达&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\tau&lt;/td&gt;
&lt;td&gt;$\tau$&lt;/td&gt;
&lt;td&gt;滔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\psi&lt;/td&gt;
&lt;td&gt;$\psi$&lt;/td&gt;
&lt;td&gt;普赛&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\phi&lt;/td&gt;
&lt;td&gt;$\phi$&lt;/td&gt;
&lt;td&gt;傅艾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\xi&lt;/td&gt;
&lt;td&gt;$\xi$&lt;/td&gt;
&lt;td&gt;柯西&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\emptyset&lt;/td&gt;
&lt;td&gt;$\emptyset$&lt;/td&gt;
&lt;td&gt;空集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\in&lt;/td&gt;
&lt;td&gt;$\in$&lt;/td&gt;
&lt;td&gt;属于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\notin&lt;/td&gt;
&lt;td&gt;$\notin$&lt;/td&gt;
&lt;td&gt;不属于&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\supset&lt;/td&gt;
&lt;td&gt;$\supset$&lt;/td&gt;
&lt;td&gt;真包含&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\supseteq&lt;/td&gt;
&lt;td&gt;$\supseteq$&lt;/td&gt;
&lt;td&gt;包含&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\bigcap&lt;/td&gt;
&lt;td&gt;$\bigcap$&lt;/td&gt;
&lt;td&gt;交集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\bigcup&lt;/td&gt;
&lt;td&gt;$\bigcup$&lt;/td&gt;
&lt;td&gt;并集&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\log&lt;/td&gt;
&lt;td&gt;$\log$&lt;/td&gt;
&lt;td&gt;对数函数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\ln&lt;/td&gt;
&lt;td&gt;$\ln$&lt;/td&gt;
&lt;td&gt;以 e 为底的对数函数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;\lg&lt;/td&gt;
&lt;td&gt;$\lg$&lt;/td&gt;
&lt;td&gt;以 10 为底的对数函数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded></item><item><title>略知OBS | 开源视频录制与直播推流</title><link>https://blog.srprolin.top/posts/obs-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/obs-1/</guid><description>本文将介绍OBS的视频录制、直播推流设置，以及虚拟摄像头、即时回放、插件的用法</description><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言与摘要&lt;/h1&gt;
&lt;p&gt;首先，OBS的功能是非常强大的，可以用于&lt;strong&gt;直播推流&lt;/strong&gt;、&lt;strong&gt;视频录制&lt;/strong&gt;、&lt;strong&gt;即时回放&lt;/strong&gt;、&lt;strong&gt;多机位画面切换&lt;/strong&gt;。另外其自带的&lt;strong&gt;虚拟摄像机&lt;/strong&gt;可以将准备好的画面，作为伪装好的摄像头画面在通讯软件中输出。其次，OBS作为开源软件，具有庞大的插件社区和脚本数量，使用OBS丰富的插件可以实现非常多的功能，而编写脚本可以实现自定义功能。
本篇主要介绍OBS的下载、录制与直播设置、虚拟摄像头的使用案例、及时回放的设置、好用的插件教程。&lt;/p&gt;
&lt;h1&gt;下载与手册&lt;/h1&gt;
&lt;p&gt;官网下载地址: https://obsproject.com/download ，选择对应系统和方式下载。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_11-57-38.ClWlw-ji_Z2infre.webp&quot; alt=&quot;obs-download&quot; /&gt;
如果打不开，这里提供下载链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows：&lt;a href=&quot;https://cdn-fastly.obsproject.com/downloads/OBS-Studio-31.1.1-Windows-x64-Installer.exe&quot;&gt;OBS-Studio-31.1.1-Windows-x64-Installer.exe&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MacOS：&lt;a href=&quot;https://cdn-fastly.obsproject.com/downloads/obs-studio-31.1.1-macos-intel.dmg&quot;&gt;obs-studio-31.1.1-macos-intel.dmg&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux：
下载：&lt;code&gt;flatpak install flathub com.obsproject.Studio&lt;/code&gt;
运行：&lt;code&gt;flatpak run com.obsproject.Studio&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;官方的帮助页面(全英)：&lt;a href=&quot;https://obsproject.com/kb/&quot;&gt;Knowledge Base&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;快速开始&lt;/h1&gt;
&lt;h2&gt;录屏基础设置&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_13-06-16.DkJLnCwf_ZAXxdO.webp&quot; alt=&quot;默认页面&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入设置，点击左侧&lt;strong&gt;视频&lt;/strong&gt;，设置&lt;strong&gt;基础(画布)分辨率&lt;/strong&gt;为你想要录制的分辨率，默认推荐&lt;code&gt;1920×1080&lt;/code&gt;；选择帧率，推荐为&lt;code&gt;30帧&lt;/code&gt;或&lt;code&gt;60帧&lt;/code&gt;。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_21-00-30.CTPyfa7c_ZmXvkg.webp&quot; alt=&quot;视频设置&quot; /&gt;&lt;/li&gt;
&lt;li&gt;点击输出，选择输出模式为&lt;strong&gt;高级&lt;/strong&gt;，点击录制选项：设置你的录像路径、选择录像格式为&lt;code&gt;MPEG-4(.mp4)&lt;/code&gt;；选择音频编码器为&lt;code&gt;FFmpeg AAC&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;选择视频编码器为&lt;code&gt;x264&lt;/code&gt;或&lt;code&gt;QuickSync H.264&lt;/code&gt;或&lt;code&gt;NVIDIA NVENC H.264&lt;/code&gt;或&lt;code&gt;AMD HW H.264(AVC)&lt;/code&gt;，如果存在多个，后两个更优，其次为第二个。&lt;/li&gt;
&lt;li&gt;将上述编码器的设置中，&lt;strong&gt;比特率控制&lt;/strong&gt;分别对应设置为&lt;code&gt;CRF&lt;/code&gt;、&lt;code&gt;CQP&lt;/code&gt;、&lt;code&gt;恒定QP&lt;/code&gt;、&lt;code&gt;恒定QP&lt;/code&gt;，并将&lt;strong&gt;值&lt;/strong&gt;设置为&lt;code&gt;20&lt;/code&gt;。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_21-06-12.SUqh8nnS_nvVh3.webp&quot; alt=&quot;输出设置&quot; /&gt;&lt;/li&gt;
&lt;li&gt;返回主页面，添加源，请选择&lt;strong&gt;显示器采集&lt;/strong&gt;，随后自定义名称；然后选择你的显示器，确保画布中出现了显示器的画面；如果画布中显示不完全，请选择对应源右击，进行变换。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-25_20-49-02.s2_sTmxb_Z24youE.webp&quot; alt=&quot;添加显示器源&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/Timeline_1_01_00_00_00.B3hPPtNg_Z1Uh7wT.webp&quot; alt=&quot;拉伸到全屏&quot; /&gt;
至此，可以进行正常的录制屏幕了。&lt;/li&gt;
&lt;li&gt;在添加源选项中，推荐更多的使用“窗口采集”，可以管理不同的图层表现，是比较灵活的选择。
后面的详解配置将以此作为基础，进行优化和不同用法的介绍。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;混音器与录音预设&lt;/h2&gt;
&lt;p&gt;当在“源”处选择，添加“应用程序音频”，或者添加“窗口采集”时勾选“音频采集功能”，那么均可在混音器中发现，并可在高级音频选项里选择音轨，最多6条独立音轨。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_21-06-59.w8T2WO3n_Z2a2MDX.webp&quot; alt=&quot;混音器高级音频设置&quot; /&gt;
想要录制多条音轨，需要在输出录制中勾选你想要输出的音轨及数量，推荐使用mkv格式封装
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_21-12-23.CmflzdGM_2vLuPD.webp&quot; alt=&quot;视频输出音轨勾选&quot; /&gt;
在这种情况下，如果你需要录制实况视频，你可能会有私人语音、BGM、游戏声音、个人麦克风等多种声音，在后期剪辑时，可以做到特定音频分离，从而只获得干净的游戏声音。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要注意的是，推荐将所有“源”都分给1号音轨，再开一条用于分离，原因有二：首先，默认的视频播放器对于多音轨视频会默认应用第一条音轨，这样在回看时可以获取所有的声音；其次，对于直播和录制场景不分离的用户，直播输出是只能一条音轨的，那么这个时候就可以在直播时勾选一号音轨，从而不用新建场景、新建源等操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;音频的录制，想要获得更好的效果，需要对音频编码器、音频码率、音频采样进行设置：
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_21-20-35.BMTpN1EK_Z10Ybzj.webp&quot; alt=&quot;音频编码器&quot; /&gt;
现在的音频设备，能够做到PCM24位的解析，应该是相当小众了，对于只是想进一步提升音频效果，我认为FLAC16位已经足够。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_21-24-34.CgByVVSK_ER55J.webp&quot; alt=&quot;音频码率&quot; /&gt;
音频码率，可以对每条音轨单独设置，单位是&lt;code&gt;kbps&lt;/code&gt;，推荐192起步。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-15-39.TwObENYY_ZKLatQ.webp&quot; alt=&quot;音频采样&quot; /&gt;
采样率48kHz和44.1kHz均可；声道请不要选择单声道，他并不是“单声道”，他是将两只耳朵里的声音设置成一模一样的，推荐“立体声”，也即“双声道”，能够更好还原音频本来的空间效果。&lt;/p&gt;
&lt;h2&gt;视频编码器的使用场景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;x264：此编码器为CPU编码，如果追求高质量的教程视频，对于CPU负担不重的场景，可以选用该编码器，它非常慢，但效果很好，不过一般有显卡就不要用这个了，显卡中有单独的编码单元就是为视频编码所设计的，而CPU，他只是能做这件事，但他要做的事情非常多。&lt;/li&gt;
&lt;li&gt;QuickSync：这是IntelCPU的集成显卡的独立视频编码器，现在多数的游戏笔记本有两个显卡，一个称为独显，另一个称为核显，而这个就是核显，它可能会对CPU的性能有一定影响，如果确定不使用，可以选择禁用该显卡，只需要在Windows搜索栏搜索“设备管理器”，按照图示操作即可。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_21-37-43.C0YyTJBL_1k7HqT.webp&quot; alt=&quot;关闭核显&quot; /&gt;&lt;/li&gt;
&lt;li&gt;NVENC：这是NVIDIA显卡的视频编码器，一般情况下的录屏都可以使用该编码器，显卡的性能在多数情况下都是盈余的。但需要注意，在一些大型3A单机游戏、深度学习模型训练的场景下，显卡占用会被拉满，虽然视频编码器是被隔离开的，但这种情况下的录屏效果一般不会太好，推荐使用核显来录制，但同时，对于共享GPU内存会有占用，也会影响使用独显的应用性能表现。&lt;/li&gt;
&lt;li&gt;HW：AMD显卡的视频编码器，你不会既有A卡又有N卡吧？那么你会是双机推流的用户，但如果不是迫不得已，N卡的适用场景还是远超A卡，但AMD的CPU是真的比Intel香。&lt;/li&gt;
&lt;li&gt;编码器的后缀&lt;code&gt;h.264&lt;/code&gt;是最常见的编码格式，在某些场景下，&lt;code&gt;h.264&lt;/code&gt;可以是&lt;code&gt;mp4&lt;/code&gt;的代称，虽然混淆，但是足够经典；&lt;code&gt;h.265&lt;/code&gt;和&lt;code&gt;hevc&lt;/code&gt;都是NVIDIA提出的新型编码格式，他是对&lt;code&gt;h.264&lt;/code&gt;的一种优化，在追求高质量的同时缩小文件大小，同时也是直播常用的编码格式，可惜bilibili仍然不支持&lt;code&gt;h.265&lt;/code&gt;直播，；&lt;code&gt;AV1&lt;/code&gt;也是NVIDIA推出的新编码格式，可以认为是效果最好的一种格式了，但因为比较新，很多视频播放器并不支持，&lt;code&gt;h.265&lt;/code&gt;也有很多情况下不是被默认支持的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总之，优先选择NVENC和&lt;code&gt;h.264&lt;/code&gt;在大多数场景下是不会错的。&lt;/p&gt;
&lt;p&gt;需要注意的是，独显或集显的录制选择，需要看CPU、GPU的使用率，如果GPU已经要吃满了，那么集显的录制是比较优的。&lt;/p&gt;
&lt;p&gt;现在大多聊天软件自带的视频预览播放器，仅支持&lt;code&gt;h.264&lt;/code&gt;,如果只是单纯录屏分享，还是推荐&lt;code&gt;h.264&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;直播设置(bilibili为例)&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_21-58-55.CCdX8Ok7_ZhDiNr.webp&quot; alt=&quot;推流码&quot; /&gt;
这里是哔哩哔哩直播姬，在bilibili更新后，网页推流需要一定的粉丝基础才能开播，所以选择用直播姬，但本质上还是用的obs来直播。&lt;/p&gt;
&lt;p&gt;复制服务器和推流码，接着打开obs：
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-02-44.rnhSQHr8_ZFpXyi.webp&quot; alt=&quot;推流码&quot; /&gt;
将服务器和推流码填入即可，此时obs会代理直播姬，在obs选择开播与下播。&lt;/p&gt;
&lt;p&gt;接下来是直播的输出设置：
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-05-02.DSVJjmOb_1sdfw0.webp&quot; alt=&quot;直播输出&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果直播和录制场景不分离，音轨就要选择上文提到的1号音轨；&lt;/li&gt;
&lt;li&gt;对于bilibili直播，选择&lt;code&gt;h.264&lt;/code&gt;编码格式，独显和集显的使用按需选择，默认用独显；&lt;/li&gt;
&lt;li&gt;音频编码器选择&lt;code&gt;AAC&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;比特率设置选择&lt;code&gt;CBR&lt;/code&gt;，码率&lt;code&gt;8000kbps&lt;/code&gt;起步，但其实已经够用，如果设置过高，主播需要更大的上行带宽来传输画面，观众也需要更高的下行带宽来下载画面，清晰度与流畅度的均衡，在超高码率情况下的性价比并不高。&lt;/li&gt;
&lt;li&gt;关键帧间隔，很多直播平台会要求&lt;code&gt;2s&lt;/code&gt;，这里的间隔时间越短，文件越大，但是后期剪辑越流畅，对于录制而言。&lt;/li&gt;
&lt;li&gt;预设：根据obs的显示，越高质量对于编码器的性能要求越高，但视频文件越小，如果直播时略感吃力，可以调低预设。&lt;/li&gt;
&lt;li&gt;调节：默认即可。&lt;/li&gt;
&lt;li&gt;多次编码：&lt;code&gt;二次编码1/4&lt;/code&gt;即可，均衡的选择。&lt;/li&gt;
&lt;li&gt;配置文件：默认用&lt;code&gt;high&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;B帧：数字越大，文件越小，但会影响质量，有的直播平台会要求&lt;code&gt;2&lt;/code&gt;，视频录制也可参考。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;额外小功能与插件&lt;/h1&gt;
&lt;h2&gt;虚拟摄像头&lt;/h2&gt;
&lt;p&gt;现在的OBS软件，已经内置了虚拟摄像头，以前是需要独立安装的，简单来说，就是将你的画布画面，作为摄像头采集的画面，输出给各种通话软件中，常见的就是腾讯会议。&lt;/p&gt;
&lt;p&gt;而OBS本身就可以添加“摄像头”源，这时虚拟摄像头就是个二级输出，你可以为你本身的摄像头添加额外图层，用于遮挡、背景替换、添加注释信息等，将这些集成了信息的摄像头画面，通过虚拟摄像头发送给会议。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-25-15.uPEKgKDc_Z1Dst6f.webp&quot; alt=&quot;共享屏幕&quot; /&gt;
腾讯会议的默认共享屏幕，只能单独程序的输出，如果全屏，会在展示者显示器上显示边框，影响体验，这时可以用OBS的外接源“虚拟摄像头”
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-27-23.DY1SCn04_jIBrI.webp&quot; alt=&quot;会议视频&quot; /&gt;
这里就可以设置“虚拟摄像头”了，可以看到背景已经是OBS里的壁纸画面了，但他被认为是“摄像头”捕捉的视频。&lt;/p&gt;
&lt;h2&gt;回放缓存（及时回放）&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-29-46.cbJJyHSI_1MecJ0.webp&quot; alt=&quot;回放缓存&quot; /&gt;
这里的回放缓存，是用的视频输出的设置，最大内存请依照时间和编码设置进行调整。&lt;/p&gt;
&lt;p&gt;这个回放缓存是可以完全做到NVIDIA的及时回放效果的，可以设置快捷键，也可以用插件实现同NVIDIA一样的通知提示。
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-32-02.mpIXFgo0_1Setq.webp&quot; alt=&quot;快捷键&quot; /&gt;
需要注意的是，启用回放缓存后，才能保存回放。这是当然的，挺废话的，但是我就经常在打游戏前忘记开启回放缓存，哈哈😄。&lt;/p&gt;
&lt;h2&gt;notifier插件&lt;/h2&gt;
&lt;p&gt;一款OBS指令操作提示的软件，基于WebSocket，&lt;a href=&quot;https://github.com/DmitriySalnikov/OBSNotifier/tree/1.3.4&quot;&gt;仓库地址&lt;/a&gt;
下载完成后，在OBS的WebSocket服务器处，获取地址和密码：
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-43-21.BVVWVM93_1jSDyK.webp&quot; alt=&quot;websocket&quot; /&gt;
在工具-&amp;gt;WebSocket中，打开服务器，勾选身份认证，生成密码，点击“显示连接信息”复制密码。&lt;/p&gt;
&lt;p&gt;启动&lt;code&gt;OBS Notifier&lt;/code&gt;，如图所示填写地址：
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-09-23_22-46-04.C9D9Vesw_Z108ueS.webp&quot; alt=&quot;notifier&quot; /&gt;
随后点击开始连接，可在obs处查看连接是否成功。&lt;/p&gt;
&lt;p&gt;点击“从OBS开始”勾选“退出OBS退出程序”，就可以和OBS同步了，将其融为一体。&lt;/p&gt;
&lt;p&gt;在通知样式中选择“Nvidia样式”，就可以得到和NVIDIA一模一样的通知风格了，并且它是显示在显示器上的，理论上不会被任何全屏应用覆盖。&lt;/p&gt;
&lt;p&gt;虽然这样做到了和NVIDIA一模一样的及时回放效果，但OBS程序只要启用，他就会占用一部分的GPU性能，而NVIDIA录制几乎是没有性能损失的，所以并不是能够替代NVIDIA的及时回放，但他拥有高度自定义录制，这是一项独特的优势，不同的应用场景应有不同的取舍。&lt;/p&gt;
</content:encoded></item><item><title>略知Zerotier | 搭建虚拟局域网</title><link>https://blog.srprolin.top/posts/zerotier-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/zerotier-1/</guid><description>简要介绍网络知识，拆解zerotier工作逻辑，为自建中转节点服务器、节点控制器提供教程</description><pubDate>Fri, 18 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;使用场景与前言&lt;/h1&gt;
&lt;p&gt;构建虚拟局域网，主要是为了&lt;strong&gt;内网&lt;/strong&gt;之间的设备互相访问。
在一般的家庭网络中，设备联网会经过同一个路由转发，此时的设备就在同一局域网中。举个例子，如果连接了同一个 WIFI，那么就可以在 Minecraft 多人游戏中自动显示&lt;strong&gt;局域网世界&lt;/strong&gt;了。
搭建虚拟局域网，一般是为了异地组网，而又没有&lt;strong&gt;公网 IP&lt;/strong&gt;的情况。
简单来说，拥有&lt;strong&gt;公网 IP&lt;/strong&gt;的设备，可以被任何设备通过 IP 地址找到。
&lt;strong&gt;公网 IP&lt;/strong&gt;又分为&lt;strong&gt;IPv4&lt;/strong&gt;和&lt;strong&gt;IPv6&lt;/strong&gt;。其中&lt;strong&gt;IPv4&lt;/strong&gt;目前已经耗尽，其地址数量只有 2³² 个，地址格式为 32 位二进制，分为 4 组显示为点分十进制，例如：&lt;code&gt;192.168.1.1&lt;/code&gt;；&lt;strong&gt;IPv6&lt;/strong&gt;地址数量有 2¹²⁸，几乎趋近无限，地址格式为 128 位二进制，分为 8 组，显示为冒分十六进制，例如：&lt;code&gt;2001:0db8:85a3:0000:0000:8a2e:0370:7334&lt;/code&gt;。
从安全性、路由效率和使用配置上，目前&lt;strong&gt;IPv6&lt;/strong&gt;都比&lt;strong&gt;IPv4&lt;/strong&gt;更具优势。
如果你拥有&lt;strong&gt;公网 IP&lt;/strong&gt;，且安全性要求不是太大，组建虚拟局域网会显得多余。
但是虚拟局域网之间的设备是可以互相访问的，而在公网中，设备只能访问拥有&lt;strong&gt;公网 IP&lt;/strong&gt;的设备。
举个例子，你在个人 PC 上的 25565 端口部署了一个服务，可以是一个 Minecraft 服务器，此时用你的这台 PC 访问该服务器，地址为&lt;code&gt;192.168.1.1:25565&lt;/code&gt;或&lt;code&gt;localhost:25565&lt;/code&gt;或&lt;code&gt;127.0.0.1:25565&lt;/code&gt;，这三种都可以理解为本地地址，如果你的小伙伴想要进入这个服务器，显然这三种地址都不可行。如果你拥有公网 IP，那么他们的访问地址为&lt;code&gt;(公网IP):25565&lt;/code&gt;；如果你搭建了虚拟局域网，那么访问地址为&lt;code&gt;(虚拟局域网IP):25565&lt;/code&gt;。&lt;/p&gt;
&lt;h1&gt;Zerotier 的基本框架&lt;/h1&gt;
&lt;p&gt;首先，zerotier 由三部分组成：&lt;strong&gt;节点&lt;/strong&gt;、&lt;strong&gt;根服务器&lt;/strong&gt;、&lt;strong&gt;节点网络控制器&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点：我们安装 zerotier 的设备，都会被分配一个十位 ID，此时我们的设备就是 zerotier 中的节点。&lt;/li&gt;
&lt;li&gt;根服务器：zerotier 官方的根服务器叫做 planet，节点的 ID 是由根服务器分配的，在整个框架中起到中转桥梁作用。&lt;/li&gt;
&lt;li&gt;节点网络控制器：用于创建网络，让各个节点设备通过 planet 加入到该网络，对各个节点进行授权，使得各个节点之间互相访问。授权过后，各个节点会得到该网络的 ID 标识被被分配的虚拟 IP 地址。
zerotier 官方提供的控制器是与 planet 根服务器直连的，如果控制器创建了一个网络，那么 planet 也会得到该网络的 ID 标识，并得到节点被分配的虚拟 IP 地址。
节点之间的首次连接，也是需要 planet 来做中间人，找到对应设备，并尝试加密直连。如果无法直连，流量则会经过 planet 来中转。&lt;/li&gt;
&lt;li&gt;在安装 zerotier 后，UI 中体现的节点 ID (该 ID 可以进行更改)：
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-18_10-40-35.BG7dguTk_Z1nqmnW.webp&quot; alt=&quot;节点ID&quot; /&gt;&lt;/li&gt;
&lt;li&gt;访问官方提供的&lt;a href=&quot;https://my.zerotier.com/&quot;&gt;节点网络控制器&lt;/a&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-18_10-46-46.BY--Uz5D_Z16kEGG.webp&quot; alt=&quot;节点网络控制器&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Zerotier 的下载与使用&lt;/h1&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;我们使用的工具是 &lt;strong&gt;&lt;em&gt;ZeroTier&lt;/em&gt;&lt;/strong&gt; 一个专门用来建立点对点虚拟专用网(&lt;strong&gt;&lt;em&gt;P2P VPN&lt;/em&gt;&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;以 &lt;strong&gt;&lt;em&gt;Windows&lt;/em&gt;&lt;/strong&gt; 系统为例&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;下载地址：https://www.zerotier.com/&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-9.7ZCRXSG3_Z10COJ5.webp&quot; alt=&quot;屏幕截图 2024-06-22 105811&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击 &lt;em&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-10.Bi4XKbwy_Z1e8tCS.webp&quot; alt=&quot;屏幕截图 2024-06-22 105945&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一般情况下直接点击 &lt;em&gt;&lt;strong&gt;MSI Installer (x86/x64)&lt;/strong&gt;&lt;/em&gt; 下载完成如图&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-11.D2LzVjIW_Z21SeBR.webp&quot; alt=&quot;屏幕截图 2024-06-22 110219&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装前请把 &lt;em&gt;&lt;strong&gt;杀毒软件&lt;/strong&gt;&lt;/em&gt; 全部关闭，尽量不要出现被拦截的情况。&lt;/li&gt;
&lt;li&gt;双击进行安装后，在右下角 &lt;em&gt;&lt;strong&gt;托盘&lt;/strong&gt;&lt;/em&gt; 处，你会看到如图图标。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-12.CmWCG5G5_xT1DI.webp&quot; alt=&quot;屏幕截图 2024-06-22 111326&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;回到 &lt;strong&gt;&lt;em&gt;ZeroTier&lt;/em&gt;&lt;/strong&gt; 官网：https://www.zerotier.com/&lt;/li&gt;
&lt;li&gt;选择 &lt;strong&gt;&lt;em&gt;Sign Up&lt;/em&gt;&lt;/strong&gt; 注册一个账号，然后 &lt;strong&gt;&lt;em&gt;Log In&lt;/em&gt;&lt;/strong&gt; 登录&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-13.Bp0fVnB8_Z56pqP.webp&quot; alt=&quot;屏幕截图 2024-06-22 111740(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Create A Network&lt;/em&gt;&lt;/strong&gt;，点击进一个 &lt;strong&gt;&lt;em&gt;Network&lt;/em&gt;&lt;/strong&gt; 中&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-14.CH325Pfx_1Mm5pc.webp&quot; alt=&quot;屏幕截图 2024-06-22 112057(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;复制 &lt;strong&gt;&lt;em&gt;Network ID&lt;/em&gt;&lt;/strong&gt; 给你的朋友&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-15.Dgx8oxRP_ZzH0Qv.webp&quot; alt=&quot;屏幕截图 2024-06-22 112220&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;等待朋友发来请求，下拉找到请求，&lt;strong&gt;&lt;em&gt;勾选&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-16.Jb_3pcTl_Z1OAqNl.webp&quot; alt=&quot;屏幕截图 2024-06-22 112819&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击托盘图标，点击 &lt;strong&gt;&lt;em&gt;Join New Network&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-17.COcqQyvN_IQOtC.webp&quot; alt=&quot;屏幕截图 2024-06-22 112349(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将代码输入，点击 &lt;strong&gt;&lt;em&gt;Join&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-18.BO_rhX9G_1sDihd.webp&quot; alt=&quot;屏幕截图 2024-06-22 112555&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;等待创建者同意加入网络&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-19.CjrAAnbD_Z13Dpac.webp&quot; alt=&quot;屏幕截图 2024-06-22 112920(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;Zerotier 的自托管服务&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;详细内容，请参考&lt;a href=&quot;https://docs.zerotier.com/selfhost/&quot;&gt;官方文档&lt;/a&gt;
zerotier 提供的自托管服务有&lt;strong&gt;节点网络控制器&lt;/strong&gt;和&lt;strong&gt;根服务器&lt;/strong&gt;
首先，&lt;strong&gt;节点网络控制器&lt;/strong&gt;自建，主要是为了安全性和突破节点设备限制。
而&lt;strong&gt;根服务器&lt;/strong&gt;自建，这里主要是自建&lt;strong&gt;moon 根服务器&lt;/strong&gt;，而非&lt;strong&gt;planet&lt;/strong&gt;。
简单地说，任意一个节点他都可以充当&lt;strong&gt;节点网络控制器&lt;/strong&gt;，只不过官方没有提供 webUI，需要部署第三方的。而&lt;strong&gt;moon 根服务器&lt;/strong&gt;本质上是&lt;strong&gt;根服务器&lt;/strong&gt;，作用与&lt;strong&gt;planet&lt;/strong&gt;是相同的，主要因为&lt;strong&gt;planet&lt;/strong&gt;是部署在国外的，高标识的大流量经过会遭到长城防火墙的拦截，导致连接失败，因此&lt;strong&gt;planet&lt;/strong&gt;如果作为中转流量的服务器，在 IPv4 环境下，基本不太行得通，这时候就需要搭建在国内的&lt;strong&gt;moon&lt;/strong&gt;做中转了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;moon 根服务器&lt;/strong&gt;：(每个节点需要手动加入 moon 服务器)作为根服务器，基础作用就是用来识别节点 ID，并让节点设备之间互相建立连接的。但由于虚拟局域网的 IP 地址是由节点网络控制器授权后发放的，如果节点不能与 planet 进行连接，自然也无法通过 planet 来连接到官方的节点网络控制器，进而节点之间无法正常连接，moon 服务器的作用也被抹除。这时就需要自建节点网络控制器，并加入 moon 根服务器，通过自建的节点网络控制器来为节点分配虚拟 IP。至此，会发现这就相当于自建了一整个 zerotier，只不过 moon 服务器是需要手动加入的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;moon 根服务器的建立与加入&lt;/h2&gt;
&lt;p&gt;首先，自建 moon 服务器，需要一台拥有公网 IP 的设备，这里推荐用 Linux 云服务器，以此为例。具体教程查看&lt;a href=&quot;https://docs.zerotier.com/roots/&quot;&gt;官方文档&lt;/a&gt;。
与云服务器建立 ssh 连接后，简要操作步骤如下： 0. 前往云服务器厂商的管理后台，开放服务器的 9993UDP 端口，以便 zerotier 服务正常运行。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;执行&lt;code&gt;curl -s https://install.zerotier.com | sudo bash&lt;/code&gt;或者&lt;code&gt;sudo apt-get install zerotier-one&lt;/code&gt;命令，安装 zerotier。此时在命令窗里会显示当前设备的节点 ID。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;cd /var/lib/zerotier-one&lt;/code&gt;进入 zerotier 的配置文件夹&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;zerotier-idtool initmoon identity.public &amp;gt;&amp;gt;moon.json&lt;/code&gt;命令，导出 moon 配置文件。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;nano moon.json&lt;/code&gt;命令，使用 nano 编辑器编辑配置文件。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;{
      &quot;id&quot;: &quot;deadbeef00&quot;,
      &quot;objtype&quot;: &quot;world&quot;,
      &quot;roots&quot;: [
        {
          &quot;identity&quot;: &quot;deadbeef00:0:34031483094...&quot;,
          &quot;stableEndpoints&quot;: [&quot;10.0.0.2/9993&quot;,&quot;2001:abcd:abcd::1/9993&quot;]
        }
      ],
      &quot;signingKey&quot;: &quot;b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0&quot;,
      &quot;signingKey_SECRET&quot;: &quot;ffc5dd0b2baf1c9b220d1c9cb39633f9e2151cf350a6d0e67c913f8952bafaf3671d2226388e1406e7670dc645851bf7d3643da701fd4599fedb9914c3918db3&quot;,
      &quot;updatesMustBeSignedBy&quot;: &quot;b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0&quot;,
      &quot;worldType&quot;: &quot;moon&quot;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;在上述配置样例中，ID 应显示为你被分配的节点 ID；主要修改&lt;strong&gt;stableEndpoints&lt;/strong&gt;里的内容，更改 IP 为该服务器的公网 IP，如果有 IPv6，可如实更改，没有则不填写，把它删掉。按照样例，没有的 IPv6 情况为&lt;code&gt;&quot;stableEndpoints&quot;: [&quot;公网IP/9993&quot;]&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nano 编辑器&lt;/strong&gt;的使用注意：完成编辑后，&lt;code&gt;ctrl+x&lt;/code&gt;退出编辑器，命令窗提示是否保存，&lt;code&gt;Y&lt;/code&gt;确定，最后&lt;code&gt;Enter&lt;/code&gt;回车键，返回命令行。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;执行&lt;code&gt;zerotier-idtool genmoon moon.json&lt;/code&gt;命令，生成&lt;code&gt;000000deadbeef00.moon&lt;/code&gt;文件，其中&lt;strong&gt;deadbeef00&lt;/strong&gt;应为你的服务器被分配的节点 ID。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;mkdir /var/lib/zerotier-one/moons.d&lt;/code&gt;在配置文件夹下创建&lt;code&gt;moons.d&lt;/code&gt;文件夹，用于保存 moon 文件。此后执行&lt;code&gt;cp 000000deadbeef00.moon ./moons.d/&lt;/code&gt;将生成的 moon 文件保存于&lt;code&gt;moods.d&lt;/code&gt;文件夹下。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;systemctl restart zerotier-one&lt;/code&gt;重启 zerotier 服务，至此，moon 服务器创建完成。&lt;/li&gt;
&lt;li&gt;通过命令行加入 moon 服务器：在另一台想要加入 moon 服务器的设备上，执行&lt;code&gt;zerotier-cli orbit deadbeef00 deadbeef00&lt;/code&gt;,其中&lt;strong&gt;deadbeef00&lt;/strong&gt;应为 moon 服务器的节点 ID，此处仅为样例。然后执行&lt;code&gt;systemctl restart zerotier-one.service&lt;/code&gt;重启 zerotier 服务，&lt;/li&gt;
&lt;li&gt;通过 moon 文件计入 moon 服务器：将 moon 服务器产生的&lt;code&gt;000000deadbeef00.moon&lt;/code&gt;文件 copy 到对应系统的配置文件夹中。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Linux:&lt;code&gt;/var/lib/zerotier-one/moons.d/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Windows:&lt;code&gt;C:\ProgramData\ZeroTier\One\moons.d\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;MacOS:&lt;code&gt;/Library/Application Support/ZeroTier/One/zerotier-one/moons.d/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;通过 ztncui 自建节点网络控制器&lt;/h2&gt;
&lt;p&gt;详细教程参考&lt;a href=&quot;https://key-networks.com/ztncui/#installation&quot;&gt;官方文档&lt;/a&gt;
此处以 Ubuntu 系统为例进行安装。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;执行&lt;code&gt;curl -O https://s3-us-west-1.amazonaws.com/key-networks/deb/ztncui/1/x86_64/ztncui_0.8.14_amd64.deb&lt;/code&gt;命令，从 AWS S3 存储桶下载 ZTNCUI 0.8.14 版本的.deb 安装包。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;apt install ./ztncui_0.8.14_amd64.deb&lt;/code&gt;命令，使用 apt 包管理器安装下载的 ZTNCUI 包。&lt;/li&gt;
&lt;li&gt;在云服务器厂商处开放 3443TCP 端口。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;sh -c &quot;echo ZT_TOKEN=`sudo cat /var/lib/zerotier-one/authtoken.secret` &amp;gt; /opt/key-networks/ztncui/.env&quot;&lt;/code&gt;命令，将 ZeroTier 的认证令牌写入 ZTNCUI 的环境配置文件。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;sh -c &quot;echo HTTPS_PORT=3443 &amp;gt;&amp;gt; /opt/key-networks/ztncui/.env&quot;&lt;/code&gt;命令，配置 ZTNCUI 监听 HTTPS 的端口为 3443。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;sh -c &quot;echo NODE_ENV=production &amp;gt;&amp;gt; /opt/key-networks/ztncui/.env&quot;&lt;/code&gt;命令，设置 Node.js 应用为生产环境，优化性能和安全性。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;chmod 400 /opt/key-networks/ztncui/.env&lt;/code&gt;命令，限制.env 文件仅所有者可读（防止敏感信息泄露）。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;chown ztncui.ztncui /opt/key-networks/ztncui/.env&lt;/code&gt;命令，将文件所有权交给 ztncui 用户和组。&lt;/li&gt;
&lt;li&gt;执行&lt;code&gt;systemctl enable ztncui&lt;/code&gt;和&lt;code&gt;systemctl restart ztncui&lt;/code&gt;命令，设置开机自启动并重启 ZTNCUI 服务，使新配置生效。&lt;/li&gt;
&lt;li&gt;通过&lt;code&gt;https://公网IP:3443&lt;/code&gt;地址访问 ztncui 服务，可自行配置 SSL 证书。使用默认账号密码登录，即&lt;code&gt;admin/password&lt;/code&gt;，然后重新设置密码。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-19_00-44-50.-iMJ41c1_1WSX7w.webp&quot; alt=&quot;ztncui首次登录&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击&lt;strong&gt;Add network&lt;/strong&gt;创建一个网络，再回到&lt;strong&gt;Networks&lt;/strong&gt;，点击&lt;strong&gt;Easy setup&lt;/strong&gt;进行虚拟网段分配，随后的使用便与官方的节点网络控制器相同了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/PixPin_2025-07-19_01-01-24.BrFkZ-2G_Z6FlAl.webp&quot; alt=&quot;ztncui初始化&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;ztncui 面板的安全访问方式&lt;/h2&gt;
&lt;p&gt;最简单的方式是为面板访问添加 SSL 证书。
而还有一种方法，能将面板完全与外网隔离，简单来说是将面板完全局限在自己创建的虚拟局域网里，具体方法如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先&lt;code&gt;zerotier-cli join 网络ID&lt;/code&gt;加入 ztncui 创建的网络中，此时后台会为该设备分配虚拟网络 IP，我们就可以通过该 IP 和端口号访问面板。&lt;/li&gt;
&lt;li&gt;然后将自己的可信任设备也加入这个网络，并授权。&lt;/li&gt;
&lt;li&gt;随后在云服务器厂商处关闭 ztncui 服务的端口号 3000 和 3443，此后在外网中，便无论如何也无法访问该面板。只有 ztncui 网络中的可信任设备可以通过服务器被分配的虚拟 IP 和端口号来访问面板。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;zerotier 常用指令&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查看节点 ID：&lt;code&gt;zerotier-cli info&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;加入网络：&lt;code&gt;zerotier-cli join 网络ID&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;离开网络: &lt;code&gt;zerotier-cli leave 网络ID&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网络状态: &lt;code&gt;zerotier-cli listnetworks&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看节点状态: &lt;code&gt;zerotier-cli listpeers&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;连接 moon: &lt;code&gt;zerotier-cli orbit Moon节点ID Moon节点ID&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;退出 moon: &lt;code&gt;zerotier-cli deorbit Moon节点ID&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows 重启 zerotier：&lt;code&gt;net stop zerotier-one &amp;amp;&amp;amp; net start zerotier-one&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;显示 moon 信息：&lt;code&gt;zerotier-cli listmoons&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>如何投屏和串流？</title><link>https://blog.srprolin.top/posts/sunmoon-scrcpy/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/sunmoon-scrcpy/</guid><description>本篇文章介绍了有关串流的流行应用——Sunshine和Moonlight组合的用法；并推荐开源项目scrcpy的投屏功能。</description><pubDate>Thu, 25 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;串流&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;影音串流技术是一种线上即时影音播放技术，有别于传统的 MPEG 或 MP3 等影音播放方式，应用串流(streaming)技术传送多媒体的特点，在于可以边看边下载，大幅节省使用者等待的时间。
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;方案：&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Sunshine&lt;/em&gt;&lt;/strong&gt;+&lt;strong&gt;&lt;em&gt;Moonlight&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;注：默认 &lt;strong&gt;&lt;em&gt;内网&lt;/em&gt;&lt;/strong&gt; 条件下使用，没有内网条件的可以通过内网穿透，创造条件，比如 &lt;strong&gt;&lt;em&gt;zerotier&lt;/em&gt;&lt;/strong&gt; 的 P2P 连接，&lt;strong&gt;&lt;em&gt;Sakura&lt;/em&gt;&lt;/strong&gt; 的 frp 反向代理
如果有 &lt;strong&gt;&lt;em&gt;IPv4 或 IPv6&lt;/em&gt;&lt;/strong&gt; ，那就直接在 &lt;strong&gt;&lt;em&gt;外网&lt;/em&gt;&lt;/strong&gt; 条件下使用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;&lt;em&gt;Sunshine&lt;/em&gt;&lt;/strong&gt;+&lt;strong&gt;&lt;em&gt;Moonlight&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Sunshine&lt;/em&gt;&lt;/strong&gt; 可以简单理解为 PC 的信息流发射端，也就是将视频和音频信息打包，准备发送。
下载地址：https://github.com/LizardByte/Sunshine/releases&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-36-40.webp&quot; alt=&quot;Sunshine&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载后在右下角托盘处，选择 &lt;strong&gt;&lt;em&gt;open sunshine&lt;/em&gt;&lt;/strong&gt; 打开 web 端，注册一个账户，随后登录。&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;&lt;em&gt;configuration&lt;/em&gt;&lt;/strong&gt; 的 &lt;strong&gt;&lt;em&gt;General&lt;/em&gt;&lt;/strong&gt; 里改为简体中文，&lt;strong&gt;&lt;em&gt;save&lt;/em&gt;&lt;/strong&gt;-&amp;gt;&lt;strong&gt;&lt;em&gt;apply&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-38-31.webp&quot; alt=&quot;config1&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;strong&gt;&lt;em&gt;配置&lt;/em&gt;&lt;/strong&gt; 里的 &lt;strong&gt;&lt;em&gt;Network&lt;/em&gt;&lt;/strong&gt; 里，将 &lt;strong&gt;&lt;em&gt;UPnP 开启&lt;/em&gt;&lt;/strong&gt;，&lt;strong&gt;&lt;em&gt;开启 IPv4+IPv6&lt;/em&gt;&lt;/strong&gt; ，记得保存应用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-40-02.webp&quot; alt=&quot;config3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最后保证 &lt;strong&gt;&lt;em&gt;sunshine&lt;/em&gt;&lt;/strong&gt; 在 &lt;strong&gt;&lt;em&gt;Windows 的防火墙&lt;/em&gt;&lt;/strong&gt; 保护范围外，或者 &lt;strong&gt;&lt;em&gt;关闭防火墙&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Moonlight&lt;/em&gt;&lt;/strong&gt; 即串流的接收端，负责接收数据流，并将操作信息再回馈给主机。
下载地址：
&lt;ul&gt;
&lt;li&gt;安卓：https://github.com/moonlight-stream/moonlight-android/releases&lt;/li&gt;
&lt;li&gt;PC：https://github.com/moonlight-stream/moonlight-qt/releases&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;strong&gt;&lt;em&gt;assert&lt;/em&gt;&lt;/strong&gt; 下找到对应版本的安装包后下载，随后只需要保证在同一个 &lt;strong&gt;&lt;em&gt;内网环境&lt;/em&gt;&lt;/strong&gt; 下，同时 &lt;strong&gt;&lt;em&gt;sunshine&lt;/em&gt;&lt;/strong&gt; 处于运行状态，&lt;strong&gt;&lt;em&gt;moonlight&lt;/em&gt;&lt;/strong&gt; 可自动检测，检测不到可以 &lt;strong&gt;&lt;em&gt;手动输入 ip&lt;/em&gt;&lt;/strong&gt; 连接。( &lt;strong&gt;&lt;em&gt;ip 查询&lt;/em&gt;&lt;/strong&gt; 详见 &lt;strong&gt;&lt;em&gt;zerotier&lt;/em&gt;&lt;/strong&gt; 篇：https://rolinshmily.github.io/post/Minecraft-xia-zai-%26Zerotier-ju-yu-wang-lian-ji.html)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;strong&gt;&lt;em&gt;moonlight&lt;/em&gt;&lt;/strong&gt; 端发送连接请求后，会要求 &lt;strong&gt;&lt;em&gt;sunshine&lt;/em&gt;&lt;/strong&gt; 端输入对应 &lt;strong&gt;&lt;em&gt;pin 码&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-45-24.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-47-29.webp&quot; alt=&quot;pin&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-49-15.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;投屏&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;一般应用于 &lt;strong&gt;&lt;em&gt;PC 操作安卓手机&lt;/em&gt;&lt;/strong&gt; 或者 &lt;strong&gt;&lt;em&gt;直播安卓手机游戏&lt;/em&gt;&lt;/strong&gt; 时&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;scrcpy 程序&lt;/em&gt;&lt;/strong&gt; 下载地址：https://github.com/Genymobile/scrcpy/releases&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;在第一次进行投屏时，请使用数据线连接手机与 pc，并打开手机的 &lt;strong&gt;&lt;em&gt;usb 调试&lt;/em&gt;&lt;/strong&gt; 功能
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;USB 调试&lt;/em&gt;&lt;/strong&gt; 一般在 &lt;strong&gt;&lt;em&gt;开发者选项&lt;/em&gt;&lt;/strong&gt; 中，需要在 &lt;strong&gt;&lt;em&gt;设置&lt;/em&gt;&lt;/strong&gt; 里找到 &lt;strong&gt;&lt;em&gt;关于手机&lt;/em&gt;&lt;/strong&gt; -&amp;gt; &lt;strong&gt;&lt;em&gt;版本信息&lt;/em&gt;&lt;/strong&gt; -&amp;gt; 多次点击 &lt;strong&gt;&lt;em&gt;软件版本&lt;/em&gt;&lt;/strong&gt; （出现提示 &lt;strong&gt;&lt;em&gt;处于开发者模式&lt;/em&gt;&lt;/strong&gt;）-&amp;gt; 回退到 &lt;strong&gt;&lt;em&gt;系统与升级&lt;/em&gt;&lt;/strong&gt; -&amp;gt; &lt;strong&gt;&lt;em&gt;开发者选项&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;运行程序文件，等待手机界面出现，如果不行，可以将手机的 usb 模式选择为 &lt;strong&gt;&lt;em&gt;管理文件&lt;/em&gt;&lt;/strong&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/RolinShmily/Images@main/PixPin_2025-04-19_10-57-41.webp&quot; alt=&quot;scrcpy&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;WiFi&lt;/em&gt;&lt;/strong&gt; 连接配置：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;保持有线连接状态，在程序根目录下运行 cmd&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入指令：&lt;code&gt;.\scrcpy.exe -d&lt;/code&gt; 运行后关闭手机界面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入指令：&lt;code&gt;.\scrcpy.exe --tcpip&lt;/code&gt; 此后，保证手机处于 PC 的 wifi 连接下，可拔掉数据线。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;在此 cmd 下输入&lt;code&gt;.\scrcpy.exe -h&lt;/code&gt;即可查看所有指令
&lt;strong&gt;&lt;em&gt;连接方式&lt;/em&gt;&lt;/strong&gt;：&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;如果使用 &lt;strong&gt;&lt;em&gt;有线连接&lt;/em&gt;&lt;/strong&gt;，则直接运行程序文件 &lt;strong&gt;&lt;em&gt;scrcpy.exe&lt;/em&gt;&lt;/strong&gt; 即可&lt;/li&gt;
&lt;li&gt;如果使用 &lt;strong&gt;&lt;em&gt;wifi 连接&lt;/em&gt;&lt;/strong&gt;，则可以在根目录下新建一个 &lt;strong&gt;&lt;em&gt;start.bat&lt;/em&gt;&lt;/strong&gt; 文件（可以先创建 &lt;strong&gt;&lt;em&gt;start.txt&lt;/em&gt;&lt;/strong&gt; 再将后缀名改为 &lt;strong&gt;&lt;em&gt;bat&lt;/em&gt;&lt;/strong&gt;），&lt;strong&gt;&lt;em&gt;编辑&lt;/em&gt;&lt;/strong&gt;，写入代码&lt;code&gt;.\scrcpy.exe -e&lt;/code&gt;保存，双击运行 &lt;strong&gt;&lt;em&gt;start.bat&lt;/em&gt;&lt;/strong&gt; 即可&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
</content:encoded></item><item><title>机器学习</title><link>https://blog.srprolin.top/posts/2026-03-02-machinelearning-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/2026-03-02-machinelearning-1/</guid><description>记录一次市图书馆看书所得。</description><pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;&lt;em&gt;&lt;strong&gt;第一章--内容框架与基本概念&lt;/strong&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;h3&gt;1. &lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的范围&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 属于 &lt;em&gt;&lt;strong&gt;AI人工智能&lt;/strong&gt;&lt;/em&gt; 的分支技术&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;深度学习&lt;/strong&gt;&lt;/em&gt; 又是 &lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的技术之一&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的目的与方法&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的目的在于发现大量数据中的一个 &lt;em&gt;&lt;strong&gt;模型&lt;/strong&gt;&lt;/em&gt; (也就是 &lt;em&gt;&lt;strong&gt;函数&lt;/strong&gt;&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;如果将 &lt;em&gt;&lt;strong&gt;机器学习中的模型&lt;/strong&gt;&lt;/em&gt; 类比成 &lt;em&gt;&lt;strong&gt;函数&lt;/strong&gt;&lt;/em&gt;, 那么 &lt;em&gt;&lt;strong&gt;特征 feature&lt;/strong&gt;&lt;/em&gt; 也就是 &lt;em&gt;&lt;strong&gt;自变量 x&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;标签 lable&lt;/strong&gt;&lt;/em&gt; 也就是 &lt;em&gt;&lt;strong&gt;因变量 y&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 是在已知 &lt;em&gt;&lt;strong&gt;数据集&lt;/strong&gt;&lt;/em&gt; 的基础上, 通过 &lt;em&gt;&lt;strong&gt;训练&lt;/strong&gt;&lt;/em&gt; 得到了 &lt;em&gt;&lt;strong&gt;特征&lt;/strong&gt;&lt;/em&gt; 与 &lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt; 之间的一个函数.&lt;/li&gt;
&lt;li&gt;将经过了 &lt;em&gt;&lt;strong&gt;训练&lt;/strong&gt;&lt;/em&gt; 的数据称为 &lt;em&gt;&lt;strong&gt;训练数据集&lt;/strong&gt;&lt;/em&gt; , 而另一组待推测的数据称为 &lt;em&gt;&lt;strong&gt;测试数据集&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的类别&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;根据数据是否有 &lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt; 来分类, 常见分为 &lt;em&gt;&lt;strong&gt;监督学习&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;无监督学习&lt;/strong&gt;&lt;/em&gt;, &lt;em&gt;&lt;strong&gt;半监督学习&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;监督学习&lt;/strong&gt;&lt;/em&gt; : 数据集都有 &lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;无监督学习&lt;/strong&gt;&lt;/em&gt; : 数据集都没有 &lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;半监督学习&lt;/strong&gt;&lt;/em&gt; : 数据集中只有少量 有 &lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. &lt;em&gt;&lt;strong&gt;深度学习&lt;/strong&gt;&lt;/em&gt; 基本概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;属于 &lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的分支, 因此最重要的区分点也就是 &lt;em&gt;&lt;strong&gt;模型&lt;/strong&gt;&lt;/em&gt;,
&lt;em&gt;&lt;strong&gt;深度学习&lt;/strong&gt;&lt;/em&gt; 使用的 &lt;em&gt;&lt;strong&gt;模型&lt;/strong&gt;&lt;/em&gt; 是 &lt;em&gt;&lt;strong&gt;神经网络&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;把层数较多、结构比较复杂的神经网络的机器学习技术叫做 &lt;em&gt;&lt;strong&gt;深度学习&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. &lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt; 的两大基本问题&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;回归问题&lt;/strong&gt;&lt;/em&gt; : 通常用来预测一个值, 其 &lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt; 值是 &lt;em&gt;&lt;strong&gt;连续&lt;/strong&gt;&lt;/em&gt; 的.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;分类问题&lt;/strong&gt;&lt;/em&gt; : 将事物标记为一个类别标签, 结果为 &lt;em&gt;&lt;strong&gt;离散&lt;/strong&gt;&lt;/em&gt; 值&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6. &lt;em&gt;&lt;strong&gt;基本机器学习术语&lt;/strong&gt;&lt;/em&gt;&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;术语&lt;/th&gt;
&lt;th&gt;定义&lt;/th&gt;
&lt;th&gt;数学描述&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;数据集&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;数据的集合&lt;/td&gt;
&lt;td&gt;${(x_1,y_1),\cdots,(x_n,y_n)}$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;样本&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;数据集中的一条具体记录&lt;/td&gt;
&lt;td&gt;$(x_1,y_1)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;特征&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;用于描述数据的输入变量&lt;/td&gt;
&lt;td&gt;${x_1,x_2,\cdots,x_n}$也是一个向量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;要预测的真实事物或结果, 也成为目标&lt;/td&gt;
&lt;td&gt;$y$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;有标签样本&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;有特征、标签，用于训练模型&lt;/td&gt;
&lt;td&gt;$(x,y)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;无标签样本&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;有特征，无标签&lt;/td&gt;
&lt;td&gt;$(x,?)$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;模型&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;将样本的特征映射到预测标签&lt;/td&gt;
&lt;td&gt;$f(x)$,其实也就是函数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;模型中的参数&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;模型中的参数确定了机器学习的具体模型&lt;/td&gt;
&lt;td&gt;$f(x)$这个函数的参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;模型的映射结果&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;通过模型映射出无标签样本的标签&lt;/td&gt;
&lt;td&gt;$y&apos;$&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;&lt;strong&gt;机器学习&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;通过学习样本数据，发现规律，得到模型的参数，从而得到能预测目标的模型&lt;/td&gt;
&lt;td&gt;确定$f(x)$和其参数的过程&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;特征&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;特征是有 &lt;em&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/em&gt; 的，特征的维度是指特征的数目，而非样本数目，也即 &lt;strong&gt;$(x_1,x_2,x_3)$&lt;/strong&gt; 称作一个样本，而它属于 &lt;em&gt;&lt;strong&gt;三维特征数据集&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;同时，避免混淆，将向量、数组、矩阵中的维度统称为 &lt;em&gt;&lt;strong&gt;阶&lt;/strong&gt;&lt;/em&gt;，例如 &lt;em&gt;&lt;strong&gt;1D向量&lt;/strong&gt;&lt;/em&gt;、&lt;em&gt;&lt;strong&gt;2D矩阵&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;标签&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;有的数据样本有标签，而有的则没有，靠机器推断出来的标签，称作 &lt;em&gt;&lt;strong&gt;预测标签$y&apos;$&lt;/strong&gt;&lt;/em&gt;，比较$y$和$y&apos;$的差异，也就是在评判机器学习模型的效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;模型&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;机器学习中，在处理问题时，先确定模型的类型，也就是算法，再确定模型的参数，进而确定最终的模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;7. &lt;em&gt;&lt;strong&gt;机器学习和深度学习框架&lt;/strong&gt;&lt;/em&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;8个常用库，3大类: &lt;em&gt;&lt;strong&gt;Pandas&lt;/strong&gt;&lt;/em&gt; 和 &lt;em&gt;&lt;strong&gt;Numpy&lt;/strong&gt;&lt;/em&gt; 提供数据结构，支持数学运算；&lt;em&gt;&lt;strong&gt;Matplotlib&lt;/strong&gt;&lt;/em&gt; 和 &lt;em&gt;&lt;strong&gt;Seaborn&lt;/strong&gt;&lt;/em&gt; 用于数据可视化；剩余4个库提供算法，其中 &lt;em&gt;&lt;strong&gt;Scikit-learn&lt;/strong&gt;&lt;/em&gt; 是机器学习框架，&lt;em&gt;&lt;strong&gt;TesnsorFlow&lt;/strong&gt;&lt;/em&gt;、&lt;em&gt;&lt;strong&gt;Keras&lt;/strong&gt;&lt;/em&gt; 和 &lt;em&gt;&lt;strong&gt;Pytorch&lt;/strong&gt;&lt;/em&gt; 则是深度学习框架。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Pandas&lt;/strong&gt;&lt;/em&gt; 预置数据结构：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Series ：1D数组，与 Numpy 中的一维数组 (array) 类似。这两者与 Python 基本数据结构列表 (list) 也很相似。&lt;/li&gt;
&lt;li&gt;TimeSeries ：以时间为索引的Series&lt;/li&gt;
&lt;li&gt;DataFrame ：2D的表格型数据结构，Series的容器&lt;/li&gt;
&lt;li&gt;Panel ：3D的数组，DataFrame 的容器&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Numpy&lt;/strong&gt;&lt;/em&gt; ：Python的数学拓展包，提供强大的多维数组对象array，提供大量API支持数组运算。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Matplotlib&lt;/strong&gt;&lt;/em&gt; ：Python与Numpy的可视化操作界面，通过API像应用程序提供嵌入式绘图功能。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Seaborn&lt;/strong&gt;&lt;/em&gt; ：再Matplotlib基础上设计出的绘图库&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Scikit-learn&lt;/strong&gt;&lt;/em&gt; ：包含大量可以直接使用的机器学习算法。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;TensorFlow&lt;/strong&gt;&lt;/em&gt; ：编程建立在“图”的概念之上，比较难快速上手。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Keras&lt;/strong&gt;&lt;/em&gt; ：建立在TensorFlow等后端框架之上，也就是Keras更“高级”，也即“简单”，本质上还是调用了TensorFlow。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Pytorch&lt;/strong&gt;&lt;/em&gt; ：是TensorFlow的竞争对手，相对来说上手更简单。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;8. &lt;em&gt;&lt;strong&gt;机器学习项目实战架构&lt;/strong&gt;&lt;/em&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;大致分为5个环节：（1）问题定义 （2）数据的收集和预处理 （3）模型算法的选择 （4）选择机器学习模型 （5）超参数调式和性能优化&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Python与Pytorch的环境搭建</title><link>https://blog.srprolin.top/posts/python-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/python-1/</guid><description>本文目标为PyTorch搭建环境，其中用到Anaconda的python编译器，配置了VSCode的python环境，并启用Cuda相关单元</description><pubDate>Thu, 18 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;！！⚠️Attention⚠️！！&lt;/h1&gt;
&lt;p&gt;文章已重写至&lt;a href=&quot;https://blog.srprolin.top/posts/pytorch-2/&quot;&gt;【重置版】在Windows系统中安装深度学习框架Pytorch与TensorFlow &lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;&lt;em&gt;&lt;strong&gt;使用VScode搭建Python与Pytorch环境&lt;/strong&gt;&lt;/em&gt;&lt;/h1&gt;
&lt;h2&gt;1.&lt;em&gt;&lt;strong&gt;Anaconda&lt;/strong&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Anaconda&lt;/strong&gt;&lt;/em&gt; 是一个开源的Python发行版本，其包含了conda、Python等180多个科学包及其依赖项。(详见百科)&lt;/li&gt;
&lt;li&gt;总之，当你安装了Anaconda，就不用去Python官网下载解释器了，因为Anaconda内置有Python解释器。&lt;/li&gt;
&lt;li&gt;当然了，为确保Anaconda完美安装，请务必将电脑中的Python卸载干净。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Anaconda官网下载地址&lt;/strong&gt;&lt;/em&gt;：https://www.anaconda.com/download/success&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-1.DHbVzM01_1Kh8Oi.webp&quot; alt=&quot;Anaconda下载官网&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/20250331210416.CrLevMXv_inaWA.webp&quot; alt=&quot;Anaconda下载选项&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安装完成后再配置一下 &lt;em&gt;&lt;strong&gt;帐户环境变量&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-2.2Er2Yo0D_2diyxS.webp&quot; alt=&quot;环境变量&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2.&lt;em&gt;&lt;strong&gt;Cuda&lt;/strong&gt;&lt;/em&gt; (需要Nvidia显卡)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CUDA（Compute Unified Device Architecture）&lt;/strong&gt;，是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构，该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构（ISA）以及GPU内部的并行计算引擎。(详见百科)&lt;/li&gt;
&lt;li&gt;下载地址：https://developer.nvidia.com/cuda-toolkit-archive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-3.LQ8DLGYU_23KKiJ.webp&quot; alt=&quot;Cuda下载界面&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/20250331215018.BMbz3Btd_1nrFNI.webp&quot; alt=&quot;Cuda下载选项&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;之后双击打开，一路点击下一步等待安装完成即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3.&lt;em&gt;&lt;strong&gt;cuDNN&lt;/strong&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;NVIDIA cuDNN&lt;/strong&gt;是用于深度神经网络的GPU加速库。它强调性能、易用性和低内存开销。NVIDIA cuDNN可以集成到更高级别的机器学习框架中，如谷歌的Tensorflow、加州大学伯克利分校的流行caffe软件。简单的插入式设计可以让开发人员专注于设计和实现神经网络模型，而不是简单调整性能，同时还可以在GPU上实现高性能现代并行计算。&lt;/li&gt;
&lt;li&gt;下载地址：https://developer.nvidia.com/cudnn-downloads&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-4.DQwqUE2o_Z1uY24c.webp&quot; alt=&quot;cuDNN&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;4.&lt;em&gt;&lt;strong&gt;Pytorch&lt;/strong&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;PyTorch&lt;/strong&gt;&lt;/em&gt; 是一个开源的Python机器学习库，基于Torch库，底层由C++实现，应用于人工智能领域，如计算机视觉和自然语言处理。(详见百科)&lt;/li&gt;
&lt;li&gt;下载地址：https://pytorch.org/get-started/locally/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/20250331215204.CD7biDwe_Zo0Y6N.webp&quot; alt=&quot;Pytorch下载页面&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Cuda&lt;/strong&gt;&lt;/em&gt; 根据安装版本来选择，可以向下兼容。&lt;/li&gt;
&lt;li&gt;复制给出的下载指令，例如这里给出的是：&lt;/li&gt;
&lt;li&gt;pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121&lt;/li&gt;
&lt;li&gt;接下来在Windows搜索栏搜索 &lt;em&gt;&lt;strong&gt;Anaconda Prompt&lt;/strong&gt;&lt;/em&gt; 打开后将给出的下载指令输入进去。(此时的Pytorch就安装在了整个系统大环境下)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-5.Cyzn-4-1_ZeiGXo.webp&quot; alt=&quot;Anaconda Prompt&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-6.CAThN5OY_1A1Sft.webp&quot; alt=&quot;Anaconda Prompt&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;5.&lt;em&gt;&lt;strong&gt;VScode相关设置&lt;/strong&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;h3&gt;1. 安装python拓展：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;打开VScode拓展，搜索python，安装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-7.xFrIf8ra_Zi3gMX.webp&quot; alt=&quot;Python拓展&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. 设置python环境：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;打开VScode设置，(左下角齿轮-&amp;gt;选择设置settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-8.C7sGpJIm_I1mv1.webp&quot; alt=&quot;齿轮&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-9.BTDiiKJ5_Z1kzGFv.webp&quot; alt=&quot;settings1&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-10.LCMVcJNm_Z11NpzN.webp&quot; alt=&quot;settings2&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. 设置python解释器：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;任意打开一个python文件，例如test.py&lt;/li&gt;
&lt;li&gt;其中编写代码 &lt;code&gt;print(123)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-11.Ds1ZJrys_JWVNu.webp&quot; alt=&quot;Python_interpreter_1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-12.Doj2c1Si_TOhJQ.webp&quot; alt=&quot;python_interpreter_2&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-18-13.B36tg3OA_Zub9mc.webp&quot; alt=&quot;python_interpreter_3&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;至此大功告成&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>C&amp;C++在VScode中的配置</title><link>https://blog.srprolin.top/posts/c_invscode/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/c_invscode/</guid><description>本文针对学习C语言的新人，选择VSCode编辑器，为其配置IDE环境，从而能够编写、编译、运行C(++)代码</description><pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;针对准备学习编程的新人，一般是从 c 语言开始，当然 c++是可以兼容 c 语言的，且环境配置上差不太多，在这里一起讲。&lt;/li&gt;
&lt;li&gt;编程所用必备的工具一般是 &lt;strong&gt;IDE（集成开发环境）&lt;/strong&gt;，其中包含了代码 &lt;strong&gt;&lt;em&gt;编辑器&lt;/em&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;em&gt;编译器&lt;/em&gt;&lt;/strong&gt;、&lt;strong&gt;&lt;em&gt;调试器&lt;/em&gt;&lt;/strong&gt; 和图形化操作界面，方便使用。&lt;/li&gt;
&lt;li&gt;而因为 &lt;strong&gt;&lt;em&gt;VScode&lt;/em&gt;&lt;/strong&gt; 它本质上是一个 &lt;strong&gt;&lt;em&gt;编辑器&lt;/em&gt;&lt;/strong&gt;，而非 &lt;strong&gt;&lt;em&gt;IDE&lt;/em&gt;&lt;/strong&gt;，也即只能写代码而不能直接编译运行，所以我们要配置环境，使得它能够完成代码生产的完整工具链。&lt;/li&gt;
&lt;li&gt;因此我们在这里需要安装 &lt;strong&gt;&lt;em&gt;编辑器&lt;/em&gt;&lt;/strong&gt;，&lt;strong&gt;&lt;em&gt;编译器&lt;/em&gt;&lt;/strong&gt;，写配置文件 &lt;strong&gt;&lt;em&gt;搭建环境&lt;/em&gt;&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;编辑器&lt;/em&gt;&lt;/strong&gt; -- &lt;strong&gt;&lt;em&gt;Visual Studio Code&lt;/em&gt;&lt;/strong&gt; &amp;gt; &lt;strong&gt;&lt;em&gt;编译器&lt;/em&gt;&lt;/strong&gt; -- &lt;strong&gt;&lt;em&gt;GCC(GNU Compiler Collection)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;手把手从 0 开始构建 IDE 环境&lt;/h1&gt;
&lt;p&gt;下面将分步骤，详细说明每一步在干什么，以及需要做什么，从而搭建起我们编写代码的环境。&lt;/p&gt;
&lt;h2&gt;1.&lt;strong&gt;&lt;em&gt;宇宙最强编辑器--Visual Studio Code&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;下载地址： https://code.visualstudio.com/&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-1.BdI7Ua6x_Z10OEyV.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-2.Qy04M5Yj_ZLD7EB.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全部勾选即可&lt;/li&gt;
&lt;li&gt;打开后在左侧，选择拓展&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-3.DAefhNH0_Z1m15fM.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索 &lt;strong&gt;&lt;em&gt;chinese&lt;/em&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;em&gt;c&lt;/em&gt;&lt;/strong&gt; 安装这两个拓展，&lt;strong&gt;&lt;em&gt;C/C++&lt;/em&gt;&lt;/strong&gt; 拓展是个包，只需安装一个，另外几个都会自动安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-4.Dtmkcd5r_1C7d6q.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/20250331205941.BXIspC7Q_12U1Fb.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2.&lt;strong&gt;&lt;em&gt;Windows 系统下的 GCC 编译器--MinGW-w64&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;最初的原版 &lt;strong&gt;&lt;em&gt;gcc&lt;/em&gt;&lt;/strong&gt; 编译器并不能在现如今更流行的 &lt;strong&gt;&lt;em&gt;windows 系统&lt;/em&gt;&lt;/strong&gt; 下使用，因此我们用的是 &lt;strong&gt;&lt;em&gt;MinGW(全称 Minimalist GNU on Windows)&lt;/em&gt;&lt;/strong&gt;
其下有两个版本 &lt;strong&gt;&lt;em&gt;MinGW&lt;/em&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;em&gt;MinGW-w64&lt;/em&gt;&lt;/strong&gt;，前者只能编译生成 32 位程序，而后者能够编译生成 32 位或 64 位程序，因此我们选择后者。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;MinGW-w64&lt;/em&gt;&lt;/strong&gt; 下载地址： https://sourceforge.net/projects/mingw-w64/files/&lt;/li&gt;
&lt;li&gt;进去之后向下滑动找到如下版本：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-5.BttchbFL_1Cdm72.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;下载完成后会得到一个压缩包，在任意盘符下创建文件夹，名为 &lt;strong&gt;&lt;em&gt;MinGW&lt;/em&gt;&lt;/strong&gt;，将压缩文件拖进该文件夹中解压，我这里在 &lt;strong&gt;&lt;em&gt;D 盘&lt;/em&gt;&lt;/strong&gt; 中演示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-6.DXHp2ZCy_ZuVOrV.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开 &lt;strong&gt;&lt;em&gt;bin&lt;/em&gt;&lt;/strong&gt; 文件夹后，里面的 &lt;strong&gt;gcc.exe&lt;/strong&gt;是 &lt;strong&gt;C 语言&lt;/strong&gt;的编译器，&lt;strong&gt;&lt;em&gt;g++.exe&lt;/em&gt;&lt;/strong&gt; 是 &lt;strong&gt;&lt;em&gt;C++语言&lt;/em&gt;&lt;/strong&gt; 的编译器，&lt;strong&gt;&lt;em&gt;gdb.exe&lt;/em&gt;&lt;/strong&gt; 是用来调试程序的 &lt;strong&gt;&lt;em&gt;debug 工具&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3.&lt;strong&gt;&lt;em&gt;配置帐户环境变量&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;打开 &lt;strong&gt;&lt;em&gt;windows 搜索栏&lt;/em&gt;&lt;/strong&gt;，输入 &lt;strong&gt;&lt;em&gt;环境变量&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-7.DwUYa-Th_1mS097.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-8.8qT9G-MV_ZaiWsC.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-9.BXDvMz7U_Z21MSiw.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;此后我们打开 &lt;strong&gt;&lt;em&gt;cmd 命令行&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-10.CwzBGx9S_5njhz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;此时需要重新启动电脑&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;4.&lt;strong&gt;&lt;em&gt;文件结构&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;学习阶段&lt;/em&gt;&lt;/strong&gt; 大多数文件都是独立运行，或者是非拓展性文件间的互相访问，这是一种使用环境。&lt;/li&gt;
&lt;li&gt;而在 &lt;strong&gt;&lt;em&gt;项目工作&lt;/em&gt;&lt;/strong&gt; 中的文件夹中，有许多为了方便管理的拓展性文件，这又是一种使用环境。&lt;/li&gt;
&lt;li&gt;这两种环境我们要单独为其编写配置文件，分成 &lt;strong&gt;&lt;em&gt;单文件结构&lt;/em&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;em&gt;多文件结构&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;我们可以在一个名为 &lt;strong&gt;&lt;em&gt;project&lt;/em&gt;&lt;/strong&gt; 的文件夹中创建名为 &lt;strong&gt;&lt;em&gt;CODE_C&lt;/em&gt;&lt;/strong&gt; 的文件夹来管理 c 语言文件，再在 **&lt;em&gt;CODE_C&lt;/em&gt;**文件夹下创建 &lt;strong&gt;&lt;em&gt;C_Single&lt;/em&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;em&gt;C_Multiple&lt;/em&gt;&lt;/strong&gt; 来区分单文件与多文件结构。&lt;/li&gt;
&lt;li&gt;此时在 &lt;strong&gt;&lt;em&gt;C_Single&lt;/em&gt;&lt;/strong&gt; 文件夹下就可以创建用于测试的项目文件夹，比如名为 &lt;strong&gt;&lt;em&gt;test_v&lt;/em&gt;&lt;/strong&gt; 的文件夹，在此文件夹下创建 &lt;strong&gt;&lt;em&gt;test.c&lt;/em&gt;&lt;/strong&gt; 文件来编写代码，当我们去编译执行代码时，将会产生一个 &lt;strong&gt;&lt;em&gt;exe 可执行程序文件&lt;/em&gt;&lt;/strong&gt;，我们可以在项目文件夹 &lt;strong&gt;&lt;em&gt;test_v&lt;/em&gt;&lt;/strong&gt; 下创建 &lt;strong&gt;&lt;em&gt;bin&lt;/em&gt;&lt;/strong&gt; 文件夹来存放生成的程序文件。&lt;/li&gt;
&lt;li&gt;example：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-14-11.B3Mg1Tjx_2sHevz.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在多文件结构中，只需要在单文件结构中存放代码文件的位置，替换成存放文件夹就好，源代码和 exe 文件均在这个文件夹中。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5.&lt;strong&gt;&lt;em&gt;基于文件结构的 VScode 配置文件&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;简单来说，我们需要创建两个文件 &lt;strong&gt;&lt;em&gt;tasks.json&lt;/em&gt;&lt;/strong&gt; 文件和 &lt;strong&gt;&lt;em&gt;launch.json&lt;/em&gt;&lt;/strong&gt; 文件来分别实现 &lt;strong&gt;&lt;em&gt;build&lt;/em&gt;&lt;/strong&gt; 构建功能和 &lt;strong&gt;&lt;em&gt;debug&lt;/em&gt;&lt;/strong&gt; 调试功能&lt;/li&gt;
&lt;li&gt;创建文件的位置要求是，在存放源文件的文件夹的根目录，以 c 语言单文件为例，也就是在 &lt;strong&gt;C_Single&lt;/strong&gt;文件夹下创建。&lt;/li&gt;
&lt;li&gt;注意请大致看一看 json 文件的内容，要注意修改 &lt;strong&gt;&lt;em&gt;某些路径&lt;/em&gt;&lt;/strong&gt;，配置默认编译器是调用 gcc 也即 c 语言编译器，若用 c++语言请在 json 文件中修改对应参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;单文件结构&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;em&gt;tasks.json&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;2.0.0&quot;,
  &quot;tasks&quot;: [
    {
      //这个大括号里是‘构建（build）’任务
      &quot;label&quot;: &quot;build&quot;, //任务名称，可以更改，不过不建议改
      &quot;type&quot;: &quot;shell&quot;, //任务类型，process是vsc把预定义变量和转义解析后直接全部传给command；shell相当于先打开shell再输入命令，所以args还会经过shell再解析一遍
      &quot;command&quot;: &quot;gcc&quot;, //编译命令，这里是gcc，编译c++的话换成g++
      &quot;args&quot;: [
        //方括号里是传给gcc命令的一系列参数，用于实现一些功能
        &quot;${file}&quot;, //指定要编译的是当前文件
        &quot;-o&quot;, //指定输出文件的路径和名称
        &quot;${fileDirname}\\bin\\${fileBasenameNoExtension}.exe&quot;, //承接上一步的-o，让可执行文件输出到源码文件所在的文件夹下的bin文件夹内，并且让它的名字和源码文件相同
        &quot;-g&quot;, //生成和调试有关的信息
        &quot;-Wall&quot;, // 开启额外警告
        &quot;-static-libgcc&quot;, // 静态链接libgcc
        &quot;-fexec-charset=GBK&quot;, // 生成的程序使用GBK编码，不加这一条会导致Win下输出中文乱码
        &quot;-std=c11&quot; // 语言标准，可根据自己的需要进行修改，写c++要换成c++的语言标准，比如c++11
      ],
      &quot;group&quot;: {
        //group表示‘组’，我们可以有很多的task，然后把他们放在一个‘组’里
        &quot;kind&quot;: &quot;build&quot;, //表示这一组任务类型是构建
        &quot;isDefault&quot;: true //表示这个任务是当前这组任务中的默认任务
      },
      &quot;presentation&quot;: {
        //执行这个任务时的一些其他设定
        &quot;echo&quot;: true, //表示在执行任务时在终端要有输出
        &quot;reveal&quot;: &quot;always&quot;, //执行任务时是否跳转到终端面板，可以为always，silent，never
        &quot;focus&quot;: false, //设为true后可以使执行task时焦点聚集在终端，但对编译来说，设为true没有意义，因为运行的时候才涉及到输入
        &quot;panel&quot;: &quot;new&quot; //每次执行这个task时都新建一个终端面板，也可以设置为shared，共用一个面板，不过那样会出现‘任务将被终端重用’的提示，比较烦人
      },
      &quot;problemMatcher&quot;: &quot;$gcc&quot; //捕捉编译时编译器在终端里显示的报错信息，将其显示在vscode的‘问题’面板里
    },
    {
      //这个大括号里是‘运行(run)’任务，一些设置与上面的构建任务性质相同
      &quot;label&quot;: &quot;run&quot;,
      &quot;type&quot;: &quot;shell&quot;,
      &quot;dependsOn&quot;: &quot;build&quot;, //任务依赖，因为要运行必须先构建，所以执行这个任务前必须先执行build任务，
      &quot;command&quot;: &quot;${fileDirname}\\bin\\${fileBasenameNoExtension}.exe&quot;, //执行exe文件，只需要指定这个exe文件在哪里就好
      &quot;group&quot;: {
        &quot;kind&quot;: &quot;test&quot;, //这一组是‘测试’组，将run任务放在test组里方便我们用快捷键执行
        &quot;isDefault&quot;: true
      },
      &quot;presentation&quot;: {
        &quot;echo&quot;: true,
        &quot;reveal&quot;: &quot;always&quot;,
        &quot;focus&quot;: true, //这个就设置为true了，运行任务后将焦点聚集到终端，方便进行输入
        &quot;panel&quot;: &quot;new&quot;
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;launch.json&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;0.2.0&quot;,
  &quot;configurations&quot;: [
    {
      //这个大括号里是我们的‘调试(Debug)’配置
      &quot;name&quot;: &quot;Debug&quot;, // 配置名称
      &quot;type&quot;: &quot;cppdbg&quot;, // 配置类型，cppdbg对应cpptools提供的调试功能；可以认为此处只能是cppdbg
      &quot;request&quot;: &quot;launch&quot;, // 请求配置类型，可以为launch（启动）或attach（附加）
      &quot;program&quot;: &quot;${fileDirname}\\bin\\${fileBasenameNoExtension}.exe&quot;, // 将要进行调试的程序的路径
      &quot;args&quot;: [], // 程序调试时传递给程序的命令行参数，这里设为空即可
      &quot;stopAtEntry&quot;: false, // 设为true时程序将暂停在程序入口处，相当于在main上打断点
      &quot;cwd&quot;: &quot;${fileDirname}&quot;, // 调试程序时的工作目录，此处为源码文件所在目录
      &quot;environment&quot;: [], // 环境变量，这里设为空即可
      &quot;externalConsole&quot;: false, // 为true时使用单独的cmd窗口，跳出小黑框；设为false则是用vscode的内置终端，建议用内置终端
      &quot;internalConsoleOptions&quot;: &quot;neverOpen&quot;, // 如果不设为neverOpen，调试时会跳到“调试控制台”选项卡，新手调试用不到
      &quot;MIMode&quot;: &quot;gdb&quot;, // 指定连接的调试器，gdb是minGW中的调试程序
      &quot;miDebuggerPath&quot;: &quot;D:\\MinGW\\mingw64\\bin\\gdb.exe&quot;, // 指定调试器所在路径，如果你的minGW装在别的地方，则要改成你自己的路径，注意间隔是\\
      &quot;preLaunchTask&quot;: &quot;build&quot; // 调试开始前执行的任务，我们在调试前要编译构建。与tasks.json的label相对应，名字要一样
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;多文件结构&lt;/em&gt;&lt;/strong&gt;
&lt;strong&gt;&lt;em&gt;tasks.json&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;2.0.0&quot;,
  &quot;tasks&quot;: [
    {
      &quot;label&quot;: &quot;build&quot;,
      &quot;type&quot;: &quot;shell&quot;,
      &quot;command&quot;: &quot;gcc&quot;, //写c++换成g++
      &quot;args&quot;: [
        &quot;${fileDirname}\\*.c&quot;, //写c++把 *.c 换成 *.cpp
        &quot;-o&quot;,
        &quot;${fileDirname}\\${fileBasenameNoExtension}.exe&quot;,
        &quot;-g&quot;,
        &quot;-Wall&quot;,
        &quot;-static-libgcc&quot;,
        &quot;-fexec-charset=GBK&quot;,
        &quot;-std=c11&quot; //写c++换成c++标准
      ],
      &quot;group&quot;: {
        &quot;kind&quot;: &quot;build&quot;,
        &quot;isDefault&quot;: true
      },
      &quot;presentation&quot;: {
        &quot;echo&quot;: true,
        &quot;reveal&quot;: &quot;always&quot;,
        &quot;focus&quot;: false,
        &quot;panel&quot;: &quot;new&quot;
      },
      &quot;problemMatcher&quot;: &quot;$gcc&quot;
    },
    {
      &quot;label&quot;: &quot;run&quot;,
      &quot;type&quot;: &quot;shell&quot;,
      &quot;dependsOn&quot;: &quot;build&quot;,
      &quot;command&quot;: &quot;${fileDirname}\\${fileBasenameNoExtension}.exe&quot;,
      &quot;group&quot;: {
        &quot;kind&quot;: &quot;test&quot;,
        &quot;isDefault&quot;: true
      },
      &quot;presentation&quot;: {
        &quot;echo&quot;: true,
        &quot;reveal&quot;: &quot;always&quot;,
        &quot;focus&quot;: true,
        &quot;panel&quot;: &quot;new&quot;
      }
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;launch.json&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;version&quot;: &quot;0.2.0&quot;,
  &quot;configurations&quot;: [
    {
      &quot;name&quot;: &quot;Debug&quot;,
      &quot;type&quot;: &quot;cppdbg&quot;,
      &quot;request&quot;: &quot;launch&quot;,
      &quot;program&quot;: &quot;${fileDirname}\\${fileBasenameNoExtension}.exe&quot;,
      &quot;args&quot;: [],
      &quot;stopAtEntry&quot;: false,
      &quot;cwd&quot;: &quot;${fileDirname}&quot;,
      &quot;environment&quot;: [],
      &quot;externalConsole&quot;: false,
      &quot;internalConsoleOptions&quot;: &quot;neverOpen&quot;,
      &quot;MIMode&quot;: &quot;gdb&quot;,
      &quot;miDebuggerPath&quot;: &quot;D:\\MinGW\\mingw64\\bin\\gdb.exe&quot;,
      &quot;preLaunchTask&quot;: &quot;build&quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;至此，在 VScode 中编写一个 Hello,World! 并编译执行，也就不成问题了。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Minecraft基础 | 虚拟局域网联机</title><link>https://blog.srprolin.top/posts/minecraft-1/</link><guid isPermaLink="true">https://blog.srprolin.top/posts/minecraft-1/</guid><description>本文将介绍游戏Minecraft(我的世界)(MC)的Java版下载，如何启动，如何用Zerotier工具实现虚拟局域网的远程联机。</description><pubDate>Sat, 22 Jun 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;Java版Minecraft下载&lt;/h1&gt;
&lt;h2&gt;一、启动器 &lt;em&gt;&lt;strong&gt;HMCL&lt;/strong&gt;&lt;/em&gt; 、 &lt;em&gt;&lt;strong&gt;PCL2&lt;/strong&gt;&lt;/em&gt; 、 &lt;em&gt;&lt;strong&gt;官方启动器&lt;/strong&gt;&lt;/em&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;HMCL&lt;/strong&gt;&lt;/em&gt; --由 &lt;em&gt;&lt;strong&gt;huangyuhui&lt;/strong&gt;&lt;/em&gt; 制作
主页: https://hmcl.huangyuhui.net/
GitHub项目地址:https://github.com/HMCL-dev/HMCL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-1.DqHY2NaX_H8LCj.webp&quot; alt=&quot;HMCL主页&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;PCL2&lt;/strong&gt;&lt;/em&gt; --由 &lt;em&gt;&lt;strong&gt;龙腾猫跃&lt;/strong&gt;&lt;/em&gt; 制作
爱发电文件地址: https://afdian.com/p/0164034c016c11ebafcb52540025c377
GitHub项目地址: https://github.com/Hex-Dragon/PCL2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024-07-05_22-48-14.DJRHwthe_1BMU4.webp&quot; alt=&quot;PCL2&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;一般通过这种途径下载，将会得到一个 &lt;em&gt;&lt;strong&gt;.zip&lt;/strong&gt;&lt;/em&gt; 压缩包文件，然后找到一个文件夹解压下来，将会得到两个程序文件：&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-2.BR99D6X0_ZjNEh8.webp&quot; alt=&quot;HMCL&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-3.CCK6EfCo_1pghpc.webp&quot; alt=&quot;PCL2&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;官方启动器&lt;/strong&gt;&lt;/em&gt; --由 &lt;em&gt;&lt;strong&gt;Mojang&lt;/strong&gt;&lt;/em&gt; 制作（当然游戏也是人家做的）
网址：https://www.minecraft.net/zh-hans&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;在这里我们能找到购买游戏的途径（Minecraft游戏其实是付费的），购买之后就能够得到 &lt;em&gt;&lt;strong&gt;Java版&lt;/strong&gt;&lt;/em&gt; 和 &lt;em&gt;&lt;strong&gt;基岩版&lt;/strong&gt;&lt;/em&gt;，如果不行的话，可以去 &lt;em&gt;&lt;strong&gt;Microsoft Store&lt;/strong&gt;&lt;/em&gt;（俗称微软商店）中购买&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-4.BJ1ma_Gh_RwGjY.webp&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-5.7Q5K3uDU_ZwPku4.webp&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;购买游戏其实对 &lt;em&gt;&lt;strong&gt;Java版&lt;/strong&gt;&lt;/em&gt; 影响不大，因为微软接手后大力发展的是 在自家 &lt;em&gt;&lt;strong&gt;XBox&lt;/strong&gt;&lt;/em&gt; 平台上的 &lt;em&gt;&lt;strong&gt;基岩版&lt;/strong&gt;&lt;/em&gt; minecraft，但是购买了游戏后，&lt;em&gt;&lt;strong&gt;Java版&lt;/strong&gt;&lt;/em&gt; 用户将会被分配一个唯一的 &lt;em&gt;&lt;strong&gt;uuid&lt;/strong&gt;&lt;/em&gt;，用于 &lt;em&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/em&gt; 服务器的 &lt;em&gt;&lt;strong&gt;正版验证&lt;/strong&gt;&lt;/em&gt; ，从而进行有效 &lt;em&gt;&lt;strong&gt;联机&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;uuid&lt;/strong&gt;&lt;/em&gt; 查询网站：https://mcuuid.net/&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;二、游戏本体下载&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;打开非官方启动器后都是可视化操作界面，接下来提一下游戏本体的下载。&lt;/li&gt;
&lt;li&gt;在启动器中的下载版块里，首先 &lt;em&gt;&lt;strong&gt;选择游戏版本&lt;/strong&gt;&lt;/em&gt;，接下来选择模组加载器&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Forge&lt;/strong&gt;&lt;/em&gt; &lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-6.BFr5z62N_27cRjT.webp&quot; alt=&quot;1&quot; /&gt; ：具有大量老牌大型模组社区，可供下载。游戏光影一般搭配 &lt;em&gt;&lt;strong&gt;OptiFine&lt;/strong&gt;&lt;/em&gt; 使用，不过如今 &lt;em&gt;&lt;strong&gt;Forge&lt;/strong&gt;&lt;/em&gt; 优化模组中也出现了 &lt;em&gt;&lt;strong&gt;Fabric&lt;/strong&gt;&lt;/em&gt; 里类似 &lt;em&gt;&lt;strong&gt;iris&lt;/strong&gt;&lt;/em&gt; 的存在，但不安装 &lt;em&gt;&lt;strong&gt;OptiFine&lt;/strong&gt;&lt;/em&gt; 也不影响游戏本体的下载与游玩。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Fabric&lt;/strong&gt;&lt;/em&gt;  &lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-7.D6fSbw01_1u0adl.webp&quot; alt=&quot;2&quot; /&gt; ： 小鲜肉，起初是大多小型模组的生态圈，如今也有很多大型模组，因 &lt;em&gt;&lt;strong&gt;Fabric&lt;/strong&gt;&lt;/em&gt; 的许多优化都比 &lt;em&gt;&lt;strong&gt;Forge&lt;/strong&gt;&lt;/em&gt; 更好，而被做了一些移植。下载时要搭配 &lt;em&gt;&lt;strong&gt;Fabric API&lt;/strong&gt;&lt;/em&gt; ， 这是必要的，启动器里一般默认自动勾选。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;之后通过启动器的一键式安装，你就得到了游戏本体了。但是众所周知 &lt;em&gt;&lt;strong&gt;Java版Minecraft&lt;/strong&gt;&lt;/em&gt; 是需要 &lt;em&gt;&lt;strong&gt;Java环境&lt;/strong&gt;&lt;/em&gt; 来运行的，因此你需要下载 &lt;em&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;三、Java下载&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;下面有两种方法下载 &lt;em&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/em&gt;，一个是通过 &lt;em&gt;&lt;strong&gt;官网&lt;/strong&gt;&lt;/em&gt; 安装Java，另一个是通过 &lt;em&gt;&lt;strong&gt;Oracle中国&lt;/strong&gt;&lt;/em&gt; 的Java整合版，由于后者是国内的，我更推荐通过Oracle下载。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Java官网&lt;/strong&gt;&lt;/em&gt; ： https://www.java.com/zh-CN/&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Oracle地址&lt;/strong&gt;&lt;/em&gt; ： https://www.oracle.com/cn/java/technologies/downloads/&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;下面是 &lt;em&gt;&lt;strong&gt;Oracle&lt;/strong&gt;&lt;/em&gt; 的下载界面：&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-8.FcJKTf-Q_Z21H8wj.webp&quot; alt=&quot;0&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;一般选择 &lt;em&gt;&lt;strong&gt;Installer&lt;/strong&gt;&lt;/em&gt;，下载好之后双击都是安装程序。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;安装好 &lt;em&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/em&gt; 后，通过启动器启动游戏就可以开始游玩了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h1&gt;联机&lt;/h1&gt;
&lt;h2&gt;一、联机工具下载&lt;/h2&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;我们使用的工具是 &lt;em&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt;&lt;/em&gt;  一个专门用来建立点对点虚拟专用网(&lt;em&gt;&lt;strong&gt;P2P VPN&lt;/strong&gt;&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;以 &lt;em&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/em&gt; 系统为例&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;下载地址：https://www.zerotier.com/&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-9.7ZCRXSG3_Z10COJ5.webp&quot; alt=&quot;屏幕截图 2024-06-22 105811&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击 &lt;em&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-10.Bi4XKbwy_Z1e8tCS.webp&quot; alt=&quot;屏幕截图 2024-06-22 105945&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一般情况下直接点击 &lt;em&gt;&lt;strong&gt;MSI Installer (x86/x64)&lt;/strong&gt;&lt;/em&gt; 下载完成如图&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-11.D2LzVjIW_Z21SeBR.webp&quot; alt=&quot;屏幕截图 2024-06-22 110219&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安装前请把 &lt;em&gt;&lt;strong&gt;杀毒软件&lt;/strong&gt;&lt;/em&gt; 全部关闭，尽量不要出现被拦截的情况。&lt;/li&gt;
&lt;li&gt;双击进行安装后，在右下角 &lt;em&gt;&lt;strong&gt;托盘&lt;/strong&gt;&lt;/em&gt; 处，你会看到如图图标。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-12.CmWCG5G5_xT1DI.webp&quot; alt=&quot;屏幕截图 2024-06-22 111326&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;二、网络创建者（房主）的操作：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;回到 &lt;em&gt;&lt;strong&gt;ZeroTier&lt;/strong&gt;&lt;/em&gt; 官网：https://www.zerotier.com/&lt;/li&gt;
&lt;li&gt;选择 &lt;em&gt;&lt;strong&gt;Sign Up&lt;/strong&gt;&lt;/em&gt; 注册一个账号，然后 &lt;em&gt;&lt;strong&gt;Log In&lt;/strong&gt;&lt;/em&gt; 登录&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-13.Bp0fVnB8_Z56pqP.webp&quot; alt=&quot;屏幕截图 2024-06-22 111740(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Create A Network&lt;/strong&gt;&lt;/em&gt;，点击进一个 &lt;em&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/em&gt; 中&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-14.CH325Pfx_1Mm5pc.webp&quot; alt=&quot;屏幕截图 2024-06-22 112057(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;复制 &lt;em&gt;&lt;strong&gt;Network ID&lt;/strong&gt;&lt;/em&gt; 给你的朋友&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-15.Dgx8oxRP_ZzH0Qv.webp&quot; alt=&quot;屏幕截图 2024-06-22 112220&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;等待朋友发来请求，下拉找到请求，&lt;em&gt;&lt;strong&gt;勾选&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-16.Jb_3pcTl_Z1OAqNl.webp&quot; alt=&quot;屏幕截图 2024-06-22 112819&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;对此网络的管理均在此网页内进行&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;三、网络连接者：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;点击托盘图标，点击 &lt;em&gt;&lt;strong&gt;Join New Network&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-17.COcqQyvN_IQOtC.webp&quot; alt=&quot;屏幕截图 2024-06-22 112349(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将代码输入，点击 &lt;em&gt;&lt;strong&gt;Join&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-18.BO_rhX9G_1sDihd.webp&quot; alt=&quot;屏幕截图 2024-06-22 112555&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;等待创建者同意加入网络&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-19.CjrAAnbD_Z13Dpac.webp&quot; alt=&quot;屏幕截图 2024-06-22 112920(1)(1)&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;注意&lt;/strong&gt;&lt;/em&gt; : 请把 &lt;em&gt;&lt;strong&gt;Windows防火墙&lt;/strong&gt;&lt;/em&gt; 中的公用网络关闭，防止连接失败。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;四、游戏房主：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;任意界面下按 &lt;em&gt;&lt;strong&gt;win键&lt;/strong&gt;&lt;/em&gt; + &lt;em&gt;&lt;strong&gt;R键&lt;/strong&gt;&lt;/em&gt; ，输入 &lt;em&gt;&lt;strong&gt;cmd&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-20.CmFKjT9e_1rsTng.webp&quot; alt=&quot;屏幕截图 2024-06-22 113704&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;输入 &lt;em&gt;&lt;strong&gt;ipconfig&lt;/strong&gt;&lt;/em&gt; 找到以太网Zerotier下的描述，复制 &lt;em&gt;&lt;strong&gt;IPv4地址&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-21.BHI2_qkm_fRtfd.webp&quot; alt=&quot;屏幕截图 2024-06-22 113815&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开任意世界，&lt;em&gt;&lt;strong&gt;对局域网开放&lt;/strong&gt;&lt;/em&gt; ，注意如果朋友是离线用户，一定要关闭 &lt;em&gt;&lt;strong&gt;在线验证&lt;/strong&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-22.BnpjeQ5B_Z29cGz2.webp&quot; alt=&quot;屏幕截图 2024-06-22 113335&quot; /&gt;
&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-23.v6K6AN_v_zQHlq.webp&quot; alt=&quot;屏幕截图 2024-06-22 113441&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将 &lt;em&gt;&lt;strong&gt;端口号&lt;/strong&gt;&lt;/em&gt; 和 &lt;em&gt;&lt;strong&gt;IPv4地址&lt;/strong&gt;&lt;/em&gt; 发给你的朋友&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;五、游戏玩家：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;多人游戏，添加服务器&lt;/li&gt;
&lt;li&gt;输入 &lt;em&gt;&lt;strong&gt;IPv4地址&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;/em&gt; &lt;em&gt;&lt;strong&gt;端口号&lt;/strong&gt;&lt;/em&gt; ,注意 &lt;em&gt;&lt;strong&gt;“:”&lt;/strong&gt;&lt;/em&gt; 一定是英文输入法下的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/20250331192119.BWcnArP-_ZOVIwa.webp&quot; alt=&quot;屏幕截图 2024-06-22 114134&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;连接进入&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.srprolin.top/_astro/2024_06_22-24.CT_wCpQc_Z1Vm8jg.webp&quot; alt=&quot;屏幕截图 2024-06-22 114410&quot; /&gt;&lt;/p&gt;
</content:encoded></item></channel></rss>