<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss-style.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:version="2.0"><channel><title>KoBari</title><description>🌸 轻盈、优雅、纯净 —— 用文字与图片记录生活与创意 feedId:172229198194932736+userId:166528077360436224</description><link>https://hub.131714.xyz/</link><language>zh</language><item><title>VSCode Sync Upstream</title><link>https://hub.131714.xyz/blog/synccode/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/synccode/</guid><description>利用VSCode 及Git graph插件实现可视化的同步上游代码。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/synccode/&quot;&gt;https://hub.131714.xyz/blog/synccode/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;&lt;br&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;&lt;br&gt;import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;&lt;br&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;br&gt;import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;&lt;br&gt;import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;  &lt;/p&gt;
&lt;Info&gt;
适用于：  
- 用 VSCode 管理代码  
- fork 了 `某个项目` 并自己改内容  
- 上游更新后，想**保留自己改动**并**同步最新代码**
&lt;/Info&gt;
---

&lt;blockquote&gt;
&lt;p&gt;前期准备&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VSCode （软件）&lt;/li&gt;
&lt;li&gt;Git Graph （VSCode插件）&lt;/li&gt;
&lt;li&gt;仓库 &lt;strong&gt;&lt;code&gt;Clone&lt;/code&gt;&lt;/strong&gt; 到本地&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;参考视频&lt;/strong&gt;&lt;/p&gt;
&lt;div style={{ width: &apos;100%&apos;, maxWidth: &apos;1200px&apos;, margin: &apos;auto&apos; }}&gt;
  &lt;video 
    src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/syncUpstream.mp4&quot; 
    controls 
    preload=&quot;metadata&quot;
    style={{ width: &apos;100%&apos;, height: &apos;auto&apos;, display: &apos;block&apos; }}
  &gt;
    您的浏览器不支持 video 标签。
  &lt;/video&gt;
&lt;/div&gt;

&lt;h2&gt;1. 给仓库加上“上游”&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# fork仓库默认是有上游的，使用命令查看远程信息
git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可看到&lt;code&gt;origin&lt;/code&gt;、&lt;code&gt;upstream&lt;/code&gt;
若没有&lt;strong&gt;upstream&lt;/strong&gt;则执行如下代码&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add upstream https://github.com/YYsuni/2025-blog-public.git
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;2. 拉取远程仓库代码，确保本地与远程仓库一致，防止冲突&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;3. 抓取上游最新代码到本地&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git fetch upstream
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4. 打开Git Graph插件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Merge into current branch&lt;/strong&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync2.webp&quot; alt=&quot;&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;记得勾选 &lt;strong&gt;&lt;code&gt;No Commit&lt;/code&gt;&lt;/strong&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5. 解决冲突（仅限冲突时）&lt;/h2&gt;
&lt;Collapse title=&quot;图文流程&quot;&gt;

