阅读视图
FFmpeg常用命令备份
FFmpeg 是一个强大的开源多媒体处理工具,广泛应用于音视频的转换、裁剪、合并、提取等操作。无论是开发、剪辑还是日常处理,掌握 FFmpeg 的常用命令都能极大提升效率。本文整理了一些高频使用的 FFmpeg 命令,方便你快速上手或作为备忘录收藏!
临时需要处理一些上次到群晖 MinIO 的视频,写个流水线自动化处理。温故一下相关命令。
FFmpeg 简介
Fmpeg 是一个跨平台的音视频处理框架,支持几乎所有格式的音视频文件。它功能强大、命令灵活,堪称“音视频处理瑞士军刀”。以下是常见操作的命令合集,建议收藏备用!
常用命令速查
格式转换
将文件从一种格式转换为另一种格式,例如将 MP4 转为 AVI:
ffmpeg -i input.mp4 output.avi
-i:指定输入文件
提示:FFmpeg 会根据输出文件名自动推断目标格式
提取音频
从视频中提取音频,例如提取 MP3
ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3
- -vn:禁用视频流。
- -acodec mp3:指定音频编码为 MP3
截取视频片段
裁剪视频的指定时间段,例如从第 10 秒到第 30 秒:
ffmpeg -i input.mp4 -ss 10 -t 20 output.mp4
# 通常搭配如下
ffmpeg -i input.mp4 -ss 10 -t 20 -c copy output.mp4
- -ss:起始时间(秒或 hh:mm:ss)
- -t:裁剪时长(秒或 hh:mm:ss)
- -c copy:直接复制流,避免重新编码,速度更快
视频截图
ffmpeg -ss 00:20:00 -i "input.mp4" -vframes 1 "01.jpg"
视频压缩
压缩视频文件大小,调整比特率:
ffmpeg -i input.mp4 -vcodec libx264 -b:v 1000k output.mp4
- -b:v:设置视频比特率,值越低压缩越高,但画质可能下降
调整视频分辨率
将视频缩放到指定分辨率,例如 1280x720:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
- -vf scale:设置缩放参数
转换帧率
更改视频帧率,例如从 60fps 转为 24fps:
ffmpeg -i input.mp4 -r 24 output.mp4
- -r:设置目标帧率
例如 h264 编码无损转换至 h265 编码
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v hevc_nvenc -r 24 -c:a copy -x265-params lossless=1 output.mp4;
提取视频帧
将视频转为图片序列,例如每秒提取一帧:
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
- %04d:生成文件名递增,如 frame_0001.png
查看文件信息
快速查看音视频文件的详细信息:
ffmpeg -i input.mp4
输出包含编码格式、分辨率、时长等详细信息
通常如下所用一键输出视频的编码、帧率、码率
codec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4)
r_frame_rate=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4)
bit_rate=$(ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4)
echo -e "$codec\t$r_frame_rate\t$bit_rate\tinput.mp4"
视频合并
将多个视频文件合并为一个(需确保分辨率、编码一致):
# 创建文件列表 mv.txt
echo "file 'input1.mp4'" > mv.txt
echo "file 'input2.mp4'" >> mv.txt
ffmpeg -f concat -i mv.txt -c copy output.mp4
这个没用过,仅供参考
实用技巧与注意事项
- Linux:apt install ffmpeg(Debian)
- macOS:brew install ffmpeg
我仅在这两个环境实操过,其他环境可以参考官方文档,类似文档很详细了
另外结合脚本语言很方便,例如 bash
写在最后
FFmpeg 的功能远不止这些,熟练使用后,你可以轻松应对音视频处理的各种场。对于我而言,掌握基本功能从视频中导出音频文件使用就行(大部分还用不上,因为还有一些第三方工具帮你自动一键搞定)
欢迎关注我的微信公众号。

