现代化的跨平台AI RSS阅读器MrRSS
MrRSS 是一个现代化的自托管 RSS 服务,集成 AI 功能,可自动翻译、生成摘要并发现新订阅源。
MrRSS 是一个现代化的自托管 RSS 服务,集成 AI 功能,可自动翻译、生成摘要并发现新订阅源。
前段时间,关于注册美区 Apple ID 的话题又火了起来。作为一名使用了多年美区账号的老用户,我本着求真务实的态度,决定亲自验证一下当下注册美区 ID 的可行性。虽然借助安卓 Apple Music 顺利注册成功,但正当我文章写到一半时,一件意想不到的事情发生了 — 我刚刚注册成功的账号不到 48 小时就“喜提”封号。于是我决定放弃原本侧重“教学”的内容,改为分享这次翻车经历,希望能给想要注册美区 Apple ID 的朋友们提供一点参考。
本人已经拥有一个使用长达 10 年以上的美区账号,并将其作为主账号使用超过 5 年。此次注册纯属周末闲来无事,想验证一下“官网直接注册”和“安卓 Apple Music 间接注册”两种方式目前是否可行,并顺便水一篇文章。虽说最终翻车,但对我个人并无实质影响。
对于大多数人来说,拥有国区 Apple ID 就足够日常使用了,但如果你有以下需求,就需要准备一个美区账户:
jack@veryjack.com 就是基于此);
⚠️ 以下是我的注册经历,虽然最终翻车被封号了,但这只是个例,并不能代表该方法完全失效,还是有网友反馈成功注册(最后有没有封号就不得而知了)。
首先,我尝试了官网直接注册
接着,我尝试了间接注册法,这需要一台安卓设备和苹果设备。
为了后续能充值礼品卡及购买应用,我又登录网页端进行了设置:
至此,除了充值礼品卡之外的所有操作都已完成,当时还觉得过程还挺顺利的。
当我将手机闲置 24 小时再次拿起时,发现 iPhone 8 提示需要验证密码,就知道“大事不妙”。果然,输入密码后提示无法登录。我随即尝试登录网页端验证,提示需等待 24 小时审核。第二天便收到了邮件通知:“我们已审核并拒绝访问该账户” 😢 。

虽说是总结,但我其实并不清楚具体是哪个环节触发了风控。反思下来,原因可能有以下几点:
如果你有幸成功注册,且账号顺利存活下来,如果打算购买应用或服务,一些支付方面的小建议:
希望这次“翻车”经历能给大家提供一些参考,助大家在账号申请的过程中少走弯路,避开那些不必要的坑。
作为一名数字游民,在这些年的“折腾”中我深有体会:国内用户使用国外服务的门槛正变得越来越高。不仅是注册美区 Apple ID,就连 PayPal、Claude 甚至 Google 邮箱的申请难度也在不断攀升。从早期的随意注册,演变为如今对原生 IP、海外手机号、地理定位、实体 SIM 卡甚至境外支付方式的严格要求。
因此,我现在养成了一个坏习惯,每当有机会注册某个国外服务时(比如前阵子很火的 Wise),无论当下是否用需要,我都会先占个坑,以防日后门槛进一步提高导致无法注册。
技术的初衷本应是消除边界,共同进步,但现实却是各国各公司都在修筑围墙。在宏大的国际博弈之下,个人的努力显得微不足道,那些“提前占坑”的行为,更像是一种面对未知的无力抵抗。我担心,未来的某一天,普通人会彻底失去与国际服务、与广阔世界对话的可能。如果那一天注定会到来,那么现在所有的“未雨绸缪”,或许就是我们普通人为了不与世界彻底失联,做的最后一点挣扎。
在正式发布本文之前,我先将事件经过分享到了 V2EX。非常感谢 V2EX 网友们分享的宝贵经验,感兴趣的朋友也可以移步原帖,查看更多讨论与评论:《新注册的美区 Apple ID,不到 48 小时就“翻车”了》
该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/posts/tech/how-to-use-ai-for-assisted-creation
如标题所见,在最近的编写的一些文章中,我使用了 AI 的辅助。其实早在过去一年编写的手记中,也常规的使用这个方式,只不过更多的用于标题的生成,我对文章的取名一直非常头疼,后来就写完整篇之后让 AI 综合全文的内容帮我提取几个关键字来取几个文艺点的标题。
在最近编写的文章中,如那篇「回头看见自己」中基本都是 AI 辅助编写的。我在「此站点」中增加了一个 Q&A:
在 25.11 月发布的文章都会公开:在编写文章时是否使用了 AI 的辅助。
可能很多人会反对使用 AI 进行创作,编写博客等等。那么当你看到文章顶部的 AI 声明之后你有权利选择直接关闭。
我个人并不反对使用 AI 辅助写作,当编写技术文章时,我可以借助 AI 帮我快速根据相关实现绘制流程图,以便读者更加清晰的理解,而在前 AI 时代,则往往需要花费大量的时间,或者因为这个理由而放弃绘图。当编写生活记录时,我往往借助 AI 帮我取一个标题,我承认我不是一个大作家,写不出更好的文笔或者叙事结构,我想记录故事,而 AI 帮我整理故事。
编写这篇文章首先是澄清关于 AI 的使用,另外也同时分享如何使用 AI 写出更好的文章。
首先是一个问题,你认为使用 AI 辅助创作会节省大量时间吗?至少对我来说,需要分为两个维度。
在编写技术类文章时,确实会大幅节省,而且比手作的内容会更加完整。正如前面所说,在手作的时候,在画流程图会花费大量时间,往往会因为时间成本而放弃;在内容结构上也会精简掉很多。而借助 AI ,它可以阅读项目的代码,再加上你告诉他当时的实现思路,它可以很迅速的分析然后编写出叙事清晰的文字、流程,甚至使用 excalidraw 绘制图表。
在编写手记生活类文章,并不会节省时间,甚至会花费很多的时间,至少对我来说是这样。AI 并不知道你的生活发生了什么,生活不是代码,无从读起。我会把所有的经历说给 AI 听,这个过程中,相当于我已经完成了一遍文章的编写。在没有借助 AI 之前,差不多到这个时间就截稿了。取上标题和分段,就直接发布了。而现在,需要让 AI 结构,整理,调整上下文过度。然后我还要校对几次确保没有把我需要表达的内容曲解。有些措辞我感觉不好,就会多次询问 AI 修改等等。花的时间不止一点。
在编写 Better Auth 的多租户用户鉴权的构想 文章时,初次使用借助 AI 辅助作图的能力。比如解释为什么的时候,可以画一个图:


再加上文章中有很多 Demo 代码,实际上都是实际业务中的代码抽离出来删掉很多多余的逻辑的,这个过程如果手动去改的话还挺容易删出问题,而且还需要增加注释和删除代码后的格式化问题,之前很多 demo 代码我都懒得管。而 AI 通过读项目,可以非常快速的写完 demo 代码,并且加上注释:

在今年的年终总结 2025 · 仍在路上,半径之外 中,使用了 LobeHub 进行故事整理。
在开始之前我使用内置的 Agent Builder 构建了一个专门的写作助手:


随后在文档中进行内容创作:

我会分段的和 Agent 讲故事,他会把故事写到文章里。你会发现这个过程中,我自己也会完全写作一遍,我的陈述和最后的插入的内容基本也是一致的。
在最后的过程中,可以进行小标题的重构:

然后进行一次 review,把很多段落重新调整,阅读一遍,发现有些措辞不太好,但是也不知道怎么改会比较好,我会询问 GPT。

找到一种我想要表达的方式,而不是过分的曲解。
再比如取名:

