<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="https://remrin.dev/feed" rel="self" type="application/rss+xml"/>
<title>レムりん</title>
<link>https://remrin.dev</link>
<description>唯有孤独永恒</description>
<language>zh-CN</language>
<copyright>© R </copyright>
<pubDate>Mon, 06 Apr 2026 12:25:46 GMT</pubDate>
<generator>Mix Space CMS (https://github.com/mx-space)</generator>
<docs>https://mx-space.js.org</docs>
<image>
    <url>https://avatars.githubusercontent.com/u/29149596?v=4</url>
    <title>レムりん</title>
    <link>https://remrin.dev</link>
</image>
<item>
    <title>提问的艺术</title>
    <link>https://remrin.dev/notes/7</link>
    <pubDate>Fri, 16 May 2025 06:08:08 GMT</pubDate>
    <description>Don&apos;t ask to ask, just ask
How do I ask a good que</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/notes/7'>https://remrin.dev/notes/7</a></blockquote>
      <p><a href="https://dontasktoask.com/">Don&#39;t ask to ask, just ask</a>
<a href="https://stackoverflow.com/help/how-to-ask">How do I ask a good question?</a>
<a href="http://catb.org/~esr/faqs/smart-questions.html">How To Ask Questions The Smart Way</a></p>

      <p style='text-align: right'>
      <a href='https://remrin.dev/notes/7#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6826d648a75b948e7d38371f</guid>
  <category>notes</category>
false
 </item>
  <item>
    <title>修复 远程主机不满足运行VS Code服务器的先决条件</title>
    <link>https://remrin.dev/posts/dev/vscode-remote-fix</link>
    <pubDate>Fri, 09 May 2025 09:20:23 GMT</pubDate>
    <description>问题

你说的对，但是此远程主机可能不符合 glibc 和 libstdc++ VS Code 服务</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/posts/dev/vscode-remote-fix'>https://remrin.dev/posts/dev/vscode-remote-fix</a></blockquote>
      <h2>问题</h2>
<p>你说的对，但是此远程主机可能不符合 <code>glibc</code> 和 <code>libstdc++</code> <code>VS Code</code> 服务器的先决条件</p>
<img src="https://remrin.dev/api/v2/objects/file/nzuolu5zc5w3p8hn6d.png"/>

<h2>前言</h2>
<blockquote>
<p>自 VS Code 1.99 版本（大约 2025 年 3 月起），VS Code 官方对其预构建服务器在 Linux 系统上的运行环境提出了新的要求：目标系统需搭载 glibc 2.28 或更高版本。这意味着，像 Debian 10、RHEL 8 或 Ubuntu 20.04 这样的现代发行版可以无缝支持，但也确实给仍在使用一些经典 Linux 发行版（如 CentOS 7）的用户带来了一些挑战。详细的官方说明可以参考 <a href="https://code.visualstudio.com/docs/remote/faq#_can-i-run-vs-code-server-on-older-linux-distributions">这篇 FAQ</a>。</p>
</blockquote>
<p>好在微软还留了个窗户</p>
<blockquote>
<p>如果提供了包含上述所需库版本的 <a href="https://aka.ms/vscode-remote/download/ssh">sysroot</a>，VS Code 仍允许用户通过Remote - SSH扩展连接到 VS Code 不支持的操作系统（glibc 版本不大于 2.28 且 libstdc++ 版本不大于 3.4.25 的操作系统）。这种方法可以让您和您的组织有更多时间迁移到更新的 Linux 发行版。</p>
</blockquote>
<h3>适合这篇教程的情况</h3>
<blockquote>
<p>系统为 CentOS 7.9 / RHEL 7.9 / Oracle Linux 7.9 / Ubuntu 18.04 ,且服务器没有 root 权限，又不想回退到 1.98 版本</p>
</blockquote>
<p>::: warning
这只是一种技术解决方法，并不是官方支持的使用场景。使用前请谨慎考虑。
:::</p>
<h2>详细步骤指南</h2>
<p>正是基于这样的背景，我发现了<a href="https://github.com/ursetto/vscode-sysroot.git">vscode-sysroot</a> 这个项目。项目本质是用 Docker 及 <code>crosstool-ng</code> 工具，自行编译了一个包含 glibc 2.28 并能兼容老版本内核（例如 3.10）的 sysroot。并且包含 <code>patchelf</code> 。完美契合我目前的状况，所以就直接用了这个项目。</p>
<h3>1. 准备 Docker 环境</h3>
<p>首先，请确保有本地环境或者服务器已经安装并成功运行了 <code>Docker</code>。这是编译 <code>sysroot</code> 的基础。</p>
<h3>2. 构建 Sysroot 压缩包</h3>
<p>然后，克隆一下 <code>vscode-sysroot</code> 这个仓库，需要用这个仓库来编译并生成 <code>sysroot</code> 压缩包。</p>
<pre><code class="language-bash">git clone https://github.com/ursetto/vscode-sysroot.git
cd vscode-sysroot</code></pre><p>项目提供了两种构建方式：</p>
<h4>构建 Docker 镜像</h4>
<pre><code class="language-bash">docker build -t my-vscode-sysroot .</code></pre><h4>创建一个临时容器</h4>
<pre><code class="language-bash">docker create --name temp-sysroot-container my-vscode-sysroot</code></pre><h4>从容器的 /src 目录将生成的压缩包复制到当前主机目录</h4>
<pre><code class="language-bash">docker cp temp-sysroot-container:/src/vscode-sysroot-x86_64-linux-gnu.tgz ./vscode-sysroot-x86_64-linux-gnu.tgz</code></pre><h4>删除临时容器</h4>
<pre><code class="language-bash">docker rm temp-sysroot-container</code></pre><h4>(可选) 如果你想进入容器内部进行调试或检查</h4>
<pre><code class="language-bash">docker run -it --rm my-vscode-sysroot bash</code></pre><h3>3. 部署打包后的 Sysroot 到服务器</h3>
<h4>上传 Sysroot 压缩包</h4>
<p>首先，将 <code>vscode-sysroot-x86_64-linux-gnu.tgz</code> 文件上传到服务器。可以使用 <code>scp</code> 或其他文件传输工具：</p>
<pre><code class="language-bash">scp ./vscode-sysroot-x86_64-linux-gnu.tgz user@your-remote-server:~</code></pre><h4>解压 Sysroot</h4>
<p>登录到远程服务器，然后执行以下命令来创建目标目录并解压 sysroot。路径是 <code>~/.vscode-server/sysroot/</code></p>
<pre><code class="language-bash"># 在远程服务器上执行
mkdir -p ~/.vscode-server/sysroot
# 假设压缩包已上传到用户主目录 ~
tar zxvf ~/vscode-sysroot-x86_64-linux-gnu.tgz -C ~/.vscode-server/sysroot --strip-components=1</code></pre><p><strong>小贴士</strong>：<code>tar</code> 命令中的 <code>--strip-components=1</code> 参数是为了处理压缩包内部可能存在的额外顶层目录。如果解压后发现文件路径多了一层 (例如 <code>~/.vscode-server/sysroot/vscode-sysroot-x86_64-linux-gnu/usr/...</code>)，那就说明你需要这个参数。如果解压后 <code>usr</code>, <code>lib</code> 等目录直接位于 <code>~/.vscode-server/sysroot/</code> 下，则可以省略它或将值设为 <code>0</code>。</p>
<h4>部署 <code>sysroot.sh</code> 脚本</h4>
<p>然后，将 <code>vscode-sysroot</code> 项目根目录下的 <code>sysroot.sh</code> 脚本复制到远程服务器的 <code>~/.vscode-server/</code> 目录下，并确保它名为 <code>sysroot.sh</code>：</p>
<pre><code class="language-bash"># 在本地机器上执行 (确保你在 vscode-sysroot 项目的根目录)
scp sysroot.sh user@your-remote-server:~/.vscode-server/sysroot.sh</code></pre><h4>配置 Shell 环境</h4>
<p>为了让 VS Code Server 启动时能自动加载我们准备好的 sysroot 环境，需要在远程服务器的 shell 配置文件（通常是 <code>~/.bashrc</code> 或 <code>~/.zshrc</code>，取决于你使用的 shell）中添加一行命令来引入 <code>sysroot.sh</code>：</p>
<pre><code class="language-bash"># 在远程服务器上执行
echo 'source ~/.vscode-server/sysroot.sh' &gt;&gt; ~/.bashrc
# 如果你使用 zsh，则改为:
# echo 'source ~/.vscode-server/sysroot.sh' &gt;&gt; ~/.zshrc</code></pre><p>修改保存后，记得重新加载配置文件或直接重新登录服务器，以使设置生效：</p>
<pre><code class="language-bash"># 在远程服务器上执行
source ~/.bashrc
# 或者 source ~/.zshrc</code></pre><h3>4. 连接和验证</h3>
<p>重新打开 VS Code 并链接到远程服务器，不出意外应该已经好了。</p>

      <p style='text-align: right'>
      <a href='https://remrin.dev/posts/dev/vscode-remote-fix#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">681dc8d79e6964caeb1ad52e</guid>
  <category>posts</category>
<category>开发</category>
 </item>
  <item>
    <title>oh-my-zsh中的 git 别名</title>
    <link>https://remrin.dev/notes/6</link>
    <pubDate>Wed, 26 Jun 2024 10:58:39 GMT</pubDate>
    <description>oh my zsh 会自动启用 git 插件，默认有很多方便的别名，在此记录一下，可以使用下面的命令</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/notes/6'>https://remrin.dev/notes/6</a></blockquote>
      <blockquote>
<p>oh my zsh 会自动启用 <code>git</code> 插件，默认有很多方便的别名，在此记录一下，可以使用下面的命令查看 <code>git</code> 插件具体替换了什么</p>
</blockquote>
<pre><code class="language-bash">cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh</code></pre><h2>别名</h2>
<table>
<thead>
<tr>
<th align="left">别名</th>
<th align="left">原命令</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>grt</code></td>
<td align="left"><code>cd &quot;$(git rev-parse --show-toplevel || echo .)&quot;</code></td>
</tr>
<tr>
<td align="left"><code>ggpnp</code></td>
<td align="left"><code>ggl &amp;&amp; ggp</code></td>
</tr>
<tr>
<td align="left"><code>ggpur</code></td>
<td align="left"><code>ggu</code></td>
</tr>
<tr>
<td align="left"><code>g</code></td>
<td align="left"><code>git</code></td>
</tr>
<tr>
<td align="left"><code>ga</code></td>
<td align="left"><code>git add</code></td>
</tr>
<tr>
<td align="left"><code>gaa</code></td>
<td align="left"><code>git add --all</code></td>
</tr>
<tr>
<td align="left"><code>gapa</code></td>
<td align="left"><code>git add --patch</code></td>
</tr>
<tr>
<td align="left"><code>gau</code></td>
<td align="left"><code>git add --update</code></td>
</tr>
<tr>
<td align="left"><code>gav</code></td>
<td align="left"><code>git add --verbose</code></td>
</tr>
<tr>
<td align="left"><code>gwip</code></td>
<td align="left"><code>git add -A; git rm $(git ls-files --deleted) 2&gt; /dev/null; git commit --no-verify --no-gpg-sign --message &quot;--wip-- [skip ci]&quot;</code></td>
</tr>
<tr>
<td align="left"><code>gam</code></td>
<td align="left"><code>git am</code></td>
</tr>
<tr>
<td align="left"><code>gama</code></td>
<td align="left"><code>git am --abort</code></td>
</tr>
<tr>
<td align="left"><code>gamc</code></td>
<td align="left"><code>git am --continue</code></td>
</tr>
<tr>
<td align="left"><code>gamscp</code></td>
<td align="left"><code>git am --show-current-patch</code></td>
</tr>
<tr>
<td align="left"><code>gams</code></td>
<td align="left"><code>git am --skip</code></td>
</tr>
<tr>
<td align="left"><code>gap</code></td>
<td align="left"><code>git apply</code></td>
</tr>
<tr>
<td align="left"><code>gapt</code></td>
<td align="left"><code>git apply --3way</code></td>
</tr>
<tr>
<td align="left"><code>gbs</code></td>
<td align="left"><code>git bisect</code></td>
</tr>
<tr>
<td align="left"><code>gbsb</code></td>
<td align="left"><code>git bisect bad</code></td>
</tr>
<tr>
<td align="left"><code>gbsg</code></td>
<td align="left"><code>git bisect good</code></td>
</tr>
<tr>
<td align="left"><code>gbsn</code></td>
<td align="left"><code>git bisect new</code></td>
</tr>
<tr>
<td align="left"><code>gbso</code></td>
<td align="left"><code>git bisect old</code></td>
</tr>
<tr>
<td align="left"><code>gbsr</code></td>
<td align="left"><code>git bisect reset</code></td>
</tr>
<tr>
<td align="left"><code>gbss</code></td>
<td align="left"><code>git bisect start</code></td>
</tr>
<tr>
<td align="left"><code>gbl</code></td>
<td align="left"><code>git blame -w</code></td>
</tr>
<tr>
<td align="left"><code>gb</code></td>
<td align="left"><code>git branch</code></td>
</tr>
<tr>
<td align="left"><code>gba</code></td>
<td align="left"><code>git branch --all</code></td>
</tr>
<tr>
<td align="left"><code>gbd</code></td>
<td align="left"><code>git branch --delete</code></td>
</tr>
<tr>
<td align="left"><code>gbD</code></td>
<td align="left"><code>git branch --delete --force</code></td>
</tr>
<tr>
<td align="left"><code>gbgd</code></td>
<td align="left"><code>LANG=C git branch --no-color -vv | grep &quot;: gone\]&quot; | cut -c 3- | awk &#39;&quot;&#39;&quot;&#39;{print $1}&#39;&quot;&#39;&quot;&#39; | xargs git branch -d</code></td>
</tr>
<tr>
<td align="left"><code>gbgD</code></td>
<td align="left"><code>LANG=C git branch --no-color -vv | grep &quot;: gone\]&quot; | cut -c 3- | awk &#39;&quot;&#39;&quot;&#39;{print $1}&#39;&quot;&#39;&quot;&#39; | xargs git branch -D</code></td>
</tr>
<tr>
<td align="left"><code>gbm</code></td>
<td align="left"><code>git branch --move</code></td>
</tr>
<tr>
<td align="left"><code>gbnm</code></td>
<td align="left"><code>git branch --no-merged</code></td>
</tr>
<tr>
<td align="left"><code>gbr</code></td>
<td align="left"><code>git branch --remote</code></td>
</tr>
<tr>
<td align="left"><code>ggsup</code></td>
<td align="left"><code>git branch --set-upstream-to=origin/$(git_current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gbg</code></td>
<td align="left"><code>LANG=C git branch -vv | grep &quot;: gone\]&quot;</code></td>
</tr>
<tr>
<td align="left"><code>gco</code></td>
<td align="left"><code>git checkout</code></td>
</tr>
<tr>
<td align="left"><code>gcor</code></td>
<td align="left"><code>git checkout --recurse-submodules</code></td>
</tr>
<tr>
<td align="left"><code>gcb</code></td>
<td align="left"><code>git checkout -b</code></td>
</tr>
<tr>
<td align="left"><code>gcB</code></td>
<td align="left"><code>git checkout -B</code></td>
</tr>
<tr>
<td align="left"><code>gcd</code></td>
<td align="left"><code>git checkout $(git_develop_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gcm</code></td>
<td align="left"><code>git checkout $(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gcp</code></td>
<td align="left"><code>git cherry-pick</code></td>
</tr>
<tr>
<td align="left"><code>gcpa</code></td>
<td align="left"><code>git cherry-pick --abort</code></td>
</tr>
<tr>
<td align="left"><code>gcpc</code></td>
<td align="left"><code>git cherry-pick --continue</code></td>
</tr>
<tr>
<td align="left"><code>gclean</code></td>
<td align="left"><code>git clean --interactive -d</code></td>
</tr>
<tr>
<td align="left"><code>gcl</code></td>
<td align="left"><code>git clone --recurse-submodules</code></td>
</tr>
<tr>
<td align="left"><code>gccd</code></td>
<td align="left"><code>git clone --recurse-submodules &quot;$@&quot; &amp;&amp; cd &quot;$(basename $\_ .git)&quot;</code></td>
</tr>
<tr>
<td align="left"><code>gcam</code></td>
<td align="left"><code>git commit --all --message</code></td>
</tr>
<tr>
<td align="left"><code>gcas</code></td>
<td align="left"><code>git commit --all --signoff</code></td>
</tr>
<tr>
<td align="left"><code>gcasm</code></td>
<td align="left"><code>git commit --all --signoff --message</code></td>
</tr>
<tr>
<td align="left"><code>gcmsg</code></td>
<td align="left"><code>git commit --message</code></td>
</tr>
<tr>
<td align="left"><code>gcsm</code></td>
<td align="left"><code>git commit --signoff --message</code></td>
</tr>
<tr>
<td align="left"><code>gc</code></td>
<td align="left"><code>git commit --verbose</code></td>
</tr>
<tr>
<td align="left"><code>gca</code></td>
<td align="left"><code>git commit --verbose --all</code></td>
</tr>
<tr>
<td align="left"><code>gca!</code></td>
<td align="left"><code>git commit --verbose --all --amend</code></td>
</tr>
<tr>
<td align="left"><code>gcan!</code></td>
<td align="left"><code>git commit --verbose --all --no-edit --amend</code></td>
</tr>
<tr>
<td align="left"><code>gcans!</code></td>
<td align="left"><code>git commit --verbose --all --signoff --no-edit --amend</code></td>
</tr>
<tr>
<td align="left"><code>gcann!</code></td>
<td align="left"><code>git commit --verbose --all --date=now --no-edit --amend</code></td>
</tr>
<tr>
<td align="left"><code>gc!</code></td>
<td align="left"><code>git commit --verbose --amend</code></td>
</tr>
<tr>
<td align="left"><code>gcn!</code></td>
<td align="left"><code>git commit --verbose --no-edit --amend</code></td>
</tr>
<tr>
<td align="left"><code>gcs</code></td>
<td align="left"><code>git commit -S</code></td>
</tr>
<tr>
<td align="left"><code>gcss</code></td>
<td align="left"><code>git commit -S -s</code></td>
</tr>
<tr>
<td align="left"><code>gcssm</code></td>
<td align="left"><code>git commit -S -s -m</code></td>
</tr>
<tr>
<td align="left"><code>gcf</code></td>
<td align="left"><code>git config --list</code></td>
</tr>
<tr>
<td align="left"><code>gdct</code></td>
<td align="left"><code>git describe --tags $(git rev-list --tags --max-count=1)</code></td>
</tr>
<tr>
<td align="left"><code>gd</code></td>
<td align="left"><code>git diff</code></td>
</tr>
<tr>
<td align="left"><code>gdca</code></td>
<td align="left"><code>git diff --cached</code></td>
</tr>
<tr>
<td align="left"><code>gdcw</code></td>
<td align="left"><code>git diff --cached --word-diff</code></td>
</tr>
<tr>
<td align="left"><code>gds</code></td>
<td align="left"><code>git diff --staged</code></td>
</tr>
<tr>
<td align="left"><code>gdw</code></td>
<td align="left"><code>git diff --word-diff</code></td>
</tr>
<tr>
<td align="left"><code>gdv</code></td>
<td align="left"><code>git diff -w &quot;$@&quot; | view -</code></td>
</tr>
<tr>
<td align="left"><code>gdup</code></td>
<td align="left"><code>git diff @{upstream}</code></td>
</tr>
<tr>
<td align="left"><code>gdnolock</code></td>
<td align="left"><code>git diff $@ &quot;:(exclude)package-lock.json&quot; &quot;:(exclude)\*.lock&quot;</code></td>
</tr>
<tr>
<td align="left"><code>gdt</code></td>
<td align="left"><code>git diff-tree --no-commit-id --name-only -r</code></td>
</tr>
<tr>
<td align="left"><code>gf</code></td>
<td align="left"><code>git fetch</code></td>
</tr>
<tr>
<td align="left"><code>gfa</code></td>
<td align="left"><code>git fetch --all --prune</code></td>
</tr>
<tr>
<td align="left"><code>gfo</code></td>
<td align="left"><code>git fetch origin</code></td>
</tr>
<tr>
<td align="left"><code>gg</code></td>
<td align="left"><code>git gui citool</code></td>
</tr>
<tr>
<td align="left"><code>gga</code></td>
<td align="left"><code>git gui citool --amend</code></td>
</tr>
<tr>
<td align="left"><code>ghh</code></td>
<td align="left"><code>git help</code></td>
</tr>
<tr>
<td align="left"><code>glgg</code></td>
<td align="left"><code>git log --graph</code></td>
</tr>
<tr>
<td align="left"><code>glgga</code></td>
<td align="left"><code>git log --graph --decorate --all</code></td>
</tr>
<tr>
<td align="left"><code>glgm</code></td>
<td align="left"><code>git log --graph --max-count=10</code></td>
</tr>
<tr>
<td align="left"><code>glod</code></td>
<td align="left"><code>git log --graph --pretty=&#39;%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)&lt;%an&gt;%Creset&#39;</code></td>
</tr>
<tr>
<td align="left"><code>glods</code></td>
<td align="left"><code>git log --graph --pretty=&#39;%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)&lt;%an&gt;%Creset&#39; --date=short</code></td>
</tr>
<tr>
<td align="left"><code>glol</code></td>
<td align="left"><code>git log --graph --pretty=&#39;%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)&lt;%an&gt;%Creset&#39;</code></td>
</tr>
<tr>
<td align="left"><code>glola</code></td>
<td align="left"><code>git log --graph --pretty=&#39;%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)&lt;%an&gt;%Creset&#39; --all</code></td>
</tr>
<tr>
<td align="left"><code>glols</code></td>
<td align="left"><code>git log --graph --pretty=&#39;%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)&lt;%an&gt;%Creset&#39; --stat</code></td>
</tr>
<tr>
<td align="left"><code>glo</code></td>
<td align="left"><code>git log --oneline --decorate</code></td>
</tr>
<tr>
<td align="left"><code>glog</code></td>
<td align="left"><code>git log --oneline --decorate --graph</code></td>
</tr>
<tr>
<td align="left"><code>gloga</code></td>
<td align="left"><code>git log --oneline --decorate --graph --all</code></td>
</tr>
<tr>
<td align="left"><code>glp</code></td>
<td align="left"><code>git log --pretty=&lt;format&gt;</code></td>
</tr>
<tr>
<td align="left"><code>glg</code></td>
<td align="left"><code>git log --stat</code></td>
</tr>
<tr>
<td align="left"><code>glgp</code></td>
<td align="left"><code>git log --stat --patch</code></td>
</tr>
<tr>
<td align="left"><code>gignored</code></td>
<td align="left"><code>git ls-files -v | grep &quot;^[[:lower:]]&quot;</code></td>
</tr>
<tr>
<td align="left"><code>gfg</code></td>
<td align="left"><code>git ls-files | grep</code></td>
</tr>
<tr>
<td align="left"><code>gm</code></td>
<td align="left"><code>git merge</code></td>
</tr>
<tr>
<td align="left"><code>gma</code></td>
<td align="left"><code>git merge --abort</code></td>
</tr>
<tr>
<td align="left"><code>gmc</code></td>
<td align="left"><code>git merge --continue</code></td>
</tr>
<tr>
<td align="left"><code>gms</code></td>
<td align="left"><code>git merge --squash</code></td>
</tr>
<tr>
<td align="left"><code>gmom</code></td>
<td align="left"><code>git merge origin/$(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gmum</code></td>
<td align="left"><code>git merge upstream/$(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gmtl</code></td>
<td align="left"><code>git mergetool --no-prompt</code></td>
</tr>
<tr>
<td align="left"><code>gmtlvim</code></td>
<td align="left"><code>git mergetool --no-prompt --tool=vimdiff</code></td>
</tr>
<tr>
<td align="left"><code>gl</code></td>
<td align="left"><code>git pull</code></td>
</tr>
<tr>
<td align="left"><code>gpr</code></td>
<td align="left"><code>git pull --rebase</code></td>
</tr>
<tr>
<td align="left"><code>gprv</code></td>
<td align="left"><code>git pull --rebase -v</code></td>
</tr>
<tr>
<td align="left"><code>gpra</code></td>
<td align="left"><code>git pull --rebase --autostash</code></td>
</tr>
<tr>
<td align="left"><code>gprav</code></td>
<td align="left"><code>git pull --rebase --autostash -v</code></td>
</tr>
<tr>
<td align="left"><code>gprom</code></td>
<td align="left"><code>git pull --rebase origin $(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gpromi</code></td>
<td align="left"><code>git pull --rebase=interactive origin $(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>ggpull</code></td>
<td align="left"><code>git pull origin &quot;$(git_current_branch)&quot;</code></td>
</tr>
<tr>
<td align="left"><code>ggl</code></td>
<td align="left"><code>git pull origin $(current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gluc</code></td>
<td align="left"><code>git pull upstream $(git_current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>glum</code></td>
<td align="left"><code>git pull upstream $(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gp</code></td>
<td align="left"><code>git push</code></td>
</tr>
<tr>
<td align="left"><code>gpd</code></td>
<td align="left"><code>git push --dry-run</code></td>
</tr>
<tr>
<td align="left"><code>gpf!</code></td>
<td align="left"><code>git push --force</code></td>
</tr>
<tr>
<td align="left"><code>ggf</code></td>
<td align="left"><code>git push --force origin $(current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gpf</code></td>
<td align="left">On Git &gt;= 2.30: <code>git push --force-with-lease --force-if-includes</code></td>
</tr>
<tr>
<td align="left"><code>gpf</code></td>
<td align="left">On Git &lt; 2.30: <code>git push --force-with-lease</code></td>
</tr>
<tr>
<td align="left"><code>ggfl</code></td>
<td align="left"><code>git push --force-with-lease origin $(current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gpsup</code></td>
<td align="left"><code>git push --set-upstream origin $(git_current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gpsupf</code></td>
<td align="left">On Git &gt;= 2.30: <code>git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes</code></td>
</tr>
<tr>
<td align="left"><code>gpsupf</code></td>
<td align="left">On Git &lt; 2.30: <code>git push --set-upstream origin $(git_current_branch) --force-with-lease</code></td>
</tr>
<tr>
<td align="left"><code>gpv</code></td>
<td align="left"><code>git push --verbose</code></td>
</tr>
<tr>
<td align="left"><code>gpoat</code></td>
<td align="left"><code>git push origin --all &amp;&amp; git push origin --tags</code></td>
</tr>
<tr>
<td align="left"><code>gpod</code></td>
<td align="left"><code>git push origin --delete</code></td>
</tr>
<tr>
<td align="left"><code>ggpush</code></td>
<td align="left"><code>git push origin &quot;$(git_current_branch)&quot;</code></td>
</tr>
<tr>
<td align="left"><code>ggp</code></td>
<td align="left"><code>git push origin $(current_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gpu</code></td>
<td align="left"><code>git push upstream</code></td>
</tr>
<tr>
<td align="left"><code>grb</code></td>
<td align="left"><code>git rebase</code></td>
</tr>
<tr>
<td align="left"><code>grba</code></td>
<td align="left"><code>git rebase --abort</code></td>
</tr>
<tr>
<td align="left"><code>grbc</code></td>
<td align="left"><code>git rebase --continue</code></td>
</tr>
<tr>
<td align="left"><code>grbi</code></td>
<td align="left"><code>git rebase --interactive</code></td>
</tr>
<tr>
<td align="left"><code>grbo</code></td>
<td align="left"><code>git rebase --onto</code></td>
</tr>
<tr>
<td align="left"><code>grbs</code></td>
<td align="left"><code>git rebase --skip</code></td>
</tr>
<tr>
<td align="left"><code>grbd</code></td>
<td align="left"><code>git rebase $(git_develop_branch)</code></td>
</tr>
<tr>
<td align="left"><code>grbm</code></td>
<td align="left"><code>git rebase $(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>grbom</code></td>
<td align="left"><code>git rebase origin/$(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>grf</code></td>
<td align="left"><code>git reflog</code></td>
</tr>
<tr>
<td align="left"><code>gr</code></td>
<td align="left"><code>git remote</code></td>
</tr>
<tr>
<td align="left"><code>grv</code></td>
<td align="left"><code>git remote --verbose</code></td>
</tr>
<tr>
<td align="left"><code>gra</code></td>
<td align="left"><code>git remote add</code></td>
</tr>
<tr>
<td align="left"><code>grrm</code></td>
<td align="left"><code>git remote remove</code></td>
</tr>
<tr>
<td align="left"><code>grmv</code></td>
<td align="left"><code>git remote rename</code></td>
</tr>
<tr>
<td align="left"><code>grset</code></td>
<td align="left"><code>git remote set-url</code></td>
</tr>
<tr>
<td align="left"><code>grup</code></td>
<td align="left"><code>git remote update</code></td>
</tr>
<tr>
<td align="left"><code>grh</code></td>
<td align="left"><code>git reset</code></td>
</tr>
<tr>
<td align="left"><code>gru</code></td>
<td align="left"><code>git reset --</code></td>
</tr>
<tr>
<td align="left"><code>grhh</code></td>
<td align="left"><code>git reset --hard</code></td>
</tr>
<tr>
<td align="left"><code>grhk</code></td>
<td align="left"><code>git reset --keep</code></td>
</tr>
<tr>
<td align="left"><code>grhs</code></td>
<td align="left"><code>git reset --soft</code></td>
</tr>
<tr>
<td align="left"><code>gpristine</code></td>
<td align="left"><code>git reset --hard &amp;&amp; git clean --force -dfx</code></td>
</tr>
<tr>
<td align="left"><code>gwipe</code></td>
<td align="left"><code>git reset --hard &amp;&amp; git clean --force -df</code></td>
</tr>
<tr>
<td align="left"><code>groh</code></td>
<td align="left"><code>git reset origin/$(git_current_branch) --hard</code></td>
</tr>
<tr>
<td align="left"><code>grs</code></td>
<td align="left"><code>git restore</code></td>
</tr>
<tr>
<td align="left"><code>grss</code></td>
<td align="left"><code>git restore --source</code></td>
</tr>
<tr>
<td align="left"><code>grst</code></td>
<td align="left"><code>git restore --staged</code></td>
</tr>
<tr>
<td align="left"><code>gunwip</code></td>
<td align="left"><code>git rev-list --max-count=1 --format=&quot;%s&quot; HEAD | grep -q &quot;--wip--&quot; &amp;&amp; git reset HEAD~1</code></td>
</tr>
<tr>
<td align="left"><code>grev</code></td>
<td align="left"><code>git revert</code></td>
</tr>
<tr>
<td align="left"><code>grm</code></td>
<td align="left"><code>git rm</code></td>
</tr>
<tr>
<td align="left"><code>grmc</code></td>
<td align="left"><code>git rm --cached</code></td>
</tr>
<tr>
<td align="left"><code>gcount</code></td>
<td align="left"><code>git shortlog --summary -n</code></td>
</tr>
<tr>
<td align="left"><code>gsh</code></td>
<td align="left"><code>git show</code></td>
</tr>
<tr>
<td align="left"><code>gsps</code></td>
<td align="left"><code>git show --pretty=short --show-signature</code></td>
</tr>
<tr>
<td align="left"><code>gstall</code></td>
<td align="left"><code>git stash --all</code></td>
</tr>
<tr>
<td align="left"><code>gstu</code></td>
<td align="left"><code>git stash --include-untracked</code></td>
</tr>
<tr>
<td align="left"><code>gstaa</code></td>
<td align="left"><code>git stash apply</code></td>
</tr>
<tr>
<td align="left"><code>gstc</code></td>
<td align="left"><code>git stash clear</code></td>
</tr>
<tr>
<td align="left"><code>gstd</code></td>
<td align="left"><code>git stash drop</code></td>
</tr>
<tr>
<td align="left"><code>gstl</code></td>
<td align="left"><code>git stash list</code></td>
</tr>
<tr>
<td align="left"><code>gstp</code></td>
<td align="left"><code>git stash pop</code></td>
</tr>
<tr>
<td align="left"><code>gsta</code></td>
<td align="left">On Git &gt;= 2.13: <code>git stash push</code></td>
</tr>
<tr>
<td align="left"><code>gsta</code></td>
<td align="left">On Git &lt; 2.13: <code>git stash save</code></td>
</tr>
<tr>
<td align="left"><code>gsts</code></td>
<td align="left"><code>git stash show --patch</code></td>
</tr>
<tr>
<td align="left"><code>gst</code></td>
<td align="left"><code>git status</code></td>
</tr>
<tr>
<td align="left"><code>gss</code></td>
<td align="left"><code>git status --short</code></td>
</tr>
<tr>
<td align="left"><code>gsb</code></td>
<td align="left"><code>git status --short -b</code></td>
</tr>
<tr>
<td align="left"><code>gsi</code></td>
<td align="left"><code>git submodule init</code></td>
</tr>
<tr>
<td align="left"><code>gsu</code></td>
<td align="left"><code>git submodule update</code></td>
</tr>
<tr>
<td align="left"><code>gsd</code></td>
<td align="left"><code>git svn dcommit</code></td>
</tr>
<tr>
<td align="left"><code>git-svn-dcommit-push</code></td>
<td align="left"><code>git svn dcommit &amp;&amp; git push github $(git_main_branch):svntrunk</code></td>
</tr>
<tr>
<td align="left"><code>gsr</code></td>
<td align="left"><code>git svn rebase</code></td>
</tr>
<tr>
<td align="left"><code>gsw</code></td>
<td align="left"><code>git switch</code></td>
</tr>
<tr>
<td align="left"><code>gswc</code></td>
<td align="left"><code>git switch -c</code></td>
</tr>
<tr>
<td align="left"><code>gswd</code></td>
<td align="left"><code>git switch $(git_develop_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gswm</code></td>
<td align="left"><code>git switch $(git_main_branch)</code></td>
</tr>
<tr>
<td align="left"><code>gta</code></td>
<td align="left"><code>git tag --annotate</code></td>
</tr>
<tr>
<td align="left"><code>gts</code></td>
<td align="left"><code>git tag -s</code></td>
</tr>
<tr>
<td align="left"><code>gtv</code></td>
<td align="left"><code>git tag | sort -V</code></td>
</tr>
<tr>
<td align="left"><code>gignore</code></td>
<td align="left"><code>git update-index --assume-unchanged</code></td>
</tr>
<tr>
<td align="left"><code>gunignore</code></td>
<td align="left"><code>git update-index --no-assume-unchanged</code></td>
</tr>
<tr>
<td align="left"><code>gwch</code></td>
<td align="left"><code>git whatchanged -p --abbrev-commit --pretty=medium</code></td>
</tr>
<tr>
<td align="left"><code>gwt</code></td>
<td align="left"><code>git worktree</code></td>
</tr>
<tr>
<td align="left"><code>gwtls</code></td>
<td align="left"><code>git worktree list</code></td>
</tr>
<tr>
<td align="left"><code>gwtmv</code></td>
<td align="left"><code>git worktree move</code></td>
</tr>
<tr>
<td align="left"><code>gwtrm</code></td>
<td align="left"><code>git worktree remove</code></td>
</tr>
<tr>
<td align="left"><code>gk</code></td>
<td align="left"><code>gitk --all --branches &amp;!</code></td>
</tr>
<tr>
<td align="left"><code>gke</code></td>
<td align="left"><code>gitk --all $(git log --walk-reflogs --pretty=%h) &amp;!</code></td>
</tr>
<tr>
<td align="left"><code>gtl</code></td>
<td align="left"><code>gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl</code></td>
</tr>
</tbody></table>
<h3>主分支偏好</h3>
<p>继最近推动从我们的技术词汇中删除带有种族色彩的词汇之后，git 插件</p>
<p>倾向于使用 &quot;master &quot;以外的分支名称。在这种情况下，我们倾向于使用更简短、中性和描述性的</p>
<p>主&quot;。这意味着以前使用过 <code>master</code> 的别名和函数将使用 <code>main</code>。</p>
<p>分支。我们通过函数 <code>git_main_branch</code> 来实现这一点。</p>
<h3>已弃用的别名</h3>
<p>这些别名已被删除、重命名或以其他方式修改，修改方式可能与
获得进一步的支持。</p>
<table>
<thead>
<tr>
<th align="left">别名</th>
<th align="left">原命令</th>
<th align="left">修改后</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>gap</code></td>
<td align="left"><code>git add --patch</code></td>
<td align="left">New alias: <code>gapa</code>.</td>
</tr>
<tr>
<td align="left"><code>gcl</code></td>
<td align="left"><code>git config --list</code></td>
<td align="left">New alias: <code>gcf</code>.</td>
</tr>
<tr>
<td align="left"><code>gdc</code></td>
<td align="left"><code>git diff --cached</code></td>
<td align="left">New alias: <code>gdca</code>.</td>
</tr>
<tr>
<td align="left"><code>gdt</code></td>
<td align="left"><code>git difftool</code></td>
<td align="left">No replacement.</td>
</tr>
<tr>
<td align="left"><code>ggpull</code></td>
<td align="left"><code>git pull origin $(current_branch)</code></td>
<td align="left">New alias: <code>ggl</code>. (<code>ggpull</code> still exists for now though.)</td>
</tr>
<tr>
<td align="left"><code>ggpur</code></td>
<td align="left"><code>git pull --rebase origin $(current_branch)</code></td>
<td align="left">New alias: <code>ggu</code>. (<code>ggpur</code> still exists for now though.)</td>
</tr>
<tr>
<td align="left"><code>ggpush</code></td>
<td align="left"><code>git push origin $(current_branch)</code></td>
<td align="left">New alias: <code>ggp</code>. (<code>ggpush</code> still exists for now though.)</td>
</tr>
<tr>
<td align="left"><code>gk</code></td>
<td align="left"><code>gitk --all --branches</code></td>
<td align="left">Now aliased to <code>gitk --all --branches</code>.</td>
</tr>
<tr>
<td align="left"><code>glg</code></td>
<td align="left"><code>git log --stat --max-count=10</code></td>
<td align="left">Now aliased to <code>git log --stat --color</code>.</td>
</tr>
<tr>
<td align="left"><code>glgg</code></td>
<td align="left"><code>git log --graph --max-count=10</code></td>
<td align="left">Now aliased to <code>git log --graph --color</code>.</td>
</tr>
<tr>
<td align="left"><code>gwc</code></td>
<td align="left"><code>git whatchanged -p --abbrev-commit --pretty = medium</code></td>
<td align="left">New alias: <code>gwch</code>.</td>
</tr>
<tr>
<td align="left"><code>gup</code></td>
<td align="left"><code>git pull --rebase</code></td>
<td align="left">now alias <code>gpr</code></td>
</tr>
<tr>
<td align="left"><code>gupv</code></td>
<td align="left"><code>git pull --rebase -v</code></td>
<td align="left">now alias <code>gprv</code></td>
</tr>
<tr>
<td align="left"><code>gupa</code></td>
<td align="left"><code>git pull --rebase --autostash</code></td>
<td align="left">now alias <code>gpra</code></td>
</tr>
<tr>
<td align="left"><code>gupav</code></td>
<td align="left"><code>git pull --rebase --autostash -v</code></td>
<td align="left">now alias <code>gprav</code></td>
</tr>
<tr>
<td align="left"><code>gupom</code></td>
<td align="left"><code>git pull --rebase origin $(git_main_branch)</code></td>
<td align="left">now alias <code>gprom</code></td>
</tr>
<tr>
<td align="left"><code>gupomi</code></td>
<td align="left"><code>git pull --rebase=interactive origin $(git_main_branch)</code></td>
<td align="left">now alias <code>gpromi</code></td>
</tr>
</tbody></table>
<h2>功能</h2>
<h3>当前</h3>
<table>
<thead>
<tr>
<th align="left">命令</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>current_branch</code></td>
<td align="left">Returns the name of the current branch.</td>
</tr>
<tr>
<td align="left"><code>git_current_user_email</code></td>
<td align="left">Returns the <code>user.email</code> config value. (Lives in <code>lib/git.zsh</code>.)</td>
</tr>
<tr>
<td align="left"><code>git_current_user_name</code></td>
<td align="left">Returns the <code>user.name</code> config value. (Lives in <code>lib/git.zsh</code>.)</td>
</tr>
<tr>
<td align="left"><code>git_develop_branch</code></td>
<td align="left">Returns the name of the “development” branch: <code>dev</code>, <code>devel</code>, <code>development</code> if they exist, <code>develop</code> otherwise.</td>
</tr>
<tr>
<td align="left"><code>git_main_branch</code></td>
<td align="left">Returns the name of the main branch: <code>main</code> if it exists, <code>master</code> otherwise.</td>
</tr>
<tr>
<td align="left"><code>grename &lt;old&gt; &lt;new&gt;</code></td>
<td align="left">Renames branch <code>&lt;old&gt;</code> to <code>&lt;new&gt;</code>, including on the origin remote.</td>
</tr>
<tr>
<td align="left"><code>gbda</code></td>
<td align="left">Deletes all merged branches</td>
</tr>
<tr>
<td align="left"><code>gbds</code></td>
<td align="left">Deletes all squash-merged branches (<strong>Note: performance degrades with number of branches</strong>)</td>
</tr>
</tbody></table>
<h3>正在进行的工作（WIP）</h3>
<p>这些功能允许您暂停开发一个分支并切换到另一个分支（“正在进行的工作”，或
“wip”）。当您想要返回工作时，只需“unwip”即可。</p>
<table>
<thead>
<tr>
<th align="left">命令</th>
<th align="left">描述</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>gwip</code></td>
<td align="left">Commit wip branch</td>
</tr>
<tr>
<td align="left"><code>gunwip</code></td>
<td align="left">Uncommit wip branch</td>
</tr>
<tr>
<td align="left"><code>gunwipall</code></td>
<td align="left">Uncommit all recent <code>--wip--</code> commits</td>
</tr>
<tr>
<td align="left"><code>work_in_progress</code></td>
<td align="left">Echoes a warning if the current branch is a wip</td>
</tr>
</tbody></table>
<p>请注意，<code>gwip</code> 和<code>gunwip</code> 是别名，但也记录在此，以便对所有相关的 WIP 功能进行分组。</p>
<h3>已弃用的函数</h3>
<table>
<thead>
<tr>
<th align="left">命令</th>
<th align="left">描述</th>
<th align="left">原因</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><code>current_repository</code></td>
<td align="left">Return the names of the current remotes</td>
<td align="left">Didn&#39;t work properly. Use <code>git remote -v</code> instead (<code>grv</code> alias).</td>
</tr>
</tbody></table>

      <p style='text-align: right'>
      <a href='https://remrin.dev/notes/6#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">667bf45fdc4461596fc6f2fe</guid>
  <category>notes</category>
false
 </item>
  <item>
    <title>在 MacOS 中搭建 独立Linux 开发环境</title>
    <link>https://remrin.dev/posts/linux/dev-env</link>
    <pubDate>Sun, 23 Jun 2024 09:17:16 GMT</pubDate>
    <description>前言
在 Mac OS 中使用 Linux 开发环境本身并不是一件难事，因为 Mac OS 本身就是</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/posts/linux/dev-env'>https://remrin.dev/posts/linux/dev-env</a></blockquote>
      <h2>前言</h2>
<blockquote>
<p>在 <code>Mac OS</code> 中使用 <code>Linux</code> 开发环境本身并不是一件难事，因为 <code>Mac OS</code> 本身就是一个 <code>类Uinx</code> 系统，加上有 <code>HomeBrew</code> 可以直接安装大部分 <code>Linux</code> 的软件包， 即使不使用虚拟机，也能有一个相对较好的开发体验，但是难免会有特殊需求， 或者不想污染宿主机的开发环境，那就可以使用 如 <code>VMware Fusion</code>、<code>Parallels Desktop</code> 或 <code>VirtualBox</code>），然后在虚拟机中安装完整的 Linux 发行版， 但是这类虚拟机比较 <code>重</code> ，启动比较慢，内存占用大，就不在我的考虑范围内了，当然也可以使用 <code>Docker Desktop</code> 直接使用各类 <code>Linux</code> 发行版的镜像， 或者创建 <code>Dev Container</code> 直接创建一个环境齐全的开发镜像， 但是目前 <code>Docker</code> 镜像源的问题没有一劳永逸的方案，所以也不在我的考虑范围内，最终我决定使用 <code>Orbstack</code> 中的 <code>Mechines</code> 来搭建一个开发环境</p>
</blockquote>
<h3>安装 <code>Orbstack</code></h3>
<p><a href="https://orbstack.dev/">官网</a>里可以直接下载安装包， 或者使用 <code>HomeBrew</code> 直接安装</p>
<pre><code class="language-bash">brew install orbstack</code></pre><h3>选择一个合适的发行版</h3>
<p>我这里使用的是 <code>Fedroa</code>

</p>
<h3>完善开发环境</h3>
<ol>
<li>第一步当然是换
<a href="https://mirrors.tuna.tsinghua.edu.cn/help/fedora/">清华源</a>，首先备份一下默认源</li>
</ol>
<pre><code class="language-bash">sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup</code></pre><p>  然后直接替换默认源</p>
<pre><code class="language-bash">sudo sed -e 's|^metalink=|#metalink=|g' \
  -e 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora|g' \
  -i.bak \
  /etc/yum.repos.d/fedora.repo \
  /etc/yum.repos.d/fedora-modular.repo \
  /etc/yum.repos.d/fedora-updates.repo \
  /etc/yum.repos.d/fedora-updates-modular.repo</code></pre><p>  如果你喜欢手动换</p>
<ul>
<li><p>fedora 仓库 (/etc/yum.repos.d/fedora.repo)</p>
<pre><code class="language-">[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
metadata_expire=28d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False</code></pre></li>
<li><p>updates 仓库 (/etc/yum.repos.d/fedora-updates.repo)</p>
</li>
</ul>
<pre><code class="language-">  [updates]
  name=Fedora $releasever - $basearch - Updates
  failovermethod=priority
  baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/$releasever/Everything/$basearch/
  enabled=1
  gpgcheck=1
  metadata_expire=6h
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
  skip_if_unavailable=False</code></pre><ul>
<li><p>fedora-modular 仓库 (/etc/yum.repos.d/fedora-modular.repo)</p>
<pre><code class="language-">[fedora-modular]
name=Fedora Modular $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Modular/$basearch/os/
enabled=1
metadata_expire=7d
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False</code></pre></li>
<li><p>updates-modular 仓库 (/etc/yum.repos.d/fedora-updates-modular.repo)</p>
<pre><code class="language-"></code></pre></li>
</ul>
<p>  [updates-modular]
  name=Fedora Modular <span class="katex-render">releasever -</span>basearch - Updates
  failovermethod=priority
  baseurl=<a href="https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/$releasever/Modular/$basearch/">https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/$releasever/Modular/$basearch/</a>
  enabled=1
  gpgcheck=1
  metadata_expire=6h
  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-<span class="katex-render">releasever-</span>basearch
  skip_if_unavailable=False
    ```</p>
<ul>
<li><p>清理缓存</p>
<pre><code class="language-bash">sudo dnf clean all
sudo dnf makecache</code></pre></li>
</ul>
<pre><code class="language-">- 更新软件包
  
  ```bash
  sudo dnf update
  ```
---

2. 使用 `zsh` 替换默认的 `bash`    

- 安装 `git` 和 `zsh`

```bash
sudo dnf install git zsh</code></pre><ul>
<li>安装 <code>oh my zsh</code></li>
</ul>
<pre><code class="language-bash">sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"</code></pre><ul>
<li><p>安装常用的 <code>oh my zsh</code> 插件</p>
<ul>
<li>自动提示</li>
</ul>
<pre><code class="language-bash">git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions</code></pre><ul>
<li>高亮显示</li>
</ul>
<pre><code class="language-bash">git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting</code></pre><pre><code class="language-bash"></code></pre></li>
</ul>
<p>   git clone <a href="https://github.com/zdharma-continuum/fast-syntax-highlighting.git">https://github.com/zdharma-continuum/fast-syntax-highlighting.git</a> <span class="katex-render">{ZSH_CUSTOM:-</span>HOME/.oh-my-zsh/custom}/plugins/fast-syntax-highlighting
    ```
    - 自动补全</p>
<pre><code class="language-undefined">``` bash</code></pre><p>git clone --depth 1 -- <a href="https://github.com/marlonrichert/zsh-autocomplete.git">https://github.com/marlonrichert/zsh-autocomplete.git</a> $ZSH_CUSTOM/plugins/zsh-autocomplete
    ```</p>
<ul>
<li><p>修改 <code>zsh</code> 配置文件，将其中的 plugins 修改为</p>
<pre><code class="language-bash">vim ~/.zshrc</code></pre><pre><code class="language-config"> plugins=(
   git
   zsh-autosuggestions
   zsh-syntax-highlighting
   fast-syntax-highlighting
   zsh-autocomplete
 )</code></pre></li>
<li><p>应用修改</p>
<pre><code class="language-bash">source ~/.zshrc</code></pre></li>
</ul>
<ol start="3">
<li>安装 <code>NVM</code> 管理 <code>NodeJS</code> 版本</li>
</ol>
<pre><code class="language-bash">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash</code></pre><ul>
<li><p>如何使用</p>
<pre><code class="language-bash">$ nvm use 16
 Now using node v16.9.1 (npm v7.21.1)
 $ node -v
 v16.9.1
 $ nvm use 14
 Now using node v14.18.0 (npm v6.14.15)
 $ node -v
 v14.18.0
 $ nvm install 12
 Now using node v12.22.6 (npm v6.14.5)
 $ node -v
 v12.22.6</code></pre><p>进阶请查看 <a href="https://github.com/nvm-sh/nvm">文档</a></p>
</li>
</ul>
<ol start="4">
<li>使用 <code>VS Code</code> 连接到刚才创建的虚拟机中</li>
</ol>
<ul>
<li>安装插件 <code>Remote Development</code></li>
<li>添加远程链接，在左侧菜单中选择 远程资源管理器， 点击 <code>SSH</code> 上的 <code>+</code> 号，或者使用快捷键 <code>Shift</code>+<code>Command</code>+<code>P</code> 输入 <code>remote add</code>, 来打开添加 <code>SSH</code> 链接的窗口

输入 <code>ssh orb</code> 即可连接至刚创建的虚拟机中
::: warning
 如果有多个虚拟机，<code>SSH</code> 链接的时候需要指定连接到哪台主机，如果不指定则连接到默认主机中，例如 <code>ssh debain@orb </code> 使用默认用户链接到 <code>debain</code> 主机中， 示例 
  <code>ssh machine@orb</code>，
  <code>ssh user@orb</code>，
  <code>ssh user@machine@orb</code>
 :::
 
 </li>
</ul>
<blockquote>
<p>这样就有了一个隔离宿主机系统的开发环境，再怎么折腾也不怕，有点类似于 <code>Windows</code> 中的 <code>WSL</code> ，胜在简单便捷，不需要额外开启系统的某些功能，下载完 <code>Orbstack</code> 就可以直接使用</p>
</blockquote>

      <p style='text-align: right'>
      <a href='https://remrin.dev/posts/linux/dev-env#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6677e81cdc4461596fc6323a</guid>
  <category>posts</category>
<category>Linux</category>
 </item>
  <item>
    <title>Vercel 开源替代品</title>
    <link>https://remrin.dev/notes/5</link>
    <pubDate>Mon, 17 Jun 2024 06:07:24 GMT</pubDate>
    <description>https://github.com/Dokploy/dokploy?tab=readme-ov-f</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/notes/5'>https://remrin.dev/notes/5</a></blockquote>
      <p><a href="https://github.com/Dokploy/dokploy?tab=readme-ov-file">https://github.com/Dokploy/dokploy?tab=readme-ov-file</a></p>
<p><a href="https://github.com/coollabsio/coolify">https://github.com/coollabsio/coolify</a></p>

      <p style='text-align: right'>
      <a href='https://remrin.dev/notes/5#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">666fd29cefd24c17c0da2e7d</guid>
  <category>notes</category>
false
 </item>
  <item>
    <title>使用 Cloudflare Workers 自建 Docker 镜像源</title>
    <link>https://remrin.dev/posts/dev/docker</link>
    <pubDate>Mon, 10 Jun 2024 11:03:20 GMT</pubDate>
    <description>前几天各大镜像站全部挂掉，拉取 Docker镜像就成了问题

开始我也不关心，挂了就上代理去拉，但是</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/posts/dev/docker'>https://remrin.dev/posts/dev/docker</a></blockquote>
      <p>前几天各大镜像站全部挂掉，拉取 <code>Docker</code>镜像就成了问题</p>
<p>开始我也不关心，挂了就上代理去拉，但是在我本地使用<code>Docker</code>的时候即使挂了代理也不能正常拉取</p>
<p>于是我开始找解决方案，找了一圈，发现有以下方案</p>
<ul>
<li>利用<code>Cloudflare Workers</code> 搭建，需要一个 <code>域名</code>     -&gt; <a href="https://singee.atlassian.net/wiki/spaces/MAIN/pages/5079084">原帖</a></li>
<li>自建 <code>Nexus 3</code>， 需要一台国外 <code>VPS</code> 最好 <code>4G内存以上</code>，还需要一个 <code>域名</code>  -&gt; <a href="https://blog.xiaoz.org/archives/20916">原帖</a></li>
<li>使用 <code>Github Action</code> 将 <code>DockerHub</code> 镜像转存到阿里云私有仓库，这个只需要一个 <code>Github</code> 账号    -&gt; <a href="https://www.v2ex.com/t/1048066#reply3">原帖</a></li>
<li>使用 <code>Nginx反代</code> ，比较适合已经有一台服务器的人  -&gt; <a href="https://blog.lty520.faith/%E5%8D%9A%E6%96%87/%E8%87%AA%E5%BB%BAdocker-hub%E5%8A%A0%E9%80%9F%E9%95%9C%E5%83%8F/">原帖</a></li>
<li>其他的话就是找现成的镜像源，一般这类不是很稳定，就没考虑这个</li>
</ul>
<p>我用的第一种方案，比较简单，<a href="https://singee.atlassian.net/wiki/spaces/MAIN/pages/5079084">原帖</a> 的教程并不是很详细，我这里完善一下</p>
<ol>
<li>进入 <a href="https://dash.cloudflare.com">Cloudflare首页</a> ，在左侧 <code>Workers &amp; Pages</code> 中新建一个 Workers, 同时保存一下右侧的 <code>Account ID</code></li>
</ol>
<img src="	https://remrin.dev/api/v2/objects/file/8ds9eq03b3mjxo4l82.png"/>
给 `Workers` 起一个名字，点击 `Save` ，然后点击 `Finish`
<img src="https://remrin.dev/api/v2/objects/file/b9o42j8fe0flbx1221.png"/>
出现这个页面，就可以进行下一步了
<img src="https://remrin.dev/api/v2/objects/file/fhdmm0vi2hwga3wk41.png"/>

<ol start="2">
<li><code>Fork</code> <a href="https://github.com/ImSingee/hammal">这个仓库</a>，<code>Clone</code> 到本地</li>
</ol>
<p>  按照惯例先装依赖</p>
<pre><code class="language-bash">pnpm i</code></pre><p>  然后将 <code>wrangler.toml.sample</code> 重命名为 <code>wrangler.toml</code></p>
<pre><code class="language-bash">cp wrangler.toml.sample wrangler.toml</code></pre><p>  编辑一下  <code>wrangler.toml</code> 文件，修改 <code>name</code>和<code>account_id</code></p>
<pre><code class="language-config">name = "workers的名称"
account_id = "这里填写上面复制的 Account ID"
main = "src/index.ts"
workers_dev = true
compatibility_date = "2024-06-08"

kv_namespaces = [
	 { binding = "HAMMAL_CACHE", id = "you kv id" }
]</code></pre><ol start="3">
<li>获取一下  <code>kv ID</code>，执行完下面的命令会输出 id ，修改配置中的 <code>id</code></li>
</ol>
<pre><code class="language-bash">npx wrangler kv:namespace create hammal_cache</code></pre><p>  </p>
<ol start="4">
<li>之后部署，执行。</li>
</ol>
<pre><code class="language-bash">pnpm run deploy</code></pre><p><br>::: warning
      这里会提示，你即将发布一个 Workers 服务，该服务最后一次是通过 Cloudflare Dashboard 发布的，通过 Cloudflare Dashboard 所做的编辑将会被你本地的代码和配置覆盖
<br>:::</p>
  <img src="https://remrin.dev/api/v2/objects/file/gt1bud2z5ts3qmy6k6.png"/>
  
<p>  输入 <code>y</code> , 正常会打开浏览器让你授权，授权即可，我这里因为已经部署过了，所以没有弹出来</p>
  <img src="https://remrin.dev/api/v2/objects/file/udfrj4tqnauvq7lvfj.png"/>

<ol start="5">
<li>给刚刚部署好的 <code>Workers</code> 添加一个域名</li>
</ol>
  <img src="	https://remrin.dev/api/v2/objects/file/v90wwso4e2943cmogv.png"/>
  等待域名生效就可以正常使用了，一般来说在服务器上修改 `/etc/docker/daemon.json`，配置一下你刚搭建好的源地址就行

<pre><code class="language-json">"registry-mirrors": [
    "https://hammal.example.com"
  ]

  </code></pre><p>  我在<code>Mac</code> 上使用的是  <a href="https://orbstack.dev/">Orbstack</a>，则需要在软件中直接配置
  <img src="	https://remrin.dev/api/v2/objects/file/xhhefd8xx63krtc9at.png"/></p>

      <p style='text-align: right'>
      <a href='https://remrin.dev/posts/dev/docker#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6666dd78ecdb4ca2bfb16688</guid>
  <category>posts</category>
<category>开发</category>
 </item>
  <item>
    <title>折腾一下博客</title>
    <link>https://remrin.dev/posts/blog/1</link>
    <pubDate>Sat, 01 Jun 2024 15:14:41 GMT</pubDate>
    <description>半夜刷 B 站看到一个博客 fuxiaochen 发现挺好看的

翻了翻这个博客的仓库 Github</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://remrin.dev/posts/blog/1'>https://remrin.dev/posts/blog/1</a></blockquote>
      <p>半夜刷 B 站看到一个博客 <a href="https://fuxiaochen.com">fuxiaochen</a> 发现挺好看的</p>
<p>翻了翻这个博客的仓库 <a href="https://github.com/aifuxi/fuxiaochen">Github</a>, 在<code>Readme</code>里面看见参考了 <a href="https://github.com/Innei/Shiro">Shiro</a></p>
<p>准备半夜爬起来就部署上，想了想，没域名服务器，还是洗洗睡吧</p>
<p>早上醒得早，博客的事还是想搞，细细品读部署文档，直接下单服务器<code>4H4G-220G</code>, <code>55$/Year</code></p>
<p>还是有点肉疼，加上域名 <a href="remrin.dev">remrin.dev</a> <code>12$/Year</code></p>
<p>本就不富裕的钱包更是雪上加霜，买都买了直接开干</p>
<p>好在部署比较简单，Docker compose 一把梭，开始计划在 <a href="https://vercel.com">Vercel</a> 上部署，一直部署失败</p>
<p></p>
<p><del>看了一下日志，应该是最近一次提交引入的 <code>BUG</code></del>     已修复 <a href="https://github.com/Innei/Shiro/issues/374#event-13010947703">#374</a></p>
<p><a href="https://github.com/Innei/Shiro/pull/375">https://github.com/Innei/Shiro/pull/375</a></p>
<p>所以博客前端也用<code>Docker</code> 部署</p>
<p>部署过程就不细说了，也不是教程文章，最终成果还是不错的</p>
<p>顺便说一下我的方案</p>
<ul>
<li>域名 证书  <a href="https://www.cloudflare.com/zh-cn/">CloudFlare</a> </li>
<li>服务器   <a href="https://cloudcone.com/">Cloudcone</a></li>
<li>域名邮箱   <a href="https://fastmail.com/">Fastmail</a></li>
</ul>
<p>开始使用的 <a href="https://certbot.eff.org/">Certbot</a> 来申请证书
<del>后面发现<a href="https://www.cloudflare.com/zh-cn/">CloudFlare</a> 可以直接申请，就直接用他了</del> </p>
<p>::: warning
有个坑在这说一下，<code>CloudFlare</code> 提供的证书不能用于常规SSL验证，只是服务器和 <code>CloudFlare</code> 通信会用到， 所以还是使用 <code>Certbot</code> 去申请证书
:::</p>
<p>所以需要用其他方式申请证书，我用的 <code>Cretbot</code> 自动申请，一次只能申请90天，需要自己配置一下自动续签</p>
<p>如果部署完博客前端之后无法访问 <code>Api</code>提示证书问题，在 <code>.js</code> 中加入一个配置可以暂时解决</p>
<pre><code class="language-javascript">process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';```

之后 `Reload` 一下 `shiro` 服务

```shell
pm2 reload shiro</code></pre><p>对于手写 <code>Nginx</code> 反代配置的，可以参考我的配置</p>
<p><code>博客前端</code></p>
<pre><code class="language-conf"> {

  listen 80;
  listen 443 ssl http2;

  ## 绑定域名
  _name xxx.com;
  index index.html;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $_name;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";

  location ~* \.(gif|png|jpg|css|js|woff|woff2)$ {
    proxy_pass http://127.0.0.1:2323;
    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 REMOTE-HOST $remote_addr;
    expires 30d;
  }
  location ~* \/(feed|sitemap|atom.xml) {
    proxy_pass http://127.0.0.1:2333/$1;
    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 REMOTE-HOST $remote_addr;
    add_header X-Cache $upstream_cache_status;
    add_header Cache-Control max-age=60;
  }

  location / {
    proxy_pass http://127.0.0.1:2323;
    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 REMOTE-HOST $remote_addr;
    add_header X-Cache $upstream_cache_status;
    add_header Cache-Control no-cache;
    proxy_intercept_errors on;
  }

  # 可以使用 Certbot 自动申请，或者手动申请后放在某个目录中，在此处引入
  ssl_certificate /root/ssl/xxx.pem;
  ssl_certificate_key /root/ssl/xxx.key;

  ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
  ssl_prefer__ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  error_page 497 https://$host$request_uri;
}</code></pre><p>``端</p>
<pre><code class="language-conf"> {

  listen 80;
  listen 443 ssl http2;

  ## 绑定域名
  _name .xxx.com;
  index index.html;
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Host $_name;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";

  ## 反向代理开始
  ## WebSocket
  location /socket.io {
    proxy_pass http://127.0.0.1:2333/socket.io;
    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 REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_buffering off;
    proxy_http_version 1.1;
    add_header Cache-Control no-cache;
  }

  ## 可以给管理页加一个代理
  location /xxx {
    proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
  }

  ## RSS 地址
  location ~* \/(feed|sitemap|atom.xml) {
    proxy_pass http://127.0.0.1:2333/$1;
  }
  ## Others
  location / {
    proxy_pass http://127.0.0.1:2333;
    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 REMOTE-HOST $remote_addr;
    add_header X-Cache $upstream_cache_status;
  }
  ## 反向代理结束

  # 可以使用 Certbot 自动申请，或者手动申请后放在某个目录中，在此处引入
  ssl_certificate /root/ssl/xxx.pem;
  ssl_certificate_key /root/ssl/xxx.key;

  ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
  ssl_prefer__ciphers on;
  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 10m;
  error_page 497 https://$host$request_uri;
}</code></pre><p>就这样，需要帮助可以发邮件联系我</p>

      <p style='text-align: right'>
      <a href='https://remrin.dev/posts/blog/1#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">665b3ae1f0beb36e5685786b</guid>
  <category>posts</category>
<category>博客</category>
 </item>
  
</channel>
</rss>