THYUU/星度主题 25.6.0 更新内容
以下内容仅作测试,请以月底最终更新内容为准。
全局
- 【优化】现在评论表单不做二级隐藏
- 【优化】强化定义主题自带图标库类名,防止其他图标库影响主题图标显示的问题,此前自定义菜单类名需在
icon-
前缀增加thyuu-icon-
- 【优化】强化定义主题样式 CSS 函数名,防止其他插件相同函数导致样式冲突的问题
- 【修复】全局动态面板按钮在点击文章目录按钮后的状态错误问题
顶栏
- 【新增】顶栏标识自定义高度设置,默认高度 1em
- 【修复】顶栏限定主题图标高度受到标识高度影响的问题
- 【修复】顶栏标识颜色动画延迟的问题
- 【删除】顶栏标识的气泡提示
留言板页
- 【新增】全新风格,让设计更加大气
- 【优化】评论列表结构,使其专注于浏览阅读
文章页
- 【优化】封面图、相册轮播图的加载信息提示,防止卡屏等问题
- 【优化】通用文章模板中,首屏文章内容动效随页面滚动变化
- 【优化】图文文章模版中,现在下滑时扩大阅读区域宽度
THYUU 区块
- 【优化】在线视频和在线音乐媒体区块的加载信息提示
zblog使用pjax后重载代码高亮
测试在pjax
重载函数里追加这些即可
if(document.querySelector('pre')){
$(function(){var compatibility={as3:"actionscript","c#":"csharp",delphi:"pascal",html:"markup",xml:"markup",vb:"basic",js:"javascript",plain:"markdown",pl:"perl",ps:"powershell"};var runFunction=function(doms,callback){doms.each(function(index,unwrappedDom){var dom=$(unwrappedDom);var codeDom=$("<code>");if(callback)callback(dom);var languageClass="prism-language-"+function(classObject){if(classObject===null)return"markdown";var className=classObject[1];return compatibility[className]?compatibility[className]:className}(dom.attr("class").match(/prism-language-([0-9a-zA-Z]+)/));
codeDom.html(dom.html()).addClass("prism-line-numbers").addClass(languageClass);dom.html("").addClass(languageClass).append(codeDom)})};runFunction($("pre.prism-highlight"));runFunction($('pre[class*="brush:"]'),function(preDom){var original;if((original=preDom.attr("class").match(/brush:([a-zA-Z0-9\#]+);/))!==null){preDom.get(0).className="prism-highlight prism-language-"+original[1]}});Prism.highlightAll()});
}
测试环境为Z-blogPHP1.7.4
TaoSync上手:基于Alist的文件同步系统,文件备份神器
记录:彻底删除Windows系统中我的电脑 - 文档 - 搜狐影音 文件夹
一、背景
最近给家里的台式电脑安装了纯净的win10系统,但由于U盘启动工具原因,导致安装系统后预装了一些软件应用。由于我并不习惯使用这些软件,便把它们全部卸载,并清理了注册表。唯一让我头疼的是,虽然我已经卸载了搜狐影音,也通过腾讯电脑管家把冗余的注册表记录删除了,但我的电脑 - 文档中,仍然存在“搜狐影音”这个文件夹,后面我无论是删除,还是用各种工具粉碎,重启电脑后仍然会在文档文件夹中自动生成搜狐影音文件夹。对于强迫症的我,确实受不了,于是尝试了各种方法去解决。
二、各种尝试
最开始还是希望能够通过搜索到相关的教程文档,按照教程来解决。可是,我使用了各种搜索引擎结果也没有得到一个解决方案。于是,我开始自己尝试。先是清理注册表,搜索了所有包含SOHU或sohu的注册表记录,并把它们全部删除。后来我检查了服务进程和计划任务,禁用和移除了可疑的任务进程。再后来我甚至使用了电脑管家的系统急救箱,把系统文件查了个遍。再后来我问AI,按照AI说的方法尝试了,依然无法解决。重启电脑后,搜狐影音这个文件夹还是会自动生成。于是,我开始怀疑,这个肯定是计划任务,但并不是独立的计划任务,而是绑定在系统进程中,也就是有系统进程给它套壳,导致无法追踪。
三、最终解决
既然是启动电脑后自动创建的文件夹,那就可以通过监听行为来查找原因。这里需要用到微软官方工具:Process Monitor 来捕捉创建行为。这里需要自定义筛选规则,在 Filter 中添加规则:Path contains 搜狐影音 then Include。
接下来,我删除文档中的“搜狐影音”后重启电脑,然后第一时间运行Process Monitor(必须赶在搜狐影音文件夹自动生成之前,否则无法捕捉到),捕捉到是系统服务svchost.exe这个进程创建了搜狐影音。接下来,通过管理员运行命令提示符:
tasklist /svc /fi "PID eq 5096"
(这个PID需要根据自己的记录填写)来查看svchost.exe实例中运行了哪些服务,然后终于找到了可疑服务:SHServicePlatform
通过AI了解到SHServicePlatform是搜狐影音残留的后台服务(SohuHelper Service Platform 的缩写),它注册为系统服务并托管在 svchost.exe 中。虽然卸载了搜狐影音,但该服务仍保留在系统服务列表中,导致:每次开机由 svchost.exe 托管启动、自动创建C:\Users\Administrator\Documents\搜狐影音 文件夹、自动写入注册表项、甚至可能保持后台网络活动。
问题已经找到,可以放心删除该服务以及注册表中的对应记录了。
四、解决方案
第一步:通过管理员运行“命令提示符”,彻底移除SHServicePlatform:
sc stop SHServicePlatform
sc delete SHServicePlatform
第二步:清理注册表,搜索“SHServicePlatform”,并删除所有相关注册表记录,然后重启电脑。
至此,我的Windows系统干干净净,我的电脑 - 文档 中,“搜狐影音”文件夹不再自动生成。
与自己和解
今天下午去物流站点送上最后一箱行李的时候,我抬头望了一眼天空,半截天的乌云呈排山倒海之势,似乎在宣示着些什么。我赶紧让对象先回去拿伞,我刚到站点,这场雨就下了起来。
在决定去重庆前的这两年,发生了很多值得记下来的故事。偌大的世界,这些零零碎碎不过尔尔。但记录生活,是这个博客的初衷,也是给将来的自己一个交代。某一天回首过往,能够清晰地看见那个真实存在过的自己。
有一件事情我一直引以为傲,那就是我为自己做的规划。从毕业前的实习期,到成为独立律师的前一年,所有的职业生涯都在规划的预期之中。最后一份授薪律师的工作,是我人生脱轨的开始。
我还记得决定放弃在互联网公司做前端开发、转而从事法律行业的那时候,我看到了一篇优秀的辩护词,无论是从法理还是从情理的角度,它都深深地感染到了我。为公平正义而奋斗终身,成为一个真正有用的人,这不正是我的理想所在吗?于是,坚定地选择了律师这条道路。
刚到深圳的时候,我已经渡过了做律师最痛苦的阶段,成为了一名执业律师。那个时候我选择了一家案子比较多的律所,只为在真刀实枪的战场上锤炼自己、积累经验。平均每周 3-4 个庭要开,这个强度或许只有同行知道。百炼成钢,虽然可能远远比不上那些优秀的前辈们,但对于我个人的诉讼经验,可以说是指数式地增长。后来,又选择了一个主要做刑事案件的团队。在无尽的诉讼之中,虽偶觉疲乏,但内心丰盈而富足,期间也不乏耀眼的成绩。
看着自己离理想更近一步,心中不少欢愉。只是,这个世界是残酷的。经济环境的影响,让我的老板也开始为案源焦虑,最终,我被派驻到了一家政府单位。就工作本身而言,老板对我特别好,政府单位的领导和同事也都特别好,薪资也是我非常满意的。只是从我个人职业发展的角度来说,在派驻单位的那段时间,等同于虚度。后来,老板的案源渐渐回温,我也更加没有自己的时间了。于是,我最终选择了离开,离开那个我曾经称之为“理想工作”的岗位。生活总是如此讽刺。
那个时候,我已经执业快三年了。2024 年 2 月,综合各方面的考虑,我决定独立。独立之后,最匮乏的就是案源,一介布衣,无人问津。以前我代理过的客户可能都信任我的专业能力和责任心,但对于素昧平生的陌生人,或许更愿意相信没有《律师法》和《律师执业行为规范》等约束的法律咨询公司,或者是他们长期合作的老朋友。
独立以后,最富裕的就是时间。其实,让自己在奋斗的路上停一停,是有必要且有意义的。只要这段时间没有虚度,那就无愧于此生。
三月,我去把两边的智齿都拔了。其实,我对于拔牙这件事,一直是很抵触的,而且是很恐惧的。得益于在卫健委的工作经历,我选择的医院还算不错,术后对象贴心照顾,如今早已恢复,算是迈过了心中的那道坎。
四月,父亲告诉我他被公司克扣了年终奖。这是一件让人愤怒且值得较真的事情。平复好父亲的情绪以后,我决定先礼后兵。先让父亲去找人事了解情况,请求补发。毫无疑问,人事坚持那一套冠冕堂皇的说辞。既然如此,只能诉诸法律,尽管程序可能很复杂,而代价也会很大。毫不夸张地说,办理本案的成本,已经远远超出了我们所主张的数额。这里引用电影《第二十一条》里面的一句台词:“所有正确的事情都会有代价,但不能因为有代价就不去做。”毕竟,这个世界并不存在唾手可得的正义,人活着就是为了争一口气,而“法,不能向不法让步”。
后来,正常走诉讼流程。开庭的时候,公司聘请了律师,也派人参加了旁听。同行相惜,正常来说,律师都是站在自己当事人一方说话,各种论点无可厚非。我也并不喜欢去对别人评头论足,更何况是同行。只是,这一次的对方律师,实在让我大跌眼镜。这里记录出来,也是为了给律师行业正名。
首先,案件无论大小,但凡接受委托了,理应好好准备,在法律允许的范围内,为自己的当事人争取最大的权益,这是责任心的问题。而对方律师,我能够明显感觉到没有怎么准备,或者是过于自信?至少我认为,很不负责。其次,至少要有基本的专业功底,这已经是一个很低的要求了。法律应该是严肃的、慎重的、专业的,而不是轻浮的。言及此,这里举一个当时庭审中的例子。对方律师为了证明制度的真实性,拿出了一张有我父亲签名的《××制度告知书》,这份文件只有制度的标题没有制度的内容。我质证这份文件的时候,否认了这份证据的真实性,核心理由是这份证据只有形式上的真实性,但不具备内容上的真实性,不能真实地反映公司已经履行了公示告知义务,具体就不展开了。当时对方律师直接红温,破口而出“做人要讲诚信,人无信不立,可以申请笔迹鉴定”等等甚至进行人身攻击。庭审进行到这里的时候,我彻底放心了。我的内心难免五味杂陈。要知道,对方是一个执业 20 多年的老律师。至少我会认为,这样的前辈一定是值得学习的榜样。特别是最后庭审结束的时候,他可能真的气急败坏、失了分寸,直接走到我的面前炫耀他的资历,嘲笑我“你是拿你爸的案子练手吧?”从执业年限上来说,我确实不及他。但或许他并不知道我的故事,以为我只是一个初出茅庐的小律师。
我不知道他后来收到败诉裁决的时候作何感想,也不知道,公司的财产被强制划扣的时候他是否还能自信地跟公司交代。至少在他后来给法院的申请书中,我能够清楚地看到,他终于认识到了自己的狂妄无知和不负责。此时补救,为时已晚。很多答辩意见早就应该在庭审中提出,或许并不会改变案件的结果,但至少问心无愧,也值得被尊重。
我想说的是,这个案子遇到的律师,确实是我遇到过的律师中的极少数,也可能是律师群体中的少数。无论输赢,大部分律师还是专业负责的。只是,从心理学上来讲,基于这种幸存者偏差现象,很多人往往会因为极端的个案改变对群体的认知。更何况,现在法律咨询公司以各种话术让老百姓误以为这些销售就是律师。这或许是一个时代的悲哀。
再后来的几个月,主要是在写代码。编写完善了“情侣日志”小程序、律师名片网站、法律知识管理网站,以及基于 Typecho 的 OneBlog 生活博客主题。我一直认为,写作是一件非常重要的事情。于爱情,那是我们共同的珍贵回忆;于生活,那是我真正存在过的痕迹;于专业,知识管理和复盘是专业能力得以精进的有力保障。
十一月,在京东购买了最新款的Surface Pro。我个人而言,确实更喜欢 Windows 系统的开放,也有很多优秀的软件。轻薄笔记本用来办公再合适不过。在收到货以后,才发现 Surface 的处理器架构并不是 x64 或者 x86,而是 Arm 架构。这意味着很多软件和驱动都安装不了,这是我不能接受的。于是我申请 7 天无理由退货,但是京东以“激活后非质量问题不支持退货”为由拒绝退货。这又是一件值得较真的事情。
其实,这很明显是霸王条款。讨论条款的合法性并无太大意义,毕竟,诉诸法律的代价是高昂的。能够解决问题,才是最重要的。现在京东已经不同意以“七天无理由”为由退货,那继续纠结这个法律依据已经没有任何意义,除非直接诉讼,但直接诉讼并不是解决问题的最好方式。于是,我重新仔细查看了商品介绍页面的任何一个角落,终见端倪。于是,我不再以“七天无理由”为由申请退货,而是以“虚假宣传,商品欺诈”为由,告诉京东,如果不同意协商解决,那就退一赔三,并且明确给了他们最后的期限。最后,以这种非诉的方式实现了诉求。我在社交平台上看,很多都是激活后没有退货成功,也有很多是通过诉讼解决的。后来,对象告诉我,她同办公室的律师,听说我激活后还退货成功了,特意夸赞了我。我听后,心中窃喜。
二月,也就是春节过后。新的一年,新的开始。本规划着个人的发展,谁曾想对象的妈妈被确诊癌症。知道消息的那一瞬间,有声亦无声。我们刚回到深圳,行李箱还没放下,又立马飞去重庆。这里引用对象记录的文字吧:短短几天,像是有一生那么漫长,上一秒还在地狱,下一秒感觉又到了天堂,希望我们都有一颗强大的心脏来应对生活中的所有困难。
三月,计划中离开深圳的日子。房东人很好,有问题能够及时解决,退房的时候也正常全额退了押金。换城市最让人担心的是行李问题,由于小区门口就有物流站点,多个平台对比之后,去这家公司谈价格,最后老板同意走内部价,比市价便宜一半。
还记得我刚去深圳的时候,一腔热血,怀揣着激情和梦想。那时候,我和货拉拉司机闲聊着,他说,很多人来深圳都是不到三年就离开了,能够待满三年的,都是人群中的佼佼者,最后大概率也留在了深圳。我心里想着,要好好努力,争取能够留下来。彼时,“天之骄子,大有可为”,毕业时母校的祝福在我的心里回响着。今年,刚好满三年。生活总是充满着讽刺,不是吗?
离开深圳的时候,雨下个不停,天气格外冰冷,朋友特意赶来机场相送,我心里很是感动。我们笑着说再见,却深知再见遥遥无期。于朋友如此,于理想亦如此。
人生天地间,忽如远行客。
(执笔于2025年3月15日 深圳宝安国际机场)
若坚持面向光明,则必将抛却暗影
十四年前,也就是2007年,我体验到生命中第一次、也是唯一的一次等成绩的忐忑。
在2007年考博之前,没有哪一次考试让我有过忐忑。究其原因,或出于懵懂,比如小学阶段的任何考试;或失于轻狂,比如中学阶段的所有考试;或缘于拼命,比如硕士研究生入学考试;或因为有些考试本身没有任何挑战性,比如普通话资格、教师资格之类的。
之所以忐忑,首先是因为这是我第三次考博,并且坚持到走进考场、做完试卷。具体而言,2005年、2006年的考博,我从报名、缴费,到复习、备考,直到最后一刻决定放弃走进考场、看看试卷,我都是认真、审慎的,以至于没有成绩早已在我的预料之中。
从结果上看,放弃是一步到位的堕落。不过,在放弃之前,却往往斗志昂扬、顾盼自雄。2005年我第一次考博,报名之后我做足了功课——从买书、看书到旁听课程、参加在读博士生的研讨……在一年的复习中,博导对我的鼓励、学长对我的肯定、学习中屡有心得的小喜悦,这一切细节仿佛都在不厌其烦地暗示我通关的必然性。我记得当时我亲爱的老妈依照惯例,在大年三十晚上感慨“今年过得可真快”,我嘴上没言语,心里却暗叨叨说,今年这日子过去的速度吧,恰好与我学识增长的速度、笔记积累的厚度和势必通关的程度成正比。
到了考试的前一天中午,我就住进了离考场最近的发小寝室。他当时正在读博士一年级,我平时跟他和他的室友也多有照面,既然大家都这么熟络,而且我满肚子的考点无处释放,于是,我自然把话题引到了我的考试范围中。通常在吹嘘自己的时候,时间就过得飞快,一眨眼就到了下午,我的另一个发小如约而至,要请我吃晚饭。刚落座,他就从手提袋里拿出两瓶白酒,并且斩钉截铁地给出了我无法抗拒的理由:兄弟之中,只有你读书多,干了这瓶壮行酒,明天考试占鳌头!……第二天早上我挣扎着从梦中醒来,朦胧中看看手表,已经九点半了。我跟读博的发小抱怨说:“你怎么不叫醒我?!”他咧开嘴说:“叫了,叫了好几遍,你没有反应啊!”他话音未落,一阵酒意冲得我四肢百骸酸软乏力,罢了罢了,不如睡去。
在备考这件事上,重整旗鼓几乎易如反掌,如果不是要换专业、买新书的话,应该会更简单。在2005年的某个夏夜,好友小聚话考博,我手握酒盏,面如平湖,总结前番考博教训说:“一年焚膏继晷,可谓问心无愧,唯一的小遗憾是酒喝多了点,以至于晚节不保,今夜兄弟在座,我举杯为誓——2006年考博,绝不重蹈覆辙!”
接下来,我换学校、换专业、换博导、换新书,不忘初心,砥砺前行,更投入、更专注,更多地与新的博导、新的学长交流,获得了更真切的肯定……我觉得自己对考博、读博充满了爱,就像歌词唱的,“爱要越挫越勇,爱要肯定执着”,我像一只经过风雨洗礼却白帆满涨的航船,轻快地划过海面,驶向报名、缴费的日子。不过,单位的人事制度给了我当头棒喝:请长假是不允许的,要么正常工作、放弃考试,要么坚持考试、旷工处理。挣扎归挣扎,当时,我几乎没用多长时间就选择了前者。
正视羞耻是勇往直前的序章。整个2006年的夏天,我不断尝试着站在正常人的角度而不是我自己的角度去反思前两次考博的经历,客观地说,差一点儿成功与成功相比,差的可不是一点儿,而是很多——谁会在考试前夜烂醉如泥?谁不会统筹工作与备考的日程?
2006年初秋的武汉,空气里浸润着湿冷。我第三次选择了新学校,第三次选择了新专业,第三次选择了新导师,第三次购买了新书籍,第三次整理心态、开始复习。接下来的日子里,我倍感艰难:2005年以来的房贷令我每月入不敷出,我不仅增加了本单位的授课工作量,还在校外兼职授课,一周下来,不是在上课,就是在去上课的路上。那一年,我不再跟以前一样时时出没于博导的课堂和学长的寝室,我总是背着一个巨大的书包,把几乎所有的资料都放在包里,还练就了在公交车上站着都能看书的技能。
2007年4月6日,周五,晚上九点半,我进了书房,把这一年来我看过的所有资料浏览了一遍,给重要的资料写一条百字左右的摘要。凌晨两点半,我躺在床上,昏然入睡。六点半,我洗漱完毕,动身前去考场。
2007年4月7日,上午九点,我打开了试卷密封袋,看到了试卷。这是我人生中第一次看见博士入学考试的试卷,我能感觉到密封线内的答题留白处浮动着自己这三年来的影子。我提笔作答,胸中无端地有一股意气,一定要在字里行间抒发。收笔之际,我检视答卷,没有涂改,工整如一。
2007年5月末的武汉,仍旧是乍暖还寒。我捏着小灵通,忐忑地等着回电——前几天我听说复试结果出来了,可是学校网页上没有公布,好友帮我找到老师的手机号码,几番鼓励我给老师发个消息问问。我思忖再三,也顾不得那么多了,于是给老师发了一条问询短信。我背着书包,漫无目的地兜着圈子,踱过来踱过去,突然手机响了,我赶紧看一眼,却是广告短信。我心想:算了吧,都这么久了,脚也踱得酸了,肩也硌得生疼,回家吧,看看书,为来年做一点准备也好。正要抬脚走人的时候,短信铃响了,定睛一看,正是老师发来的,打开一看,“把你录了”——说实话,祖坟冒青烟我没见过,可是此刻的我如同身临其境。就在此时,短信铃又响了,我一看,居然还是老师的短信。这让我心里一惊,莫不是老师发错了,现在来纠错?我打开短信,赫然写着“给你个公费”。
四年后,在博士毕业的谢师宴上,老师在点评我的学业时,指着我说:“你是那一届我们导师组无人认识,仅凭一张试卷就给你复试机会的学生,而你在复试中的表现,说明当初我们没有看走眼。”
若坚持面向光明,则必将抛却暗影。与诸君共勉。
作者:高晖云
甘于平庸
我年青的时候,功利性极强,不是稼轩当年万里觅封侯的气概,只是希望出人头地,二十几岁成为政协委员,跻身小城名流。2001年左右,蒙桂明师兄推荐和许靖兄的垂爱,上了央视,混了一个脸熟。不过,这只带来一拨又一拨的求助信件,(当时并没有多少社交媒体,因此,求助信就是鸡毛信),当时还去了山城帮出租司机群体维权,在电影院帮他们开会,幸好薄王主仆二人并未上任,否则估计也会很李庄。这些维权过程中,很快发现自己能做的,极有限。
混个脸熟无助于业务增长,为什么律师界闷声发大财的,主要是帮有钱人做事,不管大事小事,总之都是有钱的服侍。求助于电视或者网络的,只能是穷苦人。后来开始有社交网络,发现世上高人异事极多,多了些敬畏之心,功利性有所减弱,但依然会以曾文公为典范,知道无曾文公的本事和机遇,学修身养性,文正公如同父兄师长。后来极偶然机会,侥幸得着一点薄名,除了带了骄傲,还被转型引入刑事辩护领域,骄傲加压力,让自己遭遇种种试探和挫折,人的尽头,就是神的开始。
现今五十岁,算略知一些人生和世界。你看世界上,成名成家者毕竟少数,多数人客观上会要学会接受“平庸”,当然这个平庸,是世界的标准,我等会儿会讲另一个标准。世界的标准,就是古希腊人说的,人是万物的尺度。人的尺度,最成功的,无非就是如亚历山大大帝一样,十几岁开始争战,三十岁征服世界,美中不足的是,他就只活了三十三岁;人的尺度,或者就是富可敌国,咱们就不谈胡雪岩了,都知道结果不好;人的尺度,或许就是美女如云,可惜,中国皇帝的平均寿命不过三十。人的尺度,或许就是刘邦项羽,项羽不说,刘邦最爱的戚夫人和儿子,等老刘一死,成了吕后残忍的牺牲品。
但人们总是看到各种成功人士的美好的一面,却忽略了另外一面。当据说科比的曼巴精神是凌晨三点去投篮,你想过没有,这个年轻人,又多少时间,去思考人生,去认识世界,除了给人贡献了精彩的篮球比赛和自己的总冠军戒指。黑曼巴是非洲的一种毒蛇,我们会敬佩科比的球技,但如果要从人生的均衡而言,热情,执着,严厉,回击和无惧,这些美好的词后面,其实,都藏着对自己的严苛功利。或许科比的曼巴方式成功了,但可以肯定绝大多数,就算凌晨一点开始去练投篮,也未必会赶上科比一二,天赋很重要,有时甚至是决定性的。有了天赋,可以有勤奋,但勤奋也还是要有限度的,人生均衡性很重要。
真正幸福的人生,是认识自己的天赋,更重要的,是认识自己的使命,有时天赋意味着使命,有时发现自己什么天赋都没有,那也得接受,你肯定有自己的使命。勤奋也会让人有一块存留的天地。但要记得,不管有什么天赋,如何的勤奋,如何的成功,都要走下T台,回归自己真实的生活。乔丹必须接受,他之后有科比,科比也得接受,他之后,还有新的明星。如果你以T台为惯常,你会不习惯没有掌声。我曾在一个非常有名的律师身边工作过,见识过,一个辉煌的人物,走下舞台之后的落寞。其实,除了终身领导,几乎所有的人,都要习惯寂寞,当然,终身领导会更寂寞,因为,他身边都可能是敌人。康熙皇帝把自己的大儿子杀了,这样的事情,对历史来说,无非是又一出小花絮。
对大多数人来说,甘于平庸,无非是接受自己的使命,(不是认命),人最重要的使命,是认识真理。孔子开始就说,朝闻道,夕死可矣。信仰是所有价值观的基石。人都有信仰,就算号称无神论的,也有信仰,就是:我信自己。记得,很久之前,我刻了一枚章,理学后人。因为,我在比较理学和心学之间,我不是很认同我的老乡王阳明,虽然,他的事功似乎比朱熹要牛。但一般人,学朱熹的理学,修身养性,有圣人的言语作标准,不至于作狂人,可以踏踏实实过日子。但学心学,往往我心即宇宙之后,缺乏外在约束,后来泰州学派的赤手缚龙,就似乎入狂禅了。当然,你也可以说,理学也容易变教条。
甘于平庸,是要平衡自己的责任。你说我找不到使命,也行。人类很重要的现象是,你其实,并不是光为自己而活。就算不信神,你恐怕也要为家庭而活,看到很多为了自己的成功追求,而舍弃(在家如同出家)家庭的,除了留给家庭一个背影,或者一个取款机之外,一无所有。但绝大多数人,(除非特别呼召)还是要完成自己的职责,教养孩子,陪伴孩子,抚养孩子,赡养父母。就这一点,你恐怕就得甘于平庸了,你有多少时间可以去追求卓越?你的卓越,或许就是其他责任的抛弃。
甘于平庸,也得接受孩子平庸,或者让孩子接受甘于平庸。真正的平庸,可以是一种很均衡的生活,也是一种各种职责平衡的生活,不受世界偶像,和别人掌声的诱惑。古人说,杀君马者,道旁儿。世人多被这些掌声吸引,其实,你去看看那些明星的生活,你就知道,掌声背后的寂寞。你看看林青霞现状如何?世上美人如英雄,不许人间见白头。很多人,往往得等到孩子出事了,才想明白,孩子平平安安,平平庸庸,也是很美好的事情,不是吗?
甘于平庸,不是颓废,而是按照内心呼召的节奏生活,不要拔苗助长,追求的目标,不是功利。补习班可以增加你的成绩,但不会增加你的能力。每天凌晨三点的投篮练习,可以增加你的投篮命中率,但你会牺牲自己的健康和精神生活。卓越需要代价,如同浮士德博士的交易,你总得付出些什么。有些人蒙上帝的垂青,就是有某种天赋,很好,但主要天赋不要成为自己的束缚和绊脚石,人往往跌倒在自己的擅长上。
人不光是服事自己的家庭,也要服务自己的国家和社会,这中间也需要平衡。在国家和社会的服务中,更需要不要视之为偶像。德国人在一战二战的陷阱中,就是视国家为偶像,为终极的救赎者,最终落入万劫不复之地。
甘于平庸,是不求人的悦纳,但求神的悦纳。基督信仰是不苛求人成功的。因为耶稣在世上就是一个失败者,他选择的人,不是渔夫,就是犹太人唾弃的税吏等。基督徒没有什么成功标准,不以地上的财富权力为标杆,最重要的只要求你一件事,传福音。这个事情,不管成功者,不成功者,都可以做,而且,只求你传,信不信不是你的事情,是神的事情。虽然如我等信徒,未必能活出好的样式来,但依旧可以活在内心平安之中。
记得新儒家冯友兰先生有一副对联,阐旧邦以辅新命,极高明而道中庸。后一句,不如改为极高明而道平庸。不鸡血谓之平,不激进谓之庸。冯友兰先生就是被第一句束缚,似乎将旧邦新命视为偶像,结果落入伟大领袖的“天下英雄尽入吾彀中”。儒家的立德立名立功三不朽用佛教的一句话来说,有执就有障,但佛家的学问太出世,也容易落入不均衡的境况中。工作,家庭,个人,集体,社会,国家,都需要均衡,而能统摄这均衡的,必须是真道。
要甘于世人眼中的平庸,因为那是人的标准但真正的标准,是神的标准。要知道在神眼里,每一个人都不平庸,都是独一无二的,就算指纹都没有一模一样的,一花一叶都不同,使命也不同。没有所谓平庸,因为评价体系不一样,爱神和爱邻舍,成了最重要的。如同在真爱的家人,朋友面前,只有独特的关系,没有平庸和成功,子不嫌母丑,狗不嫌家贫。再用民间的一句话来说,宁要讨饭的妈,不要当官的爹。因为,虽然妈比平庸还惨,但她爱我,爹比世人成功,但没时间爱我。
圣经里有一句话:人若赚得全世界,赔上自己的性命,有什么益处呢?当然,这个性命,是指真正的生命,在这个生命里,每一个人,都永远不会平庸。对不起,我又传道了。但你似乎也看完了。谢谢你!
作者:斯伟江
大人与小孩
执笔的这一刻,梦境还是很清晰,已经很久没有出现如此完整而真实的梦了,昨晚梦见回到了初三——那段人生至暗的时光。
梦里是这样的场景:假期结束返校,班主任叶老师特意来教室跟我们说“我知道你们早已习惯了社会上的酒肉生活,现在突然回到了这里,难免坐不住,但是既然回来了,我们就好好做好当下的课业”。说完便开始检查假期的作业,我记得大概是要在自己的日记本里找到《玫瑰花的葬礼》这首歌的歌词誊抄,大家都找到了,我却没有,一时间不知所措又惶恐至极。同桌是一名很有名的企业家,记不清是谁了,但是我看到了他那充满岁月痕迹却工整的日记本。心里便感叹,原来一个人的得失是能够在成长的过程中找到端倪的。我担心没做作业受到批评,也完全不知道作业没做的情况下怎么应对,只是想着先做一份吧,于是拿着书包里的书法纸,准备现场赶工。誊抄的时候我的心思完全不在作业本身,而是在想能不能早点回去,回到那个经历过很多事、吃过很多苦的年纪。 因为我知道,我已经没有勇气再把过去的苦难重新经历一次。
忙里偷闲,我打开电脑访问了几个邻居的博客,看了一下大家的2022年年终总结,虽然大家表面上不说,但字里行间,无不夹杂着收获与辛苦之意。其实,不只是成年人,每个人的世界都有着各自的苦难。只是,不如意事常八九,可与语人无二三。
过年的时候,我和弟弟谈了谈心,大概的话题就是他成绩不太好,担心高考的问题。对于他那个年纪,这是个非常普遍的话题,在很多人眼里,成绩好的就一定有经验,而且我也算不上成绩好。当然,言及此,不至于哑口无言。我没有讲我自己的过往,只是告诉了他一件他可能并不知道的小事:高三那时候,下晚自习之后,学校都要求半小时内洗漱完毕关灯睡觉,但是你如果去我们的宿舍查寝,乍一看一片漆黑以为大家都已入睡,但是你只要走进宿舍,无论掀开谁的被子,你看到的都会是他打着手电筒正在学习的景象。也许是我见识太少,私以为世上并没有所谓的天才与好运,只是我们没有看到别人背后努力的模样。 小孩有小孩的磨难,大人有大人的担当。
前些天租房的时候,认识了一个房屋中介,比起其他中介,他的真诚与实在打动了我,在还没有看房子的时候,我就在心里下了决定,这次就在他的手上租房。虽然前几次没能看到中意的房子,但最终还是在他的帮助下租到了理想的小窝。其实,比起租房本身,我更想聊聊我在他身上听到的故事。疫情爆发之前,他和朋友合伙开了一家饭店,苦心经营数月后,生意如火如荼,那段时间赚了不少。2020年初,疫情爆发并蔓延全国,人口密集、流动性大的营业场所不可避免地受到了严重的冲击。原本以为数月后就能恢复正常,结果我们都知道,半年过去了,依然封控;一年过去了,封控成为常态;两年过去了,也只是陆续有了放开的声音;两年半过去了,营业仍没有恢复正常。可是,对于一个小店,甚至说对于一个小规模的企业,这种打击都是致命的,无数公司因此闭业,他的小店也不例外。
眼看他起高楼,眼看他宴宾客,眼看他楼塌了。虽然不能真的做到感同身受,但当他说出这段故事的时候,我能看出他眼里的无奈和释然。后来我得知他现在打着两份工,白天干着本职工作,晚上出去摆摊,天天如此。对他的敬重之情,已悄悄涌上心头。 每个人都有自己生命中不能承受之重,我们都是带着遗憾和泪水拼命绽放。
时至今日,我都还记得之前在地铁口见到的一幕:一个小朋友,背着书包,小心翼翼地搀扶着他的奶奶,走得很慢很慢,但是步伐很坚定。而那位老奶奶的手里,提着刚买的蔬菜。可怜天下父母心,我相信他的父母,比我们任何人都想亲自接他放学,只是身不由己,在背后默默承受着一切,而他也正努力成长为大人。
刚来深圳的时候,面试完几家律所后,我偶然来到福华路,那里高楼林立,蓝天白云,在十字路口等红绿灯的我,伴随着滴答滴答的声音,陷入了孤独和茫然的状态,天地之大却无我容身之所,车水马龙却与我无关。那个时候,我才真正明白,每个人都有自己的路。 我们或许有机会选择路的方向,但最终能否抵达,还是取决于我们能否披荆斩棘、朝这个方向坚定地走下去。
或许正如尼采所说,人生本就是一场苦难。至于人生的意义,大可不必追问,因为,过程本身就是答案。
内在的从容
——当我们改变不了什么的时候,就用最好的心态去接纳当下。
写这篇文章的此刻,我正被隔离在酒店。向工作组了解完隔离期间的一些注意事项后,终于安顿了下来。如果说之前没有时间去思考、去写作,这一次怕是没有借口了。
像往常一样,周一正常地去律所,中午在大厦餐厅吃了午餐;周二早上收拾完后正准备出门,收到了师父的消息——大厦检出阳性、先不要出门,我看了一眼昨晚的核酸结果,阴性,绿码仍在。于是我就打开了电脑准备在家里办公。接着,先后有流调中心、街道办、居住社区的防疫工作站给我打电话,大概意思就是我被判定为密接了,赶紧收拾一下行李,要拉去集中隔离。没错,原因就是阳性病例周一中午也在大厦餐厅吃了午餐。不久,防护服就送到了门口,绿码也变成了红码,很快,我就被拉到了集中隔离的酒店。
在路上我也询问了律所同事的情况,才知道并非所有去过餐厅的人都被判定为密接,而是流调人员看了餐厅视频监控把密接范围缩小到了可控范围。这也就意味着被判定为密接的人,确实存在较大的感染风险。得知事情的来龙去脉后,我并没有一丝紧张或焦虑。一方面,跟师父说明了我的现状;另一方面,让单位同事帮忙把我的办公电脑寄到了酒店。此时的焦虑和惶恐,除了与内心的另一个自己共鸣,毫无裨益。密接也好,确诊也罢,这些事实我没法去改变,总不能让时光倒流、周一的中午不去吃饭吧。既如此,不如妥善处理好因此带来的影响,用最好的心态去接纳当下。就像朋友所说,终于可以好好休息一下了,就当做是强制休假了。当然,还是要工作的。对此,也很感激帮我寄电脑的同事、帮我协调取电脑的防疫工作组专班人员。
从2020年1月23日武汉封城至今,疫情已经影响了我们国家、我们社会、我们每个人近三年。这三年,有企业关停、有人失业、有人逝去,有理解和不理解,但是可以肯定的是,防疫工作已经从最开始的摸索阶段变成了如今的有体系有规范有成效的“动态清零”机制。个人有压力,国家更有压力,国家已经做得足够好了,面对疫情突发,个人的情绪管理显得尤为重要,保持内心的从容,大概是最好的方式。
防疫如此,工作和生活也是如此。
听闻现在年轻人的状态,时常充斥着焦虑和压力。其实,一代人有一代人的使命,一代人有一代人的担当,每个人身上都背负着各自的责任和压力。如果说压力还能转化为动力的话,焦虑则百害而无一利。面对未知、面对挑战、面对不确定性,如果我们能够通过自己的努力或者借力左右其结果,那就好好努力、设法借力,如果最终的结果自己无法左右,只能与自己和解、坦然接纳。
今年11月初,我裸辞了。年底不好找工作,这大概是职场的共识,但我还是选择了辞职。对于能否找到工作、能否找到一份好工作,我是丝毫没有把握的。但人总不能坐以待毙,我选择了好好完善简历、多渠道地投递简历、好好准备面试,尽力去做好这些现阶段我能做的,毕竟,我也只能努力地去改变能改变的。至于未来的东家觉得合不合适、硬性条件是否满足,我无法左右。努力过之后,至于结果其实已经不重要了。与其陷入失业的焦虑之中,不如把它当做是一次长假,韬光养晦。我也有考虑过,如果最后真的没有找到合适的工作,那就过完年再说吧,天塌不下来。幸运的是,不久之后便入职了信达律所,更幸运的是遇见了我生命中的贵人——曾律师。
堵不如疏,面对世事的无常,我个人认为这是最好的方法论。如果内心有萌发焦虑的倾向,就引导它流出去,保持一个开阔的心灵空间,而不是积压在心底。“祸兮福之所倚,福兮祸之所伏”,既然祸福无常,我们某种程度上就不应该太过于上心,做一个内核稳定的人。这种内核稳定,来自于保持与外界的距离感,去留无意、宠辱不惊,最终取决于正确的认知,毕竟,要避免走向另一个极端——麻木。
不管是面对日常的琐事、家庭的压力、工作的困扰、生活的波折,还是未来的不确定,当我们能够改变的时候,就低下头沉下心默默努力,去改变既往和眼前的不堪,当我们无论怎么努力也改变不了什么的时候,就用最好的心态去接纳当下。人生短短不过数十载,昔日光景,不复当初。与其让焦虑、抑郁占据大部分光阴,不如用这些时间去做自己喜欢的事、去陪伴家人、去爱你所爱。
昨夜的梦
这是一个春节,按照惯例,大年初一给爷爷奶奶拜年。我从田间小路抄近道过去,于是提前来到了奶奶家。送奶奶小礼物,然后聊起了家常。没多久,“大部队”就来了。上午我们要去祭祖,回来后就帮着忙活。忙活过程中,奶奶问了一句:“下午打算干嘛呀?”我和几位发小一致回答说:“打麻将”。说完之后我数了数人数,就连我们这些小朋友也能凑三桌。然后接话说:“我们小朋友就有三桌噢!”奶奶回答说:“没问题,找邻居家借麻将和桌子就好了。”一家人说着笑着,每个人的脸上都洋溢着幸福的神情。
这是昨晚的一个梦,趁着记忆清晰就此记录了下来。这也是曾经存在过的年味,那时候我们都还小,父辈们也都在故乡种地,虽然日子过得寒苦了些,但年味十足、情谊十足。
今朝梦醒,恍如隔世。年迈一点的亲人相继过世,我们的父辈们陆续都出去打工了,而我们,也渐渐长大,在所谓的大城市里面游离着。故乡,便成了老人们的空巢。最近几年春节回家,曾经的那群人,再也没有聚齐过。
毕竟,在农村种地,就会有忙月和闲月之分,过年这段时间,那就有足足2个月的悠闲时光,走亲访友、相互串门,大多时候的感情都是这么保持和维系的。背井离乡之后,春节只有七天,农村人省吃俭用,很多时候不会选择飞机高铁或者动车,而是会选择相对廉价的绿皮火车。这样,来来回回在路上的时间就有4天,真正在故乡相聚的日子,可能就只有那么三四天。在外务工不比在老家务农,时时刻刻都有规矩,从未受过约束的父辈们是多少会因为自由受到限制而觉得身心俱疲的。
于是,春节假期为数不多的日子,除了去看看各自的父母,稍微远一点的亲戚都不会再串门了,一是没有时间,二是没有精力,三是长期没联络感情也没有那么好了。人与人之间的感情,大概都是这么变淡的。我们为了各自的伟大前程,奔赴各自的世界,在别人为我们布好的局里,我们学会了唯利是图,意识到经济基础决定上层建筑。于是,我们对于故乡的看法、对于亲人的态度,都远不如以前了。
只是,很多东西是不能用利益和金钱来衡量的。或者说,真正可贵的东西,是与金钱和利益无关的。这大概就是我们常常感到空虚和落寞的本因了,我们的灵魂深处没有了根,把社会上所谓的尺度看得太重,灵魂时刻处于游离状态,无处安放。十八线城市容不下灵魂,北上广深容不下肉身。如何在灵魂和肉身之间做一个权衡,大概是我们面临的最大难题。
今天,终于拿到了律师执业证,实现了一个小小的梦想;而在昨晚,却做了一个这样的梦。也许冥冥之中,有一种声音在告诉我,不要因为走得太远,把灵魂深处向往的快乐全丢了。毕竟,长大以后,真正的快乐就少了很多,或者说寥寥无几。
我们也是第一次来到这个世界上,很多道理,不去经历一些事情是想不明白的。就用最近很喜欢的一句话来给本文作结吧:成为有意思的人,过着令人感兴趣的生活,这并不是唾手可得的事情,而是一种重大的幸运,它的获得也像精神世界的任何殊荣一样,它来自于深深的苦难。
岁月面前我们都不是对手
——写在生命的25岁
此前的几个月,因疲于备考,无心作文。在今天,终于尘埃落定。好多人应该和我一样,受到律政影视的影响,对律师这个行业存在着诸多误解。当初选择这份职业,也许是因为误解,也许是内心的正义使然,也许是机缘,何种原因不得而知。
跌跌撞撞,还算是如愿以偿,以最快的速度实现了立下的Flag。当初,为了给这个Flag让路,放弃了很多,也暂缓了很多计划。虽然接下来还有另一个Flag,但毕竟算幸事一桩,总该欢喜一场,给自己放个假,宠幸一下自己的兴趣和爱好,把搁置的半成品完成,了却自己的一番心愿。
然而,当我专门抽时间与它们相处的时候,却发现熟悉又陌生,意料之外,情理之中,毕竟很多年之前就被告知“一鼓作气,再而衰,三而竭”。在这里,突然想到以前一位故友的留言:capture a fleeting thought。当有想法的时候,就好好抓住它吧,时过境迁再回头的时候,或许早已物是人非。
准备法考的时候,有幸听了厚大高晖云老师的理论法课程,从中学到的专业知识可能会随着时间的推移而被我遗忘,但有一段话我必将终身难忘:不要觉得网上说的什么什么时候开始都不算晚,以后你们就会明白,年轻的时候都不去学,老了更不可能,凡事都是有他自身的规律,以后年纪大了人体机能退化,记忆也会大不如前,你想学也客观不能了。
时间是个永恒的话题,第一次写它的时候我还是一名高中生,大概是十年之前,“为赋新词强说愁”,写下那篇《时光列车》。这十年,时间匆匆地告诉我,岁月面前我们都不是对手。
这句话放在过去,我只会不屑一顾,然后轻蔑地说一句:呵呵,不就是年龄大一点吗,内心永远是少年。此刻,我想说的是,强大的从来不是时间本身,而是与之相应发生变化的——你曾经熟悉的一切;年龄也从来都不是衡量一个人是否成熟的标准,关键在于你接触了多少人、见识了多少事,格局和眼界是否符合成熟的标准——世人的标准。
后来的我,喜欢用一个词,叫“蓦然回首”,我们都在怀念过去。
父亲曾是村里舞狮队的灵魂人物,各种高难度杂耍不在话下,也算得上是一名习武之人。而我对于他的印象也尘封在他过去的力拔山河之时。时间最爱胡闹,未经任何人同意,就把一切都改变了。再见到他时,头发愈发稀疏,牙齿也坏掉了几颗,脸上的皱纹更是越来越深。我爱吹空调盖被子,这大概是年轻人公认的最舒服的睡觉方式。为了多陪陪我,父亲和母亲决定在酒店陪我住一晚,广州太热,我自然一进房间就把空调打开了。第二天,父亲就开始流鼻涕、打喷嚏,我想,大概就是年纪大了,受不了寒。再想到从前,老家是在长江边上,父亲可是经常冬泳的人。很是讽刺,短短不过一年,时间就轻而易举夺走了这一切,寂静无声。
我想,除了容貌上的变化,心智的改变更让人扼腕叹息。“聚是一团火,散是满天星”这大概是对同窗最美好的形容和祝福了。只是,我们真正彼此告别之后,是否成为了那满天星光?我们心中各有答案。“恰同学少年,风华正茂;书生意气,挥斥方遒”,是啊,我们都曾是意气风发的少年。在我们奢侈地干完几桩桩坏事之后,在我们发现理想和现实的差距之后,在我们全力以赴却终究没能如愿以偿之后,心中原有的那股澄澈的意气是否依然激荡在我们心中?恐怕,工位上一道道呆滞的目光已经给了我们答案——恍惚间看到一个个死去的灵魂。以前那个有棱有角的少年,如今似乎也学会言不由衷了。
渐渐明白,自己不是万能的,学会了与自己和解;渐渐明白,有天赋有能力还很勤奋的人有很多很多,顺势而为抓住机遇比天赋、能力、勤奋甚至更重要;渐渐明白,那些我所看重的东西,在很多人眼里一文不值,选择是一门看似简单却暗藏玄机的学问......
“说好的,大写的,渴望的明天,要赢过全世界;
不过一眨眼,还没发现,青春早已蜕变。”
二十五岁,新的征程。向前走吧,不必回头,往日种种,早已物是人非。也不必追光,去成为光。不管怎样,祝自己生日快乐。
伟大与渺小
回家的时候,起风了。春天来了,一切看起来都那么平静而美好。
下午的时候,有一同事爆料,新入职的谁谁谁跟新入职的谁谁谁在河边牵着手呢。于是,办公室里的时间,在八卦与笑声中流逝地飞快。前辈们回想起青春校园时光,我也暗自羡慕和祝福着这对新人。
羡慕,倒不是因为一见钟情的爱情,而是因为他们还那么年轻就拥有安稳的工作。虽然这样的工作,我也曾经拥有,但并不是每个人都有选择走下去的权利和自由。在这个快节奏的时代,爱情和面包能同时兼得,实属不易,值得庆幸。
在听罗翔老师讲授刑法理论时,心中燃起了法治之光。在看完《我们与恶的距离》之后,心中更加坚定律师梦。欣赏完崔英杰案的辩护词之后,就真正在刑辩律师的这条路上,一步一步,走着。
眼中有正义,心中有热血,周遭的一切不堪在梦想面前便显得微不足道。是啊,认准一件事,就会义无反顾。还记得第一次看刑事卷宗时,把卷里的每一个角落,甚至页码都逐一翻阅过。虽然当时理论功底有限,办案经验不足,但单凭满腔热血,也让我把工作完成得很好。后来陆陆续续参与过很多刑案,每次写的辩护词、法律意见等文书,都得到了师父的肯定。为此,我会窃喜许多天。
特别是在针对个案进行法律分析时,恍惚间觉得自己手持利剑,可以斩除人间一切邪恶。其实,即使是现在看来,也不觉得当时的自己幼稚,毕竟那是第一次切身感受到刑事辩护的魅力。就这样,在口诛笔伐的战场上驰骋着。
那时候,感触最深的一段话:“你们必须经受各种痛苦的经历,背最厚的书,参加最难的考试,忍受最低的一次就业率,更重要的是,必须在精神上脱胎换骨。法学是成年人的工作,如果不快点毁掉你们的童年,你们怎么真正成熟!法学是统治者的事业,如果不毁掉你们的平民心态,怎么能进入领导者的行列!法学是研究人性恶的科学,如果不深刻地直面邪恶,你们又怎么能彻底地明白正义!”
在偌大的法律职业共同体中,我是平凡的。在直面邪恶维护正义时,却又倍感伟大。从一开始,我就知道,这条路走下去很艰难、很艰难。还记得律师协会给我们培训时,其中一位资深律师,因为同时也是校友,所以我印象很深刻,说过这样一句话:“如果没有一点点理想主义,在律师这条路是走不下去的。”因为心中有爱与正义感,对于前路未知的艰险,从未有过畏惧。
出地铁的时候,突然下起了小雨。
离住的地方还有一段距离,我一如既往地享受着这片沉寂的夜色。下班前我被告知,下周我将要回到最初的起点。这一消息如晴天霹雳,让我寝食难安。心中没有神明,我只好问自己:是否走错了路?我没有回答,因为我不知道答案,也害怕知道答案。
生活一直很讽刺,不是吗?想下海的人下不了海,想上山的人上不了山,运气总是把我们的梦想莫名其妙地推给别人。
还记得当初梦碎时,写了这样一段日记:
“18:39,回到律所,办公室桌上的刑事卷宗在安静地等着我。
好像也对我说了句再见,于是,我抱着他们放回了师父的屋子。
不属于我的,都一一退还;属于我的,也都一一带走。就这样,理想的工位,没能坐上两天就要告别。
似乎突然间理解了田维在博客中写到的:有些梦,还没来得及去实现,就匆匆被击碎。
如果可以选择,如果早知如此......可惜,没有如果。
还是余华先生说得好:永远不要相信苦难是值得的,苦难就是苦难,苦难不会带来成功。苦难不值得追求,磨炼意志是因为苦难无法躲开。
当把一抽屉办公用品装进书包,把电脑合上屏幕,我明白这一刻,意味着梦想又一次被亵渎、被践踏。
因为我足够卑劣,所以没有追逐梦想的权利。使劲浑身解数,也不过是跳梁小丑罢了。
到底要笑得多虚伪,才能融入这世界。”
其实今天的心情,与当时很相似。经历一次苦难,心中就会生起一层茧;经历多了,茧就自然厚了。所以,今天虽然很难受,但没有当时的情绪那么激动了。“这个孩子多懂事,一定吃过很多苦吧。”我终于明白当初看到这句话时为什么会动容了。
所谓的梦想,就像翅膀一样,被无情地折断,而后愈合,而后再被折断,而后再愈合,如此反复,千千万万。也许有一天,它会像雄鹰的翅膀,自愈后变得更加坚挺有力。也许有一天再也没有了飞翔的勇气。
真理和正义是存在的,但只在炮弹的射程之内。如果渺小如蚍蜉,永远撼动不了树,只能在自己的世界里,浮浮沉沉。
我也不知道将去何方,但我已在路上。
第四十四次日落
梧叶寒声,晚风留痕。
翻开博客,瞟了一眼上篇文章的发表日期,才发现已经两个多月没写文章了。其实也并非没有什么值得写的事情,最近这段时间,发生了很多事情,只是不如意事常八九,可与语人无二三。
今天回家的时候,在地铁上看到一位老伯伯带着两麻袋行李,一袋是棉絮,另一袋大概是衣服之类的。可能因为已经很晚了,地铁上不算拥挤,甚至还有少量的空位。不太累的话,我更喜欢站着,总觉得这样视野更广阔,可以看看人间百态。
可能是担心弄脏了座椅和左右的人,也可能担心自己占用太多空间,老伯伯没有坐在空位上,而是选择席地而坐,蜷缩在角落。我看着他,就像看着自己的老父亲。高中那会,父亲一个人去大城市闯荡,多少苦寒,不言其中。其实我总逃避这些过往,不敢去想的。
地铁到了终点站,没想到老伯伯也跟我一样在终点站才下,竟有一丝“同是天涯沦落人”的悲悯。我故意放慢脚步,目视着他回神、起身、扛上行囊、远去。虽然衣服上有不少尘土,步态蹒跚,但从他的眼神看得出内心的坚定和笃行。年纪越大,越容易为这种真心和无畏所动容。
地铁站离住的地方不算远,大概1公里左右,虽然有很多共享单车,但我还是更喜欢步行回去。这条路上的日出和黄昏都很美,来往的人不多,很适合放空自己的思绪,偶尔我也爱练练歌,反正也不用担心别人觉得难听或者是打扰到别人。走在这条路上,就会卸下所有伪装,立刻成为一个无我的修行者。
当然,走在这条路上不乏孤独和茫然。
看着昔日的发小都陆续步入婚姻的殿堂,看着往日的同学都渐渐安居乐业,看着父母那望子成龙的眼神,看着同行们高歌猛进的事业,而我,竟如死水般沉寂,自然免不了百感交集。
焦躁如海潮般涌来,就容易乱了方寸,背离自己的初衷。所幸,有朋友及时劝慰自己:“我们这个阶段的每个人都在迷茫,都有疑惑和不知从何谈起的压力,时代可能塑造了这样的我们。可是如果我们80岁了,回头看看时光都用来自怨自艾或者难过,或者麻木了,会比今天更后悔的。为了成为快乐的老人,为了成为幸福的自己,要去想幸福的事,做让自己感到有意义的事,什么生活都会有的。”毕业以后,我们就很少过问对方的生活,偶尔能够通过微博看到彼此的近况。其实,比起读博,我这点焦虑又何足挂齿呢。
有时候会和朋友去海河边散步,也算是扪心自问,明明那么多的选择,我们为什么要选择一条孤独而艰苦的路。其实我们心里都有答案,只是当浮躁之风袭来,内心不够坚定,自然容易动摇。
偶然间读到张曼娟的散文《世界不同于想象》,里面有这样一段话很是治愈:我并不希望你对世界失望,只是想告诉你,正因为人不一定都很良善,所以,感觉到他人的善意,使我充满感激。当我想飞翔,发觉羽翼之下有风;当我疲惫降落,能有温暖的怀抱憩息。我知道自己满身缺点和瑕疵,却仍有人愿意爱我、包容我,使我更有勇气面对那些冷酷的时刻。这世界确实不同于我们的想象,我们因此学会了珍惜与感谢。
人生天地间,忽如远行客。
我是一个理想主义者,当自己的梦想被亵渎、被践踏的时候,心会如刀绞般阵痛。每当读到温暖的文字,每当遇到温柔的人儿,心又会如春风微拂。大概渐渐看出“少年不识愁滋味、为赋新词强说愁”的苦笑,渐渐明白“人有悲欢离合,月有阴晴圆缺”的无奈,渐渐读懂“孤舟蓑笠翁,独钓寒江雪”的孤危,人生或许本就充斥着惊喜与落寞。从尘土里来的人,大概最能理解开怀大笑背后的酸楚,也知道真心和无畏是面对不完美人生的最好办法吧。
欣赏夕阳的清辉并不是我唯一的消遣,但小王子说当人们感到忧伤时,他就会喜欢看夕阳下山,落日确实很应景,虽然在这个星球上并看不到四十四次日落。
文化人的游记
null
林老师是搞文字工作的,也就是昨天我那篇游记中同我在溜溜城门口高歌的眼镜帅哥。平日里和我们相处都是骚、浪、贱三字的代名词。但是从人潮里褪去后确是一个感情细腻敏感的小伙子。
下山回来后我们便怂恿他写一篇小作文,本来他还傲娇着不愿写,不过坳不过大家起哄,今天上午摸鱼着写了此文。
觉得写的真的非常好,便转载到我的博客,希望大家喜欢。
作者:林老师 昵称:向露冷风。
我在浪漫的康定,把一首又一首浪漫的歌谣唱得支离破碎。
街灯在湿漉漉的玻璃上晕开,模糊成一片流动的暖黄。
那黄光里,似乎还摇曳着方才溜溜城台阶上未尽的喧嚣与歌声。
夜中的溜溜城,萨克斯的乐声便在这片暖色里流淌,铜管映着溜溜河的奔腾泛着温润的光泽。
吹奏者是个头发凌乱的中年汉子,似若雅典城里诵讲史诗的吟游诗人,闭着眼,嘴唇贴着吹口,指头在按键上起伏跳跃,乐音便自那铜管中汩汩涌出,缠绵又悠长,仿佛将整个高原的辽远与寂寥都含在了唇齿之间。
乐声拂过我的耳际,又飘向更远处,在暮色里织成一张无形的网,笼住了台阶上散坐的人们。
我坐在溜溜城大门的石阶上,身下石阶的凉意透过衣裤渗入肌肤。
眼前人影晃动,如溜溜河水流淌不息。
有背着行囊的旅人步履匆匆,眼神里装着远方;有穿着艳丽藏袍的各地姑娘走过,银饰叮当,裙裾旋起一阵风;还有男人牵着女人的手,慢悠悠踱着步子,影子被斜灯拉得很长很长。
台阶之上,众生百态,各自背负着各自的故事,匆匆交汇,又匆匆离散,仿佛高原上倏忽聚散的流云。我坐在这台阶,恍若人世一个小小的渡口。
伙伴们终于从四面八方汇拢过来,脸上都带着风尘仆仆的笑意。
我率先起头,那首熟稔的调子便从唇边溜了出来:“跑马溜溜的山上……”声音起初还有些拘谨,如同试探着伸出的触角。
很快,第二声、第三声便汇入进来,如同涓涓细流汇成了奔涌的河。
我们彼此相视,眼神里跳跃着一种心照不宣的火焰,声音便愈发高亢起来,毫无章法地冲撞着暮色,撞向溜溜城古老的飞檐斗拱。
那歌声,莽撞、粗粝,却又带着一股莫名的、近乎悲怆的欢喜。
我们这群滴酒未沾的人,竟醉得东倒西歪,脸颊滚烫,胸腔里仿佛有滚烫的酥油茶在翻腾。
这醉意,并非源于杯中之物,而是从心底深处蒸腾而起,在高原微凉的晚风里发酵、弥漫,将灵魂都托举起来,飘飘然不知归处。伙伴们终于从四面八方汇拢过来,脸上都带着风尘仆仆的笑意。
坐进出租车回住处时,那莫名的醉意仍未消散,反而在狭小的车厢里愈发浓烈起来。
我们像一群挣脱了缰绳的马驹,将一首又一首的歌谣,不管不顾地抛向窗外飞逝的夜色。
从古老民谣到流行小调,从慷慨激昂到低回婉转,歌声在车厢里横冲直撞,几乎要掀翻车顶。
司机师傅笑着,也不时应和几句,任这些樊笼中呆久了的人在另一个樊笼里沸腾。车窗外,康定城的灯火渐次入目,又渐次被抛在身后,成为记忆里模糊的光斑。歌声穿透车窗,在高原清冽的夜气里飘散开去,仿佛一群不知疲倦的夜鸟,扑棱棱飞向墨蓝的夜空深处。
那一夜,我们唱着支离破碎的歌谣,送给了支离破碎的自己。
翌日清晨,我们便向着白海子进发了。
山路崎岖,如同大地裸露的筋骨,蜿蜒着伸向云端。
起初伙伴们尚能谈笑,脚步也轻快。
渐渐地,空气变得稀薄而清冽,每一次呼吸都仿佛在肺腑间刮起一阵小小的风暴。说话成了奢侈,只听见粗重的喘息声和登山杖叩击石块的笃笃声,单调而固执地敲打着寂静的山谷。
那日天气不错,云雾随风聚散,远处雪山时隐时现,由海子始出,逐渐奔腾而下的河流与日光冲撞出一缕彩虹。
越往上攀,同伴步履越是滞重,双腿如同灌满了铅水。
偶尔抬头,前方是同伴沉默的背影,更远处,是雪山肃穆的轮廓,在稀薄的空气中泛着冷冽的蓝光。
山风呼啸着掠过耳畔,带着刺骨的寒意,刮得脸颊生疼。
我们埋头跋涉,像一群沉默的朝圣者,用脚步丈量着通往天际的距离。
终于,当最后一道悬崖被踩在脚下时,一片巨大的、凝固的蓝,猝不及防地撞入眼帘。
白海子静卧在群山环抱之中,宛如天神遗落的一块寒冰,又似大地睁开的一只冰蓝眼眸。
湖水澄澈得令人心悸,倒映着四周皑皑雪峰和头顶无垠的碧空。
那是一种摄人心魄的蓝,深邃、纯粹、凛冽,仿佛吸纳了世间所有的寂静与永恒。我站在湖边,渺小如尘埃,方才攀登的艰辛与喘息,瞬间被这无边的澄澈与宁静吞噬、抚平。
风掠过湖面,漾起细碎的涟漪,阳光碎金般跳跃其上,又无声地沉入那亘古的蓝里。
雪山巨大的倒影在湖水中微微晃动,仿佛另一个沉静的世界。
那一刻,时间仿佛凝固了,人世的喧嚣与昨夜的歌声,都成了遥远模糊的背景音。
山上我们无耻地蹭着另一行人西瓜、螺蛳粉、泡面、卤肉,欢快地谈聊,他们与我一样自成都而来,后来又在成都的群里相遇。
但山神似不喜这般的喧闹,云雾弥漫山间,无奈只有下山了。
下山的脚步轻快了许多。
背包里似乎还盛着白海子的一捧清寒,沉甸甸地贴在背上,随着步伐微微晃动。
山风依旧在耳畔呼啸,却已失却了攀登时的凌厉,变得柔和起来。
我回头望去,白海子那抹幽蓝已隐入层峦之后,只留下雪峰之巅一点永恒的洁白,在碧空下闪耀。
回到喧嚣的人境,那高原的风,雪山的影,湖水的蓝,连同溜溜城台阶上无端而起的醉歌,都沉淀为心底深处隐秘的矿藏。
当市声如潮水般退去,寂静降临,耳畔便会幽幽响起那萨克斯的呜咽,它不再仅仅是一段铜管的震颤,而仿佛化作了山巅永恒吹拂的、清冽而自由的风——它掠过经幡,拂过玛尼堆,最终悄然潜入血脉,成为灵魂深处一声无人听见的、悠长的回响。
MinIO最新社区版砍掉 Web 管理功能
近日,MinIO 社区版迎来重大更新,删除了 11 万行代码,彻底移除 Web 管理控制台功能,官方称此举为“精简代码,专注核心存储功能”。这一决定引发社区热议,对用户体验和项目生态造成显著影响。本文将深入剖析这一变化的细节、影响及社区反应。
Web 管理功能移除的影响
MinIO 作为一款高性能分布式对象存储系统,因其 S3 协议兼容性和易用性深受开发者喜爱。其 Web 管理控制台是社区版的核心功能,支持存储桶管理、文件浏览和权限配置,极大降低了操作门槛,尤其适合:
- 非技术用户:通过直观界面快速上手,减少对命令行的依赖
- 团队协作:便捷管理存储资源,提升效率
- 实时监控:查看文件列表、使用量等存储状态
然而,新版本将 Web 控制台的核心管理功能(包括用户账户管理、访问策略配置、存储桶管理和系统配置)全部移除,官方推荐使用 mc 命令行工具替代。相比可视化界面,mc 命令行工具对新手不够友好,且在快速调试和监控场景下效率较低。
新老控制台对比
被移除的具体功能
此次更新几乎清空了 Web 管理控制台的功能,仅保留基本的对象浏览能力。以下是主要受影响的模块:
- 账户与策略管理
- 移除用户账户创建、访问密钥管理和策略设置功能
- OIDC 单点登录等高级认证功能被砍,用户只能使用管理员初始账户登录,无法通过界面创建新访问密钥
- 配置与集群管理
- 无法通过界面查看或修改服务器配置、后端存储设置及集群状态
- 所有实例调整和服务监控需依赖命令行或 API
- 存储桶管理
- 删除新建存储桶、设置策略、版本控制和生命周期规则的界面功能
- Web 界面退化为纯对象浏览器,仅支持列出存储桶及文件
- 其他功能
- 服务器信息仪表盘、多节点集群视图、日志和通知配置等管理功能全部移除
简言之,新版 Web 界面已不再是管理控制台,而是一个功能极简的文件浏览器。用户被迫转向 mc 命令行工具完成所有管理任务,操作门槛显著提高
受影响的版本
- 2025.4.22 版本是最后一个保留完整控制台功能的版本, 可用镜像
ccr.ccs.tencentyun.com/k7scn/minio:2025.4.22
- 2025.5.24 版本则包含了删除控制台功能的改动(MinIO 官方在发布说明的 “重要事项” 中明确提到嵌入式 Web 控制台(Console)已被弃用,并移至独立的 object-browser 项目)
社区反应与讨论
MinIO 官方称,删除 11 万行代码旨在优化性能、聚焦核心存储功能。然而,Web 控制台资源占用较低,维护成本有限,社区对这一理由普遍质疑。相比之下,MinIO 商用版保留了完整的 Web 管理功能,功能更强大,引发了“社区版精简是为了推销商用版”的猜测
X 平台和 Reddit 等社区反馈显示,开发者认为这是开源项目商业化的常见策略:通过削减免费版功能,引导用户转向付费版本。部分用户甚至称此次更新为特洛伊木马式更新,批评官方未提供过渡方案,给中小团队带来额外适配成本
作为回应,社区迅速行动:
- 启动 OpenMaxIO 分支项目,试图恢复被移除的功能
- SeaweedFS 和 Garage 等替代方案获得更多关注
结语
MinIO 社区版移除 Web 管理功能的决定,削弱了其易用性和吸引力。开源项目的核心在于平衡社区需求与商业利益,MinIO 的后续决策将直接影响其在对象存储领域的地位。对于依赖 Web 控制台的团队,建议暂时停留在 2025.4.22 版本,或探索其他替代方案。
欢迎关注,可以看看我郑再打工每天都在折腾什么。

《漫威银河护卫队》,一段美妙的太空冒险
多年以前在epic领取的《漫威银河护卫队》,碍于对漫威没啥兴趣因此一直没玩。最近有些闲余时间,因此下下来仔细的品一品。
想不到游戏优化异常很棒,手感和画面和以前玩的《星球大战™:前线™ II》很像,但是是剧情类的游戏,因此决定慢慢玩玩看。一开始吸引我的其实是主角团的对话内容,配音很出色仿佛像是在看电影一样。剧情也很不错,很少吸引人。唯一美中不足的地方是放技能按键太繁琐了,也不方便选中敌人。不过也还好全程普通难度通关。不过游戏玩法上确实也是有些单一,只能控制星爵,其他角色也不能控制,另外也就是那些敌人,花样不多。但是能打两把空战还是挺不错的。
{cat_gallery}
{/cat_gallery}
玩了一半的时候感觉还不错啊,打算把电影补一补,哇,除了主角其他角色都选的好丑啊qaq,这时候才发现游戏的建模确实不错。比如像《战神》里面奎托斯的德拉克斯和像《命令与征服-红色警戒2》里的尤里的瑞克,以前其他角色比如曼蒂丝、怪物女王等都是颜值在线。另外电影剧情有些迷,并没有游戏好,有些失望。
游戏流程不到20小时,还是很值得体验的!
镜头与代码的交响:打造个人线上画廊与假期随笔
该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/notes/193
这些天,日子很短。却过得很有意义。
Vibe Coding: 线上画廊
自从前段日子买了一台相机之后,出门的欲望也多了不少,到哪都要拍几张。日积月累想要做一个展示一些成片的地方了。不少大佬都会有一个属于自己的网站展示,因此萌生了一个想法,也做了一个。
本次开发基本全程使用 claude-4-sonnet。花了一天时间就把模子刻好了。
:::gallery
:::
这是一个雏形。
后来,我开始研究图片预览的高性能方案,又引导 AI 写了一个基于 LOD 方案的 WebGL 图片预览器。即便是预览一张使用哈苏 X2D 拍摄的一亿像素的图片在缩放和加载也不会卡顿。
接入了 Live Photo 的播放, 也是通过这个了解到 WebCodecs API,使用它对 mov 视频转码然后播放。
接入了 HEIC/HIF 文件的解析,调用了 libheic 的 wasm 进行的转换。
而我上面做的全部一是因为偷懒,我可以直接把拍摄的 Live Photo 或者 HIF 文件放到 S3 上不需要自己的格式转换;二是通过一个项目学到新的东西。
今天我又对这个项目进行了构建优化,使用 Cluster 模式,同时处理多张图片,节省了约 3 倍的时间。而这一切都是基于引导话术 AI 进行的重构和优化。
项目地址:
https://github.com/Innei/photo-gallery
如有需要的摄影爱好者也可以试试它。
我的线上画廊:https://gallery.innei.in
后续,对项目还有更多的展望,比如动态化等等。
好友来访
端午假期,南京的朋友来这边玩了几天。一起帮拍了很多照片。去了周边的景点。
组团 Coding 和做了一顿饭。
和 @MaxtuneLee 共建 Gallery,以及未来推出的摄影工具链。
端午再游康定+看高山海子
null
没想到这个月又来了一次康定,不过这次比上次还要玩的高兴。
不过中途发生了个意外,我们有个新手队员不听劝告在上山时走了野线,差点迷路在山里。
我们在山上等了一两个小时,眼看着好像要下雨了,时间已经下午三点了,时间越晚山上的天气就会越恶劣。所以我们打算先下撤到下面的草甸去她分线的地方等待,同时在下山途中和所有能见到的人询问,并帮忙散播这个信息,好在下去后很快找到有信号的地方,而且运气很好的是她也有信号,所以第一时间联系上了她。
听她说她马上登顶了,但是她说没看到其他人,我们就知道她估计完全走错了方向,因为我们在山顶上的海子边上碰到了十几号重装徒步的人,上面闹哄哄的,不可能没人,所以立刻让他马上原路下撤,而我们则是找了两块岩石中间,拿出急救毯挡住风口生活等待,最终4点左右看到她的身影时才松了一口气。
这里告诫所有出去户外徒步的朋友,一定要跟随大部队行动,上山前掌握好基础徒步知识,如:如何看户外轨迹地图、基础求生避险知识等等。
因为端午都三天假期,所已这次的规划是两天一夜的行程,留一天假期在家里修养恢复。
因为最近四川的天气都不太好,所以我提前一个多星期就开始关注想去的景点天气,但是通过手机上自带天气软件给的天气数据,这类软件都是通过当地的气象站来给出天气数据,而我们去的山上基本上都没有气象站,而且高山地区天气变化无常,所以需要通过专业的天气软件观测云层、风向等数据进行评估。
这次用的Moteoblue和Windy这两个软件进行观测。

不过可能是他们的推测模型不太一样,Windy的ECMW模型刚开始的时候推测这几个地方没雨,但是临近出发的日子后却又提示有雨。而Moteoblue则相对稳定,一直显示都是31号和1号白天至少是阴天,没有下雨,而且圈子里驴友们都更认可MoteoBlue的数据推断。
所以我们这次的目标就定在了新榆林村的白海子和前面的野马海子。


最后出发时确定的人员有8人,4男4女,其中两位车主,一辆奥迪轿车,一辆小排量suv。其中有老朋友林老师、小罗,本来上次泸州的刘姐也想去的,但是他有事耽搁了。
行程安排如下。
- 31号早上7点出发康定,在天全休息吃饭
- 31号下午2点继续出发到第一站野马海子,这个只有200左右的爬升,权当作适应拉练。
- 31号下午5点左右下山,驱车康定新城吃饭,因为上次老城吃过找不到停车位的亏,所以打车去老城逛街。
- 逛完去民宿,休息。
- 1号早上6点起床,7点出发白海子,民宿出门几百米就是出发点,今天强度比较高7公里左右有1300的爬升。
- 1号下午2点左右登顶,然后下撤,5点左右到山脚
- 在康定新城吃个饭,然后回程,预计10点左右到家
费用明细:
- 车费:我们坐的奥迪,最终均摊下来得车费170元左右一人,那个suv应该会更低。
- 住宿费:119标间
- 两餐正餐:(351+279)/8=78.75
- 我和霜的总费用:170+170+119+78.75=537.75


行程开始。

历时5个小时,终于到康定了

马不停蹄的赶往野马海子

去往野马海子的哑口有个小海子

刚到起点便下起了毛毛细雨


1. 和林老师 2. 大家伙合照
河流和边上的乱石滩上长了很多像荷叶一样的植物

能看到雪山了,翻过去就是海子

下着小雨的野马海子别有一种特殊的韵味。


拍下了人生照片,可惜当时嫌雨大,我自己没拍单人照片。(后悔!)



营地里和其他徒步客一起休息,我老婆看到这张会杀了我吧??

海子和海子上的雪山


拍点团体照



快到出发点了



1. 林老师 2. 小罗
到出发点时发现天气晴了一点,雾气稍散



到康定城,准备找吃的。

牦牛火锅(忘记拍了,回头找其他人要了再补一张图片)
溜溜河的水流比上次来的时候急了很多。

当了一回卖唱歌手😄,倾听地址:
3.07 复制打开抖音,看看【跨过远山而来的风的作品】在康定当了一回卖唱歌手 😄 # 山丘 https://v.douyin.com/CmP946UHSjI/ OXM:/ 05/11 j@c.an

秀个恩爱

林老师有点EMO,所以陪他在康定城门口放肆高歌。
之后便去了民宿,因为玩的太嗨了,忘记拍照了。
第二天7点出发白海子

.jpg)
开始进入树林
.jpg)
杜鹃花开的很漂亮

拐过一个路口霍然开朗,云层也渐渐散去,几座不知名雪山出现在视野里,出太阳拉!!


峡谷里的雾被风渐渐吹走


爬过一个绝望坡,合个影。

山谷全景

太阳通过树枝,让这里像是时空隧道


喝个水

到达河谷路段


又一个绝望坡

能看近距离看到雪山了


这里上去就是一个大草甸

高山草甸,这里是有虫草的窝。

远处的雪山

爬爬爬,没完没了的坡,爬升比勒多曼因可多的多。

路边的小黄花

让花和雪山和个影

翻过这个坡就到了

最后时刻
白海子近景

运气真的很好,一直都有阳光。

人生照片,我怎么这么帅!

哈哈,出发前在抖音上看到的玩法,我也试试。


对了,我们还碰到了一个十几个人的重装队伍,带了好多好吃的,很热情的叫上我们蹭吃蹭喝。


体验了一次在山上乞讨,人家还给你备了碗筷,哈哈哈。
虽然一直在吃喝拍照,但是一直没忘记迷路的那个队友,我们等到三点半时山风把大雾吹了过来,天气也越来越差,我们只能先下撤到下面草甸在联系她。
运气不错的联系上了她,我让她立即原路下撤,我们在草甸这里等她。山上降温,起大雾,还若有若无的有些雨珠,也不知道她需要多久过来,所以只能先找个避风的地方生火取暖,保存体温。

等了一个多小时,终于来了,这才算是松了一口气。

这个姐姐第一徒步,冲锋衣不透气,里面的衣服也速干的,在山上要迷路了,真的是非常危险的,之后我们下山了,才发现四川的户外群里她算是出名了,各个群都在问有没有看到一个红衣服小姐姐....。
最后急速下撤,终于在下午五六点左右下撤到民宿。

抛去队友迷路这个事,这个旅程还是非常开心的,最后在起点拍个合照。

1Panel自动同步Github仓库
值得入手的Steam模拟类神作:缺氧(Oxygen Not Included)
各位小伙伴!今天给大家安利一款超硬核、超上头的模拟经营类游戏——缺氧(Oxygen Not Included)! 如果你喜欢挑战脑力、沉浸式体验和无限可能的建造乐趣,这款游戏绝对不容错过!
缺氧是由 Klei Entertainment(饥荒开发商)打造的一款生存模拟类游戏。玩家需要在一个地下星球中管理一群可爱的小人(复制人),通过建造基地、分配资源、应对环境危机,让他们在缺氧、缺食、缺电的恶劣环境中存活下来!
特点
- 超高自由度的建造体验
在游戏中,你可以自由规划地下基地,设计复杂的管道、电力和氧气系统。想建一个自给自足的生态圈?还是一个高科技的自动化基地?全看你的脑洞!从简单的茅厕到复杂的核反应堆,建造过程既烧脑又满足 - 硬核的资源管理
氧气、食物、水、能源、温度……每一项资源都需要你精打细算。稍有不慎,小人可能会因为缺氧窒息、食物中毒,甚至被高温烫伤 - 随机生成的挑战
每次开局的地图和资源分布都不相同,随机事件(如陨石雨、火山喷发)让每一局都充满新鲜感。你需要根据环境灵活调整策略,永远不会觉得无聊 - 丰富的 MOD 支持
社区 MOD 丰富多样,从增加新建筑到优化游戏体验,应有尽有!无论你是想降低难度还是挑战极限,都能找到适合自己的玩法
我的玩法开局看水和铜多不多,不多重开
适合人群
- 喜欢模拟经营
- 热衷挑战的硬核玩家:喜欢烧脑、追求极限生存
- 创意玩家:想打造独一无二的地下乌托邦
当然耐心很重要, 同时要有自我控制能力,因为很容易肝上头
入手性价比
推荐直接购买缺氧完整包, 我上个月入手大概不到 90CNY。
推荐购买正版,请勿相信廉价购买,谨防虚假入库,导致游戏和钱两失。
新手建议
- 前期多关注氧气和食物,善用“暂停”功能规划基地
- 游戏上手稍有难度,但官方有中文支持,社区教程也超多,入门后根本停不下来
- 多在 B 站搜搜相关教程
- 早期多重开几次就会玩了。
官方介绍节选
- 建立广阔的基地以及探索生存所需的资源:
从挖掘、资源分配到管道、电力系统,太空殖民地的一切都在你的掌控之下。然而,资源会从你第一次呼吸开始被消耗 ,所以如果你想生存下来的话,就一定要确保你探索得够快。
- 伴随着压力模拟的精神状态问题
给你的殖民地提供娱乐休闲活动、优越的住宿条件和更好的食物,来保证生存不会受到精神状态的影响。每个复制人之间都有差异,会对压力做出不同的潜在破坏性反应。 所以不管付出什么代价,一定要确保他们拥有愉悦的心情
- 用复杂的气体和液体模拟系统来提高效率
建立一个连锁的管道系统,可以迅速的将燃料和液体输送到基地的关键区域。优质的规划以及获得的加成可以让你的殖民地转变成一个运转良好的不朽机器
- 通过电网模拟系统来获得电力:
你可以通过众多不同的能源来获得电力,包括煤,氢,天然气或者仅仅是朴实老旧的油脂。修复电力流失,电路过载和崩溃问题以保持你殖民地的顺利运行
欢迎关注,可以看看我郑再打工每天都在折腾什么。

Lucky-canvas 抽奖插件折腾记
基于 「Lucky-canvas」 抽奖插件,借助 字节跳动 trae 做了个大转盘,全屏显示、替换背景、概率设置、一键导入、边框修改等能想到的和需要的功能都已实现,效果远超预期。
使用手册 📚
1.打开网址, 右下角“全屏按钮”,右上角是“设置入口”。点击中间开始转动,结束时会弹出中奖内容,并伴有撒花。
2.右上角点击进入“设置”。首次打开,点击安装字体“Aa 年度最可爱”。
3.设置分层两列,左侧显示的奖项名称、中奖概率,可以直接修改或删除。说明:某一奖项的数值是这一项中奖率的“分子”,所有数值总和是“分母”。如“棒棒糖”的中奖率设置的 15,则中奖率是
15/(10+10+……+15+10+10+5)
4.左侧奖项列表下方是 4 个按钮。顾名思义,第 1、2、4 项试试就知。说明一下第 3 项“上传配置”,采用了“上传 txt 文件,一行一条内容”的形式,一键导入。如:本地新建了以下内容「姓氏+空格+中奖数值」
张 1
王 1
李 1
田 1
柳 1
石 1
点击“上传配置”,选择 txt 文件,导入即可。所以,如果要换电脑快速导入,只要编辑保存好自己的“奖项.txt”到别的电脑,导入即可。
5.配置右侧,点击可更改转盘配色、指针、内外层转盘背景。
随心搭配,换着玩儿~
致谢
🎉
轻松管理K3s集群服务:System Upgrade Controller 的超实用指南
K3s 作为轻量级 Kubernetes 发行版,以其高效、简洁的特性深受开发者与运维人员喜爱。但手动升级 K3s 集群可能是个繁琐的任务,幸好有 System Upgrade Controller!这个工具能让你的 K3s 集群实现自动化、无宕机升级,省时又省心。本文将带你了解 System Upgrade Controller 的魅力,并提供简洁的部署步骤,让你的集群管理更轻松!
主要用于升级 k3s 集群节点上的服务,不仅仅局限于 k3s 服务本身。
简介
System Upgrade Controller 是 Rancher 开发的一个自动化升级工具。它通过 Kubernetes 原生资源(如 Plan)管理节点和 K3s 版本的升级,核心优势包括:
- 自动化:一键配置,自动完成 K3s 版本升级
- 零宕机:逐节点升级,确保服务不中断
- 灵活性:支持自定义升级策略,适配各种集群规模
- 轻量高效:与 K3s 的低资源占用理念完美契合
如果你想让 K3s 集群保持最新或者减少运维负担,绝对值得一试!
项目地址:
在 K3s 上部署
以下是快速部署 System Upgrade Controller 的步骤,简单易上手
kubectl apply -f https://raw.githubusercontent.com/rancher/system-upgrade-controller/master/manifests/system-upgrade-controller.yaml
或者
kubectl apply -k github.com/rancher/system-upgrade-controller
服务控制器默认会部署到 system-upgrade
命名空间下
kubectl get deploy -n system-upgrade
NAME READY UP-TO-DATE AVAILABLE AGE
system-upgrade-controller 1/1 1 1 335d
使用场景
常见使用如下,由于权限极高,操作时需要确保重复执行没影响。
- 升级 k3s 本身
- 升级 k3s 集群节点服务
升级 k3s 服务
由于我现在的环境特殊,只有一个 master 节点,每次跨版本升级 master 节点都是先手动升级到最新版本,然后在使用下面的命令升级计算节点。(保障至少 1 个控制节点版本是最新的)
---
apiVersion: v1
kind: Secret
metadata:
name: k3s1306
namespace: system-upgrade
type: Opaque
stringData:
upgrade.sh: |
#!/bin/bash
set -x
binfile=$(command -v k3s)
$binfile -v | grep "v1.30.6" && (
echo "done"
exit 0
) || (
wget https://c.ysicing.net/oss/tiga/linux/amd64/k3s
chmod +x k3s
mv k3s $binfile && systemctl restart k3s
)
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: k3s1306
namespace: system-upgrade
spec:
concurrency: 3
nodeSelector:
matchExpressions:
- {key: kubernetes.io/os, operator: Exists}
tolerations:
- {operator: Exists}
serviceAccountName: system-upgrade
secrets:
- name: k3s1306
path: /host/run/system-upgrade/secrets/k3s1306
cordon: false
version: latest
upgrade:
image: hub.ysicing.net/ysicing/debian-upgrade:20230909
command: ["chroot", "/host"]
args: ["sh", "/run/system-upgrade/secrets/k3s1306/upgrade.sh"]
想了解更多官方的姿势,可以参考
升级集群服务
- 升级 tailscale 服务
---
apiVersion: v1
kind: Secret
metadata:
name: ts-script
namespace: system-upgrade
type: Opaque
stringData:
upgrade.sh: |
#!/bin/bash
set -x
if tailscale version 2>/dev/null | grep -q "1.82.5"; then
echo "Tailscale 1.82.5 already installed"
exit 0
fi
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y --no-install-recommends tailscale
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: ts1825
namespace: system-upgrade
spec:
concurrency: 1
nodeSelector:
matchExpressions:
- {key: kubernetes.io/os, operator: Exists}
tolerations:
- {operator: Exists}
serviceAccountName: system-upgrade
secrets:
- name: ts-script
path: /host/run/system-upgrade/secrets/ts-script
cordon: false
version: latest
upgrade:
image: hub.ysicing.net/ysicing/debian-upgrade:20230909
command: ["chroot", "/host"]
args: ["sh", "/run/system-upgrade/secrets/ts-script/upgrade.sh"]
- 升级 easytier
---
apiVersion: v1
kind: Secret
metadata:
name: debian
namespace: system-upgrade
type: Opaque
stringData:
upgrade.sh: |
#!/bin/sh
set -e
if easytier-core -V 2>/dev/null | grep -q "2.2.4"; then
echo "easytier 2.2.4 already installed"
exit 0
fi
apt-get --assume-yes update
DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --assume-yes
curl https://c.ysicing.net/oss/scripts/easytier.sh | bash
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: debian-25021514
namespace: system-upgrade
spec:
concurrency: 3
nodeSelector:
matchExpressions:
- {key: kubernetes.io/os, operator: Exists}
tolerations:
- {operator: Exists}
serviceAccountName: system-upgrade
secrets:
- name: debian
path: /host/run/system-upgrade/secrets/debian
cordon: false
version: latest
upgrade:
image: ysicing/debian
command: ["chroot", "/host"]
args: ["sh", "/run/system-upgrade/secrets/debian/upgrade.sh"]
通过上面 3 个例子,其实就是帮你去每个节点执行相关脚本,如果你有大量类似的重复的工作,System Upgrade Controller 就是个绝佳的运维工具,它让版本管理变得简单、高效、无忧,显著提升你的运维体验。
欢迎关注,可以看看我郑再打工每天都在折腾什么。

枇杷熟了的五月月报
今年五月挺精彩,中美关税战暂时告一段落了,伯克希尔开年会了,比特币又上新高了,Google IO又来了。为了赶进度,五月真的挺忙的,这些东西也都没有怎么关注。月底也到了,博客还是要来更新一下。
杂谈
Google IO
今年的Google IO,已经过去了几天才想起来看看网上的新闻和官方的视频,因为懒和忙,也没有及时的写篇文章,想要关注信息看官网,或者中文世界已经都有很多文章了,因此我这里简单说说吧。由于Android新版本的发布节奏改变,Android方面的更新很早之前其实就已经发布了。在这次发布会上,新版本的介绍主要大的可能就是系统UI的更新,这个可以说跟小米的HyperOS更像了,而新发布的Live Notification也与国产厂商已经上线一年的新的实时通知很像,爸爸抄儿子,也是倒反天罡了。
除此之外Android上面的介绍,首先还是Compse,Compose功能和性能都有极大的提高,同时对于KMP的支持也更好,使用Kotlin做全平台开发指日可待。
整个IO,AI仍然是全场的热点,Google的模型更棒了,集成的工具更多了,google的智能眼睛又重启了。但问题是,身在中国的我们还是很难用到,各种墙以及谷歌的限制,只有尊贵的美国人才能体验到完整功能。
关于Google IO的详细可以去官网查看。
假药
因为之前在B站看到一个UP主的推荐,于是想要去买一个口腔清新喷剂,这个喷剂看许可属于一类医疗器械,因此我这里标题的是假药。这个喷剂在淘宝上是又官方旗舰店售卖的,但是本着货比三家的原则,在京东也搜了搜,结果京东的不少非自营商家的价格还挺便宜的,于是就选择了一家购买了一瓶。
无奖竞猜,上图中哪个是假货。
收到货后,发现包装的印刷质量比较差,怀疑是假货,于是问商家,告诉我请放心使用。随后又去淘宝旗舰店看了看,发现两个包装是有一些差异的,淘宝买家分享的评价里面的图明显比我这个印刷质量好多了。我购买的这个上面有个正品标识的二维码,扫码查询之后告诉我是正品,然而这个网址是一个不知名的网址,并且下面还有个给商家注册的入口。同时我又去问了淘宝店的客服,确认了他们没有这个正品验证的网址,他们的包装开口方向也与我购买的不同,因此坐实了这是假货。
而商家仍然不认同这是假货,给了我两个回复,一,商品名称和正品是一样的,二,他这个是新包装。只好选择京东投诉,上传了淘宝正品图和假货图,然后经过跟京东反复掰扯了两个星期,京东仍然回复卖家不承认是假货,只答应京东方面赔偿我商品价格,看起来是对于商家无任何处理。
同时我也在12315提交了投诉和举报,因为选择了绿色通道,结果是截止目前为止,没有任何回应。而我也没有精力和时间去找检测机构进行检测,这件事情也只能到此作罢。
在这里建议大家,京东平台而第三方商家购物需要特别慎重。特别是我这种,商家是药店,还销售假货,简直是害人。
行
月初是五一,回了趟老家,家里大旱,还在种地的很多人在抽水浇地。正值杨树飘絮,漫天飞舞的杨絮,配上干燥的天气让人相当不舒服。
以上为村子里颓败的房屋。
老家坐落在皖北平原,没山没水,也没啥历史名胜,为了发展旅游。县城搞了个遗址公园,种了许多的樱花树,清明节期间樱花盛放,此时已经全部凋谢了。因为小长假的原因,遗址公园还是围起来收费,搞了些表演,也算是吸引一些周边的人民。
附近还搞了一个县博物馆,主要展示了一些本地的历史文化和文物,虽然说不是什么珍贵文物,但是我觉得对于当地的中小学生来说还是挺好的,想我大学之前没出过本县,没见过啥博物馆,现在的小孩有这些东西可以看看。只可惜农村的父母可能也没有这个意识带小孩看这些。
本月的徒步,先是去了一次无锡惠山,早上早起出发,路上不堵,10点多就开到了惠山脚下。跟着两步路的路线走了个爱心线,这条路线比较简单小朋友跟着她的同学一起在前面走的很快,下午三点半就走完了全程。
就在上周去了苏州大阳山,出发前几天都在下雨,本以为山上会很泥泞,但是实际上没有。因为前几天下雨的原因,这天过来徒步登山的人并不多。我们开车过来,把车停到了苏州乐园的停车场,这里每小时4元,20元封顶,然而往前走的时候发现路边停车只要7块钱每次,因为懒还是没有挪车。之后遇到第二个问题,因为是按照别人路线的反穿走的,在一个门那里被保安拦住不让我们进去,说要去正门买票进去。我们只好往回走,从正门附近的一个小豁口钻进去,并且爬了一段比较难走的路才拐到我们原本要走的路线上。而实际上,大多数人走的金蛇线入口,也就是我们终点的地方这里,上山也是不要门票的。大阳山比惠山难度稍高,但是因为我们先走了2公里的公路,总里程10公里,大家走下来感觉也都不算太累。
五月份还是枇杷成熟的季节,家里人也喜欢吃,相比于苏州东山80一斤的白玉枇杷,公园里免费的枇杷虽然酸,但是也不错了。于是我们选择在周末开着车到广富林郊野公园露营摘枇杷,枇杷树有不少棵,也有不少人带着工具过来摘,我们还是收获满满。
看
这个月主要看了两本书,首先是《巴菲特之道》这本书,想到要看这本是因为伯克希尔开了年会,巴菲特宣布退休,这本书介绍了巴菲特的部分经历,他的投资原则,我也专门写了文章,感兴趣可以看看。
另外还看了一本《寻路中国》,微信读书推荐的,作者是之前在中国工作过十几年的一位美国记者何伟,书中讲述他开车在中国旅行和与人交流的故事,时间大概是在2002年到2007年之间的事情,他见到了中国的工业化进程,农村的变化等等,书的内容比较吸引人,只花了不到两个星期就看完了。
电视剧也看了两部,首先是美剧《最后生还者》第二季上线了,也就花时间先把第一季看了看,目前在看第二季了,个人感觉第二季没有第一季好看,第一季男女主一起找实验室相当于是主线,每集又有独立的剧情。而到了第二季,感觉就是你找我复仇,我找你复仇,然后有出来一大堆新的组织,越往后越有点看不动。
另外还看了去年大火的剧集《我的阿勒泰》,整部剧只有八集,第一季作家告诉女主要“去生活,去爱,去受伤”,之后就是女主在草原生活的故事,最后结尾也算是happy end,不过我感觉可能留一点遗憾或许会更好。另外就是这部剧的画面很好看,草原加雪山真的很美,想要去新疆看看,可惜是很难请个长假。
尾声
五月工作上挺忙的,但是并没有啥产出,并且被谷歌爸爸卡着公司的产品也没法发布,希望六月能够顺利一点。至于我上面的胡言乱语,你就当耳旁风😄。
看完评论一下吧
优化Typecho的思路
AI摘要:文章介绍了优化Typecho博客性能的多种方法:1)服务器端使用Nginx开启gzip压缩和浏览器缓存;2)图片优化采用原生JS实现懒加载;3)通过PHP压缩HTML输出;4)设置浏览器缓存和页面缓存策略,包括简单的PHP缓存实现。这些技术可显著提升网站加载速度和性能。
服务器端
使用Nginx
作为web服务端可以使用以下开启
# 启用 gzip 压缩
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_types
application/javascript
application/json
application/xml
text/css
text/plain
text/xml;
# 浏览器缓存控制
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
图片优化
使用原生js实现懒加载
document.addEventListener('DOMContentLoaded', function() {
// 获取所有图片(如果主题默认输出 src,可以动态替换为 data-src)
const images = document.querySelectorAll('img[src]:not([data-src])');
// 防止重复处理
images.forEach(img => {
if (!img.getAttribute('data-src')) {
img.setAttribute('data-src', img.src); // 把 src 存到 data-src
img.removeAttribute('src'); // 移除 src,避免立即加载
}
});
// 懒加载逻辑
const lazyLoad = (targets) => {
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const img = entry.target;
img.src = img.dataset.src;
observer.unobserve(img); // 加载后停止观察
}
});
});
targets.forEach(img => observer.observe(img));
} else {
// 兼容旧浏览器(滚动监听)
const checkImages = () => {
targets.forEach(img => {
const rect = img.getBoundingClientRect();
if (rect.top < window.innerHeight + 100) { // 提前 100px 加载
img.src = img.dataset.src;
}
});
};
window.addEventListener('scroll', checkImages);
checkImages(); // 初始检查
}
};
// 对所有 data-src 图片应用懒加载
lazyLoad(document.querySelectorAll('img[data-src]'));
});
资源合并与压缩
压缩HTML输出
// 在主题的 functions.php 中
function compress_html($html) {
$placeholders = [];
$i = 0;
// 匹配 <pre> 和 <code> 区块,替换为唯一占位符
$html = preg_replace_callback(
'/<(pre|code)[^>]*>.*?<\/\1>/is',
function ($matches) use (&$placeholders, &$i) {
$key = "###HTML_COMPRESS_IGNORE_" . $i . "###";
$placeholders[$key] = $matches[0];
$i++;
return $key;
},
$html
);
// 正常压缩
$search = array(
'/\>[^\S ]+/s',
'/[^\S ]+\</s',
'/(\s)+/s'
);
$replace = array(
'>',
'<',
'\\1'
);
$html = preg_replace($search, $replace, $html);
// 恢复占位符
if (!empty($placeholders)) {
$html = str_replace(array_keys($placeholders), array_values($placeholders), $html);
}
return $html;
}
//在head.php中开启
<?php ob_start("compress_html"); ?>
//在footer.php中结束
<?php ob_end_flush(); ?>
缓存策略
浏览器缓存
<meta http-equiv="Cache-Control" content="max-age=86400" />
在header.php
中加入
页面缓存
在主题的 functions.php
中添加简单的页面缓存
function page_cache() {
// 不缓存后台、登录页和提交操作
if (defined('__TYPECHO_ADMIN__') || $_SERVER['REQUEST_METHOD'] != 'GET') {
return;
}
$cache_dir = __TYPECHO_ROOT_DIR__ . '/cache';
if (!is_dir($cache_dir)) {
mkdir($cache_dir, 0755, true);
}
$url_hash = md5($_SERVER['REQUEST_URI']);
$cache_file = $cache_dir . '/' . $url_hash . '.html';
// 缓存过期时间(秒)
$cache_time = 3600; // 1小时
// 如果缓存文件存在且未过期,则直接输出
if (file_exists($cache_file) && (time() - filemtime($cache_file) < $cache_time)) {
echo file_get_contents($cache_file);
exit;
}
// 否则开始输出缓冲
ob_start();
}
function save_cache() {
// 同样跳过后台等页面
if (defined('__TYPECHO_ADMIN__') || $_SERVER['REQUEST_METHOD'] != 'GET') {
return;
}
$cache_dir = __TYPECHO_ROOT_DIR__ . '/cache';
$url_hash = md5($_SERVER['REQUEST_URI']);
$cache_file = $cache_dir . '/' . $url_hash . '.html';
// 保存缓冲内容到文件
$content = ob_get_contents();
file_put_contents($cache_file, $content);
}
// 在页面开始处调用
page_cache();
// 在页面结束前调用
register_shutdown_function('save_cache');
端午插柳
这么多年了每到端午还记得小时候满村子的爬树去折柳枝,小小的身子拖着比身子大一倍的柳枝往家里拖,之后就会插在家里的大大小小的门上。想想最近一次也是折柳枝大概也是在11年前了,自从离开家就再也没有在节假日回过家,回家也是只有在每年过年的时候。
今年本来是不想插柳枝的,早上出门看到了别人家门口的艾草。就想到了家里,想着是不是也可以挂一点,但是挂什么又不知道了。因为在南方是“清明插柳,端午挂艾”。
这一南一北的习俗真实有意思,但是查了一下好像就只有甘肃某些地方是有这样的习俗的。没想到我们也有“少数民族”特色。
总体来说有两个版本:
1.插柳习俗可能与寒食节纪念介子推的传说有关(寒食节插柳)。由于甘肃历史上多民族交融,寒食与端午的习俗可能有所混合。
2.清代左宗棠在西北戍边时曾命军队广植柳树(“左公柳”),改善了当地环境。后人可能将柳树视为“守护之树”,并融入节日习俗。
入乡随俗,今天回去看看那可不可以采到艾草,柳枝学校有。这样就可以两种都有啦!
学习周刊-总第213期-2025年第22周
夸克网盘免第三方工具下载提速方案
之前被夸克网盘的限速困扰了许久(非会员白嫖党),和目前大多数主流的网盘一样,非会员用户下载体验极差。以前用油猴脚本还要逐个文件下载,操作太繁琐。
前段时间偶然发现了一个不使用第三方工具就能提速方法,实测平均速度4-5M/s,虽没能达到满速的效果,但对于日常下载也够用了。现在我就把这个亲测有效的方法分享给大家,也给自己留个备份,有需要的博友赶紧去试试吧!
效果展示
未提速时的效果
提速后的效果,快了10倍左右
具体操作
1.在PC桌面端,点击快传,点击发送网盘文件:
2.然后选中要下载的文件或者文件夹,确认添加:
3.最后点击下载到本地
这时候你会发现下载速度比之前的百十k,已上升到了4~5M/s左右
该方法从2024年11月15日使用到现在,任然有效,且行且珍惜,收藏起来,快去试试吧!
说说:#1748511084
今晚的好吃的🍢
HomeAssistant如何自定义侧边栏标题,修改标题文本教程
五岳独尊——泰安&泰山二日游
紧接着之前的北京行,从北京坐车到泰安,准备第二天爬泰山。但是北京走的确实很累,于是打算多休整一天,隔天再去爬泰山,因此是个二日游。
下了火车,就能看到泰安新建的地标建筑——财源门,也是这次计划住的地方。本来想住在如家,但是一犹豫如家一日涨了50,只能忍痛了。
修整体力,体验泰安
因为修整的缘故,上午基本没干啥,等到中午的时候才想着出门去。因为计划直接爬泰山,没怎么做攻略。查了一下到处都是炒鸡,于是想着尝一尝特色吧。中午在点评上找了一家不错的店,79.9要了四个菜:泰山干炒鸡、小酥肉、泰山熏豆干、泰山小豆腐,泰山干炒鸡就是油炸辣子鸡,小酥肉就是炸鸡柳,熏豆干就是拌豆干,小豆腐就是小白菜鸡蛋豆腐汤qaq。菜品都很一般,但是老板人很好,店面也不错,尤其是好评送的山楂汁真的好喝。
吃完了午饭就去逛了逛菜市场,听说泰山是山东煎饼的发扬地,但是菜市场的煎饼六块钱一斤,太贵了。然后就又回去休息了。本打算下午去岱庙,想了想不如第二天下山之后直接去岱庙,然后看看老县衙大院,正好都是顺路。休息到了晚上,准备出门逛逛小吃街买买吃的,也准备一下第二天爬泰山的补给。因此出发去了北新夜市。
到的时候天还没黑,小吃车的摊位都还没出来全,就和我妈在路口坐了一会。夜市很热闹,不过大部分都是小吃。也有不少套圈、打气球等游戏。记得气枪是10块钱50发,要是体验的话很划算,但是想了想算了哈哈哈哈哈。买了不少小吃,鸭货啊,炸场啊,土豆泥拌饭啊好多哈哈哈。
逛完小吃街之后回去才想起来忘记买明天的午饭了qaq,好在有外卖,买了一些汉堡,足够了ω
爬上泰山,五岳独尊
第二天一大早,就坐公交到了天外村,坐大巴进山也很顺利,很快就到了中天门。来到泰山,一定要爬从中天门到南天门这段路,才会有会当凌绝顶,一览众山小的感觉。但是真的应了那句话,十八盘会教训每一个嘴硬的人,看似近在咫尺,却爬了一段路以为登顶了,结果上去一个拐角又是很长的楼梯。即使最后终于到了南天门了,那也是泰山的大门,距离山顶还有好远呢。
不过既然到了南天门,登上玉皇顶那就是板上钉钉的事了,但是这泰山上的人也太多了qaq,尤其是五岳独尊石,想拍一张真的全是人。
本来计划坐缆车下到中天门,然后下山走到红门,再去岱庙和老县衙大院的,但是我妈说她腿疼,也只好做大巴又从天外村出来,回到旅店休息了。其实时间也不早了,要是走下山估计也是天黑了,这样也好。岱庙想想也就是个庙,应该大差不差了。晚上自己出来,吃一些好吃的,比如这个驴杂汤+两个驴肉火烧的15元套餐,还有这个24.5元30串羊肉串外加茶水不限量的套餐。真的是太美了。吃两个驴肉火烧吃饱之后,来到烧烤摊,坐在室外的折叠桌旁,杯中倒了一杯茶水,吹着夏季的暖风,舒缓了一天的疲惫。恰到好处的火候让肉串香气四溢,身边的音响放着抒情的音乐,结束了在泰安的最后一个晚上。
ps后续:吃完烤串之后,想着前一晚夜市买的卤鸭翅还没吃,于是回去路上买了蜜雪冰城,回去躺在床上开着大屏幕边看电影边啃鸭翅哈哈哈哈哈
Typecho文章置顶(非插件)
AI摘要:文章介绍了Typecho博客系统实现文章置顶功能的完整方案,包括在index.php中插入PHP代码处理置顶逻辑,在functions.php添加主题设置项,以及在文章列表模板中添加置顶标识显示代码。该方法解决了传统置顶方式导致文章总数减少的问题,通过单独查询置顶文章并调整分页逻辑来实现正确显示。
置顶
最近才发现原来用的文章置顶还是有些问题的,置顶N篇文章,翻页时文章列表中文章还是维持原有的翻页逻辑,那么列表中文章的总数中就会减少N篇文章.
实现
正常逻辑应该是从文章列表中查找需要置顶的文章展示在首页列表,把原有的文章列表向后压.翻页时会筛选已经置顶的文章.不再重复显示.
步骤
在
index.php
中插入代码<?php $sticky = $this->options->sticky; $db = Typecho_Db::get(); $pageSize = $this->options->pageSize; if ($sticky && !empty(trim($sticky))) { $sticky_cids = array_filter(explode('|', $sticky)); if (!empty($sticky_cids)) { $sticky_html = " <span class='sticky--post'><svg xmlns='http://www.w3.org/2000/svg' width='16px' height='16px' fill='none' viewBox='0 0 24 24' class='bk'> <path fill='#242424' fill-rule='evenodd' d='M12.333 16.993a7.4 7.4 0 0 1-1.686-.12 7.25 7.25 0 1 1 8.047-4.334v.001a7.2 7.2 0 0 1-.632 1.188 7.26 7.26 0 0 1-4.708 3.146l-.07.013q-.466.083-.951.105m.356.979a8.4 8.4 0 0 1-1.377 0l-2.075 5.7a.375.375 0 0 1-.625.13l-2.465-2.604-3.563.41a.375.375 0 0 1-.395-.501l2.645-7.267a8.25 8.25 0 1 1 14.333 0l2.645 7.267a.375.375 0 0 1-.396.5l-3.562-.41-2.465 2.604a.375.375 0 0 1-.625-.13zm5.786-3.109a8.25 8.25 0 0 1-4.775 2.962l1.658 4.554 1.77-1.87.344-.362.496.057 2.558.294zm-12.95 0L3.476 20.5l2.557-.295.497-.057.344.363 1.77 1.87 1.658-4.555a8.25 8.25 0 0 1-4.775-2.961' clip-rule='evenodd'></path></svg></span> "; // 保存原始对象状态 $originalRows = $this->row; $originalStack = $this->stack; $originalLength = $this->length; $totalOriginal = $this->getTotal(); // 重置当前对象状态 $this->row = []; $this->stack = []; $this->length = 0; if (isset($this->currentPage) && $this->currentPage == 1) { // 查询置顶文章 $selectSticky = $this->select()->where('type = ?', 'post'); foreach ($sticky_cids as $i => $cid) { if ($i == 0) $selectSticky->where('cid = ?', $cid); else $selectSticky->orWhere('cid = ?', $cid); } $stickyPosts = $db->fetchAll($selectSticky); // 添加置顶文章到结果集 foreach ($stickyPosts as &$stickyPost) { $stickyPost['isSticky'] = true; $stickyPost['stickyHtml'] = $sticky_html; $this->push($stickyPost); } // 计算当前页应显示的普通文章数量 $standardPageSize = $pageSize - count($stickyPosts); // 确保第一页不会显示太多文章 if ($standardPageSize <= 0) { $standardPageSize = 0; // 如果置顶文章已经填满或超过一页,则不显示普通文章 } } else { // 非第一页显示正常数量的文章 $standardPageSize = $pageSize; } // 查询普通文章 if ($this->currentPage == 1) { // 第一页需要排除置顶文章并限制数量 $selectNormal = $this->select() ->where('type = ?', 'post') ->where('status = ?', 'publish') ->where('created < ?', time()); // 排除所有置顶文章 foreach ($sticky_cids as $cid) { $selectNormal->where('table.contents.cid != ?', $cid); } $selectNormal->order('created', Typecho_Db::SORT_DESC) ->limit($standardPageSize) ->offset(0); } else { // 非第一页的查询 // 计算正确的偏移量:(当前页码-1) * 每页数量 - 置顶文章数 // 这样可以确保不会漏掉文章 $offset = ($this->currentPage - 1) * $pageSize - count($sticky_cids); $offset = max($offset, 0); // 确保偏移量不为负 $selectNormal = $this->select() ->where('type = ?', 'post') ->where('status = ?', 'publish') ->where('created < ?', time()); // 排除所有置顶文章 foreach ($sticky_cids as $cid) { $selectNormal->where('table.contents.cid != ?', $cid); } $selectNormal->order('created', Typecho_Db::SORT_DESC) ->limit($pageSize) ->offset($offset); } } else { // 没有有效的置顶文章ID,正常查询 $selectNormal = $this->select() ->where('type = ?', 'post') ->where('status = ?', 'publish') ->where('created < ?', time()) ->order('created', Typecho_Db::SORT_DESC) ->page(isset($this->currentPage) ? $this->currentPage : 1, $pageSize); } } else { // 没有设置置顶文章,正常查询 $selectNormal = $this->select() ->where('type = ?', 'post') ->where('status = ?', 'publish') ->where('created < ?', time()) ->order('created', Typecho_Db::SORT_DESC) ->page(isset($this->currentPage) ? $this->currentPage : 1, $pageSize); } // 添加私有文章查询条件 if ($this->user->hasLogin()) { $uid = $this->user->uid; if ($uid) { $selectNormal->orWhere('authorId = ? AND status = ?', $uid, 'private'); } } // 获取普通文章 $normalPosts = $db->fetchAll($selectNormal); // 如果没有置顶文章或在前面的代码中没有重置对象状态,则在这里重置 if (empty($sticky) || empty(trim($sticky)) || empty($sticky_cids)) { $this->row = []; $this->stack = []; $this->length = 0; } // 将普通文章添加到结果集 foreach ($normalPosts as $normalPost) { $this->push($normalPost); } ?>
在主题的
functions.php
文件中查找function themeConfig($form) {
之后插入代码,会增加一个主题设置项
$sticky = new Typecho_Widget_Helper_Form_Element_Text('sticky', NULL, NULL, _t('置顶文章cid'), _t('多篇文章以`|`符号隔开'), _t('展示需要置顶的文章。')); $form->addInput($sticky);
在文章列表中合适的地方插入
<?php if (isset($this->isSticky) && $this->isSticky): ?> <?php echo $this->stickyHtml; ?> <?php endif; ?>
红墙深几许,一梦到明清——北京&故宫一日游
早上九点的火车到达北京丰台站,晚上十点半的火车驶离北京站,计划了一个白天的北京入夏一日游。
到达北京丰台站,因为没吃早饭,正好在这附近吃一吃。感谢地道的老北京“小羊”前辈,为我这次北京行省了不少攻略的时间,还吃到了许多当地物美价廉的特色,真的超级超级好。这次下火车吃的《尹记门钉肉饼》就是推荐的连锁店。不过当时问了一下门钉肉饼只有在十点半之后才开始开卖,没办法因为时间紧迫吃不到了。不过也没关系,要了一份12元的羊杂汤+小饼,也要到了传说中的豆汁,3元一大碗,可惜就喝了五口。羊杂汤很咸,豆汁很酸,就是字面意思上的酸臭,喝起来也还行吧,确实不怎么好喝。要了一个牛肉大懒龙,就剩最后一个了哈哈哈哈哈。
吃过早饭,计划去看一眼天安门之后进故宫博物院,因此先去北京站存个背包。老板人很好,一眼就看出来我是大连的hhhhh,也给我优惠了几块钱。远远的能看到北京站的去看天安门,因为没有预约,被告知好像没法看到天安门???想不到看个天安门还预约了,可能是人真的多吧。折腾了半天去到了侧门进故宫了。
故宫确实大气,人也是真多,但是现在故宫正在修缮,连宫殿的大门都不能靠近,远处的门口挤了一堆人在那拍照。走着走着就很累,因为都忘记去看清明上河图了。网上看的攻略什么盖章集邮全都直接错过了,匆匆忙忙的就逛完御花园从北门上了景山公园。
景山公园的自动贩卖机很方便也很便宜,里面还有怡人的鲜花,安静的小路,而且还有能俯视故宫的美景,真是个好地方。
因为逛完很累了而且已经下午了,想着去北海公园逛逛但是貌似走不动了,于是直接下一个计划——去鼓楼的《姚记炒肝店》吃炒肝和卤煮!
卤煮确实好吃,炒肝也好,还要了炸灌肠,炸灌肠沾上蒜水还真的是灌肠的香味,好吃!
然后去哪呢?“小羊”前辈说去看看后海吧。我看地图附近就是烟袋斜街和南锣鼓巷,烟袋斜街确实不错,就是开始下起了雨。走过银锭桥发现越走越远,就计划回逛南锣鼓巷。可悲的是到了南锣鼓巷雨下大了,而且里面的东西是真的贵,也不好逛,只能草草结束了行程。
天色渐暗,雨还很大,不知道去哪里好了。想起之前看到过有个不错的小景点,在王府井商场的地下有个《和平菓局》,有许多不错的场景可以打卡还在室内,于是就最后选择去那边逛逛结束这一天的行程了。王府井大街很宽,因为并没有做攻略,就知道有个古老的天主教堂,冶可以去打打卡。
休息片刻,之后取回了包,去北京站候车厅休息休息慢慢等车了。
zblog列表页面标题及文章数量
主要用户各种列表页面显示 xx分类/标签下有xx篇文章
{if $type == 'index'}
<h2>最新文章</h2>
{else}
<h2>
{if $type == 'category'}
找到<span>{$category.Count}</span>篇与
{elseif $type == 'tag'}
找到<span>{$tag.Count}</span>篇与
{elseif $type == 'author'}
找到<span>{$author.Articles}</span>篇与
{/if}
<span>{$title}</span> 相关的结果</h2>
{/if}
如有更好的方式欢迎评论区补充哈!
数据库可视化WEB工具对比
zblog判断用户是否登录
Z-blogPHP1.7.4
判断用户是否登录
{if $user.ID > 0}
<!-- 判断用户ID是否大于0 -->
欢迎你:<a href="{$host}zb_system/cmd.php?act=login" target="_blank">{$zbp->user->StaticName}</a>
<!-- 用户登录后显示的内容 -->
{else}
<a href="{$host}zb_system/cmd.php?act=login" target="_blank">登录</a>
<!-- 用户未登录显示的内容 -->
{/if}
给文章引入联邦宇宙嘟文互动记录
Photo by Pankaj Patel / Unsplash
去年还是前年就在思考如何在 Ghost 中集成 Activitypub 的互动,还找了一个国内博客大佬的实现 ActivityPub 协议的简单实现 - Lawrence Li ,不过这位大佬的方案是完全自己实现协议部分,对我来说有点太复杂了。
后来Ghost官方也发布了一个Ghost和Activitypub的继承方案,不过我看了下项目的Docker-compose文件,感觉太臃肿了(毕竟是商业化产品,性能各方面都要考虑到)。
而且开发一年多了,现在也只在官方付费服务里Beta,所以现在兴致缺缺。
因为最近用Cloudflare Worker实现了很多有意思的玩意,
所已,今天忽然灵光一闪,想到了一个非常有意思的点子,通过和AI的几轮互动,感觉应该能完整实现大佬博客里的那种效果。
其实原理无非就是利用Cloudflare Worker和KV功能,对文章ID和嘟文ID进行储存,在页面展示时再去请求数据进行展示,整个逻辑大概如下:
文章和嘟文同步
- Worker定时请求Ghost博客中最新一篇的数据(我这边是用Ghost的唯一文章ID做Key,你的博客系统没有API的可以请求RSS,但是ID必须是唯一的,可以自己截取slug出来应该也是可行的)。
- 拿到Key后在KV中进行查找,如果录入过就跳过。
- 没录入就拿文章的数据根据长毛象或GTS的API要求组装嘟文进行发布。
- 获取到嘟文唯一ID后和文章ID一起存入KV。
嘟文数据获取
- 博客文章详情页面加载完后通过文章ID请求Worker。
- Worker拿到ID去KV中查找嘟文ID。
- 找到话通过嘟文ID去长毛象或者GTS获取嘟文互动数据。
- 进行展示。
1. 只显示public评论。
2. 不显示敏感(sensitive )内容。
3. 不显示locked用户点赞。
实践
进入Cloudflare Worker直接新建一个Worker,模板选Hello World,然后下面代码覆盖原有代码,我这边Ghost获取文章的部分你们用AI改成获取RSS,并截取文章slug作为文章ID。
// 配置常量
const GTS_INSTANCE = "https://social.gts.com";
const GTS_TOKEN = "ZTU5YTZLZMQTNWRJFSAFAXG3NDQ3MWQZOWRK";
const CACHE_TTL = 600; // 互动数据缓存时间(秒)
const BLOG_URL = "https://blog.com"; // Ghost博客地址
const BLOG_API_KEY = "78eb22fbf6260dcc3a1de7cf82"; // Ghost Admin API Key
// 在 Worker 代码开头添加 CORS 处理函数
const handleCORS = (response, origin) => {
const headers = new Headers(response.headers);
headers.set('Access-Control-Allow-Origin', origin || '*');
headers.set('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
return new Response(response.body, {
status: response.status,
headers
});
};
export default {
async fetch(request, env) {
// 处理预检请求 (OPTIONS)
if (request.method === 'OPTIONS') {
return handleCORS(new Response(null), request.headers.get('Origin'));
}
const url = new URL(request.url);
const path = url.pathname;
// 处理定时触发的自动发布
if (path === '/api/sync') {
return handleAutoPublish(env);
}
// 提供互动数据API
if (path === '/api/interactions' && request.method === 'GET') {
return getInteractions(url.searchParams, env);
}
return new Response('Not Found', { status: 404 });
},
// 添加定时触发器配置
async scheduled(event, env, ctx) {
ctx.waitUntil(handleAutoPublish(env));
}
};
// 自动发布最新文章
async function handleAutoPublish(env) {
try {
// 从Ghost获取最新文章
const postsResp = await fetch(`${BLOG_URL}/ghost/api/content/posts/?limit=1&order=published_at%20desc&key=${BLOG_API_KEY}`, {
headers: {
'Accept-Version': 'v5.0',
'Content-Type': 'application/json'
}
});
if (!postsResp.ok) {
throw new Error('Failed to fetch posts from Ghost');
}
const postsData = await postsResp.json();
const latestPost = postsData.posts[0];
if (!latestPost) {
return new Response('No posts found', { status: 200 });
}
// 检查是否已经发布过
const existingMapping = await env.BLOG_TOOT_MAPPING.get(`post:${latestPost.id}`);
if (existingMapping) {
return new Response('Post already published', { status: 200 });
}
// 发布到GoToSocial
const tootContent = `${latestPost.title}\n${BLOG_URL+'/'+latestPost.slug}\n\nfrom 1900's Blog.(auto sync)\n\n#博客`;
const tootResp = await fetch(`${GTS_INSTANCE}/api/v1/statuses`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${GTS_TOKEN}`,
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
},
body: JSON.stringify({
status: tootContent,
visibility: "public"
})
});
const tootData = await tootResp.json();
// 存储映射关系到KV
await env.BLOG_TOOT_MAPPING.put(
`post:${latestPost.id}`,
JSON.stringify({
toot_id: tootData.id,
toot_uri: tootData.uri,
created_at: Date.now()
})
);
return new Response('Auto publish success', { status: 200 });
} catch (err) {
return new Response(err.message, { status: 500 });
}
}
async function getInteractions(params, env) {
const postId = params.get('post_id');
if (!postId) return new Response('Missing post_id', { status: 400 });
// 从KV获取Toot信息
const tootData = await env.BLOG_TOOT_MAPPING.get(`post:${postId}`);
if (!tootData) return new Response('Mapping not found', { status: 404 });
const { toot_id } = JSON.parse(tootData);
// 并发获取回复和点赞数据
const [contextResp, favouritesResp] = await Promise.all([
fetch(`${GTS_INSTANCE}/api/v1/statuses/${toot_id}/context`, {
headers: {
'Authorization': `Bearer ${GTS_TOKEN}`,
'CF-Cache-Tag': `context_${toot_id}`,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
},
cf: { cacheTtl: CACHE_TTL }
}),
fetch(`${GTS_INSTANCE}/api/v1/statuses/${toot_id}/favourited_by`, {
headers: {
'Authorization': `Bearer ${GTS_TOKEN}`,
'CF-Cache-Tag': `favs_${toot_id}`,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
},
cf: { cacheTtl: CACHE_TTL }
})
]);
if (!contextResp.ok || !favouritesResp.ok) {
return new Response('Failed to fetch interactions', { status: 502 });
}
// 处理数据
const [contextData, favouritesData] = await Promise.all([
contextResp.json(),
favouritesResp.json()
]);
// 格式化响应
const formatted = {
post_id: postId,
toot_id: toot_id,
replies: contextData.descendants.map(item => ({
id: item.id,
author: {
name: item.account.display_name,
avatar: item.account.avatar
},
content: item.content,
created_at: item.created_at
})),
favourites: favouritesData.map(user => ({
id: user.id,
name: user.display_name,
avatar: user.avatar,
username: user.acct
})),
stats: {
replies_count: contextData.descendants.length,
favourites_count: favouritesData.length
}
};
return new Response(JSON.stringify(formatted), {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
}
});
}
Worker定时执行
进入Worker的设置页面,绑定KV命名空间和设置Cron执行间隔。
这里KV空间需要提前建好,路径为 储存和数据库 > KV > 创建 > 录入名称 BLOG_TOOT_MAPPING
,然后再去设置页面绑定。

前端渲染
有了API提供数据,前端只需要在页面加载时获取数据进行渲染即可,我这里做了简单的展示,带红心的头像是点赞用户,没带红心的是用户评论,鼠标悬浮在头像上即可展示。

目前暂时还没想好如何更好的实现,之后有想法了再进行完善。
我这边相关代码剥离到了一个单独的js文件里,原理是一样的,你也可以直接写在页面上。具体代码可以用AI帮你生成一个就行。
import tippy from 'tippy.js';
import 'tippy.js/dist/tippy.css';
import 'tippy.js/themes/light.css';
// 配置常量
const API_ENDPOINT = 'https://your.workers.dev/api/interactions';
// 主入口函数
export default async function initActivityPubInteractions() {
try {
const container = document.querySelector('#activitypub');
if (!container) {
console.error('未找到#activitypub元素');
return;
}
const postId = container.dataset.postid;
if (!postId) {
console.error('缺少data-postid属性');
return;
}
const data = await fetchInteractions(postId);
renderAllInteractions(data, container);
// 如果有互动数据则显示容器
if (data.stats.replies_count > 0 || data.stats.favourites_count > 0) {
container.style.display = 'block';
}
} catch (error) {
console.error('加载互动数据失败:', error);
}
}
// 获取互动数据
async function fetchInteractions(postId) {
const response = await fetch(`${API_ENDPOINT}?post_id=${postId}`);
if (!response.ok) throw new Error('API请求失败');
return await response.json();
}
// 渲染所有互动(混合点赞和评论)
function renderAllInteractions(data, container) {
const avatarList = container.querySelector('.discussion-avatar-list');
if (!avatarList) return;
avatarList.innerHTML = '';
// 合并点赞和评论数据
const allInteractions = [...data.favourites.map((user) => ({ ...user, type: 'like' })), ...data.replies.map((user) => ({ ...user, type: 'reply' }))];
// 按时间排序(最新的在前)
allInteractions.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
allInteractions.forEach((user) => {
const li = document.createElement('li');
li.innerHTML = `
<div class="comment-user-avatar ${user.type}">
<img src="${user.avatar || user.author.avatar}"
alt="${user.name || user.username}"
class="avatar avatar-60 photo"
loading="lazy"
data-user-id="${user.id}"
data-type="${user.type}">
</div>
`;
avatarList.appendChild(li);
// 直接在这里初始化 Tippy
const img = li.querySelector('img');
if (user.type === 'reply') {
// 评论工具提示
tippy(img, {
theme: 'light',
allowHTML: true,
interactive: true,
maxWidth: 350,
delay: [100, 0],
content: '加载中...',
onShow(instance) {
instance.setContent(user.content);
}
});
} else {
// 点赞工具提示
tippy(img, {
content: '💖',
delay: [100, 0]
});
}
});
// 更新统计信息
}
HTML 代码部分
<!--- 其他代码 --->
<div class="social-interactions">
<ol class="discussion-avatar-list"></ol>
</div>
<script>
// 引入上面的函数文件
import loadInteractions from '../utils/acitivitypub';
// 适配Astro的PWA加载
document.addEventListener('astro:page-load', () => {
loadInteractions();
});
</script>
<!--- 其他代码 --->
zblogPHP开启伪静态图文教程
在zblog后台插件管理里面找到【静态管理中心】插件,注意,这个插件是安装程序后自带的,默认是没有开启的,我们启动一下,然后点击扳手图标进入插件设置。

然后点击伪静态(高手也可以修改下默认伪静态下的网址规则,新手直接略过即可),然后滚动页面到最下面点击保存

此时页面会跳转伪静态规则页面

不同服务器环境规则写法不同,根据自己环境选择下,然后复制伪静态规则,填到自己网站控制面板伪静态规则里面保存即可
工作周年与AI焦虑:成长与挑战并存
该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/notes/192
Folo 与我的一年
转眼间,这份工作又快到一年了。说起来,我毕业以来,经历了两次换工作,第一次是因为工作内容和压力的问题,第二次是因为裁员。不幸的是,这两次实际都没有满一年。
又是这里节骨眼上,恰好是一年,又开始有点焦虑了。焦虑的是,做的事是否达到预期,是否有成长,产品时候有前途等等。一年的时间说长不长说短也不短。
回顾过去的一年,我自认为还是能达到预期的吧。从我刚入职,从一个毛坯的产品开始做,重新设计组件 UI,重构底层,赋予一些有意思的交互设计以及功能,到 Web 端开放公测。不过只是三个月的时间。又是一个月完成了 Web 对 Mobile 的响应式改造。现如今 Mobile App 也已经上线很久。而这些在一年的时间中全部完成了。对于一个只有 4 个开发成员的项目来说,感觉已经很不错了。
希望越来越好吧。
AI 焦虑
回看今年,各路神仙打架。AI 发展越来越快。该说是好事还是坏事呢。如今写代码变得越来越不动脑子了,只是无脑敲着 Tab,出了问题也不知道。非常害怕这样依赖 AI 之后连很简单的逻辑都不会写了。AI 在进步而我在退步。
前段日子,也是借助 AI 完成了大部分的代码。虽然 AI 现在对 Swift 还是不太熟悉。但是循序渐进的引导最终还是能达到一个预期的结果。现在非常流行 Vibe Coding,即便是完全不会编程,只需要一个好点子,以及良好的文字表达,就能引导 AI 一步步做出你想要的结果。慢慢的代码越来越不值钱,最值钱的是好的点子。像我这种只会切图的低级程序员真的那一天就突然被淘汰了。现在的 AI 可比我会写多了。这种焦虑感越来越强。
确实会有一种很矛盾的感觉,一方面对自己所能开发的领域、边界有了更多信心,可以开发前端、iOS 甚至是各种之前并不了解的技术栈;而另一方面,对于自己离开 AI 后独立写代码的信心在显著下降,连带着自己独立思考的能力。 -- 周报 #95 - All AI 与 No AI
Raphael AI图片生成器:释放创意,零门槛打造惊艳视觉盛宴
在 AI 技术席卷全球的今天,图像生成工具正成为内容创作者、设计师和营销人员的得力助手。Raphael AI 作为全球首款完全免费、无限制、无需注册登录的 AI 图像生成器,以其强大的功能和便捷的操作,迅速在创意圈掀起热潮。
今天偶然看到的,有免费额度的 AI 图片生成器。适合生成配图或者插图,用来生成封面感觉还差点意思,和即梦效果差不多。
Raphael AI 是什么?
Raphael AI 是一款基于先进的 FLUX.1-Dev 模型打造的 AI 图像生成工具,用户只需输入文字描述(提示词),即可在几秒钟内生成高质量、多风格的图像。它的核心优势在于:
- 完全免费, 零成本创作:无使用次数限制,无需注册或登录,打开网页即可创作
- 多样化风格:支持写实摄影、动漫、油画、数字艺术等多种艺术风格
- 快速生成:优化的推理管道确保几秒内出图,效率惊人
- 隐私保护:零数据保留政策,提示词和生成图像不存储于服务器,保障用户隐私
- 商业用途:生成图像无水印,可自由用于个人或商业项目
- 一定质量保障:由 FLUX.1-Dev 模型驱动,提供具有卓越细节和艺术风格控制的照片级逼真图像;高级文本理解
对比国内大模型,我觉得是优势功能的都标注了。为啥说一定质量保障,因为高质量需要订阅才行 😄
测试
英文提示词
Humorous and funny style, preferably with a purple-haired Japanese anime girl holding a sign that says, "I need 66 more followers to reach 1000, please subscribe."
选择一个,其他都略微有些瑕疵
中文提示词
幽默搞笑风, 最好有个紫色头发日漫妹子举牌子,牌子上写着「我还有 66 个粉丝才满 1000,请求订阅」》
总结
官方建议: 请用英文输入提示词以获得最佳效果
经过实操,确实英文提示词要比中文好多了,可能我问的方式仅在 ChatGPT 上实验良好。
官方也提供了一些灵感示例提示词,点击相关图片就可以查看其他人的提示词
再次实操一下,发现生成 SB 比缘生更简单哈哈哈
生成: Cute chubby Pikachu on the grass, surrounded by small white flowers, with the two Chinese characters "SB" written on Pikachu's belly, soft pastel anime style
官网

Mac如何将喜欢的视频作为屏幕保护程序?自定义Mac视频屏保,最新系统教程
iPhone如何查看自己电话卡的上网优先级QCI?SIM卡的QCI查看教程
微软开源的更贴近Windows习惯的Linux命令行文本编辑器:edit
Photo by Christopher Gower / Unsplash
不知道是不是微软知道天下小白苦 Linux 的命令行编辑器久矣,最近开源了一款 windows 操作习惯的 shell 文本编辑器 edit。
支持多行选择、复制粘贴、鼠标控制等操作,操作习惯更偏向 widnows。

所以第一时间安装体验,感觉确实不错,写一篇安装教程。
下载使用你自己平台的二进制文件,Releases · microsoft/edit
curl -LO https://github.com/microsoft/edit/releases/download/v1.0.0/edit-1.0.0-x86_64-linux-gnu.xz
解压,重命名
unxz edit-1.0.0-x86_64-linux-gnu.xz
mv edit-1.0.0-x86_64-linux-gnu edit
给执行权限,并移动到 bin 目录
chmod +x edit
sudo mv edit /usr/local/bin/
测试是否安装成功
edit --version
常用快捷键
- New File:Ctrl+N
- Open File:Ctrl+0
- Save:Ctrl+s
- Close Editor:Ctrl+W
- Exit:Ctrl+Q
- Undo:Ctrl+Z
- Redo:Ctrl+Y
- Cut:Ctrl+x
- Copy:Ctrl+c
- Paste:Ctrl+V
- Find:Ctrl+F
- Replace:Ctrl+R
学习周刊-总第212期-2025年第21周
Google新AI产品无法使用解决指南
今天看到这个消息推送,之前也遇到过这种情况,这个简单写下如何解决,当个精神美国佬
背景
受限于某些特殊环境或者边缘因素影响,国内是没法正常使用 Google AI 相关的产品的。(默认你已经可以访问 Google AI 等产品了)
接下来给的几种方式,都可以尝试
修改浏览器默认语言
这个跟之前 Github 默认禁止中文用户访问类似,检查你的请求头 accept-language
信息
示例修改 Edge 默认首选语言为英语即可,生效后随便访问一个网站开发者工具查看请求头或者支持切换语言的网站打开是否为英文
如果你的账号没问题了,通常打开那些网站就可以正常使用了。如果还不行,可能就是账号问题了
当然也会带来一些问题,你打开所有支持多语言的网站都会默认使用英文,影响也不大
申请谷歌账号地区修改
有可能,你很早之前就注册了谷歌账号,地区选的中国
查看账号绑定的地区 https://policies.google.com/terms
换区操作
找对入口,其实也很简单,通常我们都选择美区,精神美国佬,社会大学生, 部分 AI 功能暂时只对美区开发。
换区入口 https://policies.google.com/country-association-form
理由选择其他原因,听劝
好了,其他就是基本要求了,自行准备就行。
对了,这两个我港区的小号也是可以正常访问的。
PS: 大佬们都买了
Google One Ultra
没?

用Docker部署Navidrome音乐服务器
Navidrome是一款基于Web的开源音乐服务器应用程序,可在Linux、Windows、macOS等多种操作系统上运行。它界面简洁直观,音乐管理功能强大,能自动扫描音乐库,获取歌曲信息和专辑封面,支持按艺术家、专辑、流派等分类浏览,还支持MP3、FLAC、AAC等多种音频格式。
它具有流媒体播放功能,可在不同设备上流畅播放音乐,支持Chromecast投屏,也有用户管理功能,可创建多个账户,便于多用户共享音乐库。其安装方式多样,可通过官网下载安装包、使用包管理工具或从源代码编译安装,配置简单,指定音乐库目录等参数后即可使用。
Navidrome适用于家庭音乐服务器、个人Nas音乐收藏管理以及小型办公环境等场景。
效果展示
PC端效果:
移动端效果:
注意:移动端需搭配音流App或其他支持Navidrome的播放器使用。
搭建该项目的初衷
搭建Navidrome个人音乐服务器,是因为市面上的音乐服务器价格高昂,且需要持续开通会员才能享受高质量服务,一旦会员到期,音乐服务便无法继续使用。更令人无奈的是,即便开通会员,部分喜爱的音乐仍需额外付费购买,且这些音乐还存在平台使用限制,换平台播放又得重新掏钱。
与之相比,自行搭建Navidrome个人音乐服务器,一次搭建就能终身免费使用,音乐资源完全由自己掌控,无论是音乐源还是音乐质量都能随心决定。无需开通繁多的音乐会员,也不必额外花钱购买音乐,只要能连接上自建的音乐服务器,无论身处何地都能尽情享受专属的音乐盛宴。
准备工作
搭建Navidrome个人音乐服务器,我们需要3个关键组件:
1.Navidrome:用于管理自定义的音乐资源
2.Music-Tag-Web:用于刮削音乐资源
何为刮削?就是根据音乐资源的名称自动获取该音乐资源的一切信息:歌曲名称、作者、专辑、歌词、相关图片、发行时间、歌曲类型、歌曲大小……
3.音流App:音乐客户端
注意:只要是支持Navidrome服务的客户端都可以使用,不限于音流App
具体操作
搭建Navidrome
1.复制以下命令,粘贴到服务器终端直接运行即可:
docker run -d \
--name navidrome \
--restart=unless-stopped \
--user $(id -u):$(id -g) \
-v /自定义music文件存储路径/music:/music \
-v /自定义data文件存储路径/data:/data \
-p 4533:4533 \
-e ND_LOGLEVEL=info \
deluan/navidrome:latest
事项说明:
① "自定义music文件存储路径"和"自定义data文件存储路径"需授权Root权限
② music文件用于存放显示的音乐文件
③ data文件用于存放Navidrome音乐服务器上的数据
④ 在执行该命令前,最好先去服务器后台的"防火墙"开放4533端口
⑤ 在执行该命令前,最好先去服务器的服务商后台开放"防火墙"的4533端口
2.等待上面的命令执行完成后,用以下方式进行第一次登录访问:
服务器ip地址:4533
首次登录,需设置用户名、密码。设置好之后,就可以登陆Navidrome音乐服务器了:
3.将语言设置为中文
登录Navidrome音乐服务器后,点击右上角头像,然后点击"Personal个性化设置"中的将语言,设置为中文即可。
4.反向代理
如果觉得使用 "服务器ip+端口" 的方式登陆Navidrome音乐服务器不方便,可以进行反向代理设置,将登陆方式改为域名登录。至于怎么设置,这里我就不多说了,可以参考之前的文章,或自行百度。
搭建Music-Tag-Web
1.复制以下命令,粘贴到服务器终端直接运行即可:
docker run -d -p 8001:8001 -v /自定义music文件存储路径/music:/app/media -v /自定义data文件存储路径:/app/data --restart=always xhongc/music_tag_web:latest
事项说明:
① "自定义music文件存储路径"和"自定义data文件存储路径"需授权Root权限
② music文件用于临时存放需要刮削音乐资源的文件
③ data文件用于存放Music-Tag-Web服务器上的数据
③ 在执行该命令前,最好先去服务器后台的"防火墙"开放8001端口
④ 在执行该命令前,最好先去服务器的服务商后台开放"防火墙"的8001端口
2.等待上面的命令执行完成后,用以下方式进行第一次登录访问:
服务器ip地址:8001
首次登录,默认的账号和密码都是admin:
该图左边为音乐资源选择区域,右面为选中的音乐资源刮削之后展示的效果区域。
3.Music-Tag-Web的使用
如何使用Music-Tag-Web音乐资源刮削工具,我这里就以BEYOND的"真的爱你"为例,来作为演示:
① 将歌曲源文件上传至Music-Tag-Web服务器的"/music"目录下,即前面我们自定义的路径:"自定义music文件存储路径"
② 在浏览器中登录"服务器ip地址:8001",我们点击音乐资源选择区域中的刷新按钮,即可看到我们上传的音乐名称:
③ 在左边的音乐资源选择区域选中我们需要刮削的音乐资源,点击中间的第二个或者第三个按钮:手动刮削和自动刮削
④ 此时会弹出来一个"自动修改标签",根据我们自己的需求进行适当的调整,然后点击"保存"系统即可开始进行刮削处理
⑤ 等待一会儿,就可以看到刮削后的效果了,如果不满意刮削后的效果,我们还可以接着继续进行刮削,或者手动刮削处理也行:
4.反向代理
如果觉得使用 "服务器ip+端口" 的方式登陆Music-Tag-Web音乐资源刮削工具不方便,可以进行反向代理设置,将登陆方式改为域名登录。
资源合并
如何将Music-Tag-Web音乐资源刮削处理后的音乐资源上传到Navidrome音乐服务器上呢?答案很简单,直接复制粘贴即可:
直接将Music-Tag-Web中music目录下的音乐文件,直接剪切或复制粘贴至Navidrome中的music目录下即可。
到这里,我们的Navidrome个人音乐服务器就算弄好了。但现在有个问题,使用网页端来听歌,总感觉有点别扭,而且还不太方便,那咋办?不慌,音流App就能解决这个问题。
音流
音流App是一款免费音乐源连接播放器,可兼容Navidrome、Subsonic等多种音乐服务,能连接自建服务器访问个人音乐库。它资源丰富,以高性能音频引擎实现高品质播放,自动同步歌词。支持离线下载,具备智能搜索、播放列表管理等功能,支持多格式音频,界面简约且有丰富主题 ,还能基于算法进行智能推荐。
2.登录Navidrome
主机地址填写你部署Navidrome的地址即可。
Navidrome个人音乐服务器到这里就算搭好啦!这下可以随时随地任性的听歌了!快打开播放器,找一首喜欢的歌,闭上眼睛,舒舒服服地“躺平”享受吧。
无损音乐资源下载站点推荐
1.MyFreeMP3
2.歌曲宝
3.Hifini
4.5song
5.天天无损音乐
微信公众号搜索 [刘郎阁] 关注并回复"1623"获取
0元开88vip??
因为最近淘宝买了不少东西,有些商家不送退货险,退货运费都挺贵的。
而且今天想买个好价鞋,但是需要88vip的券,@jun 倒是说帮我抢,但是有些券需要等,还要冲购物金,弄来弄去感觉也挺麻烦的。
所以想来想去还是自己开一个。
之前在咸鱼上几毛钱买过一个夸克云的88vip,估摸着中间应该是有什么门道,所以去这些地方做了一下搜索,了解了一下中间的套路。果然不出所料,感觉中间的利润还挺高的,现在这些大公司的羊毛被这些羊毛党可谓是薅到极致。
羊毛党的思路大概是这样:
- 去咸鱼、小红书等地方发帖指导别人开88会员,并说可以回收附带的视频、音乐权益,一般两个包年服务的回收价格在80元左右。
- 因为咸鱼、小红书平台的封控问题,引导客户至微信沟通。
- 顾客咸鱼上架宝贝,他们拍下,然后让客户开通88vip。
- 然后他们通过内部共享渠道拿到其他需要充值这两个服务的用户的手机号
- 我们配合进行充值
- 他们咸鱼付款。
我核查了一下已经了解到的收益点
- 推广金,走他们的邀请链接开通好像会有14-16元左右的推广奖励。
- 包年会员转手卖掉赚差价,网易云、优酷或芒果的包年服务价格咸鱼在100元左右,利润20元。

可能还会有其他我没了解的收益点,但是上述两项至少会有差不多40元的收益,这可以说是无本买卖,如果能把中间的流程优化好,应该还有提升空间。
唯一的问题就是可不可以持续发展,这个完全看淘宝这边的政策管的严不严了。
特stse
书接上文。
小舅子他们在特种兵式的几天游玩之后表示最后一天想在家里休息一下,陪着他们吃了一天清淡的食物后,按了个脚,第二天一号他们便各自返回工作地去了。
而我们两口新的征程才刚要开始——下一站勒多曼因。
其实勒多曼因这个行程是五一之前就开始关注了的,因为之前徒步峨眉山、笔架山后加了很多户外群,五一前的偶然一天看到有人发了一个雪山冰湖皮筏艇的照片,并说准备开团出发,景点是我喜欢的那种风格,强度也还能接受,所以进群了解了一下,总共三天行程,:
- 第一天成都集合,乘坐包大巴车出发去康定
- 下午大概四五点到康定,吃晚饭,吃完后坐中转车去老榆林
- 老榆林早起坐转运车出发去山脚下的格因草原开始徒步。
- 徒步20公里,爬升到4300米左右,在山上营地住下。
- 第三天早起冲顶,然后下山。
- 各回各家。
- 我们只需要带两天的路餐,其他的他们包。
- 总费用650元1人,40人成团出发。

当时想着650这价格是真心不贵了,而且恰好能和小舅子他们来的时间错开,所以毫不犹豫的报了两个名。
但是在后面几天接待下舅子的过程中,群里消息不断,组织力度似乎不太够了,总共个加群的人有50多个,接龙说要去的也满了40个人,但是最后交钱的时候却不够包车的40人。
因为人数不够没办法拼大车,群主就开始降级说租20人小车,但是小车价格和大车只便宜了四五百块钱,最后摊下来每个人要多交100元,然后重新组织了一波接龙,不懂贵这100块会产生了多大的化学反应,这次直接20人都没凑齐...。
眼看着要散团了,但是我的瘾又被钓上来了,不想眼看着散团,索性就说我出个车,看有没有其他愿意出车的一起,凑个十几二十个人也还不错,终于在散团之际组织了三个车,最终有17人一起参与了这趟行程。
我们这个7坐车除开我和S,最终分两拨坐了5人。
先是3位泸州的朋友,两男一女,从泸州过来自贡上车,分别是快60的二叔,很会照顾人的刘姐,以及帅气的空少三笑。之后开车去成都接上2泰拳老师和一个川大的大学生。

后面就正式开始发图了,所以这里先吐槽一下这个团。
这个穿山甲不能算是正式的商业团,只能说是有一个大家信的过的群主去联系的车、住宿、餐食,规划好行程后在群里组织的,不过那点组织力几乎是没有,我们因为自驾所以最后减了100的团费,最终收的550元,但是当时承诺的东西一个都没达成,这里罗列已下,下次大家参加这种群性质的团一定要提前问清楚,留好文字存档。
- 说好的只用带路餐,但是最后第一天的晚餐需要自费,第二天的早餐也让我们自费,之后在山上说有鸡汤喝也没有准备,山上的营地的晚餐也很差,更别说早餐馒头还是馊的。
- 说好会花一千多请一个solo过贡嘎的领导,上山后发现人家是带了商团,几乎没管过我们团,另外一个年轻的小伙子说是被叫来管我们,但是就下山看到了他们一下,拍照服务之类的就更别提了。
- 转运车期初以为是什么大巴之类的,上去才知道想多了,全是那种小货卡,上面拉一块篷布就行了,后来听其他上山的说有人坐的车是拉牛羊的,全是屎...。
好了,亏已经吃了,只能说下次注意了。
行程分享正式开始。
我们5月3号从成都出发康定完美错开了车流高峰,全程几乎没有堵车,一路狂奔,车上听二叔说天全服务站有「此生必驾」318的牌子可以打卡,大家商量一致就在天全休息一会儿。


因为是自驾,所以时间比较充裕,路上又没有堵车,我们四点左右就已经到了康定,所以先去刘姐一个朋友开的餐馆吃了一顿菌菇牦牛火锅,老板做的蘸料一绝。

吃完饭才不到5点,所以大家准备一起去逛逛溜溜城。
我们本来是开车进城的,但是穿了一圈都没找到车位,最后在城区里堵了一个小时重新回到康定进城口的边上的一个集中停车场,20元一天,建议大家来这里玩不要想在城区找车位了。


卖青稞大饼,挺香的,下面的店铺15一个,走了一截发现全是从这个店拿的,人家只卖12元,这几步路就有3元的差价。

走到一半发现下雨了,还好穿的冲锋衣。并且凑巧这边有个广场在搞商业活动,似乎是请了什么藏族歌星在唱歌,虽然是藏文歌,但是唱的还挺好听的,不过摇一摇没识别出来。

大家累了坐在路边休息,因为雨大,二叔又没穿冲锋衣,所以暂时和他们分开,我们两口子单独逛去了。

康定旅游局局长同款抖音樱花大街。

溜溜城打卡,为什么叫溜溜城?
“康定溜溜城”这个充满诗意的别称,主要源于康定与《康定情歌》(又名《跑马溜溜的山上》)的深厚渊源。这首传唱世界的民歌让康定以“溜溜”之名广为人知,而“溜溜”在当地方言中更是承载了独特的文化意蕴,在康定及川西方言中,“溜溜”常用来形容事物“美好”“漂亮”“流畅”。


1. 溜溜城打卡 2. 小巷一景
藏族同胞们的广场舞是锅庄,那「锅庄」又是什么呢?。
锅庄(藏语称“果卓”或“歌庄”)是藏族民间广泛流传的一种传统集体舞蹈,尤其在四川、西藏、云南、青海等藏族聚居区盛行。它不仅是重要的娱乐活动,更是藏族文化、宗教和社会交往的载体。

康定的夜景还是非常漂亮的。

天色渐暗后和大家汇合,去往老榆林的民宿休息。
因为对这边的卫生环境不报什么期待,所以提前买了隔脏睡袋,用塑料袋+垃圾桶装了点热水泡脚,早早便躺下休息了。




1. 早起民宿外的风景 2.房间环境 3. 早起窗外的雪山 4. 隔脏睡袋
没有领队,更没有领队说让我们拍出发照,所以我索性叫上大家一起随便拍了一张。

坐上蓬卡就出发了,一路上看不到外面,但感觉早餐都要被颠出来了,估计外面到处都是导弹坑。




1. 格因草原 2. 马帮的马
今天天气不错,依旧没看到领队...。

过木桥,水很凉,都是山上流下来的雪水。低山区


路过一个红石滩


低山区还有很多松树。

在徒步过程中海拔逐渐上升,慢慢树木就变成灌木和草甸,一路上会还经过各种路况:石头路,涉水路,草甸,沼泽等等。


一处绝佳的和雪山合影的机位


我也来一张,在这里不小心把登山杖掉落滚到峡谷下面去了。😅

一爬一个不吱声

有点累,生命力照片一张。

沿途的树木变成了灌木和草甸。

二叔年纪打了,自重也太重,大家都劝他坐马算了,他也听劝,800块直接座马去了营地。后来到营地听他说座马也听危险的,他上去的时候马没站稳前跪了,把他甩到沙地里了,我们在说幸好是沙地...。

终于走了快一半了,两岔河营地吃个午餐

继续出发

在一个绝望坡前碰到了其他队友,我不拍照大家是真不想拍合照....,碰上我这种队友是真挺好的。

最不想走的就是这种河谷路段,全是碎石头。还碰上大风,风里还夹着小粒的冰雹。

最后一个绝望坡,进入雪线了,天上也飘起了小雪。


绝望坡后面的美景

终于到营地了!


营地景色全览


太累了,完全不想拍照用其他人发的照片把。


休息的棚子。营地的饭菜很不好吃,大家草草吃完便都上床准备休息。


因为营地在海拔4300米左右,加上棚子里氧气不太流通,所以帐篷里十几号人晚上过夜的时候都有不同程度的高反,症状基本上都是头疼。我后半夜睡了会,基本上是醒半小时睡半小时左右,我旁边的一个大学生几乎整夜没睡觉,两三点的时候还爬起来说想下山...,一整晚的噪音把他旁边的一个能睡着的老驴折腾到一晚上没怎么睡,感觉老驴也很难受哈哈。
S就是说觉得冷,因为棚子四处漏风,漏风最严重的就是我们躺下后头顶的地方,风大的时候我问不得不起来给她过上急救毯才好些。
后半夜风停了,我帮她把睡袋裹紧,把头罩住就留个鼻子嘴巴出来,才算是踏踏实实睡了好几个小时,比我有出息多了。

第二天四五点大家便陆续起床了,还能看到星空,但是我手机和充电宝都被冻没电了。

早餐的包子是馊的,我就喝了点稀饭,吃了自己带的面包。
因为出发的时候黑黢黢的,手机也没电了,就没拍什么照片,同行的刘姐借了他的充电宝给我用,让我得以续命。
天终于渐渐亮起来,发现我们被大雾追赶着,手机也有一些电了。


跟着前面的队伍的步伐,发现我们没有走常规的泥巴路线,而是条沿着河谷上行的碎石路段,然后踩着雪沿着山脊线的去往山顶,体验顶满,后来听前面的队友说起才知道,他们跟着一个商团的线路走的。

体验非常棒。

开始爬山脊线。几乎六七十度的大坡,踩着雪前进,非常爽!


就冲这一段爬坡这一趟也值了。

这里的雪一脚下去都能没过膝盖,躺雪上面来一张把。

旁边那条是常规上来的路,马上到了,看上面云层上去的时候应该还能看见雪山。

登顶。
说实话因为湖还没完全化开又被白雪覆盖,也不能去湖面拍照,导致山顶的风景和可玩性很一般,这块白色不知道的人还以为只是一片平坦的雪地。

别的不说,先打个卡把。



看好了,这一剑,会很帅!(换我来拍的时候后面忽然就起了大雾,没拍上😭。)

因为风雪,准备下山了。

后面下山的风景就不发了,下山的时候倒是碰上领队了,因为要做扫尾工作,我们又是垫底的,所以一直被催着下山,搞的我们下山速度飞快,后半段几乎都是跑着下山的。
回到起点。

下雨了,安排第一波人坐皮卡,这波人回到民宿衣服基本上都湿了,我依旧做的蓬卡下山,不过因为没休息好,有点晕车的感觉,差点吐了。

之后便是返程,回去的时候只有泸州的三位和我们一起,另外两个坐其他车了。
也好,我们这几个人更聊的来,我们边开边聊,倒也不觉得累,还拉个群准备下次有什么活动再一起出行。
直到晚上11点30分才安全到达自贡,他们另外拼车叫了个野猪儿回泸州。
这次行程结束我缓了三天才缓过来,每天下班回家几乎粘上枕头就睡,每天的睡眠时长破天荒的突破了8个小时,临近9小时!
下次出行真的不想再开车了。
CommentNotifier
CommentNotifier
Typecho
博客评论邮件提醒,支持异步回调(异步回调优点就是不影响博客评论提交速度),支持编辑邮件模板,支持第三方开发邮件模板,发信方式支持SMTP与阿里云邮箱推送,支持表情回调(需要主题支持)
安装教程
下载后将压缩包解压到 /usr/plugins
目录
文件夹名改为CommentNotifier
登录管理后台,激活插件
配置插件 填写SMTP参数/阿里云邮箱推送参数
支持显示大部分主题的评论表情
软件架构
typecho
版本为1.2.0
及以上
php: >=7.2.0
如果启用SMTP
加密模式PHP需要打开openssl
扩展
邮件服务基于PHPMailer
下载插件
Farallon - 又一款Typecho Theme [置顶]
AI摘要:Farallon是一款移植自`hugo-theme-farallon`的Typecho主题,支持多种自定义功能,如观影页面、友情链接、说说页面等。主题通过Markdown语法实现好物页面的数据获取,并优化了复制链接方式。更新内容包括增加图片灯箱、删除QQ评论通知、显示评论者IP信息等。主题适用于多种插件和API,如豆瓣、Neodb、Memos和Mastodon。
说明
这是我移植的第一款主题
来自hugo-theme-farallon
预览
更新
2025.3.26 0.7.1
两种翻页加载方式
主题设置 travel mid 展示 https://www.imsun.org/category/life/ 样式
设置 memos mid 展示 https://www.imsun.org/category/bb/ 样式
首页列表 说说和 图文 根据后台设置的分类mid 混合展示
删除了添加第三方评论的功能
增加了编辑页面的自定义字段的说明
2025.3.18
更改版本号为0.7.0
修改了好物页面的获取方式,使用Markdown语法表格数据获取
以下为示例
| 图片链接 | 商品名称 | 价格 | 商品链接 | 推荐理由 |
|---------|---------|------|----------|----------|
| https://example.com/ | 商品A | ¥99 | https://example.com/product1 | 这是一个很好的产品 |
| https://example.com/ | 商品B | ¥199 | https://example.com/product2 | 非常推荐购买 |
表格的内容不可缺少
优化了复制链接的方式
说说页面统一使用lightbox2
2025.3.15
增加图片灯箱
删除QQ评论通知
删除显示评论归属地
2024.12.25
使用API查询来获取IP归属地
根据等级设置名字颜色,鼠标悬停在昵称时显示等级,在头像显示评论数
2024.12.12
给评论区加上身份等级
显示留言者的IP信息
删除归档中的字数统计
把豆瓣的设置移到了自定义页面,使用自定义字段设置
使用指南
观影页面说明
by 豆瓣
使用自定义字段设置douban
默认为https://db.imsun.org
by Neodb 0.6.3新增
参照[article id="1688"]
获得获取neodb API
使用自定义字段设置neodb
默认为https://neodb.imsun.org
友情链接说明
使用此模板功能必须使用links
插件
https://www.imsun.org/links
可使用 寒泥
大佬制作的版本或者其他版本
说说页面说明
by memos
Memos请自行部署
https://www.imsun.org/memos/
利用memos实现动态获取说说,仅支持memos v0.20.0以下版本
使用自定义字段设置memos
在自定义字段中填入memos
值为memos地址,不带/
在自定义字段中填入memosID
默认值为1, 当您的ID 不为1时 需要设置
在自定义字段中填入memosnum
默认值为20,默认获取20条最近的memo
by mastodon
https://www.imsun.org/talks/
支持mastodon
gts
pleroma
根据
[article id="1664"]
或者
[article id="1643"]
获得API地址
在自定义字段中填入tooot
值为Mastodon API 地址 例如 https://www.imsun.org/toot.json
标签页面
分类页面
分类图片按照mid.jpg的格式存放在对应的目录中
然后填入相对的url
https://www.imsun.org/category/
归档页面
https://www.imsun.org/archives/
统计页面 0.6.2 移除
首页摘要
优先获取自定义字段summary,其次显示默认字数摘要
好物页面
基于memos
https://www.imsun.org/goods在自定义字段中填入memos
值为memos地址在自定义字段中填入memosID
默认值为1
,不为1
时才需要设置在自定义字段中填入memostag
默认值为好物
,不为好物
时才需要设置
在0.7.0版本移除了以上方式,改用markdown语法实现.
下载地址
Drawnix:无限画布上的开源白板工具
这个项目很早之前就关注过, 那时还没提供 Dockerfile😁
简介
Drawnix 是一款基于 Plait 框架打造的免费开源白板工具,提供思维导图、流程图和自由绘画等功能。依托插件化架构,用户能够随需扩展多种交互组件。每一次操作都能实时保存至浏览器缓存,确保内容不丢失。
核心特性
- 多样化绘图模式
- 支持思维导图、流程图与自由画笔,满足不同场景需求
- 可插入图片,通过简单拖拽丰富画面
- 高效编辑体验
- 撤销、重做、复制与粘贴操作流畅
- 自动保存功能避免意外丢失(浏览器缓存)
- 无限画布与导出能力
- 通过缩放与滚动打造无边界创作空间
- 可将画布导出为 PNG 或 JSON(.drawnix) 文件
- 插件机制与兼容性
- 插件架构支持 Angular、React 等多种 UI 框架
- 自带 Slate 富文本扩展,后续可接入更多文本编辑插件
- 未来可通过社区插件实现更多应用场景
项目
- 代码仓库 plait-board/drawnix
- 官方演示站 drawnix.com
名称灵感
Drawnix ,源于绘画( Draw )与凤凰( Phoenix )的灵感交织。
凤凰象征着生生不息的创造力,而 Draw 代表着人类最原始的表达方式。在这里,每一次创作都是一次艺术的涅槃,每一笔绘画都是灵感的重生。
创意如同凤凰,浴火方能重生,而 Drawnix 要做技术与创意之火的守护者。
Draw Beyond, Rise Above.
与 Plait 框架的深度结合
Drawnix 底层依托作者公司开源的 Plait 画图框架,这是知识库产品的重要技术沉淀。两者紧密结合让开发者享受“一键开箱即用”的便捷,同时还能在业务分层中灵活装载自定义插件。
这款工具不仅是面向个人创作者,同样适用于团队协作与在线教学。无限画布中,每一次涂抹都让构思变得更生动、更立体,技术与想象力在此汇合,带来前所未有的白板体验。
私有化部署
作者已经提供了 Dockerfile,基于此 Dockerfile,我构建了一个镜像, 默认监听 80 端口,除此外无特殊配置
ccr.ccs.tencentyun.com/k7scn/drawnix
基于此97ab1d4构建完成
compose 部署
- docker-compose.yaml
services:
drawnix:
image: ccr.ccs.tencentyun.com/k7scn/drawnix
container_name: drawnix
ports:
- '100.90.80.15:8088:80'
restart: always
然后配置 caddy 代理即可。
k3s 部署
我主要使用 k3s 部署,对外访问使用 cft
- drawnix.yaml
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
labels:
app: drawnix
name: drawnix
namespace: kc-system
spec:
replicas: 1
selector:
matchLabels:
app: drawnix
updateStrategy:
type: InPlaceIfPossible
template:
metadata:
labels:
app: drawnix
spec:
tolerations:
- operator: Exists
nodeSelector:
node-role.kubernetes.io/kc: "true"
containers:
- image: tcr.china.12306.work/github/drawnix
imagePullPolicy: Always
name: drawnix
ports:
- containerPort: 80
protocol: TCP
resources:
requests:
cpu: 100m
memory: 128Mi
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
labels:
app: drawnix
name: drawnix
namespace: kc-system
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
selector:
app: drawnix
type: ClusterIP
apply 之后,在 cfd tunnel 管理页添加公共主机名
演示站
欢迎自建,不保证 SLA,暂时不知道开源版与官方演示有什么区别。
欢迎订阅我的微信公众号,同步更新 😁

说说:又开始出游计划了
前几天说要出去玩,结果突然就拍板定下了,这次计划去爬泰山。途中经过北京顺便也去一趟故宫参观一下!具体的日程可不像之前去西安玩做的那么充足,自带主打一个随性!故宫和泰山其实虽然看起来是核心内容,但是我的心思还是放在吃上了哈哈哈哈哈!
读《巴菲特之道》摘抄
刚刚的伯克希尔年会,巴菲特宣布了即将退休,这将又是一个时代终结。于是本月决定看看跟巴菲特相关的书,《巴菲特之道》这本书介绍了巴菲特的投资理念,内容也不长花了几天就看完了。
巴菲特投资哲学的成长
巴菲特从小就接触投资,做生意积累本金,通过股市赚钱。他人生有几个重要的人,格雷厄姆是他的导师,巴菲特从他这里学会了安全边际,也就是要买价格低于价值的股票。巴菲特在学校是格雷厄姆的学生,毕业后也到格雷厄姆的公司工作了几年,从他这里巴菲特还学会了独立思考。
巴菲特读了费雪的《普通股和不普通的利润》之后,在他的投资理念上更加转向费雪。费雪更加关注公司的成长潜力,以及公司是否有好的管理层,这与格雷厄姆的是两种筛选公司的理念。而巴菲特将两种理念融合,发展出自己的投资准则。
查理芒格,跟巴菲特一样是格雷厄姆的学生,他们是一生的事业伙伴,两人建立了密切的共生关系。
巴菲特的投资准则
巴菲特的投资准则有十二条,分为企业、管理、财务、市场共四个分类,他的很多投资都践行了这些准则的部分或者全部,具体书中单独一章进行了讲解。
具体的准则如下:
企业准则
企业应该简单易懂;
企业应该有持续稳定的运营历史;
企业应该有良好的长期远景;
管理准则:
管理层是否理性?
管理层对股东是否坦诚?
管理层能否抗拒惯性驱使?
财务准则:
-
重视资产净收益,而不是每股盈利
-
计算真正的”股东盈余“
-
寻找高利润率的企业
-
企业每留存一美元,至少产生一美元的市值
市场准则
-
公司是否有价值? 巴菲特通过现金流和合适的折现率确定企业价值,他使用美国政府长期国债利率作为折现率。价值是未来现金流折现后的现值;成长是确定价值的一个因素。
-
当前是否是买入的好时机,价格是否好? 合适的价格+公司表现符合预期才能保证成功,也就是安全边际。
心理学和数学在巴菲特投资中的体现
书中关于持股数量的数学分析,虽然说分散投资可以降低风险,但同时也会降低利润。而巴菲特正是集中投资的范本。书中这段话说的很好,“当世界给予你机会的时候,聪明的投资者会出重手。当他们具有极大赢面时,他们会下大注。其余的时间里,他们做的仅仅是等待。”
巴菲特还是典型的长期主义投资者,通过他的准则可以看到他在选择购买的股票时,也就已经相信这家公司在未来的十年能够创造相当的利润。
系统1与系统2
在丹尼尔·卡尼曼的《思考,快与慢》中首次了解了系统1与系统2,在这本书中再次被提及。系统1是我们的直接思维,一般不花时间,会快速做出判断。而系统2的思维方式是我们认知过程的反思,需要我们投入努力。无论是投资还是做决定,我们都有必要训练系统2,去认真思考,进行推敲。同时在作者看来,具有系统2思维方式的人更加有耐心。
总结
限于个人能力,内容写的比较乱。总结一下巴菲特的成功,理性和耐心是他成功的关键。对于普通人,如果不能够做到这些,并且不愿意花费时间去研究公司,那么巴菲特推荐我们去购买指数基金。
最后用书中的一段话作为结尾。一个人在一生中很难做出数以百计的正确决策,只要做出为数不多的智慧决策就已经足够了。
摘抄
理性的基石就是回望过去、总结现在,分析若干可能情况,最终做出抉择的能力。
投资是经过深入分析,可以承诺本金安全并提供满意回报的行为。不能满足这些要求的就是投机。
格雷厄姆的两项投资原则: 一是不要亏损;二是不要忘记第一条。
任何投资的价值都是公司未来现金流的折现。
巴菲特从格雷厄姆那里学到的最为重要的一课就是:成功的投资来源于,购买那些价格大大低于价值的股票。
从格雷厄姆那里,巴菲特学会了独立思考。如果你是在脚踏实地的基础上得出合乎逻辑的结论,就不要因为别人的反对而耽于行动。
从费雪那里,巴菲特学到了沟通的价值
他定义特许经营权企业的产品或服务:①被需要或渴望;②无可替代;③没有管制
巴菲特说:“市场就像上帝一样,帮助那些自助的人;但和上帝不同之处在于,市场不会原谅那些不知道自己在干什么的人。
在你占据优势的时候要加大筹码。
巴菲特说:“我们所要做的全部就是,将盈利概率乘上可能盈利的数量,减去亏损的概率乘上可能亏损的数量。
当世界给予你机会的时候,聪明的投资者会出重手。当他们具有极大赢面时,他们会下大注。其余的时间里,他们做的仅仅是等待。
巴菲特的风险观:风险与股价之波动无关,与那些个股未来产生利润的确定性有关。
短期而言,股市是台投票机;而长期而言,股市是台称重机。
”首先是将股票视为企业一样,“这将给你一个完全不同于股市中大多数人的视角”。其次是安全边际概念,“这将赋予你竞争优势”。再次是对待股市具有一个真正投资者的态度。
为何懂得人们的冲动是如此有价值:①你能从中学会如何避免多数人的错误;②你可以识别他人的错误,并从中捕捉到机会。
单单有智力不足以取得投资成功,与大脑的容量相比,将理性从情绪中分离出来的能力更为重要。
理性的基石就是回望过去、总结现在,分析若干可能情况,最终做出抉择的能力。
看完评论一下吧
初涉 ML Workflow 系统:Kubeflow Pipelines、Flyte 和 Metaflow
入职 Coupang 两个月了,第一个月主要上手和开发 BOS(Business Operating System)系统,第二个月开始调研选型 ML Workflow 平台。前者目前来说相对比较简单,后者对我来说是一个新坑,也比较有意思,随便写写技术上的体会。
先扯点题外话,其实这次求职有几个比较符合我预期的机会,可在思考之后,我基本上毫不犹豫就选择了 Coupang 这一家。最主要的原因,并非因为雇主,而是因为要做的事情。一个相当规模的团队,在大干一场的早期阶段,要在搭建起属于自己相当规模的 AI infra 来。
我觉得软件行业的巨大的变革,新世纪以来就三次,第一次是互联网应用的崛起,我太小没能做啥;一次是十几年前的 cloud,看着它从爆发式增长到如同水和电一样进入我们的生活,可我算是错过了它比较早期的阶段,即便相当长的时间内我在 Amazon,但是我却并不在 AWS;而这一次,当 AI 的浪潮再来的时候,我就很想行动起来,真正投身其中。程序员的一生能有几个赶这样大潮的机会呢,我不想再错过了。虽说我没有 AI 的技术背景,但我知道 ML infra 到 AI infra 却是个我可以切入的角度——从我最初接触软件开始,尤其是学习全栈技术的时期开始,我就认定,技术是相通的,这十几年来我一直在如此实践。因此在调查和思考之后,我觉得这是一个我不想错过,并且更重要的是自认为能够抓住的机会。
当然,就此打住,我目前只是这个领域的初学者,因此理解并不深入。
Why ML Workflow?
接着说正题,在这一个月之前,虽然我经历过不少关于 workflow 的团队,虽然我参与过从零写完整的 workflow 引擎,但这些都是针对于通用 workflow 而言的,我对于机器学习的工作流,也就是 ML workflow 可以说一无所知。于是在问题和需求调查的过程中,第一个关于它的问题就自然而然出现了,我们是否真的需要 ML workflow,而不是通用的 workflow 系统?
其实,这主要还是由于 ML 的生态所决定的。通用 workflow 可以完成很多的事情,但是在机器学习到 AI 的领域内,这个过程中最主要的目的就是把 raw data 给转换成经过训练和验证的 model,其中有很多部分都是有固定模式,因而自成体系的。举例来说:
- ML workflow 关注数据处理和 ML 或者 AI model 的生命周期,但是通用的 workflow 往往关注将业务流程自动化;
- ML workflow 需要将 artifact 管理、model registry、model insights 和 experiment tracking 等工具集成起来,但是通用的 workflow 往往是业务 application 层面的集成;
- ML workflow 执行的 task 往往需要高 GPU 使用和高内存,这和通常我们讨论的 workflow 的 task 对于 CPU 的使用完全不同。
总之,ML workflow 更像是一个 workflow 中的重要分支,它的特异性显著,因而从架构上它有很多在我们谈论通常 workflow 的时候不太涉及的特点,并且它们具有明显的共性。
ML Workflow 的固定套路
Workflow 这样的系统,和很多 infra 系统不同的地方在于,它具有全栈的特性,需要从端到端从用户完整的 use case 去思考。回想起通用的 workflow,我们会想,用户会去怎样定义一个 Workflow,怎样运行和测试它,并且怎样部署到线上跑起来。这其中的前半部分就是 development experience,而后半部分则是 deployment experience。
首先,对于 development experience 这个角度,ML workflow 有它独特的地方,其中最主要的就是 Python SDK。
通用 workflow 我们讲定义一个新的 workflow 的时候,我们通常都需要写一个 DSL,里面定义了一大堆 task 和依赖关系,而对于做得比较好的 workflow 系统来说,可能还需要一个可视化的 drag-and-drop 界面来方便地创建 workflow。
但是对于 ML workflow 来说,它最特殊之处是对于 Python code 的无缝集成。因为 Python 之于 ML 的地位就像是 Java 之于企业架构的地位,任何一个 ML workflow 客户端首先要考虑支持的编程语言就是 Python,用户通过往大了说是 SDK,而往小了说则是简单的 Python decorators,就可以定义 task 和 workflow。比方说,一个简单的 Flyte 的 hello world:
from flytekit import task, workflow @task def say_hello(name: str) -> str: return f"Hello, {name}!" @workflow def hello_workflow(name: str = "World") -> str: return say_hello(name=name)
在 ML workflow 的世界中,这是除了 DSL 和视图化之外的第三种定义 workflow 和 task 的方式,也是必须具备的方式。
第二个,对于 deployment experience 的角度,大致上是基于 Kubernetes 从 control plane 到 data plane 固定的交互机制。
我不知道这是不是一种关于 ML workflow 的约定俗成,但是通过调研 Kubeflow Pipelines、Flyte 和 Metaflow,我发现这三种对于 control plane 到 data plane 的交互模式是出乎意料地一致。
- KubeFlow Pipelines: client [KFP SDK] -> control plane [API Server -> K8s APIs (CRD changes) -> Workflow Controller / K8s Operator] -> data plane [K8s API -> creating Task Pods -> blob storage]
- Flyte: client [Flyte SDK] -> control plane [Flyte Admin -> K8s APIs (CRD changes) -> Flyte Propeller / K8s Operator] -> data plane [K8s API -> creating Task Pods -> blob storage]
- Metaflow: client [Metaflow SDK] -> control plane [Metaflow Service -> K8s APIs (CRD changes) -> Metaflow Scheduler / K8s Operator] -> data plane [K8s API -> creating Task Pods -> blob storage]
注:也有把 Operator 那一层归为 data plane 的,我觉得都说得过去。
其中 Metaflow 说的是使用 Kubernetes 集成的情况,因为它并不是非得依赖于 Kubernetes。
但大多数使用都是基于 Kubernetes 的,而且基本上都是这个套路,control plane 的 service 收到请求以后,通过创建 K8s CRD objects 的方式告知 workflow controller(scheduler)来执行 workflow,对于 task 的执行通过调用 data plane 的 K8s API 来创建 task pods 执行。
对于特殊的 task,需要交由特殊的 K8s operator 来执行,那么这个 “交由” 的过程,也是通过 K8s 这一层的 CRD change 来实现——Propeller 负责创建 CRD,而对应的 operator 负责 monitor 相应的 CRD 改变并相应地执行任务。Propeller 和 operator 二者互相并不知道对方的存在。这种方式对于保证 operator 的重用性和跨 workflow 系统的统一性简直是太棒的设计了,我们在 try out 的时候,就让 Kubeflow Pipelines 系统中的 operator,去执行 Flyte 给创建的 PTJob 和 TFJob。
关于架构,我觉得 Flyte 的这张架构图对于 components 层次的划分说得非常清楚,下面的 control plane 和 data plane 是可以有属于自己的 cluster 的,不过值得说明的是,真正最终执行的 task pods,也就是图中的最下面的 K8s Pod,也是可以放在另外的 cluster 上,由远程的 K8s API 调用触发的,这样就可以带来更多一层的灵活性:


ML Workflow 的特性比较
再来比较这三个 workflow 的优劣,我并不打算列全,而是简单说说自己印象最深的几点:
- Kubeflow Pipelines 基本上有着最大的社区,因此它相对比较成熟,有自带的基于 CRD 的 K8s-native 的集成,因此可以直接跑 TensorFlow job 和 PyTorch job 之类的;UI 功能也比较强大,可以通过 drag-and-drop 来定制 workflow,也支持 yaml 文件创建 workflow。
- Flyte 最吸引人的是它的 Strong Typing,很多错误能够在编译期本地就能够发现(Kubeflow pipelines 和 Metaflow 都只是 hints);开发过程中,本地直接就能跑,而不需要什么 container;对于 multi-tenancy 支持得最好(比如 RBAC 和 tenant 的 Quota 机制)。
- Metaflow 的 setup 特别简单,而且本地可以直接调试;它对于 AWS 的一些 service 直接可以集成使用,特别方便(比如 Step Functions);Kubernetes 并不是一个依赖,也可以跑在 VM 上等等。
在我把这三者全部在 EKS 上搭了一遍并使用了一圈,也仔仔细细对别了特种特性和优劣之后,我对于 Flyte 的特性比较感兴趣,我觉得它们对我们团队也比较有用。
具体来说,很多区别但最重要的是两个:一个是 strong typing,其它两个都只支持 Python 类型的 hints,就这一点上,和一些 ML engineer 也讨论过,把问题发现在本地,是非常吸引人的;再一个是 multi-tenancy,对其 Flyte 有很多原生的特性支持,在平台完成之后,我们希望把平台上 ML 的能力开放出去,因此这是很重要的一个特性。此外,我也在考虑对于一个 control plane + 多个 data plane 这种 use case 的情况,这部分的需求还比较模糊,但是 Flyte 依然是这方面支持特性相对比较多的一个。
无论最后的结论为何,我希望我们能够比较灵活地部署选中的这个 ML workflow system,比方说,在 CLI 上,我们考虑在更高维度建立出一层,用户使用同样的命令,无论下面执行的 workflow 系统是什么,都不需要改变,这样一来,等到未来如果我们需要支持第二个,应该能够比较容易地整合进去。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接 《四火的唠叨》
解锁高效开发利器——Gitness,助力你的DevOps之旅
在快节奏的软件开发世界中,高效的代码托管和自动化部署是每个开发团队的追求。你是否曾为繁琐的 CI/CD 流程而头疼?是否希望有一个简单易用、功能强大的平台来管理你的代码和流水线?今天,我们为你介绍一款开源神器——Gitness,它将彻底改变你的开发体验。
作为 Drone 和 Gitness 深度定制用户,我还值得很推荐的。
什么是 Gitness
Gitness 是一个集代码托管与自动化 DevOps 流水线于一体的开源开发平台。作为 Drone CI 的下一代产品,Gitness 不仅保留了强大的持续集成(CI)功能,还新增了源代码托管能力,支持本地部署和 Docker 容器化运行。无论是个人开发者还是小型团队,Gitness 都能提供灵活、高效的解决方案。
核心亮点
- 一体化平台:代码托管 + CI/CD 流水线 + 制品库
- 用户友好:提供直观的 UI 界面、REST API,满足不同开发者的使用习惯
- 灵活部署:支持私有化本地部署
- 开源免费:完全开源,社区驱动,适合预算有限的团队(非常适合个人用户)
对比 Drone、Woodpecker
- 目前支持 Runner 有限,仅支持 docker
- 新增的制品库支持的种类相对比较少,常见的 Docker、Helm 是没问题的
- 目前数据库仅支持 PG、Sqlite3
- 流水线
- 日志相比较 v2 仅支持存储到数据库,暂不支持存储到对象存储
- 不支持重复执行(如定时、失败重试)
- 流水线语法变更,相比较 Drone、Woodpecker 等 v2 版本的语法,功能缺少较多,但是满足基本使用
- 代码仓库功能完善,日常使用是没问题
部署
环境变量配置
目前官方文档未提供,需要参考官方文档 harness/harness#config.go
部署
镜像:
harness/harness:unstable
- 国内镜像
ccr.ccs.tencentyun.com/k7scn/harness:unstable
- docker-compose.yaml
services:
gitness:
image: harness/harness:unstable
container_name: gitness
restart: always
ports:
- "3000:3000"
- "3022:3022"
volumes:
- /data/gitness:/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- GITNESS_DEBUG=true
- GITNESS_TRACE=true
- GITNESS_GIT_TRACE=true
- GITNESS_GIT_DEFAULTBRANCH=master
- GITNESS_WEBHOOK_ALLOW_LOOPBACK=true
- GITNESS_WEBHOOK_ALLOW_PRIVATE_NETWORK=true
- GITNESS_METRIC_ENABLED=false
- GITNESS_PRINCIPAL_ADMIN_UID=ysicing
- GITNESS_PRINCIPAL_ADMIN_DISPLAY_NAME=ysicing
- GITNESS_PRINCIPAL_ADMIN_EMAIL=ysicing@12306.work
- GITNESS_PRINCIPAL_ADMIN_PASSWORD=ysicing
# - GITNESS_SMTP_HOST=
# - GITNESS_SMTP_PORT
# - GITNESS_SMTP_USERNAME
# - GITNESS_SMTP_PASSWORD
# - GITNESS_SMTP_FROM_MAIL
# - GITNESS_SMTP_INSECURE
- GITNESS_GITSPACE_DEFAULT_BASE_IMAGE=ccr.ccs.tencentyun.com/k7scn/base:dev-ubuntu-24.04
- GITNESS_UI_SHOW_PLUGIN=true
- GITNESS_URL_GIT=http://192.168.23.16:3000/git
- GITNESS_URL_UI=http://192.168.23.16:3000
- GITNESS_URL_API=http://192.168.23.16:3000/api
- GITNESS_URL_GIT_SSH=ssh://192.168.23.16
- GITNESS_SSH_ENABLE=true
# - GITFOX_SSH_PORT=3022
# - GITNESS_CI_PARALLEL_WORKERS=2
# - GITNESS_GIT_ROOT
- GITNESS_CI_PLUGINS_ZIP_URL=https://c.ysicing.net/oss/offline/master.zip
部署完成,使用 IP:3000 访问. 账号密码需要使用设置的 GITNESS_PRINCIPAL_ADMIN_UID
和 GITNESS_PRINCIPAL_ADMIN_PASSWORD
目前配置参数过多,稍微配置不对还可能有 bug。针对这个
- 我司会开源 GitFox,基于 Gitness 定制的 fork 版本,一些额外特性功能的补充(企业、与禅道的联动)
- 我个人也维护了一套 Gitness 的魔改版本 Gitless,在上游的版本增加了个人开发者常用的特性(仅从我个人使用)
使用说明
这里简单过一些,后面会专门写一些文章介绍一下。
创建组织
对应其他 Git 服务的组织(ORG/GROUP)
创建仓库
流水线
执行流水线,目前支持部分 drone 插件,基本可以拿来就用如果熟悉 drone 和 gitness 的流水线语法的话
制品仓库
目前支持如下,感觉是借鉴了 Nexus,基本已经覆盖了日常使用。
WebIDE
总结
Gitness 不仅是一款工具,更是开发者高效协作的伙伴。无论你是追求极致效率的个人开发者,还是需要稳定流水线的小型企业团队,Gitness 都能满足你的需求。不过有一说一,目前 Gitness 还是处于快速发展阶段,有 Bug 是正常不过的事,但是基本功能还是没啥问题的。其次他们开源版本支持力度不是那么紧急,更多的还是服务他们的 SAAS 产品。

用户外活动填满五一:勒多曼因篇
null
书接上文。
小舅子他们在特种兵式的几天游玩之后表示最后一天想在家里休息一下,陪着他们吃了一天清淡的食物后,按了个脚,第二天一号他们便各自返回工作地去了。
而我们两口新的征程才刚要开始——下一站勒多曼因。
其实勒多曼因这个行程是五一之前就开始关注了的,因为之前徒步峨眉山、笔架山后加了很多户外群,五一前的偶然一天看到有人发了一个雪山冰湖皮筏艇的照片,并说准备开团出发,景点是我喜欢的那种风格,强度也还能接受,所以进群了解了一下,总共三天行程,:
- 第一天成都集合,乘坐包大巴车出发去康定
- 下午大概四五点到康定,吃晚饭,吃完后坐中转车去老榆林
- 老榆林早起坐转运车出发去山脚下的格因草原开始徒步。
- 徒步20公里,爬升到4300米左右,在山上营地住下。
- 第三天早起冲顶,然后下山。
- 各回各家。
- 我们只需要带两天的路餐,其他的他们包。
- 总费用650元1人,40人成团出发。

当时想着650这价格是真心不贵了,而且恰好能和小舅子他们来的时间错开,所以毫不犹豫的报了两个名。
但是在后面几天接待下舅子的过程中,群里消息不断,组织力度似乎不太够了,总共个加群的人有50多个,接龙说要去的也满了40个人,但是最后交钱的时候却不够包车的40人。
因为人数不够没办法拼大车,群主就开始降级说租20人小车,但是小车价格和大车只便宜了四五百块钱,最后摊下来每个人要多交100元,然后重新组织了一波接龙,不懂贵这100块会产生了多大的化学反应,这次直接20人都没凑齐...。
眼看着要散团了,但是我的瘾又被钓上来了,不想眼看着散团,索性就说我出个车,看有没有其他愿意出车的一起,凑个十几二十个人也还不错,终于在散团之际组织了三个车,最终有17人一起参与了这趟行程。
我们这个7坐车除开我和S,最终分两拨坐了5人。
先是3位泸州的朋友,两男一女,从泸州过来自贡上车,分别是快60的二叔,很会照顾人的刘姐,以及帅气的空少三笑。之后开车去成都接上2泰拳老师和一个川大的大学生。

后面就正式开始发图了,所以这里先吐槽一下这个团。
这个穿山甲不能算是正式的商业团,只能说是有一个大家信的过的群主去联系的车、住宿、餐食,规划好行程后在群里组织的,不过那点组织力几乎是没有,我们因为自驾所以最后减了100的团费,最终收的550元,但是当时承诺的东西一个都没达成,这里罗列已下,下次大家参加这种群性质的团一定要提前问清楚,留好文字存档。
- 说好的只用带路餐,但是最后第一天的晚餐需要自费,第二天的早餐也让我们自费,之后在山上说有鸡汤喝也没有准备,山上的营地的晚餐也很差,更别说早餐馒头还是馊的。
- 说好会花一千多请一个solo过贡嘎的领导,上山后发现人家是带了商团,几乎没管过我们团,另外一个年轻的小伙子说是被叫来管我们,但是就下山看到了他们一下,拍照服务之类的就更别提了。
- 转运车期初以为是什么大巴之类的,上去才知道想多了,全是那种小货卡,上面拉一块篷布就行了,后来听其他上山的说有人坐的车是拉牛羊的,全是屎...。
好了,亏已经吃了,只能说下次注意了。
行程分享正式开始。
我们5月3号从成都出发康定完美错开了车流高峰,全程几乎没有堵车,一路狂奔,车上听二叔说天全服务站有「此生必驾」318的牌子可以打卡,大家商量一致就在天全休息一会儿。


因为是自驾,所以时间比较充裕,路上又没有堵车,我们四点左右就已经到了康定,所以先去刘姐一个朋友开的餐馆吃了一顿菌菇牦牛火锅,老板做的蘸料一绝。

吃完饭才不到5点,所以大家准备一起去逛逛溜溜城。
我们本来是开车进城的,但是穿了一圈都没找到车位,最后在城区里堵了一个小时重新回到康定进城口的边上的一个集中停车场,20元一天,建议大家来这里玩不要想在城区找车位了。


卖青稞大饼,挺香的,下面的店铺15一个,走了一截发现全是从这个店拿的,人家只卖12元,这几步路就有3元的差价。

走到一半发现下雨了,还好穿的冲锋衣。并且凑巧这边有个广场在搞商业活动,似乎是请了什么藏族歌星在唱歌,虽然是藏文歌,但是唱的还挺好听的,不过摇一摇没识别出来。

大家累了坐在路边休息,因为雨大,二叔又没穿冲锋衣,所以暂时和他们分开,我们两口子单独逛去了。

康定旅游局局长同款抖音樱花大街。

溜溜城打卡,为什么叫溜溜城?
“康定溜溜城”这个充满诗意的别称,主要源于康定与《康定情歌》(又名《跑马溜溜的山上》)的深厚渊源。这首传唱世界的民歌让康定以“溜溜”之名广为人知,而“溜溜”在当地方言中更是承载了独特的文化意蕴,在康定及川西方言中,“溜溜”常用来形容事物“美好”“漂亮”“流畅”。


1. 溜溜城打卡 2. 小巷一景
藏族同胞们的广场舞是锅庄,那「锅庄」又是什么呢?。
锅庄(藏语称“果卓”或“歌庄”)是藏族民间广泛流传的一种传统集体舞蹈,尤其在四川、西藏、云南、青海等藏族聚居区盛行。它不仅是重要的娱乐活动,更是藏族文化、宗教和社会交往的载体。

康定的夜景还是非常漂亮的。

天色渐暗后和大家汇合,去往老榆林的民宿休息。
因为对这边的卫生环境不报什么期待,所以提前买了隔脏睡袋,用塑料袋+垃圾桶装了点热水泡脚,早早便躺下休息了。




1. 早起民宿外的风景 2.房间环境 3. 早起窗外的雪山 4. 隔脏睡袋
没有领队,更没有领队说让我们拍出发照,所以我索性叫上大家一起随便拍了一张。

坐上蓬卡就出发了,一路上看不到外面,但感觉早餐都要被颠出来了,估计外面到处都是导弹坑。




1. 格因草原 2. 马帮的马
今天天气不错,依旧没看到领队...。

过木桥,水很凉,都是山上流下来的雪水。低山区


路过一个红石滩


低山区还有很多松树。

在徒步过程中海拔逐渐上升,慢慢树木就变成灌木和草甸,一路上会还经过各种路况:石头路,涉水路,草甸,沼泽等等。


一处绝佳的和雪山合影的机位


我也来一张,在这里不小心把登山杖掉落滚到峡谷下面去了。😅

一爬一个不吱声

有点累,生命力照片一张。

沿途的树木变成了灌木和草甸。

二叔年纪打了,自重也太重,大家都劝他坐马算了,他也听劝,800块直接座马去了营地。后来到营地听他说座马也听危险的,他上去的时候马没站稳前跪了,把他甩到沙地里了,我们在说幸好是沙地...。

终于走了快一半了,两岔河营地吃个午餐

继续出发

在一个绝望坡前碰到了其他队友,我不拍照大家是真不想拍合照....,碰上我这种队友是真挺好的。

最不想走的就是这种河谷路段,全是碎石头。还碰上大风,风里还夹着小粒的冰雹。

最后一个绝望坡,进入雪线了,天上也飘起了小雪。


绝望坡后面的美景

终于到营地了!


营地景色全览


太累了,完全不想拍照用其他人发的照片把。


休息的棚子。营地的饭菜很不好吃,大家草草吃完便都上床准备休息。


因为营地在海拔4300米左右,加上棚子里氧气不太流通,所以帐篷里十几号人晚上过夜的时候都有不同程度的高反,症状基本上都是头疼。我后半夜睡了会,基本上是醒半小时睡半小时左右,我旁边的一个大学生几乎整夜没睡觉,两三点的时候还爬起来说想下山...,一整晚的噪音把他旁边的一个能睡着的老驴折腾到一晚上没怎么睡,感觉老驴也很难受哈哈。
S就是说觉得冷,因为棚子四处漏风,漏风最严重的就是我们躺下后头顶的地方,风大的时候我问不得不起来给她过上急救毯才好些。
后半夜风停了,我帮她把睡袋裹紧,把头罩住就留个鼻子嘴巴出来,才算是踏踏实实睡了好几个小时,比我有出息多了。

第二天四五点大家便陆续起床了,还能看到星空,但是我手机和充电宝都被冻没电了。

早餐的包子是馊的,我就喝了点稀饭,吃了自己带的面包。
因为出发的时候黑黢黢的,手机也没电了,就没拍什么照片,同行的刘姐借了他的充电宝给我用,让我得以续命。
天终于渐渐亮起来,发现我们被大雾追赶着,手机也有一些电了。


跟着前面的队伍的步伐,发现我们没有走常规的泥巴路线,而是条沿着河谷上行的碎石路段,然后踩着雪沿着山脊线的去往山顶,体验顶满,后来听前面的队友说起才知道,他们跟着一个商团的线路走的。

体验非常棒。

开始爬山脊线。几乎六七十度的大坡,踩着雪前进,非常爽!


就冲这一段爬坡这一趟也值了。

这里的雪一脚下去都能没过膝盖,躺雪上面来一张把。

旁边那条是常规上来的路,马上到了,看上面云层上去的时候应该还能看见雪山。

登顶。
说实话因为湖还没完全化开又被白雪覆盖,也不能去湖面拍照,导致山顶的风景和可玩性很一般,这块白色不知道的人还以为只是一片平坦的雪地。

别的不说,先打个卡把。



看好了,这一剑,会很帅!(换我来拍的时候后面忽然就起了大雾,没拍上😭。)

因为风雪,准备下山了。

后面下山的风景就不发了,下山的时候倒是碰上领队了,因为要做扫尾工作,我们又是垫底的,所以一直被催着下山,搞的我们下山速度飞快,后半段几乎都是跑着下山的。
回到起点。

下雨了,安排第一波人坐皮卡,这波人回到民宿衣服基本上都湿了,我依旧做的蓬卡下山,不过因为没休息好,有点晕车的感觉,差点吐了。

之后便是返程,回去的时候只有泸州的三位和我们一起,另外两个坐其他车了。
也好,我们这几个人更聊的来,我们边开边聊,倒也不觉得累,还拉个群准备下次有什么活动再一起出行。
直到晚上11点30分才安全到达自贡,他们另外拼车叫了个野猪儿回泸州。
这次行程结束我缓了三天才缓过来,每天下班回家几乎粘上枕头就睡,每天的睡眠时长破天荒的突破了8个小时,临近9小时!
下次出行真的不想再开车了。
Passport
Passport
本插件为 Typecho 博客系统提供密码找回功能。用户可以通过注册邮箱接收密码重置链接,从而重新设置账户密码。
原始仓库地址: typecho-fans/plugins/Passport
此版本在原版基础上进行了功能增强和 UI 优化。
下载
开源地址:https://github.com/little-gt/PLUGION-Passport
功能
- 通过邮件发送密码重置链接。
- 支持 SMTP 服务器配置,保证邮件发送的可靠性。
- 可自定义密码重置邮件模板。
支持多种验证码服务:
- Google reCAPTCHA v2 (最新版)
- hCaptcha
- 可选择不使用验证码
- 验证码配置项根据所选类型动态显示,界面更简洁。
- 找回密码和重置密码页面的验证码 UI 左对齐,更美观。
- 使用最新的 PHPMailer 库特性。
- 安全可靠的 Token 生成与验证机制。
私有化部署Nexus3镜像源
昨天升级 Nexus3 翻车了,准备基于 PG 重新搭建 Nexus3 源,并移除一些不用的软件源, 新版软件源支持如下
环境要求
- 机器配置至少 2C4G
- 网络要好,推荐境外机器部署
- 大硬盘可选(不代理 py 等还好)
部署
nexus 服务
使用 compose 或者 k8s,原理差不多,我的环境使用 k3s。
- docker-compose.yaml
services:
nexus3:
image: sonatype/nexus3:latest
container_name: nexus3
restart: always
ports:
- "8081:8081"
environment:
- INSTALL4J_ADD_VM_PARAMS=-Xms2703m -Xmx4G -XX:MaxDirectMemorySize=2703m -Djava.util.prefs.userRoot=/nexus-data/javaprefs
- NEXUS_DATASTORE_ENABLED=true
- NEXUS_DATASTORE_NEXUS_JDBCURL=jdbc:postgresql://postgres:5432/nexus3
- NEXUS_DATASTORE_NEXUS_USERNAME=oup44Fai4ta
- NEXUS_DATASTORE_NEXUS_PASSWORD=ienah9eiquah7GeiMaengeitie5aeq66
volumes:
- /data/nexus/nexusdata:/nexus-data
depends_on:
- postgres
postgres:
image: bitnami/postgresql:17
container_name: postgres
environment:
- POSTGRESQL_DATABASE=nexus3
- POSTGRESQL_USERNAME=oup44Fai4ta
- POSTGRESQL_PASSWORD=ienah9eiquah7GeiMaengeitie5aeq66
volumes:
- /data/nexus/postgres:/bitnami/postgresql
restart: always
在启动前,先创建好目录,并给予权限
mkdir -p /data/nexus/postgres /data/nexus/nexusdata
chmod 777 /data/nexus -R
然后启动, 访问 ip:8081 即可
docker compose up -d
配置 caddy
mirrors.china.12306.work {
import LOG "/var/log/caddy/mirrors.log"
@rootOrIndex {
path /
path /index.html
path /mirror.css
path /.help*
}
handle @rootOrIndex {
file_server {
hide .git
root /etc/caddy/pages/mirrors
}
}
reverse_proxy http://100.90.80.3:8081
}
样式我从网易镜像源借鉴来的
目前支持的软件
本文档由 ysicing 收集整理, 希望能对国内开源软件用户有所帮助.
仅列出部分核心软件包:
- tailscale
- caddy
- docker-ce
- postgresql
- trivy
为什么没有我用的软件包?因为我暂时用不上, 有好的想法可以联系我.

从赵心童世锦赛夺冠聊聊我的斯诺克情缘
Nexus3 容器部署3.70.x升级实践-非成功案例
docker 从 3.70.x 及以下版本升级 3.71.x 及以上版本出现旧数据库不支持错误
官方也很细心给了一份升级文档 upgrading-to-nexus-repository-3-71-0-and-beyond
由于我使用的也是官方镜像,社区也有人给出了解决方案 sonatype/nexus-public#51
友情提示,操作前需要备份持久化数据,避免升级失败,建议先阅读文尾后再参考我的升级
创建 nexus 备份文件
- 设置-系统-任务-创建任务
- 搜索 Backup,选择它
- 创建一下手动触发的任务,备份路径
/nexus-data/backup
就行
- 创建完任务后,点击
backup
任务运行
- 触发备份
- 等待备份完成
不放心,也可以进容器内,看一下:
19:56 ➜ ~ kubectl exec -it pods/nexus3-859bb76886-mc29s -n nat -- bash
bash-4.4$ ls
nexus sonatype-work start-nexus-repository-manager.sh
bash-4.4$ cd /nexus-data/
bash-4.4$ ls
backup blobs cache db elasticsearch etc generated-bundles instances javaprefs kar karaf.pid keystores lock log orient port restore-from-backup tmp
bash-4.4$ cd backup/
bash-4.4$ ls
analytics-2025-05-16-11-56-22-3.70.1-02.bak component-2025-05-16-11-56-22-3.70.1-02.bak config-2025-05-16-11-56-22-3.70.1-02.bak security-2025-05-16-11-56-22-3.70.1-02.bak
bash-4.4$ exit
示例是 k8s 方式,docker 部署也是类似。
数据迁移
查询对应 nexus-db-migrator 迁移工具
需要下载和你 Nexus 版本匹配的 nexus-db-migrator 工具, 最新版本下载 nexus-db-migrator, 目前最新版本是 3.70.4-02
大概格式如下:
https://download.sonatype.com/nexus/nxrm3-migrator/nexus-db-migrator-<version版本号>.jar
由于我的版本是 3.70.1-02
, 选择下载
https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/nxrm3-migrator/nexus-db-migrator-3.70.1-03.jar
可能你对应的版本不存在,可以尝试改 patch 版本,实在不行你就先升级到 3.70.4 最新版本
再次提醒版本一定要匹配上
操作
进入容器内部操作,方便起见, 确保在 /nexus-data/backup
目录下
bash-4.4$ pwd
/nexus-data/backup
下载迁移工具,或者同步到容器内也行(网络不好的情况下)
curl -s -L -O https://sonatype-download.global.ssl.fastly.net/repository/downloads-prod-group/nxrm3-migrator/nexus-db-migrator-3.70.1-03.jar
停 nexus 服务
/opt/sonatype/nexus/bin/nexus stop
执行迁移操作,将数据迁移到 H2
数据库,根据数据量和配置灵活调整 -Xmx4G -Xms4G
值,这里条件有限默认 4G, 执行完成如下图
java -Xmx4G -Xms4G -XX:+UseG1GC -XX:MaxDirectMemorySize=28672M -jar nexus-db-migrator-3.70.1-03.jar --migration_type=h2
再次停 nexus 服务
bash-4.4$ /opt/sonatype/nexus/bin/nexus stop
Shutting down nexus
nexus is not running.
查看迁移的数据
bash-4.4$ ls -ahl nexus.mv.db
-rw-r--r-- 1 nexus nexus 320K May 16 12:19 nexus.mv.db
将迁移的数据文件复制到 db
文件夹中
cp nexus.mv.db /nexus-data/db
然后退出容器
销毁容器
- compose 部署
docker compose down nexus3
- k8s 部署副本改成 0
kubectl scale --replicas 0 deploy/nexus3 -n nat
编辑配置文件
为啥不在容器里编辑,啥工具都没有不方便,而且这个配置持久化了
- 默认配置如下 old
root@nat3:/data/k8s/local/nexus3/etc# cat nexus.properties
# Jetty section
# application-port=8081
# application-host=0.0.0.0
# nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
# nexus-context-path=/${NEXUS_CONTEXT}
# Nexus section
# nexus-edition=nexus-pro-edition
# nexus-features=\
# nexus-pro-feature
# nexus.hazelcast.discovery.isEnabled=true
- 新增
nexus.datastore.enabled=true
, 新配置如下
root@nat3:/data/k8s/local/nexus3/etc# cat nexus.properties
# Jetty section
# application-port=8081
# application-host=0.0.0.0
# nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
# nexus-context-path=/${NEXUS_CONTEXT}
# Nexus section
# nexus-edition=nexus-pro-edition
# nexus-features=\
# nexus-pro-feature
# nexus.hazelcast.discovery.isEnabled=true
nexus.datastore.enabled=true
启动老服务,验证数据库切换成功
- compose 部署
docker compose up -d
- k8s 部署副本改成 0
kubectl scale --replicas 1 deploy/nexus3 -n nat
观察日志,搜索 H2
2025-05-16 12:33:15,378+0000 INFO [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.DataStoreConfigurationDefaultSource - Loaded 'nexus' data store configuration defaults (Embedded H2)
2025-05-16 12:33:15,710+0000 INFO [FelixStartLevel] *SYSTEM com.zaxxer.hikari.HikariDataSource - nexus - Starting...
2025-05-16 12:33:16,018+0000 INFO [FelixStartLevel] *SYSTEM com.zaxxer.hikari.HikariDataSource - nexus - Start completed.
2025-05-16 12:33:16,020+0000 INFO [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.mybatis.MyBatisDataStore - nexus - Loading MyBatis configuration from /opt/sonatype/nexus/etc/fabric/mybatis.xml
2025-05-16 12:33:16,147+0000 INFO [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.mybatis.MyBatisDataStore - nexus - MyBatis databaseId: H2
2025-05-16 12:33:16,346+0000 INFO [FelixStartLevel] *SYSTEM org.sonatype.nexus.datastore.mybatis.MyBatisDataStore - nexus - Creating schema for UpgradeTaskDAO
升级版本失败
直接替换镜像升级就完成了,然后我的数据就没了 😂, 严格按照官方文档来的哇 😂
后续
- 云缘生镜像站暂停营业几天
- 虽然有备份数据,但是不想回滚了,重新部署,数据存储使用 PG 吧

zblog输出热门标签
zblog输出20个热门标签
代码
{php}$tags = $zbp->GetTagList('','',array('tag_Count'=>'DESC'),array(20),'');{/php}
{foreach $tags as $tag}
<a href="{$tag.Url}" rel="tag" title="{$tag.Count} 篇文章">#{$tag.Name}</a>
{/foreach}
其中数量可以自行修改代码中的20
,改成你想要的数量
参数说明
标签网址:{$tag.Url}
标签名字:{$tag.Name}
标签下文章数量:{$tag.Count}
zblog输出分类列表
zblog输出所有分类列表,一般用于侧栏显示
{foreach $categoriesbyorder as $category}
<a href="{$category.Url}" title="{$category.Count} 篇文章" >
{$category.Name}
</a>
{/foreach}
详细参数说明如下图:
AplayerFixed背景音乐插件
AplayerFixed
Aplayer to Typecho背景音乐插件,支持使用InstantClick
或常规pjax
的主题。
功能
- 支持
InstantClick
/常规Pjax
两种模式 - 支持设置播放器位置:左下角或右下角
- 支持设置播放顺序:顺序播放或随机
- 支持调用网易云/QQ音乐歌单(内置meting音乐解析api)
下载
开源地址
学习周刊-总第211期-2025年第20周
Caddy拦截响应处理小记
简单小记,分享一下,主要还是针对 MinIO 异常的处理,其他服务应该也类似
之前配置 MinIO:
xxxx {
import ERR
import LOG "/var/log/caddy/minio.log"
@rootPath {
path /
}
handle @rootPath {
respond "EdgeONE 403 Forbidden" 403
}
reverse_proxy 127.0.0.1:9000
}
仅禁止访问/,且有问题使用 import ERR
兜底
(ERR) {
handle_errors {
redir https://dxgw-{err.status_code}.external.ysicing.net
}
}
之前没太注意,之前这种情况下,如果 MinIO 放回 400 的话是没法拦截的。这时候需要响应匹配器来干活了
域名 {
import LOG "/var/log/caddy/minio.log"
import ERR
@rootPath {
path /
}
handle @rootPath {
respond "EdgeONE 403 Forbidden" 403
}
reverse_proxy 127.0.0.1::9000 {
@error status 4xx
handle_response @error {
respond "EdgeONE 451 Forbidden" 451
}
}
}
在 handle_response
块内,可以使用任何其他指令,功能还挺强大的

因为一个小玩意又写了另一个小玩意
blogscn.fun 一直在改版,最近遇到好多人的rss用php抓取不了,就用py写了一个api,然后就有了上面的产物。
全前端没有后端,用了两个api,一个是rss 抓取的api,一个是头像的gravatar。本来到这里就结束了,订阅的信息全部存储在浏览器缓存。
然后,有个东西加载不出来,清理了一下缓存,然后添加的订阅就,没了!
这就有了下面的折腾,要存就需要登录,需要后端怎么能,不用就存呢?于是乎发现了BaaS,即后端即服务,数据库,验证,存储等。
这不就完美了么!
所以,这个站点只有一个文件 index.html
哎,又一电子垃圾!
天啊!我喝了四天啤酒,居然还发现了人生的意义!
真的很久没写东西了,工作忙得我晕头转向,每天都在各种打转。
不过五一假期来啦,我终于能喘口气,和朋友们、发小们聚在一起,连续喝了四天,太爽啦!
说到啤酒,我觉得白啤和精酿啤酒都还不错,比那些普通的工业啤酒有意思多了,每一口都超有惊喜。
我最近特别爱喝青岛白啤和福佳白啤。
青岛白啤就像个调皮的小家伙,看起来有点朦胧,倒进杯子里,泡沫超多,而且能坚持好久。喝一口,麦芽的甜味和淡淡的香味混在一起,就像刚切开的香蕉,还带点微微的苦味,味道层次超丰富。
福佳白啤就更特别啦,里面加了橘皮和芫荽籽,喝起来特别好喝,还有点特别的味道,特别清新。喝一口,整个人都轻松了,感觉超棒!
我还喝了好多精酿啤酒呢。双合盛的小麦精酿,麦芽的香气特别纯净,喝起来顺滑又清爽,特别棒。还有小象的德式小麦精酿,麦香特别浓郁,口感醇厚,喝起来特别过瘾。
总之,啤酒就像朋友一样,总能找到适合自己的那一款。
如果你也喜欢啤酒,快给我推荐推荐吧!
说不定我也能找到属于你的那一杯快乐呢!🍺
*Ps 这两天领导不在,划划水,上博客看看有没有什么可以折腾折腾的,哈哈!
看到X上的一段话描写中年打工人的状态,太真实了!
“身边很多朋友,几乎都在步入社会几年后,明显感觉自己的心气被剥削了,疲意,麻木,无欲无求。
上班就是为了过周末,没心情搞兴趣爱好,打开书读不进去,躺着玩手机刷短视频。
说是爱钱,但也没有狠下心赚钱,浑浑噩噩,失去所有探索欲和分享欲。
学生时代大家经常一起谈论文学、电影、旅行、音乐、爱情,后来聊天主题只剩下吃饭、加班、赚钱、家庭,活得像个空心人。
贾樟柯写,“生命到这个地方就不再有奇迹出现,剩下的就是和时间做斗争的一种庸常人生。”
作为大多数的我们,有太多现实需要理清,飞速的时间,普通的自己。开始成为社会的螺丝时代的燃料,理解并成为小时候排斥的无趣的人。
不再想什么意义不意义什么高级不高级了,吃饭就吃饭,打牌就打牌,喝酒就喝酒,我做很多事,只是为了驱散生活的倦怠。”
Nook简约主题

Nook
在喧嚣的网络世界,Nook为你打造一处专注表达的宁静之地。极简的设计、温柔的色调、流畅的阅读体验,让每一篇文字都如角落里的微光,安静却充满力量。
支持自定义字体 支持邮箱提醒 拥有文章归档 友链 后台文章类型展现在归档上
- 归档使用
Archives.html
- 友链使用
Links.html
- 关于使用
About.html
- 留言使用
Lving.html
演示
{button href="https://demo.typecho.work/?theme=Nook" type="blue"}在线预览{/button}
下载主题
THYUU/星度主题 25.5.0 更新内容
全局
- 【优化】全局动态面板和页脚区域的背景虚化,减少其饱和度
- 【优化】由于 Chrome 和 Edge 开始内置思源黑体,考虑资源消耗,全局默认字体不再引入在线字体
- 【优化】适当增加全局动态面板按钮的点击区域,防止没有点击中心位置而导致的问题
- 【修复】当点击评论表单时,整体评论区块在 CSS 滚动驱动动画变小的问题
顶栏
- 【新增】整体动态展现,通过新设计的动效在下滑时隐藏,上滑时显示
- 【新增】标识下滑常驻显示并伴随渐变高斯模糊效果,更好突出品牌
- 【新增】标识中主标题(默认站点名称)现支持 HTML 结构,可插入 SVG 增强风格
- 【优化】自定义标识高度受到 CSS 默认值的影响方式,现在修改 SVG 中的 height 属性值可自定义高度
- 【优化】文章目录和全局动态面板的弹出式窗口逻辑
- 【修复】刷新后顶栏状态重置的问题
- 【预告】未来顶栏将会升级风格更现代的智栏,将集成全局消息中心、页面进度动效、文章标题动态、增强交互工具、AI 交互等,敬请期待
首页
- 【优化】精选分类的文章卡片调整样式
- 【优化】焦点板块的自动滑动居中支持小屏设备
- 【优化】限定主题图片过暗时影响顶栏的观感
- 【修复】收缩布局下限定主题封面图不全屏的问题
文章页
- 【新增】通用文章模板首屏文章内容动效
- 【优化】重新调整 H2-H6 文本区块字体大小,使其区分更加明显
- 【优化】略微调整封面图高度
- 【优化】在封面图标题处,现在背景虚化跟随标题内容适应
- 【修复】当封面图过浅时,导致在暗黑风格下看不清的问题
- 【修复】收缩布局下封面图不全屏的问题
分类页
- 【新增】文章描述部分,让访客快速了解文章概要
- 【优化】标题字体大小,追随 H6 字体大小
- 【优化】调整文章分类和标签位置
- 【优化】略微调整封面图高度
THYUU 区块
- 【新增】现在支持 Live Photo,让生活的每一个瞬间都值得纪念
如何正确拉取超大体积的git项目——开发小技巧
最近遇到一个体积相当大的仓库(40GB+),结果在安利给群内小伙伴时,很多人遇到了直接使用 git clone
克隆仓库到本地时,对本地网络的稳定性有巨大挑战,一旦网络波动导致传输中断,就只能从头下载。
很多人拉项目时习惯git clone
一把梭哈,这并不是一个很好的习惯,众所周知国内访问github属于玄学,而且有些项目非常大,搞不好需要好几个小时才能拉取完,长时间+不稳定的网络,很容易出意外。本文就是介绍两种应对超大体积项目的拉取的办法「Git LFS」和「Git fetch」。
Git 的 git clone
命令本身是不直接支持断点续传的,git clone
本质上是创建一个新仓库,并一次性拉取远程所有数据(包括提交历史、分支、标签等)。如果中途中断本地目录会处于不完整状态,直接重试 git clone 会失败,如果你退出终端本地目录也会被清空。
使用 Git Large File Storage(Git LFS)
简单介绍一下 Git LFS
Git Large File Storage(Git LFS)是一个用于管理大型文件的Git扩展工具,旨在解决Git原生对大文件支持不足的问题。
Git LFS 优点
- Git LFS用轻量级文本指针(如oid sha256:…)替换实际大文件,避免仓库臃肿。
- 大文件内容存储在专用服务器(如GitHub LFS、块储存、自建储存、CDN),仅按需下载。
- 支持单个文件GB级别存储,突破Git对文件大小的限制。(比如 github 是单文件小于100MB,单文件大于50MB会出现警告)
- 因为大文件实际是分离储存的,可以优化拉取速度。
- 安装Git LFS 并配置好后,日常 git 操作时,几乎是无感的,Git LFS 会自动处理大文件。
Git LFS 缺点
- 需要项目创建者配合从一开始就使用 Git LFS,如果项目没有采用,对于想要克隆拉取项目的人是没有办法去使用 Git LFS 的。
- 额外的大文件储存和下载都是需要开发者额外掏钱的,像是GitHub就只有10 GiB的免费空间和流量可用,超过的部分需要额外收费。(如果你是pth之类的AI模型文件,huggingface之类的平台给了免费的 LFS 空间)
不要 git clone 一把梭哈,改用 git fetch 分步拉取
简单介绍一下 git fetch 分步拉取
Git LFS 更多面对的是项目中部分文件体积很大的情况,比如Unity项目中的.asset文件、PSD源文件、CSV数据集。但还有一种情况,项目中每个文件体积都不大,可能只有几兆到十几兆,但是项目中文件数量极多,几百上千个,加到一起后整个项目体积也到了 GB 规模。这个时候更适合分步拉取的方式。
和 git clone 相比 git fetch 的优势
- git fetch 基于 Git 对象模型,天然支持断点续传。
- 即使多次中断,只要本地 .git 目录未损坏,均可通过反复执行 git fetch 逐步补全数据。
- 如果中断期间远程仓库新增了提交,git fetch 会同时下载新增内容和未完成的旧内容,最终保持本地与远程一致。
和 git clone 相比 git fetch 的缺点
除了操作稍微多了几个步骤,没任何额外的缺点。
git fetch 分布拉取的方法
- 先手动创建空仓库并构建
.git
文件
mkdir your-repo && cd your-repo
git init
git remote add origin https://github.com/user/repo.git
- 分步拉取数据
git fetch origin --progress # 如果中间传输中断,就在目录下再执行一次这个命令即可。
- 等待拉取完毕(以下仅为举例,请根据实现终端显示为准),这时候项目所有内容都会被打包在
.git/objects/pack
目录下的.pack
文件内。
Resolving deltas: 100% (9999/9999), done.
From https://github.com/user/repo.git
* [new branch] master -> origin/master
* [new tag] v1.0 -> v1.0
* [new tag] v1.1 -> v1.1
* [new tag] v1.2 -> v1.2
* [new tag] v2.0 -> v2.0
* [new tag] v2.1 -> v2.1
* [new tag] v2.2 -> v2.2
* [new tag] v2.3 -> v2.3
* [new tag] v2.4 -> v2.4
* [new tag] v3.0 -> v3.0
- 将需要的分支检出,比如我们检出 master 主分支。
git checkout master
- 其他优化建议
使用浅克隆减少首次下载量,比如只拉取最新分支
git clone --depth 1 https://github.com/user/repo.git
之后再补全历史(或者就干脆不补全,节约点空间)
git fetch --unshallow
总结
总的来说 Git LFS 主要是应对项目中出现几个巨大体积文件的情况,git fetch 主要是应对一次开机无法完成下载的超大型仓库或不稳定网络环境,比直接 git clone 一把梭哈更加灵活。
PS:顺带提一嘴,如果多次中断和重新拉取,可能会在.git/objects/pack
目录下出现很多个.pack文件。如果需要清理的的话,在项目目录下执行git gc --auto
。
再PS:不用在意.pack文件的巨大体积,因为工作目录下你看到的具体文件,是通过硬链接、符号链接构建的,工作目录内的文件和 .pack 中的对象共享同一份数据,并不会真实占用双倍物理空间。实际占用大概是1.2~1.3倍空间,因为.pack文件还是有一定的压缩的。
The post 如何正确拉取超大体积的git项目——开发小技巧 appeared first on 秋风于渭水.
阿里云轻量服务器出网流量监控脚本
说说:#1747140386
比起冰淇淋,我更喜欢你!!!!
{cat_bili p="1" q="16" key="BV1XUZZYBE5U"}
CodeBuddy腾讯云代码助手初体验
本文算个安利吧,目前比 trae 实在,至少不是老是排队,暂时免费使用。
CodeBuddy 是什么
腾讯云出品的代码助手插件, 支持 VSCode
、JetBrains
、微信开发者工具
对比 Cursor
对比我用的 cursor,目前有两大优势
- 暂时免费(Craft 对话限制 50 次/月,很容易用完的)
- Craft 支持从用户需求转到研发需求,最后拆分成迭代执行(
很早之前,就跟同事讨论过这个问题,这个应该是未来发展的趋势)
安装
插件安装教程, 安装完成后,扫码登录
使用
简单演示,空仓库如何写一个 caddy 插件
mkdir go/src/github.com/ysicing/caddy2-admin-ui
cd go/src/github.com/ysicing/caddy2-admin-ui
git init
go mod init
配置助手,默认全启用
- 用户需求 - 研发需求
- 研发需求 - 迭代执行
- 迭代 1 - 迭代 n
可能问题
除写了"垃圾代码"外,偶尔不会重构代码外,Agent 执行命令提示没法获取结果,需要
~/.zshrc
新增如下配置
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"
总结
用的不多,偶尔用用还行,更多的还得关注他们后续的付费计划。

说说:#1747136706
天呐!我还以为是年代经典,结果是近年新歌,mv的色调太棒了,今年夏天一定要去看海!!!!!!!!!!
{cat_bili p="1" q="16" key="BV1u44y1Y79N"}
说说:#1747135960
明明是艳舞,为什么听着听着就悲伤了
-- 她本应在另一个舞台上跳着另一种舞蹈
{cat_webmusic id="1432160750"}
针对邮箱检测是否有gravatar头像
最近一直在完善笔墨迹,博友们提交的邮箱好多没有 Gravatar 头像,然后就写了一个功能来检测有没有头像。
想的朋友也可以提交一下,以前提交过的朋友也可以,再提交一下。
然后又将功能写了一个Gravatar头像检测工具
github:https://github.com/xiangmingya/Avatar_Check
演示:https://avatar-check.maozi.io/
说说:#1747109233
我又想出去玩了,之前去的西安,这玩一下上瘾了,想着去更远的地方旅行。
离我比较远的选择,一个是新疆,一个是西藏,一个是广东,感觉广东是要必去的,不是有一句话,食在广东。
另外出国的话,一个是日本一个是东南亚。太远的暂时也不去想了,出国先去近一些的。
日本的话,以前真的想去,但是现在不知怎么的感觉脱敏了。现在更倾向去东南亚看看。东南亚比较乱,感觉马来西亚会很不错,到时候计划一下嘿嘿😁
store站点被人扒了,虽然事件解决了但是还是让人恶心
{cat_tips_warning color=""}事件已解决,记录个人心情,全程打码,请勿对号入座,评论区切勿人身攻击{/cat_tips_warning}
store站点被人扒了,不是借鉴不是抄袭,而是直接复制粘贴。虽然事情解决了但是过了两天想起来还是非常让人恶心,我必须把这个事情写出来心情才能好受一些。就当作记录一下心路历程水一篇文章,因为事件终归是解决了所以本文出现的内容全都打码了,请勿对号入座。
起因是在一个明媚的午后,我像往常一样打开TSBC群去群里水表情。看到一个新进群的,昵称是“某某typecho主题工作室”,想必也是卖主题的,心里想去看看有没有有趣的主题找找灵感。结果一进去,预加载的文字感到似曾相识,结果一进去,果不其然,我的网站被扒了。于是心里很气愤,但是想着这store站我也不用来卖,不过如果是他自己用的话,说明我的网站也是被大家所认可的,也是挺好的,想着就算了,想着让他既然扒的我的,就让他在网站底部写上模板出处就完事了,比较都改完了。于是我就去群里艾特他,问他怎么回事。本以为对方会说一声抱歉,夸夸我的主题好看于是就拿来用了,我也不会说些什么,但是却一直没有回复。并不是没看群消息不知道我艾特,而且还迎面发b站推广链接,这下就让我从平缓的心态一下子就生气了。
但是更让我意想不到的来了,点进他发的b站推广链接,标题是“Typecho主题之XXX主题展示”,在评论区我赫然看到了以下内容:
woc,用我的模板然后说是自己的?这能忍?于是我又去群里问他咋回事,这时他回我了:
他的意思是他加了一个标签页,就不是扒了,复制粘贴不叫扒叫借鉴了,可是你知不知道你这复制粘贴连抄袭都算不上啊。然后这人又不理我了,我压制住火气加了他好友说,来友好的解决一下吧。
下面我贴上和那个人的私聊记录。
实话没想那么多,当初只是看见设计挺有思路。 所以就写了!
一开始为了缓和气氛,我还特地发了一个委屈的表情,对面回答也很友好,说设计很有思路就拿去用了,但是看他的语气并没有道歉的意思,而是看得上你的主题我拿来用是你的荣幸。
然后我就说,你说的是借鉴思路,而你做的不是借鉴思路而是复制粘贴,结果不知怎么的让对面有些语无伦次,而且说了让人感到很莫名奇妙的言论,他发了这一大段,属实是把我气笑了:
我说了不是特意去想做什么坏事,如果真要我也可以去改CSS名和JS名
你说你不去做坏事,那你拿我的主题官上自己的名字,然后别人问你还说没有关系,是你自己开发的?你没改css还不是因为让我发现了?
我之前设计的也一样被人仿过,我群也有很多用户。我也没瞎说什么
你的意思是别人抄了你的,你就可以抄别人的了?我指正出来是我在瞎说?是我无理取闹?
所以现在你老说的我好像要怎么样似的
你扒了我的主题,一句道歉也没有,还觉得自己很无辜?你不知道自己应该做些什么么?
我就纳闷了 说实话我也还知道有人转了你的 改成wp了
但大家的出发点并不是你说的那样
用“大家”这个词,来主张自己的正义性,【因为“大家”都是这么说的,你来挑刺一是说我无理取闹,无事生非;二是为自己开脱,毕竟“大家”都这么做,我这么做即使不对也是情有可原的?】
然后在我没缓过气的时候补上了一句
懂我意思吗?
他首先表明了自己是正义的一方,然后开始为自己辩解找理由:
你老觉得我在别人那说错了?
我的写法我也不确定跟你一样吗
我后端确实也是typecho但设置全是json解析
所以这个东西我在B站回复 我站的角度是后端 不是前端
不是哥哥,后端谁能看得到啊,而且一直在说的是前端啊,就算你说你的意思是后端,你自己的视频展示的不就是前端么?你展示一丁点后端的内容了么?
然后又来了一句反问,让你自己思考人生:
你自己也清楚 并非你说的我好像在特意说什么
最后他可怜我,回答道:
如果你觉得不行
我到时候抽空 全写过
好吧,这样可以了吧
确实一开始没想那么复杂 就是想做个站 真是有那些坏心思
因为我在挑刺,所以他为了照顾我,所以他说他抽空重写前端,这样我就不会再找他茬了
后面的我也不说什么了,图片里都有。后续就是我让他加上我的跳转链接,他也加上了,然后第二天他就重写了前端,链接也下了,至此至终一句道歉也没有,一句友好的对话也没有,我还得没事卖个萌发个表情缓和气氛。
昨晚看了一眼TSBC群,不知怎的狐狸让他当管理了,也许人家互相认识或者,希望他今后能对得起自己网站的标语:“创意无界,设计有魂”,而不是再扒别人的,日后能对Typecho的发展有些许贡献吧...
如何让老旧打印机支持隔空打印,在Mac上搭建Airprint服务,让USB打印机支持iPhone打印
新版Mac系统安装旧版惠普打印机驱动教程,macos15安装惠普打印机驱动
Zerotier自建planet,Mac和istoreos自组网教程,实现远程访问家庭内网服务
ImageFlow一款更适合个人使用的图床项目
ImageFlow 是一个为现代网站和应用程序设计的高效图像服务系统。它能根据设备类型自动提供最合适的图像,并支持 WebP 和 AVIF 等现代图像格式,显著提升网站性能和用户体验。
主要特性
- API 密钥认证:安全的 API 密钥验证机制,保护您的图片上传功能
- 自适应图像服务:根据设备类型(桌面端/移动端)自动提供横向或纵向图片
- 现代格式支持:自动检测浏览器兼容性并提供 WebP 或 AVIF 格式图片
- 图片过期功能:支持设置图片过期时间,过期后自动删除(支持本地和 S3 存储)
- 简单的 API:通过简单的 API 调用获取随机图片,支持标签过滤
- 用户友好的上传界面:支持拖拽上传,具有暗黑模式、实时预览和标签管理功能
- 图片管理功能:通过直观的管理界面查看、筛选和删除图片
- 自动图像处理:上传后自动检测图像方向并转换为多种格式
- 异步处理:图像转换在后台进行,不影响主服务
- 高性能:优化的网络性能以减少加载时间
- 易于部署:简单的配置和部署流程
- 多存储支持:支持本地存储和 S3 兼容存储(如 R2,
不支持MinIO
) - Redis 支持:可选的 Redis 集成,用于元数据和标签存储,提高性能
项目地址
快速部署
使用 docker compose 快速操作
- 镜像:
soyorins/imageflow
- 国内镜像:
ccr.ccs.tencentyun.com/k7scn/imageflow
git clone https://github.com/Yuri-NagaSaki/ImageFlow && cd ImageFlow
更新配置文件
cp .env.example .env
nano .env
# 主要修改API_KEY和存储方式,想快速体验建议填写local
示例.env
API_KEY=ohji8lob1Sagoh4shizooNe9oxif9pai
STORAGE_TYPE=local
LOCAL_STORAGE_PATH=static/images
CUSTOM_DOMAIN=
MAX_UPLOAD_COUNT=20
IMAGE_QUALITY=75
WORKER_THREADS=4
SPEED=5
WORKER_POOL_SIZE=4
# Debug Mode
DEBUG_MODE=false
启动
docker compose up -d
- 目前版本存在 panic 问题,等后续版本修复, 可以使用
soyorins/imageflow:2.1.1
版本
常见参数设置
API_KEY
, 用于保护上传和管理接口, 推荐使用pwgen 32 1
生成IMAGE_QUALITY
, WebP 转换的质量设置, 数值范围 1-100, 越高表示质量越好,文件越大SPEED
, 范围:0-8 0-8,0=最慢/最高质量,8=最快/最低质量
如何使用
- 打开 IP:8686 端口 输入你在 env 设置的 API_Key
- 上传图片, 支持选择图片的过期时间,添加标签对图片进行分类,图片会自动转换为 WebP 和 AVIF 格式
- 当删除图片时,所有相关格式(原始、WebP、AVIF)将同时被移除

随手拍的烂片
该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/notes/191
记录最近随手拍的烂片。
嘟悠悠农场
南浔古镇
中国动漫博物馆
旭辉广场
西南湖
姚家荡
用户外活动填满五一:瓦屋山篇
瓦屋山
今年的五一感觉是有生以来活动安排的最满的一次。
先是五一假日前老婆把小舅子和大姨妈摇来了自贡,28号落地,带他们吃喝玩乐,30号再去了一次瓦屋山徒步。他们2号走后,3号又马不停蹄的去了康定勒多曼因爬山,来回42公里,最高海拔4600米,5号晚上十一点半才重新回到自贡,我到现在都还有点没缓过劲来。
大姨妈不是第一次来了,小舅子倒是首次过来玩,所以老婆先是安排他们去了上次我们两个人都好评的「电子厂餐馆」——一个本地人都不一定找的到地方的苍蝇馆子,要从主路拐进一条小路,进去走个一两公里才能看到。

小店需要提前预订,不接直接过去的客人,菜都是非常新鲜的。招牌菜是腰花和牛蹄筋,整体口味都是偏重油重辣的,小舅子和大姨妈吃完后两个人在自贡待了几天就打了几天「标枪」。
腰花非常嫩,里面配菜用了一些类似油渣的东西吃起来非常香(不知道是不是勾芡掉落焦化的)。牛蹄筋则是他们的招牌,炖的非常软烂又略带胶原蛋白的口感,强烈所有外地来的朋友过来品鉴。


1. 牛蹄筋 2. 腰花
老婆之后请了假带他们去看了自贡灯会和恐龙博物馆,这部分我要上班就没参与,也就没给他们拍照流念了。
因为瓦屋山风景绝美,这段时间又免门票,所以30号当天我们准备开车带他们去感受一下四川的山川河流和我们最近喜欢上的户外徒步。

瓦屋山位于四川省眉山市洪雅县境内,海拔2830米,是中国最大的平顶桌状山,被誉为“云霭之上的诺亚方舟”。这里拥有原始森林、高山瀑布、杜鹃花海等自然奇观,是世界第二大、亚洲第一大的桌山,与南非开普敦的桌山齐名。山顶平台面积约11平方公里,植被覆盖率超过90%,是珍稀动植物的天堂,如珙桐、大熊猫等。四季景色各异:春赏杜鹃、夏避酷暑、秋观彩林、冬览冰雪,尤其冬季冰瀑堪称一绝。道教文化底蕴深厚,传说为太上老君升仙地,清代曾是川内著名道教圣地。现为国家AAAA级旅游景区,兼具生态与人文价值。
瓦屋山是目前我去过的四川普通爬山类型景点中除九寨沟外资源最全面,最好的一处景点了。
下了高速后还要行使大概20公里左右的盘山公路,最后5公里左右进入景区范围,整个山区被密集且高大的原始雪松森林覆盖,小路在森林中盘旋前进,可以说非常有欧洲或者日本那边原始森林的感觉了。(一路上都是盘山公路,晕车的小伙伴要注意提前吃晕车药)
不多时便能穿山而出看到一个湖,这便是山下一处名为雅女湖的景点,环湖有一条公路,马路边上都是民宿和餐馆。

到达景区大门口时不要停。
我们当时停了,发现到里面游客中心还要一公里左右,又重新上车往里开,最后停在游客中心下的停车场里,20元一天。
准备爬山。

山上的负氧离子非常高,溪流沿着峡谷而下,闻着好闻的空气感觉身体都轻飘飘的。


在山上看到了佛光,后来在朋友圈发现四川这几天到处都能看到这个景象。

路边的溪流和「生命力」照片。


1. 生命力照片 2. 溪流
自拍一个



1. 一只胖胖的熊蜂把花枝都压的下坠了 2. 步道




1. 清澈的湖水 2、3. 瀑布留影

山上瀑布资源丰富,而且落差都非常大。




1. 山上的瀑布2 2. 生命力照片 3、4. 自拍
小舅子和大姨妈平时都是不怎么锻炼的,一路上又流连于美景拍照,所以走走停停五六个小时才到金花坪,状态也几近掏空的状态。虽然我们状态还好的很,刚刚热身的感觉,但在询问了工作人员后发现下午4点以后就不准继续往上了,而且最后一班下山的缆车也会在4点还是5点后停运,所以只能坐缆车下山。
其实我们两口子是想快速冲顶的,因为非工作日前100名登顶的客人会送一块奖牌,不过今天肯定是拿不到了,只有下次再来了。
瓦屋山的缆车非常长,几乎坐了十来分钟才到站,想想上次峨眉山七八十的票价几分钟就到了。这么远的距离冬天不敢想象这一路会有多美,而且每站只要50元。


分两篇写把,下一篇 勒多曼因篇。
大学时光回忆录
该渲染由 Shiro API 生成,可能存在排版问题,最佳体验请前往:https://innei.in/notes/190
有时间整理了下 iCloud 相册,删除了许多没有留恋价值的图片。回顾老照片,感受到当时的感动和喜悦,现在看来也是一种珍贵的回忆。
这段回忆从大学开始,再之前的也找不到了。
2018 年,大一。
小米笔记本 + 黑果,踏上开发之路。
2019 年,大二。开始学习前端,刚开始,学的是 Vue2 + Epxress。
2019 年底,找到了一个 Remote 的实习机会。学习 React。然后在这条路上越走越远。
2020 年,经过了半年疫情和实习,在下半年返校季,凭自己的努力换上了 Macbook Pro,黑果转正。也买了人生第一台游戏机,Nintendo Switch。
2020 年的十月,原神上线了。而我在沉迷塞尔达传说旷野之息。
2020 年底,我开始写 Mix Space,一写就是 5 年。
我把这个小窝,布置的很好,这也是我最快乐的快乐的一段时间。
现在想起来前司给我过生日还是挺感动的。2021.4.1
我真的很早就有在写 Swift UI 了,虽然那时候和 Lakr 还没有和见过面。于 2021 年 4 月在学校图书馆。
2021 年劳动节,第一次来杭州,见到了 Lakr。准备前往蚂蚁实习的预备。
2021.7.7,第一次租房,在杭州,三墩,单间,2750。现在回看真是被割惨了。
2021.8 底,离开了,这两个月过得非常煎熬,一点都不快乐。
后面就是秋招了。
在后面我就毕业了。
大学时光匆匆。
你要学会合群,否则就会被世界抛弃
引言
“你要学会合群,否则就会被世界抛弃”,这样的告诫像紧箍咒般萦绕在每个人的成长过程中。当我们站在成年人世界的门槛前,这个问题却显露出更为深刻的悖论——合群意味着自我消融于集体狂欢中,而刻意不合群又如同在茫茫人海中举起一面孤绝的旗帜。但真正的智慧在于超越这种非此即彼的二元对立,寻找第三条道路:在保持个体完整性的前提下,与世界建立恰如其分的连接。
现代社会的群体焦虑催生了畸形的合群文化。在路口的人潮如同精准运转的齿轮,每个人都面无表情却保持统一节奏。深夜的办公室里,键盘敲击声此起彼伏,格子间里的年轻人与代码共同闪烁着相似的光芒。这样的画面构成了当代社会的经典隐喻——人们害怕被抛弃的恐惧,已经异化成了对整齐划一的病态追求。
心理学研究显示,过度合群会导致”社会认同偏差”,使个体逐渐丧失独立判断能力。《乌合之众》中描述的群体无意识在社交媒体时代被无限放大,朋友圈里的点赞文化、职场中的服从性测试都在强化这种异化过程。我们追求的合群往往不是精神共鸣,而是对主流价值的屈从性认同。
合群
合群的优势
- 资源与机会的拓展:合群者通过广泛社交积累“弱关系”,这些关系可能成为职业发展的跳板。
- 归属感与幸福感:良好的人际关系是幸福感的决定性因素。
- 降低决策成本:随大流的选择能减少独立决策的压力。
合群的弊端
- 自我消解:过度合群可能导致个性湮没,例如为迎合群体而压抑真实想法,最终成为“没有棱角”的人。
- 资源浪费:合群者可能因攀比陷入无效社交,如为维持人脉被迫参加无意义的聚会,消耗时间与金钱。
不合群
不合群的优势
- 独立思考与创新突破:不合群者往往能跳出群体思维桎梏。
- 专注自我成长:独处者可将精力投入热爱之事。
- 避免情绪内耗:不合群者无需为迎合他人隐藏真实情绪,从而减少心理压力。
不合群的弊端
- 社会脱节:过度不合群可能导致信息闭塞、人脉薄弱。
- 孤独感:长期缺乏群体互动可能引发心理问题,甚至诱发抑郁。
结语
树木在森林中既保持根系的独立性,又通过菌丝网络共享养分。这种自然界的智慧启示我们:理想的生存状态应当是”和而不同”。当我们既能保持专业领域的内核稳定,又能在需要时融入多元网络,便实现了对传统身份范式的超越。这不是非此即彼的选择,而是通过持续的身份协商,在流动中共建更开放的价值生态系统。真正的自由,或许就存在于这种进退有度的动态平衡之中。
那些既能享受独处时的深度思考,又能融入群体创造价值的生命状态,才是对抗异化与孤独的最佳姿态。我们不必做燃烧自己的蜡烛,而可以成为既照亮自己也能温暖他人的星火,在浩瀚夜空中书写属于自己的轨迹。
合群与否,不过表象。自洽与否,方为本质。内心丰盈者,独行也如众。
FileCodeBox:告别网盘烦恼,安全高效的文件分享神器
在日常工作生活中,处理敏感项目文件时,担心文件被第三方泄露; 使用第三方网盘时还要下载客户端(客户端有时还给你偷跑流量,美名加速),有时下载还得开会员。如果有这些问题的话,我强烈安利一款开源利器——FileCodeBox!它开源、好用、安全,完美解决文件分享的各种难题,让你轻松搞定工作和生活中的文件传输。
开源地址
- 代码仓库 vastsa/FileCodeBox
- 镜像地址:
lanol/filecodebox
- 国内镜像:
ccr.ccs.tencentyun.com/k7scn/filecodebox
三大优势,解决分享痛点
FileCodeBox 专为文件分享的痛点设计,简单几步就能让你的分享体验焕然一新
超快传输,省时省心
速度取决于你的网络带宽
- 无大小限制:无论是高清设计稿还是海量项目文件,统统支持,轻松上传
- 拖拽即传:无需压缩打包,直接拖文件到页面,秒速完成上传
- 批量分享:支持多文件同时上传和分享,项目交付、团队协作 so easy!
安全可靠,隐私无忧
- 加密保护:分享链接全程加密,只有指定接收者才能访问,杜绝泄露风险
- 阅后即焚:支持设置文件过期时间,自动删除,防止资料被长期留存
- 下载控制:可限制链接使用次数或者有效期,避免文件被恶意传播,敏感资料更安心
极致便捷,随时随地
- 无需注册:凭码取件
- 清爽体验:界面简洁
部署简单
要求
以下任选一个就行,我推荐使用腾讯云锐驰 200M,存储使用赠送的对象存储 😄
- 有公网 IP 的服务器
- 内网穿透走 cloudflare tunnels
PS:
FileCodeBox
也支持对象存储,这里我就不推荐 MinIO 了直接使用本地存储就行,因为这个分享服务我定位是短期临时分享或者按次永久分享。
部署
- docker-compose.yaml
version: "3"
services:
filecodebox:
image: lanol/filecodebox:latest
# image: ccr.ccs.tencentyun.com/k7scn/filecodebox
container_name: filecodebox
volumes:
- /data/filecodebox:/app/data
ports:
- "12345:12345"
restart: always
- caddy
kd.012321.best {
import LOG "/var/log/caddy/kd.log"
reverse_proxy 10.25.123.1:12345
}
分享文件
- 打开网页,点击"分享文件"
- 选择或拖拽文件
- 设置过期时间和次数
- 获取提取码
获取文件
- 打开网页,输入提取码
- 点击获取
- 下载文件或查看文本
是不是用 FileCodeBox 分享文件,简单到不可思议。整个过程无需复杂操作,接收方也不需要注册,真正“即传即得”!
管理面板
访问 /#/admin
输入管理员密码 FileCodeBox2023, 登录后请立即修改
管理文件和配置
如果需要发送私密信息,建议自建,请勿使用第三方服务,避免不必要的问题
最后想说
在数据安全越来越重要的今天,FileCodeBox 不仅是一款工具,更是一种自由、安全的文件分享方式。它让分享变得高效、可控,完美适配各种场景。如果你也厌倦了网盘的限速和收费,或为敏感文件的隐私问题担忧,FileCodeBox 绝对值得一试!
快部署你的 FileCodeBox,体验前所未有的文件分享自由吧!