在这个案例看来,这篇年终总结所花费的时间比往年的更长,故事叙述大概花了 4 个多小时,然后是结构整理,改一些过度承接,取名等等。
感谢你能看到这里,此篇文章为手作。
这款插件是我找deepseek写的,主要功能是把typecho发布的内容自动同步到Memos上。应该是绝大部分博主都用不上,各取所需吧!也是想说,AI成熟了,我们每位都是程序员,都可以让AI写出自己想要的功能的代码!
一直以来,除老张博客外,还有一个后花园,老张随笔。老张随笔就是每天记一些点滴,发一点牢骚!字数都是在一两百字,到目前为止,也记录了近一千五百篇日志了。老张随笔最初选用的是较轻量的Typecho程序,后来Memos在博客圈流行的时候,老张随笔便换成了Memos程序,这样能更好的和五木大佬开发的哔哔广场融合。Typecho数据导入到Memos数据库中也非常的简单,这篇《简单几步,Typecho博客文章轻松导入到Memos》教程,便可以教大家很方便的把Typecho的文章导入到Memos中。Memos也使用了两三年吧,但是由于作者的任性更新,版本一直还停留在0.18.1上。加之大家对Memos热度的减少,现在玩Memos的人很少了,原来五木大佬的哔哔广场,每天都好几十条哔文,现在基本上很少有人发了。种种原因,老张随笔又换回了Typecho程序,但是老张又舍不得Memos,所以在Typecho上发布一篇文章后,便手动复制到Memos上,也算是做为备份吧!每天手动甚是麻烦,便有了这款Typecho插件-MemosSync,Memos同步插件。
✅ 文章发布时自动同步到Memos
✅ 支持将文章分类作为Memos标签
✅ 可配置可见性(公开/受保护/私有)
✅ 完整的错误处理,不影响文章发布
✅ 后台配置界面
1.安装插件
将下面的文件上传到 /usr/plugins/MemosSync/ 目录
在Typecho后台启用插件
2.配置插件:
进入插件设置页面
填写Memos地址(例如:https://memos.example.com)
输入Access Token(在Memos设置中生成)
选择可见性设置
启用同步功能
3.获取Access Token:
登录您的Memos实例
进入设置 → 权限 → Access Tokens
生成新的Token并复制到插件设置中
确保您的Typecho服务器可以访问Memos实例
如果同步失败,会在Typecho日志中记录错误信息
标签会自动过滤特殊字符,只保留字母、数字、中文和下划线
/usr/plugins/MemosSync/
├── Plugin.php ├── config.xml └── form.php
1. config.xml
<?xml version="1.0" encoding="UTF-8"?>
<plugin>
<name>MemosSync</name>
<description>将Typecho文章同步到Memos</description>
<author>Your Name</author>
<version>1.0.0</version>
<module>MemosSync</module>
</plugin>
2. form.php
<?php if(!defined('__TYPECHO_ROOT_DIR__')) exit; ?>
<h2>Memos 同步设置</h2>
<div class="typecho-page-title">
<h2>Memos 配置</h2>
</div>
<div class="typecho-option">
<label class="typecho-label" for="memos_url">Memos 地址</label>
<input type="text" class="text" name="memos_url" id="memos_url" value="<?php $this->options->memos_url(); ?>" />
<p class="description">请输入完整的Memos地址,例如:https://memos.example.com</p>
</div>
<div class="typecho-option">
<label class="typecho-label" for="memos_token">Access Token</label>
<input type="text" class="text" name="memos_token" id="memos_token" value="<?php $this->options->memos_token(); ?>" />
<p class="description">在Memos设置中生成的Access Token</p>
</div>
<div class="typecho-option">
<label class="typecho-label" for="memos_visibility">可见性</label>
<select name="memos_visibility" id="memos_visibility">
<option value="PUBLIC" <?php if($this->options->memos_visibility == 'PUBLIC') echo 'selected'; ?>>公开</option>
<option value="PROTECTED" <?php if($this->options->memos_visibility == 'PROTECTED') echo 'selected'; ?>>受保护</option>
<option value="PRIVATE" <?php if($this->options->memos_visibility == 'PRIVATE') echo 'selected'; ?>>私有</option>
</select>
<p class="description">选择同步到Memos的可见性设置</p>
</div>
<div class="typecho-option">
<label class="typecho-label">
<input type="checkbox" name="memos_enable_sync" value="1" <?php if($this->options->memos_enable_sync == '1') echo 'checked'; ?> />
启用同步功能
</label>
<p class="description">启用后,发布文章时会自动同步到Memos</p>
</div>
<div class="typecho-option">
<label class="typecho-label">
<input type="checkbox" name="memos_include_tags" value="1" <?php if($this->options->memos_include_tags == '1') echo 'checked'; ?> />
包含分类作为标签
</label>
<p class="description">将文章分类作为Memos的标签</p>
</div>
3. Plugin.php
<?php
/**
* MemosSync - Typecho文章同步到Memos插件
*
* @package MemosSync
* @author Your Name
* @version 1.0.0
* @link https://yourblog.com
*/
class MemosSync_Plugin implements Typecho_Plugin_Interface
{
/**
* 激活插件
*/
public static function activate()
{
Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishPublish = array('MemosSync_Plugin', 'syncToMemos');
Typecho_Plugin::factory('Widget_Contents_Post_Edit')->finishSave = array('MemosSync_Plugin', 'syncToMemos');
return _t('插件已激活,请配置Memos设置');
}
/**
* 禁用插件
*/
public static function deactivate()
{
return _t('插件已禁用');
}
/**
* 插件配置面板
*/
public static function config(Typecho_Widget_Helper_Form $form)
{
require_once 'form.php';
}
/**
* 个人用户的配置面板
*/
public static function personalConfig(Typecho_Widget_Helper_Form $form) {}
/**
* 同步到Memos
*/
public static function syncToMemos($contents, $post)
{
// 获取插件配置
$options = Typecho_Widget::widget('Widget_Options');
$memosUrl = $options->plugin('MemosSync')->memos_url;
$memosToken = $options->plugin('MemosSync')->memos_token;
$memosVisibility = $options->plugin('MemosSync')->memos_visibility;
$enableSync = $options->plugin('MemosSync')->memos_enable_sync;
$includeTags = $options->plugin('MemosSync')->memos_include_tags;
// 检查是否启用同步
if (!$enableSync) {
return;
}
// 验证必要配置
if (empty($memosUrl) || empty($memosToken)) {
return;
}
try {
// 准备请求数据
$apiUrl = rtrim($memosUrl, '/') . '/api/v1/memos';
$content = $contents['text'];
// 如果启用了标签功能,获取分类作为标签
$tags = array();
if ($includeTags && isset($contents['category'])) {
$category = $contents['category'];
if (is_array($category)) {
$tags = $category;
} else {
$tags = array($category);
}
}
// 构建内容,包含标签
$memoContent = $content;
if (!empty($tags)) {
$tagString = '';
foreach ($tags as $tag) {
$tagString .= ' #' . self::formatTag($tag);
}
$memoContent .= "\n\n" . $tagString;
}
// 准备请求数据
$postData = array(
'content' => $memoContent,
'visibility' => $memosVisibility
);
// 发送请求到Memos
$http = Typecho_Http_Client::get();
if ($http) {
$http->setHeader('Authorization', 'Bearer ' . $memosToken)
->setHeader('Content-Type', 'application/json')
->setData(json_encode($postData))
->setTimeout(30)
->send($apiUrl);
$response = $http->getResponseBody();
$status = $http->getResponseStatus();
if ($status != 200) {
throw new Exception('Memos API 返回错误: ' . $status . ' - ' . $response);
}
}
} catch (Exception $e) {
// 记录错误日志,但不影响文章发布
Typecho_Log::write('MemosSync Error: ' . $e->getMessage(), Typecho_Log::WARN);
}
}
/**
* 格式化标签
*/
private static function formatTag($tag)
{
// 移除特殊字符,只保留字母、数字、中文、下划线
$tag = preg_replace('/[^\p{L}\p{N}_]/u', '', $tag);
return $tag;
}
}
RSSPub 可以将你最喜欢的 RSS/Atom 订阅源转为 EPUB 文件。
现在AI已经融入到各行各业中,编码的时候都借助AI来辅助编程。那么,在写博客文章的时候,遇到语句不够流畅或表达不够专业的时候,能不能快速的借助AI帮我们对语句做一些润色呢?
为此,我开发了一个Typecho插件,该插件运用AI技术,能够对用户选定的文本进行智能化的润色与优化。不过使用前需要调用一些AI服务,所以先准备好了再说😃
插件目前开启售卖,价格定为 10 元,收入款全部捐给韩红基金会,并在关于页面公布捐款情况,购买请移步到文末,购买后请把订单截图通过邮件发送到我邮件 hi@wangdaodao.com,我会在当天处理邮件,把插件及捐款情况回复在邮件中。购买前如果有疑问,也可以发邮件与我沟通,避免引起误会。
为什么开始留意“回复邮箱界面”?其实没什么宏大理由,就是2024年7月11日,我在整理收件箱的时候,突然意识到,我收到的每一封认真写的回复,都带着一种温度。
如我们评论一样,结尾附了一个小表情,莫名就轻松了起来,这些细节它其实是个人表达的一部分。尤其在互访互评、合作沟通越来越频繁的现在,一封看起来舒服的回复,真的会让对方更愿意继续对话,甚至记得你。
所以,我开始留意那些“会说话”的界面设计、模板、小功能。不是为了炫技,而是让每次已读,都不冷冰冰。
下面是我目前互访互评中的一些 “会说话的界面”,没有排名,不分先后,有些是官方功能,有些是自己改的,有些可能小众,但对我刚刚好,或许能从中找到属于你的那一款。
张洪Heo https://blog.zhheo.com 
李的日志 https://lilog.cn 
ACEVS https://acevs.com 
木木木木木 https://immmmm.com 
湘铭`Blog https://xiangming.site 
粽叶加米 https://wordpace.com 
荒野菲克 https://ficor.net 
漫漫长路 https://mmcl.net 
云心怀鹤 (我的主题是纸质信封) 
最后,如果你也有一个非它不可的回复界面、模板、签名、小习惯,哪怕只是一个自动追加的喝口水再聊。
欢迎留言告诉我,我会访问你的网站并留言,选一些收录进这篇文章,标注你的名字或昵称(可匿名)。不为评比,只为互相种草,一起把回邮件这件小事,做得更贴心一点。
东西坏了,靠我修,其实我也很不喜欢修东西,只是我还不想扔了它,所以我坚持坏了就修,这就显得我很主动,东西就觉得我离不开它了,它就可以一直坏一直坏,然后我一直修一直修。有没有一种可能?有一天,我不想修了呢?或者它不配了呢?我不要它了,那它是个什么玩意儿?
— 源于2025-10-09更新的一段内容。
那天我挺憋屈的,缘由说来也很搞笑,鸡毛蒜皮的一丁点小事,就这样燃起来的家庭纷争,我自身也是很诧异,为什么就这么点小事我压不住自己的怒火了,可能因为情绪总有一个临界点,我一直是忍让型的追求家和万事兴的态度,但是当下,有一个认知突然占据了我的思想,凭什么赚钱养家的是我,忍气吞声的还是我,所以我就炸了。
我本不想吵架,因为吵赢了只是把矛盾推向更高的地方,无法调和。所以大晚上的我就到操场上快走慢跑了8公里发泄自己的情绪,跑着跑着,越跑越不对劲,情绪更沮丧了,累瘫了坐在十字路口的小石墩上看着红绿灯变换读秒,挺落寞的,也挺心疼自己。
末了,我跟自己说:算了,都是自己惯的,能过就过,不能过就算了,这次我绝不先认怂。
闹矛盾之前,有听她念叨说 iPhone 17 Pro Max 京东本地都没货,所以我记在心里了,贝勒爷的同学家长有位是卖apple周边设备的,所以就跟他讲有货跟我说一声,找他拿一台。
闹矛盾之后,卖手机的说是手机有货了,溢价450元,问我要什么颜色,这都吵架冷战了,我也不好认怂去问她喜欢什么颜色啊,本来想问的,但是,呃,先开口不就输了吗?好,我不问。
不知道她喜欢什么颜色,就拿橙色和银色两台512GB回家,丢在桌子上。这次我对自己大方起来了,以往都是给她追新款,然后我自己随意将就,两台手机13和14用了好多年了,我也没舍得给自己换。心想让她先挑,剩下的我自己用,我也要开始自己享受消费了,这种心理有点变态,呃,为啥我赚钱给她优质生活,然后我自己对自己这么抠,然后她还可以这么高高在上的理所应当的不照顾我的感受。
手机在餐边柜桌子上放了两天,她也没动,我也没动,其实她动了,就是没拆封,因为装在袋子里的叠放顺序变了,肯定是我不在家的时候,自己拿起来纠结了半天,到底拆不拆呢,拆了不就认输了吗?
第三天早上,我还在睡觉,她到房间来,叫醒我,要我给她贴贴膜,拿着橙色和银色比划了半天,纠结要选什么颜色,我说你随便,你选好一台,另一台给我留着,然后我继续睡觉,十一点多起床后,她说要不她拿橙色吧,好的,那我就用修炼了十几年的贴膜技术完美的给她贴好了,但是这时候我还是端着呢,我话不多说,贴完橙色贴银色,贴好后,她拿走银色对比了一下,说银色比较商务,还是你拿吧。
一切好像从未发生过,呃,吵架,呃,根本没有发生过。晚上回房的时候,主动贴贴了,假装无意的翻个身靠着我,在试探我是不是不生气了,其实我早不生气了,真没骨气,唉。我内心其实很清楚,她的性格都是这些年我给她娇惯出来的,我当面指责她恃宠而骄,她并不否认。
但是日子总要过下去的吧,其实她还不错,就是这个家传的性格,有些太蛮横不讲理,事事都要顺遂她的心意,逆反她就是跟她势不两立。但是也相对收敛了很多,可能她也采集到我不忍了的想法,所以不敢再危险边缘来回试探蹦跶了。
果然,修东西,我还是一如既往的专业。
叨叨完,开始下一个主题,关于网站新增暗夜模式。
之前有博友评论说网站没有暗夜模式,可能体验感不佳吧,我现在对于修改网站主题有相当大的心理阴影,因为我的主题都是仿的,看到这个好看我就扒了,然后套进去自己的主题里,导致主题代码垒得跟屎山一样,一个主题里有七八个CSS样式文件,和一大堆可能无用可能有用的js文件,我主张,能用就行。但是这就给修改增加了很大的难度,有时候改一点点小东西,完犊子,前端垮了,垮在哪里,我也不知道,我再找找,就很难。
前几天逛 Jeffer.Z 的新作站点 FindBlog 觉得他的暗夜模式配色挺好看的,嗯,蠢蠢欲动的参照他站点的配色开始折腾了,他说站点黑夜模式是一个第三方的js库,直接调用就行。/npm/darkreader@4.9.80/darkreader.js
听不懂,一点都听不懂,想到用插件来实现,因为我主题魔改的东西太多,所以导致插件装上去后,各种惨不忍睹的前端画面出现了,算了,我用我最简单暴力的方式来折腾吧。
我的想法是这样,我创建两个不同的配色方案样式文件,一个style-dark.css,一个style-light.css,然后通过js判断来识别加载哪一个文件,按道理说这个应该就可以满足我的需求,我打开了Gemini对接的聊天框,https://chat.erduo.tech,搭建来自己用的,因为对比之下,元宝的Deepseek和混元产出的代码内容,总是有各种问题出现,当然,可能是我站着尿尿的姿势不对,也可能是对准的方向不对,总之,我还是用的Gemini 2.5 Flash模型解决。
最早生成的插件php代码如下:
Js源码如下:
如上方式实现了暗夜模式的识别和切换,根据用户端的时间,采用“用户偏好优先,无偏好时根据本地时间自动判断,并支持手动切换和保存偏好”的模式。设定6点-18点为白天模式,18-次日6点为暗夜模式。
这个版本有一个问题出现了。
初始页面加载时的优化 (防止闪烁 FOUC):
1.dns_early_disable_unnecessary_styles 这个PHP函数非常关键。它在页面标签中以最高优先级(wp_head, 1)执行一个小的JavaScript片段。
2.这个JS片段会立即检查 localStorage 或根据时间判断初始模式,然后直接禁用不需要的CSS文件(style-light.css 或 style-dark.css)。
3.这样做的好处是,在浏览器开始渲染页面之前,已经确定并加载了正确的样式,有效避免了页面先显示一种模式然后迅速切换到另一种模式的“闪烁”现象 (Flash Of Unstyled Content)。
页面前端依然很不给面子的闪烁,白天和暗夜模式底色反差太大,一闪一闪让人很不舒服,本想着退而求其次,将就就好,管它白天闪晚上,还是晚上闪白天。然后,这两三天来,白天都在看房,跟着中介看这套看那套的,折腾得累半死,回家洗完澡一躺就睡了,这个问题也就这样搁置了几天。晚上得闲,一打开页面,页面切换的时候,闪得我自己都很不舒服,算了算了,我还是再修一修吧。
出现这个闪烁的原因,很可能是因为浏览器在解析HTML并应用内联JS脚本禁用CSS之前,已经短暂地加载并应用了所有样式表。如果 style-dark.css 中的样式优先级更高,或者它定义的默认颜色在没有其他限制的情况下会覆盖 style-light.css,就会导致先显示深色。
解决这个问题的更健壮方法是利用 link 标签的 media 属性,它在CSS加载层面就阻止了不必要的样式表被应用,而不是在JS加载后才去禁用。
产生了第二版插件代码:
php代码如下:
js代码如下:
如上代码,其实应该是正常解决方案的,就是创建的 style-light.css 和 style-dark.css 文件如果只有配色方案,网页加载的时候,先加载 style.css 框架样式文件,这样页面就正常显示,只是配色根据选择加载,但是我又失败了,因为我开始弄的时候,把默认的style.css 框架样式直接套到 style-light.css 和 style-dark.css 这两个文件里了,要修改,又要重新开始分离出配色单独创建样式表,不行,不行,这工作量太大了,我不要。
我给Gemini发送了我的想法解决这个问题: 先加载页面的判断设置,直接屏蔽不加载另一种模式。Gemini很给力的给出了解决方案。
只加载所需的模式样式,而不是先加载一个再切换,避免任何形式的“闪烁”或“布局混乱”。
我之前的方案试图通过 `media` 属性和内联 JS 来解决,但在某些浏览器或加载条件下,即使是极快的切换,也可能出现视觉上的延迟。实现“直接屏蔽不加载另一种模式”的最彻底方法是:在 PHP 生成 HTML 的 `<head>` 部分时,就根据用户的偏好或时间判断,只输出当前所需模式的 `<link>` 标签,而完全不输出另一个模式的 `<link>` 标签。
但这有个挑战:PHP 在服务器端运行,它无法直接读取用户浏览器中的 `localStorage`。它只能读取 `$_COOKIE`。所以,为了让 PHP 在第一次加载页面时就知道用户偏好,JavaScript 必须在每次模式切换时,除了更新 `localStorage`,还要同时更新一个 Cookie。
最终版本php代码如下:
js代码如下:
核心原理和解决闪烁的方法:
1. PHP 服务器端预判: PHP 在页面生成之初(在 `wp_head` 动作中,优先级为1),就通过 `dns_get_initial_mode_server_side()` 函数,根据 `theme-mode` Cookie 或服务器时间,判断出应该显示的模式。
2. 只输出所需 `<link>` 标签: `dns_output_conditional_styles()` 函数根据 PHP 的判断结果,直接在 HTML 的 `<head>` 中输出 两个 `<link>` 标签。
• 正确的模式 的 `<link>` 标签 `media` 属性是 `all`。
• 不正确的模式 的 `<link>` 标签 `media` 属性是 `not all`。
这样,在浏览器开始解析和渲染 HTML 时,它只会加载并应用正确的模式样式,从而从源头上避免了加载错误样式导致的闪烁。
3. `document.documentElement` 和 `document.body` 类: PHP 还会输出一个内联 `<script>`,它会立即为 `<html>` 和 `<body>` 元素添加正确的模式类(例如 `dark-mode`)。这对于依赖这些类来设置背景色、字体颜色等全局样式的 CSS 规则至关重要,确保页面在渲染时就有正确的颜色基调。
4. JavaScript Cookie 同步: JS 代码在 `setMode` 时,除了更新 `localStorage`,还会更新一个 `theme-mode` Cookie。这样,用户下次访问时,PHP 就能从 Cookie 中读取到用户上次的选择。
5. 内联 JS 后备纠正: PHP 输出的内联 JS 中含有一个小的逻辑,用于比较 PHP 的判断(来自 Cookie 或时间)和 `localStorage` 中的用户偏好。如果两者不一致(例如,用户清除了 Cookie 但 `localStorage` 还在),这个内联 JS 会立即纠正模式,提供额外的鲁棒性。
代码仅供参考,在需要调用按钮的前端,添加按钮:
还有一个问题就是,header.php文件必须包含<?php wp_head(); ?> 和 footer.php文件代码必须包含 <?php wp_footer(); ?> ,按钮在二者之间的位置插入,否则无法正常加载,为什么,我也不知道,我是一步一步修过来的,怎么修的,不知道。
顺便提供下我的按钮图标:
完整插件代码下载:daynight-switcher
伪技术贴完工,睡觉。
Mealie,部署在本地绿联NAS上,通过Frp内网穿透出去,方便随时查看。
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.3.2 #
container_name: mealie
restart: always
ports:
- "9925:9000" #
deploy:
resources:
limits:
memory: 1000M #
volumes:
- mealie-data:/app/data/
environment:
# Set Backend ENV Variables Here
ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: America/Anchorage
BASE_URL: https://mealie.yourdomain.com
volumes:
mealie-data:删除保留镜像主要是想把文件存储到本地指定的存储空间里。










Snapic Just 640px是我在用的主题,作者更新很快,但一些修改只能在文件修,所以来总结一下我全部的设置。
Lopwon:不推荐从外部引入字体,访问不顺畅会导致自己的页面加载受阻,如果非得使用,需要放置在主题本身的 css 文件之下,也就是在 head 标签内的最下方,以覆盖主题 css 中的字体设置。
1、我是直接在head.php的< head >部分填写以下代码:
<link rel="stylesheet" href="https://registry.npmmirror.com/lxgw-wenkai-screen-web/1.321.0/files/style.css" media="print" onload="this.media='all'"/>
<style>
body {
font-family: "LXGW WenKai Screen", "微软雅黑", "Microsoft YaHei", "Georgia", "STZhongsong", serif;
font-weight: normal;
}
</style>
宽度我设置的是640、800、960,可以自定义。
Lopwon:如果指定是代码位置的话,在 functions.php 文件:找到变量 $optionsPannelWidth 每行 label 对应一项宽度设置,可以新增也可以删除,value 为对应的宽度值,在前端点选后会把值传递到 html 的样式中的容器宽度变量 --body-width 来定义页面内容的宽度。
2、找到functions.php的$optionsPannelWidt:
$optionsPannelWidth = '
<div class="width">
<label><input type="radio" name="width" value="640px"><span>窄栏</span></label>
<label><input type="radio" name="width" value="800px"><span>适中</span></label>
<label><input type="radio" name="width" value="960px"><span>宽栏</span></label>
<label><input type="radio" name="width" value="default"><span>默认</span></label>
</div>
';
同时在 functions.php 文件 找到变量 $width 修改相应的宽度设置。
$width = new Typecho_Widget_Helper_Form_Element_Radio(
'width',
[
'640px' => _t('640px'),
'800px' => _t('800px'),
'960px' => _t('960px')
],

3、下面是副标题的自定义设置,作者:@老街里,在 functions.php文件,我插入在变量 $catalog 结尾后,最新主题v1.6.0,第83代码行。
$SubTitle = new Typecho_Widget_Helper_Form_Element_Text(
'subTitle', null, '',
_t('网站副标题'),
_t('· 输入副标题文字,将显示在网站主标题后方,留空则不显示。')
);
$form->addInput($SubTitle);
同时在 head.php 文件,把<title><?php $this->archiveTitle([], '', ' - '); $this->options->title(); ?></title>替换成如下代码:
<title>
<?php
if ($this->is('index')) {
// 主标题
$title = $this->options->title();
// 副标题(去除首尾空白字符)
$SubTitle = trim($this->options->subTitle);
// 拼接标题
if (!empty($SubTitle)) {
echo $title . ' - ' . $SubTitle;
} else {
echo $title;
}
} else {
$this->archiveTitle([], '', ' - ');
$this->options->title();
}
?>
</title>
Lopwon:这个机制是避免浏览者点开图片后,直接翻图看文章中的所有图片,而不去阅读文字,我的博客同样使用了这样的机制,如果是文内图集,才能在图集内翻图,其他图片使用单图灯箱效果。
4、图片翻图,原主题是不能设置翻图,只能一张张的阅览,当然作者也给出解决方案,在 functions.php 文件 :
5、如何自定义翻页翻篇的灵敏度?
1. 搜索 foot.php 文件,找到两处 navigation 函数,如下操作:
navigation(true, 2, 1); // 第 1 个参数为 true 的,保持不变,第 2 个参数为电脑端鼠标滚轮阀值,第 3 个参数为移动端手势滑动阀值
navigation(false, 2, 1); // 第 1 个参数为 false 的,保持不变,第 2 个参数为电脑端鼠标滚轮阀值,第 3 个参数为移动端手势滑动阀值
6、签名字体修改,更加符合主题风格 将以上修正相对路径后的 @font-face {...} 样式代码,复制。粘贴至 css/snapic.just640px.front.css 文件中,如 @font-face 的下面,并如下操作。
@font-face {
font-family: 'Ma Shan Zheng'; /* 自定义字体名称,如果有空格,请用引号包裹,如 'Noto Sans SC' */
src: url('../font/myfont/subset-MaShanZheng-Regular.eot');
src: url('../font/myfont/subset-MaShanZheng-Regular.eot?#iefix') format('embedded-opentype'),
url('../font/myfont/subset-MaShanZheng-Regular.woff2') format('woff2'),
url('../font/myfont/subset-MaShanZheng-Regular.woff') format('woff'),
url('../font/myfont/subset-MaShanZheng-Regular.ttf') format('truetype'),
url('../font/myfont/subset-MaShanZheng-Regular.svg#MaShanZheng-Regular') format('svg');
font-weight: normal; /* 字体粗细,可选 */
font-style: normal; /* 字体样式,可选 */
font-display: swap; /* 字体显示,必选 */
}
.sign span:first-child a 部分修改样式 font-family: 'Ma Shan Zheng'
7、这条是备注,Typecho的feed显示200字符?当然也可以使用我的插件RSS,若修改找到 feed 文件:
function safeSubstr($str, $length) {
preg_match_all('/./us', $str, $ar);
return implode('', array_slice($ar[0], 0, $length));
}
$this->feed->addItem([
'title' => $this->title,
'content' => $this->options->feedFullText? $this->content : safeSubstr($this->content, 200). "<p class=\"more\"><a href=\"{$this->permalink}\" title=\"{$this->title}\">[...]</a></p>",
'date' => $this->created,
'link' => $this->permalink,
'author' => $this->author,
'excerpt' => $this->___description(),
'comments' => $this->commentsNum,
'commentsFeedUrl' => $feedUrl,
'suffix' => $suffix
]);
8、隐藏·的图片描述如何设置?也是@老街里修改的,找到 functions.php文件:
$buildImageHtml = function ($imageUrl, $altText, $gallery) use ($placeholder) {
// 检查alt文本中是否包含"·",如果有则创建带样式的图片描述(隐藏·)
if (stripos($altText, '·') !== false) {
// 分割·前后的内容并取后面的部分,同时移除·符号
$description = ltrim(explode('·', $altText, 2)[1] ?? '', '·');
// 添加text-align: center样式使描述居中
$escaped = sprintf('<span class="escaped"><span class="clamp">%s</span></span>', $description);
} else {
$escaped = '';
}
$blurStyle = (mb_strpos($altText, '羞') !== false) ? 'style="filter: blur(5px);"' : '';
9、备案号添加,在 foot.php 文件:
<?php echo filing('桂ICP备2022001355号-2','桂公网安备 45012702000102号','21313123'); ?>
10、添加RSS订阅和版权声明小图标在备案末尾,在 functions.php文件,找到filing部分:
function filing($icp = '', $psb = '')
{
$icp = isset($icp) ? (string)$icp : '';
$psb = isset($psb) ? (string)$psb : '';
$footerDisplay = (empty($icp) && empty($psb)) ? 'style="display:none;"' : '';
$icpDisplay = empty($icp) ? 'style="display:none;"' : '';
$psbDisplay = empty($psb) ? 'style="display:none;"' : '';
return <<< Lopwon
<filing {$footerDisplay}>
<section id="icp" {$icpDisplay}>
<a href="http://beian.miit.gov.cn/" rel="noopener noreferrer" target="_blank">{$icp}</a>
</section>
<section id="psb" {$psbDisplay}>
<a href="http://www.beian.gov.cn/" rel="noopener noreferrer" target="_blank">{$psb}</a>
</section>
<span style="display: flex;flex-direction: row; ">
<a href="https://bluehe.cn/rss.xml" rel="noopener noreferrer" target="_blank"><img src="https://bluehe.cn/usr/themes/SnapicJust640px/img/rss.png" style="width: 16px; height: 16px;"></a>
<a href="https://bluehe.cn/copyright.html" rel="noopener noreferrer" target="_blank"><img src="https://img.bluehe.cn/i/2025/04/08/67f4d7c3e4f70.png" style="width: 16px; height: 16px;"></a>
<span>
</filing>
Lopwon;
}

主题的评论在侧边栏,包括设置阅读宽度、网站背景、导航栏,以上就是部分修改内容,更加完善,待更新......
文 / 寻鹤说起博客,也将近玩了十年了,十年里从刚开始玩emlog大前端,后来发现生态没有typecho好,就慢慢转到了typecho,转到typecho不久,期间又对WordPress感兴趣,所以抛弃typecho来到WordPress的怀抱,那时候上学生活费紧缺,买的机子其实真带不动以前的WordPress不知道现在WordPress怎样呢,然后再次回到了typecho怀抱,我相信很多人都跟我一样。
于是自从博客的文章从WordPress转回typecho后,一直就有一个历史遗留问题,那就是当时用的是typecho的官方插件wordpress-to-typecho,这会导致转回来的文章使用的语法不是Markdown而是html(如下图所示),当进行文章修改的时候会有诸多不便,我不信只有我一个人有这个问题吧哈哈
还有一个问题就是typecho后台自带的备份功能,我相信当时很多小白也没少用这个来备份数据之后进行迁移或者程序升级的唯一途径,但是这个备份功能会有一个致命性问题,因为备份只会生成一个bat文件,恢复数据的时候有几率会碰上SQLSTATE[HY000]: General error:错误导致数据恢复不成功或者丢失数据,这也是我19年还是20年的时候遇到过的坑。
前几天刚好有空,刚好Cursor会员也准备过期了,就打算把这个问题一次性解决掉,于是Article Markdown Backup 插件就诞生了,启用插件后,点击控制台-文章备份与转换就能进入设置页面,很简洁,就只有四个功能
文章备份 - 备份所有文章和评论数据到JSON文件
文章恢复 - 从备份文件恢复文章和评论数据
格式转换 - 将HTML格式的文章转换为Markdown格式
文件管理 - 支持上传备份文件和选择服务器备份文件

下面是转换前和转换后的样式,插件能转换基础的markdown格式,但是如果你的主题有很多个性化的短代码,则需要自己动手修改或者在插件基础上增加更多的转换格式了:
[photos]

[/photos]
然后就是简单的备份功能,备份功能会把你的文章数据连同评论一起导出存储为json格式保存在/usr/plugins/ArticleMarkdownBackup/backups目录,也在博主自己的网站上测试过,备份204篇文章然后全部删除然后成功恢复全部数据,在开发环境和正式部署环境都暂时没有发现丢失数据的bug(但是也建议对数据库进行及时的备份,插件只能起到临时辅助的作用,长期备份还得要备份整个数据库),如果发现bug也可以随时提出来,及时进行修复,插件是基于typecho1.3.0
进行开发,理论上支持1.2.0-1.3.0版本,更低版本的还没有测试过,个人建议可以升级到1.2.1版本。

评论区好友@尚寂新提及到的一起解决"文章pid和评论cid自增数连续"这个问题本地demo已经做出来了,但是在本地测试的时候出现一些问题,还在找合适的办法把历史文章和相关评论数据影响降到最小后尝试发布新版本

增强了数据恢复的兼容性,新版本已优化数据导入逻辑,使其能够兼容处理备份文件中包含了非官方字段的情况,从而确保从备份数据到全新Typecho安装的平滑迁移。
Github官方仓库:Article Markdown Backup
前段时间虽然说是“断网”了,还是偷偷折腾了GoToSocial和Mastodon。GoToSocial和Mastodon都属于通过“ActivityPub”协议实现与多个平台的联邦特性与其他平台互联互通。GoToSocial虽然轻量,但是颜值和功能还是没有Mastodon好,最终选择了Mastodon。至于怎么玩Mastodon,要么像我这样自建,要么就用网上的平台,比如官方的mastodon.social和草莓县m.cmx.im。有兴趣的可以一起玩玩!目前我自建的为@laozhang@suo.si,官方平台和草莓县上分别是@laozhang@mastodon.social和@laozhang@m.cmx.im。为什么自建了还在其他平台注册呢,我怕以后我驾驭不了自建的mastodon,毕竟玩的时间久了数据都都会达到十几个G。或是感觉到单独花二百块钱搞服务器来玩mastodon不值的时候,我可能就把自建的关停掉。
东西玩多了,都想把他们“集成”到一起,比如老张博客首页的“最新动态”就是调取用 Typecho 搭建的https://zhangbo.net老张随笔第一篇内容。有兴趣的可以按《WordPress首页调用typecho方法!》的方法来;又比如在Wordpress的页面里显示Memos内容,方法可以按《巧搬空白Koobai大佬Memos页面,完美与博客整合。》来。
不难看出,在Wordpress里调用memos或是Typecho,都是完全靠代码,毕竟像这样玩的人少更甚是memos等太过小众,没有人折腾这东西,想要实现一些功能必须要靠自己才行。而同时玩Wordpress和Mastodon却大有人在,所以你想实现的功能别人都早就折腾过了。就比如在WordPress中集成Mastodon嘟文。先看效果https://laozhang.org/mastodon.html,这是我在博客里集成了@laozhang@suo.si所发的所有嘟文。那实现这个功能就只是简单的一个插件,Include Mastodon Feed。
直接在后台插件菜单里搜索安装即可,并启用。
不管是自建的Mastodon还是其他平台,把下面的代码内换成自己的用户名和相应的域名后在浏览器内打开,即可显示你的ID
https://yourinstance.com/api/v2/search?q=yourusername@yourinstance.com&resolve=true&limit=5
在Wordpress后台新建页面,把下面代码换成自己的ID和相应域名即可。(换成英文中括号)
【include-mastodon-feed instance="YOUR-INSTANCE" account="YOUR-ACCOUNT-ID"】
这个可以根据自己的喜好,自己折腾。
怎么样,插件版是不是太简单了!无脑操作即可!
这篇文章介绍了如何通过腾讯云EO提供的免费CDN服务,加速个人站点的访问速度,解决因国家地域广、网络环境复杂导致的站点访问慢、流量成本高等问题。作者以自己的博客为例,指出2000人的日访问量消耗约2-3G流量,若使用传统CDN,成本较高,而腾讯云EO的免费版套餐则提供了无限流量和请求数,大大降低了小站点的运营成本。文中详细介绍了获取兑换码、激活套餐、绑定域名、配置CNAME解析以及SSL证书的完整流程,同时提醒用户需合理使用,避免滥用导致封号。

在快节奏的现代生活中,随时记录灵感、想法或随手笔记变得越来越重要。如果你正在寻找一款轻量、开源、自托管的笔记工具,那么今天我要向大家安利一个宝藏项目 Ech0!它不仅简洁高效,还能让你完全掌控自己的数据。与此同时,也会把它与另一款热门开源笔记工具 Memos 做个对比,看看它们各自的亮点在哪里!
对 Memos 感兴趣的,也可以看看部署轻量私有化备忘录 memos
Ech0 是一款开源、自托管的轻量级发布平台,专为快速记录和分享个人想法、文字和链接而设计。它的核心理念是简洁、自由和隐私至上,让你专注于内容的创作,而无需被复杂的界面或繁琐的功能干扰。
仅从 Memos v0.18.2 版本为例,后续版本我觉得都是破坏性更新。本文主要从我个人角度简单对比一下
两者都一样开源,且都支持 Docker
对于我而言,短时间内 Ech0 还没放替代我的 Memos,数据迁移令人头大。但是期待 Echo 干翻 Memos,支持从 Memos 导入、支持 OIDC 等等。
项目地址: https://github.com/lin-snow/Ech0
Demo 地址: https://memo.vaaat.com/
值得一提的是,Ech0 还有一个二次开发版本 Ech0 Noise(高度完善的轻量说说笔记系统及 memos 的开源替代品),它在原版基础上增加了更现代化的 UI 设计(例如毛玻璃背景)和一键数据备份/恢复功能,视觉和体验上更像一个精致的社交平台。如果你喜欢更美观的界面,可以尝试这个版本。
听说还支持从 Memos 导入到 Noise, 没实操过
项目地址: https://github.com/rcy1314/echo-noise
Demo 地址: https://note.noisework.cn/
services:
ech0:
image: sn0wl1n/ech0:latest
# image: ccr.ccs.tencentyun.com/k7scn/ech0
container_name: ech0
ports:
- '6277:6277'
volumes:
- ./ech0/data:/app/data
environment:
- JWT_SECRET="Ooghooch1Oojanguz5dei1ahw0IPoh9d"
restart: always
pwgen 32 1/app/data/config/config.yaml, 具体可以参考官方示例services:
noise:
image: noise233/echo-noise
# image: ccr.ccs.tencentyun.com/k7scn/echo-noise
container_name: noise
ports:
- '1314:1314'
volumes:
- ./noise/data:/app/data
restart: always
admin/adminPS: demo 没跑起来, 提示账号密码错误 😂



无论你是想快速记录生活中的灵感,还是需要一个完全属于自己的内容分享平台,Ech0 都能以它的简洁和高效打动你。相比功能更全面的 Memos,Ech0 更像是一个轻盈的创作小助手,让你专注于思想的流动。如果你追求极简和隐私,Ech0 绝对值得一试!快去部署你的 Ech0,记录下你的每一个灵感火花吧! 你更喜欢 Ech0 的轻量分享,还是 Memos 的全面管理?欢迎在评论区分享你的想法!
最近感冒了状态不是很好, 没太多精力去看,7 月争取恢复一下节奏,给大家带来更多更好玩的开源软件。
关注我的微信公众号,更多技术吐槽和干货!
首先,感谢大家一直以来对我这个小破站的关注与支持♥️。自博客成型以来,陆陆续续有网友来询问我博客主题的相关设置。于是我打算在这篇文章中简单拆解一下目前的主题配置,希望能对同为新手的朋友有所帮助,也希望你能在这个过程中摸索出属于自己的博客风格。
我使用的是免费版的 Blocksy 主题,只需在 WordPress 主题商店中搜索 “blocksy” 即可下载安装。
接着,需要安装一个名为 Blocksy Companion 的插件,同样可以在 WordPress 插件商店中直接搜索并安装。
Blocksy 是一个设置简便且具备较高自定义性的主题。如果要详解我如何从“默认”样式调整为现在的样式,过程会略显复杂,加上时间久远,具体配置我也记不太清了 😅。你可以参考 Dayu 的 这篇文章,导入我准备的 dat 文件即可快速还原样式。
虽然我和 Dayu 都使用了 Blocksy 主题,但呈现出的风格各有不同。如果你更喜欢他博客的设计风格,也不妨试试看 😉
有不少朋友问过我博客文章的封面图是怎么做的,其实每一张封面都是我用 Keynote(苹果自带的演示软件)手动制作的。
我会先制作一个模板文件,之后每次只需修改标题并替换封面中的物体图片即可。
封面中的物体图像,若不是软件图标或商品图,一般来自 Unsplash 这类提供免费图片的站点,或是通过 AI 生成。之后我会用 PhotoShop 或豆包工具抠出主体图像,替换进 Keynote 模板中,整个流程算是比较简单的。

以下是我目前博客中使用的一些插件:
本博客采用小米的 MiSans 字体。
只需在 自定义 – 额外 CSS 中添加以下代码,即可生效:
/* 字体相关css */
@import url("https://font.sec.miui.com/font/css?family=MiSans:400,450:Chinese_Simplify,Latin&display=swap");
@font-face {
font-family: "MiSans", sans-serif;
font-weight: normal;
font-style: normal;
}
*:not([class*="icon"]):not(i) {
font-family: "MiSans" !important;
}
为了实现当前博客的视觉效果,我还在 自定义 – 额外 CSS 中加入了一些样式代码,其中相当一部分是配合深色模式所使用的。
.stackablelink a{
color: #475671
}
/* 说说相关css */
.atk-content {
color: var(--theme-palette-color-3);
}
a.commentsLink{
color: var(--theme-palette-color-3);
border: 1px solid currentcolor;
border-radius:8px;
}
div.atk-comment-count.atk-dropdown-wrap {
color: var(--theme-palette-color-3);
}
button.atk-send-btn {
border-radius: 8px !important;
}
div.atk-main-editor {
border-radius:8px;
}
ul.atk-dropdown.atk-fade-in{
border-radius:8px !important;
}
/* 黑色模式下,搜索页面背景色 */
html.dmb-html-dark [data-header*="type-1"] #search-modal {
background-color: rgba(71, 79, 92, 0.98);
}
/* 黑色模式下,好物页面文字 */
html.dmb-html-dark div.goods-exhibition-title {
color: #475671;
}
html.dmb-html-dark div.goods-exhibition-description {
color: #475671;
}
/* 黑色模式下,应用页面文字 */
html.dmb-html-dark div.app-name {
color: #475671;
}
html.dmb-html-dark p.app-description {
color: #475671;
}
/* 黑色模式下,书影音页面文字 */
html.dmb-html-dark button.neodb-nav-item {
color: #ffffff;
}
html.dmb-html-dark button.neodb-type-item {
color: #ffffff;
}
html.dmb-html-dark button.load-more-button.button {
color: #ffffff;
background-color: #293241;
}
html.dmb-html-dark .neodb-title a {
color: #ffffff !important
}
/* 黑色模式下,友情链接页面文字 */
html.dmb-html-dark a.latest-post-title {
color: #475671
}
html.dmb-html-dark div.friend-card {
background-color: #293241
}
/* 文章目录的样式 */
.rtoc-mokuji-content.frame2::before {
border-radius: 8px;
}
button.rtoc_open_close.rtoc_open {
border-radius: 8px;
color: #475671;
}
/* 回复按钮样式 */
a.comment-reply-link {
border-radius: 8px !important;
}
#cancel-comment-reply-link {
border-radius: 8px;
}
大二我们第一次有食品专业课程的时候,我们就已经接触到综述这个东西。那个学期我们有两门很重要的课程,一门是食品化学,另外一门是食品微生物学。这两门课程可以这么说,是食品专业最基础最重要的课程。这两门课程是往后那些高楼大厦的基础,这两门课程之前我们学的基本都是通用的基础课程,还没有接触过专业课。这两门课程对食品专业来说又是通用的基础。
在这之前我学过高等数学、线性代数、概率论、大学物理、物理化学、无机化学、有机化学、生物化学。我感觉这些课程是我们学习食品化学和食品微生物学的基础。到底有多大用处呢?我不知道,但我觉得这是很有必要的。老师在上面说专业课某些原理的时候,因为有前面那些课程的支持,所以我们就不需要深入进去了。
我印象非常深刻的是食品化学刚开课没多久,老师就已经把综述的作业布置给了我们。综述是什么东西?我们甚至没看过专业文献。老师没有要求我们写专业文献,因为没有看过,我们写不出来,但综述这个东西就强迫着我们必须去看你的那个主题相关的专业文献。专业文献去哪里找?期刊杂志当然有,纸质的电子版都有,但综述这门作业每个学生都有不同的主题,所以要有针对性。显然去图书馆翻杂志就不太现实了,当然你也可以一直去翻那些纸质。看专业文献不是一本是一堆,很多期,除非你一直都有翻,一直都翻很多,否则可能很难撞上你感兴趣的,或是你需要收集数据的。所以那个学期,我们也开了一门我觉得非常有用的课程,叫文献检索。如果没有文献检索这门课程,食品化学给我们布置了这么一个任务的时候。我们简直不知道该怎么活了。这两门课程同时出现,又有这么个任务的,我感觉出现了1+1>2的效果。因为有文献检索这门课程的技术指导,所以我们知道该去哪里该用什么方法找我们想要的资料,正是因为我们有这么一个食品化学综述的奋斗目标,所以我们就更加会努力地通过文献检索那门课程学回来的技术去试验、熟悉。最终的结果就是我们找到了那个综述PPT要求我们收集的数据。因为有大量的练习,所以当文件检索课程需要我们完成某些课题的检索任务,我们可以快速且得心应手。食品化学这门课程,我们一个大班上课,超过100人。理论上每个人都要拿着自己那篇综述的PPT上台去讲,但实际上我们根本没有那么多时间。我就是那个没有机会上去讲的人,最终只能把PPT交上去结束任务。我觉得有幸上讲台讲自己PPT的那些学生虽然很慌、虽然很彷徨、虽然很无助,但这的确是一个非常好的锻炼机会,如果你在大二,如果你在第一次接触专业课的时候就已经经历过这样的事情,毕业答辩的时候,根本没什么好慌的。你做自己那个PPT的时候,你是按照你的思路去整理资料、得出数据、得出结论。这个时候食品化学的那个老师就会像是毕业答辩时那样挑刺,跟你针锋相对,为什么是这个结论?凭什么得出这个结论?收集的这些数据到底有没有代表性,这样的现象到底能不能得出这样的结论?所以综述还真不仅仅是把别人的数据最终拼凑出一个东西这么简单。如果你不去思考其中的缘由,必定会被那门课的老师喷得你无地自容。食品化学那门课,我有两个老师。她们轮流上课,两个老师都姓吴,其中一个姓吴的老师,我们称之为灭绝师太。如果你的综述上台讲的时候没被她喷得一塌糊涂,就算非常成功了。
我敢肯定,不是所有学校的食品化学课程都会有这样的安排。我觉得,我读书的时候,华农这个食品化学课程的这种要求非常接地气、非常实在,并且影响我一辈子。

AList 是一个支持多存储的文件列表/WebDAV程序,使用 Gin 和 Solidjs。它可以将 40 多款主流网盘聚合到一个网页上,进行文件管理、视频播放等操作。
AList 是一个开源项目,已经卖给了其他公司,现在最新可用收购前版本是 3.40.0

吃瓜地址:Alist 收集用户信息提交记录、Alist被卖 Github用户讨论、Alist被卖 V2讨论、Alist被卖 V2讨论
今天主要推荐几款可以平替 AList 私有部署的网盘软件。
go-drive 是一款简单的云驱动器映射网络应用程序,支持本地、FTP/SFTP、S3、OneDrive、WebDAV 和 Google Drive。
文件管理
按住
Ctrl,Shift可进行多选从系统复制文件(夹)后,按
Ctrl + V直接粘贴上传按住
Alt并点击文件,可直接下载文件拖拽文件(夹)时,按住
Ctrl进行复制,按住Alt创建路径挂载(仅管理员可用)
文件打包下载
基于用户/组的权限控制
支持为某目录或文件分配权限,支持限制到用户或组
图片浏览(PhotoSwipe)
音乐播放(APlayer)
文本编辑(CodeMirror)
代码编辑(Monaco Editor)
展示缩略图
支持自定义缩略图生成策略,详见缩略图配置
路径挂载
允许管理员将某文件/目录挂载到任意位置
Drive 管理界面
文件搜索
通过 WebDAV 访问
定时任务(gocron)
支持简单的任务类型(复制/移动/删除)和 JavaScript 脚本类型

红枫云盘(官网地址) 是一款无服务端的多协议云盘文件上传和管理软件,提供了文件上传、预览、操作、同步备份等功能

Zdir(前台演示、帮助文档) 是一款集文件索引、在线预览与分享于一体的多功能私有存储程序,支持 WebDAV 和离线下载。
Docker部署命令
docker run --privileged -d --name="zdir" \
-v /opt/zdir/data:/opt/zdir/data \
-v /data/public:/opt/zdir/data/public \
-v /data/private:/opt/zdir/data/private \
-p 6080:6080 \
--restart=always \
pub.tcp.mk/helloz/zdir


File Browser(官网地址)国外作者开源的一款私有存储软件,支持多用户且界面友好,但是不支持挂载第三方存储,适合管理和分享本地文件。
filebrowser 提供了一个指定目录下的文件管理界面,可用于上传、删除、预览、重命名和编辑文件。它允许创建多个用户,每个用户可以拥有自己的目录。它可作为独立应用程序使用。

FileBrowser Quantum 最好的免费自托管网络文件管理器,是File Browser开源项目的一个大型分叉。
config.yaml 配置文件简化配置。/swagger 端点为启用 API 的用户提供了有用的 Swagger 页面。Zfile(演示地址) 是一款使用JAVA开发的在线目录展示程序,支持将本地文件、FTP、SFTP、S3、OneDrive 等存储在网站上展示并浏览,Zfile分为免费的开源版本和功能更强大的捐赠版本。

dirlist(预览地址)是彩虹大佬用 PHP 开发的目录列表程序,无需数据库,安装简单,使用方便。dirlist 功能上稍微要弱一些且不支持挂载第三方存储,如果用不到这些功能的话 dirlist 也是一个不错的选择。

Cloudreve 可以让您快速搭建起公私兼备的网盘系统。Cloudreve 在底层支持不同的云存储平台。可以使用 Cloudreve 搭建个人用网盘、文件分享系统,亦或是针对大小团体的公有云系统。
Cloudreve 本身是一款“网盘”而非“其他网盘的管理器”,其所支持的存储提供商大多为公有云的存储专用产品,而非针对个人消费者的网盘。下面情况并不适合使用 Cloudreve:

监控升级
近期将家中服役十年有余的老监控升级,此次更新采用poe网线非传统同轴线,需要旧线拆除再和更换超五类网线,以前的线是走外墙入了Pvc白管,这里涉及到一些高空作业问题。在闲鱼挂单问了惠州范围的高空师傅,我预估的工作时间在3小时左右,并声明我会在现场帮忙的前提下,给我的报价在400-1500之间,闲鱼一直挂着300我的心理价也是这个价位,我想着100元一小时差不多,挂了有大半个月没管他,主机和摄像头早一年前就已经准备好。
某天一位小哥联系我,我具体跟他说了作业内容,4321每层楼放两根网线,把旧线剪掉作废他说可以。为什么放两根,因为这些年来租户用的都是四芯线只有百兆宽带,借此机会把租户网络也升级了。
与其约好时间,那天中午一点到我家开始做前期工作,看他拉着大包小包工具麻绳,到楼顶转了一圈没找到较好的支撑点,七楼可以,光是前期工作就做了一小时,换上专用服装和各种固定扣件固定两个点,安全第一不能马虎。楼与楼之间间隔太小,只能从一楼往上爬到五楼,先把白管内的同轴线抽出,每层楼弯头居然用胶水粘死了,用工具撬开部分。
开始往每层楼放线与师傅商议尽最少次数往返做最快速度,由于间隔太小见他往上爬都很费劲。两捆不同颜色网线开始往下放,先放一楼两根一前一后门,在接着放二三四楼,期间遇到N多插曲影响了更换进度,我则在楼梯间跑上跑下已数不清次数,尽量让他少上下往返。最终完工比预估的时间多了一个多小时,事先说好300元他虽然全程都没有抱怨做事也稳妥,但自己心里过意不去,结账时到店里买了包烟加一顿饭钱给他。一位贵州小伙,做高空很多年跟公司签了合同有固定作业时间,是做半个月休半个月,闲不住时出来接下单。
第二天起来全身酸痛,尤其是小腿。干了亡约车后身体缺乏锻炼稍微做点事都气喘吁吁。自己花了大半天时间给网线制作水晶头,在将旧的摄像头更换下来,一切整备就绪开机,每个镜头都能一次点亮,现在可以随时随地在手机上查看监控回放,摄像头均带有录音功能,Nice!!只是硬盘还是用回之前的1Tb..录像只保存10天左右,用坏了在换大一点硬盘。
域名续费
月初已收到域名续费通知,一直没去处理。现好不容易上来冒个泡除下草,一起把这重要事情处理了。