<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Winston</title>
    <link>https://winston.ink/</link>
    <description>Stay Young Stay Simple</description>
    <language>zh-cn</language>
    <generator>Gridea Pro</generator>
    <lastBuildDate>Sat, 04 Jul 2026 17:58:13 +0800</lastBuildDate>
    <atom:link href="https://winston.ink/feed.xml" rel="self" type="application/rss+xml"></atom:link>
    <item>
      <title>R2-Explorer</title>
      <link>https://winston.ink/post/r2-explorer/</link>
      <guid isPermaLink="true">https://winston.ink/post/r2-explorer/</guid>
      <pubDate>Sat, 04 Jul 2026 17:49:00 +0800</pubDate>
      <description><![CDATA[<p><a href="https://r2explorer.com">R2-Explorer</a> 是一款开源、部署于 Cloudflare Workers 的网页端管理面板，专为 Cloudflare R2 对象存储打造，提供类谷歌网盘可视化操作界面，解决原生R2控制台操作繁琐、缺乏直观文件管理的痛点。项目依托无服务架构，通过GitHub Actions一键自动部署，支持绑定自定义域名独立访问，可单桶或多桶统一管控。</p>
<!-- more -->
<p>工具支持拖拽上传、文件夹管理、多格式文件在线预览、生成带时效/密码的分享链接，可自由切换只读/读写模式。内置基础账号认证、Cloudflare Access双重安全防护，可单独配置桶对外公开直链域名。无需服务器、零存储费用，适合个人图床、文件存储、轻量资源库场景，配置灵活轻量化，适配各类自建R2存储使用需求。</p>
<p>示例参数：</p>
<ul>
<li>Worker 名称：<code>disk</code></li>
<li>R2 桶名称：<code>file</code></li>
<li>Worker 域名：<code>disk.winston.ink</code></li>
<li>文件公开地址：<code>https://file.winston.ink</code></li>
</ul>
<h2 id="heading">一、配置区分说明</h2>
<p>配置分为两类，都在仓库页面操作：</p>
<ol>
<li><strong>Secrets（机密加密存储）</strong>：仓库 → Settings → Secrets and variables → Actions → New repository secret</li>
<li><strong>Variables（明文配置）</strong>：同一页面切换至 Variables 标签添加</li>
</ol>
<h2 id="-secret-">二、必填 Secret 配置</h2>
<p>仅需1个加密密钥，填入 Secrets：</p>
<table>
<thead>
<tr>
<th>Secret 名称</th>
<th>填写内容说明</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>CF_API_TOKEN</code></td>
<td>Cloudflare API Token</td>
</tr>
</tbody>
</table>
<h3 id="token-">Token 创建步骤</h3>
<p>Cloudflare 控制台 → 右上角头像 → My Profile → API Tokens → Create Token<br />
自定义权限模板，授予：Workers 编辑、R2 读写、Zone DNS 管理权限</p>
<h2 id="github-actions--variables-">三、GitHub Actions 明文 Variables 配置</h2>
<p>共4项核心变量，直接复制对应值填入：</p>
<ol>
<li><code>R2EXPLORER_WORKER_NAME</code><br />
值：<code>disk</code><br />
说明：Cloudflare Worker 服务名称</li>
<li><code>R2EXPLORER_BUCKETS</code><br />
值：<code>disk:file</code><br />
格式规则：<code>R2绑定名:R2桶真实名称</code>
<ul>
<li><code>disk</code>：wrangler 中 R2 binding 绑定名</li>
<li><code>file</code>：R2 存储桶真实名称</li>
</ul>
</li>
<li><code>R2EXPLORER_DOMAIN</code><br />
值：<code>disk.winston.ink</code><br />
说明：绑定 Worker 的自定义访问域名</li>
<li><code>R2EXPLORER_CONFIG</code><br />
基础完整配置（可直接复制）：
<pre><code class="language-json">{
  &quot;readonly&quot;: false,
  &quot;buckets&quot;: {
    &quot;disk&quot;: {
      &quot;publicUrl&quot;: &quot;https://file.winston.ink&quot;
    }
  }
}
</code></pre>
参数释义：
<ul>
<li><code>readonly: false</code>：开启上传、删除等写入操作；改为 <code>true</code> 则全局只读</li>
<li><code>buckets.disk.publicUrl</code>：R2 文件直链访问域名</li>
</ul>
</li>
</ol>
<h3 id="heading-1">带登录密码扩展配置（可选）</h3>
<p>如需开启后台账号密码验证，替换上面的 JSON：</p>
<pre><code class="language-json">{
  &quot;readonly&quot;: false,
  &quot;basicAuth&quot;: {
    &quot;username&quot;: &quot;admin&quot;,
    &quot;password&quot;: &quot;自定义登录密码&quot;
  },
  &quot;buckets&quot;: {
    &quot;disk&quot;: {
      &quot;publicUrl&quot;: &quot;https://file.winston.ink&quot;
    }
  }
}
</code></pre>
<h2 id="heading-2">四、完整配置汇总表</h2>
<h3 id="1-repository-variables">1. Repository Variables（明文）</h3>
<table>
<thead>
<tr>
<th>变量名</th>
<th>填入值</th>
</tr>
</thead>
<tbody>
<tr>
<td>R2EXPLORER_WORKER_NAME</td>
<td>disk</td>
</tr>
<tr>
<td>R2EXPLORER_BUCKETS</td>
<td>disk:file</td>
</tr>
<tr>
<td>R2EXPLORER_DOMAIN</td>
<td>disk.winston.ink</td>
</tr>
<tr>
<td>R2EXPLORER_CONFIG</td>
<td><code>{&quot;readonly&quot;:false,&quot;buckets&quot;:{&quot;disk&quot;:{&quot;publicUrl&quot;:&quot;https://file.winston.ink&quot;}}}</code></td>
</tr>
</tbody>
</table>
<h3 id="2-repository-secrets">2. Repository Secrets（加密密钥）</h3>
<table>
<thead>
<tr>
<th>Secret 名称</th>
<th>值</th>
</tr>
</thead>
<tbody>
<tr>
<td>CF_API_TOKEN</td>
<td>你的 Cloudflare API Token</td>
</tr>
</tbody>
</table>
<h2 id="heading-3">五、部署后域名绑定操作</h2>
<ol>
<li>Actions 自动部署名称为 <code>disk</code> 的 Worker</li>
<li>Cloudflare Worker 设置 → Custom Domains，添加域名 <code>disk.winston.ink</code></li>
<li>R2 桶 <code>file</code> 后台开启公开访问，并绑定域名 <code>https://file.winston.ink</code>，用于文件直链访问</li>
</ol>
<h2 id="heading-4">六、常见问题排查</h2>
<ol>
<li>无法读取桶文件：检查 <code>R2EXPLORER_BUCKETS</code> 格式 <code>绑定名:桶名</code> 是否填写正确</li>
<li>文件直链404：确认 R2 桶已开启公开访问权限，<code>publicUrl</code> 域名解析正常</li>
<li>Actions 部署失败：检查 <code>CF_API_TOKEN</code> 权限是否包含 Workers、R2、DNS 操作权限</li>
</ol>
]]></description>
      <category>教程</category>
    </item>
    <item>
      <title>Markdown常用语法</title>
      <link>https://winston.ink/post/markdown/</link>
      <guid isPermaLink="true">https://winston.ink/post/markdown/</guid>
      <pubDate>Thu, 18 Jun 2026 13:15:00 +0800</pubDate>
      <description><![CDATA[<p>适合：日常笔记、背诵、快速查阅、通用所有MD编辑器</p>
<!-- more -->
<h2 id="1-1-6">1. 标题（1-6级）</h2>
<p>语法：# 数量代表标题层级</p>
<pre><code class="language-Plain"># 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
</code></pre>
<h2 id="2-">2. 基础文本样式</h2>
<pre><code class="language-Plain">**加粗**
*斜体*
***加粗斜体***
~~删除线~~
==高亮==
`行内代码`
&lt;u&gt;下划线&lt;/u&gt;
</code></pre>
<h2 id="3---">3. 换行 &amp; 分割线</h2>
<ul>
<li>
<p><strong>分段</strong>：空一行</p>
</li>
<li>
<p><strong>强制换行</strong>：行尾两个空格+回车</p>
</li>
<li>
<p><strong>分割线</strong>：<code>---</code> / <code>***</code></p>
</li>
</ul>
<h2 id="4-">4. 列表</h2>
<h3 id="heading">无序列表</h3>
<pre><code class="language-Plain">- 项目1
- 项目2
  - 子项目
</code></pre>
<h3 id="heading-1">有序列表</h3>
<pre><code class="language-Plain">1. 第一条
2. 第二条
   1. 子条目
</code></pre>
<h3 id="heading-2">任务清单</h3>
<pre><code class="language-Plain">- [ ] 未完成
- [x] 已完成
</code></pre>
<h2 id="5-">5. 引用</h2>
<pre><code class="language-Plain">&gt; 一级引用
&gt;&gt; 嵌套二级引用
</code></pre>
<h2 id="6-">6. 代码块</h2>
<h3 id="heading-3">行内代码</h3>
<pre><code class="language-Plain">  `代码内容`
</code></pre>
<h3 id="heading-4">多行带高亮代码</h3>
<pre><code class="language-Plain">  ```python
  # 指定语言：python / java / sql / bash
  print(&quot;hello&quot;)
  ```
</code></pre>
<h2 id="7-">7. 链接、图片</h2>
<h3 id="heading-5">超链接</h3>
<pre><code class="language-Plain">[显示文字](链接地址)
</code></pre>
<h3 id="heading-6">图片</h3>
<pre><code class="language-Plain">![图片备注](图片地址)
</code></pre>
<h2 id="8-">8. 表格（最常用）</h2>
<pre><code class="language-Plain">| 姓名 | 年龄 | 职业 |
| ---- | ---- | ---- |
| 张三 | 20   | 学生 |

# 对齐格式
| 左对齐 | 居中 | 右对齐 |
| :----- | :---: | -----: |

</code></pre>
<h2 id="9-">9. 目录</h2>
<p>文档顶部输入，自动生成全文目录</p>
<pre><code class="language-Plain">[TOC]
</code></pre>
<h2 id="10-">10. 折叠块（笔记神器）</h2>
<p>收纳大量内容，默认折叠</p>
<pre><code class="language-Plain">&lt;details&gt;
&lt;summary&gt;点击展开&lt;/summary&gt;
隐藏的内容、列表、表格
&lt;/details&gt;
</code></pre>
<h2 id="11-">11. 提示块（高亮备注）</h2>
<pre><code class="language-Plain">&gt; [!NOTE] 提示
&gt; 普通说明文字

&gt; [!WARNING] 警告
&gt; 注意事项
</code></pre>
<h2 id="12-">12. 转义字符</h2>
<p>特殊符号前加 <code>\</code> 取消格式，原样输出：`# * - ``</p>
<hr />
<h3 id="heading-7">极简使用总结</h3>
<p>日常记笔记只需掌握：<strong>标题、列表、表格、代码块、折叠块、引用</strong>，足够应对99%场景。</p>
]]></description>
      <category>教程</category>
    </item>
    <item>
      <title>使用FFmpeg合并视频</title>
      <link>https://winston.ink/post/ffmpeg-join-video/</link>
      <guid isPermaLink="true">https://winston.ink/post/ffmpeg-join-video/</guid>
      <pubDate>Wed, 17 Jun 2026 08:20:00 +0800</pubDate>
      <description><![CDATA[<p>使用 <strong>FFmpeg</strong> 进行无损视频合并是它的高频高效操作之一。无损合并的核心原理是<strong>直接复制视频和音频流（Stream Copy）</strong>，而不进行重新编码（Re-encoding）。这样不仅速度极快（几秒钟就能搞定），而且能保证画质和音质绝对没有损失。</p>
<p>以下是为你整理的 FFmpeg 无损视频合并笔记，你可以直接复制到你的 Markdown 编辑器中。</p>
<!-- more -->
<hr />
<h1 id="-ffmpeg-">📝 FFmpeg 无损视频合并指南</h1>
<p>在使用 FFmpeg 无损合并视频前，必须确保一个<strong>核心前提</strong>：</p>
<blockquote>
<p>⚠️ <strong>所有待合并的视频片段，其分辨率、帧率（FPS）、视频编码格式（如 H.264/HEVC）以及音频编码格式（如 AAC/MP3）必须完全一致。</strong> 如果格式不一致，无损合并后可能会出现音画不同步、视频卡顿或无法播放的情况。</p>
</blockquote>
<hr />
<h2 id="--concat--mp4ts">🛠️ 方法一：使用 Concat 协议（最快捷，推荐 MP4/TS）</h2>
<p>如果你的视频是 <code>.mp4</code> 或 <code>.ts</code> 格式，且文件名没有特殊字符，最直接的方法是通过命令行传入一个视频列表。</p>
<h3 id="1-">1. 创建视频列表文件</h3>
<p>在视频所在文件夹下，创建一个名为 <code>filelist.txt</code> 的文本文件，内容格式如下（每行一个视频，注意使用相对路径）：</p>
<pre><code class="language-text">file 'input1.mp4'
file 'input2.mp4'
file 'input3.mp4'

</code></pre>
<h3 id="2-">2. 执行合并命令</h3>
<p>打开终端或命令行，定位到该文件夹，运行以下命令：</p>
<pre><code class="language-bash">ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4
</code></pre>
<h3 id="-">🔍 参数详解：</h3>
<ul>
<li><code>-f concat</code>：指定使用 <code>concat</code>（拼接）分离器。</li>
<li><code>-safe 0</code>：允许使用相对路径和一些特殊字符（如果不加，文件名复杂时可能会报错）。</li>
<li><code>-i filelist.txt</code>：指定输入的内容为刚刚创建的文本文件。</li>
<li><code>-c copy</code>：<strong>最关键的参数</strong>。表示视频流和音频流都直接“复制”，不进行重新编码，从而实现<strong>无损且极速</strong>合并。</li>
<li><code>output.mp4</code>：输出的合并文件名。</li>
</ul>
<hr />
<h2 id="--txt">⚡ 方法二：一行命令搞定（免去手动创建 txt）</h2>
<p>如果你不想手动去新建一个 <code>filelist.txt</code> 文本，可以利用系统命令动态生成列表并传递给 FFmpeg。</p>
<h3 id="-macos--linux-terminal">🍏 macOS / Linux (Terminal)</h3>
<pre><code class="language-bash">printf &quot;file '%s'\n&quot; input1.mp4 input2.mp4 &gt; list.txt &amp;&amp; ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4 &amp;&amp; rm list.txt
</code></pre>
<h3 id="-windows-powershell">🪟 Windows (PowerShell)</h3>
<pre><code class="language-bash">Get-ChildItem *.mp4 | ForEach-Object { &quot;file '$($_.Name)'&quot; } | Out-File list.txt -Encoding utf8; ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4; Remove-Item list.txt
</code></pre>
<p><em>(注：Windows 的这条命令会自动把你当前目录下的所有 MP4 文件按名称排序并合并。)</em></p>
<hr />
<h2 id="--concat-">🧩 方法三：使用 Concat 过滤器（应对多格式/分辨率不一致）</h2>
<blockquote>
<p>💡 <strong>补充场景</strong>：如果你的视频<strong>分辨率或编码不同</strong>，但你强行想要合并它们，<code>-c copy</code> 将无法工作，你必须对它们进行<strong>有损的重新编码</strong>。</p>
</blockquote>
<p>运行以下命令，FFmpeg 会自动将不同规格的视频解码、统一缩放并重新编码合并：</p>
<pre><code class="language-bash">ffmpeg -i input1.mp4 -i input2.mp4 -filter_complex &quot;[0:v][0:a][1:v][1:a] concat=n=2:v=1:a=1 [v][a]&quot; -map &quot;[v]&quot; -map &quot;[a]&quot; output.mp4
</code></pre>
<h3 id="--1">🔍 参数详解：</h3>
<ul>
<li><code>-filter_complex</code>：启用复杂滤镜图。</li>
<li><code>[0:v][0:a][1:v][1:a]</code>：分别代表第 1 个视频的视频流/音频流，和第 2 个视频的视频流/音频流。</li>
<li><code>concat=n=2:v=1:a=1</code>：告诉滤镜有 <code>n=2</code> 个片段，输出 <code>v=1</code> 个视频流和 <code>a=1</code> 个音频流。</li>
<li><code>[v][a]</code>：将合并后的音视频流命名为 <code>[v]</code> 和 <code>[a]</code>。</li>
<li><code>-map &quot;[v]&quot; -map &quot;[a]&quot;</code>：指定将滤镜输出的流写入最终的 <code>output.mp4</code>。</li>
<li><em>(注意：此命令去掉了 <code>-c copy</code>，因此属于有损转换，速度取决于你的 CPU/GPU 性能。)</em></li>
</ul>
<hr />
<h2 id="--faq">❓ 常见问题与排查 (FAQ)</h2>
<h3 id="1--1">1. 合并后只有第一个片段有声音，后面没声音？</h3>
<ul>
<li><strong>原因</strong>：这通常是因为两个视频的音频采样率（例如一个 44100Hz，一个 48000Hz）或声道数不一致。</li>
<li><strong>解决办法</strong>：建议使用方法三进行重编码合并；或者先单独把音频不一致的片段转换一致，再用方法一无损合并。</li>
</ul>
<h3 id="2--1">2. 视频合并处卡顿、掉帧或音画不同步？</h3>
<ul>
<li><strong>原因</strong>：视频的时间戳（PTS/DTS）在拼接处没有正确衔接，或者两段视频的帧率（FPS）有微小差异（如 29.97fps 和 30fps）。</li>
<li><strong>解决办法</strong>：可以在方法一的命令中加入 <code>-fflags +genpts</code> 参数来尝试重新生成时间戳：</li>
</ul>
<pre><code class="language-bash">ffmpeg -f concat -safe 0 -fflags +genpts -i filelist.txt -c copy output.mp4
</code></pre>
]]></description>
      <category>教程</category>
    </item>
    <item>
      <title>命令行创建Django项目</title>
      <link>https://winston.ink/post/install-django/</link>
      <guid isPermaLink="true">https://winston.ink/post/install-django/</guid>
      <pubDate>Wed, 17 Jun 2026 08:00:00 +0800</pubDate>
      <description><![CDATA[<p>这是一份为你整理的 <strong>Django 项目创建命令行教程</strong>。文档已严格按照 Markdown 格式编写，结构清晰，你可以直接复制并保存为 <code>.md</code> 文件作为你的学习笔记。</p>
<!-- more -->
<hr />
<h1 id="django-">Django 项目创建与基础配置笔记</h1>
<p>本笔记记录了如何完全通过命令行（CLI）从零开始创建一个 Django 项目，并运行开发服务器。</p>
<hr />
<h2 id="-">## 准备工作</h2>
<p>在创建 Django 项目之前，建议为项目创建一个独立的<strong>虚拟环境</strong>，以防不同项目之间的依赖冲突。</p>
<h3 id="1-">1. 创建并激活虚拟环境</h3>
<p>打开终端（Terminal）或命令提示符（CMD），执行以下命令：</p>
<pre><code class="language-bash"># 1. 新建并进入项目总目录
mkdir my_django_project
cd my_django_project

# 2. 创建名为 venv 的虚拟环境
python -m venv venv

# 3. 激活虚拟环境
# Windows (Command Prompt):
venv\Scripts\activate
# Windows (PowerShell):
.\venv\Scripts\Activate.ps1
# macOS / Linux:
source venv/bin/activate

</code></pre>
<blockquote>
<p><strong>提示</strong>：激活成功后，命令行提示符前方会出现 <code>(venv)</code> 字样。</p>
</blockquote>
<h3 id="2--django">2. 安装 Django</h3>
<p>在激活的虚拟环境中，使用 <code>pip</code> 安装最新版的 Django：</p>
<pre><code class="language-bash">pip install django

</code></pre>
<hr />
<h2 id="--django-">## 核心步骤：创建 Django 项目</h2>
<p>Django 提供了内置的命令行工具 <code>django-admin</code> 来自动生成项目结构。</p>
<h3 id="1--1">1. 初始化项目</h3>
<p>运行以下命令来创建一个名为 <code>mysite</code> 的 Django 项目：</p>
<pre><code class="language-bash"># 注意后面的“.”（点号），它代表在当前目录下直接生成项目文件，避免多嵌套一层同名目录
django-admin startproject mysite .

</code></pre>
<h3 id="2-">2. 项目目录结构解析</h3>
<p>执行完上述命令后，你的目录结构应该如下所示：</p>
<pre><code class="language-text">my_django_project/
│
├── manage.py          # 项目的管理工具（运行服务器、数据迁移等都要用到它）
├── venv/              # 虚拟环境文件夹（无需修改）
└── mysite/            # 项目的核心配置包
    ├── __init__.py
    ├── settings.py    # 全局配置文件（数据库、时区、App注册等）
    ├── urls.py        # 路由配置文件（URL 映射）
    ├── asgi.py        # 异步服务网关接口配置
    └── wsgi.py        # 同步服务网关接口配置

</code></pre>
<hr />
<h2 id="--django--app">## 创建 Django 应用 (App)</h2>
<p>在 Django 中，一个<strong>项目 (Project)</strong> 可以包含多个<strong>应用 (App)</strong>。应用是实现具体功能的独立模块（如：博客模块、用户管理模块）。</p>
<h3 id="1--app-">1. 生成 App 目录</h3>
<p>创建一个名为 <code>blog</code> 的应用：</p>
<pre><code class="language-bash">python manage.py startapp blog

</code></pre>
<h3 id="2--app">2. 在配置中注册 App</h3>
<p>创建 App 后，必须让 Django 项目知道它的存在。打开 <code>mysite/settings.py</code>，找到 <code>INSTALLED_APPS</code> 列表，将你的 App 添加进去：</p>
<pre><code class="language-python"># mysite/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
    # 在这里添加你的 App
    'blog', 
]

</code></pre>
<hr />
<h2 id="--1">## 数据库迁移与启动服务</h2>
<h3 id="1--2">1. 执行初始数据迁移</h3>
<p>Django 自带了一些默认应用（如用户认证、后台管理），它们需要数据库表支持。运行以下命令生成默认的 SQLite 数据库并创建表：</p>
<pre><code class="language-bash">python manage.py migrate

</code></pre>
<h3 id="2--1">2. 启动本地开发服务器</h3>
<p>一切就绪后，启动 Django 内置的测试服务器：</p>
<pre><code class="language-bash">python manage.py runserver

</code></pre>
<h3 id="3-">3. 验证成果</h3>
<p>看到终端输出 <code>Starting development server at http://127.0.0.1:8000/</code> 后，打开浏览器访问该网址。如果你看到了一只成功起飞的火箭页面，说明你的 Django 项目已经搭建成功！</p>
<hr />
<h2 id="--2">## 常用命令行备忘录</h2>
<p>在日常开发中，以下命令会频繁使用，建议熟记：</p>
<table>
<thead>
<tr>
<th>命令</th>
<th>作用</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>python manage.py runserver</code></td>
<td>启动开发服务器</td>
</tr>
<tr>
<td><code>python manage.py startapp &lt;app_name&gt;</code></td>
<td>创建一个新的应用</td>
</tr>
<tr>
<td><code>python manage.py makemigrations</code></td>
<td>基于 <code>models.py</code> 的修改生成迁移文件</td>
</tr>
<tr>
<td><code>python manage.py migrate</code></td>
<td>将迁移应用到数据库（实际建表/改表）</td>
</tr>
<tr>
<td><code>python manage.py createsuperuser</code></td>
<td>创建后台管理系统的超级管理员账号</td>
</tr>
<tr>
<td><code>python manage.py shell</code></td>
<td>进入带有 Django 环境的 Python 交互式命令行</td>
</tr>
</tbody>
</table>
<hr />
<p><em>笔记末尾：按 <code>Ctrl + C</code> 可以停止正在运行的开发服务器。退出虚拟环境请输入 <code>deactivate</code>。</em></p>
]]></description>
      <category>教程</category>
    </item>
    <item>
      <title>EdgeTunnel</title>
      <link>https://winston.ink/post/edge-tunnel/</link>
      <guid isPermaLink="true">https://winston.ink/post/edge-tunnel/</guid>
      <pubDate>Mon, 01 Jun 2026 18:00:00 +0800</pubDate>
      <description><![CDATA[<p>edgetunnel 是一个开源的边缘计算代理工具，基于 Cloudflare Workers/Pages 平台构建。它的主要功能是通过边缘网络处理流量，为用户提供科学上网能力。</p>
<!-- more -->
<p>本教程将指导你如何在 Fork 了 <code>cmliu/edgetunnel</code> 仓库后，通过 <strong>Cloudflare Pages + GitHub 联动</strong> 的方式部署属于自己的多功能边缘计算隧道面板。</p>
<hr />
<h2 id="-">📌 准备工作</h2>
<p>在开始部署之前，请确保你已具备以下条件：</p>
<ol>
<li><strong>GitHub 账号</strong>：用于存放 Fork 的项目代码。</li>
<li><strong>Cloudflare (CF) 账号</strong>：用于托管和运行 Pages 边缘服务。</li>
<li><strong>一个自定义域名</strong>：由于 Cloudflare 自带的 <code>pages.dev</code> 域名在国内部分地区可能存在被墙或无法解析的情况，<strong>强烈建议准备一个转入 Cloudflare 解析的自定义次级域名</strong>（例如 <code>vpn.yourdomain.com</code>）。</li>
</ol>
<hr />
<h2 id="-fork-">🛠 步骤一：Fork 项目仓库</h2>
<ol>
<li>访问 edgetunnel 的官方 GitHub 仓库：<a href="https://github.com/cmliu/edgetunnel">https://github.com/cmliu/edgetunnel</a>。</li>
<li>点击页面右上角的 <strong>Fork</strong> 按钮。</li>
<li>在弹出的页面中，保持默认设置，点击 <strong>Create fork</strong>。</li>
<li>（可选）顺手点一个 <strong>Star</strong> 🌟 也是对作者的鼓励。</li>
</ol>
<hr />
<h2 id="--cloudflare--pages-">🛠 步骤二：在 Cloudflare 中创建 Pages 项目</h2>
<ol>
<li>登录你的 <a href="https://dash.cloudflare.com/">Cloudflare 控制台</a>。</li>
<li>在左侧导航栏中，依次点击 <strong>「Workers 和 Pages」</strong> -&gt; <strong>「概述」</strong>。</li>
<li>点击右侧的 <strong>「创建」</strong> 按钮，然后选择 <strong>「Pages」</strong> 标签页。</li>
<li>点击 <strong>「连接到 Git」</strong> 按钮。</li>
<li>选择 <strong>GitHub</strong>（如果第一次使用，需要按照提示授权 Cloudflare 访问你的 GitHub 账号）。</li>
<li>在仓库列表中找到你刚刚 Fork 的 <code>edgetunnel</code> 仓库，选中它并点击 <strong>「开始设置」</strong>。</li>
</ol>
<hr />
<h2 id="--1">🛠 步骤三：配置环境变量与初次部署</h2>
<p>在 <strong>「设置构建和部署」</strong> 页面，我们需要进行以下配置：</p>
<ol>
<li><strong>项目名称</strong>：保持默认或自定义（该名称会决定你默认的 <code>.pages.dev</code> 网址）。</li>
<li><strong>框架预设</strong>：保持默认（无/None）。</li>
<li><strong>配置环境变量（核心步骤）</strong>：
<ul>
<li>展开页面下方的 <strong>「环境变量（高级）」</strong>。</li>
<li>点击 <strong>「添加变量」</strong>。</li>
<li><strong>变量名称</strong> 填写：<code>ADMIN</code></li>
<li><strong>值</strong> 填写：<code>你的管理员密码</code>（此密码用于后续登录后台面板，请务必记牢）。</li>
</ul>
</li>
<li>完成后，点击页面的 <strong>「保存并部署」</strong>。</li>
<li>Cloudflare 将开始初次构建。等待 1-2 分钟，构建完成后点击 <strong>「继续处理站点」</strong>。</li>
</ol>
<blockquote>
<p>⚠️ <strong>注意</strong>：此时虽然提示部署成功，但由于我们还没有绑定数据库（KV 命名空间），此时访问后台会报错。请继续看下一步。</p>
</blockquote>
<hr />
<h2 id="--kv-">🛠 步骤四：绑定 KV 命名空间</h2>
<p>edgetunnel 需要使用 Cloudflare 的 KV（键值对）存储来保存节点配置。</p>
<h3 id="1--kv-">1. 创建 KV 命名空间</h3>
<ol>
<li>返回 Cloudflare 控制台主页，点击左侧导航栏的 <strong>「Workers 和 Pages」</strong> -&gt; <strong>「KV」</strong>。</li>
<li>点击右上角的 <strong>「创建命名空间」</strong>。</li>
<li>命名空间名称可以随意填写（例如：<code>edgetunnel_kv</code>），然后点击 <strong>「添加」</strong>。</li>
</ol>
<h3 id="2--pages--kv-">2. 将 Pages 项目与 KV 绑定</h3>
<ol>
<li>回到你的 <strong>Pages 项目管理页面</strong>。</li>
<li>点击顶部的 <strong>「设置」</strong> 选项卡。</li>
<li>在左侧菜单中选择 <strong>「绑定」</strong>。</li>
<li>在页面右侧找到 <strong>「KV 命名空间绑定」</strong> 区域，点击 <strong>「添加绑定」</strong>。</li>
<li><strong>变量名称</strong> 必须严格填写：<code>KV</code></li>
<li><strong>KV 命名空间</strong> 选择你刚刚创建的命名空间（例如 <code>edgetunnel_kv</code>）。</li>
<li>点击 <strong>「保存」</strong>。</li>
</ol>
<h3 id="3-">3. 重新部署以使绑定生效</h3>
<ol>
<li>切换到 Pages 项目的 <strong>「部署」</strong> 选项卡。</li>
<li>在最新的部署记录（通常是第一条）右侧，点击 <strong>「三个点 (&hellip;)」</strong>。</li>
<li>选择 <strong>「重试部署」</strong>。等待部署重新完成。</li>
</ol>
<hr />
<h2 id="--2">🛠 步骤五：绑定自定义域名（关键）</h2>
<p>Cloudflare Pages 默认分配的 <code>*.pages.dev</code> 域名由于众所周知的原因，国内连接极不稳定。必须绑定自定义域名才能稳定使用。</p>
<ol>
<li>在 Pages 项目管理页面，点击 <strong>「自定义域」</strong> 选项卡。</li>
<li>点击 <strong>「设置自定义域」</strong>。</li>
<li>输入你的次级域名，例如：<code>lizi.yourdomain.com</code>（<strong>切记：请勿直接使用根域名</strong>）。</li>
<li>按照 Cloudflare 提示激活该域名：
<ul>
<li>如果你的域名已经由 Cloudflare 解析，系统会自动帮你添加一条 CNAME 记录，指向 <code>edgetunnel.pages.dev</code>，你只需点击 <strong>「激活域」</strong> 即可。</li>
<li>如果域名在其他第三方解析商，你需要手动去解析商后台添加一条 CNAME 记录。</li>
</ul>
</li>
<li>等待 SSL 证书生效（通常需要几分钟）。</li>
</ol>
<hr />
<h2 id="--3">🎉 步骤六：访问与使用面板</h2>
<ol>
<li>证书生效后，在浏览器中访问：<code>https://你的自定义域名/admin</code>（例如：<code>https://lizi.yourdomain.com/admin</code>）。</li>
<li>输入你在环境变量中设置的 <code>ADMIN</code> 密码，点击登录。</li>
<li>登录成功后，你将进入功能强大的 edgetunnel 2.1 后台管理面板。在面板中，你可以：
<ul>
<li>自动生成 VLESS / Trojan / Shadowsocks 节点。</li>
<li>获取适配 Clash、Sing-box、Surge、Shadowrocket 等客户端的订阅链接。</li>
<li>配合优选 IP API 或配置 <code>PROXYIP</code> 变量进一步优化网络速度。</li>
</ul>
</li>
</ol>
<hr />
<h2 id="--4">💡 进阶技巧：如何同步更新代码？</h2>
<p>由于你是通过 GitHub Fork 部署的，当原作者 <code>cmliu</code> 更新代码时，你只需要：</p>
<ol>
<li>访问你自己的 GitHub <code>edgetunnel</code> 仓库。</li>
<li>如果原作者有更新，GitHub 会提示 <code>This branch is behind cmliu/edgetunnel</code>。</li>
<li>点击 <strong>Sync fork</strong> -&gt; <strong>Update branch</strong>。</li>
<li>你的 GitHub 仓库更新后，<strong>Cloudflare Pages 会自动触发构建并完成更新部署</strong>，全程无需手动干预。</li>
</ol>
]]></description>
      <category>教程</category>
    </item>
    <item>
      <title>驳X上男拳</title>
      <link>https://winston.ink/post/refute-x-simp/</link>
      <guid isPermaLink="true">https://winston.ink/post/refute-x-simp/</guid>
      <pubDate>Thu, 30 Apr 2026 22:30:00 +0800</pubDate>
      <description><![CDATA[<p>假如一个山寨的女式挎包，老板就要以二十万的价格出售。</p>
<ul>
<li>抖音：管我屁事，我又不买，去买摩托车、电脑不香吗？</li>
<li>知乎：理性分析包包材质质感，分析得出只值二十元。</li>
<li>推特：上来就辱骂，材质烂、老板痴心妄想，但是就在摊前徘徊，急得跳脚。</li>
</ul>
<!-- more -->
<p>X上这些打男拳的就像清末的农民起义，乱世的到来破坏了他们老婆孩子热炕头在清政府下苟活的日子，他们不知道民主共和，揭竿而起只是为了回到之前的状态。所以他们的推文很少有男性解放、爱自己、投资自身、不转移支付等观点。女拳胁B和子宫要价，他们讨价还价、求而不得；又没有自己的生活，所以他们的关注点都在国妞身上。他们嘲笑谩骂、道德绑架、动不动就栓等暗里明里的行为表现了对国妞的极度渴望。男女对立最核心的问题：到底是谁离不开谁？这么看，他们真是离不开国妞。这点我倒是很佩服女拳，达不到她们的要求人家真不结婚。我都怀疑如果国妞降低结婚要求，他们反身舔得比谁都快，他们会忘掉前一阶段普男被“镇压”的痛苦，毕竟他们的目的就是结婚生子。现阶段他们舔而不得、心生埋怨，所以才造就他们以这样的方式打拳。我一直认为爱的反义词从来不是恨，是平淡是无视，所以这些人表现出恨女又渴女的拧巴现状。</p>
<p>舔狗从表象上分为两种。第一种是显性舔狗。他们会无脑的相信女人，认为女人都是善良美好的，相信单方面持之以恒的付出总会感动对方。第二种就是隐形舔狗。他们困死在“男性就应该成家繁衍”这种思维之中。他们无法达成这种想法，就对女性散发着一种求而不得的埋怨之气。人家女拳在研究吃喝玩乐、精致生活、要特权、脱产考公、PUA龟男舔狗、高嫁、骗彩礼、死老公、分财产。人家早就摆脱传统道德枷锁，所作所为就是为了钱和权。你在看看这群隐形舔狗在研究什么。首先最下头的是质疑对方要价高；自由市场，你出不起的价格，有的是龟男舔狗上杆子；嘲笑对方长得丑、想得美，大龄没有生育能力被剩下。这些难道不是她们的自由吗？他们就是想买又买不起，拿着传统的“三从四德”去绑架攻击对方。自己喷的起劲，关键对方根本没有“道德”。他们主张男性要有生育权，关心生育率这种宏观事件；更有甚者，高举董的锁链思想，意淫口嗨一副离不开女人的嘴脸。说来说去就是为了女人和生育。两者相比，高下立判，你有求于对方，你拿什么和女拳打？</p>
<p>我一直秉持着反女拳就要先喷舔狗观念，毕竟女拳都是被这帮玩意抬高供养出来的。舔狗又分三个层级。</p>
<ol>
<li>自己舔，感动自己，比如胖猫。</li>
<li>自己舔，还看不惯别人不舔，比如抨击男性不帮忙女性是不绅士。</li>
<li>舔而不得心生埋怨，又不自知；高举反女拳的旗帜去打拳，其实是扯男性解放(摒弃儒教大男子主义)的后腿。</li>
</ol>
<p>纵观日韩女拳的失败，完全是因为她们只要特权不付出义务，只会嘴上叫嚣。日男韩男是通过平等对待、不支付转移、投资自身、消费抉择。通过实际行动告诉日女韩女、日韩政府，离开日女韩女完全没什么问题。日韩生育率雪崩这是结果，所有我特别反感X上的男拳对中国生育率的担忧。</p>
<p>最后，别指望上层对普通男性的困境的理解，普通男性和有钱/权的男性是两个世界的人。有钱/权的男性不是女拳讨伐的对象、反而是她们竞争追逐的对象。所以人家凭什么和你感同身受，这也是上层很容易制定利女政策的原因。利女一方面是他们认为国男为了性和生育离不开国妞，偏偏国男又不争气；另一方面为了拉动消费，男性消费普片理性，通过结婚生育来达到支付转移。</p>
<p>口嗨意淫是没什么用的，普通男性只能从小实事做起。</p>
<ol>
<li>对舔狗的围剿、痛打落水狗。
<ul>
<li>在此声明，胖猫是反面案例，没有什么值得怜悯的。</li>
<li>嘲笑被骗高额彩礼的龟男，高彩礼是国男供出来的。</li>
</ul>
</li>
<li>对女性平等对待。
<ul>
<li>帮不帮陌生女性看自己能力和心情了，不要有绅士思维的顾虑。</li>
<li>和女性发生争执，有没有把他当作男性进行“决斗”。</li>
<li>占据主动权，对国女能谈就谈、不能谈拉倒，能结婚就结婚、不愿结婚拉倒，愿意生孩子就生、不愿意生拉倒。</li>
</ul>
</li>
<li>投资自己，把钱花在自己身上。
<ul>
<li>把钱花在支持男性解放观点的公司；同时警惕消费陷阱，不要像女拳那样容易被消费主义洗脑。</li>
<li>资本这玩意就先狗一样，谁直接给他骨头(钱)，他就对谁摇尾巴。之前龟男舔狗支付转移，所有他们舔女性。</li>
<li>统治层面，房车生育之前都是女性要求/把持才能实现，所有上层也利女。谁让国男就是想结婚生子。</li>
</ul>
</li>
<li>相信法律但是不要迷信法律。法律给不了自己公道，自己就去寻求公道。</li>
</ol>
<p>就写这些。如果你不赞同我的观点，可以反驳我。但是如果你直接骂我，那就是对号入座，戳痛你舔狗的本质了。</p>
]]></description>
      <category>散文</category>
    </item>
    <item>
      <title>AnyDesk</title>
      <link>https://winston.ink/post/anydesk/</link>
      <guid isPermaLink="true">https://winston.ink/post/anydesk/</guid>
      <pubDate>Mon, 24 Nov 2025 17:00:00 +0800</pubDate>
      <description><![CDATA[<p>AnyDesk是一款由德国公司AnyDesk Software GmbH推出的远程桌面软件，用户可以通过该软件远程控制计算机，同时还能与被控制的计算机之间进行文件传输。</p>
<!-- more -->
<p>2014年，AnyDesk Software GmbH在德国斯图加特成立，目前在美国和中国都设有分公司。2018年5月，AnyDesk在A轮融资中获得由EQT Ventures领投的650万欧元资金投资。</p>
<p><strong>下载地址：</strong><br />
<a href="https://bucket.lanzoub.com/izTBh3c16jvi" target="_blank">AnyDesk_V7.0.0.exe</a><br />
<a href="https://bucket.lanzoub.com/i0MQ43c16jsf" target="_blank">AnyDesk_V7.0.0.dmg</a></p>
]]></description>
      <category>软件</category>
      <enclosure url="https://winston.ink/post-images/anydesk.jpg" length="0" type="image/jpeg"></enclosure>
    </item>
    <item>
      <title>FastStone Capture</title>
      <link>https://winston.ink/post/faststone-capture/</link>
      <guid isPermaLink="true">https://winston.ink/post/faststone-capture/</guid>
      <pubDate>Thu, 24 Apr 2025 15:00:00 +0800</pubDate>
      <description><![CDATA[<p>FastStone Capture 一个极简主义的应用程序<br />
支持屏幕录制、滚动截图、高清长图、图片编辑、图片转PDF格式、屏幕取色</p>
<!-- more -->
<p>功能简介：</p>
<p>高清截屏，给您最清晰的表达<br />
可抓取某窗口或对象图片,全屏或以矩形模式抓图，甚至可以按照手绘的任意形状抓图。</p>
<p>滚动截图，细节内容一览无余<br />
选定某个窗口或对象区域,轻点鼠标即可进行滚动截图,获取高清长图。</p>
<p>屏幕录制，步骤操作细致流畅<br />
屏幕录像机功能可以将窗口/对象、矩形区域或全屏区域的屏幕录制为高清晰视频。</p>
<p>图片编辑，样式丰富应有尽有<br />
所有主流图片格式,以其独有的光滑和毛刺处理技术让图片更加清晰,提供缩放,旋转,减切,颜色调整功能。</p>
<p><strong>下载地址：</strong><br />
<a href="https://bucket.lanzoub.com/iktSw2ucfq4f" target="_blank">FastStoneCapture_V9.7.zip</a></p>
]]></description>
      <category>软件</category>
      <enclosure url="https://winston.ink/post-images/faststone-capture.jpg" length="0" type="image/jpeg"></enclosure>
    </item>
    <item>
      <title>批量修改文件名</title>
      <link>https://winston.ink/post/win-rename/</link>
      <guid isPermaLink="true">https://winston.ink/post/win-rename/</guid>
      <pubDate>Fri, 07 Feb 2025 22:00:00 +0800</pubDate>
      <description><![CDATA[<p>批量修改文件名4.4发布</p>
<!-- more -->
<p>主要更新:</p>
<ul>
<li>增加一个AI处理功能。一些网友可能有一些复杂特殊的需求，自己不知道怎么操作，来咨询我，一步两步不能解决，就很麻烦，这次用AI能很好的解决问题，只要你问得够详细。</li>
<li>增加一个清空按钮</li>
<li>增加在文件名前添加所属文件夹名称的功能。</li>
</ul>
<p><strong>下载地址：</strong><br />
<a href="https://bucket.lanzoub.com/iOOAz2n1r7wd" target="_blank">WinRename_V4.4.exe</a></p>
]]></description>
      <category>软件</category>
      <enclosure url="https://winston.ink/post-images/win-rename.jpg" length="0" type="image/jpeg"></enclosure>
    </item>
    <item>
      <title>BandiZip</title>
      <link>https://winston.ink/post/bandizip/</link>
      <guid isPermaLink="true">https://winston.ink/post/bandizip/</guid>
      <pubDate>Wed, 22 Jan 2025 14:00:00 +0800</pubDate>
      <description><![CDATA[<p>Bandizip 是一款压缩软件，它支持Zip、7Z 和 RAR 以及其它压缩格式。它拥有非常快速的压缩和解压缩的算法，适用于多核心压缩、快速拖放、高速压缩等功能。</p>
<!-- more -->
<p>支持压缩: ZIP, 7Z, ZIPX, EXE, TAR, TGZ, LZH, ISO, GZ, XZ</p>
<p>支持解压缩: 7Z, ACE, AES, ALZ, ARJ, BH, BIN, BZ, BZ2, CAB, MSI, EGG, GZ, IMG, ISO, ISZ, LHA, LZ, LZH, LZMA, PMA, RAR, TAR, TBZ, TBZ2, TGZ, TLZ, TXZ, UDF, WIM, XPI, XZ, Z, ZIP, ZIPX, ZPAQ, ZSTD, BR</p>
<p><strong>下载地址：</strong><br />
<a href="https://bucket.lanzoub.com/iChtg2lmnb4j" target="_blank">BandiZip_V6.29.exe</a><br />
<a href="https://bucket.lanzoub.com/iHO8m2lmnadc" target="_blank">BandiZip_V7.30.dmg</a></p>
]]></description>
      <category>软件</category>
      <enclosure url="https://winston.ink/post-images/bandizip.jpg" length="0" type="image/jpeg"></enclosure>
    </item>
  </channel>
</rss>