<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Shelter</title><link>https://allen0125.com/</link><description>Recent content on Shelter</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sat, 05 Jul 2025 22:19:19 +0800</lastBuildDate><atom:link href="https://allen0125.com/index.xml" rel="self" type="application/rss+xml"/><item><title>提前说拜拜了 Django！我的第一台摩托，从心动到心累</title><link>https://allen0125.com/posts/motorcycle-django/</link><pubDate>Sat, 05 Jul 2025 22:19:19 +0800</pubDate><guid>https://allen0125.com/posts/motorcycle-django/</guid><description>&lt;p>&lt;img src="../images/IMG_7637.jpg" alt="刚买回来的照片，在彩云">&lt;/p>
&lt;p>最近想把 Django 卖掉了，5月初的时候我还刚给它买好3者的商业保险，现在毫不犹豫的想要把它卖掉，多少钱都要卖的哪种，这段从满心欢喜到最后妥协的经历，我觉得还挺有意思的，得写下来唠唠。&lt;/p>
&lt;h2 id="梦中情车-就因为长得好看和名字好玩儿">梦中情车！😍 就因为长得好看和名字好玩儿&lt;/h2>
&lt;p>话说回来，我考驾照之前，心里就早就定好了，我的第一辆摩托必须是 Django！好多人也好奇，为什么不买档车，为什么要买个踏板。&lt;/p>
&lt;p>为啥？原因特别简单，全是新手的冲动和幻想。第一，是它那个复古的样子，我的天，简直长在了我的审美上。第二，它的名字和我使用的第一个 Python 开发框架 Django 一样，对我这个程序员来说，这亲切感一下就来了。最后，我喜欢那个可乐拉花的红白配色。&lt;/p>
&lt;p>哦，还有个特别重要的点：它！不！用！换！挡！对于一个新手来说，能让我专心看路，这对于需要熟悉道路来说非常重要。&lt;/p>
&lt;h2 id="蜜月期--有车的快乐就是这么简单">蜜月期 🛵💨 有车的快乐就是这么简单&lt;/h2>
&lt;p>&lt;img src="../images/IMG_4169.jpg" alt="修理店简单洗个车">&lt;/p>
&lt;p>刚有车那会儿，确实爽。尤其是我去彩云上班的时候，大部分时间都用 Django 通勤。不用去挤地铁、换乘，也不用担心打不到车，拧油门就走，确定性（随时能走，不耽误时间）和自由都有。&lt;/p>
&lt;p>它的加速也挺“佛系”的，说白了就是慢。但这对当时的我来说反而是好事，特有安全感。总之，作为通勤工具，一开始还行。&lt;/p>
&lt;p>但也就……仅此而已了。&lt;/p>
&lt;h2 id="现实的毒打--这些毛病真的忍不了">现实的毒打 😩 这些毛病真的忍不了&lt;/h2>
&lt;p>好景不长，激情过去后，Django 的各种毛病就开始挨个儿教育我了。&lt;/p>
&lt;p>首先就是那个要命的&lt;strong>怠速抖动&lt;/strong>。真不是开玩笑，等红灯的时候，感觉自己坐在了一台拖拉机上，后照镜抖得连后面是台啥车都看不清。手机？根本不敢放支架上，生怕分分钟把摄像头给我震坏了。结果就是，我基本告别了出远门，没手机导航，在北京这大迷宫里我能开到哪儿去啊？&lt;/p>
&lt;p>然后就是&lt;strong>京 B 的路权&lt;/strong>，太头疼了。我那会儿住三环里，挂着京 B 牌，理论上就是个“黑户”。虽然上班那条路没探头，但还是被警察叔叔抓个正着。那种心里发虚的感觉，让骑车的自由感直接打了个对折。&lt;/p>
&lt;p>还有，我&lt;strong>看腻了&lt;/strong>。没错，当初爱得不行的可乐拉花，后来越看越觉得……嗯……有那么点儿娘。审美这东西，果然是有保质期的。&lt;/p>
&lt;p>最后一个，也是最让人崩溃的，&lt;strong>储物空间约等于零&lt;/strong>。别说放个快递了，停完车，头盔都得自己拎着，像个傻子一样。想想要拎着头盔去逛街吃饭，出远门的念头又少了一分。&lt;/p>
&lt;h2 id="缘分已尽--三年还没骑到-2000-公里">缘分已尽 👋 三年还没骑到 2000 公里&lt;/h2>
&lt;p>三年，我就骑了不到 2000 公里！&lt;/p>
&lt;p>这车绝大部分的“车生”，都是在车库、地库里吃灰度过的。所以你说，卖掉它不是理所当然的嘛。当初的热情，早就被这些破事儿给磨没了。&lt;/p>
&lt;p>现在嘛，我天天开 Model Y 上下班，周末去哪儿也都是开车。电车安静又平顺，后备箱想放啥放啥，生活方便太多了。&lt;/p>
&lt;h2 id="下一辆会是它-关于未来的碎碎念">下一辆会是它？🤔 关于未来的碎碎念&lt;/h2>
&lt;p>&lt;img src="../images/IMG_1253.jpg" alt="在韩国偶遇的幼兽110">&lt;/p>
&lt;p>那……我以后还会买摩托吗？&lt;/p>
&lt;p>嗯……我想还是会的！但想法跟以前可完全不一样了。&lt;/p>
&lt;p>如果啊，只是如果，我再买下一台，那很可能是&lt;strong>本田的幼兽 110 (Super Cub)&lt;/strong>！&lt;/p>
&lt;p>为啥是它？它慢悠悠的，符合我这种“怂人”的安全感；它不抖，终于可以把手机安安稳稳放支架上了；样子复古又耐看，关键是“玩法”多，随便折腾。我就想把它当个纯粹的玩具，天气好的时候，骑着它去溜达溜达，喝杯咖啡，多惬意。&lt;/p>
&lt;p>至于那些帅炸了的大排量？emmm，等我哪天没有生活的压力的再考虑吧，凯旋我觉得没有骑士不喜欢。&lt;/p>
&lt;p>就这样了，也算是还了之前考驾照 Blog 的债了。&lt;/p></description></item><item><title>运营 tootbot.org 的经验分享：从搭建、维护到升级</title><link>https://allen0125.com/posts/tootbot-mastodon/</link><pubDate>Mon, 30 Jun 2025 18:19:19 +0800</pubDate><guid>https://allen0125.com/posts/tootbot-mastodon/</guid><description>&lt;p>作为一个 Mastodon 联邦实例的运营者，我想分享一下自己从零搭建 tootbot.org 到日常维护、定期升级、备份策略、安全管理、资源优化以及个人对联邦宇宙的体会。&lt;/p>
&lt;h2 id="一搭建一切从-docker-compose-开始">一、搭建：一切从 Docker Compose 开始&lt;/h2>
&lt;p>tootbot.org 的部署完全基于 Docker Compose，以下是核心服务的简化配置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">version&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2.1&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">services&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">db&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">postgres:14-alpine&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">./postgres14:/var/lib/postgresql/data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">POSTGRES_DB=mastodon&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">POSTGRES_PASSWORD=${DB_PASS}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">redis&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">redis:7-alpine&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">./redis:/data&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">mastodon&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">lscr.io/linuxserver/mastodon:latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">ports&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">1080&lt;/span>:&lt;span style="color:#ae81ff">80&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">10443&lt;/span>:&lt;span style="color:#ae81ff">443&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">volumes&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">~/appdata/config:/config&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">LOCAL_DOMAIN=tootbot.org&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">REDIS_HOST=redis&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DB_HOST=db&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DB_NAME=mastodon&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DB_USER=postgres&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">DB_PASS=${DB_PASS}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">SMTP_SERVER=${SMTP_SERVER}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">S3_ENABLED=${S3_ENABLED}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#ae81ff">...&lt;/span> &lt;span style="color:#75715e"># 其余配置略&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过 LinuxServer 的 Mastodon 镜像大大简化了配置和版本升级。&lt;/p></description></item><item><title>Ventoy：U盘启动更好的实践，不再反复烧录系统镜像</title><link>https://allen0125.com/posts/ventoy/</link><pubDate>Thu, 05 Jun 2025 20:25:19 +0800</pubDate><guid>https://allen0125.com/posts/ventoy/</guid><description>&lt;p>在日常工作和系统维护中，我们常常需要准备各种操作系统的启动盘，比如 Windows、Ubuntu、Arch Linux 等。传统方式需要不断使用工具（如 Rufus、balenaEtcher）将 ISO 镜像烧录到 U 盘中。这个过程既耗时又低效，一旦烧录完成，U 盘就只能用作启动盘，无法持续存储其他文件，极大地限制了灵活性。&lt;/p>
&lt;p>直到我用上 &lt;a href="https://github.com/ventoy/Ventoy">Ventoy&lt;/a>，才发现 U 盘还能这么灵活自由。&lt;/p>
&lt;hr>
&lt;h2 id="-ventoy-是啥">🧩 Ventoy 是啥？&lt;/h2>
&lt;p>Ventoy 是一个开源工具，它让你无需反复格式化和烧录，只需将 ISO/WIM/IMG/VHD(x)/EFI 等镜像文件直接拷贝到 U 盘中，就可以从 U 盘启动这些系统。它支持绝大多数操作系统，支持 Legacy BIOS 和 UEFI 启动，并且镜像文件可以共存于一个 U 盘中，通过启动菜单选择启动项。&lt;/p>
&lt;hr>
&lt;h2 id="-ventoy-好用在哪">💡 Ventoy 好用在哪？&lt;/h2>
&lt;h3 id="1-避免重复烧录多系统共存">1. &lt;strong>避免重复烧录，多系统共存&lt;/strong>&lt;/h3>
&lt;p>再也不用重复格式化和烧录，Windows、各类 Linux 发行版镜像（如 Debian、Ubuntu、Arch、Fedora 等）都能一并放入同一个 U 盘中，启动时直接选择需要安装的系统即可。&lt;/p>
&lt;h3 id="2-u-盘仍具备存储功能">2. &lt;strong>U 盘仍具备存储功能&lt;/strong>&lt;/h3>
&lt;p>传统烧录会将 U 盘格式化并占用整个盘，无法再存储其他文件。而使用 Ventoy 后，你可以在同一个 U 盘中创建一个 &lt;code>ISO&lt;/code> 文件夹用于镜像存放，同时保留空间用于文件传输和资料备份。&lt;/p>
&lt;h3 id="3-集成常用驱动安装更高效">3. &lt;strong>集成常用驱动，安装更高效&lt;/strong>&lt;/h3>
&lt;p>我们在使用如 ROG STRIX X870-I GAMING WIFI 这类主板时，经常需要额外的驱动支持（如 LAN/WIFI/声卡驱动），通过提前将主板驱动包放入 U 盘根目录，可以免去每次联网下载的麻烦。对于 Windows 安装更是必要，因原始镜像往往不包含这些设备驱动。&lt;/p>
&lt;p>NVIDIA 的显卡驱动同样适合提前准备——一个驱动包几乎可以覆盖所有消费级 GPU，避免因分辨率过低或未识别显卡而导致的安装困扰。&lt;/p></description></item><item><title>Model Y + TeslaMate：终于拥有自己的行程记录了</title><link>https://allen0125.com/posts/teslamate/</link><pubDate>Tue, 20 May 2025 20:25:19 +0800</pubDate><guid>https://allen0125.com/posts/teslamate/</guid><description>&lt;p>自从提了 Model Y 之后，日常使用基本都非常顺畅，唯独有一点让我一直觉得缺失感明显：&lt;strong>官方 Tesla App 中缺乏详细的行程记录、充电历史等信息&lt;/strong>。虽然能查看当前状态和控制车辆，但作为一名数据控，总感觉有些不够尽兴。&lt;/p>
&lt;p>直到有一天偶然发现了 &lt;a href="https://github.com/adriankumpf/teslamate">TeslaMate&lt;/a> 这个项目，我瞬间心动了——&lt;strong>开源、自部署、数据全在自己手中&lt;/strong>，简直是梦中情车！&lt;/p>
&lt;h2 id="一些犹豫休眠-bug--能耗问题">一些犹豫：休眠 bug &amp;amp; 能耗问题&lt;/h2>
&lt;p>在部署之前，我和一个同样拥有 Model Y 的朋友聊了一下。他提到他以前用过 TeslaMate，但遇到了车辆&lt;strong>无法进入休眠&lt;/strong>的问题，导致静态能耗明显升高。这个反馈一度让我有些犹豫，毕竟我也不想因为一个数据工具而增加电车“躺平时”的能耗。&lt;/p>
&lt;p>后来我自己也去查了一下相关资料，发现这是 TeslaMate 过去的一个已知 bug，但&lt;strong>现在已经在新版中被修复&lt;/strong>。而且说实话，我自己对“几瓦几瓦的待机功耗”也没有那么敏感，于是决定——部署！&lt;/p>
&lt;h2 id="部署体验轻松愉快">部署体验：轻松愉快&lt;/h2>
&lt;p>我在家里的 Gen8 小主机上用 Docker 部署 TeslaMate，&lt;strong>整个过程异常顺利&lt;/strong>，几乎是照着官方文档一步步抄命令就完事。&lt;/p>
&lt;p>印象最深的是 Tesla 的认证流程：&lt;br>
Tesla 现在提供了一个官方的 &lt;strong>Auth App&lt;/strong> 进行授权，比起传统 Web 应用还得登录开发者平台、创建 App、复制 token 的那一套流程，友好太多，真是让人感动一小下。&lt;/p>
&lt;h2 id="使用体验grafana-面板好直观">使用体验：Grafana 面板好直观&lt;/h2>
&lt;p>部署好之后，一打开 TeslaMate 自带的 Grafana 看板，整个人都爽了。&lt;/p>
&lt;ul>
&lt;li>每次行程的起止点、耗时、能耗、平均速度等信息一目了然&lt;/li>
&lt;li>每次充电的电量、时间、充电功率、充电成本都能记录&lt;/li>
&lt;li>还有地图、海拔、温度等数据的可视化呈现，完全满足我的数据控需求&lt;/li>
&lt;/ul>
&lt;p>能看到自己从哪儿到哪儿用了多少电，那种“把自己开车生活数据化”的快感实在太棒了。&lt;/p>
&lt;h2 id="一个小小的槽点行程划分稍显粗糙">一个小小的槽点：行程划分稍显粗糙&lt;/h2>
&lt;p>目前唯一让我稍微有些不适应的是 TeslaMate 对“行程”的定义逻辑：&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>每次挂入 P 档，就会视为结束当前行程&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>这就会出现一种情况：我如果临时路边停一下，送个朋友下车，TeslaMate 就会把这次行驶记录断成两段。虽然能理解（毕竟没有明确的“继续行程”信号），但如果以后能提供自定义合并的方式那就更完美了。&lt;/p>
&lt;h2 id="总结先用着数据控的最爱">总结：先用着，数据控的最爱&lt;/h2>
&lt;p>虽然还没有长期使用，但目前来看 TeslaMate 几乎解决了我对 Tesla App 的全部不满，并且体验丝滑，部署方便。&lt;br>
以后是否会影响车辆休眠？是否还能发现更多隐藏功能？我还在持续观察。&lt;/p></description></item><item><title>Windows 下 C++ 的编程开发体验：从配置地狱到打包小确幸</title><link>https://allen0125.com/posts/windows-cpp-orz/</link><pubDate>Mon, 07 Apr 2025 22:09:19 +0800</pubDate><guid>https://allen0125.com/posts/windows-cpp-orz/</guid><description>&lt;p>最近开始折腾 Windows 下的 C++ 开发，说实话，这过程让我深刻体会到什么叫「配置即编程」。虽然之前也接触过 C++，但真正开始动手写一个稍微完整点的项目，才意识到这门语言背后藏着的复杂度，依旧不容小觑。&lt;/p>
&lt;h2 id="依赖管理conan-的引入与困惑">依赖管理：Conan 的引入与困惑&lt;/h2>
&lt;p>在现代语言中，包管理器几乎是必不可少的工具。于是我自然地选择了 &lt;a href="https://conan.io/">Conan&lt;/a> 来管理 C++ 依赖。但使用 Conan 的过程，并没有我想象中顺利。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>路径配置&lt;/strong>：一开始就被 &lt;code>conan profile&lt;/code> 配置、缓存路径、编译器路径搞晕了头，尤其是在 Windows 下，还要考虑 MSVC 的各种路径引用。&lt;/li>
&lt;li>&lt;strong>编辑器集成&lt;/strong>：无论是 Visual Studio 还是 VS Code，想要让它们正确识别 Conan 拉下来的库，都需要手动处理 include 路径、lib 路径和编译选项。这和 Python 一键 pip 安装简直是两个世界。&lt;/li>
&lt;li>&lt;strong>依赖寻找&lt;/strong>：更麻烦的是，Conan 中并不是所有常用库都能找到。一些库要么版本太旧，要么根本没有，这时候只能自己手动下载源码、配置 CMake、管理依赖链。这一整个过程基本上就是在挑战我的耐心极限。&lt;/li>
&lt;/ul>
&lt;p>更糟的是，&lt;strong>GitHub Actions 的 CI 配置也变得异常复杂&lt;/strong>。本地已经够折腾了，到了 CI/CD 还要考虑 Conan 安装、缓存、跨平台兼容、路径修正等各种琐碎问题。C++ 开发者真的太不容易了。&lt;/p>
&lt;h2 id="打包过程setupiss-的一丝温柔">打包过程：Setup.iss 的一丝温柔&lt;/h2>
&lt;p>难得有个顺利的部分，就是最终的应用打包。我使用了 &lt;a href="https://jrsoftware.org/isinfo.php">Inno Setup&lt;/a> 的 &lt;code>Setup.iss&lt;/code> 来生成安装包。虽然一开始对这个 &lt;code>.iss&lt;/code> 脚本一头雾水，但幸运的是，AI 帮我搞定了绝大部分配置：&lt;/p>
&lt;ul>
&lt;li>自定义安装路径&lt;/li>
&lt;li>拷贝依赖的 DLL、资源文件&lt;/li>
&lt;li>创建桌面快捷方式&lt;/li>
&lt;li>设置启动项&lt;/li>
&lt;/ul>
&lt;p>这部分可以说是全程最丝滑的体验了，甚至让我有点感动。&lt;/p>
&lt;h2 id="总体体验c-依旧强大但门槛不低">总体体验：C++ 依旧强大，但门槛不低&lt;/h2>
&lt;p>如果说 Python 是一把锋利但易控的菜刀，C++ 更像是一台可编程机床。它能做很多事，而且性能极高，但代价就是你必须面对那些裸露的齿轮与电线。&lt;/p></description></item><item><title>Django vs FastAPI：一站式框架与轻量异步的取舍</title><link>https://allen0125.com/posts/django-vs-fastapi/</link><pubDate>Sun, 16 Mar 2025 13:30:55 +0800</pubDate><guid>https://allen0125.com/posts/django-vs-fastapi/</guid><description>&lt;p>在 Python Web 开发的世界里，Django 和 FastAPI 是两个备受关注的框架。一个是经典的一站式全能框架，另一个是新锐的异步性能利器。选择哪一个，很大程度上取决于你的项目需求、团队经验以及长期维护的考虑。&lt;/p>
&lt;p>本文将从开发体验、性能表现、生态成熟度、后台管理、认证系统、数据库迁移等方面对 Django 和 FastAPI 进行深入对比，帮助你做出适合自己的选择。&lt;/p>
&lt;hr>
&lt;h2 id="一轻量与性能fastapi-的优势">一、轻量与性能：FastAPI 的优势&lt;/h2>
&lt;p>FastAPI 的最大卖点之一，就是它的“轻”和“快”：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>原生异步 IO 支持&lt;/strong>：基于 Python 的 &lt;code>async&lt;/code>/&lt;code>await&lt;/code> 语法，FastAPI 可以充分利用异步并发，在高并发、IO 密集型的场景（如 WebSocket、API 网关、数据处理服务）中表现出色。&lt;/li>
&lt;li>&lt;strong>原生 RESTful 支持&lt;/strong>：基于标准的 OpenAPI 和 Pydantic，自动生成文档，强类型校验，接口设计现代且清晰。&lt;/li>
&lt;li>&lt;strong>启动快、体积小&lt;/strong>：由于没有绑定太多默认功能，FastAPI 项目结构简单、启动迅速。&lt;/li>
&lt;/ul>
&lt;p>然而，FastAPI 的“轻”也意味着很多事情你都得自己来：&lt;/p>
&lt;hr>
&lt;h2 id="二开发体验django-的一站式服务更省心">二、开发体验：Django 的一站式服务更省心&lt;/h2>
&lt;p>Django 自带的功能堪称“全家桶”：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>成熟稳定的 ORM&lt;/strong>：Django ORM 不如 SQLAlchemy 灵活，但够用、上手快、有一整套通用实践。&lt;/li>
&lt;li>&lt;strong>管理后台（Admin）&lt;/strong>：几乎是 Django 的“杀手锏”。只需几行代码即可生成完整的管理界面，极大提升开发效率。&lt;/li>
&lt;li>&lt;strong>认证与权限系统&lt;/strong>：包括用户模型、登录登出、权限控制、用户组等，几乎开箱即用。&lt;/li>
&lt;li>&lt;strong>数据库迁移系统（migrations）&lt;/strong>：Django 提供内建的迁移工具，配合 ORM 使用十分方便。&lt;/li>
&lt;li>&lt;strong>社区资源丰富&lt;/strong>：认证、支付、CMS、博客、论坛……几乎你能想到的功能，都有成熟、稳定的第三方库。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="三fastapi-的开发代价碎片化的生态与搭建成本">三、FastAPI 的开发代价：碎片化的生态与搭建成本&lt;/h2>
&lt;p>FastAPI 并不是“全家桶”：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>ORM依赖外部工具&lt;/strong>：FastAPI 通常搭配 SQLAlchemy、Tortoise ORM 等。但社区没有一个统一推荐实践。项目初期需自行搭建数据库模型、会话管理、关系处理等。&lt;/li>
&lt;li>&lt;strong>缺乏统一管理后台&lt;/strong>：不像 Django Admin 一样，FastAPI 没有默认的管理界面。你需要手动实现所有后台功能，包括用户管理、权限控制等。&lt;/li>
&lt;li>&lt;strong>认证系统需手动搭建&lt;/strong>：FastAPI 提供了依赖注入机制来实现认证，但真正落地时，往往需要自己实现 OAuth、JWT、Session 等机制。&lt;/li>
&lt;li>&lt;strong>数据库迁移不统一&lt;/strong>：Alembic 是 SQLAlchemy 的默认选择，但配置、使用成本不低，而且和业务 ORM 解耦，增添了维护成本。&lt;/li>
&lt;li>&lt;strong>维护难度&lt;/strong>：因为涉及到多个开源组件的拼接，项目后期维护需要开发者全面理解各个工具的边界和坑，容易造成“技术债”。&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="四性能是否真的关键">四、性能是否真的关键？&lt;/h2>
&lt;p>FastAPI 的异步确实能带来性能提升，但并不适用于所有场景。&lt;/p></description></item><item><title>Pentax 17 第一卷</title><link>https://allen0125.com/gallery/first/</link><pubDate>Sun, 16 Mar 2025 13:30:55 +0800</pubDate><guid>https://allen0125.com/gallery/first/</guid><description>&lt;p>上班路上的逆光拍摄&lt;/p>
&lt;p>&lt;img src="../images/20250626/000019280006.jpeg" alt="">&lt;/p>
&lt;p>雾中的大楼
&lt;img src="../images/20250626/000019280011.jpeg" alt="">&lt;/p>
&lt;p>给占占买的新猫粮
&lt;img src="../images/20250626/000019280025.jpeg" alt="">&lt;/p>
&lt;p>盯着我玩儿电脑的占占
&lt;img src="../images/20250626/000019280027.jpeg" alt="">&lt;/p>
&lt;p>一起吃的芈重山
&lt;img src="../images/20250626/000019280029.jpeg" alt="">&lt;/p>
&lt;p>试一下微距
&lt;img src="../images/20250626/000019280033.jpeg" alt="">&lt;/p>
&lt;p>公司咖啡厅的万圣节气息
&lt;img src="../images/20250626/000019280043.jpeg" alt="">&lt;/p>
&lt;p>警惕的占占
&lt;img src="../images/20250626/000019280048.jpeg" alt="">&lt;/p>
&lt;p>&lt;img src="../images/20250626/000019280052.jpeg" alt="">&lt;/p>
&lt;p>&lt;img src="../images/20250626/000019280053.jpeg" alt="">&lt;/p>
&lt;p>装电脑
&lt;img src="../images/20250626/000019280059.jpeg" alt="">&lt;/p></description></item><item><title>能发挥工具的优势才是一个好的工程师</title><link>https://allen0125.com/posts/play-to-ones-strengths/</link><pubDate>Sat, 16 Nov 2024 21:45:55 +0800</pubDate><guid>https://allen0125.com/posts/play-to-ones-strengths/</guid><description>&lt;p>最近大把时间在用 C++ 写一个 Windows 系统服务，到上周五把主要功能、打包、安装、卸载服务等等最重要的部分写完了，完成这个版本之后我对 Windows 的固有刻板印象也有所改变了，对于抵触使用主观感受不好的工具的想法也有所改变了。&lt;/p>
&lt;p>Windows 真的很不适合开发者吗？&lt;/p>
&lt;p>冷静的想一下过去我对 Windows 用来做开发比较抵触两件事情&lt;/p>
&lt;ol>
&lt;li>配置环境变量
&lt;ol>
&lt;li>入口深&lt;/li>
&lt;li>UI/UX 对于编辑较长的环境来讲简直是噩梦&lt;/li>
&lt;li>难以搜索&lt;/li>
&lt;/ol>
&lt;/li>
&lt;li>缺失系统包管理工具
&lt;ol>
&lt;li>安装需要的开发工具时不能通过类似 &lt;code>apt install foo&lt;/code> &lt;code>dnf install bar&lt;/code> 这样的操作快速且高效的完成&lt;/li>
&lt;li>卸载依赖也需要借助有 UI 界面的程序管理完成，甚至还需要自己手动去清除环境变量&lt;/li>
&lt;li>查看系统内工具列表、版本号也不是一件简单的事情，且给出的结果并不清晰&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ol>
&lt;p>在过去的几周时间里我感受到了这两个问题都有所改善。&lt;/p>
&lt;p>首先是环境变量，&lt;code>PATH&lt;/code> 环境变量值现在可以分行编辑，不再是所有配置都在一行然后使用 &lt;code>;&lt;/code> 来分割了，不过依旧没有搜索，比不上 *nix、macOS 等在编辑器里面配置，使用编辑器搜索功能即可快速定位；其次是系统包管理工具，我最近在使用 &lt;code>choco&lt;/code>，最起码它能让 Windows 不再缺失包管理工具，比如没有 &lt;code>git&lt;/code> 的时候我能随手 &lt;code>choco install git&lt;/code>，而不用再 Google-git.com-download-install，全程用鼠标来完成（鼠标在这种时候是没有一条命令来的快）。&lt;/p>
&lt;p>当然，我很清楚 “有所改善” 和 “做的很好” 差距还是很大的，但是我也一直都在思考，当开发者在使用一个工具的时候最重要的事情是什么呢？&lt;/p>
&lt;p>显然，是需要 “扬长避短”。&lt;/p>
&lt;p>那我们来回到开头的问题，Windows 真的很不适合开发者吗？我觉得不是的，甚至我觉得 “适合开发者” 本身就是一个伪命题，开发者应该做的是清楚选择的工具的优、劣，结合自己的实际业务来完成工具选择，那这时候要选择 Windows、*nix 还是 macOS 来做开发、服务就不是哪一点让自己觉得不爽、哪些事情让自己很抵触的这种很不理性的问题了。&lt;/p>
&lt;p>比如我在做的这个 Windows 系统服务，它的需求来源于在项目中一定要使用一个脱离不了 Windows 的应用，这个应用可以通过 UDP 来完成一个通信，例如自定义配置项目，在这个前提我需要完成整个系统的控制服务，如果不引入其他设备的话最好就是运行在 Windows 上。&lt;/p></description></item><item><title>驾照增驾 D 摩托车驾驶资格过程回顾</title><link>https://allen0125.com/posts/motorcycle-license/</link><pubDate>Sun, 06 Dec 2020 23:54:45 +0800</pubDate><guid>https://allen0125.com/posts/motorcycle-license/</guid><description>&lt;p>&lt;img src="../images/8314104738_0202.jpg" alt="License">&lt;/p>
&lt;h2 id="为什么想要增驾d">为什么想要增驾D？&lt;/h2>
&lt;ul>
&lt;li>小时候坐过我爸摩托的油箱上面，我爸给我买过小朋友的头盔，从小就喜欢。&lt;/li>
&lt;li>现在有自行车，骑长途最多就骑过30公里，菜腿已经很累了。&lt;/li>
&lt;li>周末骑摩托去郊区吹风，想想就很棒。&lt;/li>
&lt;li>在北京没有汽车/新能源指标，京B的摩托相对容易Get，京A的摩托车指标也可以合法交易。&lt;/li>
&lt;li>操纵机械的快感。&lt;/li>
&lt;li>衣食住行里的行能得到一部分的解决。&lt;/li>
&lt;li>其实还有很多~&lt;/li>
&lt;/ul>
&lt;h2 id="为什么选择d">为什么选择D？&lt;/h2>
&lt;p>因为我想骑跨子，在没考得驾照之前我想我之后会偶尔骑跨子接送我闺女（为什么不是儿子？我想要闺女啊）上幼儿园，她一定是全幼儿园最酷的仔。&lt;/p>
&lt;p>关于这个想法，我在满分通过科目四等着拿驾照的时候还和其它学院坐在一起吹牛皮，讨论为什么选 D 不选 E 的时候我就说了我这个想法，然后之前我还吹了自己科目四满分通过的牛皮。然后大家就问我科目四没背摩托车不能带12岁一下儿童的题吗？当时我就尴尬了（&lt;/p>
&lt;p>以上是学 D 的一部分原因，更多的原因其实是觉得 D 范围大，做事情的资格这种事情当然是范围越大越好吧？&lt;/p>
&lt;h2 id="在北京怎么选择的驾校">在北京怎么选择的驾校？&lt;/h2>
&lt;p>我的 C1 是在龙泉驾校学的，C1 学习的过程很顺利，教练的应试教育教的很好，我也没有补考过，约车通过报名的教练约也没多操心过，然后和薰姐（推特上的一个大佬）聊天的过程中得知他（咦，不对劲）也是
在龙泉驾校学的，然后我就直接选择了龙泉驾校了。&lt;/p>
&lt;h2 id="学习的过程大概是怎样的">学习的过程大概是怎样的？&lt;/h2>
&lt;p>摩托车增驾也有四个科目，并且我考科目二、三还遇到了新换的电子监考，更难了一些。&lt;/p>
&lt;h3 id="科目一科目四背题-考试">科目一、科目四背题-考试&lt;/h3>
&lt;p>和 C1 类似，只不过是 50 道题了，更加 Easy，这个就不多说了。&lt;/p>
&lt;h3 id="科目二科目三练习">科目二、科目三练习&lt;/h3>
&lt;p>第一天去科目二的时候，练习和考试车都是嘉陵的跨子，教练教了如何启动，离合、油门、前轮刹车、后轮刹车、加减档、如何换档等操作
然后开始练习启动、挂挡、起步、绕圈；大概练习了 2 个小时后，到了科目二考试练习场地，又换了个教练，
教了坡道停车、坡道起步、单边桥、绕桩；其中我觉得最难的就是绕桩了，跨子绕桩本身车身就很宽，然后桩
之间的距离还很窄。&lt;/p>
&lt;p>科目三就是按照流程走一遍，流程如下图所示，不要做错、熄火、长时间半离合就没什么问题。&lt;/p>
&lt;p>龙泉驾校约考还比较麻烦，我约了很久，我是剩下两次练车的时候约的考试，我考试约在了周一，约到考试之后
我在周六周日练了两天，然后周一考试还是很紧张，不过好再过了。&lt;/p>
&lt;p>科目二、科目三都是一把就通过了，通过了之后就回到了驾校开始背科目四的题，下午1点半左右的时候花了
10几分钟满分通过了科目四。然后四点就拿到了新的驾照。&lt;/p>
&lt;h2 id="旧驾照怎么换的新驾照">旧驾照怎么换的新驾照&lt;/h2>
&lt;p>驾校在考科目四之前收了两张一寸白底免冠带镜框的照片旧驾照以及驾照副页，带镜框是因为我近视，必须要有个体现；
之前驾照的夹子留在了自己手里，然后在考完科目四之后给发了新的驾照、副页，并且还有新的驾照夹。
驾照上的准驾车型更新到了 C1D，扣分周期不变，副页备注了增驾 D 的实习周期。&lt;/p></description></item><item><title>记录一次VPS被黑后长记心的过程</title><link>https://allen0125.com/posts/vps-defender/</link><pubDate>Mon, 16 Mar 2020 23:45:55 +0800</pubDate><guid>https://allen0125.com/posts/vps-defender/</guid><description>&lt;p>昨天去看了下我在海星云上不怎么用的那台 VPS，然后发现了流量超出被暂停了，
被暂停了是看不到每天流量进出口监控，所以我发了工单问了下是什么情况，
大概就是 3 月 3 号的时候突然的 VPS 出口流量很多，
估计是被用来做肉鸡然后去 &lt;a href="https://www.cloudflare.com/zh-cn/learning/ddos/what-is-a-ddos-attack/">DDoS&lt;/a> 别人了吧。&lt;/p>
&lt;p>客服在看了流量是别黑没的之后好心的给我加了 400G，然后要求我在一个小时内解决掉被挂上的马。&lt;/p>
&lt;p>对于我这种运维小白来说，根本没有解决这种问题的经验，现在回头想下应该留一个快照之后研究用。
没有了实战环境那就学着从多个方面来提升 VPS 的安全程度就好了。
通过阅读资料我了解到了以下这些保证服务器安全的方法：&lt;/p>
&lt;ol>
&lt;li>SSH 相关安全；&lt;/li>
&lt;li>防火墙相关安全；&lt;/li>
&lt;li>rootkit 相关安全。&lt;/li>
&lt;/ol>
&lt;p>在重新安装系统之后，我把本地的 SSH-Key 也替换了一遍，之前是 RSA 的 SSH Key，
现在换成了 ED25519 公、私钥更短，但是更加安全，是 RSA 安全性的10倍，
更换了本地 SSH Key 之后我开始设置 VPS 上的 SSH 配置，SSH 配置修改了以下几部分。&lt;/p>
&lt;ol>
&lt;li>替换默认 22 端口，改为其它端口；&lt;/li>
&lt;li>创建新用户，加入 sudo 用户组，用户密码用 1Password 生成保证唯一；&lt;/li>
&lt;li>ssh-copy-id 给新建的用户添加上 SSH 公钥；&lt;/li>
&lt;li>禁止 root 用户登录；&lt;/li>
&lt;li>3 次密码失败等待，10 次密码失败使用 fail2ban ban IP。&lt;/li>
&lt;/ol>
&lt;p>完成 SSH 相关安全配置之后就开始配置防火墙
iptables 的配置对我来说还挺繁琐的，所以我就用 ufw 来进行防火墙的配置了，
ufw 配置起来和各种云服务的防火墙配置感觉类似，allow 端口或者 deny 端口就好了。
配置防火墙需要注意的是一定要先把 SSH 的端口打开，不然忘记这个可真的就要翻车了。
然后就是需要哪些端口再打开哪些端口，其他的一律禁止就好了。
我现在就只打开了 SSH 的端口和 80 端口，毕竟是新装的系统，装了个 nginx 测试下防火墙的效果，
并且 nginx 之后还是会用到的。&lt;/p></description></item><item><title/><link>https://allen0125.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://allen0125.com/about/</guid><description>&lt;h1 id="这里有关于-allen-简单的介绍">这里有关于 Allen 简单的介绍&lt;/h1>
&lt;h2 id="-tootbot">🐘 Tootbot&lt;/h2>
&lt;ol>
&lt;li>迫于万恶的资本家马一龙收紧 twitter API 并且改名为 X，我开始厌恶它，随后自己搭建了 tootbot.org&lt;/li>
&lt;li>现在活跃用户似乎就我一个人了，但是不要紧，这个实例我不想关&lt;/li>
&lt;li>iOS 上推荐 Ivory、Toot! 这两个客户端，都是收费 APP，前者订阅，后者买断&lt;/li>
&lt;li>Android 暂时没有推荐的客户端，你如果有用着顺手的可以安利给我&lt;/li>
&lt;/ol>
&lt;h2 id="-cqcqcq-这里是-bi1ntq">📻 CQCQCQ 这里是 BI1NTQ&lt;/h2>
&lt;ol>
&lt;li>北京地区 A 类操作证的火腿&lt;/li>
&lt;li>平时不守台，主要是爬山的时候用&lt;/li>
&lt;/ol>
&lt;h2 id="-兴趣爱好">✨ 兴趣爱好&lt;/h2>
&lt;ol>
&lt;li>🚴 自行车、摩托、长途自驾&lt;/li>
&lt;li>🧗 徒步，第一次徒步在北京 18 km 东灵北灵黄草梁穿越，第二次是两天 55km 五台山环穿&lt;/li>
&lt;li>🎿 在尝试入坑滑雪&lt;/li>
&lt;li>📷 喜欢拍照！尤其是胶片&lt;/li>
&lt;li>🎬 电影（200+，部分在豆瓣阅读标记）、阅读（100+，最近开始告别实体书转向微信读书+京东读书了）&lt;/li>
&lt;/ol>
&lt;h2 id="-工具安利">🔧 工具安利&lt;/h2>
&lt;ol>
&lt;li>北京的冬天免不了要用加湿器，我在用 352 的蒸发式加湿器，一桶水能用 1-2 天，不过清洗麻烦了些，最近用过滤过的水水垢的问题缓解了很多&lt;/li>
&lt;li>文石 Leaf3，可以很方便的使用微信读书、京东读书、Bilibili 漫画等等的客户端，很适合半在线半离线阅读习惯的我&lt;/li>
&lt;li>Spotify 曲库很全，不用担心有找不到的情况，最近买车后叛逃 Apple Music 了，音质更好，网络环境更友好&lt;/li>
&lt;li>M2 芯片的 iPad Pro，预算够了无脑购入就好了，娱乐、在线阅读、照片编辑中心&lt;/li>
&lt;/ol>
&lt;h2 id="-人生信条">🥳 人生信条&lt;/h2>
&lt;ol>
&lt;li>要么现在做，要么永远都不想&lt;/li>
&lt;/ol></description></item></channel></rss>