早上6点,天边的橙色浪潮
今日小暑,温风携暑。宜"卯起午憩,子时养阴",食"三瓜三豆"(丝瓜、冬瓜、苦瓜;绿豆、赤小豆、扁豆)清湿热,饮荷叶茯苓茶醒脾化浊。衣选苎麻透汗,常按"曲池""足三里"祛湿健运。晨练宜在寅卯之交(5-7点)习"呵"字诀养心火,暮时竹下摇扇纳凉
此时"蟋蟀居宇,鹰始鸷",养生当循"静胜热"之道——如新荷饮露般澄澈心神,守静笃则热自平。暑气蒸腾处,一念清静即生凉。
这个功能其实想搞很久了,之前在某个主题上看到过一个圆形扩散的过渡动画。
当时自己尝试着结合AI实现了一下,虽然大致效果实现了,但是整个流畅度很差,而且存在很多BUG。
前些日子看到大佬发布的 Retypeset 主题上有一个自上而下的过渡动画。流畅度,美观度都非常不错,而且这个主题也是基于Astro实现的,我要抄的话也简单一些 😄。
效果
整个效果实现依旧是基于 Chrome 的 View-Transition 这个特性实现的。如果你的博客有主题切换功能,且是MPA网页,就能通过添加一些简单的脚本和CSS实现这个效果。(SPA能不能用我没测试,根据文档是可以的,但是效果应该不好?)
我粗略理解的整个实现原理大概为:
在切换主题的时候页面会有一个new
版本和一个old
版本。
页面最初时old
会版本覆盖在new
版本之上,在执行完主题设置操作后,让old
版本的高度逐渐缩小,缩小后自然就会把下方的new
显示出来。
这个过程就是我们看到的流畅切换动画。
首先添加一个页面切换的动画CSS,animation-theme-toggle
为切换动画的名称。
/*** 这里的 view-transition-new 和 view-transition-old ***/
::view-transition-new(animation-theme-toggle) {
animation: reveal 0.5s cubic-bezier(0.4, 0, 0.2, 1);
clip-path: inset(0 0 0 0);
z-index: 99;
}
::view-transition-old(animation-theme-toggle) {
animation: none;
z-index: -1;
}
@keyframes reveal {
0% {
clip-path: inset(var(--from));
}
}
接着在主题切换的js实现做一些修改,让主题切换按钮调用此处定义的changeTheme即可,我这里是点击按钮时传入需要切换的主题名称,可以根据自己的主题实现来。
// theme为需要切换的主题名称
const changeTheme = (theme) => {
// 兼容性支持
if (document.documentElement.classList.contains('reduce-motion')) {
updateTheme();
return;
}
// 因为我的侧边栏是没有启用动画效果的
// 但是主题切换时需要启用动画效果,所以这里把原来的设置清空。
const menuContent = document.querySelector('.book-menu-content[data-astro-transition-scope]');
const menuanmi = document.querySelector('.book-menu-content[data-astro-transition-scope]').dataset.astroTransitionScope;
// 临时移除侧边栏的transition:animate="none"属性
if (menuContent) {
menuContent.dataset.astroTransitionScope = '';
}
// 给html设置我们需要的使用的动画类
document.documentElement.style.setProperty('view-transition-name', 'animation-theme-toggle');
document.documentElement.setAttribute('data-theme-changing', '');
// 开始执行动画并且修改主题
const themeTransition = document.startViewTransition(() => {
// 存储主题设置&修改页面主题
localStorage.setItem('name', theme.desc);
localStorage.setItem('theme', theme.name);
localStorage.setItem('themetype', theme.type);
document.documentElement.setAttribute('class', theme.name);
setTheme(theme.desc);
// 切换主题时「自上而下」的效果和「自下而上」的效果轮换着来。
const root = document.documentElement;
const currentFrom = getComputedStyle(root).getPropertyValue('--from').trim();
if (currentFrom === '100% 0 0 0') {
root.style.setProperty('--from', '0 0 100% 0');
} else {
root.style.setProperty('--from', '100% 0 0 0');
}
document.dispatchEvent(new Event('theme-changed'));
});
// 动画执行完毕后执行清理操作
themeTransition.finished.then(() => {
document.documentElement.style.removeProperty('view-transition-name');
document.documentElement.removeAttribute('data-theme-changing');
// 关闭主题列表
document.getElementById('theme').checked = false;
// 恢复侧边栏的transition:animate="none"属性
if (menuContent) {
menuContent.dataset.astroTransitionScope = menuanmi;
}
});
};
看起来可能有点复杂,其实在 const themeTransition = document.startViewTransition(() => {
后面加入你的主题切换函数应该就可以了。
这个函数里面前面5行都是我的主题切换操作,替换这部分,保留其他的就可以了。
想折腾的小伙伴可以试试。
忘记说费用了,最终总费用是700元不到,10人平摊,77元一人,其中:
- 肉类、配菜、调料:250多。
- 零食、饮料、矿泉水:260多。
- 水果、凉菜:110多。
- 其他杂费。
上次白海子徒步时,当时大家伙还在山上呢,就已经在谋划下一次出行去哪儿玩了。
讨论过程中简体美和小熊两位小姐姐便说到本地的一个摄影基地,能看星空、晚霞,位置绝美。因为在白海子上偶遇的那支重装腐败的队伍,大家伙一致同意13号星期五去露营+户外烧烤。
回自贡后大家迅速动员人员,确定时间。
最终白海子之行中几乎全员到达,只有石头哥因为要去勒多曼因所以没参加。其次新来了三位朋友,一位让大家很意外,会唱藏语哥的藏族小伙Joker和开酒吧的帅哥北望。还有一位是当天才知道的简体美姐姐的老公,看起来成熟稳重、儒雅随和,但是在后续的游戏环节中才发现大哥才是最坏的人,哈哈哈。
因为是腐败游,而且还要过夜所以需要准备的东西有很多,首先是装备。
我们一共10人,除了北望、简体美两口子都要在山上过夜,最终一共7人。所以至少需要4顶帐篷。
林老师因为之后想重装,所以新买了一顶,之前那顶旧的可以将就用。小罗之后想重装所以也买了一顶,我上次去牛背山时买了一顶城市帐篷,应该能凑合用,刚好凑够。
桌子一共带了3个,我和北望、简体美各一个,但是体验过后发现出去露营还是要买矮一点的,因为配套的露营椅都不高。我和北望的桌子偏高,坐在露营椅上鼻子几乎已经和桌子齐平了。
最后是灯。
这个大家以后户外活动记得一定要搞个亮一点、持久一点的。在黑漆漆的户外夜晚做饭、玩游戏都得靠他,这次他们带的灯都不咋亮,还好我带了个拍照用的补光灯,60w的亮度太爽了。
这次除了水果都是由我操办。
因为是烧烤,但是我又不太想准备太多种类的材料了,到时候不一定能吃完,而且花样多了采买、处理都很麻烦。
所以只买了3斤上等五花,2斤上等牛肉,这两个作为主食,搭配蒜片和青椒圈以及生菜让大家吃饱应该是没有问题了,然后素菜准备了金针菇和土豆片为辅。
最后以防大家吃不饱我在PDD上买了一些淄博小饼(最终还是没吃上)。
简体美姐姐则是准备水果和卤菜,带了西瓜、樱桃、柠檬乌骨鸡脚等。
零食是我准备的,因为考虑当天晚上如果没吃饱和第二天早上早餐,除了一些常规薯片、辣条之类的我还带了些方便面螺蛳粉等。
玩的东西都是由我准备的。
首先是带了Switch、投影仪,但是当时吃完饭乱糟糟的,晚风又很大,所以Switch+投影基本上没用。
之后是在PDD买了一个15件套的聚会桌游卡牌,但是最终实际在玩的时候发现并没有那么好玩,反而是霜临是想的什么萝卜拍手、青蛙跳下水、故事接龙等游戏更接地气,大家玩的更开心。
其实当时我想自己打个剧本杀过去的,目的性更强,也更有融入感,因为有角色扮演的成分,还能增强大家的互动。
本来是想剪个vlog给借相机给我的Soulizer汇报下成果,但是出发时和霜因为其他事情吵了一嘴,就完全没有用Action拍视频的心情了,拍照也不多,只能凑合剪了个短视频。
露营的地方算是我们这的一处“高山”了。
是个摄影基地,去的时候有三对新人正在拍照,我们只能等他们拍完再布置营地。
夕阳西下
不知道为啥,总感觉有种包青天片头的感觉
8点太阳下山后摄影公司的人准备走了,让别人帮忙拍个集体照,猜猜都是谁?
摆好桌子开始烤,太阳已经下山,但是天边还泛着鱼肚白。
来,喝一个。
俯拍一个我们的烤肉摊
一只趋光的绿甲虫
我带了一点过年没放完的烟花
中间玩游戏基本上没拍什么照片,一直玩到12点左右,因为北望、简体美姐姐他们不过夜,为了安全他们就先走了,我们剩下的人则关了灯看着星星畅谈人生。
两点左右终于舍得进帐篷了,外面的月亮像是白昼。
大概睡了四个小时左右,虽然当天有橙色高温预警,但是山上意外的凉快。
五点半便早早醒了,日头还没上来,但是天边已经开始变粉。
夏老师也起的很早,起来也没事,我们俩便开始整理营地垃圾,最后收拾出了四个大口袋的垃圾,但是忘记拍照了。
大家也陆续起床了,才发现霜拿的居然是火鸡面,🥵,螺丝粉忘拍了,味道很棒。
藏族小伙Joker和小罗
香蕉沙发打个卡
End。
回来也照猫画虎,学林老师写了几段文邹邹的句子:
落霞透过瞳孔在心理烙下粉色的印记,
放荡不羁的灵魂们在夜空下肆意迸发出独属于他们的花火。
晚风轻抚,
不知名昆虫的嘶鸣断断续续,
同伴手指上带上天然的绿色宝石戒指,
恰似自然的赠宝。
月光明亮如昼。
恍惚间似回到五六岁大小幼童年岁,
月光如霜,此时此刻恰似彼时彼刻。
但却下一刻却又猛的被抽离回三十余岁,
惊觉此时此刻已非彼时彼刻。
徒叹白驹过隙,不复年少。
null
林老师是搞文字工作的,也就是昨天我那篇游记中同我在溜溜城门口高歌的眼镜帅哥。平日里和我们相处都是骚、浪、贱三字的代名词。但是从人潮里褪去后确是一个感情细腻敏感的小伙子。
下山回来后我们便怂恿他写一篇小作文,本来他还傲娇着不愿写,不过坳不过大家起哄,今天上午摸鱼着写了此文。
觉得写的真的非常好,便转载到我的博客,希望大家喜欢。
作者:林老师 昵称:向露冷风。
我在浪漫的康定,把一首又一首浪漫的歌谣唱得支离破碎。
街灯在湿漉漉的玻璃上晕开,模糊成一片流动的暖黄。
那黄光里,似乎还摇曳着方才溜溜城台阶上未尽的喧嚣与歌声。
夜中的溜溜城,萨克斯的乐声便在这片暖色里流淌,铜管映着溜溜河的奔腾泛着温润的光泽。
吹奏者是个头发凌乱的中年汉子,似若雅典城里诵讲史诗的吟游诗人,闭着眼,嘴唇贴着吹口,指头在按键上起伏跳跃,乐音便自那铜管中汩汩涌出,缠绵又悠长,仿佛将整个高原的辽远与寂寥都含在了唇齿之间。
乐声拂过我的耳际,又飘向更远处,在暮色里织成一张无形的网,笼住了台阶上散坐的人们。
我坐在溜溜城大门的石阶上,身下石阶的凉意透过衣裤渗入肌肤。
眼前人影晃动,如溜溜河水流淌不息。
有背着行囊的旅人步履匆匆,眼神里装着远方;有穿着艳丽藏袍的各地姑娘走过,银饰叮当,裙裾旋起一阵风;还有男人牵着女人的手,慢悠悠踱着步子,影子被斜灯拉得很长很长。
台阶之上,众生百态,各自背负着各自的故事,匆匆交汇,又匆匆离散,仿佛高原上倏忽聚散的流云。我坐在这台阶,恍若人世一个小小的渡口。
伙伴们终于从四面八方汇拢过来,脸上都带着风尘仆仆的笑意。
我率先起头,那首熟稔的调子便从唇边溜了出来:“跑马溜溜的山上……”声音起初还有些拘谨,如同试探着伸出的触角。
很快,第二声、第三声便汇入进来,如同涓涓细流汇成了奔涌的河。
我们彼此相视,眼神里跳跃着一种心照不宣的火焰,声音便愈发高亢起来,毫无章法地冲撞着暮色,撞向溜溜城古老的飞檐斗拱。
那歌声,莽撞、粗粝,却又带着一股莫名的、近乎悲怆的欢喜。
我们这群滴酒未沾的人,竟醉得东倒西歪,脸颊滚烫,胸腔里仿佛有滚烫的酥油茶在翻腾。
这醉意,并非源于杯中之物,而是从心底深处蒸腾而起,在高原微凉的晚风里发酵、弥漫,将灵魂都托举起来,飘飘然不知归处。伙伴们终于从四面八方汇拢过来,脸上都带着风尘仆仆的笑意。
坐进出租车回住处时,那莫名的醉意仍未消散,反而在狭小的车厢里愈发浓烈起来。
我们像一群挣脱了缰绳的马驹,将一首又一首的歌谣,不管不顾地抛向窗外飞逝的夜色。
从古老民谣到流行小调,从慷慨激昂到低回婉转,歌声在车厢里横冲直撞,几乎要掀翻车顶。
司机师傅笑着,也不时应和几句,任这些樊笼中呆久了的人在另一个樊笼里沸腾。车窗外,康定城的灯火渐次入目,又渐次被抛在身后,成为记忆里模糊的光斑。歌声穿透车窗,在高原清冽的夜气里飘散开去,仿佛一群不知疲倦的夜鸟,扑棱棱飞向墨蓝的夜空深处。
那一夜,我们唱着支离破碎的歌谣,送给了支离破碎的自己。
翌日清晨,我们便向着白海子进发了。
山路崎岖,如同大地裸露的筋骨,蜿蜒着伸向云端。
起初伙伴们尚能谈笑,脚步也轻快。
渐渐地,空气变得稀薄而清冽,每一次呼吸都仿佛在肺腑间刮起一阵小小的风暴。说话成了奢侈,只听见粗重的喘息声和登山杖叩击石块的笃笃声,单调而固执地敲打着寂静的山谷。
那日天气不错,云雾随风聚散,远处雪山时隐时现,由海子始出,逐渐奔腾而下的河流与日光冲撞出一缕彩虹。
越往上攀,同伴步履越是滞重,双腿如同灌满了铅水。
偶尔抬头,前方是同伴沉默的背影,更远处,是雪山肃穆的轮廓,在稀薄的空气中泛着冷冽的蓝光。
山风呼啸着掠过耳畔,带着刺骨的寒意,刮得脸颊生疼。
我们埋头跋涉,像一群沉默的朝圣者,用脚步丈量着通往天际的距离。
终于,当最后一道悬崖被踩在脚下时,一片巨大的、凝固的蓝,猝不及防地撞入眼帘。
白海子静卧在群山环抱之中,宛如天神遗落的一块寒冰,又似大地睁开的一只冰蓝眼眸。
湖水澄澈得令人心悸,倒映着四周皑皑雪峰和头顶无垠的碧空。
那是一种摄人心魄的蓝,深邃、纯粹、凛冽,仿佛吸纳了世间所有的寂静与永恒。我站在湖边,渺小如尘埃,方才攀登的艰辛与喘息,瞬间被这无边的澄澈与宁静吞噬、抚平。
风掠过湖面,漾起细碎的涟漪,阳光碎金般跳跃其上,又无声地沉入那亘古的蓝里。
雪山巨大的倒影在湖水中微微晃动,仿佛另一个沉静的世界。
那一刻,时间仿佛凝固了,人世的喧嚣与昨夜的歌声,都成了遥远模糊的背景音。
山上我们无耻地蹭着另一行人西瓜、螺蛳粉、泡面、卤肉,欢快地谈聊,他们与我一样自成都而来,后来又在成都的群里相遇。
但山神似不喜这般的喧闹,云雾弥漫山间,无奈只有下山了。
下山的脚步轻快了许多。
背包里似乎还盛着白海子的一捧清寒,沉甸甸地贴在背上,随着步伐微微晃动。
山风依旧在耳畔呼啸,却已失却了攀登时的凌厉,变得柔和起来。
我回头望去,白海子那抹幽蓝已隐入层峦之后,只留下雪峰之巅一点永恒的洁白,在碧空下闪耀。
回到喧嚣的人境,那高原的风,雪山的影,湖水的蓝,连同溜溜城台阶上无端而起的醉歌,都沉淀为心底深处隐秘的矿藏。
当市声如潮水般退去,寂静降临,耳畔便会幽幽响起那萨克斯的呜咽,它不再仅仅是一段铜管的震颤,而仿佛化作了山巅永恒吹拂的、清冽而自由的风——它掠过经幡,拂过玛尼堆,最终悄然潜入血脉,成为灵魂深处一声无人听见的、悠长的回响。
null
没想到这个月又来了一次康定,不过这次比上次还要玩的高兴。
不过中途发生了个意外,我们有个新手队员不听劝告在上山时走了野线,差点迷路在山里。
我们在山上等了一两个小时,眼看着好像要下雨了,时间已经下午三点了,时间越晚山上的天气就会越恶劣。所以我们打算先下撤到下面的草甸去她分线的地方等待,同时在下山途中和所有能见到的人询问,并帮忙散播这个信息,好在下去后很快找到有信号的地方,而且运气很好的是她也有信号,所以第一时间联系上了她。
听她说她马上登顶了,但是她说没看到其他人,我们就知道她估计完全走错了方向,因为我们在山顶上的海子边上碰到了十几号重装徒步的人,上面闹哄哄的,不可能没人,所以立刻让他马上原路下撤,而我们则是找了两块岩石中间,拿出急救毯挡住风口生活等待,最终4点左右看到她的身影时才松了一口气。
这里告诫所有出去户外徒步的朋友,一定要跟随大部队行动,上山前掌握好基础徒步知识,如:如何看户外轨迹地图、基础求生避险知识等等。
因为端午都三天假期,所已这次的规划是两天一夜的行程,留一天假期在家里修养恢复。
因为最近四川的天气都不太好,所以我提前一个多星期就开始关注想去的景点天气,但是通过手机上自带天气软件给的天气数据,这类软件都是通过当地的气象站来给出天气数据,而我们去的山上基本上都没有气象站,而且高山地区天气变化无常,所以需要通过专业的天气软件观测云层、风向等数据进行评估。
这次用的Moteoblue和Windy这两个软件进行观测。
不过可能是他们的推测模型不太一样,Windy的ECMW模型刚开始的时候推测这几个地方没雨,但是临近出发的日子后却又提示有雨。而Moteoblue则相对稳定,一直显示都是31号和1号白天至少是阴天,没有下雨,而且圈子里驴友们都更认可MoteoBlue的数据推断。
所以我们这次的目标就定在了新榆林村的白海子和前面的野马海子。
最后出发时确定的人员有8人,4男4女,其中两位车主,一辆奥迪轿车,一辆小排量suv。其中有老朋友林老师、小罗,本来上次泸州的刘姐也想去的,但是他有事耽搁了。
行程安排如下。
费用明细:
行程开始。
历时5个小时,终于到康定了
马不停蹄的赶往野马海子
去往野马海子的哑口有个小海子
刚到起点便下起了毛毛细雨
1. 和林老师 2. 大家伙合照
河流和边上的乱石滩上长了很多像荷叶一样的植物
能看到雪山了,翻过去就是海子
下着小雨的野马海子别有一种特殊的韵味。
拍下了人生照片,可惜当时嫌雨大,我自己没拍单人照片。(后悔!)
营地里和其他徒步客一起休息,我老婆看到这张会杀了我吧??
海子和海子上的雪山
拍点团体照
快到出发点了
1. 林老师 2. 小罗
到出发点时发现天气晴了一点,雾气稍散
到康定城,准备找吃的。
牦牛火锅(忘记拍了,回头找其他人要了再补一张图片)
溜溜河的水流比上次来的时候急了很多。
当了一回卖唱歌手😄,倾听地址:
3.07 复制打开抖音,看看【跨过远山而来的风的作品】在康定当了一回卖唱歌手 😄 # 山丘 https://v.douyin.com/CmP946UHSjI/ OXM:/ 05/11 j@c.an
秀个恩爱
林老师有点EMO,所以陪他在康定城门口放肆高歌。
之后便去了民宿,因为玩的太嗨了,忘记拍照了。
第二天7点出发白海子
开始进入树林
杜鹃花开的很漂亮
拐过一个路口霍然开朗,云层也渐渐散去,几座不知名雪山出现在视野里,出太阳拉!!
峡谷里的雾被风渐渐吹走
爬过一个绝望坡,合个影。
山谷全景
太阳通过树枝,让这里像是时空隧道
喝个水
到达河谷路段
又一个绝望坡
能看近距离看到雪山了
这里上去就是一个大草甸
高山草甸,这里是有虫草的窝。
远处的雪山
爬爬爬,没完没了的坡,爬升比勒多曼因可多的多。
路边的小黄花
让花和雪山和个影
翻过这个坡就到了
最后时刻
白海子近景
运气真的很好,一直都有阳光。
人生照片,我怎么这么帅!
哈哈,出发前在抖音上看到的玩法,我也试试。
对了,我们还碰到了一个十几个人的重装队伍,带了好多好吃的,很热情的叫上我们蹭吃蹭喝。
体验了一次在山上乞讨,人家还给你备了碗筷,哈哈哈。
虽然一直在吃喝拍照,但是一直没忘记迷路的那个队友,我们等到三点半时山风把大雾吹了过来,天气也越来越差,我们只能先下撤到下面草甸在联系她。
运气不错的联系上了她,我让她立即原路下撤,我们在草甸这里等她。山上降温,起大雾,还若有若无的有些雨珠,也不知道她需要多久过来,所以只能先找个避风的地方生火取暖,保存体温。
等了一个多小时,终于来了,这才算是松了一口气。
这个姐姐第一徒步,冲锋衣不透气,里面的衣服也速干的,在山上要迷路了,真的是非常危险的,之后我们下山了,才发现四川的户外群里她算是出名了,各个群都在问有没有看到一个红衣服小姐姐....。
最后急速下撤,终于在下午五六点左右下撤到民宿。
抛去队友迷路这个事,这个旅程还是非常开心的,最后在起点拍个合照。
Photo by Pankaj Patel / Unsplash
去年还是前年就在思考如何在 Ghost 中集成 Activitypub 的互动,还找了一个国内博客大佬的实现 ActivityPub 协议的简单实现 - Lawrence Li ,不过这位大佬的方案是完全自己实现协议部分,对我来说有点太复杂了。
后来Ghost官方也发布了一个Ghost和Activitypub的继承方案,不过我看了下项目的Docker-compose文件,感觉太臃肿了(毕竟是商业化产品,性能各方面都要考虑到)。
而且开发一年多了,现在也只在官方付费服务里Beta,所以现在兴致缺缺。
因为最近用Cloudflare Worker实现了很多有意思的玩意,
所已,今天忽然灵光一闪,想到了一个非常有意思的点子,通过和AI的几轮互动,感觉应该能完整实现大佬博客里的那种效果。
其实原理无非就是利用Cloudflare Worker和KV功能,对文章ID和嘟文ID进行储存,在页面展示时再去请求数据进行展示,整个逻辑大概如下:
进入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的设置页面,绑定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>
<!--- 其他代码 --->
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
常用快捷键
因为最近淘宝买了不少东西,有些商家不送退货险,退货运费都挺贵的。
而且今天想买个好价鞋,但是需要88vip的券,@jun 倒是说帮我抢,但是有些券需要等,还要冲购物金,弄来弄去感觉也挺麻烦的。
所以想来想去还是自己开一个。
之前在咸鱼上几毛钱买过一个夸克云的88vip,估摸着中间应该是有什么门道,所以去这些地方做了一下搜索,了解了一下中间的套路。果然不出所料,感觉中间的利润还挺高的,现在这些大公司的羊毛被这些羊毛党可谓是薅到极致。
羊毛党的思路大概是这样:
我核查了一下已经了解到的收益点
可能还会有其他我没了解的收益点,但是上述两项至少会有差不多40元的收益,这可以说是无本买卖,如果能把中间的流程优化好,应该还有提升空间。
唯一的问题就是可不可以持续发展,这个完全看淘宝这边的政策管的严不严了。
书接上文。
小舅子他们在特种兵式的几天游玩之后表示最后一天想在家里休息一下,陪着他们吃了一天清淡的食物后,按了个脚,第二天一号他们便各自返回工作地去了。
而我们两口新的征程才刚要开始——下一站勒多曼因。
其实勒多曼因这个行程是五一之前就开始关注了的,因为之前徒步峨眉山、笔架山后加了很多户外群,五一前的偶然一天看到有人发了一个雪山冰湖皮筏艇的照片,并说准备开团出发,景点是我喜欢的那种风格,强度也还能接受,所以进群了解了一下,总共三天行程,:
当时想着650这价格是真心不贵了,而且恰好能和小舅子他们来的时间错开,所以毫不犹豫的报了两个名。
但是在后面几天接待下舅子的过程中,群里消息不断,组织力度似乎不太够了,总共个加群的人有50多个,接龙说要去的也满了40个人,但是最后交钱的时候却不够包车的40人。
因为人数不够没办法拼大车,群主就开始降级说租20人小车,但是小车价格和大车只便宜了四五百块钱,最后摊下来每个人要多交100元,然后重新组织了一波接龙,不懂贵这100块会产生了多大的化学反应,这次直接20人都没凑齐...。
眼看着要散团了,但是我的瘾又被钓上来了,不想眼看着散团,索性就说我出个车,看有没有其他愿意出车的一起,凑个十几二十个人也还不错,终于在散团之际组织了三个车,最终有17人一起参与了这趟行程。
我们这个7坐车除开我和S,最终分两拨坐了5人。
先是3位泸州的朋友,两男一女,从泸州过来自贡上车,分别是快60的二叔,很会照顾人的刘姐,以及帅气的空少三笑。之后开车去成都接上2泰拳老师和一个川大的大学生。
后面就正式开始发图了,所以这里先吐槽一下这个团。
这个穿山甲不能算是正式的商业团,只能说是有一个大家信的过的群主去联系的车、住宿、餐食,规划好行程后在群里组织的,不过那点组织力几乎是没有,我们因为自驾所以最后减了100的团费,最终收的550元,但是当时承诺的东西一个都没达成,这里罗列已下,下次大家参加这种群性质的团一定要提前问清楚,留好文字存档。
好了,亏已经吃了,只能说下次注意了。
行程分享正式开始。
我们5月3号从成都出发康定完美错开了车流高峰,全程几乎没有堵车,一路狂奔,车上听二叔说天全服务站有「此生必驾」318的牌子可以打卡,大家商量一致就在天全休息一会儿。
因为是自驾,所以时间比较充裕,路上又没有堵车,我们四点左右就已经到了康定,所以先去刘姐一个朋友开的餐馆吃了一顿菌菇牦牛火锅,老板做的蘸料一绝。
吃完饭才不到5点,所以大家准备一起去逛逛溜溜城。
我们本来是开车进城的,但是穿了一圈都没找到车位,最后在城区里堵了一个小时重新回到康定进城口的边上的一个集中停车场,20元一天,建议大家来这里玩不要想在城区找车位了。
卖青稞大饼,挺香的,下面的店铺15一个,走了一截发现全是从这个店拿的,人家只卖12元,这几步路就有3元的差价。
走到一半发现下雨了,还好穿的冲锋衣。并且凑巧这边有个广场在搞商业活动,似乎是请了什么藏族歌星在唱歌,虽然是藏文歌,但是唱的还挺好听的,不过摇一摇没识别出来。
大家累了坐在路边休息,因为雨大,二叔又没穿冲锋衣,所以暂时和他们分开,我们两口子单独逛去了。
康定旅游局局长同款抖音樱花大街。
溜溜城打卡,为什么叫溜溜城?
“康定溜溜城”这个充满诗意的别称,主要源于康定与《康定情歌》(又名《跑马溜溜的山上》)的深厚渊源。这首传唱世界的民歌让康定以“溜溜”之名广为人知,而“溜溜”在当地方言中更是承载了独特的文化意蕴,在康定及川西方言中,“溜溜”常用来形容事物“美好”“漂亮”“流畅”。
1. 溜溜城打卡 2. 小巷一景
藏族同胞们的广场舞是锅庄,那「锅庄」又是什么呢?。
锅庄(藏语称“果卓”或“歌庄”)是藏族民间广泛流传的一种传统集体舞蹈,尤其在四川、西藏、云南、青海等藏族聚居区盛行。它不仅是重要的娱乐活动,更是藏族文化、宗教和社会交往的载体。
康定的夜景还是非常漂亮的。
天色渐暗后和大家汇合,去往老榆林的民宿休息。
因为对这边的卫生环境不报什么期待,所以提前买了隔脏睡袋,用塑料袋+垃圾桶装了点热水泡脚,早早便躺下休息了。
1. 早起民宿外的风景 2.房间环境 3. 早起窗外的雪山 4. 隔脏睡袋
没有领队,更没有领队说让我们拍出发照,所以我索性叫上大家一起随便拍了一张。
坐上蓬卡就出发了,一路上看不到外面,但感觉早餐都要被颠出来了,估计外面到处都是导弹坑。
1. 格因草原 2. 马帮的马
今天天气不错,依旧没看到领队...。
过木桥,水很凉,都是山上流下来的雪水。低山区
路过一个红石滩
低山区还有很多松树。
在徒步过程中海拔逐渐上升,慢慢树木就变成灌木和草甸,一路上会还经过各种路况:石头路,涉水路,草甸,沼泽等等。
一处绝佳的和雪山合影的机位
我也来一张,在这里不小心把登山杖掉落滚到峡谷下面去了。😅
一爬一个不吱声
有点累,生命力照片一张。
沿途的树木变成了灌木和草甸。
二叔年纪打了,自重也太重,大家都劝他坐马算了,他也听劝,800块直接座马去了营地。后来到营地听他说座马也听危险的,他上去的时候马没站稳前跪了,把他甩到沙地里了,我们在说幸好是沙地...。
终于走了快一半了,两岔河营地吃个午餐
继续出发
在一个绝望坡前碰到了其他队友,我不拍照大家是真不想拍合照....,碰上我这种队友是真挺好的。
最不想走的就是这种河谷路段,全是碎石头。还碰上大风,风里还夹着小粒的冰雹。
最后一个绝望坡,进入雪线了,天上也飘起了小雪。
绝望坡后面的美景
终于到营地了!
营地景色全览
太累了,完全不想拍照用其他人发的照片把。
休息的棚子。营地的饭菜很不好吃,大家草草吃完便都上床准备休息。
因为营地在海拔4300米左右,加上棚子里氧气不太流通,所以帐篷里十几号人晚上过夜的时候都有不同程度的高反,症状基本上都是头疼。我后半夜睡了会,基本上是醒半小时睡半小时左右,我旁边的一个大学生几乎整夜没睡觉,两三点的时候还爬起来说想下山...,一整晚的噪音把他旁边的一个能睡着的老驴折腾到一晚上没怎么睡,感觉老驴也很难受哈哈。
S就是说觉得冷,因为棚子四处漏风,漏风最严重的就是我们躺下后头顶的地方,风大的时候我问不得不起来给她过上急救毯才好些。
后半夜风停了,我帮她把睡袋裹紧,把头罩住就留个鼻子嘴巴出来,才算是踏踏实实睡了好几个小时,比我有出息多了。
第二天四五点大家便陆续起床了,还能看到星空,但是我手机和充电宝都被冻没电了。
早餐的包子是馊的,我就喝了点稀饭,吃了自己带的面包。
因为出发的时候黑黢黢的,手机也没电了,就没拍什么照片,同行的刘姐借了他的充电宝给我用,让我得以续命。
天终于渐渐亮起来,发现我们被大雾追赶着,手机也有一些电了。
跟着前面的队伍的步伐,发现我们没有走常规的泥巴路线,而是条沿着河谷上行的碎石路段,然后踩着雪沿着山脊线的去往山顶,体验顶满,后来听前面的队友说起才知道,他们跟着一个商团的线路走的。
体验非常棒。
开始爬山脊线。几乎六七十度的大坡,踩着雪前进,非常爽!
就冲这一段爬坡这一趟也值了。
这里的雪一脚下去都能没过膝盖,躺雪上面来一张把。
旁边那条是常规上来的路,马上到了,看上面云层上去的时候应该还能看见雪山。
登顶。
说实话因为湖还没完全化开又被白雪覆盖,也不能去湖面拍照,导致山顶的风景和可玩性很一般,这块白色不知道的人还以为只是一片平坦的雪地。
别的不说,先打个卡把。
看好了,这一剑,会很帅!(换我来拍的时候后面忽然就起了大雾,没拍上😭。)
因为风雪,准备下山了。
后面下山的风景就不发了,下山的时候倒是碰上领队了,因为要做扫尾工作,我们又是垫底的,所以一直被催着下山,搞的我们下山速度飞快,后半段几乎都是跑着下山的。
回到起点。
下雨了,安排第一波人坐皮卡,这波人回到民宿衣服基本上都湿了,我依旧做的蓬卡下山,不过因为没休息好,有点晕车的感觉,差点吐了。
之后便是返程,回去的时候只有泸州的三位和我们一起,另外两个坐其他车了。
也好,我们这几个人更聊的来,我们边开边聊,倒也不觉得累,还拉个群准备下次有什么活动再一起出行。
直到晚上11点30分才安全到达自贡,他们另外拼车叫了个野猪儿回泸州。
这次行程结束我缓了三天才缓过来,每天下班回家几乎粘上枕头就睡,每天的睡眠时长破天荒的突破了8个小时,临近9小时!
下次出行真的不想再开车了。
null
书接上文。
小舅子他们在特种兵式的几天游玩之后表示最后一天想在家里休息一下,陪着他们吃了一天清淡的食物后,按了个脚,第二天一号他们便各自返回工作地去了。
而我们两口新的征程才刚要开始——下一站勒多曼因。
其实勒多曼因这个行程是五一之前就开始关注了的,因为之前徒步峨眉山、笔架山后加了很多户外群,五一前的偶然一天看到有人发了一个雪山冰湖皮筏艇的照片,并说准备开团出发,景点是我喜欢的那种风格,强度也还能接受,所以进群了解了一下,总共三天行程,:
当时想着650这价格是真心不贵了,而且恰好能和小舅子他们来的时间错开,所以毫不犹豫的报了两个名。
但是在后面几天接待下舅子的过程中,群里消息不断,组织力度似乎不太够了,总共个加群的人有50多个,接龙说要去的也满了40个人,但是最后交钱的时候却不够包车的40人。
因为人数不够没办法拼大车,群主就开始降级说租20人小车,但是小车价格和大车只便宜了四五百块钱,最后摊下来每个人要多交100元,然后重新组织了一波接龙,不懂贵这100块会产生了多大的化学反应,这次直接20人都没凑齐...。
眼看着要散团了,但是我的瘾又被钓上来了,不想眼看着散团,索性就说我出个车,看有没有其他愿意出车的一起,凑个十几二十个人也还不错,终于在散团之际组织了三个车,最终有17人一起参与了这趟行程。
我们这个7坐车除开我和S,最终分两拨坐了5人。
先是3位泸州的朋友,两男一女,从泸州过来自贡上车,分别是快60的二叔,很会照顾人的刘姐,以及帅气的空少三笑。之后开车去成都接上2泰拳老师和一个川大的大学生。
后面就正式开始发图了,所以这里先吐槽一下这个团。
这个穿山甲不能算是正式的商业团,只能说是有一个大家信的过的群主去联系的车、住宿、餐食,规划好行程后在群里组织的,不过那点组织力几乎是没有,我们因为自驾所以最后减了100的团费,最终收的550元,但是当时承诺的东西一个都没达成,这里罗列已下,下次大家参加这种群性质的团一定要提前问清楚,留好文字存档。
好了,亏已经吃了,只能说下次注意了。
行程分享正式开始。
我们5月3号从成都出发康定完美错开了车流高峰,全程几乎没有堵车,一路狂奔,车上听二叔说天全服务站有「此生必驾」318的牌子可以打卡,大家商量一致就在天全休息一会儿。
因为是自驾,所以时间比较充裕,路上又没有堵车,我们四点左右就已经到了康定,所以先去刘姐一个朋友开的餐馆吃了一顿菌菇牦牛火锅,老板做的蘸料一绝。
吃完饭才不到5点,所以大家准备一起去逛逛溜溜城。
我们本来是开车进城的,但是穿了一圈都没找到车位,最后在城区里堵了一个小时重新回到康定进城口的边上的一个集中停车场,20元一天,建议大家来这里玩不要想在城区找车位了。
卖青稞大饼,挺香的,下面的店铺15一个,走了一截发现全是从这个店拿的,人家只卖12元,这几步路就有3元的差价。
走到一半发现下雨了,还好穿的冲锋衣。并且凑巧这边有个广场在搞商业活动,似乎是请了什么藏族歌星在唱歌,虽然是藏文歌,但是唱的还挺好听的,不过摇一摇没识别出来。
大家累了坐在路边休息,因为雨大,二叔又没穿冲锋衣,所以暂时和他们分开,我们两口子单独逛去了。
康定旅游局局长同款抖音樱花大街。
溜溜城打卡,为什么叫溜溜城?
“康定溜溜城”这个充满诗意的别称,主要源于康定与《康定情歌》(又名《跑马溜溜的山上》)的深厚渊源。这首传唱世界的民歌让康定以“溜溜”之名广为人知,而“溜溜”在当地方言中更是承载了独特的文化意蕴,在康定及川西方言中,“溜溜”常用来形容事物“美好”“漂亮”“流畅”。
1. 溜溜城打卡 2. 小巷一景
藏族同胞们的广场舞是锅庄,那「锅庄」又是什么呢?。
锅庄(藏语称“果卓”或“歌庄”)是藏族民间广泛流传的一种传统集体舞蹈,尤其在四川、西藏、云南、青海等藏族聚居区盛行。它不仅是重要的娱乐活动,更是藏族文化、宗教和社会交往的载体。
康定的夜景还是非常漂亮的。
天色渐暗后和大家汇合,去往老榆林的民宿休息。
因为对这边的卫生环境不报什么期待,所以提前买了隔脏睡袋,用塑料袋+垃圾桶装了点热水泡脚,早早便躺下休息了。
1. 早起民宿外的风景 2.房间环境 3. 早起窗外的雪山 4. 隔脏睡袋
没有领队,更没有领队说让我们拍出发照,所以我索性叫上大家一起随便拍了一张。
坐上蓬卡就出发了,一路上看不到外面,但感觉早餐都要被颠出来了,估计外面到处都是导弹坑。
1. 格因草原 2. 马帮的马
今天天气不错,依旧没看到领队...。
过木桥,水很凉,都是山上流下来的雪水。低山区
路过一个红石滩
低山区还有很多松树。
在徒步过程中海拔逐渐上升,慢慢树木就变成灌木和草甸,一路上会还经过各种路况:石头路,涉水路,草甸,沼泽等等。
一处绝佳的和雪山合影的机位
我也来一张,在这里不小心把登山杖掉落滚到峡谷下面去了。😅
一爬一个不吱声
有点累,生命力照片一张。
沿途的树木变成了灌木和草甸。
二叔年纪打了,自重也太重,大家都劝他坐马算了,他也听劝,800块直接座马去了营地。后来到营地听他说座马也听危险的,他上去的时候马没站稳前跪了,把他甩到沙地里了,我们在说幸好是沙地...。
终于走了快一半了,两岔河营地吃个午餐
继续出发
在一个绝望坡前碰到了其他队友,我不拍照大家是真不想拍合照....,碰上我这种队友是真挺好的。
最不想走的就是这种河谷路段,全是碎石头。还碰上大风,风里还夹着小粒的冰雹。
最后一个绝望坡,进入雪线了,天上也飘起了小雪。
绝望坡后面的美景
终于到营地了!
营地景色全览
太累了,完全不想拍照用其他人发的照片把。
休息的棚子。营地的饭菜很不好吃,大家草草吃完便都上床准备休息。
因为营地在海拔4300米左右,加上棚子里氧气不太流通,所以帐篷里十几号人晚上过夜的时候都有不同程度的高反,症状基本上都是头疼。我后半夜睡了会,基本上是醒半小时睡半小时左右,我旁边的一个大学生几乎整夜没睡觉,两三点的时候还爬起来说想下山...,一整晚的噪音把他旁边的一个能睡着的老驴折腾到一晚上没怎么睡,感觉老驴也很难受哈哈。
S就是说觉得冷,因为棚子四处漏风,漏风最严重的就是我们躺下后头顶的地方,风大的时候我问不得不起来给她过上急救毯才好些。
后半夜风停了,我帮她把睡袋裹紧,把头罩住就留个鼻子嘴巴出来,才算是踏踏实实睡了好几个小时,比我有出息多了。
第二天四五点大家便陆续起床了,还能看到星空,但是我手机和充电宝都被冻没电了。
早餐的包子是馊的,我就喝了点稀饭,吃了自己带的面包。
因为出发的时候黑黢黢的,手机也没电了,就没拍什么照片,同行的刘姐借了他的充电宝给我用,让我得以续命。
天终于渐渐亮起来,发现我们被大雾追赶着,手机也有一些电了。
跟着前面的队伍的步伐,发现我们没有走常规的泥巴路线,而是条沿着河谷上行的碎石路段,然后踩着雪沿着山脊线的去往山顶,体验顶满,后来听前面的队友说起才知道,他们跟着一个商团的线路走的。
体验非常棒。
开始爬山脊线。几乎六七十度的大坡,踩着雪前进,非常爽!
就冲这一段爬坡这一趟也值了。
这里的雪一脚下去都能没过膝盖,躺雪上面来一张把。
旁边那条是常规上来的路,马上到了,看上面云层上去的时候应该还能看见雪山。
登顶。
说实话因为湖还没完全化开又被白雪覆盖,也不能去湖面拍照,导致山顶的风景和可玩性很一般,这块白色不知道的人还以为只是一片平坦的雪地。
别的不说,先打个卡把。
看好了,这一剑,会很帅!(换我来拍的时候后面忽然就起了大雾,没拍上😭。)
因为风雪,准备下山了。
后面下山的风景就不发了,下山的时候倒是碰上领队了,因为要做扫尾工作,我们又是垫底的,所以一直被催着下山,搞的我们下山速度飞快,后半段几乎都是跑着下山的。
回到起点。
下雨了,安排第一波人坐皮卡,这波人回到民宿衣服基本上都湿了,我依旧做的蓬卡下山,不过因为没休息好,有点晕车的感觉,差点吐了。
之后便是返程,回去的时候只有泸州的三位和我们一起,另外两个坐其他车了。
也好,我们这几个人更聊的来,我们边开边聊,倒也不觉得累,还拉个群准备下次有什么活动再一起出行。
直到晚上11点30分才安全到达自贡,他们另外拼车叫了个野猪儿回泸州。
这次行程结束我缓了三天才缓过来,每天下班回家几乎粘上枕头就睡,每天的睡眠时长破天荒的突破了8个小时,临近9小时!
下次出行真的不想再开车了。
勒多曼因湖边
立夏时节,熏风南来,天地始交,万物并秀。当夜卧早起,迎朝阳以养心气。晨起可临水而立,观荷听蝉,导引阳气,使志无怒。饮食宜增酸减苦,多食樱桃、青梅、新麦以养心脾,佐以莲子、百合清心宁神。
此时心火渐旺,肾水初衰,当静心寡欲,戒骄戒躁,常持虚静。衣宜选用苎麻丝帛,透气生凉,尤需护住后颈命门。常饮绿豆薄荷饮,解暑生津,兼防疰夏。运动当选五禽戏、太极等舒徐功法,如树展枝,似水潺湲,使气血流通而不沸涌。午后小憩一刻,胜服灵丹,此谓「养长之道」。
立夏这天刚好在山上没网,不过在山上的时候还想着要发节气文章,下来后光顾着P照片去了,补发一章。
瓦屋山
今年的五一感觉是有生以来活动安排的最满的一次。
先是五一假日前老婆把小舅子和大姨妈摇来了自贡,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元。
分两篇写把,下一篇 勒多曼因篇。
前些日子家电国补线上线下宣传的如火如荼,但是一直觉得国补这个东西好像我占不到啥便宜,因为我暂时没有任何更换家电、手机的想法。
但是老天爷似乎都要推波助澜让我去凑凑热闹——家里的电热水器忽然坏了。
是的,但是其实也并不意外,这台和这个我们家房子同样年纪的万和热水器服役已经十多年了,其实也就这两年开始慢慢有些小毛病,这个时候即便坏了我也不觉得意外。
其实也叫不上坏,热水器的错误码为E1,是点火器故障,去年还是前年开始就出现过几次,我拆开打磨了一下点火器的头子后其实就好了。不过我妈说干脆让这个老家伙退役算了,修来修去的也麻烦。
线上的热水器品牌五花八门,如海尔、美的、万和、樱花等等。不过价格在一片绿色国补到手价的标签下显的尤其划算。16L带增压、水伺服的一级能耗的机器线上基本上只要1100-1300左右,二级能耗就更低了,基本都在1000以下。
我也去线下的实体店看了一下,因为保护线下市场的缘故,线上线下基本上不会售卖同型号的机器,不过同配置参数线下始终要贵个几百,毕竟像是京东、淘宝这种平台还有平台优惠不是。
而且线下不卖一级能耗的产品,不知道为啥。
刚开始的时候我选的美的、海尔的牌子,后来我妈提醒让我看看万和,这才了解到万和才是国内专业做热水器的,而且我们之前那个台服役十多年的热水器也是万和,后来安装的师傅也认同了这个看法。
我最后选的是万和的F9DMAX ,各种优叠加下来价格如下,性价比相当高,国补真的没毛病。👍
产品主要参数如下。
其中我体验下来,各项参数参考的优先级为,排前的我认为重要性更高:
最后,还要注意上门安装的费用,一般情况下安装人员上门安装是不收费用的,但是他们只会免去箱子内所有材料的费用(毕竟那是你已经花钱买了的),如果需要使用额外的材料是需要另外付费的,但是一般品牌放会明码标价。
我这次因为是替换旧机,原有管路什么都是现成的,没有用他们的任何材料,所以师傅上门安装好后就能直接使用,也没做任何推销和歪心思,没出任何费用,体验还是相当不错的。
我们家的情况师傅说如果冷热水管安排到位,其余材料用他们的费用也只会在100多一点,也不算太贵。
另附我这次整理的热水器型号清单。
其实蜗牛哥之前开发过一个Chrome扩展,可以在浏览器里显示一个图标和通知数量。但是我电脑上现在Chrome一打开十几个进程,我实在不想再新增扩展了。
所以这两天用Deepseek糊了一个搭配Cloudflare推送到TGBot的Worker脚本,效果如截图。设置好长毛象和TGBot的设置后,程序会每5分钟检测一次有没有新通知,有的话才进行推送操作。
先添加一个KV,名称 KV_STORE
,备用。
获取长毛象Access Token,不放心的话在权限部分可以单独只设置通知获取权限
再添加一个Worker,代码如下,并修改代码中的 config
部分的配置为你自己的设置,其中长毛象token
// 配置部分
const config = {
// Mastodon 配置
mastodon: {
instance: 'https://your-instance.social', // 替换为你的 Mastodon 实例地址
accessToken: 'ZTDJN2ZMZMZI5MTU1MZHH', // 替换为你的 Mastodon 访问令牌
lastNotificationIdKey: 'last_notification_id' // KV 存储中保存最后通知ID的键名
},
// Telegram 配置
telegram: {
botToken: 'your-bot-token', // 替换为你的 Telegram Bot Token
chatId: 'your-tg-chart-id' // 替换为接收消息的聊天ID
},
// 检查间隔(分钟)
checkInterval: 5
};
// 主处理函数
export default {
async scheduled(event, env, ctx) {
// 执行检查通知任务
await checkNotifications(env);
},
async fetch(request, env) {
// 手动触发检查
if (new URL(request.url).pathname === '/check') {
await checkNotifications(env);
return new Response('Notification check triggered');
}
return new Response('Not found', { status: 404 });
}
};
// 检查未读通知
async function checkNotifications(env) {
try {
// 获取上次处理的通知ID
let lastNotificationId = await env.KV_STORE.get(config.mastodon.lastNotificationIdKey);
lastNotificationId = lastNotificationId || '0';
// 获取新通知
const notifications = await fetchMastodonNotifications(lastNotificationId);
if (notifications.length > 0) {
// 有新通知,发送到 Telegram
await sendToTelegram(notifications, env);
// 更新最后处理的通知ID
const latestId = notifications[0].id;
await env.KV_STORE.put(config.mastodon.lastNotificationIdKey, latestId);
console.log(`Sent ${notifications.length} new notifications to Telegram. Latest ID: ${latestId}`);
} else {
console.log('No new notifications.');
}
} catch (error) {
console.error('Error checking notifications:', error);
}
}
// 从 Mastodon 获取通知
async function fetchMastodonNotifications(sinceId) {
const url = new URL(`${config.mastodon.instance}/api/v1/notifications`);
url.searchParams.append('exclude_types[]', 'follow');
url.searchParams.append('exclude_types[]', 'follow_request');
url.searchParams.append('since_id', sinceId);
const response = await fetch(url.toString(), {
headers: {
'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',
'Authorization': `Bearer ${config.mastodon.accessToken}`
}
});
if (!response.ok) {
throw new Error(`Mastodon API error: ${response.status} ${response.statusText}`);
}
return await response.json();
}
// 发送通知到 Telegram
async function sendToTelegram(notifications, env) {
// 按时间倒序排列通知
notifications.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
let message = `📨 你有 ${notifications.length} 条新通知:\n\n`;
notifications.forEach(notification => {
const sender = notification.account; // 通知发起者
const senderName = sender.display_name || sender.username;
const senderHandle = `@${sender.acct}`;
const senderUrl = sender.url;
// 根据不同通知类型构建不同消息
switch(notification.type) {
case 'mention':
const mentionContent = stripHTML(notification.status.content);
message += `💬 <b>${senderName}</b> (${senderHandle}) 提到了你:\n${mentionContent}\n\n`;
break;
case 'reply':
const replyContent = stripHTML(notification.status.content);
message += `↩️ <b>${senderName}</b> (${senderHandle}) 回复了你:\n${replyContent}\n\n`;
break;
case 'reblog':
const reblogContent = notification.status
? stripHTML(notification.status.content)
: "[内容不可用]";
message += `🔁 <b>${senderName}</b> (${senderHandle}) 转发了你的嘟文:\n${reblogContent}\n\n`;
break;
case 'favourite':
const favContent = notification.status
? stripHTML(notification.status.content)
: "[内容不可用]";
message += `⭐ <b>${senderName}</b> (${senderHandle}) 喜欢了你的嘟文:\n${favContent}\n\n`;
break;
case 'poll':
message += `📊 <b>${senderName}</b> (${senderHandle}) 的投票已结束\n`;
break;
case 'follow':
message += `👤 <b>${senderName}</b> (${senderHandle}) 关注了你\n`;
break;
case 'follow_request':
message += `🫂 <b>${senderName}</b> (${senderHandle}) 请求关注你\n`;
break;
default:
message += `ℹ️ 你有一条新通知 (${notification.type}) 来自 <b>${senderName}</b>\n`;
}
});
// 添加来源链接
message += `\n查看所有通知: ${config.mastodon.instance}/notifications`;
// 发送到 Telegram
const url = `https://api.telegram.org/bot${config.telegram.botToken}/sendMessage`;
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
chat_id: config.telegram.chatId,
text: message,
disable_web_page_preview: true,
parse_mode: 'HTML'
})
});
if (!response.ok) {
throw new Error(`Telegram API error: ${response.status} ${response.statusText}`);
}
}
// 去除 HTML 标签
function stripHTML(html) {
return html.replace(/<[^>]*>?/gm, '');
}
去Cloudflare Worker设置页面绑定KV和设置定时执行。
除了定时执行外,你还可以用 https://wokrerurl.dev/check 手动触发
飞雾洞
这些年的清明节几乎都是在小雨中渡过,今年依旧不例外。
好在假日后的第一个工作日天气转晴,川内大部分地区的温度几乎是直线上升,自贡气温也临近了30°,似乎春夏的界限在这几天又开始模糊起来。
起因是平时不怎么会主动想出去玩的母上大人在清明节最后一天提出想出去转转,不过清明节三天,天气都不太好,而且假期中的后两天还漂着毛毛雨。所以和她商量了一下,我们换个班,换到了节后的第一个工作日出去,既能错峰出行,也能有个好天气。
因为只有一天,所以不能走太远,还要有充足的游玩时间,所以车程得压缩到2个小时之内。
之前 内江甜城一日游 去过一次内江,体验还是非常棒的。不过内江我们已经去过了,得换个对我们来说有新鲜感一些的。
在做攻略的时候想起之前徒步群内有群友策划过去 宜宾僰王山 徒步,宜宾离自贡也就100来公里左右,不到一个小时即可抵达,是十分不错的目的地。
其实宜宾我在很多很多年前来过一次,第一印象是——酒香!
我们当时走的老路去的宜宾,开始进入宜宾地界没多久,忽地就闻到一股淡淡酒香,开窗四处眺望无果,只发现我们正在经过一条长江支流,当时心理想着:真不愧是是五粮液产地、酒都宜宾,这河里都她妈是一股子淡淡酒香味。而后复行一里地后才发现经过一家酒厂时才恍然大悟,所以之后只要一闻到就为就能知道旁边必定有酒厂无疑了。
我们当时是自驾去的蜀南竹海,盛夏的十万亩竹海在微风的吹拂下用竹叶给我奏响了大自然的舒缓乐章我至今难以忘记。但是竹海除了竹子其他能有深刻体验的项目太少了,所以这次被我放弃了,准备还是以群友们之前去过的僰王山为主来做路线规划。
最后行程规划如下:
当时想着李庄离市中心比较远,又只是一个古镇,万一踩坑了就没地儿玩了,所以安排的上午去李庄,晚上去市中心。其实可以白天去晚上也去,听说晚上还有节目表演和白天是不一样的风格。
僰王山只有核心景点飞雾洞最值得一看,其他景点都有点可有可无了。
这种一天来回的旅程真的很不错,强度不会很高,也有非常不错的体验,以后可以常安排。
下了高速不久就能看见长江大桥。
到了李庄停在了月亮田的停车场,在车库里进入了一个古建筑,似乎是一个酒店的大唐,雕梁画柱,气派的很。
李庄建筑
江南水乡味十足的李庄古镇。
水乡
古镇内
中午吃的李庄白肉,片肉的师傅说每片肉在2mm左右,肥而不腻。
吃过饭休息了一会便赶往了僰王山,竹林之内的僰王山特别凉快。
1. 僰王山入口 2. 山内石径
探洞
下山时还在路边偷了春笋一根,哈哈。
第二天炒了腊肉,味道好极了。
合江门很热闹,三江交汇之处,也是老百姓们晚间活动的地方。
合江门两景
好像国外哪里也有个这个玩意儿,是拉斯维加斯吗?
3D小巨蛋
一大群叔叔阿姨、大爷大妈群魔乱舞,算是感受到「酒都人民」的松弛感了。
入夜后的夹镜楼更漂亮了。
夹镜楼
我一直把Memos当作微博来用,偶尔也会手动同步到长毛象,但也只是偶尔。原因是即便在用梯子的情况下长毛象打开也太慢了,毕竟大多数实例都在墙外,且长毛象挺吃服务器资源的。
目前又不太想自建实例,虽然现在弄了NAS,理论上可以搭在上面,但是Ghost似乎在6月份要推出联邦宇宙服务了,到时候可以直接迁移到那个上面去,也就一直没下手。
之前看到过蜗牛哥出过一期长毛象同步到Memos的方案,和我的需求是相反的,因为今天周末恰好有空,所以就捣鼓了一下,弄了一版。
因为Memos可以设置WebHook调用,所以我的思路是:
Memos发布 -> 触发WebHook调用 -> 数据转发给Cloudflare Worker -> Worker里用Mastodon API发布嘟文
先去长毛象上申请Access token ,路径为 :
偏好设置 -> 开发 -> 创建新应用 -> 起个名字,勾选 write:statuses、write:media 权限
然后就是Cloudflare Worker的实现了,我用DeepseekR1跑了一版,稍加改动就能初步使用了。
// cloudflare-worker.js
const MASTODON_INSTANCE = ""; // 实例地址
const ACCESS_TOKEN = ""; // 访问token
async function uploadMediaFromUrl(imageUrl, mimeType) {
try {
// 从 URL 获取图片数据
const imageResponse = await fetch(imageUrl);
if (!imageResponse.ok) throw new Error(`下载图片失败: ${imageResponse.status}`);
// 转换为可上传的格式
const blob = await imageResponse.blob();
const formData = new FormData();
formData.append("file", blob); // 文件名按需处理
// 上传到 Mastodon
const uploadRes = await fetch(`${MASTODON_INSTANCE}/api/v2/media`, {
method: "POST",
headers: { Authorization: `Bearer ${ACCESS_TOKEN}` },
body: formData
});
if (!uploadRes.ok) throw new Error(`上传失败: ${await uploadRes.text()}`);
return uploadRes.json();
} catch (error) {
console.error("媒体上传错误:", error);
throw new Error(`图片处理失败: ${error.message}`);
}
}
async function handlePost(request) {
try {
const { memo } = await request.json();
const { content, visibility, resourceList = [] } = memo;
// 验证内容
if (!content) return new Response(JSON.stringify({ error: "内容不能为空" }), { status: 400 });
// 处理最多 4 张图片
const validResources = resourceList
.filter(res => res.type?.startsWith("image/"))
.slice(0, 4);
// 并行上传所有图片
const mediaUploads = validResources.map(async res => {
const media = await uploadMediaFromUrl(res.externalLink, res.type);
return media.id;
});
const mediaIds = await Promise.all(mediaUploads);
// 构建嘟文参数
const params = new URLSearchParams({
status: content,
visibility: visibility.toLowerCase() || "public" // 默认公开
});
mediaIds.forEach(id => params.append("media_ids[]", id));
// 发布嘟文
const postRes = await fetch(`${MASTODON_INSTANCE}/api/v1/statuses`, {
method: "POST",
headers: {
Authorization: `Bearer ${ACCESS_TOKEN}`,
"Content-Type": "application/x-www-form-urlencoded"
},
body: params
});
if (!postRes.ok) throw new Error(await postRes.text());
return new Response(JSON.stringify(await postRes.json()), { status: 200 });
} catch (error) {
console.error("处理错误:", error);
return new Response(JSON.stringify({ error: error.message }), { status: 500 });
}
}
// Worker 入口
export default { fetch: handlePost };
CloudFlare Worker代码
给Memos启用Webhook
设置 -> 偏好设置 -> Webhook -> 创建 -> 起个名字,填入Cloudflare Worker的地址
这种方式同步速度应该会稍快,但是还是有一些限制,比如
晚上出门散步,路边画坛的小蘑菇
清明时节,阳气渐长,宜早起散步,呼吸新鲜空气,舒展筋骨,调和气血。饮食宜清淡,多食新鲜蔬菜,少食油腻辛辣,以养肝护脾。
心境宜平和,避免情绪波动,保持乐观心态,以顺应春生之气。适时添减衣物,防寒保暖,以防春寒侵袭。多饮温水,促进新陈代谢,排毒养颜。适度运动,如太极、瑜伽,以增强体质,提升免疫力。清明养身,顺应自然,方能健康长寿,福寿安康。
今天放假,和S终于能安安心心休息一天了。
一直睡到十一点起床,发现爸还在家,便叫上S出门中午的菜,S做了一个川味的腰花,我做了一个孜然鸡腿肉,都挺成功了。
上午出门的时候下了一部短剧 《家里家外》,下午两口子便我在沙发上看完了,全四川话台词的小短剧,还挺过瘾的,演员演技也还算在线,因为是短剧,所以笑点、爽点都很足。
Photo by Iyus sugiharto / Unsplash
看到仓颉、小胡都在发,也做个整理。
记录一下过去一年的常用应用,明年此时再更新,观察是否有所改变。
📨 Mail Client: 用的企业微信自带的邮件功能。。
📮 Mail Server: 如上。
📝 Notes: 基本上抛弃其他笔记软件了,主要使用Obsidian,同时还能自动发布数字花园 「好奇心花园」。
✅ To-Do: 企业微信代办功能、Obsidian的TODO List。
📷 iPhone Android Photo Shooting: 使用 小米12s Ultra 系统自带相机。
🟦 Photo Management: OneDrive 和 Google Photos。
📆 Calendar: 企业微信日历,同时同步到手机端。
📁 Cloud File Storage: 使用Alist,搭配OneDrive、百度网盘、123盘等,Windows上的文件同步等还是主力使用OneDrive,同时使用Syncthing对手机和电脑的部分文件进行同步。
📖 RSS: Miniflux 和 follow。
🙍🏻♂️ Contacts: 使用系统自带联系人应用。
🌐 Browser: PC 端 Chrome,手机端 Via。
💬 Chat: 微信、QQ、Telegram 。
🔖 Bookmarks: 感兴趣的网站会存在 Memos 上,并打上对应的标签。
📑 Read It Later: 感觉这个需求对我来说是垃圾篓,所以没用。
📜 Word Processing: Obsidian为主,同时搭配 Notepad4。
📈 Spreadsheets: WPS的一个精简版本。
📊 Presentations: 没有这方面的需求。
🛒 Shopping Lists: 一般直接加到购物车里。
🍴 Meal Planning: 刷抖音、B站、小红书等跟着做,或者有想吃的菜去微信小程序「下厨房」找菜谱。
💰 Budgeting and Personal Finance: 一木记账,应为有自动记录功能,目前几乎所有出账都做了登记。
📰 News: follow,TG频道。
🎵 Music: lxmusic。
🎤 Podcasts: 我的听书。
🔐 Password Management: vaultwarden。
以下是小胡文章中提到的 extra categories 部分:
✈️ VPN: 路由器上MihomoProxy,移动端使用 FlClash。
😘 Blog Platform: Ghost+Astro+GithubAction的构建流。
⌨️ Text input: PC 端使用小狼毫搭配雾凇方案,手机端为小企鹅搭配雾凇方案,输入法方案为小鹤双拼。
📖 Translation app: Pot以及一些AI工具。
📚 Reading app: 微信读书。
🔧 Screenshot app: Pinx。
🌁 Image Hosting: 感谢又拍云联盟。
☁️ VPS Hosting: 腾讯轻量云。
Ending
null
夜爬峨眉山强度挺大的,不是那么好拿捏,不要被抖音、小红书给你洗脑了!
去之前一定要能理解爬20多公里的楼梯是个什么概念!
我应该不会再爬第二次了....!
上次写完行程规划之后,不知道是不是早上晨跑衣服穿少的缘故,我忽然得了重感冒。
那几天开始全身酸痛,同时伴有咽痛、咳嗽,而且连续两个晚上发烧 + 白天退烧,为了不影响 31 号的出发,所以请了两天假在家中休息,调养。
好在出发前的早上,感冒的大部分症状都痊愈了,但是还是能明显感觉到体力依旧还是没有恢复。但是行程、人员都已经确定好,可不能放大家的鸽子。
所以不管如何都要先把大家送过去,如果身体实在跟不上就放弃徒步上山,坐观光车上金顶去等大家。
在前面的行程规划一文中提到了当时确定要去的只有我、霜、小罗三人,我到时候打算开我台上不了台面的破 7 坐面包车过去,因此最好还是再找至少 4 人同行,以最大化平摊大家的费用,同时因为人多了后,玩起来也更有意思。
所以,出发前的几天我们就陆续在自己熟悉的圈子内寻找合适同行的队友,但是我这边进展不太顺利,频频碰壁,其中一个户外微信群居然还直接把我踢出群,不过我也庆幸被踢出去了,玩户外的这么小心眼即便在玩在一起也不会有多大意思。
好在小罗那边进展顺利,一直都有拉人进来,虽然其中有些朋友因为行程问题、装备问题赶不上,但是都非常好沟通,部分表示虽然这次不能参与,但是依旧期待下次同行。
最后,在出行前一天把终于把人员都确定好了,分别为:我、霜、小罗、太阳(兵哥哥)、vivi 姐、高兴哥、成歌。
31 号集合日当天,晴空万里艳阳高照,因为有成员担心赶不上日出,所以们把集合的时间提早了一个小时,也就是中午十二点。
我们是第二个到集合地点的,最先到集合地点的是小罗,她依旧穿着上次的淡绿色冲锋衣,装备齐全,精神头看起来不错。她男朋友这次有事,没有和她一起同行,小伙子倒还挺胆大的,也不怕女朋友被其他单身汉给挖走了,哈哈哈。
之后是成歌,是一位 50 多岁的大哥,湖北人,性格和蔼沉稳,非常好相处,脸上时刻带着和煦、云淡风轻的微信。他因为工作缘故经常在各地出差,又喜欢户外运动,所以经常在各地出差的时候就会参与当地的户外活动。别看大哥年纪上去了,可是个十足的老鸟,爬过的山都数不清了,还去冈仁波齐转过山。
然后是 vivi 姐和高兴就好哥,他们是两口子,年纪应该 40 左右把,装备齐全,透着一股子专业劲。高兴哥是退伍军人,平时喜欢摩旅,微信头像就是他摩旅的照片,非常帅。他们其实也去过非常多的地方旅行,但是这是他们第一次进行户外徒步。
最后就是太阳了,也是一个兵哥哥,性格腼腆,后续登山的时候也不爱参与拍照,而且他过来的时候把我们给惊呆了,原因是他居然没有登山包,拿的就是一个白色的大单肩挎包,也没有登山杖,雪爪等等,补给也就带了一盒饼干和一些能量饮料,他说没什么问题,他们当兵时再难的都体验过,我们想着实在不行山上也有的买,就到时候再说
了。
自贡出发到峨眉山只有 150 多公里,全程都是高速,一个多小时就能到,一路上阳光万里,倒也不觉得累,不多时就到了报国寺,还没进停车场就一大堆大爷大妈上来给我引导停车,一个劲的给我往另外一个山坡上引,估摸是当地的村民拉收入呢,我最后还是停在了报国寺的官方停车位上,贵了 5 元一天,停车场管理员还给我们送了一个红色的祈福带。
然后就是下车收整行李,因为没有住宿,其实大家带的东西都不多,唯一多的是这次在山上吃火锅需要用到的东西,一套一次性铝锅盒燃料,然后两大包食材,霜怕山上海拔高煮不熟,把牛羊肉、丸子都提前煮好了,上山后烫一烫便能开吃,我包里放了面饼,丸子、肉给经验、体力更好的成歌大哥,一次性铝锅给了高兴哥,我老婆则背上了香菜、蒜沫等配料。
然后我们便迎着 3 点的斜阳出发了。
传过停车场便来到一处广场,右侧是报国寺,我们在入口处拍了一个出发视频。
之后要步行 30 多分钟后到达雷音寺才算是正式开始爬山之行。
不过不要高兴太早,目前我们连检票处都还没到呢,接下来的十几个小时将会是无尽的楼梯与我们相伴,期间还会经过猴区、高山区。
现在有多兴奋,之后就会有多狼狈。
遇到的第一个红牛墙。
不知道是不是感冒刚好,还是因为冲锋衣没到,我穿的羽绒服散热不好的原因,体力消耗的非常快,才走了一个多小时就感觉自己被掏空了,只感觉浑身都是汗水,脚也重的抬不起来。
接近 5 点时到达圣水阁
山民搭建的原始蜂箱
到达清音阁,这边是一个分叉路口,分上行和右行两条路,上行是去往九十九道拐方向,另一侧则是去往报国寺方向。
经过猴区,峨眉山的猴子和地痞流氓差不多,会强抢你身上任何有颜色的饮料,塑料袋,零食,经过这里时最好拿衣服罩住你的包。
在这里把直接放在高兴哥背后的一次性铝锅接了过来,用的外套罩住,不然肯定要遭殃,不过因此我也没有余力带着我老婆了,中途被猴子隔开,等了她好久,着实是无奈之举,如果不护着锅,晚上可就没得吃了。
穿的老婆的羽绒背心,狼狈不堪
到达洪春坪,天色已经完全暗下来了,开始需要头灯照明,我也彻底红温了。
开始攀爬让人闻风丧胆的九十九道拐,垂直落差 300 米,迂回 2500 米,约有 1840 余石阶。
路上遇到了一只网红猫,入夜降温,估计它冷的不行,看我坐在椅子上,直接就跳到我身上来取暖。
晚上九点半,开始进入雪线。
到达财神庙门口,我的羽绒服内里已经完全打湿,我索性将衣服反穿,终于没那么闷热了。
霜的表现则完全不像是第一次爬山,一路上健步如飞,如履平地。
路上的其他登山者看到都不由纷纷侧目,不由发出大佬牛逼的惊叹,基本上都是她走到前面后等我爬上去,休息一会后再继续出发,期间为了帮我减重还和我互换了背包,我可是彻底成为了拖后腿的人了。
财神庙门口的阶梯
到财神庙这里我才发现我们的队伍已经分成了三个梯队,小罗、成歌一个梯队,已经远远跑在了前面,我、霜、太阳,我们三个则是第二梯队,后面则是 vivi 姐、高兴哥。
小罗太牛了,上次笔架山之行他们也是第一梯队,紧紧跟着向导,这次又没落下 ,和老驴成歌同步,这时我就不由感叹,年轻真好。
本来我们是打算在财神庙吃火锅的,但是因为我们第二梯队、第三梯队落后第一梯队太远,他们等了我们半个小时我们都还没到,所以他们去了下一个地方等我们。
我们在财神庙休息了半个小时,在出发后终于碰到了 vivi 姐他们,他们为了赶我们,都没在财神庙休息。
我们本来盘算着的是聚在一起后大家吃着火锅跨年,小罗、成歌他们在上面的遇仙寺等我们,我们估摸着还要个半个小时才能到。
但是此时已是夜晚 11 点 58,已经临近跨年,我们和 vivi 姐、高兴哥、太阳和路上爬山的小伙伴们都相继在拐角处停下,大家开始倒计时,等待着阳历新年的第一秒到来。
终于到达遇险寺,小罗、成歌已经等了我们半个多小时,表示这个地方太冷了,可算把我们盼来了。没有废话,直接去寺庙拿了热水,架锅,准备吃火锅。
当火锅底料放入锅内,滚烫的热水浇灌在底料上时,火锅的香味开始慢慢弥漫,寺庙门口的小广场上开始随着山风飘荡起了火锅的香味,接下来是放入牛肉、羊肉、牛肉丸、鱼豆腐、金针菇,把矿物油小炉子放在锅下,点燃后稍热便能吃了。
其他路过的小伙伴都不可思议的看着我们的锅,不少人还跑过来拍照,这一刻我们都感觉背着这么多东西爬山的辛苦都值了,哈哈哈。
最后吃完用火锅汤煮好的泡面后我们便接着出发了,目前已经爬了十多个小时了,还有七八个小时的路程在等着我们。
雪已经挺厚的了。
山上的光污染很弱,能看见不少星星
又一个难关:钻天坡
夜眺峨眉市
山上积雪覆盖的台阶,走多了都自然而然的变成了这种规律的小三角坑。
到达洗象池!这里开始精神、肉体能量已经双双见地,霜也有点顶不住了,说走路都是飘的。不少爬山客选择在洗象池的大厅里眯一会。
接着爬!碰到一个穿短裤的大佬,前面看他从山下往山上跑着登山,这会儿居然已经从金顶下来了了....从金顶....下来了,你敢信??
路过一个休息点,买了一个 10 元的苹果,12 元的八宝粥,18 元的冷量饮料。
这个休息站有火盆,本来想着顺便烘烤一下衣服,哪知道把羽绒服屁股后面的下摆烧坏了...。
眼神已经迷离、恍惚,坐下就想坐化...。
还有多久是每一个休息点老板回答的最多的问题,但是不用问都知道还有很久很久!
到!雷!洞!坪!拉!!!!
我们实在走不动了,选择坐缆车上金顶,雷洞坪到缆车那里工作人员说很近,一会儿就到,但是我们怎么就感觉始终走不到呢?
等索道的人们
在索道上能看到即将日出
大家互相祝贺新年快乐。
烧香祈福
金顶遥望雪山
看日出
专门买了个小旗子拍照
才发现我衣服还是反穿着呢。
勇闯天涯一下
最后再来点情绪照片
null
跨年时峨眉金顶日出和第一缕阳光
峨眉山官方图片
自上次笔架山之旅后,对山的渴望就像是心底深处的地下泉水被打通了一般狂涌而出。
前几天林老师他们又在群里谋划着去峨眉山夜爬 ,不过不巧的是他们的时间和赶不上,但是又被他们把瘾给钓了起来。
所以想着:「实在不行就我们自己去吧?」
而且又恰逢新年的这个节点,干脆去感受一下新年的第一缕阳光,并且虔诚的去拜拜菩萨,希望能赶走去年的坏运气,新的一年顺顺利利。
所以,有了以下的规划。
目前人员为我,老婆,小罗,目前还在招募队员中。
两步路助手路线图:2024-02-07 爬峨眉山(报国寺~峨眉山金顶)-GPS导航轨迹下载|行程线路图-步行轨迹-两步路
24 年 12 月 31 日 Day1
25 年 1 月 1 日 Day2