&lt;ol&gt;
&lt;li&gt;打开 VSCode 分支管理 查看存在冲突的文件。 &lt;/li&gt;
&lt;li&gt;找到类似下面的标记：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;采用当前更改|采用传入的更改|保留双方更改|比较变更
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;...你原来的内容...
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;把标记删掉，保留你想要的内容，&lt;strong&gt;保存文件&lt;/strong&gt;。  &lt;/li&gt;
&lt;li&gt;解决冲突后，暂存文件，&lt;strong&gt;&lt;code&gt;commit&lt;/code&gt;&lt;/strong&gt; (点击继续）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/Collapse&gt;
---

&lt;h2&gt;6. 推送代码到 GitHub&lt;/h2&gt;
&lt;Collapse title=&quot;图文流程&quot;&gt;

&lt;ol&gt;
&lt;li&gt;右键 &lt;strong&gt;&lt;code&gt;main&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync5.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;Push Branch(推送到远程)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync6.webp&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;main | origin&lt;/code&gt;&lt;/strong&gt; 即推送成功&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/SyncUpstream/sync8.webp&quot; alt=&quot;&quot;&gt;
&lt;/Collapse&gt;
&lt;Success&gt;至此，便完成了与上游代码的&lt;strong&gt;同步&lt;/strong&gt;!&lt;/Success&gt;&lt;/p&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Sat, 16 May 2026 12:45:00 GMT</pubDate></item><item><title>网易爆米花挂载夸克网盘</title><link>https://hub.131714.xyz/blog/bmh_openlist/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/bmh_openlist/</guid><description>通过Openlist挂载夸克网盘，使用网易爆米花，实现随时随地在线观看原画视频</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/bmh_openlist/&quot;&gt;https://hub.131714.xyz/blog/bmh_openlist/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;&lt;/p&gt;
&lt;h1&gt;一、软件准备&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/OpenListApp/OpenListApp&quot;&gt;&lt;strong&gt;Openlist app&lt;/strong&gt;&lt;/a&gt; &lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;选择对应的客户端进行下载&lt;/strong&gt;&lt;/em&gt;，可能需要&lt;strong&gt;魔法&lt;/strong&gt;访问&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bmh.163.com/la/tuanzhangrtb&quot;&gt;&lt;strong&gt;网易爆米花&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;二、图文教程&lt;/h1&gt;
&lt;Collapse title=&quot;Openlist配置教程&quot;&gt;  
![c1](https://img.131714.xyz/file/blog/Article/bmh_openlist/c1.webp)
## 添加存储
![c1](https://img.131714.xyz/file/blog/Article/bmh_openlist/c2.webp)

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;WebDAV策略选择本地代理&lt;/strong&gt;&lt;/em&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c3.webp&quot; alt=&quot;c1&quot;&gt;
&lt;strong&gt;Cookie的详细获取方式，查看&lt;/strong&gt;&lt;a href=&quot;https://doc.oplist.org/guide/drivers/quark&quot;&gt;&lt;strong&gt;官方文档&lt;/strong&gt;&lt;/a&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c4.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;更改用户密码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c5.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c6.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c7.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c8.webp&quot; alt=&quot;c1&quot;&gt;
&lt;/Collapse&gt;  &lt;/p&gt;
&lt;Collapse title=&quot;网易爆米花配置教程&quot;&gt;  
![c1](https://img.131714.xyz/file/blog/Article/bmh_openlist/c9.webp)

&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c10.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;按图中配置来填写&lt;/strong&gt;&lt;/em&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c11.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c12.webp&quot; alt=&quot;c1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/bmh_openlist/c13.webp&quot; alt=&quot;c1&quot;&gt;
&lt;/Collapse&gt;&lt;/p&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Tue, 12 May 2026 02:47:00 GMT</pubDate></item><item><title>GitHub连接失败解决方法</title><link>https://hub.131714.xyz/blog/github_connect/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/github_connect/</guid><description>GitHub 443报错源于Git代理设置与实际网络不一致。解决办法：使用代理时，需通过git config同步端口号；不使用代理时，需执行--unset命令清除代理配置。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/github_connect/&quot;&gt;https://hub.131714.xyz/blog/github_connect/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;GitHub 连接失败：Failed to connect to github.com port 443 解决方案&lt;/h1&gt;
&lt;p&gt;在使用 Git 进行 &lt;code&gt;push&lt;/code&gt; 或 &lt;code&gt;pull&lt;/code&gt; 操作时，如果遇到 &lt;code&gt;fatal: unable to access... Failed to connect to github.com port 443&lt;/code&gt; 报错，通常是因为开启了 VPN（梯子）导致&lt;strong&gt;系统代理端口与 Git 代理配置不一致&lt;/strong&gt;，或者在关闭 VPN 后 Git 仍残留了无效的代理设置。&lt;/p&gt;
&lt;h2&gt;场景一：在使用代理（梯子）时报错&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：Git 无法自动识别系统的代理通道，需要手动指定端口。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;查看系统代理端口&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;进入：&lt;code&gt;设置&lt;/code&gt; -&amp;gt; &lt;code&gt;网络和 Internet&lt;/code&gt; -&amp;gt; &lt;code&gt;代理&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;查看“手动设置代理”中的&lt;strong&gt;端口号&lt;/strong&gt;（常见端口如：7890、1080、4780 等）。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;同步 Git 代理配置&lt;/strong&gt;：
打开终端（cmd 或 PowerShell），执行以下命令（将 &lt;code&gt;7890&lt;/code&gt; 替换为你实际查看到的端口号）：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 设置 HTTP 代理
git config --global http.proxy 127.0.0.1:7890

# 设置 HTTPS 代理
git config --global https.proxy 127.0.0.1:7890
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;生效验证&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;建议先执行 &lt;code&gt;ipconfig /flushdns&lt;/code&gt; 刷新 DNS 缓存。&lt;/li&gt;
&lt;li&gt;再次尝试 &lt;code&gt;push&lt;/code&gt; 或 &lt;code&gt;pull&lt;/code&gt; 即可恢复正常。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;场景二：在未开启代理时报错&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：之前配置过 Git 代理，但在关闭 VPN 后，Git 仍在尝试通过已失效的端口连接网络。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决办法&lt;/strong&gt;：直接清除 Git 的全局代理设置，让其回归直连模式。&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 class=&quot;language-bash&quot;&gt;git config --global --unset http.proxy
git config --global --unset https.proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;再次尝试&lt;/strong&gt;：
此时 Git 将使用系统默认网络连接，问题通常迎刃而解。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;💡 进阶技巧：如何快速检查当前代理状态？&lt;/h2&gt;
&lt;p&gt;如果你不确定 Git 当前是否配置了代理，可以使用以下命令查看：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git config --global --get http.proxy
git config --global --get https.proxy
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;如果返回为空，说明当前未设置代理；如果返回了 IP 和端口，请确保该端口与你当前的 VPN 软件一致。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Sat, 09 May 2026 13:32:00 GMT</pubDate></item><item><title>Saas 优选</title><link>https://hub.131714.xyz/blog/saas/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/saas/</guid><description>本文介绍了一种基于 Cloudflare SaaS 架构的域名优选配置方法。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/saas/&quot;&gt;https://hub.131714.xyz/blog/saas/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;&lt;br&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;&lt;br&gt;import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;&lt;br&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;br&gt;import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;&lt;br&gt;import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h1&gt;一、DNS 配置&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;回源地址（A 记录）&lt;/strong&gt;
将 SaaS 回源指向源站 IP：
&lt;strong&gt;&lt;code&gt;saas -&amp;gt; 7.7.7.7&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;优选 CNAME&lt;/strong&gt;
配置 CDN 优选入口：
&lt;strong&gt;&lt;code&gt;cdn -&amp;gt; cf.090227.xyz&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;待优选地址&lt;/strong&gt;
定义需要进行链路优化的子域：
&lt;strong&gt;&lt;code&gt;123 -&amp;gt; 优选地址&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;优选域名 CNAME&lt;/strong&gt;
将业务域名接入优选链路：
  &lt;strong&gt;&lt;code&gt;321 -&amp;gt; cdn.domain&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;Info&gt;
**⚠️回源地址和带优选地址的DNS记录要打开小黄云**
&lt;/Info&gt;

&lt;hr&gt;
&lt;h1&gt;二、SaaS 配置&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;配置回退源（Fallback Origin）&lt;/strong&gt;
填写：
&lt;strong&gt;&lt;code&gt;saas.domain&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;添加主机名（Custom Hostname）&lt;/strong&gt;
自定义主机名：
&lt;strong&gt;&lt;code&gt;321.domain&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TLS 版本&lt;/strong&gt;
选择 &lt;strong&gt;TLS 1.2&lt;/strong&gt;（兼顾安全性与兼容性）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;验证方式&lt;/strong&gt;
选择 &lt;strong&gt;HTTP 验证&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;源服务器（Origin Server）&lt;/strong&gt;
选择 &lt;strong&gt;自定义（Custom）&lt;/strong&gt;，并填写：
&lt;strong&gt;&lt;code&gt;123.domain&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h1&gt;三、效果对比&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;优选前：&lt;/strong&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/saas/1HkXyE84.webp&quot; alt=&quot;before&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;优选后：&lt;/strong&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/saas/xo7LHi1Q.webp&quot; alt=&quot;after&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Mon, 04 May 2026 10:03:00 GMT</pubDate></item><item><title>Git 安装与推送到 GitHub</title><link>https://hub.131714.xyz/blog/git/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/git/</guid><description>首次仓库构建初始化与远程推送</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/git/&quot;&gt;https://hub.131714.xyz/blog/git/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;一、什么是 Git？&lt;/h2&gt;
&lt;p&gt;Git 是一个分布式版本控制工具，用于管理代码历史记录，并方便与他人协作开发。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、安装 Git&lt;/h2&gt;
&lt;h3&gt;1. Windows 安装&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开官网：&lt;a href=&quot;https://git-scm.com/&quot;&gt;Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;下载 Windows 安装包&lt;/li&gt;
&lt;li&gt;双击安装，一路点击 &lt;strong&gt;Next&lt;/strong&gt; 即可&lt;/li&gt;
&lt;li&gt;安装完成后，打开终端输入：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;三、创建并推送新仓库到 GitHub&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git init 
git add README.md
git commit -m &amp;quot;第一次提交&amp;quot;
git branch -M main
git remote add origin https://github.com/zxy131714/demo.git
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;📌 说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git init&lt;/code&gt;：初始化仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;：添加文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;：提交到本地仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git branch -M main&lt;/code&gt;：设置主分支为 main&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git remote add origin&lt;/code&gt;：绑定远程仓库&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git push&lt;/code&gt;：推送到 GitHub&lt;code&gt;git push&lt;/code&gt; ：推送到 GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;四、推送已有本地仓库到 GitHub&lt;/h2&gt;
&lt;p&gt;如果你已经有本地项目，只需执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git remote add origin https://github.com/用户名/仓库名.git
git branch -M main
git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Sat, 18 Apr 2026 00:14:00 GMT</pubDate></item><item><title>《电锯人：蕾塞篇》观后感</title><link>https://hub.131714.xyz/blog/chainsaw_man/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/chainsaw_man/</guid><description>蕾塞的一生，被命运束缚，那句“老实说，我也没去过学校”，是她无声的叹息，也是未竟的孤独。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/chainsaw_man/&quot;&gt;https://hub.131714.xyz/blog/chainsaw_man/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;code&gt;“…TO BE HONEST…&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;&lt;code&gt;I’VE NEVER BEEN TO SCHOOL EITHER…”&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/chainsaw_man/p1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这一句，蕾塞的 &lt;strong&gt;&lt;code&gt;告白&lt;/code&gt;&lt;/strong&gt;， 带着深深的遗憾和无奈。她的 &lt;strong&gt;&lt;code&gt;命运&lt;/code&gt;&lt;/strong&gt; 从一开始就被注定，作为恶魔的使者，她无法选择自己的路。与电次的短暂关系，原本是她的一丝挣扎与希望，但最终她依然选择 &lt;strong&gt;&lt;code&gt;赴约&lt;/code&gt;&lt;/strong&gt; ，而不是安全 &lt;strong&gt;&lt;code&gt;撤离&lt;/code&gt;&lt;/strong&gt;。 这并非单纯的爱情，而是对命运的无声妥协。&lt;/p&gt;
&lt;p&gt;在咖啡馆附近的小巷里，她被玛奇玛找到，最终被天使恶魔斩杀。她的死亡，象征着她无力逃脱命运的束缚。那句 &lt;strong&gt;&lt;code&gt;“老实说，我也没去过学校”&lt;/code&gt;&lt;/strong&gt;， 不仅是她对自己无知的 &lt;strong&gt;&lt;code&gt;自嘲&lt;/code&gt;&lt;/strong&gt;， 更是她无法选择自己人生的 &lt;strong&gt;&lt;code&gt;痛苦写照&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/chainsaw_man/p2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Wed, 08 Apr 2026 17:26:00 GMT</pubDate></item><item><title>To The Infinite Castle</title><link>https://hub.131714.xyz/blog/infinite_castle/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/infinite_castle/</guid><description>柱集结，决战无限城！</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/infinite_castle/&quot;&gt;https://hub.131714.xyz/blog/infinite_castle/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;坠入无限城&lt;/h1&gt;
&lt;div style=&quot;width:100%;max-width:1200px;margin:auto&quot;&gt;
  &lt;div style=&quot;position:relative;padding-bottom:70%&quot;&gt;
    &lt;iframe
      src=&quot;https://picbed.131714.xyz/ToTheInfiniteCastle.mp4&quot;
      style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;border:none&quot;
      allowfullscreen
      loading=&quot;lazy&quot;
    &gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/br&gt;

&lt;h1&gt;我妻善逸&lt;/h1&gt;
&lt;div style=&quot;width:100%;max-width:1200px;margin:auto&quot;&gt;
  &lt;div style=&quot;position:relative;padding-bottom:70%&quot;&gt;
    &lt;iframe
      src=&quot;https://picbed.131714.xyz/woqishanyi.mp4&quot;
      style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;border:none&quot;
      allowfullscreen
      loading=&quot;lazy&quot;
    &gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/br&gt;

&lt;h1&gt;无限城第一章落幕&lt;/h1&gt;
&lt;div style=&quot;width:100%;max-width:1200px;margin:auto&quot;&gt;
  &lt;div style=&quot;position:relative;padding-bottom:70%&quot;&gt;
    &lt;iframe
      src=&quot;https://picbed.131714.xyz/EndOfInfiniteCastlePart1.mp4&quot;
      style=&quot;position:absolute;top:0;left:0;width:100%;height:100%;border:none&quot;
      allowfullscreen
      loading=&quot;lazy&quot;
    &gt;&lt;/iframe&gt;
  &lt;/div&gt;
&lt;/div&gt;</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Mon, 05 Jan 2026 18:53:00 GMT</pubDate></item><item><title>Apple 非国区ID注册教程</title><link>https://hub.131714.xyz/blog/appleid/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/appleid/</guid><description>手把手教你注册 Apple 非国区（如美区、日区）ID</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/appleid/&quot;&gt;https://hub.131714.xyz/blog/appleid/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;
import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;
import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;
import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;&lt;/p&gt;
&lt;Info&gt;
本教程适用于需要注册 Apple 非国区（如美区、日区等）ID的用户，建议自用，勿用于灰产。
&lt;/Info&gt;

&lt;h2&gt;前期准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一个邮箱（QQ、谷歌、微软等常见邮箱均可）&lt;/li&gt;
&lt;li&gt;官方网址：&lt;a href=&quot;https://account.apple.com/account&quot;&gt;注册地址&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;一个自用的手机号&lt;/li&gt;
&lt;/ul&gt;
&lt;Warning&gt;
请勿使用虚假信息注册，避免账号被封。
&lt;/Warning&gt;

&lt;h2&gt;操作流程&lt;/h2&gt;
&lt;p&gt;&amp;lt;TimeLine
  items={[
    { year: &amp;quot;Step 1&amp;quot;, event: &amp;quot;访问 &lt;a href=&quot;https://account.apple.com/account&quot;&gt;Apple ID 注册官网&lt;/a&gt;&amp;quot; },
    { year: &amp;quot;Step 2&amp;quot;, event: &amp;quot;填写注册信息（邮箱、密码、姓名等）&amp;quot; },
    { year: &amp;quot;Step 3&amp;quot;, event: &amp;quot;选择国家或地区（如美国、日本等）&amp;quot; },
    { year: &amp;quot;Step 4&amp;quot;, event: &amp;quot;邮箱/手机验证&amp;quot; },
    { year: &amp;quot;Step 5&amp;quot;, event: &amp;quot;注册完成，可登录 Apple 相关服务&amp;quot; },
  ]}
/&amp;gt;&lt;/p&gt;
&lt;h2&gt;图文教程&lt;/h2&gt;
&lt;Collapse title=&quot;点击展开查看详细截图&quot;&gt;
  &lt;img src=&quot;https://img.131714.xyz/file/blog/Article/appleid/appleID01.webp&quot; alt=&quot;注册页面1&quot; /&gt;
  &lt;img src=&quot;https://img.131714.xyz/file/blog/Article/appleid/appleID02.webp&quot; alt=&quot;注册页面2&quot; /&gt;
  &lt;img src=&quot;https://img.131714.xyz/file/blog/Article/appleid/appleID03.webp&quot; alt=&quot;注册页面3&quot; /&gt;
  &lt;img src=&quot;https://img.131714.xyz/file/blog/Article/appleid/appleID04.webp&quot; alt=&quot;注册页面4&quot; /&gt;
&lt;/Collapse&gt;

&lt;Info&gt;
注册完成后，你可以在 App Store 下载国区无法获取的应用（如部分代理软件等）。
&lt;/Info&gt;</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Thu, 18 Sep 2025 00:00:00 GMT</pubDate></item><item><title>🚀 Umami 官方CSV数据导入自建Umami后端MySQL/PostgreSQL数据库</title><link>https://hub.131714.xyz/blog/umami-migration/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/umami-migration/</guid><description>将Umami云服务的CSV数据导入到自建MySQL或PostgreSQL数据库的完整解决方案，支持批量处理和自动去重。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/umami-migration/&quot;&gt;https://hub.131714.xyz/blog/umami-migration/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;&lt;br&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;br&gt;import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;&lt;br&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;; 
import FriendCard from &amp;quot;@/components/mdx/FriendCard.astro&amp;quot;;
import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;&lt;/p&gt;
&lt;h1&gt;🚀 Umami 官方CSV数据导入自建Umami后端MySQL/PostgreSQL数据库&lt;/h1&gt;
&lt;Info&gt;  
需要将Umami云服务的CSV数据导入到自建MySQL或PostgreSQL数据库的完整解决方案。  
&lt;/Info&gt;  
## 介绍  
  
&lt;p&gt;说起&lt;strong&gt;Umami&lt;/strong&gt;，相信很多朋友都在用它来做网站分析。界面简洁，功能也挺全面的，确实是个不错的选择。不过呢，如果你用的是&lt;strong&gt;Umami Cloud的免费版本&lt;/strong&gt;，时间长了可能就会发现一些限制了——比如&lt;strong&gt;数据保留时间不够长&lt;/strong&gt;，或者想分析更多域名但&lt;strong&gt;额度不够用&lt;/strong&gt;。  &lt;/p&gt;
&lt;p&gt;这时候，很多人就会考虑：要不&lt;strong&gt;自己搭一个Umami&lt;/strong&gt;？但问题来了，之前在云端积累的那些&lt;strong&gt;数据怎么办&lt;/strong&gt;？总不能就这么丢了吧？  &lt;/p&gt;
&lt;p&gt;别担心，这篇教程就是来解决这个问题的。我会&lt;strong&gt;手把手教你&lt;/strong&gt;怎么把&lt;strong&gt;Umami Cloud上的数据完整地迁移&lt;/strong&gt;到自己搭建的Umami上，让你的数据分析不中断，还能享受&lt;strong&gt;自托管的各种好处&lt;/strong&gt;。&lt;br&gt;&lt;Info&gt;&lt;br&gt;如果您还没有自己的服务器或Umami实例，可以先查看我的博客文章&lt;a href=&quot;https://hub.131714.xyz/blog/umamicourse&quot;&gt;&lt;strong&gt;&lt;em&gt;《Umami + Neon + Vercel：免费搭建隐私友好的自己的Umami后端网站分析系统》&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;，了解如何免费搭建自己的Umami服务。&lt;br&gt;&lt;/Info&gt;  &lt;/p&gt;
&lt;h2&gt;核心思路&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;官方数据导出
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami6.webp&quot; alt=&quot;&quot;&gt;&lt;/li&gt;
&lt;li&gt;读取CSV → 清洗数据 → 分表插入  &lt;/li&gt;
&lt;li&gt;MySQL使用&lt;code&gt;INSERT IGNORE&lt;/code&gt;，PostgreSQL使用&lt;code&gt;ON CONFLICT DO NOTHING&lt;/code&gt;  &lt;/li&gt;
&lt;li&gt;批量处理提升性能&lt;/li&gt;
&lt;/ol&gt;
&lt;Warning&gt;  
⚠️ **安全提醒**：请替换配置中的数据库连接信息为您自己的，不要在代码中硬编码敏感信息。  
&lt;/Warning&gt;

&lt;h3&gt;关键配置&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;MySQL版本&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pymysql
MYSQL_CONFIG = {
    &amp;#39;host&amp;#39;: &amp;#39;your-mysql-host.com&amp;#39;,
    &amp;#39;port&amp;#39;: 3306,
    &amp;#39;database&amp;#39;: &amp;#39;umami&amp;#39;,
    &amp;#39;user&amp;#39;: &amp;#39;your_username&amp;#39;,
    &amp;#39;password&amp;#39;: &amp;#39;your_password&amp;#39;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL版本（Neon数据库）&lt;/strong&gt;
&lt;Collapse title=&quot;PostgreSQL连接信息获取（Neon）&quot;&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami7.webp&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami8.webp&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami9.webp&quot; alt=&quot;&quot;&gt;
&lt;/Collapse&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import psycopg2
POSTGRES_CONFIG = {
    &amp;#39;host&amp;#39;: &amp;#39;your-project-pooler.region.aws.neon.tech&amp;#39;,
    &amp;#39;port&amp;#39;: 5432,
    &amp;#39;database&amp;#39;: &amp;#39;your_database&amp;#39;,
    &amp;#39;user&amp;#39;: &amp;#39;your_username&amp;#39;,
    &amp;#39;password&amp;#39;: &amp;#39;your_password&amp;#39;,
    &amp;#39;sslmode&amp;#39;: &amp;#39;require&amp;#39;
}
# 或者直接使用连接字符串
POSTGRES_URL = &amp;#39;postgresql://username:password@host:port/database?sslmode=require&amp;amp;channel_binding=require&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;连接字符串解析&lt;/strong&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;strong&gt;协议类型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postgresql://&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL数据库协议标识&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;username&lt;/code&gt;&lt;/td&gt;
&lt;td&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;password&lt;/code&gt;&lt;/td&gt;
&lt;td&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;@&lt;/code&gt;&lt;/td&gt;
&lt;td&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;host.pooler.region.aws.neon.tech&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据库服务器地址（Neon格式）&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;5432&lt;/code&gt;&lt;/td&gt;
&lt;td&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;database&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;目标数据库名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSL模式&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sslmode=require&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSL连接必须加密&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;channel_binding=require&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;通道绑定安全验证&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;数据库差异对比&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;特性&lt;/th&gt;
&lt;th&gt;MySQL&lt;/th&gt;
&lt;th&gt;PostgreSQL&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;INSERT IGNORE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ON CONFLICT DO NOTHING&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;`field`&lt;/td&gt;
&lt;td&gt;&amp;quot;field&amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;连接库&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;pymysql&lt;/td&gt;
&lt;td&gt;psycopg2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UUID类型&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VARCHAR(36)&lt;/td&gt;
&lt;td&gt;UUID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;时间戳&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DATETIME&lt;/td&gt;
&lt;td&gt;TIMESTAMP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;📥 完整代码生成&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard  
  title=&quot;Umami CSV导入脚本&quot;  
  desc=&quot;完整的Python脚本，支持MySQL和PostgreSQL双数据库导入&quot;  
  url=&quot;https://umjs.131714.xyz&quot;  
  img=&quot;https://img.131714.xyz/file/Avatar/1753524991293_avatar8.jpg&quot;  
/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;由于代码较长，完整版本已通过上方网页自行生成 ，包含以下功能：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 支持MySQL和PostgreSQL双数据库&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;/ul&gt;
&lt;p&gt;&lt;strong&gt;主要模块：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据库连接管理&lt;/li&gt;
&lt;li&gt;CSV数据读取和清洗&lt;/li&gt;
&lt;li&gt;批量数据插入&lt;/li&gt;
&lt;li&gt;结果验证和统计
🚀 使用说明&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装依赖包&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;pip install pandas numpy pymysql psycopg2-binary
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;&lt;strong&gt;修改配置&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;根据您的实际数据库信息修改配置参数：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据库连接信息&lt;/li&gt;
&lt;li&gt;CSV文件路径&lt;/li&gt;
&lt;li&gt;目标website_id&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;&lt;strong&gt;选择数据库类型&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;脚本会提示您选择MySQL或PostgreSQL，然后自动处理数据导入。&lt;/p&gt;
&lt;p&gt;⚠️ &lt;strong&gt;使用前须知&lt;/strong&gt; 
&lt;strong&gt;安全提醒：&lt;/strong&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;strong&gt;注意事项：&lt;/strong&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;/ul&gt;
&lt;h2&gt;🤝 特别感谢&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;在数据导入后端的实现过程中，得到了以下朋友的大力帮助：&lt;/strong&gt;&lt;br&gt;&lt;FriendCard
  name=&quot;April&quot;
  avatar=&quot;https://picbed.131714.xyz/picbed/20250726061546364.png&quot;
  description=&quot;人间四月芳菲尽！&quot;
  url=&quot;https://www.zhaocloud.work&quot;
  type=&quot;friend&quot;
/&gt;&lt;/p&gt;
&lt;h2&gt;📚 参考资料&lt;/h2&gt;
&lt;p&gt;本文参考了以下资源：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.closex.org/posts/29bdb155/&quot;&gt;Umami数据导出与迁移实践&lt;/a&gt; - 提供了数据迁移的思路和方法  &lt;/li&gt;
&lt;li&gt;完整的Python导入脚本由AI辅助生成，经过实际测试验证&lt;/li&gt;
&lt;/ul&gt;
&lt;Success&gt;  
感谢开源社区的分享精神，让技术知识得以传播和改进。如果这篇文章对您有帮助，也欢迎分享给更多需要的朋友。  
&lt;/Success&gt;  
  
&lt;hr&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate></item><item><title>🚀 Umami + Neon + Vercel：免费搭建隐私友好的自己的Umami后端网站分析系统</title><link>https://hub.131714.xyz/blog/umamicourse/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/umamicourse/</guid><description>详细教程：使用 Neon PostgreSQL 数据库和 Vercel 部署 Umami 网站分析工具，实现隐私优先的访问统计</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/umamicourse/&quot;&gt;https://hub.131714.xyz/blog/umamicourse/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;; 
import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;; 
import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;; 
import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;; 
import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;; 
import Kbd from &amp;quot;../../components/mdx/Kbd.astro&amp;quot;; &lt;/p&gt;
&lt;h2&gt;📝 一、前提条件&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;前提准备：&lt;/strong&gt; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ 一个 &lt;a href=&quot;https://github.com/&quot;&gt;&lt;strong&gt;&lt;em&gt;GitHub&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; 账号（用于 fork &amp;amp; 部署） &lt;/li&gt;
&lt;li&gt;✅ 一个 &lt;a href=&quot;https://vercel.com/&quot;&gt;&lt;strong&gt;&lt;em&gt;Vercel&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; 账号（免费可用） &lt;/li&gt;
&lt;li&gt;✅ 一个 &lt;a href=&quot;https://neon.tech/&quot;&gt;&lt;strong&gt;&lt;em&gt;Neon&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; 账号（免费 PostgreSQL 数据库） &lt;/li&gt;
&lt;li&gt;✅ 基础 &lt;strong&gt;Node.js / Git&lt;/strong&gt; 操作知识（非强制）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🗄️ 二、什么是 Neon？&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard 
 title=&quot;Neon&quot; 
 desc=&quot;现代化的无服务器 PostgreSQL 数据库平台&quot; 
 url=&quot;https://neon.tech/&quot; 
 img=&quot;https://neon.tech/favicon.ico&quot; 
/&gt; &lt;/p&gt;
&lt;Info&gt; 
Neon 是一个现代化的 PostgreSQL 数据库服务，提供无服务器架构、自动扩缩容和分支功能，非常适合现代 Web 应用。 
&lt;/Info&gt; 

&lt;h2&gt;🧩 三、什么是 Umami？&lt;/h2&gt;
&lt;p&gt;&lt;LinkCard 
 title=&quot;Umami&quot; 
 desc=&quot;轻量级、隐私优先的网站分析工具&quot; 
 url=&quot;https://github.com/umami-software/umami&quot; 
 img=&quot;https://img.131714.xyz/file/Logo/1753850918996_umami.png&quot; 
/&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Umami是一个轻量级、隐私优先的网站分析工具：&lt;/strong&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;li&gt;🍪 不依赖 cookie&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;🛠️ 四、在 Neon 上部署 PostgreSQL 数据库&lt;/h2&gt;
&lt;Collapse title=&quot;详细步骤展开&quot;&gt; 


&lt;ol&gt;
&lt;li&gt;&lt;p&gt;打开 &lt;a href=&quot;https://neon.tech/&quot;&gt;https://neon.tech/&lt;/a&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;获取数据库连接信息&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami1.webp&quot; alt=&quot;umami1.png&quot;&gt; &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami2.webp&quot; alt=&quot;umami2.png&quot;&gt; &lt;/p&gt;
&lt;/Collapse&gt; 

&lt;Success&gt; 
Neon 提供免费的 PostgreSQL 数据库，非常适合小型项目使用！ 
&lt;/Success&gt; 

&lt;hr&gt;
&lt;h2&gt;🚀 五、在 Vercel 上部署 Umami&lt;/h2&gt;
&lt;h3&gt;1. Fork 仓库&lt;/h3&gt;
&lt;p&gt;前往 &lt;a href=&quot;https://github.com/umami-software/umami&quot;&gt;&lt;strong&gt;&lt;em&gt;umami 仓库&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;，点击 &lt;strong&gt;Fork&lt;/strong&gt;。 &lt;/p&gt;
&lt;h3&gt;2. 在 Vercel 导入仓库&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;登录 Vercel，点击 &lt;strong&gt;New Project&lt;/strong&gt; → &lt;strong&gt;Import Git Repository&lt;/strong&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;选择你 Fork 的 &lt;code&gt;umami&lt;/code&gt; 仓库 &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;设置环境变量（Environment Variables）：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;HASH_SALT=任意字符串（用于密码加盐，建议随机生成） 
DATABASE_TYPE=postgresql 
DATABASE_URL=postgresql://&amp;lt;user&amp;gt;:&amp;lt;password&amp;gt;@&amp;lt;host&amp;gt;:&amp;lt;port&amp;gt;/umami
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠ 将 &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;password&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;host&amp;gt;&lt;/code&gt; &lt;code&gt;&amp;lt;port&amp;gt;&lt;/code&gt; 替换为 Neon 提供的连接信息&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;点击 &lt;strong&gt;Deploy&lt;/strong&gt; 部署。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 六、访问 Umami 后台&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;打开部署成功后的地址，例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://umami-yourproject.vercel.app
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;默认管理员账号：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用户名：admin
密码：umami
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;登录后务必修改默认密码。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;📦 七、在网站中嵌入统计代码&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami3.webp&quot; alt=&quot;umami3.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami4.webp&quot; alt=&quot;umami4.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;在你的网站 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 或 &lt;code&gt;&amp;lt;/body&amp;gt;&lt;/code&gt; 前插入以下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;script defer
  src=&amp;quot;https://umami-yourproject.vercel.app/script.js&amp;quot;
  data-website-id=&amp;quot;你的网站ID&amp;quot;
&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;data-website-id&lt;/code&gt;：在 Umami 后台“添加网站”时会生成一个 UUID&lt;/li&gt;
&lt;li&gt;支持多个站点，每个站点生成独立的 ID&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;📊 八、功能预览&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/umami/umami5.webp&quot; alt=&quot;umami5.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Umami 提供丰富的分析功能：&lt;/strong&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;hr&gt;
&lt;h2&gt;📚 九、参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Umami 文档：&lt;a href=&quot;https://umami.is/docs&quot;&gt;https://umami.is/docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub 仓库：&lt;a href=&quot;https://github.com/umami-software/umami&quot;&gt;https://github.com/umami-software/umami&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Neon 官网：&lt;a href=&quot;https://neon.tech/&quot;&gt;https://neon.tech/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vercel 官网：&lt;a href=&quot;https://vercel.com/&quot;&gt;https://vercel.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Fri, 08 Aug 2025 00:00:00 GMT</pubDate></item><item><title>WordPress动态网站托管在InfinityFree平台</title><link>https://hub.131714.xyz/blog/infinityfree/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/infinityfree/</guid><description>详细介绍如何在InfinityFree免费主机平台部署WordPress网站，并使用EdgeOne CDN进行加速优化的完整教程</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/infinityfree/&quot;&gt;https://hub.131714.xyz/blog/infinityfree/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;&lt;br&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;br&gt;import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;&lt;br&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;&lt;br&gt;import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;  &lt;/p&gt;
&lt;h2&gt;1、前期准备&lt;/h2&gt;
&lt;p&gt;在开始部署之前，您需要准备以下资源：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;EdgeOne CDN账号&lt;/strong&gt;（可选，用于网站加速。如使用InfinityFree提供的免费域名，国内访问速度较慢）  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;InfinityFree账号&lt;/strong&gt;（免费主机服务商）  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;域名&lt;/strong&gt;（可选，也可使用InfinityFree平台提供的免费域名）&lt;/li&gt;
&lt;/ul&gt;
&lt;Warning&gt;  
使用免费域名虽然成本为零，但在国内访问速度和稳定性方面可能存在限制。建议有条件的用户购买独立域名以获得更好的用户体验。  
&lt;/Warning&gt;  
  
&lt;h2&gt;2、平台介绍&lt;/h2&gt;
&lt;h3&gt;InfinityFree平台介绍&lt;/h3&gt;
&lt;p&gt;&lt;LinkCard  
  title=&quot;InfinityFree&quot;  
  desc=&quot;提供免费PHP主机服务，支持MySQL数据库，适合WordPress等动态网站部署&quot;  
  url=&quot;https://www.infinityfree.com/&quot;  
  img=&quot;https://img.131714.xyz/file/Logo/1754280946361_InfinityFree.png&quot;  
/&gt;  &lt;/p&gt;
&lt;p&gt;InfinityFree 是一个知名的免费虚拟主机服务商，提供以下特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;约 5 GB 磁盘空间 和 大额度流量（受每日访问次数和资源使用限制）&lt;/li&gt;
&lt;li&gt;支持 PHP 8.x 和 MySQL 数据库&lt;/li&gt;
&lt;li&gt;免费 SSL 证书（支持 Let&amp;#39;s Encrypt）&lt;/li&gt;
&lt;li&gt;自带 VistaPanel 控制面板（类似 cPanel）&lt;/li&gt;
&lt;li&gt;支持绑定 自定义域名 和创建子域名&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;EdgeOne介绍&lt;/h3&gt;
&lt;p&gt;&lt;LinkCard  
  title=&quot;EdgeOne&quot;  
  desc=&quot;腾讯云提供的边缘计算和CDN加速服务&quot;  
  url=&quot;https://edgeone.ai&quot;  
  img=&quot;https://hub.131714.xyz/image/icons/edgeone.png&quot;  
/&gt;  &lt;/p&gt;
&lt;p&gt;EdgeOne是腾讯云的边缘计算平台，主要优势：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;针对中国大陆网络环境优化  &lt;/li&gt;
&lt;li&gt;智能路由和加速  &lt;/li&gt;
&lt;li&gt;DDoS防护和安全防护  &lt;/li&gt;
&lt;li&gt;支持动态和静态内容加速&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3、EdgeOne账号注册&lt;/h2&gt;
&lt;Collapse title=&quot;EdgeOne注册详细步骤&quot;&gt;  
  
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://edgeone.ai/&quot;&gt;EdgeOne官网&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;点击&amp;quot;立即注册&amp;quot;按钮  &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;/ol&gt;
&lt;/Collapse&gt;  
  
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity1.webp&quot; alt=&quot;EdgeOne注册界面&quot;&gt;  &lt;/p&gt;
&lt;Info&gt;  
EdgeOne目前不提供免费额度，但最近有活动可以获取免费套餐。访问 [**_活动网址_**](https://edgeone.ai/get-free-plan?from=marketing_banner) 进行测速分享可以获得两个免费套餐。  
&lt;/Info&gt;  
  
&lt;h2&gt;4、InfinityFree账号注册&lt;/h2&gt;
&lt;Collapse title=&quot;InfinityFree注册详细步骤&quot;&gt;  
  
&lt;ol&gt;
&lt;li&gt;访问 &lt;a href=&quot;https://infinityfree.net&quot;&gt;InfinityFree官网&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;点击&amp;quot;Create Account&amp;quot;  &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;/ol&gt;
&lt;/Collapse&gt;  
  
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity2.webp&quot; alt=&quot;InfinityFree注册界面&quot;&gt;  &lt;/p&gt;
&lt;Success&gt;  
注册成功后，您将获得一个免费的子域名，格式通常为：yourusername.infinityfreeapp.com  
&lt;/Success&gt;  
  
&lt;h2&gt;5、InfinityFree详细安装WordPress教程&lt;/h2&gt;
&lt;Collapse title=&quot;WordPress安装步骤图解&quot;&gt;  
  
&lt;h3&gt;步骤1：创建主机账户&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity3.webp&quot; alt=&quot;创建主机账户&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;步骤2：选择计划&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity4.webp&quot; alt=&quot;选择计划&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;步骤3：选择域名&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity5.webp&quot; alt=&quot;选择域名&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;步骤4：打开管理界面&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity6.webp&quot; alt=&quot;打开管理界面&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;步骤5：访问控制面板&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity7.webp&quot; alt=&quot;访问控制面板&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;步骤6：安装WordPress&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity8.webp&quot; alt=&quot;安装WordPress&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;步骤7：配置WordPress&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity9.webp&quot; alt=&quot;配置WordPress&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity10.webp&quot; alt=&quot;完成安装&quot;&gt;  &lt;/p&gt;
&lt;/Collapse&gt;  
  
&lt;h3&gt;验证安装结果&lt;/h3&gt;
&lt;p&gt;安装完成后，使用平台提供的域名访问您的网站：  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity11.webp&quot; alt=&quot;WordPress前台界面&quot;&gt;  &lt;/p&gt;
&lt;p&gt;要访问后台管理界面，在域名后添加 &lt;code&gt;/wp-admin&lt;/code&gt;，使用管理员账户登录：  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity12.webp&quot; alt=&quot;WordPress后台界面&quot;&gt;  &lt;/p&gt;
&lt;Warning&gt;  
如果您已经在其他地方部署过WordPress，可以将主题文件和数据库文件迁移过来。  
&lt;/Warning&gt;  
  
&lt;h2&gt;6、配置EdgeOne CDN加速&lt;/h2&gt;
&lt;Warning&gt;  
EdgeOne不提供免费使用，但最近有活动可以获取免费套餐。访问 [**_活动网址_**](https://edgeone.ai/get-free-plan?from=marketing_banner) 进行测速分享可以获得两个免费套餐。  
&lt;/Warning&gt;  
  
&lt;h3&gt;6.1 添加站点&lt;/h3&gt;
&lt;Info&gt;  
需要使用自己购买的一级域名，否则无法添加站点。目前免费域名无法添加，EdgeOne需要验证域名归属权。  
&lt;/Info&gt;  
  
&lt;ol&gt;
&lt;li&gt;登录EdgeOne控制台  &lt;/li&gt;
&lt;li&gt;点击&amp;quot;添加站点&amp;quot;  &lt;/li&gt;
&lt;li&gt;输入您的域名  &lt;/li&gt;
&lt;li&gt;选择获得的免费套餐  &lt;/li&gt;
&lt;li&gt;完成站点添加&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;6.2 域名配置流程&lt;/h3&gt;
&lt;Collapse title=&quot;EdgeOne域名配置详细步骤&quot;&gt;  
  
&lt;h4&gt;步骤1：添加域名&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity13.webp&quot; alt=&quot;添加域名&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;步骤2：DNS配置&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity14.webp&quot; alt=&quot;DNS配置&quot;&gt;  &lt;/p&gt;
&lt;h4&gt;步骤3：HTTPS配置&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity15.webp&quot; alt=&quot;HTTPS配置&quot;&gt;  &lt;/p&gt;
&lt;/Collapse&gt;  
  
&lt;h3&gt;6.3 WordPress站点地址配置&lt;/h3&gt;
&lt;p&gt;在WordPress后台管理界面，将站点地址和WordPress地址改为您的自定义域名：  &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity16.webp&quot; alt=&quot;WordPress地址配置&quot;&gt;  &lt;/p&gt;
&lt;h3&gt;6.4 加速效果对比&lt;/h3&gt;
&lt;p&gt;配置EdgeOne CDN前后的访问速度对比：  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置前（直接访问）：&lt;/strong&gt;&lt;br&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity17.webp&quot; alt=&quot;配置前速度&quot;&gt;  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置后（CDN加速）：&lt;/strong&gt;&lt;br&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/infinityfree/Infinity18.webp&quot; alt=&quot;配置后速度&quot;&gt;  &lt;/p&gt;
&lt;Success&gt;  
配置完成后，您的WordPress网站将通过EdgeOne CDN进行全球加速，显著提升访问速度和用户体验！  
&lt;/Success&gt;  
  
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过本教程，您已经成功完成：  &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;✅ 注册EdgeOne和InfinityFree账号  &lt;/li&gt;
&lt;li&gt;✅ 在免费主机上部署WordPress  &lt;/li&gt;
&lt;li&gt;✅ 配置CDN加速服务  &lt;/li&gt;
&lt;li&gt;✅ 优化网站性能和安全性&lt;/li&gt;
&lt;/ol&gt;
&lt;Info&gt;  
建议定期备份网站数据，监控网站性能，并根据实际需求调整CDN配置以获得最佳效果。  
&lt;/Info&gt;</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Mon, 04 Aug 2025 00:00:00 GMT</pubDate></item><item><title>🛠️ 少年游未尽，我在折腾中成长</title><link>https://hub.131714.xyz/blog/growth-log/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/growth-log/</guid><description>从零开始捣鼓博客与建站：搭博客、部署评论、配置 Cloudflare 和图床、用 Git 管理项目……这是我从小白到站长的完整技术成长记录。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/growth-log/&quot;&gt;https://hub.131714.xyz/blog/growth-log/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;import Collapse from &amp;quot;../../components/mdx/Collapse.astro&amp;quot;;&lt;br&gt;import Info from &amp;quot;../../components/mdx/Info.astro&amp;quot;;&lt;br&gt;import Success from &amp;quot;../../components/mdx/Success.astro&amp;quot;;&lt;br&gt;import Warning from &amp;quot;../../components/mdx/Warning.astro&amp;quot;;&lt;br&gt;import TimeLine from &amp;quot;../../components/mdx/TimeLine.astro&amp;quot;;&lt;br&gt;import LinkCard from &amp;quot;../../components/mdx/LinkCard.astro&amp;quot;;  &lt;/p&gt;
&lt;h1&gt;🚀 从 0 到 1：我的折腾记录&lt;/h1&gt;
&lt;Info&gt;  
这一段时间，**从完全不会建站，到现在能搭博客、部署评论、玩 Cloudflare 和图床、用 Git 管理项目、自己写页面**…  
  
&lt;p&gt;虽然大多数东西都是现学现用、边查边做，但也正是这种折腾，带来了最大的成就感。  &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;也许我的站点看起来不够&amp;quot;高级&amp;quot;，但它的每一个页面、每一个功能，都是我亲手一点点折腾出来的。&lt;/strong&gt;&lt;br&gt;&lt;/Info&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;⏳ 技术成长时间线&lt;/h2&gt;
&lt;p&gt;&amp;lt;TimeLine&lt;br&gt;  items={[&lt;br&gt;    { year: &amp;quot;阶段1&amp;quot;, event: &amp;quot;🧊 SMB + Infuse 实现局域网影视播放&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段2&amp;quot;, event: &amp;quot;🧰 Alist + Cloudflare Tunnel 远程访问本地文件&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段3&amp;quot;, event: &amp;quot;🌐 GitHub Page + Vue 静态博客初体验&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段4&amp;quot;, event: &amp;quot;🧱 本地部署 WordPress（XAMPP）&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段5&amp;quot;, event: &amp;quot;🖼️ PicGo → Telegram 图床 + Web UI + Cloudflare R2&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段6&amp;quot;, event: &amp;quot;💠 更换二次元风格主题（Boxmoe / Lolimeow）&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段7&amp;quot;, event: &amp;quot;🧍 个人主页打包展示所有项目&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段8&amp;quot;, event: &amp;quot;📁 静态博客 fork + 自定义配置&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段9&amp;quot;, event: &amp;quot;💬 评论系统的思考：Giscus vs Waline&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段10&amp;quot;, event: &amp;quot;📊 加入 Umami 网站统计 + 自定义文章浏览量模块&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段11&amp;quot;, event: &amp;quot;🔍 接入微软 Clarity 用户行为分析&amp;quot; },&lt;br&gt;    { year: &amp;quot;阶段12&amp;quot;, event: &amp;quot;🧭 添加导航页收集常用站点&amp;quot; }&lt;br&gt;  ]}&lt;br&gt;/&amp;gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🧊 1. 从 SMB 共享开启的观影时代&lt;/h2&gt;
&lt;p&gt;最早的一次技术折腾，就是想在 iPad 上看电脑里的影视剧。&lt;br&gt;以前都是先下载、再传输、再播放，贼麻烦。&lt;br&gt;后来发现了 &lt;strong&gt;Infuse&lt;/strong&gt; 这个 App，居然支持 SMB 共享挂载，直接串流播放电脑里的视频，太牛了！  &lt;/p&gt;
&lt;Success&gt;  
配置 SMB 的过程也让我第一次接触到了局域网共享，设置路径、权限、文件夹访问…手把手学会，体验一下子上了好几个台阶。  
&lt;/Success&gt;  
  
&lt;hr&gt;
&lt;h2&gt;🧰 2. Alist + Cloudflare Tunnel：让本地文件飞起来&lt;/h2&gt;
&lt;p&gt;Infuse 后，我开始思考——&lt;strong&gt;能不能在外面也访问我本地的文件？&lt;/strong&gt;  &lt;/p&gt;
&lt;p&gt;&lt;LinkCard  
  title=&quot;Alist&quot;  
  desc=&quot;一个支持多种存储的文件列表程序，使用 Gin 和 Solidjs。&quot;  
  url=&quot;https://github.com/alist-org/alist&quot;  
  img=&quot;https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg&quot;  
/&gt;  &lt;/p&gt;
&lt;p&gt;查资料的时候遇到一个神器项目：&lt;strong&gt;Alist&lt;/strong&gt;，能把本地文件挂载成一个网页浏览器，简直绝了！&lt;br&gt;&lt;Collapse title=&quot;解决方案详解&quot;&gt;&lt;br&gt;但问题来了：我没有服务器、也没有公网 IP，怎么让别人访问我本地的服务？  &lt;/p&gt;
&lt;p&gt;查着查着，发现了 &lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt;，直接内网穿透！完美解决。  &lt;/p&gt;
&lt;h2&gt;我还顺便买了人生中第一个阿里云域名，算是真正迈出了&amp;quot;站长第一步&amp;quot;。&lt;br&gt;&lt;/Collapse&gt;  &lt;/h2&gt;
&lt;Warning&gt;  
⚠️ **重要更新**：原来的 Alist 项目已经转手，出于安全考虑，我后面改用了 Alist 的 Fork 项目 **OpenList**。  
&lt;/Warning&gt;  
---  
&lt;Info&gt;  
感兴趣的可以查看我的博客部署教程：[OpenList 本地部署指南](https://hub.131714.xyz/blog/openlist/)  
  
&lt;p&gt;也可以查看 &lt;a href=&quot;https://docs.oplist.org/zh/&quot;&gt;OpenList 官方文档&lt;/a&gt;。我目前使用的就是 OpenList。&lt;br&gt;&lt;/Info&gt; &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🌐 3. 初识 GitHub 博客：惊为天人&lt;/h2&gt;
&lt;p&gt;偶然在 B 站刷到 Vue 搭建的博客项目，被界面惊艳到。  &lt;/p&gt;
&lt;p&gt;于是跟着部署教程，第一次认真使用 GitHub：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;clone 仓库  &lt;/li&gt;
&lt;li&gt;配置 token  &lt;/li&gt;
&lt;li&gt;提交 push  &lt;/li&gt;
&lt;li&gt;配置 Actions 自动部署&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;Success&gt;边学边感叹：&lt;strong&gt;GitHub 这东西也太香了吧！&lt;/strong&gt;&lt;/Success&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🧱 4. WordPress 本地部署：玩转 XAMPP&lt;/h2&gt;
&lt;p&gt;又被一个叫 Argon 的 WordPress 主题种草，UI 那叫一个顺眼。  &lt;/p&gt;
&lt;p&gt;但没有服务器怎么办？查了一圈，找到了 XAMPP！  &lt;/p&gt;
&lt;Info&gt;  
Windows 本地环境 + WordPress + 本地数据库，一通操作下来终于跑起来了。  
  
&lt;p&gt;还写了几篇文章当博客玩：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git 使用教程  &lt;/li&gt;
&lt;li&gt;Hive 离线数仓  &lt;/li&gt;
&lt;li&gt;数据挖掘学习笔记  &lt;/Info&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;🖼️ 5. 折腾图床系统：PicGo 到 Telegram + R2&lt;/h2&gt;
&lt;p&gt;发博客时最头疼的是图片——不能总传本地图吧？  &lt;/p&gt;
&lt;Collapse title=&quot;图床系统演进历程&quot;&gt;  
  
&lt;h3&gt;✅ 第一阶段：PicGo + GitHub 仓库图床&lt;/h3&gt;
&lt;p&gt;体验很好，但问题是 GitHub 仓库一堆图片又丑又乱，还经常加载慢。  &lt;/p&gt;
&lt;h3&gt;📷 第二阶段：Telegram 图床 + 网页 UI 管理界面&lt;/h3&gt;
&lt;p&gt;TG 频道 + Bot + WebUI，拖拽上传即生成直链链接，还能预览、分类，堪比小型图床相册系统，视觉体验拉满！  &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上传逻辑是 Bot 转发图片 → Web UI 生成链接 → 自动绑定图床地址，真的像做了个小产品！  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;☁️ 第三阶段：Cloudflare R2 加入图床系统&lt;/h3&gt;
&lt;p&gt;为了更快访问速度，还接入了 Cloudflare R2 存储，图像资源全部走 CDN 加速。  &lt;/p&gt;
&lt;/Collapse&gt;  
  
&lt;hr&gt;
&lt;h2&gt;💠 6. 二次元风格主题：Boxmoe 模板真香！&lt;/h2&gt;
&lt;p&gt;刷到一个 up 主博客样式爆炸好看，一查发现是 Boxmoe 的 &lt;a href=&quot;https://www.boxmoe.com/468.html&quot;&gt;&lt;code&gt;lolimeow&lt;/code&gt;&lt;/a&gt; 主题。  &lt;/p&gt;
&lt;p&gt;&lt;Success&gt;二次元 UI 完美戳中我审美，立马动手换主题 + 调样式，直接美化！&lt;/Success&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🧍 7. 个人主页整合&lt;/h2&gt;
&lt;p&gt;既然有博客了，也顺便做了个导航页，整合我做过的项目、图床、博客、API 端口等等。&lt;br&gt;像一张属于自己的 ID 卡。  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;📁 8. 静态博客 + 自定义改造&lt;/h2&gt;
&lt;p&gt;被某个静态博客模板种草后 fork 下来，开始一步步魔改： 
&lt;LinkCard
  title=&quot;Frosti&quot;
  desc=&quot;A clean, elegant, and fast static blog template! 🚀 Developed with Astro&quot;
  url=&quot;https://frosti.saroprock.com&quot;
  img=&quot;https://frosti.saroprock.com/profile.png&quot;
/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;接下来就是&lt;strong&gt;嘎嘎一顿造&lt;/strong&gt;哈，改成我现在这个博客的样子  &lt;/p&gt;
&lt;Collapse title=&quot;魔改过程详解&quot;&gt;  &lt;/blockquote&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;迁移 WordPress 上的文章  &lt;/li&gt;
&lt;li&gt;自定义样式、主题配色&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学到的远比想象的多！&lt;br&gt;&lt;/Collapse&gt;  &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;💬 9. 评论系统的思考：Giscus vs Waline&lt;/h2&gt;
&lt;p&gt;想要博客有互动，那就得有评论。  &lt;/p&gt;
&lt;p&gt;经过对比，我倾向于选择 Giscus 方案：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基于 GitHub Discussions，无需额外服务器  &lt;/li&gt;
&lt;li&gt;读者可以直接用 GitHub 账号参与讨论  &lt;/li&gt;
&lt;li&gt;对技术博客来说更加合适&lt;/li&gt;
&lt;/ul&gt;
&lt;Info&gt;  
虽然还没有实际部署，但这个想法很符合我&quot;折腾&quot;的精神 —— 总是在寻找更好的解决方案！  
&lt;/Info&gt;  
  
&lt;hr&gt;
&lt;h2&gt;📊 10. Umami 网站统计 + 自定义模块&lt;/h2&gt;
&lt;p&gt;用 Umami 加入访问数据统计后，博客体验更完整了：  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每日访问量  &lt;/li&gt;
&lt;li&gt;热门文章  &lt;/li&gt;
&lt;li&gt;访问来源等&lt;br&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/growth-log/p01.webp&quot; alt=&quot;Umami展示&quot;&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;Warning&gt;  
还尝试接入 token 获取实时浏览量，用异步方式加载失败，服务端渲染也不理想，暂时搁置（以后再研究）。  
&lt;/Warning&gt;  
  
&lt;hr&gt;
&lt;h2&gt;🔍 11. 微软 Clarity：深入了解用户行为&lt;/h2&gt;
&lt;p&gt;在有了 Umami 的基础统计后，我开始想要更深入地了解用户在网站上的具体行为。  &lt;/p&gt;
&lt;Success&gt;  
发现了微软的 Clarity 工具，提供热力图、用户录屏、点击分析等功能，完全免费！配合 Umami 使用，数据分析更全面。  
&lt;/Success&gt;  
---  
&lt;Collapse title=&quot;Clarity vs Umami 对比&quot;&gt;  
- **Umami**：注重隐私保护，提供基础的访问统计  
- **Clarity**：提供详细的用户行为分析，包括热力图和会话录制  
- **组合使用**：两者互补，既保护隐私又获得深度洞察  
&lt;/Collapse&gt;  
![Clarity展示](https://img.131714.xyz/file/blog/Article/growth-log/p02.webp)
---  
  
&lt;h2&gt;🧭 12. 搭建导航页&lt;/h2&gt;
&lt;p&gt;把常用网站整理成卡片组件样式，每次开博客就能快速进入常用页面，整洁又实用！ 
&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/growth-log/p03.webp&quot; alt=&quot;导航页示例&quot;&gt; &lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🎉 最后的话&lt;/h2&gt;
&lt;p&gt;也许在别人眼里，这些折腾显得 &lt;strong&gt;“麻烦”“没必要”&lt;/strong&gt;，&lt;br&gt;但我始终相信：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;成长、眼界的拓宽，正是从一次次主动探索中，一点点积累起来的。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;💡 &lt;strong&gt;生活嘛，总得做些自己真正感兴趣的事吧？&lt;/strong&gt;&lt;br&gt;只要你热爱，它就值得你投入。&lt;br&gt;&lt;strong&gt;拥有一个属于自己的小世界，也挺酷的。&lt;/strong&gt;    &lt;/p&gt;
&lt;p&gt;从一开始的&lt;strong&gt;一窍不通&lt;/strong&gt;,到如今能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搭博客  &lt;/li&gt;
&lt;li&gt;配评论系统  &lt;/li&gt;
&lt;li&gt;折腾 Cloudflare 和图床  &lt;/li&gt;
&lt;li&gt;用 Git 管理项目  &lt;/li&gt;
&lt;li&gt;甚至亲手改写前端页面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;哪怕是 &lt;strong&gt;现学现用、边查边做、解决不了就问 AI&lt;/strong&gt;，&lt;br&gt;这个 &lt;strong&gt;“从零到一”&lt;/strong&gt; 的过程，&lt;br&gt;就是最让人上头、也最有成就感的地方。&lt;/p&gt;
&lt;p&gt;很多个夜晚，我都一搞就到天亮，&lt;br&gt;&lt;strong&gt;完全沉浸在专注与创造的喜悦中。&lt;/strong&gt;&lt;br&gt;那种满足感，是其他事情难以带来的。&lt;/p&gt;
&lt;h3&gt;🌼🍶 欲买桂花同载酒，终不似，少年游。&lt;/h3&gt;
&lt;p&gt;年少的轻狂与热爱，终究会被时间温柔收起，&lt;br&gt;但只要我们还在为热爱的事投入时间，&lt;br&gt;那份“少年气”，就从未真正离开过。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;❤️ 最后，&lt;/h3&gt;
&lt;p&gt;感谢那个愿意折腾、肯深夜啃文档的自己，&lt;br&gt;也希望看到这篇文章的你，&lt;br&gt;也能勇敢开启，属于你的探索之旅。✨&lt;/p&gt;
&lt;p&gt;&lt;Success&gt;想折腾？那就现在开始吧。你会发现，这条路其实很有趣。&lt;/Success&gt;&lt;/p&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Sun, 27 Jul 2025 08:00:00 GMT</pubDate></item><item><title>🚀 Data Struct Sort</title><link>https://hub.131714.xyz/blog/sort/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/sort/</guid><description>数据结构中的排序算法介绍，包括快速排序、堆排序和归并排序的实现方法。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/sort/&quot;&gt;https://hub.131714.xyz/blog/sort/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;🚀 Data Struct Sort&lt;/h1&gt;
&lt;h2&gt;快速排序&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;list = [1, 6, 9, 2, 5, 0, 7, 3]
def quickSort(list, low, high):
    if (low &amp;lt; high):
        pivot = huafen(list, low, high) # 取基准
        quickSort(list, low, pivot - 1) #左子区
        quickSort(list, pivot + 1, high) #右子区
def huafen(list, low, high):
    pivot = list[low] #定基准
    # 判断是否有小于pivot的值，没有则往左以此检查
    while(low &amp;lt; high and list[high] &amp;gt; pivot):
        high -= 1
    list[low] = list[high]
    # 判断是否有大于pivot的值，没有则往右以此检查
    while(low &amp;lt; high and list[low] &amp;lt;= pivot):
        low += 1
    list[high] = list[low]
    # 放回pivot (因为最后low=high，所以这里写low或者是high都相同)
    list[low] = pivot
    # 返回基准索引
    return low
if __name__ == &amp;quot;__main__&amp;quot;:
    print(&amp;#39;排序前：&amp;#39;, list)
    quickSort(list, 0, len(list) - 1)
    print(&amp;#39;排序后：&amp;#39;, list)

排序前： [1, 6, 9, 2, 5, 0, 7, 3]
排序后： [0, 1, 2, 3, 5, 6, 7, 9]
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;#include &amp;lt;stdio.h&amp;gt;
// 划分函数（类似于 Python 的 huafen）
int partition(int arr[], int low, int high) {
    int pivot = arr[low];   // 选择第一个元素作为基准
    while (low &amp;lt; high) {
        // 从右往左找比 pivot 小的元素
        while (low &amp;lt; high &amp;amp;&amp;amp; arr[high] &amp;gt; pivot) {
            high--;
        }
        arr[low] = arr[high];  // 把小的值移到左侧
        // 从左往右找比 pivot 大的元素
        while (low &amp;lt; high &amp;amp;&amp;amp; arr[low] &amp;lt;= pivot) {
            low++;
        }
        arr[high] = arr[low];  // 把大的值移到右侧
    }

    // 放回 pivot
    arr[low] = pivot;
    return low;  // 返回基准索引
}

// 快速排序递归实现
void quickSort(int arr[], int low, int high) {
    if (low &amp;lt; high) {
        int pivot = partition(arr, low, high);  // 划分
        quickSort(arr, low, pivot - 1);  // 递归排序左侧
        quickSort(arr, pivot + 1, high); // 递归排序右侧
    }
}
// 打印数组
void printArray(int arr[], int size) {
    for (int i = 0; i &amp;lt; size; i++) {
        printf(&amp;quot;%d &amp;quot;, arr[i]);
    }
    printf(&amp;quot;\n&amp;quot;);
}
// 主函数
int main() {
    int arr[] = {1, 6, 9, 2, 5, 0, 7, 3};
    int size = sizeof(arr) / sizeof(arr[0]);
    printf(&amp;quot;排序前：&amp;quot;);
    printArray(arr, size);

    quickSort(arr, 0, size - 1);

    printf(&amp;quot;排序后：&amp;quot;);
    printArray(arr, size);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;堆排序&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 建立大根堆
void BuildMaxHeap(int A[], int len){
    for(int i = len / 2;i &amp;gt; 0;i--)  // 从后往前调整所有非终端结点
        HeadAdjust(A, i, len);
}

// 将以K为根的字树调整为大根堆
void HeadAdjust(int A[],int k,int len){
    A[0] = A[k];                        // A[0]暂存子树的根节点
    for(int i = 2 * k;i &amp;lt;= len;i*=2){   // 沿key较大的子结点向下筛选
        if(i &amp;lt; len &amp;amp;&amp;amp; A[i] &amp;lt; A[i+1])
            i++;                        // 取key较大的子结点下标
        if(A[0] &amp;gt;= A[i])    break;      // 筛选结果
        else{
            A[k] = A[i];                // 将A[i]调整到双亲结点上
            k = i;                      // 修改k值，以便继续向下筛选
        }
    }
    A[k] = A[0];                        // 被筛选结点的值放入最终位置
}
    
// 堆排序的完整逻辑
void HeapSort(int A[], int len){
    BuildMaxHeap(int A[], int len);
    for (int i=len;i&amp;gt;1;i--){
        swap(A[i], A[1]);
        HeadAdjust(A,1,i-1);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;归并排序&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;int *B = (int *)malloc(n*sizeof(int));  //辅助数组B
// A[low~mid]和A[mid+1~high]各自有序，将两部分进行合并
void Merge(int A[], int low, int mid, int high){
    int i, j, k;
    // 将A中所有元素复制到B中
    for(k=low;k&amp;lt;=high;k++){
        B[k] = A[k]；
    }
    for(i=low,j=mid+1,k=i;i&amp;lt;=mid&amp;amp;&amp;amp;j&amp;lt;=high;k++){
        if(B[i]&amp;lt;=B[j])
            A[k] = B[i++];
        else
            A[k] = B[j++];
    }
    while(i&amp;lt;=mid)   A[k] = B[i++];
    while(j&amp;lt;=high)  A[k] = B[j++];
}

void MergeSort(int A[], int low, int high){
    if(low&amp;lt;high){
        int mid = (low+high) / 2;   // 从中间划分
        MergeSort(A, low, mid);     // 对左半部分归并排序
        MergeSort(A, mid+1,high);   // 对右半部分归并排序
        Merge(A,low,mid,high);      // 归并
    }
}

// 思路：调用 MergeSort 函数将数组划分为两部分，依此递归调用 MergeSort 函数，将左半部分排序好后，对右半部分进行排序，最后将排序好的两部分进行归并排序
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Fri, 25 Jul 2025 00:00:00 GMT</pubDate></item><item><title>📦 PicGo + GitHub 图床搭建指南</title><link>https://hub.131714.xyz/blog/picgogithub-imgbed/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/picgogithub-imgbed/</guid><description>PicGO 配合Github仓库：实现免费图床！！！</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/picgogithub-imgbed/&quot;&gt;https://hub.131714.xyz/blog/picgogithub-imgbed/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;搭配使用 &lt;strong&gt;PicGo&lt;/strong&gt; 和 &lt;strong&gt;GitHub&lt;/strong&gt;，可构建一个稳定、免费的图床，非常适合博客、文档插图等静态资源管理。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🚧 流程概述&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;创建 GitHub 仓库&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装 PicGo 客户端&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;获取 GitHub Token&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PicGo 配置 GitHub 图床&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上传测试，自动生成图片链接&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;🔧 准备工作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;✅ 一个 GitHub 账号：👉 &lt;a href=&quot;https://github.com/&quot;&gt;https://github.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;✅ 一个公开仓库（建议命名为 &lt;code&gt;picbed&lt;/code&gt; 或类似）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;🛠️ 安装 PicGo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;主下载地址：👉 &lt;a href=&quot;https://github.com/Molunerfinn/PicGo/releases&quot;&gt;&lt;strong&gt;PicGo Releases&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;备用下载： 👉 &lt;a href=&quot;https://op.131714.xyz/software/PicGo-Setup-2.3.1-x64.exe&quot;&gt;&lt;strong&gt;点击下载 PicGo 2.3.1 x64&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;支持系统：&lt;strong&gt;Windows / macOS / Linux&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;⚙️ 配置 GitHub 图床&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;PicGo&lt;/strong&gt; → 左侧选择【图床设置】 → 添加图床类型：&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;填写以下信息：&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;设置项&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;示例&lt;/strong&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;code&gt;yourusername/picbed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;分支名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;main&lt;/code&gt;（或 &lt;code&gt;master&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;生成 GitHub Token&lt;/a&gt;，勾选 &lt;code&gt;repo&lt;/code&gt; 权限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存储路径&lt;/td&gt;
&lt;td&gt;&lt;code&gt;img/&lt;/code&gt;（可选）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自定义域名&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://raw.githubusercontent.com&lt;/code&gt;（或 CDN 加速域名）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;设置完毕后，点击「&lt;strong&gt;设为默认图床&lt;/strong&gt;」，并保存配置 ✅&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;🚀 上传使用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;打开 &lt;strong&gt;PicGo 主界面&lt;/strong&gt; → 拖拽图片或点击选择图片上传&lt;/li&gt;
&lt;li&gt;上传成功后，自动复制 Markdown 格式链接到剪贴板：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;![image](https://raw.githubusercontent.com/yourusername/picbed/main/img/yourimage.png)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;📌 推荐使用 &lt;strong&gt;jsDelivr CDN 加速&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;https://cdn.jsdelivr.net/gh/yourusername/picbed@main/img/yourimage.png
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;📁 实操截图&lt;/h2&gt;
&lt;h3&gt;1. GitHub 注册与创建仓库&lt;/h3&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://github.com/signup&quot;&gt;&lt;strong&gt;点击注册 GitHub 账号&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p1.webp&quot; alt=&quot;注册账号&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p2.webp&quot; alt=&quot;创建仓库&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2. 创建 GitHub Token&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p3.webp&quot; alt=&quot;生成 Token&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;3. PicGo GitHub 图床配置&lt;/h3&gt;
&lt;p&gt;📁 添加图床配置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p4.webp&quot; alt=&quot;添加图床&quot;&gt;&lt;/p&gt;
&lt;p&gt;📝 填写配置信息：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p5.webp&quot; alt=&quot;配置内容&quot;&gt;&lt;/p&gt;
&lt;p&gt;💾 保存后查看图床列表：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p6.webp&quot; alt=&quot;保存配置&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🌐 GitHub Pages 简介（可选加速）&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://pages.github.com/&quot;&gt;&lt;strong&gt;GitHub Pages&lt;/strong&gt;&lt;/a&gt; 是 GitHub 提供的免费静态网站托管服务，可用于自定义域名/CDN 加速等。&lt;/p&gt;
&lt;h3&gt;✅ 特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;🆓 免费的子域名（如：&lt;code&gt;username.github.io&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;🔧 支持绑定自定义域名（如 &lt;code&gt;www.example.com&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;⚙️ 支持 Jekyll 等静态站点生成器&lt;/li&gt;
&lt;li&gt;🚀 推送即部署，无需服务器配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;🚀 启用方法&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;创建公开仓库 &lt;code&gt;yourname.github.io&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;上传 HTML/CSS/JS 等网页文件&lt;/li&gt;
&lt;li&gt;打开仓库 → &lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;Pages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择发布源（如 &lt;code&gt;main&lt;/code&gt; 分支 &lt;code&gt;/root&lt;/code&gt; 路径）&lt;/li&gt;
&lt;li&gt;稍等几秒，即可访问公开站点！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;📸 页面配置示意：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/picgo-github/p7.webp&quot; alt=&quot;GitHub Pages 设置&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;🎉 至此，&lt;strong&gt;PicGo + GitHub 图床搭建完成！&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如需进一步优化（CDN、备份、自动命名等），可探索 PicGo 插件或绑定自定义域名。&lt;/p&gt;
&lt;p&gt;🚀 欢迎将此方案用于博客、笔记、技术文档等静态资源托管！&lt;/p&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Tue, 22 Jul 2025 00:00:00 GMT</pubDate></item><item><title>🌟 OpenList本地部署（Windows）！</title><link>https://hub.131714.xyz/blog/openlist/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/openlist/</guid><description>在本地电脑部署一个超级网盘集结器，当然也包含本机存储！</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/openlist/&quot;&gt;https://hub.131714.xyz/blog/openlist/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;🎉 OpenList 本地部署指南（Windows）&lt;/h1&gt;
&lt;h2&gt;📁 1. 文件准备&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ 注意：原 Alist 项目已被出售，存在数据安全隐患，推荐使用 &lt;strong&gt;OpenList&lt;/strong&gt; 替代。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;🔗 &lt;strong&gt;官方下载地址：&lt;/strong&gt;
&lt;a href=&quot;https://github.com/OpenListTeam/OpenList/releases&quot;&gt;👉 OpenList Releases（GitHub）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌 请根据你的 Windows 系统架构选择对应版本下载，&lt;strong&gt;推荐默认下载后缀为 &lt;code&gt;amd64&lt;/code&gt; 的 ZIP 文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p1.webp&quot; alt=&quot;下载包选择示意图&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🚀 2. 启动本地服务&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;解压下载的 ZIP 文件，&lt;strong&gt;默认仅包含 &lt;code&gt;openlist.exe&lt;/code&gt; 文件&lt;/strong&gt;。
启动后会自动生成 &lt;code&gt;data&lt;/code&gt; 目录，其他脚本为后续设置自启动使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p2.webp&quot; alt=&quot;解压目录结构&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;进入该目录，在地址栏输入 &lt;code&gt;cmd&lt;/code&gt; 回车，打开命令行窗口，执行以下命令启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openlist.exe server
# 或者
openlist server
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;启动成功后，命令行窗口将输出如下内容：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p3.webp&quot; alt=&quot;服务启动效果&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;🌐 3. 访问 OpenList UI 页面&lt;/h2&gt;
&lt;p&gt;🔗 浏览器输入以下任一地址访问 Web UI：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;http://localhost:5244
http://127.0.0.1:5244
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;📌 &lt;strong&gt;默认账号密码如下：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户名：&lt;/strong&gt; &lt;code&gt;admin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码：&lt;/strong&gt; 启动服务时生成（可后续修改）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p4.webp&quot; alt=&quot;登录页面&quot;&gt;&lt;/p&gt;
&lt;p&gt;📂 登录后即可看到已挂载的网盘、本机存储等资源：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p5.webp&quot; alt=&quot;UI展示图&quot;&gt;&lt;/p&gt;
&lt;p&gt;⚙️ 更多配置可在页面底部的管理栏中完成，如：存储添加、用户管理等。&lt;/p&gt;
&lt;p&gt;📖 &lt;strong&gt;官方文档（强烈推荐查阅）：&lt;/strong&gt;
&lt;a href=&quot;https://docs.oplist.org/zh/&quot;&gt;📘 OpenList 使用文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p6.webp&quot; alt=&quot;文档图示&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;🔄 4. 设置开机自启动&lt;/h2&gt;
&lt;p&gt;📦 &lt;strong&gt;自启动脚本下载地址：&lt;/strong&gt;
&lt;a href=&quot;https://openlist.131714.xyz/software/OpenList%E8%87%AA%E5%90%AF%E5%8A%A8&quot;&gt;📥 点击下载（run.vbs 脚本）&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;📌 步骤如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;将下载的脚本放入 &lt;strong&gt;OpenList 安装目录&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;为 &lt;code&gt;run.vbs&lt;/code&gt; 创建快捷方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;按下 &lt;code&gt;Win + R&lt;/code&gt;，输入 &lt;code&gt;shell:startup&lt;/code&gt; 并回车。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;将快捷方式拖入打开的启动目录中：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p7.webp&quot; alt=&quot;自启动设置步骤图&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;✅ 部署完成！&lt;/h2&gt;
&lt;p&gt;🎉 至此，OpenList 本地部署已经全部完成，快去享受属于自己的私有网盘服务吧！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.131714.xyz/file/blog/Article/openlist/p8.webp&quot; alt=&quot;结尾图&quot;&gt;&lt;/p&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Mon, 21 Jul 2025 00:00:00 GMT</pubDate></item><item><title>🚀 数据挖掘（DataMing）</title><link>https://hub.131714.xyz/blog/datamining/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/datamining/</guid><description>数据挖掘是从大量数据中提取有价值信息的过程，广泛应用于商业、科学和社会研究等领域。本文将介绍数据挖掘的基本概念、常用技术和应用场景。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/datamining/&quot;&gt;https://hub.131714.xyz/blog/datamining/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;帕累托图&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;帕累托图（Pareto Chart）是一种结合了柱状图和折线图的统计图表，常用于显示各因素的频数及其累计百分比，帮助识别主要问题或关键因素。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506141330966.png&quot; alt=&quot;帕累托图&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams[&amp;#39;font.sans-serif&amp;#39;] = &amp;#39;SimHei&amp;#39;
# 示例数据：类别及对应频数
data = {
    &amp;#39;类别&amp;#39;: [&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;, &amp;#39;C&amp;#39;, &amp;#39;D&amp;#39;, &amp;#39;E&amp;#39;, &amp;#39;F&amp;#39;],
    &amp;#39;频数&amp;#39;: [120, 90, 60, 30, 20, 10]
}

df = pd.DataFrame(data)

# 按频数降序排序
df = df.sort_values(by=&amp;#39;频数&amp;#39;, ascending=False).reset_index(drop=True)

# 计算累计频数及累计百分比
df[&amp;#39;累计频数&amp;#39;] = df[&amp;#39;频数&amp;#39;].cumsum()
df[&amp;#39;累计百分比&amp;#39;] = 100 * df[&amp;#39;累计频数&amp;#39;] / df[&amp;#39;频数&amp;#39;].sum()

# 创建双轴图
fig, ax1 = plt.subplots()

# 绘制柱状图 - 频数
ax1.bar(df[&amp;#39;类别&amp;#39;], df[&amp;#39;频数&amp;#39;], color=&amp;#39;C0&amp;#39;)
ax1.set_ylabel(&amp;#39;频数&amp;#39;, color=&amp;#39;C0&amp;#39;)
ax1.tick_params(axis=&amp;#39;y&amp;#39;, labelcolor=&amp;#39;C0&amp;#39;)

# 创建第二个纵轴 - 累计百分比
ax2 = ax1.twinx()
ax2.plot(df[&amp;#39;类别&amp;#39;], df[&amp;#39;累计百分比&amp;#39;], color=&amp;#39;C1&amp;#39;, marker=&amp;#39;D&amp;#39;, ms=7)
ax2.yaxis.set_major_formatter(plt.PercentFormatter())
ax2.set_ylabel(&amp;#39;累计百分比&amp;#39;, color=&amp;#39;C1&amp;#39;)
ax2.tick_params(axis=&amp;#39;y&amp;#39;, labelcolor=&amp;#39;C1&amp;#39;)
ax2.set_ylim(0, 110)

# 标题和布局
plt.title(&amp;#39;帕累托图示例&amp;#39;)
plt.tight_layout()
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h1&gt;ROC曲线&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ROC（Receiver Operating Characteristic）曲线&lt;/strong&gt; 是用于二分类模型性能评估的重要工具，特别适合不均衡数据集。它反映了分类器在不同阈值下的**假阳性率（False Positive Rate, FPR）&lt;strong&gt;与&lt;/strong&gt;真阳性率（True Positive Rate, TPR）**的关系。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;真阳性率（TPR）&lt;/strong&gt;：也叫召回率，表示被正确识别为正类的比例。计算公式：TPR = TP / (TP + FN)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;假阳性率（FPR）&lt;/strong&gt;：错误地被识别为正类的负类比例。计算公式：FPR = FP / (FP + TN)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ROC曲线&lt;/strong&gt;是以FPR为横轴，TPR为纵轴绘制的曲线，越接近左上角（FPR低，TPR高）说明模型越好。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AUC（Area Under Curve）&lt;/strong&gt; 是ROC曲线下的面积，表示模型整体的分类能力。AUC越接近1越好，0.5相当于随机猜测。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506141407860.png&quot; alt=&quot;ROC曲线&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
import matplotlib as mpl

# 设置中文字体
mpl.rcParams[&amp;#39;font.sans-serif&amp;#39;] = [&amp;#39;SimHei&amp;#39;]  # 指定字体为 SimHei（黑体）
mpl.rcParams[&amp;#39;axes.unicode_minus&amp;#39;] = False  # 解决负号显示问题

# 生成模拟二分类数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练逻辑回归模型
model = LogisticRegression()
model.fit(X_train, y_train)

# 预测测试集正类概率
y_score = model.predict_proba(X_test)[:, 1]

# 计算假阳性率（FPR）、真阳性率（TPR）和阈值
fpr, tpr, thresholds = roc_curve(y_test, y_score)

# 计算 AUC 值
roc_auc = auc(fpr, tpr)

# 绘制 ROC 曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color=&amp;#39;blue&amp;#39;, lw=2, label=f&amp;#39;ROC 曲线 (AUC = {roc_auc:.2f})&amp;#39;)
plt.plot([0, 1], [0, 1], color=&amp;#39;gray&amp;#39;, linestyle=&amp;#39;--&amp;#39;, lw=2)  # 随机猜测参考线
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel(&amp;#39;假阳性率（False Positive Rate）&amp;#39;)
plt.ylabel(&amp;#39;真阳性率（True Positive Rate）&amp;#39;)
plt.title(&amp;#39;ROC 曲线示例&amp;#39;)
plt.legend(loc=&amp;quot;lower right&amp;quot;)
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;数据挖掘算法&lt;/h1&gt;
&lt;hr&gt;
&lt;h2&gt;回归&lt;/h2&gt;
&lt;h3&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;目标&lt;/strong&gt;：预测连续值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模型&lt;/strong&gt;：连续函数  $f(X) \rightarrow Y$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常用指标&lt;/strong&gt;：MAE、MSE、MedAE、R2R^2、EVS&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;线性回归 (Linear Regression)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error, mean_squared_error, \
                            median_absolute_error, explained_variance_score, r2_score
import pandas as pd

# 1⃣ 读取数据
# 读取数据文件 &amp;#39;financial.csv&amp;#39;，数据集包含自变量 X 和因变量 y
data = pd.read_csv(&amp;quot;financial.csv&amp;quot;)
X = data.drop(columns=&amp;quot;target&amp;quot;)   # 自变量 X，去掉目标列 &amp;#39;target&amp;#39;
y = data[&amp;quot;target&amp;quot;]               # 因变量 y，目标列

# 2⃣ 划分数据集
# 将数据集按 80/20 的比例划分为训练集和测试集，随机种子为 125
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=125)

# 3⃣ 建模与训练
# 使用线性回归模型并对训练数据进行训练
model = LinearRegression().fit(X_train, y_train)

# 4⃣ 预测
# 使用训练好的模型对测试数据进行预测
y_pred = model.predict(X_test)

# 5⃣ 评估
# 输出各种回归评估指标
print(&amp;quot;MAE :&amp;quot;, mean_absolute_error(y_test, y_pred))         # 平均绝对误差
print(&amp;quot;MSE :&amp;quot;, mean_squared_error(y_test, y_pred))         # 均方误差
print(&amp;quot;MedAE :&amp;quot;, median_absolute_error(y_test, y_pred))    # 中位绝对误差
print(&amp;quot;EVS :&amp;quot;, explained_variance_score(y_test, y_pred))   # 解释方差得分
print(&amp;quot;R² :&amp;quot;, r2_score(y_test, y_pred))                    # R² 决定系数
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;逻辑回归（含ROC曲线绘制）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;虽名为“回归”，也可以进行&lt;strong&gt;二元或多元分类&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, \
                            confusion_matrix, roc_curve, auc
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv(&amp;quot;financial.csv&amp;quot;)
X = data.drop(columns=&amp;quot;label&amp;quot;)  # 自变量 X
y = data[&amp;quot;label&amp;quot;]              # 因变量 y

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=125)

# 初始化逻辑回归模型并训练
clf = LogisticRegression(max_iter=1000).fit(X_train, y_train)
y_pred = clf.predict(X_test)  # 对测试集进行预测

# 输出分类指标
print(&amp;quot;Accuracy :&amp;quot;, accuracy_score(y_test, y_pred))        # 准确率
print(&amp;quot;Precision:&amp;quot;, precision_score(y_test, y_pred))       # 精确度
print(&amp;quot;Recall   :&amp;quot;, recall_score(y_test, y_pred))          # 召回率
print(&amp;quot;ConfMat  :\n&amp;quot;, confusion_matrix(y_test, y_pred))    # 混淆矩阵

# === ROC 曲线 ===
# 计算预测结果的概率并绘制 ROC 曲线
y_score = clf.predict_proba(X_test)[:, 1]  # 获取正类的概率
fpr, tpr, _ = roc_curve(y_test, y_score)   # 计算假阳性率与真阳性率
roc_auc = auc(fpr, tpr)                    # 计算 AUC 值

# 绘制 ROC 曲线
plt.figure()
plt.plot(fpr, tpr, lw=2, label=f&amp;quot;ROC (AUC={roc_auc:.2f})&amp;quot;)
plt.plot([0, 1], [0, 1], &amp;quot;--&amp;quot;)             # 参考线：完全随机
plt.xlabel(&amp;quot;False Positive Rate&amp;quot;)
plt.ylabel(&amp;quot;True Positive Rate&amp;quot;)
plt.title(&amp;quot;ROC Curve — Logistic Regression&amp;quot;)
plt.legend()
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;分类&lt;/h2&gt;
&lt;h3&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输出&lt;/strong&gt;：离散类别&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;/li&gt;
&lt;li&gt;&lt;strong&gt;常用指标&lt;/strong&gt;：Accuracy、Precision、Recall、F1、ROC/AUC&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;决策树 (Decision Tree)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix
import pandas as pd

# 读取数据
data = pd.read_excel(&amp;quot;sales_data.xls&amp;quot;)
X = data.drop(columns=&amp;quot;label&amp;quot;)  # 特征自变量
y = data[&amp;quot;label&amp;quot;]              # 目标标签

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=125)

# 创建决策树分类器并训练
dtc = DecisionTreeClassifier(criterion=&amp;quot;entropy&amp;quot;).fit(X_train, y_train)
y_pred = dtc.predict(X_test)  # 对测试集进行预测

# 输出分类指标
print(&amp;quot;Accuracy :&amp;quot;, accuracy_score(y_test, y_pred))        # 准确率
print(&amp;quot;Precision:&amp;quot;, precision_score(y_test, y_pred))       # 精确度
print(&amp;quot;Recall   :&amp;quot;, recall_score(y_test, y_pred))          # 召回率
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;K 近邻 (K‑NN)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris

# 加载 Iris 数据集
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.20, random_state=125)

# 创建 K-近邻分类器并训练
knn = KNeighborsClassifier(n_neighbors=5).fit(X_train, y_train)
y_pred = knn.predict(X_test)  # 对测试集进行预测

# 输出准确率
print(&amp;quot;Accuracy :&amp;quot;, accuracy_score(y_test, y_pred))  # 准确率
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;支持向量机 (SVM)&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_digits

# 加载手写数字数据集
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(
    digits.data, digits.target, test_size=0.20, random_state=125)

# 创建支持向量机分类器并训练
svc = SVC().fit(X_train, y_train)
# 输出准确率
print(&amp;quot;Accuracy :&amp;quot;, accuracy_score(y_test, svc.predict(X_test)))  # 准确率
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;聚类&lt;/h2&gt;
&lt;h3&gt;特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;无监督学习&lt;/strong&gt;：无需事先标签&lt;/li&gt;
&lt;li&gt;根据相似度自动划分簇&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;K‑Means 示例（含参数寻优）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据并进行标准化
data = pd.read_excel(&amp;quot;air_features.xlsx&amp;quot;, index_col=&amp;quot;ID&amp;quot;)
data_z = (data - data.mean()) / data.std()  # Z-score 标准化

# ========== 固定聚类数为5，进行聚类并输出中心和簇大小 ==========
kmeans_5 = KMeans(n_clusters=5, random_state=3).fit(data_z)

# 聚类中心 + 每簇数量
centers = pd.DataFrame(kmeans_5.cluster_centers_, columns=data.columns)
counts  = pd.Series(kmeans_5.labels_).value_counts().sort_index().rename(&amp;quot;数量&amp;quot;)
result  = pd.concat([centers, counts], axis=1)
print(&amp;quot;K=5 聚类中心及每簇数量：&amp;quot;)
print(result)

# ========== 对不同聚类数做指标评估，绘制Inertia和轮廓系数 ==========
sse = []
silhouette_scores = []
K_range = range(2, 11)

for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=42).fit(data_z)
    sse.append(kmeans.inertia_)
    silhouette_scores.append(silhouette_score(data_z, kmeans.labels_))

plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)
plt.plot(K_range, sse, &amp;#39;o-&amp;#39;, color=&amp;#39;blue&amp;#39;)
plt.xlabel(&amp;#39;聚类数 K&amp;#39;)
plt.ylabel(&amp;#39;簇内误差平方和 (Inertia)&amp;#39;)
plt.title(&amp;#39;Inertia - 聚类数与簇内误差平方和关系&amp;#39;)

plt.subplot(1, 2, 2)
plt.plot(K_range, silhouette_scores, &amp;#39;s-&amp;#39;, color=&amp;#39;red&amp;#39;)
plt.xlabel(&amp;#39;聚类数 K&amp;#39;)
plt.ylabel(&amp;#39;轮廓系数&amp;#39;)
plt.title(&amp;#39;轮廓系数法 - 聚类数与轮廓系数关系&amp;#39;)
plt.tight_layout()
plt.show()
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;关联规则&lt;/h2&gt;
&lt;h3&gt;Apriori 算法&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori, association_rules
# 读取用户访问记录数据
info = pd.read_csv(&amp;quot;acc_records.csv&amp;quot;)
# 1 去重用户IP
user_ips = info[&amp;quot;用户IP&amp;quot;].unique()
# 2 构建用户访问列表
url_baskets = [
 info.loc[info[&amp;quot;用户IP&amp;quot;] == ip, &amp;quot;URL&amp;quot;].tolist()
 for ip in user_ips
]
# 3 One‑Hot 编码
te = TransactionEncoder()
df = pd.DataFrame(te.fit_transform(url_baskets), columns=te.columns_)
# 4 频繁项集 &amp;amp; 关联规则
freq_itemsets = apriori(df, min_support=0.005, use_colnames=True)
rules = association_rules(freq_itemsets, metric=&amp;quot;confidence&amp;quot;, min_threshold=0.05)
print(rules.sort_values(&amp;quot;lift&amp;quot;, ascending=False).head())
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Thu, 19 Jun 2025 00:00:00 GMT</pubDate></item><item><title>Git使用教程</title><link>https://hub.131714.xyz/blog/git-use/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/git-use/</guid><description>git是一个分布式版本控制系统，广泛用于软件开发和其他版本控制任务。本文将介绍git的基本使用方法，包括安装、配置、常用命令等。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/git-use/&quot;&gt;https://hub.131714.xyz/blog/git-use/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;Git使用教程&lt;/h1&gt;
&lt;h2&gt;部分命令&lt;/h2&gt;
&lt;h3&gt;一、新建代码库&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录，将其初始化为Git代码库
$ git init [project-name]
# 下载一个项目和它的整个代码历史
$ git clone [url]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;二、配置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [--global]
# 设置提交代码时的用户信息
$ git config [--global] user.name &amp;quot;[name]&amp;quot;
$ git config [--global] user.email &amp;quot;[email address]&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;三、增加/删除文件&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区，包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前，都会要求确认
# 对于同一个文件的多处变化，可以实现分次提交
$ git add -p
# 删除工作区文件，并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件，但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件，并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;四、代码提交&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化，直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit，替代上一次提交
# 如果代码没有任何新变化，则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
五、分支
# 重做上一次commit，并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;五、分支&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支，但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支，并切换到该分支
$ git checkout -b [branch]
# 新建一个分支，指向指定commit
$ git branch [branch] [commit]
# 新建一个分支，与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支，并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系，在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit，合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;六、标签&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 列出所有tag
$ git tag
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit
$ git tag [tag] [commit]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag
$ git push origin :refs/tags/[tagName]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一个分支，指向某个tag
$ git checkout -b [branch] [tag]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;七、查看信息&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史，以及每次commit发生变更的文件
$ git log --stat
# 搜索提交历史，根据关键词
$ git log -S [keyword]
# 显示某个commit之后的所有变动，每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动，其&amp;quot;提交说明&amp;quot;必须符合搜索条件
$ git log [tag] HEAD --grep feature
# 显示某个文件的版本历史，包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 显示指定文件相关的每一次diff
八、远程同步
$ git log -p [file]
# 显示过去5次提交
$ git log -5 --pretty --oneline
# 显示所有提交过的用户，按提交次数排序
$ git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
# 显示暂存区和工作区的差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
$ git diff --shortstat &amp;quot;@{0 day ago}&amp;quot;
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时，某个文件的内容
$ git show [commit]:[filename]
# 显示当前分支的最近几次提交
$ git reflog
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;八、远程同步&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 下载远程仓库的所有变动
$ git fetch [remote]
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
# 增加一个新的远程仓库，并命名
$ git remote add [shortname] [url]
# 取回远程仓库的变化，并与本地分支合并
$ git pull [remote] [branch]
九、撤销
# 上传本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库，即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;九、撤销&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
$ git checkout .
# 重置暂存区的指定文件，与上一次commit保持一致，但工作区不变
$ git reset [file]
# 重置暂存区与工作区，与上一次commit保持一致
$ git reset --hard
# 重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变
$ git reset [commit]
# 重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致
$ git reset --hard [commit]
# 重置当前HEAD为指定commit，但保持暂存区和工作区不变
$ git reset --keep [commit]
# 新建一个commit，用来撤销指定commit
# 后者的所有变化都将被前者抵消，并且应用到当前分支
$ git revert [commit]
# 暂时将未提交的变化移除，稍后再移入
$ git stash
$ git stash pop
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;一：Git是什么？&lt;/h2&gt;
&lt;p&gt;Git是目前世界上最先进的分布式版本控制系统。
工作原理 / 流程：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171616277.png&quot; alt=&quot;image-20250617161620237&quot;&gt;
Workspace：工作区&lt;br&gt;Index / Stage：暂存区&lt;br&gt;Repository：仓库区（或本地仓库）&lt;br&gt;Remote：远程仓库    &lt;/p&gt;
&lt;h2&gt;二：在windows上如何安装Git？&lt;/h2&gt;
&lt;p&gt;msysgit是 windows版的Git,如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171532432.png&quot; alt=&quot;image-20250617153207411&quot;&gt;&lt;/p&gt;
&lt;p&gt;需要从网上下载一个，然后进行默认安装即可。安装完成后，在开始菜单里面找到 &amp;quot;Git --&amp;gt; Git Bash&amp;quot;,如
下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171532354.png&quot; alt=&quot;image-20250617153249332&quot;&gt;&lt;/p&gt;
&lt;p&gt;会弹出一个类似的命令窗口的东西，就说明Git安装成功。如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171533801.png&quot; alt=&quot;image-20250617153309764&quot;&gt;&lt;/p&gt;
&lt;p&gt;安装完成后，还需要最后一步设置，在命令行输入如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171533807.png&quot; alt=&quot;image-20250617153326771&quot;&gt;&lt;/p&gt;
&lt;p&gt;因为Git是分布式版本控制系统，所以需要填写用户名和邮箱作为一个标识。
注意：git config --global 参数，有了这个参数，表示你这台机器上所有的Git仓库都会使用这个配置，当
然你也可以对某个仓库指定的不同的用户名和邮箱。&lt;/p&gt;
&lt;h2&gt;三：如何操作？&lt;/h2&gt;
&lt;h3&gt;一、创建版本库。&lt;/h3&gt;
&lt;p&gt;什么是版本库？版本库又名仓库，英文名repository,你可以简单的理解一个目录，这个目录里面的所有
文件都可以被Git管理起来，每个文件的修改，删除，Git都能跟踪，以便任何时刻都可以追踪历史，或者
在将来某个时刻还可以将文件”还原”。
所以创建一个版本库也非常简单，如下我是D盘 –&amp;gt; www下 目录下新建一个testgit版本库。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171534501.png&quot; alt=&quot;image-20250617153407477&quot;&gt;&lt;/p&gt;
&lt;p&gt;pwd 命令是用于显示当前的目录。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;通过命令 git init 把这个目录变成git可以管理的仓库，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171534107.png&quot; alt=&quot;image-20250617153428083&quot;&gt;&lt;/p&gt;
&lt;p&gt;这时候你当前testgit目录下会多了一个.git的目录，这个目录是Git来跟踪管理版本的，没事千万不
要手动乱改这个目录里面的文件，否则，会把git仓库给破坏了。
如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171534916.png&quot; alt=&quot;image-20250617153458890&quot;&gt;&lt;/p&gt;
&lt;p&gt;把文件添加到版本库中。
首先要明确下，所有的版本控制系统，只能跟踪文本文件的改动，比如txt文件，网页，所有程序的
代码等，Git也不列外，版本控制系统可以告诉你每次的改动，但是图片，视频这些二进制文件，虽
能也能由版本控制系统管理，但没法跟踪文件的变化，只能把二进制文件每次改动串起来，也就是
知道图片从1kb变成2kb，但是到底改了啥，版本控制也不知道。&lt;/p&gt;
&lt;h4&gt;下面先看演示&lt;/h4&gt;
&lt;p&gt;我在版本库testgit目录下新建一个记事本文件 readme.txt 内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-tex&quot;&gt;1111111
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;第一步：git add&lt;/h4&gt;
&lt;p&gt;使用命令 git add readme.txt添加到暂存区里面去。如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171537853.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;如果和上面一样，没有任何提示，说明已经添加成功了。&lt;/p&gt;
&lt;h4&gt;第二步：git commit&lt;/h4&gt;
&lt;p&gt;用命令 git commit告诉Git，把文件提交到仓库。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171537699.png&quot; alt=&quot;image-20250617153729677&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现在我们已经提交了一个readme.txt文件了，我们下面可以通过命令git status来查看是否还有文件未提交，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171538538.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;说明没有任何文件未提交，但是我现在继续来改下readme.txt内容，比如我在下面添加一行2222222222
内容，继续使用git status 来查看下结果，如下：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171621614.png&quot; alt=&quot;image-20250617162158565&quot;&gt;&lt;/p&gt;
&lt;p&gt;上面的命令告诉我们 readme.txt文件已被修改，但是未被提交的修改。
接下来我想看下readme.txt文件到底改了什么内容，如何查看呢？可以使用如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git diff readme.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如下：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171539762.png&quot; alt=&quot;image-20250617153935736&quot;&gt;&lt;/p&gt;
&lt;p&gt;如上可以看到，readme.txt文件内容从一行11111111改成 二行 添加了一行22222222内容。
知道了对readme.txt文件做了什么修改后，我们可以放心的提交到仓库了。
提交修改和提交文件是一样的2步： &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;git add&lt;/strong&gt; &lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;git commit&lt;/strong&gt;       &lt;/p&gt;
&lt;p&gt;如下：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171541794.png&quot; alt=&quot;image-20250617154101763&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;二、版本回退&lt;/h3&gt;
&lt;p&gt;如上，我们已经学会了修改文件，现在我继续对readme.txt文件进行修改，再增加一行内容为
33333333333333.继续执行命令如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171541205.png&quot; alt=&quot;image-20250617154128180&quot;&gt;&lt;/p&gt;
&lt;h4&gt;1、git log&lt;/h4&gt;
&lt;p&gt;现在我已经对readme.txt文件做了三次修改了，那么我现在想查看下历史记录，如何查呢？我们现在可
以使用命令 git log 演示如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171541401.png&quot; alt=&quot;image-20250617154159370&quot;&gt;&lt;/p&gt;
&lt;p&gt;git log命令显示从最近到最远的显示日志，我们可以看到最近三次提交，最近的一次是,增加内容为
333333.上一次是添加内容222222，第一次默认是 111111.如果嫌上面显示的信息太多的话，我们可以
使用命令 git log --pretty=oneline 演示如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171542347.png&quot; alt=&quot;image-20250617154224322&quot;&gt;&lt;/p&gt;
&lt;h4&gt;2、版本回退&lt;/h4&gt;
&lt;p&gt;现在我想使用版本回退操作，我想把当前的版本回退到上一个版本，要使用什么命令呢？
可以使用如下2种命令：&lt;/p&gt;
&lt;h5&gt;git reset --hard HEAD^&lt;/h5&gt;
&lt;p&gt;第一种是：git reset --hard HEAD^ 那么如果要回退到上上个版本只需把HEAD^ 改成 HEAD^^ 以此
类推。那如果要回退到前100个版本的话，使用上面的方法肯定不方便，我们可以使用下面的简便命令操
作：git reset --hard HEAD~100 即可。未回退之前的readme.txt内容如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171542212.png&quot; alt=&quot;image-20250617154248184&quot;&gt;&lt;/p&gt;
&lt;p&gt;如果想回退到上一个版本的命令如下操作：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171543589.png&quot; alt=&quot;image-20250617154301565&quot;&gt;&lt;/p&gt;
&lt;p&gt;再来查看下 readme.txt内容如下：通过命令cat readme.txt查看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171543326.png&quot; alt=&quot;image-20250617154316303&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到，内容已经回退到上一个版本了。我们可以继续使用git log 来查看下历史记录信息，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171543797.png&quot; alt=&quot;image-20250617154332771&quot;&gt;&lt;/p&gt;
&lt;h5&gt;git reset --hard 版本号&lt;/h5&gt;
&lt;p&gt;我们看到 增加333333 内容我们没有看到了，但是现在我想回退到最新的版本，如：有333333的内容要
如何恢复呢？我们可以通过版本号回退，使用命令方法如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git reset --hard 版本号 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是现在的问题假如我已经关掉过一次命令行或者333内容的版本号我并不知
道呢？要如何知道增加3333内容的版本号呢？可以通过如下命令即可获取到版本号：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git reflog 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;演示如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171545856.png&quot; alt=&quot;image-20250617154528828&quot;&gt;&lt;/p&gt;
&lt;p&gt;通过上面的显示我们可以知道，增加内容3333的版本号是 6fcfc89.我们现在可以命令git reset --hard
6fcfc89来恢复了。演示如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171547793.png&quot; alt=&quot;image-20250617154707767&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到 目前已经是最新的版本了。&lt;/p&gt;
&lt;h2&gt;三、理解工作区与暂存区的区别？&lt;/h2&gt;
&lt;p&gt;工作区：就是你在电脑上看到的目录，比如目录下testgit里的文件(.git隐藏目录版本库除外)。或者以后
需要再新建的目录文件等等都属于工作区范畴。
版本库(Repository)：工作区有一个隐藏目录.git,这个不属于工作区，这是版本库。其中版本库里面存了
很多东西，其中最重要的就是stage(暂存区)，还有Git为我们自动创建了第一个分支master,以及指向
master的一个指针HEAD。
我们前面说过使用Git提交文件到版本库有两步：
第一步：是使用 git add 把文件添加进去，实际上就是把文件添加到暂存区。
第二步：使用git commit提交更改，实际上就是把暂存区的所有内容提交到当前分支上。
我们继续使用demo来演示下：
我们在readme.txt再添加一行内容为4444444，接着在目录下新建一个文件为test.txt 内容为test，我们先用命令 &lt;strong&gt;git status&lt;/strong&gt;来查看下状态，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171548177.png&quot; alt=&quot;image-20250617154836149&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在我们先使用git add 命令把2个文件都添加到暂存区中，再使用git status来查看下状态，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171548013.png&quot; alt=&quot;image-20250617154851985&quot;&gt;&lt;/p&gt;
&lt;p&gt;接着我们可以使用git commit一次性提交到分支上，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171549770.png&quot; alt=&quot;image-20250617154905744&quot;&gt;&lt;/p&gt;
&lt;p&gt;四：Git撤销修改和删除文件操作。
一：撤销修改：
比如我现在在readme.txt文件里面增加一行 内容为555555555555，我们先通过命令查看如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171549780.png&quot; alt=&quot;image-20250617154925756&quot;&gt;&lt;/p&gt;
&lt;p&gt;在我未提交之前，我发现添加5555555555555内容有误，所以我得马上恢复以前的版本，现在我可以有
如下几种方法可以做修改：
第一：如果我知道要删掉那些内容的话，直接手动更改去掉那些需要的文件，然后add添加到暂存区，最
后commit掉。
第二：我可以按以前的方法直接恢复到上一个版本。使用 git reset --hard HEAD^
但是现在我不想使用上面的2种方法，我想直接想使用撤销命令该如何操作呢？首先在做撤销之前，我们
可以先用 git status 查看下当前的状态。如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171549014.png&quot; alt=&quot;image-20250617154945989&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以发现，Git会告诉你，git checkout -- file 可以丢弃工作区的修改，如下命令：
git checkout -- readme.txt,如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171550147.png&quot; alt=&quot;image-20250617155006119&quot;&gt;&lt;/p&gt;
&lt;p&gt;命令 git checkout --readme.txt 意思就是，把readme.txt文件在工作区做的修改全部撤销，这里有2种
情况，如下：
1.readme.txt自动修改后，还没有放到暂存区，使用 撤销修改就回到和版本库一模一样的状态。
2.另外一种是readme.txt已经放入暂存区了，接着又作了修改，撤销修改就回到添加暂存区后的状态。
对于第二种情况，假如现在我对readme.txt添加一行 内容为6666666666666，我git add 增加到暂存区
后，接着添加内容7777777，我想通过撤销命令让其回到暂存区后的状态。如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171550300.png&quot; alt=&quot;image-20250617155022269&quot;&gt;&lt;/p&gt;
&lt;p&gt;注意：命令git checkout -- readme.txt 中的 -- 很重要，如果没有 -- 的话，那么命令变成创建分支了。
二：删除文件。
假如我现在版本库testgit目录添加一个文件b.txt,然后提交。如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171550264.png&quot; alt=&quot;image-20250617155037221&quot;&gt;&lt;/p&gt;
&lt;p&gt;如上：一般情况下，可以直接在文件目录中把文件删了，或者使用如上rm命令：rm b.txt ，如果我想彻
底从版本库中删掉了此文件的话，可以再执行commit命令 提交掉，现在目录是这样的，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171550139.png&quot; alt=&quot;image-20250617155053112&quot;&gt;&lt;/p&gt;
&lt;p&gt;只要没有commit之前，如果我想在版本库中恢复此文件如何操作呢？
可以使用如下命令 git checkout -- b.txt，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171551287.png&quot; alt=&quot;image-20250617155105262&quot;&gt;&lt;/p&gt;
&lt;p&gt;再来看看我们testgit目录，添加了3个文件了。如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171551964.png&quot; alt=&quot;image-20250617155120933&quot;&gt;&lt;/p&gt;
&lt;h2&gt;四：远程仓库&lt;/h2&gt;
&lt;p&gt;在了解之前，先注册github账号，由于你的本地Git仓库和github仓库之间的传输是通过SSH加密的，所
以需要一点设置：&lt;/p&gt;
&lt;h3&gt;第一步：创建SSH Key。&lt;/h3&gt;
&lt;p&gt;在用户主目录下，看看有没有.ssh目录，如果有，再看看这个目录下有没有id_rsa和id_rsa.pub这两个文
件，如果有的话，直接跳过此如下命令，如果没有的话，打开命令行，输入如下命令：
ssh-keygen -t rsa –C “&lt;a href=&quot;mailto:youremail@example.com&quot;&gt;youremail@example.com&lt;/a&gt;”, 由于我本地此前运行过一次，所以本地有，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171551621.png&quot; alt=&quot;image-20250617155149588&quot;&gt;&lt;/p&gt;
&lt;p&gt;id_rsa是私钥，不能泄露出去，id_rsa.pub是公钥，可以放心地告诉任何人。&lt;/p&gt;
&lt;h3&gt;第二步：Add SSH Key&lt;/h3&gt;
&lt;p&gt;登录github,打开” settings”中的SSH Keys页面，然后点击“Add SSH Key”,填上任意title，在Key文本框里
黏贴id_rsa.pub文件的内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171552776.png&quot; alt=&quot;image-20250617155213724&quot;&gt;&lt;/p&gt;
&lt;p&gt;点击 Add Key，你就应该可以看到已经添加的key。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171552881.png&quot; alt=&quot;image-20250617155231847&quot;&gt;&lt;/p&gt;
&lt;p&gt;如何添加远程库？
现在的情景是：我们已经在本地创建了一个Git仓库后，又想在github创建一个Git仓库，并且希望这两个
仓库进行远程同步，这样github的仓库可以作为备份，又可以其他人通过该仓库来协作。
首先，登录github上，然后在右上角找到“create a new repo”创建一个新的仓库。如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171552245.png&quot; alt=&quot;image-20250617155243200&quot;&gt;&lt;/p&gt;
&lt;p&gt;在Repository name填入testgit，其他保持默认设置，点击“Create repository”按钮，就成功地创建了一
个新的Git仓库：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171553918.png&quot; alt=&quot;image-20250617155300863&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以把一个已有的本地仓库与之关联，然后，把本地仓库的内容推送到GitHub仓库。
现在，我们根据GitHub的提示，在本地的testgit仓库下运行命令：
git remote add origin &lt;a href=&quot;https://github.com/tugenhua0707/testgit.git&quot;&gt;https://github.com/tugenhua0707/testgit.git&lt;/a&gt;
所有的如下：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171553233.png&quot; alt=&quot;image-20250617155315203&quot;&gt;&lt;/p&gt;
&lt;p&gt;把本地库的内容推送到远程，使用 git push命令，实际上是把当前分支master推送到远程。
由于远程库是空的，我们第一次推送master分支时，加上了 –u参数，Git不但会把本地的master分支内
容推送的远程新的master分支，还会把本地的master分支和远程的master分支关联起来，在以后的推
送或者拉取时就可以简化命令。推送成功后，可以立刻在github页面中看到远程库的内容已经和本地一
模一样了，上面的要输入github的用户名和密码如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171553304.png&quot; alt=&quot;image-20250617155335260&quot;&gt;&lt;/p&gt;
&lt;p&gt;从现在起，只要本地作了提交，就可以通过如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git push origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把本地master分支的最新修改推送到github上了，现在你就拥有了真正的分布式版本库了。&lt;/p&gt;
&lt;h3&gt;如何从远程库克隆？&lt;/h3&gt;
&lt;p&gt;上面我们了解了先有本地库，后有远程库时候，如何关联远程库。
现在我们想，假如远程库有新的内容了，我想克隆到本地来 如何克隆呢？
首先，登录github，创建一个新的仓库，名字叫testgit2.如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171554277.png&quot; alt=&quot;image-20250617155430236&quot;&gt;&lt;/p&gt;
&lt;p&gt;如下，我们看到：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171554108.png&quot; alt=&quot;image-20250617155446060&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在，远程库已经准备好了，下一步是使用命令git clone克隆一个本地库了。如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171554153.png&quot; alt=&quot;image-20250617155459126&quot;&gt;&lt;/p&gt;
&lt;p&gt;接着在我本地目录下 生成testgit2目录了，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171555028.png&quot; alt=&quot;image-20250617155511995&quot;&gt;&lt;/p&gt;
&lt;h2&gt;五：创建与合并分支&lt;/h2&gt;
&lt;p&gt;在版本回退里，你已经知道，每次提交，Git都把它们串成一条时间线，这条时间线就是一个分支。截止
到目前，只有一条时间线，在Git里，这个分支叫主分支，即master分支。HEAD严格来说不是指向提
交，而是指向master，master才是指向提交的，所以，HEAD指向的就是当前分支。&lt;/p&gt;
&lt;h3&gt;创建dev分支&lt;/h3&gt;
&lt;p&gt;首先，我们来创建dev分支，然后切换到dev分支上。如下操作：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171555544.png&quot; alt=&quot;image-20250617155536516&quot;&gt;&lt;/p&gt;
&lt;p&gt;git checkout 命令加上 –b参数表示创建并切换，相当于如下2条命令&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git branch dev
git checkout dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;git branch查看分支，会列出所有的分支，当前分支前面会添加一个星号。然后我们在dev分支上继续做
demo，比如我们现在在readme.txt再增加一行 7777777777777
首先我们先来查看下readme.txt内容，接着添加内容77777777，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171556535.png&quot; alt=&quot;image-20250617155618506&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在dev分支工作已完成，现在我们切换到主分支master上，继续查看readme.txt内容如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171556423.png&quot; alt=&quot;image-20250617155629395&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在我们可以把dev分支上的内容合并到分支master上了，可以在master分支上，使用如下命令 git
merge dev 如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171556193.png&quot; alt=&quot;image-20250617155644160&quot;&gt;&lt;/p&gt;
&lt;h3&gt;git merge合并&lt;/h3&gt;
&lt;p&gt;git merge命令用于合并指定分支到当前分支上，合并后，再查看readme.txt内容，可以看到，和dev分
支最新提交的是完全一样的。注意到上面的Fast-forward信息，Git告诉我们，这次合并是“快进模式”，
也就是直接把master指向dev的当前提交，所以合并速度非常快。合并完成后，我们可以接着删除dev分
支了，操作如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171557184.png&quot; alt=&quot;image-20250617155705157&quot;&gt;&lt;/p&gt;
&lt;p&gt;总结创建与合并分支命令如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;查看分支：git branch
创建分支：git branch name
切换分支：git checkout name
创建+切换分支：git checkout –b name
合并某分支到当前分支：git merge name
删除分支：git branch –d name
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;如何解决冲突？&lt;/h3&gt;
&lt;p&gt;下面我们还是一步一步来，先新建一个新分支，比如名字叫fenzhi1，在readme.txt添加一行内容
8888888，然后提交，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171558101.png&quot; alt=&quot;image-20250617155813071&quot;&gt;&lt;/p&gt;
&lt;p&gt;同样，我们现在切换到master分支上来，也在最后一行添加内容，内容为99999999，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171558166.png&quot; alt=&quot;image-20250617155826135&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在我们需要在master分支上来合并fenzhi1，如下操作：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171558673.png&quot; alt=&quot;image-20250617155854635&quot;&gt;&lt;/p&gt;
&lt;p&gt;Git用&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;，=======，&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;标记出不同分支的内容，其中&amp;lt;&amp;lt;&amp;lt;HEAD是指主分支修改的内容，&lt;/p&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;fenzhi1 是指fenzhi1上修改的内容，我们可以修改下如下后保存：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171559899.png&quot; alt=&quot;image-20250617155915859&quot;&gt;&lt;/p&gt;
&lt;p&gt;如果我想查看分支合并的情况的话，需要使用命令 git log.命令行演示如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171559316.png&quot; alt=&quot;image-20250617155931261&quot;&gt;&lt;/p&gt;
&lt;h3&gt;分支管理策略。&lt;/h3&gt;
&lt;p&gt;通常合并分支时，git一般使用”Fast forward”模式，在这种模式下，删除分支后，会丢掉分支信息，现在
我们来使用带参数 –no-ff来禁用”Fast forward”模式。首先我们来做demo演示下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;1、创建一个dev分支。
2、修改readme.txt内容。
3、添加到暂存区。
4、切换回主分支(master)。
5、合并dev分支，使用命令 git merge –no-ff -m “注释” dev
6、查看历史记录
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;截图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171600458.png&quot; alt=&quot;image-20250617160018417&quot;&gt;&lt;/p&gt;
&lt;p&gt;分支策略：首先master主分支应该是非常稳定的，也就是用来发布新版本，一般情况下不允许在上面干
活，干活一般情况下在新建的dev分支上干活，干完后，比如要发布，或者说dev分支代码稳定后可以合
并到主分支master上来。
1、创建一个dev分支。
2、修改readme.txt内容。
3、添加到暂存区。
4、切换回主分支(master)。
5、合并dev分支，使用命令 git merge –no-ff -m “注释” dev
6、查看历史记录&lt;/p&gt;
&lt;h2&gt;六：bug分支&lt;/h2&gt;
&lt;p&gt;在开发中，会经常碰到bug问题，那么有了bug就需要修复，在Git中，分支是很强大的，每个bug都可以
通过一个临时分支来修复，修复完成后，合并分支，然后将临时的分支删除掉。
比如我在开发中接到一个404 bug时候，我们可以创建一个404分支来修复它，但是，当前的dev分支上
的工作还没有提交。比如如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171600011.png&quot; alt=&quot;image-20250617160039981&quot;&gt;&lt;/p&gt;
&lt;p&gt;并不是我不想提交，而是工作进行到一半时候，我们还无法提交，比如我这个分支bug要2天完成，但是
我issue-404 bug需要5个小时内完成。怎么办呢？还好，Git还提供了一个stash功能，可以把当前工作现
场 ”隐藏起来”，等以后恢复现场后继续工作。如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171600597.png&quot; alt=&quot;image-20250617160059568&quot;&gt;&lt;/p&gt;
&lt;p&gt;所以现在我可以通过创建issue-404分支来修复bug了。
首先我们要确定在那个分支上修复bug，比如我现在是在主分支master上来修复的，现在我要在master
分支上创建一个临时分支，演示如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171601497.png&quot; alt=&quot;image-20250617160112464&quot;&gt;&lt;/p&gt;
&lt;p&gt;修复完成后，切换到master分支上，并完成合并，最后删除issue-404分支。演示如下：
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171601451.png&quot; alt=&quot;image-20250617160126415&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在，我们回到dev分支上干活了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171601021.png&quot; alt=&quot;image-20250617160140992&quot;&gt;&lt;/p&gt;
&lt;p&gt;工作区是干净的，那么我们工作现场去哪里呢？我们可以使用命令 git stash list来查看下。如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171601373.png&quot; alt=&quot;image-20250617160153342&quot;&gt;&lt;/p&gt;
&lt;p&gt;工作现场还在，Git把stash内容存在某个地方了，但是需要恢复一下，可以使用如下2个方法：
1.git stash apply恢复，恢复后，stash内容并不删除，你需要使用命令git stash drop来删除。
2.另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。
演示如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171602109.png&quot; alt=&quot;image-20250617160236071&quot;&gt;&lt;/p&gt;
&lt;h2&gt;七：多人协作&lt;/h2&gt;
&lt;p&gt;当你从远程库克隆时候，实际上Git自动把本地的master分支和远程的master分支对应起来了，并且远
程库的默认名称是origin。
要查看远程库的信息 使用 git remote
要查看远程库的详细信息 使用 git remote –v
如下演示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171602049.png&quot; alt=&quot;image-20250617160247020&quot;&gt;&lt;/p&gt;
&lt;h3&gt;一、推送分支：&lt;/h3&gt;
&lt;p&gt;推送分支就是把该分支上所有本地提交到远程库中，推送时，要指定本地分支，这样，Git就会把该分支
推送到远程库对应的远程分支上：
使用命令 git push origin master
比如我现在的github上的readme.txt代码如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171603742.png&quot; alt=&quot;image-20250617160309703&quot;&gt;&lt;/p&gt;
&lt;p&gt;本地的readme.txt代码如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171603112.png&quot; alt=&quot;image-20250617160321084&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在我想把本地更新的readme.txt代码推送到远程库中，使用命令如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171603373.png&quot; alt=&quot;image-20250617160331344&quot;&gt;&lt;/p&gt;
&lt;p&gt;我们可以看到如上，推送成功，我们可以继续来截图github上的readme.txt内容 如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171603703.png&quot; alt=&quot;image-20250617160341656&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到 推送成功了，如果我们现在要推送到其他分支，比如dev分支上，我们还是那个命令 git push
origin dev 那么一般情况下，那些分支要推送呢？
master分支是主分支，因此要时刻与远程同步。
一些修复bug分支不需要推送到远程去，可以先合并到主分支上，然后把主分支master推送到远程去。&lt;/p&gt;
&lt;h3&gt;二：抓取分支：&lt;/h3&gt;
&lt;p&gt;多人协作时，大家都会往master分支上推送各自的修改。现在我们可以模拟另外一个同事，可以在另一
台电脑上（注意要把SSH key添加到github上）或者同一台电脑上另外一个目录克隆，新建一个目录名字
叫testgit2
但是我首先要把dev分支也要推送到远程去，如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171603598.png&quot; alt=&quot;image-20250617160357563&quot;&gt;&lt;/p&gt;
&lt;p&gt;接着进入testgit2目录，进行克隆远程的库到本地来，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171604904.png&quot; alt=&quot;image-20250617160406867&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在目录下生成有如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171604602.png&quot; alt=&quot;image-20250617160431567&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在我们的小伙伴要在dev分支上做开发，就必须把远程的origin的dev分支到本地来，于是可以使用命
令创建本地dev分支：git checkout –b dev origin/dev
现在小伙伴们就可以在dev分支上做开发了，开发完成后把dev分支推送到远程库时。
如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171604271.png&quot; alt=&quot;image-20250617160448234&quot;&gt;&lt;/p&gt;
&lt;p&gt;小伙伴们已经向origin/dev分支上推送了提交，而我在我的目录文件下也对同样的文件同个地方作了修
改，也试图推送到远程库时，如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171605627.png&quot; alt=&quot;image-20250617160513583&quot;&gt;&lt;/p&gt;
&lt;p&gt;由上面可知：推送失败，因为我的小伙伴最新提交的和我试图推送的有冲突，解决的办法也很简单，上
面已经提示我们，先用git pull把最新的提交从origin/dev抓下来，然后在本地合并，解决冲突，再推
送。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171605155.png&quot; alt=&quot;image-20250617160537118&quot;&gt;&lt;/p&gt;
&lt;p&gt;git pull也失败了，原因是没有指定本地dev分支与远程origin/dev分支的链接，根据提示，设置dev和
origin/dev的链接：如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171605999.png&quot; alt=&quot;image-20250617160555967&quot;&gt;&lt;/p&gt;
&lt;p&gt;这回git pull成功，但是合并有冲突，需要手动解决，解决的方法和分支管理中的 解决冲突完全一样。解
决后，提交，再push：
我们可以先来看看readme.txt内容了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171606357.png&quot; alt=&quot;image-20250617160608327&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在手动已经解决完了，我接在需要再提交，再push到远程库里面去。如下所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/xz131714/PicBed@main/202506171606564.png&quot; alt=&quot;image-20250617160620529&quot;&gt;&lt;/p&gt;
&lt;p&gt;因此：多人协作工作模式一般是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;首先，可以试图用git push origin branch-name推送自己的修改.
如果推送失败，则因为远程分支比你的本地更新早，需要先用git pull试图合并。
如果合并有冲突，则需要解决冲突，并在本地提交。再用git push origin branch-name推送。
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate></item><item><title>🚀 Sqoop的导入导出</title><link>https://hub.131714.xyz/blog/sqoop/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/sqoop/</guid><description>Sqoop的导入导出命令的基本使用方法</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/sqoop/&quot;&gt;https://hub.131714.xyz/blog/sqoop/&lt;/a&gt;&lt;/blockquote&gt; &lt;h2&gt;🔁 一、全量导入（Import）&lt;/h2&gt;
&lt;h3&gt;1. 导入 MySQL 表到 HDFS&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \     # MySQL JDBC连接
--username root \                                  # 用户名
--password root \                                  # 密码
--table emp \                                      # 要导入的MySQL表名
--target-dir /user/hadoop/emp \                    # 数据导入到的HDFS目录
--delete-target-dir \                              # 删除原有目录（防止重复）
--fields-terminated-by &amp;#39;\t&amp;#39; \                      # 指定字段分隔符为tab
--num-mappers 1                                    # 使用一个Map任务（方便查看）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;2. 导入 MySQL 表到 Hive 表中&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \     # 连接MySQL数据库
--username root \                                  # 用户名
--password root \                                  # 密码
--table emp \                                      # 表名
--hive-import \                                    # 导入到Hive中
--hive-table emp_hive \                            # 指定Hive表名
--fields-terminated-by &amp;#39;\t&amp;#39; \                      # 字段分隔符
--num-mappers 1                                    # 一个Map任务
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;🔄 二、增量导入（Incremental Import）&lt;/h2&gt;
&lt;h3&gt;1. 模式一：追加模式（append）按ID导入新数据&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \     # MySQL连接
--username root \                                  # 用户名
--password root \                                  # 密码
--table emp \                                      # 表名
--incremental append \                             # 使用追加模式
--check-column id \                                # 检查id字段的值
--last-value 1000 \                                # 上次最大id，导入id &amp;gt; 1000的数据
--target-dir /user/hadoop/emp_increment \          # HDFS目标路径
--fields-terminated-by &amp;#39;\t&amp;#39; \                      # 字段分隔符
--num-mappers 1                                    # Map任务数量
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;2. 模式二：按更新时间（lastmodified）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sqoop import \
--connect jdbc:mysql://localhost:3306/testdb \     # MySQL连接
--username root \                                  # 用户名
--password root \                                  # 密码
--table emp \                                      # 表名
--incremental lastmodified \                       # 使用lastmodified模式
--check-column last_updated \                      # 检查更新时间字段
--last-value &amp;quot;2024-01-01 00:00:00&amp;quot; \               # 上次导入时间
--target-dir /user/hadoop/emp_updated \            # HDFS路径
--fields-terminated-by &amp;#39;\t&amp;#39; \                      # 字段分隔符
--num-mappers 1                                    # Map任务数量
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;🔃 三、导出（Export）从 HDFS 到 MySQL&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sqoop export \
--connect jdbc:mysql://localhost:3306/testdb \     # 目标MySQL数据库
--username root \                                  # 用户名
--password root \                                  # 密码
--table emp_backup \                               # 要导出的MySQL表
--export-dir /user/hadoop/emp \                    # HDFS中源数据路径
--fields-terminated-by &amp;#39;\t&amp;#39; \                      # 字段分隔符要和导入时一致
--num-mappers 1                                    # 使用一个Map任务导出
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;📌 附加说明&lt;/h2&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;--connect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定数据库 JDBC 连接字符串（例如 MySQL）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--username&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据库用户名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--password&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据库密码（建议改为 --password-file 以提升安全）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--password-file&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从本地文件读取密码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--table&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;要导入或导出的数据库表名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--target-dir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定导入数据的 HDFS 目标目录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--delete-target-dir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;如果目标目录已存在，则先删除它&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--fields-terminated-by&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;设置字段之间的分隔符，常用 &lt;code&gt;&amp;#39;\t&amp;#39;&lt;/code&gt;（制表符）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--num-mappers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;设置并行执行 Map 任务数（默认4）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--split-by&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用于 Map 任务并发切分的字段名，通常为主键&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--hive-import&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;导入数据后自动将其加载到 Hive 表中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--hive-table&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定 Hive 中的目标表名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--incremental&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;增量导入模式：&lt;code&gt;append&lt;/code&gt;（追加）或 &lt;code&gt;lastmodified&lt;/code&gt;（按更新时间）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--check-column&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;增量导入时用于判断新增数据的列名（如 &lt;code&gt;id&lt;/code&gt; 或 &lt;code&gt;last_updated&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--last-value&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定上次导入的最大ID或最近更新时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--columns&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定导入/导出的字段子集，使用逗号分隔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--where&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自定义SQL查询条件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--export-dir&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;HDFS中要导出数据的目录路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--as-textfile&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定数据以文本格式保存（默认）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--compress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;启用压缩&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--compression-codec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;压缩类型（如 &lt;code&gt;org.apache.hadoop.io.compress.GzipCodec&lt;/code&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--map-column-java&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定字段与 Java 类型的映射&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--driver&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指定数据库的 JDBC 驱动类（如非 MySQL）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Sun, 15 Jun 2025 00:00:00 GMT</pubDate></item><item><title>🚀 Hadoop &amp; Hive 数据仓库</title><link>https://hub.131714.xyz/blog/hadoop_hive_warehouse/</link><guid isPermaLink="true">https://hub.131714.xyz/blog/hadoop_hive_warehouse/</guid><description>Hadoop与Hive的基本概念、安装配置及使用方法。</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Ryuchan Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://hub.131714.xyz/blog/hadoop_hive_warehouse/&quot;&gt;https://hub.131714.xyz/blog/hadoop_hive_warehouse/&lt;/a&gt;&lt;/blockquote&gt; &lt;h1&gt;Hadoop &amp;amp; Hive 数据仓库&lt;/h1&gt;
&lt;hr&gt;
&lt;h2&gt;一、数据仓库定义&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;数据仓库（Data Warehouse）&lt;/strong&gt; 是面向主题的、集成的、相对稳定的、反映历史变化的数据集合，用于支持管理决策。&lt;/p&gt;
&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;二、数据仓库与数据库的对比&lt;/h2&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;支持日常业务操作（OLTP）&lt;/td&gt;
&lt;td&gt;支持决策分析（OLAP）&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;低频更新，主要为批量加载&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;保存大量历史数据&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;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;三、简答题模板答案&lt;/h2&gt;
&lt;h3&gt;1. Hadoop 环境搭建步骤&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;安装 JDK，配置环境变量 &lt;code&gt;JAVA_HOME&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;配置主机名映射（&lt;code&gt;/etc/hosts&lt;/code&gt;），确保各节点能互相解析。&lt;/li&gt;
&lt;li&gt;配置 SSH 免密登录，使用 &lt;code&gt;ssh-keygen&lt;/code&gt; 和 &lt;code&gt;ssh-copy-id&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;安装 Hadoop，配置核心文件，启动集群。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;2. Hive 数据仓库层次结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ODS（原始层）&lt;/strong&gt;：存储原始日志和业务数据，未清洗。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DWD（明细层）&lt;/strong&gt;：数据清洗、结构化，规范字段。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DWS（汇总层）&lt;/strong&gt;：按主题聚合，支持分析查询。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ADS（应用层）&lt;/strong&gt;：面向应用和报表的最终数据层。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;3. 日志数据采集方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;Flume&lt;/strong&gt; 采集日志，组成：Source（数据输入）、Channel（缓冲）、Sink（输出存储）。&lt;/li&gt;
&lt;li&gt;结合 &lt;strong&gt;Kafka&lt;/strong&gt; 实现高吞吐、实时处理，日志写入 Kafka，再由 Spark/Flink 等实时消费。&lt;/li&gt;
&lt;li&gt;Flume 可直接将日志写入 HDFS 或 Kafka。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;4. Hive 中常用概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分区表&lt;/strong&gt;：按字段分区存储，提高查询效率。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内部表&lt;/strong&gt;：Hive 管理数据，删除表时数据也删除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部表&lt;/strong&gt;：只管理表结构，删除表不删除数据。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据倾斜&lt;/strong&gt;：某些 key 数据量过大，导致资源分配不均衡，影响性能。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;四、口诀记忆版&lt;/h2&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;JDK+主机映射+免密登录&lt;/td&gt;
&lt;td&gt;JDK装好主机通，免密SSH连通&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hive仓库四层结构&lt;/td&gt;
&lt;td&gt;原始ODS明细DWD，汇总DWS应用ADS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flume采集三大件&lt;/td&gt;
&lt;td&gt;来源输入缓冲流，输出到存储去&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kafka作用&lt;/td&gt;
&lt;td&gt;高吞吐，消息队，实时流数据&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hive表两种类型&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;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr&gt;
&lt;h2&gt;五、Hive 基础操作&lt;/h2&gt;
&lt;h3&gt;1. 创建数据库&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE DATABASE mydb;     -- 创建一个名为 mydb 的数据库
USE mydb;                 -- 切换当前使用的数据库为 mydb
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 创建表&lt;/h3&gt;
&lt;h4&gt;管理表（内部表）&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE TABLE emp (
    id INT,              -- 员工编号，整型
    name STRING,         -- 员工姓名，字符串
    age INT,             -- 员工年龄，整型
    dept STRING          -- 员工所在部门，字符串
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY &amp;#39;\t&amp;#39;;  -- 字段分隔符为制表符
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;外部表&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE EXTERNAL TABLE emp_ext (
    id INT,
    name STRING,
    age INT,
    dept STRING
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY &amp;#39;\t&amp;#39;
LOCATION &amp;#39;/user/hive/warehouse/emp_ext&amp;#39;;  -- 指定外部表数据存储路径
-- 外部表删除只删除元数据，不会删除数据文件
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;六、数据导入操作&lt;/h2&gt;
&lt;h3&gt;1. 本地文件导入表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;LOAD DATA LOCAL INPATH &amp;#39;/home/user/emp.txt&amp;#39; INTO TABLE emp;  -- 将本地文件数据导入表
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. HDFS 文件导入表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;LOAD DATA INPATH &amp;#39;/user/hadoop/emp.txt&amp;#39; INTO TABLE emp;      -- 将HDFS文件追加导入表
LOAD DATA INPATH &amp;#39;/user/hadoop/emp.txt&amp;#39; OVERWRITE INTO TABLE emp;  -- 将HDFS文件覆盖导入表
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;七、Hive 数据分析操作&lt;/h2&gt;
&lt;h3&gt;1. 查询所有数据&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM emp;   -- 查询表中所有记录
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 分组聚合查询（GROUP BY）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT dept, COUNT(*) AS emp_count    -- 按部门统计员工数量
FROM emp
GROUP BY dept;

SELECT dept, AVG(age) AS avg_age      -- 按部门计算平均年龄
FROM emp
GROUP BY dept;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 过滤条件（WHERE）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM emp
WHERE age &amp;gt; 30;   -- 查询年龄大于30岁的员工
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 排序（ORDER BY / SORT BY / DISTRIBUTE BY）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM emp ORDER BY age;                      -- 全局排序，按年龄升序
SELECT * FROM emp SORT BY age;                       -- 局部排序，适合MapReduce局部排序
SELECT * FROM emp DISTRIBUTE BY dept SORT BY age;   -- 按部门分区后，部门内按年龄排序
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;八、多表关联查询（JOIN）&lt;/h2&gt;
&lt;h3&gt;1. 内连接（INNER JOIN）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT e.id, e.name, d.dept_name
FROM emp e
JOIN dept d
ON e.dept = d.dept_id;    -- 返回两个表匹配部门的记录
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 左外连接（LEFT OUTER JOIN）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT e.id, e.name, d.dept_name
FROM emp e
LEFT OUTER JOIN dept d
ON e.dept = d.dept_id;    -- 返回所有员工及对应部门，部门不存在显示NULL
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 右外连接（RIGHT OUTER JOIN）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT e.id, e.name, d.dept_name
FROM emp e
RIGHT OUTER JOIN dept d
ON e.dept = d.dept_id;    -- 返回所有部门及对应员工，员工不存在显示NULL
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 全外连接（FULL OUTER JOIN）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT e.id, e.name, d.dept_name
FROM emp e
FULL OUTER JOIN dept d
ON e.dept = d.dept_id;    -- 返回所有员工和部门的匹配及不匹配记录
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;九、常用函数&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CONCAT(col1, col2);                      -- 字符串连接函数
REPLACE(&amp;#39;hello world&amp;#39;, &amp;#39;world&amp;#39;, &amp;#39;Hive&amp;#39;); -- 字符串替换，将world替换为Hive
FROM_UNIXTIME(UNIX_TIMESTAMP());         -- 获取当前时间，格式化显示
IF(col IS NULL, &amp;#39;空&amp;#39;, col);               -- 条件判断，空值替换为&amp;#39;空&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;十、表结构修改（ALTER TABLE）&lt;/h2&gt;
&lt;h3&gt;1. 重命名表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE emp RENAME TO emp_new;   -- 将表emp重命名为emp_new
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 添加列&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE emp ADD COLUMNS (
    gender STRING COMMENT &amp;#39;性别&amp;#39;,    -- 新增性别字段，字符串类型，带注释
    salary FLOAT COMMENT &amp;#39;薪资&amp;#39;      -- 新增薪资字段，浮点型，带注释
);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 替换列结构（慎用）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE emp REPLACE COLUMNS (
    id INT,
    name STRING,
    age INT,
    dept STRING,
    gender STRING
);  -- 替换表结构，会丢失未列出的字段数据
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 修改列名、类型、位置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE emp CHANGE name emp_name STRING;        -- 修改列名name为emp_name，类型为STRING
ALTER TABLE emp CHANGE age age INT AFTER emp_name;  -- 修改列age位置，移动到emp_name后
ALTER TABLE emp CHANGE dept dept STRING FIRST;      -- 修改列dept位置，放置为第一列
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 添加/删除分区（分区表）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE sales ADD PARTITION (year=&amp;#39;2025&amp;#39;, month=&amp;#39;06&amp;#39;);   -- 添加指定分区
ALTER TABLE sales DROP PARTITION (year=&amp;#39;2024&amp;#39;, month=&amp;#39;12&amp;#39;);  -- 删除指定分区
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6. 修改表属性或位置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;ALTER TABLE emp SET TBLPROPERTIES (&amp;#39;comment&amp;#39; = &amp;#39;员工信息表&amp;#39;);  -- 设置表注释属性
ALTER TABLE emp SET LOCATION &amp;#39;/new/location&amp;#39;;                 -- 修改表存储路径
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;十一、数据操作（DML）&lt;/h2&gt;
&lt;p&gt;-- Hive默认不支持细粒度UPDATE/DELETE，需要开启ACID支持事务&lt;/p&gt;
&lt;h3&gt;1. 插入数据&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;INSERT INTO TABLE emp
SELECT * FROM emp_temp;      -- 将emp_temp数据追加到emp表

INSERT INTO TABLE emp (id, name)
VALUES (1001, &amp;#39;Alice&amp;#39;);     -- 指定列插入单条数据
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 覆盖插入&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;INSERT OVERWRITE TABLE emp
SELECT * FROM emp_temp;      -- 用emp_temp数据覆盖emp表
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 更新数据（需启用 ACID）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;UPDATE emp SET salary = 8000 WHERE id = 1001;   -- 更新指定员工薪资

-- ACID 配置示例
SET hive.support.concurrency = true;
SET hive.enforce.bucketing = true;
SET hive.exec.dynamic.partition.mode = nonstrict;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 删除数据（需启用 ACID）&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;DELETE FROM emp WHERE age &amp;gt; 60;   -- 删除年龄大于60的员工数据
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 查询数据&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;SELECT * FROM emp;                      -- 查询所有员工数据
SELECT name, salary FROM emp WHERE dept = &amp;#39;D001&amp;#39;;  -- 查询指定部门员工姓名和薪资
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;6. 清空表&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;TRUNCATE TABLE emp;   -- 清空表数据但保留表结构
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
</content:encoded><dc:creator>KoBari</dc:creator><pubDate>Sat, 14 Jun 2025 00:00:00 GMT</pubDate></item></channel></rss>