初之音 - 博客
type: channel
link: https://www.himiku.com/category/blog/
description: 只要是跟博客相关的东西，我就往这个分类里放。
items: Mikusa Annual Issue 6
items: 个性化 Typecho 后台
items: Mikusa Annual Issue 5
items: 用「WebP Server Go」优化你的图片
items: Mikusa Annual Issue 4
items: 解决 Typecho 的 Gravatar 头像显示问题
items: Mikusa Yearly Issue 3
items: 博客第一笔广告收入
items: Mikusa Yearly Issue 2
items: 来用 Umami 自建统计工具吧！

Mikusa Annual Issue 6
type: item
date: 2026-04-15T23:02:00+08:00
description: 我对 AI 的使用一直相当朴素，无非是把它当成一个更聪明一点的搜索引擎：遇到不会的东西，就在网页上来回车轮战，让 AI 猜解决方案，再把答案手动搬回编辑器里慢慢调试，最后一点点把功能做出来。例如之前提到的《给博客代码框增加复制按钮》，就是这样一点一点折腾出来的。彼时的 AI 于我而言，更像一个“贴心的老师”——它愿意告诉我答案，却不能直接帮我写作业。因此，我对博客的修改大多只能停留在小修小补的层面。涉及稍微复杂一些的东西，我就无能为力了。直到最近，我接触到了支持 AI Agent 的 IDE。第一次尝试借助 Google Antigravity 内置的 Claude Opus 模型编写小工具，亲眼看着代码从零开始一点点搭起来，我才真正意识到，如今的 AI 编程工具和前几年已经不是一回事了。它不再只是帮你补全几行代码、修正几处语法错误，而是可以直接阅读、理解，甚至参与修改整个项目。对于我这种完全不懂编程的小白来说，这种体验多少有点魔幻。于是，我也终于决定开始实施一项蓄谋已久的计划：翻新 VOID 主题。更新 VOID 主题如果你对这个 AI 适配的 VOID 主题感兴趣，可以访问 这里 下载主题压缩包并安装。距离 VOID 上一个 3.5.1 版本发布，已经过去了五年多。其间，Typecho 先后经历了 1.2.1 的小版本更新和 1.3.0 的大版本更新，而旧版 VOID 早在 1.2.0 时期就已经有启用后白屏的问题。所以这一次，我没有一上来就急着做兼容适配，而是先借助 Claude Opus 4.6，把这些年我自己陆续加在 VOID 上的小改动一点点迁了过去。 毕竟对我来说，这些东西比适配新版 Typecho 还要更紧迫一些。而后，我才让 Claude Code 针对 Typecho 1.3 及 PHP 8.2 的升级作专项适配，解决主题白屏等一系列兼容性问题。这中间我充分利用了上班摸鱼的时间，断断续续修改了大约一周。功能增强在我使用 VOID 的这些年，基于个人需求添加或改进了许多功能。我一直在思考这些小东西的必要性，是否只有我自己才用得到。最终还是决定，既然这是我个人修改的主题，那么就应该优先考虑自己的需求。在不破坏原主题整体设计的前提下，我完全可以将这些功能整合进主题源码，并公之于众。代码复制代码框的复制按钮其实早就合并到官方 VOID 仓库中了，这次是让 AI 根据原生剪切板 API 做了优化。原本是想让它抄一下 GitHub 的剪切板方案，但没能抄成功。GitHub 的复制按钮最后改成鼠标划过代码框才浮出复制按钮，复制成功的提示则还是放在弹窗上。OwO 表情包这一块我曾让 Z 酱帮忙提交了我一些新增的米哈游表情包。这次则是针对我自己真实的使用情况，对这些表情包做了一些增删。米哈游表情包其实常用的还是不多。写到这我才想起来，如果新增的表情包太多，超出数量的分组会因为溢出而被隐藏。于是火速让 Codex 修了这个 bug，现在的表情包选框是这样的：支持横向滚动但测试的时候又发现，这个表情包框只会往下弹，如果是没有评论的文章，就会把底部都撑开。于是就让 AI 糊成了这样：感觉实际效果还是有些不太对，等后续有想法了再作修改吧。归档页增强这就完全属于我自娱自乐的功能了。去年写总结的时候想看看今年总共写了多少字、哪些主题，觉得一篇篇手数好麻烦，就让 AI 糊了这么个功能。现在，归档页支持年度文章发布统计，只需将鼠标划过年份，即可展示年度总字数与分类聚合信息；同时，在文章列表右侧增加了其关联的分类标签，实测超多分类也可以正常显示。该功能不可关闭。文章过时提示开关VOID 会默认在文章发布 90 天后，提示其信息可能过时。例如这个提示对于教程类或是强时效类的文章，这个提示很有必要。但若是日常类或其他不受时间影响的文章，就有些多余了。于是，我在文章编辑页添加了一个开关，可按需展示内容是否过时。新文章默认关闭过时提示。主图来源我的博客使用了大量来自 Pixiv、Twitter 和其他网站的图片。考虑到可能存在的风险，我曾使用 Copyright 插件将主图来源展示在文末。但 VOID 的一大特色便是其主图，主图在主题的整体布局中具有十分重要的地位。那么，主图来源理应受到同等重视。可我对这方面的设计毫无头绪。在询问 Gemini 后，它给出了下面 4 种方案。 /* ========================================= 图源预览组件 - 独立作用域样式 ========================================= */ .source-demo-wrapper { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", …

个性化 Typecho 后台
type: item
date: 2025-09-22T00:19:00+08:00
description: Typecho 的管理后台相当简洁，整体以淡雅的灰白色为主色调。没有花哨的图表，也没有多余的视觉干扰，三栏式的布局关键功能、信息层次分明，使用起来非常高效。但是，官方博客部署在国外，并使用了 Cloudflare 的 CDN。如果一时访问不了，最右边的「官方最新日志」在进入后台的时候就会卡顿一下，非常影响加载速度。为了保证稳定，一般我们可能好几年都不会更新一次 Typecho 主程序；再者，官方正式版本迭代速度非常缓慢，这个日志也没什么大用。所以，可以考虑直接干掉这块内容，这样访问后台的时候能稍微提提速。首先，移除「官方最新日志」栏目。打开 admin/index.php 文件，找到并删除以下代码： <?php _e('官方最新日志'); ?> <?php _e('读取中...'); ?> 接着移除获取官方日志的 JavaScript 代码。在文件末尾的 标签中，找到并删除以下代码：if (!!html) { ul.html(html); } else { html = ''; $.get('<?php $options->index('/action/ajax?do=feed'); ?>', function (o) { for (var i = 0; i < o.length; i++) { var item = o[i]; html += ' ' + item.date + ' ' + item.title + ' '; } ul.html(html); cache.setItem('feed', html); }, 'json'); }刷新一下，后台就变成了这样：但这么一删，原本布局就显得有些不对称了。我倒是有个点子，把Z酱的动态塞到这边上，这样就可以及时注意到更新，然后第一时间转载，机智如我！可以找到「最近发布的文章」栏目的代码块，将 col-tb-4 修改为 col-tb-6：修改前： <?php _e('最近发布的文章'); ?> 修改后： <?php _e('最近发布的文章'); ?> 「最近得到的回复」栏目的代码块也同样如法炮制，将 col-tb-4 修改为 col-tb-6 即可。整体就会看起来稍微居中一些，就像这样：至于获取 Typecho 官方博客 RSS 内容的代码，既然不会被引用到就不去动它了。本来这篇水文到这里就该结束了。但我灵机一动，要不底下垫张壁纸试试？于是就变成了这样：方法也很简单，塞个样式就行。在 admin/header.php 文件中 前加入以下代码，效果是会在所有后台背景页面都显示这张壁纸： 以上代码由 Gemini 提供。就是太二次元了，一点也不习惯。原本为了加速访问删除的日志，反倒因此变得更卡了，有点本末倒置。用了几天就删掉了（

Mikusa Annual Issue 5
type: item
date: 2023-12-10T00:00:00+08:00
description: 从 2019 年起使用 VOID 主题到现在也快有 5 个年头了，虽说 VOID 已经有 3 年多没有更新，但她依旧是我用得最舒服的主题，没有之一。A 酱牛逼！只是「Mikusa Annual Issue」作为一档主攻博客小修小补的栏目，如果不体现针对博客现状具体的改进方案，继续像以前一样水的话，长久下去恐怕难以服众。时移事迁，我也有想要在博客上增加的小东西。往年我可以说「我并不会任何编程语言，无法自行为博客添加其他功能」，所以可以冠冕堂皇地水一点简单的东西。但今年情况不一样了。ChatGPT 等 AI 的出现，让我等不懂代码之辈也能写出代码来。于是乎，在 ChatGPT 和 New Bing 两位老师（主要是 Bing 老师，GPT 老师收费太高了）的帮助下，本代码小白，为博客添加了如下功能。代码框复制按钮众所周知，初之音是一个以开箱和水文为主的生活类博客，但在博主购买 NAS 继而写了一连串 NAS 相关的教程之后，水文的代码含量急剧升高。因此，为了方便大伙一键复制这些代码，我参考「亚灿网志」关于《代码块增加复制按钮》的内容，又从别处抄了个复制图标，简单实现了这一功能。可使用过程中我才发现，亚灿的代码并不支持手机端复制。我尝试询问了下 ChatGPT，她这么说到：document.execCommand 兼容性：document.execCommand 在现代浏览器中逐渐被废弃，不同浏览器对其的支持也有差异。您可以考虑使用更现代的 Clipboard API 来执行复制操作。另外，这个脚本似乎还不支持PJAX，需要刷新页面才能使用。我又问 GPT 加上了 PJAX 重载，同时还加上了夜间模式。以及复制提示：总之，在同 GPT 进行多番友好而激烈的探讨之后，修缮过的代码框复制按钮的 JS 部分如下：// 复制处理函数 function copyHandle(content, successMessage = "复制成功", errorMessage = "复制失败") { navigator.clipboard.writeText(content) .then(() => { VOID.alert(successMessage); }) .catch((error) => { console.error(errorMessage, error); VOID.alert(errorMessage); }); } // 点击事件，通过事件委托处理 function addClickListener() { $('.clipboard').on('click', function () { copyHandle($(this).next().text()); }); } // 初始化剪贴板功能 function loadClipboard() { $('pre').prepend(' <path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path> '); // 重新绑定事件处理程序 addClickListener(); } // 在页面加载时设置事件 $(document).ready(() => { loadClipboard(); });增加了夜间模式的 CSS 部分： /* 剪切板 */ .clipboard { position: absolute; top: 3px; right: 10px; color: #22252b; z-index: 100; text-align: center; cursor: pointer; line-height: 18px; } body.theme-dark .clipboard { color: white; }以及最重要的 PJAX 重载函数。如果有使用 PJAX 的话，别忘了在 VOID 主题设置的「PJAX 重载函数…

用「WebP Server Go」优化你的图片
type: item
date: 2023-09-21T00:33:00+08:00
description: 这两天上网冲浪的时候，发现了一个叫作「WebP Server Go」的开源项目。这个项目是这么介绍的：Go version of WebP Server. A tool that will serve your JPG/PNG/BMP/SVGs as WebP/AVIF format with compression, on-the-fly.WebP Server 的 Go 版本，旨在将您的 JPG/PNG/BMP/SVG 图片进行动态压缩并转换为 WebP/AVIF 格式。简单地说，这是一个自动压缩图片为 WebP/AVIF 格式的工具。关于 WebP 这一格式，早在《Mikusa Yearly Issue 1》一文中我就有详细地解释过。当时为了节省 CDN 流量的开销，拜托 Z酱帮我写了判断用来自动调用同路径下的 WebP 图片，唯一的不足就是要手动压缩图片并上传到服务器。后来 VOID 更新，我便放弃了这个需要更改主题代码的方案，改为直接使用 WebP 格式的图片。缺点也很明显，我还是需要手动压缩原始图片，再上传 WebP 格式的图片到图床，本地需要保留两份图片文件。至于本地备份的图片，肯定也是 png 或其他格式的原图优先级更高，毕竟 webp 有用到的话我可以手动再压缩。即使写东西顺带压缩下图片花不了多少功夫，也还是会有一转眼就忘记压缩直接上传原图的时候。不管不顾还好，强迫症发作的时候就会想着删掉原图重新上传。这看起来是个不痛不痒的问题，但也有会感到烦躁的时候。因此，在发现了「WebP Server Go」之后，我便急忙部署在服务器上运行起来，测试实际的使用效果。 【重要提示】随着处理图片数量的增加，WebP Server GO 的内存占用会显著上升。为确保程序稳定高效运行，建议您在高配置服务器上部署本应用。我的机子配置一般，已经承受不住 Webpgo 的摧残了，已于 2025年6月放弃使用该程序。安装项目提供了 Docker 容器，使用 docker compose 就可以一键安装：version: "3.9" services: webpgo: image: webpsh/webp-server-go environment: - MALLOC_ARENA_MAX=1 volumes: - ./pic:/opt/pics #本地图片路径 - ./webpgo/exhaust:/opt/exhaust #压缩后的图片缓存 - ./webpgo/metadata:/opt/metadata #压缩前后的图片元数据缓存 ports: - 3333:3333 restart: unless-stopped container_name: webpgo在 volumes 挂载目录中，./pic 指的是本地存放图片的路径，需要挂载到容器中的 /opt/pics 文件夹中。假设你有张图片路径为 ./pic/myblog/test.png ，那么 WebP Server Go 压缩后的链接就是 http://example.com/myblog/test.png 。/opt/pics 、/opt/exhaust 、/opt/metadata 是配置文件 config.json 中的默认配置，并非不可修改。参考官方 Docker 部署文档1中的说明，我们可以自定义这一配置文件，再挂载到容器中去，以对容器进行一些微调。原始的 config.json 内容如下（如有更新，请参考官方文档）：{ "HOST": "0.0.0.0", "PORT": "3333", "QUALITY": "90", "IMG_PATH": "./pics", "EXHAUST_PATH": "./exhaust", "IMG_MAP": {}, "ALLOWED_TYPES": ["jpg", "png", "jpeg", "bmp", "gif", "svg", "heic", "nef", "webp"], "ENABLE_AVIF": false, "ENABLE_EXTRA_PARAMS": false, "READ_BUFFER_SIZE": 4096, "CONCURRENCY": 262144, "DISABLE_KEEPALIVE": false }通俗易懂：QUALITY：压缩质量，默认 80，即 80%，有需要可以修改为 90%。IMG_PATH：图片路径，即映射中的 /opt/pics，你也可以修改为 ./pic，只是修改完后不要忘了同时修改 docker-compose.yml 文件。这一配置项亦支持远程路径，即你可以填写 http://example.com 直接从远程链接里抓图，这样就不用本地挂载图片了。IMG_MAP：多路径。…

Mikusa Annual Issue 4
type: item
date: 2022-01-05T00:18:00+08:00
description: 先祝各位新年快乐！ 现在已经是公历2022年的新年了，小站也平稳地度过了第4个年头。回首这一年，小站没有发生任何变化。更新速度缓慢，无意义的水文增多，文笔丝毫没有进步（好像本来也没什么文笔，那这条不算），简而言之，小站正处于停滞不前的节点。等等，停更也算是变化的吧？本来也没有什么更新的念头，只是上个月初在 半吊子的静树 大佬1的帮助下，顺利地用上了Docker，并成功将博客迁移了过去。小站现在的网站环境不再是靠「LNMP一键安装包」脚本编译的程序，而是由Docker驱动的Docker LNMP！。其实大佬很早就叫我用Docker了，毕竟容器化的LNMP搬家很方便，但我一直没有动手。一是懒，搬家真的很麻烦，重新配置服务器很麻烦；二是学习新东西对我这种不思进取的老年人来说，真的很头疼；三是社畜下班后只想哒哒哒打游戏了。上班摸鱼就不一样了。没错！我就是在摸鱼的时候把Docker LNMP给搭起来的！用上Docker的兴奋程度不亚于刚开始学会怎么搭建博客，以至于我很想写一篇教程来讲讲我是怎么费尽千辛万苦才用上这Docker的。可冷静之余才意识到，这东西我自己都还没搞懂，即便是现在也只到docker compose up -d的程度。我可不想误人子弟，这个念头就这样掐掉了。直到有一天欣赏 Z酱的电波站，才猛地想起来自己还有个叫做「Mikusa Yearly Issue」的东西。这不就是我为了水一些与博客相关，但不知道怎么起题目的东西所建的分类嘛！正好也有一段时间了，不就可以更新下？我可真是个小机灵鬼！哦对了，你们肯定纳闷，「诶，不是说叫 Mikusa Yearly Issue 吗，为啥标题是 Mikusa Annual Issue 嘞？」我早就猜到会问，这是因为Z酱说：「吾觉得 Annual Issue 比较顺口。」所以就换过来啦！Docker 化使用全新的啥软件都没有安装的Debian服务器，按照官方教程安装好docker-ce和docker compose，编写好docker-compose.yml，再执行docker compose up -d，只需数分钟2，一个可运行Typecho的LNMP环境就完成了。Docker重新部署环境的耗时要比二进制编译要短得多，这是优势之一。我的docker-compose.yml配置完全照搬大佬，而大佬为了在体验上与「LNMP一键安装包」脚本一致，nginx的conf配置完全使用原先脚本的文件。如此一来，迁移到Docker就十分方便，我只要把原先vhost下的文件全部复制到新服务器就行。MySQL使用的是mariadb。由于我原本的服务器年久失修，数据库排序规则比较混乱，我选择全部挨个导出，更新成utf8mb4_unicode_ci的排序规则。PHP由于A酱的VOID还未支持PHP8，Typecho亦未发布支持PHP8的正式版，因此使用的还是PHP7的最新版本。至于acme.sh，也替换成了Docker版本，虽说在申请证书上理解申请命令花了不少功夫，但搞明白之后，使用体验和Shell版acme.sh基本一致。毕竟申请完就放后台全自动了，谁还管这玩意。大致目录如下：├───docker-compose.yml │ ├───acme.sh ├───mysql │ │───Dockerfile │ └───data ├───nginx │ ├───conf │ └───logs │────────── access.log │────────── nginx.pid │────────── nginx_error.log ├───php │────────── Dockerfile └───www我本就习惯用VS Code打开/usr/local/，再找到其中的nginx、php等文件夹直接编辑需要的文件。现在这些东西都在同一级目录下，操作起来十分方便，熟悉新环境的成本为零。只是Docker的命令就需要重新学习一番了，比如最常用的lnmp nginx restart，现在变成了docker exec nginx nginx -s reload。更新php、nginx变得无比快捷，如果docker-compose.yml中是指定版本的，改个版本号再重新docker compose up -d就行，甚至不用停机维护。此外，有关挂载目录等新知识也还需要花时间琢磨才行。总而言之，对于只有一个博客的小博主来说，容器化真的是非常便捷的选择之一。当然你也可以选择将博客托管给朋友维护，那就更轻松了。接入备案既然搬了家，那接入备案就该提上计划了。我很早就不用阿里云的服务器了，但备案还在阿里云。这次既然又用回了国内服务器，自然就想着按照有关规定接入备案到腾讯云。迁移备案非常麻烦，可以说是一波三折。我的mikusa.cn是直…

解决 Typecho 的 Gravatar 头像显示问题
type: item
date: 2021-03-21T21:13:00+08:00
description: 隔壁酚酞大佬向我抱怨说博客头像加载不出来，要我赶紧想想办法。具体情况如下图。好家伙，因为日常挂代理的原因，我一直没注意到。清光缓存看了眼自己的。得，是必须要解决的严重问题。琢磨并测试了下，头像崩掉单纯是 Gravatar 服务在国内不好使的原因。因此只要使用国内的公共 CDN 服务，或是自己建一个，再替换掉 Typecho 程序中的原有链接，就能解决这个问题。替换原有链接在博客根目录/var/Typecho/Common.php中，使用VSCODE或是其他编辑器，快捷键Ctrl+F搜索secure.gravatar.com。Typecho 版本不同，位置可能会不一样，我的在 991 行左右。 $url = $isSecure ? 'https://secure.gravatar.com' : 'http://www.gravatar.com'; $url .= '/avatar/';搜索下可用的公共 CDNV2EX：https://cdn.v2ex.com/gravatar/极客族：https://sdn.geekzu.org/avatar/把第一行里头的链接替换掉 $url = $isSecure ? 'https://sdn.geekzu.org/avatar/' : 'https://cdn.v2ex.com/gravatar/';因为上面的 CDN 链接里已经带有/avatar/了，所以需要注释掉这一行，也可以把这行直接删掉。 //$url .= '/avatar/';然后保存，刷新，一切恢复正常。但是更新 Typecho 的时候覆盖了怎么办？还有一个方法，在博客根目录程序配置文件config.inc.php最后面插一段：/**自定义头像源*/ define('__TYPECHO_GRAVATAR_PREFIX__', 'https://cdn.v2ex.com/gravatar/');这个配置文件一般情况不会去动它，所以是最一劳永逸的方法，也推荐使用这个方法。自己反代一个直接开一个二级域名用来反代当然可以，但用二级目录（如himiku.com/avatar/）来反代也不错。参考「Gravatar镜像资源及Nginx反代教程」的方法自己尝试了下。在配置开头加个缓存，毕竟有缓存又快又能省钱。比如把缓存放在/home/wwwcache/gravatar。proxy_cache_path /home/wwwcache/gravatar levels=1:2 keys_zone=gravatar:5m inactive=30m max_size=50m;然后在server段里头加个反代。比如我想用https://www.himiku.com/avatar/，来直接反代https://secure.gravatar.com/avatar/。 location /avatar/ { proxy_pass https://secure.gravatar.com/avatar/; proxy_redirect off; proxy_set_header Host secure.gravatar.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header Accept-Encoding ""; proxy_cache gravatar; proxy_cache_key $scheme$host$request_uri; proxy_cache_valid 200 304 3h; proxy_cache_valid 301 24h; proxy_cache_valid 500 502 503 504 0s; proxy_cache_valid any 3h; }不喜欢用avatar，改用touxiang也行，把第一行location /avatar/改成location /touxiang/就好了。完整些的大致如下。proxy_cache_path /home/wwwcache/gravatar levels=1:2 keys_zone=gravatar:5m inactive=30m max_size=50m; server { listen 80; server_name himiku.com ; return 301 https://himiku.com$request_uri; } server { listen 443 ssl http2; server_nam…

Mikusa Yearly Issue 3
type: item
date: 2021-02-01T10:26:00+08:00
description: 好久不见，甚是想念。虽然上一篇「Issue 2」还没满一年，但我不得不打破规定再开(shui)一文来处理一个有点老生常谈的问题：我的CDN流量费又爆炸了。没错，第一篇「Issue 1」就是为了解决这件事而诞生的。为此我换用腾讯云，图片尽量使用WebP格式，还因为「Safari」不支持WebP而拜托Z酱写了个魔改版「VOID Δ」。但是在腾讯云流量抵扣券用光，「Safari 14.0」支持WebP后，这些改动都被我全盘推翻了。我又用回了又拍云以白嫖免费的代金券，换回正式版 VOID 享受来自官方的主题维护。 可是，随着最近流量费的暴涨，我必须重新审视这个问题，确定一个省钱的方案，尽可能摆脱CDN这个烧钱的大头。启用图床既然不准备使用又拍云了，那么「在Windows上，使用Typora，配合PicGo，通过又拍云上传图片」的方法就不可行了。因此我准备先使用「图床」来完成「上传图片到服务器」这一过程。选择的图床程序是简洁好看的「lsky-pro」。安装过程就略过了，可以参考官方手册。通过 PicGo 快捷上传图片在Windows上，我一般使用 Typora 来水文章。Typora中有一个设置项可以使用「PicGo」上传图片。安装就略过了。如果是直接使用又拍云或是腾讯云的服务的话，PicGo中有现成的的图床项。配置完成后，只要让 PicGo 在后台运行，就可以直接在写作的时候上传图片，无需额外操作。方便得很。 本来还担心换用Lsky-Pro图床之后，这一快捷功能没法使用。没想到竟然有人写了插件。这样只要在「插件设置」中搜索「picgo-plugin-lskypro」并安装就可以了。而且使用这一插件仅需启用图床api，获取账号token，依次填入配置中就好。前者比较好办，后者对于不懂技术的人来说就十分困难了。但是插件作者贴心地在博客中提到了有关「Token获取」的说明。所以只要对Lsky-Pro进行一些修改，就可以直接在图床上获得token。这么修改可能在安全上有些隐患，但是图床就我一个人用，不管了。 对图床启用CDN图床能用了，还需要解决一些历史遗留问题。原本在又拍云云存储里的图片，就直接下载下来放在图床公开目录中，可以直接用；而没花完的代金券，我只要再对图床启用CDN就好了。这样等代金券消耗殆尽，我直接关闭CDN，也不用去迁移这些图片，甚至可以随便换到任意一家CDN。 这应该是目前来说比较合适的解决方法了吧。虽然一开始使用云存储存放图片的初衷就是为了解决图片的备份问题，那时服务器的带宽太小，下载到本地很花时间。而现在带宽管够，换服务器的话一点儿也不费劲。况且不怎么想轻易更换服务器了。因此只要博客活着，图片就能活着；博客挂了，图片也必须挂。损失当然是有的，不能白嫖了，少了防盗链，没了VOID针对又拍云CDN的图片模糊加载。嘛，不管了。

博客第一笔广告收入
type: item
date: 2021-01-23T21:49:00+08:00
description: 前一段时间看到 applemiku 大佬在接收 Google AdSense 广告收益的过程中吃了苦头（见「年轻人第一次拿谷歌AdSense收益」），过程之繁琐让我也有些担忧。虽然我当时才 50 刀左右。哪能想到只是过了 2 个月，我也达到了最低汇款要求 ，并且很轻松地就接收到了汇款 。所以，为纪念博客的第一笔广告收益：109.61美元，特此水文一篇。 为了避免出现「需要去开户行才能收到汇款」的情况，我和隔壁 野兔 探讨过这个问题，他和我一样在这个月就能接收汇款。我们都决定用「招行银行卡」来接收这笔汇款，但我的招行卡是在洛阳开户的。因此我打电话到「95555」咨询过电话客服，客服的回复是「有可能需要去柜台面签，但还需咨询开户行」，而开户行却说「会直接就汇到卡里，如果真需要去柜台，异地招行也可办理」。电话客服倒是热心地为我提供了下接收汇款需要填写的信息：收款行地址：China Merchants Bank Tower NO.7088, Shennan Boulevard, Shenzhen, China.SWIFT Code：CMBCCNBS谷歌会在 21 号至 26 号之间发放付款1。我 21 号在 AdSense 上看到已到打款的提示，22 号就收到银行款项到账的短信通知了。现在美元一直在贬值，但是我缺钱花，就直接用招行结成现汇花掉了。 随后就因为无效流量以及ghs被限制广告投放 ，现在博客上一个广告都看不到，只有预留广告的空白框。 详见：AdSense 付款时间 ↩

Mikusa Yearly Issue 2
type: item
date: 2021-01-05T11:56:00+08:00
description: 时间过得真快，上一次的「Issue」都已经是去年的事了。那么2021年的第一篇文章就由 「Mikusa Yearly Issue 2」开始吧！没错，说年更，那就是年更。毕竟我没啥技术力。为 VOID 增加表情一直想往VOID里增加点表情包。尝试过照猫画虎，但总失败。不过前两天看到「为VOID主题增加自定义表情包」提到了具体的修改方法：需要使用「UrlEncode」转码并删去其中的%才能显示带中文的表情。因此再次将增加表情的想法提上日程。加个表情并不是啥难事，只是不会编程的话纯手写费手。也许我应该直接找A酱。我想添加的是B站的2233娘，虽然有版权风险，但不是啥盈利性目的应该没啥事。修改OwO.json文件在VOID/assets/libs/owo/OwO_02.json中插入： "2233娘": { "type": "image", "container": [{ "icon": " ", "data": "", "text": "2233娘_第一" }, { "icon": " ", "data": "", "text": "2233娘_无语" }, { "icon": " ", "data": "", "text": "2233娘_吐魂" }, { "icon": " ", "data": "", "text": "2233娘_委屈" }, { "icon": " ", "data": "", "text": "2233娘_哭泣" }, { "icon": " ", "data": "", "text": "2233娘_郁闷" }, { "icon": " ", "data": "", "text": "2233娘_困惑" }, { "icon": " ", "data": "", "text": "2233娘_生气" }, { "icon": " ", "data": "", "text": "2233娘_吃惊" }, { "icon": " ", "data": "", "text": "2233娘_汗" }, { "icon": " ", "data": "", "text": "2233娘_大笑" }, { "icon": " ", "data": "", "text": "2233娘_喝水" }, { "icon": " ", "data": "", "text": "2233娘_耶" }, { "icon": " ", "data": "", "text": "2233娘_卖萌" }, { "icon": " ", "data": "", "text": "2233娘_疑问" } ] },修改Contents.php文件在VOID/libs/Contents.php中，第196行插入： $content = preg_replace_callback('/\:\$\(\s*(.*?)\s*\)/is', array('Contents', 'parse2233BiaoqingCallback'), $content);第232行处插入： /** * 2233娘表情回调函数 * * @return string */ private static function parse2233BiaoqingCallback($match) { return ' '; }最终效果就是这样，要记得刷新浏览器缓存才能看到：哦对了，差点忘了说，要现在/VOID/assets/libs/owo/biaoqing/里创建对应的文件夹放表情包。 VOID 开发版已经添加了这个表情。详见 GitHub，或者直接点击：https://github.com/AlanDecode/Typecho-Theme-VOID/archive/nightly.zip 下载开发版本。后来我又想加入崩坏3的表情，步骤一致：修改OwO.json文件 "崩坏3": { "type": "image", "container": [{ "icon": " ", "data": "", "text": "崩坏3_脱非" }, { "icon": " ", "data": "", "text": "崩坏3_入欧" }, { "icon": " ", "data": "", "text": "崩坏3_二胡" }, { "icon": " ", "data": "", "text": "崩坏3_唢呐" }, { "icon": " ", "data": "", "text": "崩坏3_琵琶" }, { "icon": " ", "data": "", "text": "崩坏3_笛子" }, { "icon": " ", "data": "", "text": "崩坏3…

来用 Umami 自建统计工具吧！
type: item
date: 2020-12-30T20:59:00+08:00
description: 如果需要统计博客访问的相关数据，一般会选择「百度统计」或是「谷歌分析」。前者面向中文用户，在数据展示上会更加直观；后者面向全球，功能丰富数据详细，只是需要一定的学习成本和使用门槛。当然，你也可以尝试自己搭建一个统计工具，将数据完全掌握在自己的手里。比如使用 Umami。本文于近期（2025年6月）简单更新了下，前置了容器安装的方法，更新了 Umami 的 Github 链接。其余部分未改动。整体内容仅供参考。安装容器安装现在已经是 5202 年了，自行编译构建程序那叫一个麻烦！最简单的方法还是用 Docker 来部署 Umami。参考「Docker -- 从入门到实践」中的教程安装完 Docker-CE 和 docker-compose 后，创建 docker-compose.yml 文件。填入以下内容：services: umami: image: ghcr.io/umami-software/umami:postgresql-latest container_name: umami ports: - "3000:3000" environment: DATABASE_URL: postgresql://umami:umami@umami-db:5432/umami DATABASE_TYPE: postgresql APP_SECRET: replace-me-with-a-random-string #生成一个随机数替换这里 depends_on: umami-db: condition: service_healthy restart: always healthcheck: test: ["CMD-SHELL", "curl http://umami:3000/api/heartbeat"] interval: 5s timeout: 5s retries: 5 networks: - umami umami-db: image: postgres:15-alpine container_name: umami-db user: 1000:1000 environment: POSTGRES_DB: umami POSTGRES_USER: umami POSTGRES_PASSWORD: umami volumes: - ./database:/var/lib/postgresql/data restart: always healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5 networks: - umami networks: umami: external: true因为随着统计数据的日积月累，数据库占用会越来越大，所以这里我使用的是 umami:postgresql 版本。即不使用 MySQL，而是改为使用 PostgreSQL 并将数据文件存储在指定文件夹中。另外，我创建了一个 umami 网络，你可以删除 networks 字段，或者使用 docker network create umami 也创建一个 umami 网络，用以隔离容器。之后控制台执行 docker compose up -d 启动即可。编译安装或者，你想体验一下编译安装的乐趣，可以自行编译。但是下面这些步骤写于 2020 年，不保证现在也适用。首先，安装 Umami 需要一个基本的 LNMP 环境，然后再安装 nodejs 和 npm。先安装 Nodejs、npm：curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - apt-get install -y nodejs apt-get install -y npm安装完毕之后，可以用 node -v 和 npm -v 检查版本。然后下载 Umami：git clone https://github.com/mikecao/umami.git cd umami npm install接着创建一个空数据库，比如 umami，然后在 umami 目录中输入：mysql -u username -p databasename < sql/schema.mysql.sqlusername 一般是 root，databasename 就是你创建的空数据库的名字，具体例子是：mysql -u root -p umami < sql/schema.mysql.sql你也可以在 phpmyadmin 中手动导入到空数据库中。随后创建配置文件。…