普通视图

Received before yesterday只是玩玩

261、芒种

2025年6月5日 09:49

母亲种的西红柿

今日芒种,仲夏始忙。宜"晨起迎阳,午避暑",食"三瓜三豆"(苦瓜、丝瓜、冬瓜;绿豆、赤豆、黑豆)清湿热,饮酸梅汤生津敛汗。衣选苎麻透气,重点护"心俞""膻中"防暑气侵心。运动宜在酉时(17-19点)练"呵"字诀泄心火,晨昏散步闻稻花香。此时"螳螂生,鵙始鸣",养生当效法"忙而不乱"——收麦插秧般张弛有度,心静自然凉。
  •  

文化人的游记

2025年6月4日 12:41

null

林老师是搞文字工作的,也就是昨天我那篇游记中同我在溜溜城门口高歌的眼镜帅哥。平日里和我们相处都是骚、浪、贱三字的代名词。但是从人潮里褪去后确是一个感情细腻敏感的小伙子。

下山回来后我们便怂恿他写一篇小作文,本来他还傲娇着不愿写,不过坳不过大家起哄,今天上午摸鱼着写了此文。

觉得写的真的非常好,便转载到我的博客,希望大家喜欢。

0:00
/0:13

作者:林老师 昵称:向露冷风。

我在浪漫的康定,把一首又一首浪漫的歌谣唱得支离破碎。

街灯在湿漉漉的玻璃上晕开,模糊成一片流动的暖黄。

那黄光里,似乎还摇曳着方才溜溜城台阶上未尽的喧嚣与歌声。

夜中的溜溜城,萨克斯的乐声便在这片暖色里流淌,铜管映着溜溜河的奔腾泛着温润的光泽。

吹奏者是个头发凌乱的中年汉子,似若雅典城里诵讲史诗的吟游诗人,闭着眼,嘴唇贴着吹口,指头在按键上起伏跳跃,乐音便自那铜管中汩汩涌出,缠绵又悠长,仿佛将整个高原的辽远与寂寥都含在了唇齿之间。

乐声拂过我的耳际,又飘向更远处,在暮色里织成一张无形的网,笼住了台阶上散坐的人们。

我坐在溜溜城大门的石阶上,身下石阶的凉意透过衣裤渗入肌肤。

眼前人影晃动,如溜溜河水流淌不息。

有背着行囊的旅人步履匆匆,眼神里装着远方;有穿着艳丽藏袍的各地姑娘走过,银饰叮当,裙裾旋起一阵风;还有男人牵着女人的手,慢悠悠踱着步子,影子被斜灯拉得很长很长。

台阶之上,众生百态,各自背负着各自的故事,匆匆交汇,又匆匆离散,仿佛高原上倏忽聚散的流云。我坐在这台阶,恍若人世一个小小的渡口。

伙伴们终于从四面八方汇拢过来,脸上都带着风尘仆仆的笑意。

我率先起头,那首熟稔的调子便从唇边溜了出来:“跑马溜溜的山上……”声音起初还有些拘谨,如同试探着伸出的触角。

很快,第二声、第三声便汇入进来,如同涓涓细流汇成了奔涌的河。

我们彼此相视,眼神里跳跃着一种心照不宣的火焰,声音便愈发高亢起来,毫无章法地冲撞着暮色,撞向溜溜城古老的飞檐斗拱。

那歌声,莽撞、粗粝,却又带着一股莫名的、近乎悲怆的欢喜。

我们这群滴酒未沾的人,竟醉得东倒西歪,脸颊滚烫,胸腔里仿佛有滚烫的酥油茶在翻腾。

这醉意,并非源于杯中之物,而是从心底深处蒸腾而起,在高原微凉的晚风里发酵、弥漫,将灵魂都托举起来,飘飘然不知归处。伙伴们终于从四面八方汇拢过来,脸上都带着风尘仆仆的笑意。

坐进出租车回住处时,那莫名的醉意仍未消散,反而在狭小的车厢里愈发浓烈起来。

我们像一群挣脱了缰绳的马驹,将一首又一首的歌谣,不管不顾地抛向窗外飞逝的夜色。

从古老民谣到流行小调,从慷慨激昂到低回婉转,歌声在车厢里横冲直撞,几乎要掀翻车顶。

司机师傅笑着,也不时应和几句,任这些樊笼中呆久了的人在另一个樊笼里沸腾。车窗外,康定城的灯火渐次入目,又渐次被抛在身后,成为记忆里模糊的光斑。歌声穿透车窗,在高原清冽的夜气里飘散开去,仿佛一群不知疲倦的夜鸟,扑棱棱飞向墨蓝的夜空深处。

那一夜,我们唱着支离破碎的歌谣,送给了支离破碎的自己。

翌日清晨,我们便向着白海子进发了。

山路崎岖,如同大地裸露的筋骨,蜿蜒着伸向云端。

起初伙伴们尚能谈笑,脚步也轻快。

渐渐地,空气变得稀薄而清冽,每一次呼吸都仿佛在肺腑间刮起一阵小小的风暴。说话成了奢侈,只听见粗重的喘息声和登山杖叩击石块的笃笃声,单调而固执地敲打着寂静的山谷。

那日天气不错,云雾随风聚散,远处雪山时隐时现,由海子始出,逐渐奔腾而下的河流与日光冲撞出一缕彩虹。

越往上攀,同伴步履越是滞重,双腿如同灌满了铅水。

偶尔抬头,前方是同伴沉默的背影,更远处,是雪山肃穆的轮廓,在稀薄的空气中泛着冷冽的蓝光。

山风呼啸着掠过耳畔,带着刺骨的寒意,刮得脸颊生疼。

我们埋头跋涉,像一群沉默的朝圣者,用脚步丈量着通往天际的距离。

终于,当最后一道悬崖被踩在脚下时,一片巨大的、凝固的蓝,猝不及防地撞入眼帘。

白海子静卧在群山环抱之中,宛如天神遗落的一块寒冰,又似大地睁开的一只冰蓝眼眸。

湖水澄澈得令人心悸,倒映着四周皑皑雪峰和头顶无垠的碧空。

那是一种摄人心魄的蓝,深邃、纯粹、凛冽,仿佛吸纳了世间所有的寂静与永恒。我站在湖边,渺小如尘埃,方才攀登的艰辛与喘息,瞬间被这无边的澄澈与宁静吞噬、抚平。

风掠过湖面,漾起细碎的涟漪,阳光碎金般跳跃其上,又无声地沉入那亘古的蓝里。

雪山巨大的倒影在湖水中微微晃动,仿佛另一个沉静的世界。

那一刻,时间仿佛凝固了,人世的喧嚣与昨夜的歌声,都成了遥远模糊的背景音。

山上我们无耻地蹭着另一行人西瓜、螺蛳粉、泡面、卤肉,欢快地谈聊,他们与我一样自成都而来,后来又在成都的群里相遇。

但山神似不喜这般的喧闹,云雾弥漫山间,无奈只有下山了。

下山的脚步轻快了许多。

背包里似乎还盛着白海子的一捧清寒,沉甸甸地贴在背上,随着步伐微微晃动。

山风依旧在耳畔呼啸,却已失却了攀登时的凌厉,变得柔和起来。

我回头望去,白海子那抹幽蓝已隐入层峦之后,只留下雪峰之巅一点永恒的洁白,在碧空下闪耀。

回到喧嚣的人境,那高原的风,雪山的影,湖水的蓝,连同溜溜城台阶上无端而起的醉歌,都沉淀为心底深处隐秘的矿藏。

当市声如潮水般退去,寂静降临,耳畔便会幽幽响起那萨克斯的呜咽,它不再仅仅是一段铜管的震颤,而仿佛化作了山巅永恒吹拂的、清冽而自由的风——它掠过经幡,拂过玛尼堆,最终悄然潜入血脉,成为灵魂深处一声无人听见的、悠长的回响。

  •  

端午再游康定+看高山海子

2025年6月3日 11:08

null

没想到这个月又来了一次康定,不过这次比上次还要玩的高兴。

不过中途发生了个意外,我们有个新手队员不听劝告在上山时走了野线,差点迷路在山里。

我们在山上等了一两个小时,眼看着好像要下雨了,时间已经下午三点了,时间越晚山上的天气就会越恶劣。所以我们打算先下撤到下面的草甸去她分线的地方等待,同时在下山途中和所有能见到的人询问,并帮忙散播这个信息,好在下去后很快找到有信号的地方,而且运气很好的是她也有信号,所以第一时间联系上了她。

听她说她马上登顶了,但是她说没看到其他人,我们就知道她估计完全走错了方向,因为我们在山顶上的海子边上碰到了十几号重装徒步的人,上面闹哄哄的,不可能没人,所以立刻让他马上原路下撤,而我们则是找了两块岩石中间,拿出急救毯挡住风口生活等待,最终4点左右看到她的身影时才松了一口气。

这里告诫所有出去户外徒步的朋友,一定要跟随大部队行动,上山前掌握好基础徒步知识,如:如何看户外轨迹地图、基础求生避险知识等等。

因为端午都三天假期,所已这次的规划是两天一夜的行程,留一天假期在家里修养恢复。

因为最近四川的天气都不太好,所以我提前一个多星期就开始关注想去的景点天气,但是通过手机上自带天气软件给的天气数据,这类软件都是通过当地的气象站来给出天气数据,而我们去的山上基本上都没有气象站,而且高山地区天气变化无常,所以需要通过专业的天气软件观测云层、风向等数据进行评估。

这次用的Moteoblue和Windy这两个软件进行观测。

💡
Windy中的预测模型可以选择多个模型推测的数据进行对,其中也有Moteoblue的数据,但是无法展示Moteoblue的云层信息。
Windy上发文当天康定老榆林村的天气情况

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

所以我们这次的目标就定在了新榆林村的白海子和前面的野马海子。

最后出发时确定的人员有8人,4男4女,其中两位车主,一辆奥迪轿车,一辆小排量suv。其中有老朋友林老师、小罗,本来上次泸州的刘姐也想去的,但是他有事耽搁了。

行程安排如下。

  1. 31号早上7点出发康定,在天全休息吃饭
  2. 31号下午2点继续出发到第一站野马海子,这个只有200左右的爬升,权当作适应拉练。
  3. 31号下午5点左右下山,驱车康定新城吃饭,因为上次老城吃过找不到停车位的亏,所以打车去老城逛街。
  4. 逛完去民宿,休息。
  5. 1号早上6点起床,7点出发白海子,民宿出门几百米就是出发点,今天强度比较高7公里左右有1300的爬升。
  6. 1号下午2点左右登顶,然后下撤,5点左右到山脚
  7. 在康定新城吃个饭,然后回程,预计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,所以陪他在康定城门口放肆高歌。

0:00
/0:13

之后便去了民宿,因为玩的太嗨了,忘记拍照了。

第二天7点出发白海子

开始进入树林

杜鹃花开的很漂亮

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

峡谷里的雾被风渐渐吹走

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

山谷全景

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

喝个水

到达河谷路段

又一个绝望坡

能看近距离看到雪山了

这里上去就是一个大草甸

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

远处的雪山

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

路边的小黄花

让花和雪山和个影

翻过这个坡就到了

最后时刻

0:00
/0:15

白海子近景

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

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

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

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

体验了一次在山上乞讨,人家还给你备了碗筷,哈哈哈。

0:00
/0:13

虽然一直在吃喝拍照,但是一直没忘记迷路的那个队友,我们等到三点半时山风把大雾吹了过来,天气也越来越差,我们只能先下撤到下面草甸在联系她。

运气不错的联系上了她,我让她立即原路下撤,我们在草甸这里等她。山上降温,起大雾,还若有若无的有些雨珠,也不知道她需要多久过来,所以只能先找个避风的地方生火取暖,保存体温。

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

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

最后急速下撤,终于在下午五六点左右下撤到民宿。

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

  •  

给文章引入联邦宇宙嘟文互动记录

2025年5月24日 17:42

Photo by Pankaj Patel / Unsplash

去年还是前年就在思考如何在 Ghost 中集成 Activitypub 的互动,还找了一个国内博客大佬的实现 ActivityPub 协议的简单实现 - Lawrence Li ,不过这位大佬的方案是完全自己实现协议部分,对我来说有点太复杂了。

后来Ghost官方也发布了一个Ghost和Activitypub的继承方案,不过我看了下项目的Docker-compose文件,感觉太臃肿了(毕竟是商业化产品,性能各方面都要考虑到)。

而且开发一年多了,现在也只在官方付费服务里Beta,所以现在兴致缺缺。

因为最近用Cloudflare Worker实现了很多有意思的玩意,

所已,今天忽然灵光一闪,想到了一个非常有意思的点子,通过和AI的几轮互动,感觉应该能完整实现大佬博客里的那种效果。

其实原理无非就是利用Cloudflare Worker和KV功能,对文章ID和嘟文ID进行储存,在页面展示时再去请求数据进行展示,整个逻辑大概如下:

文章和嘟文同步

  1. Worker定时请求Ghost博客中最新一篇的数据(我这边是用Ghost的唯一文章ID做Key,你的博客系统没有API的可以请求RSS,但是ID必须是唯一的,可以自己截取slug出来应该也是可行的)。
  2. 拿到Key后在KV中进行查找,如果录入过就跳过。
  3. 没录入就拿文章的数据根据长毛象或GTS的API要求组装嘟文进行发布。
  4. 获取到嘟文唯一ID后和文章ID一起存入KV。

嘟文数据获取

  1. 博客文章详情页面加载完后通过文章ID请求Worker。
  2. Worker拿到ID去KV中查找嘟文ID。
  3. 找到话通过嘟文ID去长毛象或者GTS获取嘟文互动数据。
  4. 进行展示。
💡
经蜗牛大佬提醒,根据嘟文的原始可访问性做了控制。
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>
<!--- 其他代码 --->
  •  

微软开源的更贴近Windows习惯的Linux命令行文本编辑器:edit

2025年5月23日 11:15

Photo by Christopher Gower / Unsplash

不知道是不是微软知道天下小白苦 Linux 的命令行编辑器久矣,最近开源了一款 windows 操作习惯的 shell 文本编辑器 edit。

GitHub - microsoft/edit: We all edit.
We all edit. Contribute to microsoft/edit development by creating an account on GitHub.
GitHubmicrosoft

支持多行选择、复制粘贴、鼠标控制等操作,操作习惯更偏向 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
  •  

260、小满

2025年5月21日 13:14

null

当夜卧稍迟,早起迎露,以应阳气渐满之势。晨起可循田埂而行,观麦浪轻摇,听蛙声初沸,导引气血,使志得舒。饮食宜增苦减辛,多食苦瓜、莴笋、新蚕豆以清心火,佐以薏仁、赤豆利湿健脾。

此时阳气将盛,湿气始滋,当调息静心,戒满戒溢,常怀虚谷之志。衣宜选亚麻、棉纱,疏风透汗,尤需护住脘腹关元。常饮三花饮(金银花、菊花、茉莉),清热解郁,兼防湿暑。运动当选八段锦、易筋经等和缓功法,如云舒卷,似穗低垂,使气机流畅而不壅滞。午后小憩半刻,敛阳养阴,此谓「持满之道」。
  •  

0元开88vip??

2025年5月22日 11:53

Photo by Ryan Born / Unsplash

因为最近淘宝买了不少东西,有些商家不送退货险,退货运费都挺贵的。

而且今天想买个好价鞋,但是需要88vip的券,@jun 倒是说帮我抢,但是有些券需要等,还要冲购物金,弄来弄去感觉也挺麻烦的。

所以想来想去还是自己开一个。

之前在咸鱼上几毛钱买过一个夸克云的88vip,估摸着中间应该是有什么门道,所以去这些地方做了一下搜索,了解了一下中间的套路。果然不出所料,感觉中间的利润还挺高的,现在这些大公司的羊毛被这些羊毛党可谓是薅到极致。

羊毛党的思路大概是这样:

  1. 去咸鱼、小红书等地方发帖指导别人开88会员,并说可以回收附带的视频、音乐权益,一般两个包年服务的回收价格在80元左右。
  2. 因为咸鱼、小红书平台的封控问题,引导客户至微信沟通。
  3. 顾客咸鱼上架宝贝,他们拍下,然后让客户开通88vip。
  4. 然后他们通过内部共享渠道拿到其他需要充值这两个服务的用户的手机号
  5. 我们配合进行充值
  6. 他们咸鱼付款。

我核查了一下已经了解到的收益点

  1. 推广金,走他们的邀请链接开通好像会有14-16元左右的推广奖励。
  2. 包年会员转手卖掉赚差价,网易云、优酷或芒果的包年服务价格咸鱼在100元左右,利润20元。
推手收益

可能还会有其他我没了解的收益点,但是上述两项至少会有差不多40元的收益,这可以说是无本买卖,如果能把中间的流程优化好,应该还有提升空间。

唯一的问题就是可不可以持续发展,这个完全看淘宝这边的政策管的严不严了。

  •  

特stse

2025年5月21日 16:01

书接上文。

小舅子他们在特种兵式的几天游玩之后表示最后一天想在家里休息一下,陪着他们吃了一天清淡的食物后,按了个脚,第二天一号他们便各自返回工作地去了。

而我们两口新的征程才刚要开始——下一站勒多曼因。

其实勒多曼因这个行程是五一之前就开始关注了的,因为之前徒步峨眉山、笔架山后加了很多户外群,五一前的偶然一天看到有人发了一个雪山冰湖皮筏艇的照片,并说准备开团出发,景点是我喜欢的那种风格,强度也还能接受,所以进群了解了一下,总共三天行程,:

  • 第一天成都集合,乘坐包大巴车出发去康定
  • 下午大概四五点到康定,吃晚饭,吃完后坐中转车去老榆林
  • 老榆林早起坐转运车出发去山脚下的格因草原开始徒步。
  • 徒步20公里,爬升到4300米左右,在山上营地住下。
  • 第三天早起冲顶,然后下山。
  • 各回各家。
  • 我们只需要带两天的路餐,其他的他们包。
  • 总费用650元1人,40人成团出发。

当时想着650这价格是真心不贵了,而且恰好能和小舅子他们来的时间错开,所以毫不犹豫的报了两个名。

但是在后面几天接待下舅子的过程中,群里消息不断,组织力度似乎不太够了,总共个加群的人有50多个,接龙说要去的也满了40个人,但是最后交钱的时候却不够包车的40人。

因为人数不够没办法拼大车,群主就开始降级说租20人小车,但是小车价格和大车只便宜了四五百块钱,最后摊下来每个人要多交100元,然后重新组织了一波接龙,不懂贵这100块会产生了多大的化学反应,这次直接20人都没凑齐...。

眼看着要散团了,但是我的瘾又被钓上来了,不想眼看着散团,索性就说我出个车,看有没有其他愿意出车的一起,凑个十几二十个人也还不错,终于在散团之际组织了三个车,最终有17人一起参与了这趟行程。

我们这个7坐车除开我和S,最终分两拨坐了5人。

先是3位泸州的朋友,两男一女,从泸州过来自贡上车,分别是快60的二叔,很会照顾人的刘姐,以及帅气的空少三笑。之后开车去成都接上2泰拳老师和一个川大的大学生。

后面就正式开始发图了,所以这里先吐槽一下这个团。

这个穿山甲不能算是正式的商业团,只能说是有一个大家信的过的群主去联系的车、住宿、餐食,规划好行程后在群里组织的,不过那点组织力几乎是没有,我们因为自驾所以最后减了100的团费,最终收的550元,但是当时承诺的东西一个都没达成,这里罗列已下,下次大家参加这种群性质的团一定要提前问清楚,留好文字存档。

  1. 说好的只用带路餐,但是最后第一天的晚餐需要自费,第二天的早餐也让我们自费,之后在山上说有鸡汤喝也没有准备,山上的营地的晚餐也很差,更别说早餐馒头还是馊的。
  2. 说好会花一千多请一个solo过贡嘎的领导,上山后发现人家是带了商团,几乎没管过我们团,另外一个年轻的小伙子说是被叫来管我们,但是就下山看到了他们一下,拍照服务之类的就更别提了。
  3. 转运车期初以为是什么大巴之类的,上去才知道想多了,全是那种小货卡,上面拉一块篷布就行了,后来听其他上山的说有人坐的车是拉牛羊的,全是屎...。

好了,亏已经吃了,只能说下次注意了。

行程分享正式开始。


我们5月3号从成都出发康定完美错开了车流高峰,全程几乎没有堵车,一路狂奔,车上听二叔说天全服务站有「此生必驾」318的牌子可以打卡,大家商量一致就在天全休息一会儿。

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

菌汤牦牛肉蒸气火锅

吃完饭才不到5点,所以大家准备一起去逛逛溜溜城。

我们本来是开车进城的,但是穿了一圈都没找到车位,最后在城区里堵了一个小时重新回到康定进城口的边上的一个集中停车场,20元一天,建议大家来这里玩不要想在城区找车位了。

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

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

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

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

溜溜城打卡,为什么叫溜溜城?

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

1. 溜溜城打卡 2. 小巷一景

藏族同胞们的广场舞是锅庄,那「锅庄」又是什么呢?。

锅庄(藏语称“果卓”或“歌庄”)是藏族民间广泛流传的一种传统集体舞蹈,尤其在四川、西藏、云南、青海等藏族聚居区盛行。它不仅是重要的娱乐活动,更是藏族文化、宗教和社会交往的载体。

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

天色渐暗后和大家汇合,去往老榆林的民宿休息。

因为对这边的卫生环境不报什么期待,所以提前买了隔脏睡袋,用塑料袋+垃圾桶装了点热水泡脚,早早便躺下休息了。

1. 早起民宿外的风景 2.房间环境 3. 早起窗外的雪山 4. 隔脏睡袋

没有领队,更没有领队说让我们拍出发照,所以我索性叫上大家一起随便拍了一张。

17个人就这几个拍了照...。

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

车上手机拍的远处雪山

1. 格因草原 2. 马帮的马

今天天气不错,依旧没看到领队...。

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

路过一个红石滩

低山区还有很多松树。

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

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

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

一爬一个不吱声

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

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

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

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

一桌子的方便面碗和围了一桌子崩溃的驴友们。

继续出发

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

中间那个是本次帮忙的「领队」

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

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

绝望坡后面的美景

终于到营地了!

营地景色全览

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

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

因为营地在海拔4300米左右,加上棚子里氧气不太流通,所以帐篷里十几号人晚上过夜的时候都有不同程度的高反,症状基本上都是头疼。我后半夜睡了会,基本上是醒半小时睡半小时左右,我旁边的一个大学生几乎整夜没睡觉,两三点的时候还爬起来说想下山...,一整晚的噪音把他旁边的一个能睡着的老驴折腾到一晚上没怎么睡,感觉老驴也很难受哈哈。

S就是说觉得冷,因为棚子四处漏风,漏风最严重的就是我们躺下后头顶的地方,风大的时候我问不得不起来给她过上急救毯才好些。

后半夜风停了,我帮她把睡袋裹紧,把头罩住就留个鼻子嘴巴出来,才算是踏踏实实睡了好几个小时,比我有出息多了。

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

早餐的包子是馊的,我就喝了点稀饭,吃了自己带的面包。

因为出发的时候黑黢黢的,手机也没电了,就没拍什么照片,同行的刘姐借了他的充电宝给我用,让我得以续命。

天终于渐渐亮起来,发现我们被大雾追赶着,手机也有一些电了。

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

体验非常棒。

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

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

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

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

登顶。

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

别的不说,先打个卡把。

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

因为风雪,准备下山了。

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

回到起点。

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

之后便是返程,回去的时候只有泸州的三位和我们一起,另外两个坐其他车了。

也好,我们这几个人更聊的来,我们边开边聊,倒也不觉得累,还拉个群准备下次有什么活动再一起出行。

直到晚上11点30分才安全到达自贡,他们另外拼车叫了个野猪儿回泸州。

这次行程结束我缓了三天才缓过来,每天下班回家几乎粘上枕头就睡,每天的睡眠时长破天荒的突破了8个小时,临近9小时!

下次出行真的不想再开车了。

  •  
  • 12  

用户外活动填满五一:勒多曼因篇

2025年5月18日 15:45

null

书接上文。

小舅子他们在特种兵式的几天游玩之后表示最后一天想在家里休息一下,陪着他们吃了一天清淡的食物后,按了个脚,第二天一号他们便各自返回工作地去了。

而我们两口新的征程才刚要开始——下一站勒多曼因。

其实勒多曼因这个行程是五一之前就开始关注了的,因为之前徒步峨眉山、笔架山后加了很多户外群,五一前的偶然一天看到有人发了一个雪山冰湖皮筏艇的照片,并说准备开团出发,景点是我喜欢的那种风格,强度也还能接受,所以进群了解了一下,总共三天行程,:

  • 第一天成都集合,乘坐包大巴车出发去康定
  • 下午大概四五点到康定,吃晚饭,吃完后坐中转车去老榆林
  • 老榆林早起坐转运车出发去山脚下的格因草原开始徒步。
  • 徒步20公里,爬升到4300米左右,在山上营地住下。
  • 第三天早起冲顶,然后下山。
  • 各回各家。
  • 我们只需要带两天的路餐,其他的他们包。
  • 总费用650元1人,40人成团出发。

当时想着650这价格是真心不贵了,而且恰好能和小舅子他们来的时间错开,所以毫不犹豫的报了两个名。

但是在后面几天接待下舅子的过程中,群里消息不断,组织力度似乎不太够了,总共个加群的人有50多个,接龙说要去的也满了40个人,但是最后交钱的时候却不够包车的40人。

因为人数不够没办法拼大车,群主就开始降级说租20人小车,但是小车价格和大车只便宜了四五百块钱,最后摊下来每个人要多交100元,然后重新组织了一波接龙,不懂贵这100块会产生了多大的化学反应,这次直接20人都没凑齐...。

眼看着要散团了,但是我的瘾又被钓上来了,不想眼看着散团,索性就说我出个车,看有没有其他愿意出车的一起,凑个十几二十个人也还不错,终于在散团之际组织了三个车,最终有17人一起参与了这趟行程。

我们这个7坐车除开我和S,最终分两拨坐了5人。

先是3位泸州的朋友,两男一女,从泸州过来自贡上车,分别是快60的二叔,很会照顾人的刘姐,以及帅气的空少三笑。之后开车去成都接上2泰拳老师和一个川大的大学生。

后面就正式开始发图了,所以这里先吐槽一下这个团。

这个穿山甲不能算是正式的商业团,只能说是有一个大家信的过的群主去联系的车、住宿、餐食,规划好行程后在群里组织的,不过那点组织力几乎是没有,我们因为自驾所以最后减了100的团费,最终收的550元,但是当时承诺的东西一个都没达成,这里罗列已下,下次大家参加这种群性质的团一定要提前问清楚,留好文字存档。

  1. 说好的只用带路餐,但是最后第一天的晚餐需要自费,第二天的早餐也让我们自费,之后在山上说有鸡汤喝也没有准备,山上的营地的晚餐也很差,更别说早餐馒头还是馊的。
  2. 说好会花一千多请一个solo过贡嘎的领导,上山后发现人家是带了商团,几乎没管过我们团,另外一个年轻的小伙子说是被叫来管我们,但是就下山看到了他们一下,拍照服务之类的就更别提了。
  3. 转运车期初以为是什么大巴之类的,上去才知道想多了,全是那种小货卡,上面拉一块篷布就行了,后来听其他上山的说有人坐的车是拉牛羊的,全是屎...。

好了,亏已经吃了,只能说下次注意了。

行程分享正式开始。


我们5月3号从成都出发康定完美错开了车流高峰,全程几乎没有堵车,一路狂奔,车上听二叔说天全服务站有「此生必驾」318的牌子可以打卡,大家商量一致就在天全休息一会儿。

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

菌汤牦牛肉蒸气火锅

吃完饭才不到5点,所以大家准备一起去逛逛溜溜城。

我们本来是开车进城的,但是穿了一圈都没找到车位,最后在城区里堵了一个小时重新回到康定进城口的边上的一个集中停车场,20元一天,建议大家来这里玩不要想在城区找车位了。

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

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

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

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

溜溜城打卡,为什么叫溜溜城?

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

1. 溜溜城打卡 2. 小巷一景

藏族同胞们的广场舞是锅庄,那「锅庄」又是什么呢?。

锅庄(藏语称“果卓”或“歌庄”)是藏族民间广泛流传的一种传统集体舞蹈,尤其在四川、西藏、云南、青海等藏族聚居区盛行。它不仅是重要的娱乐活动,更是藏族文化、宗教和社会交往的载体。

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

天色渐暗后和大家汇合,去往老榆林的民宿休息。

因为对这边的卫生环境不报什么期待,所以提前买了隔脏睡袋,用塑料袋+垃圾桶装了点热水泡脚,早早便躺下休息了。

1. 早起民宿外的风景 2.房间环境 3. 早起窗外的雪山 4. 隔脏睡袋

没有领队,更没有领队说让我们拍出发照,所以我索性叫上大家一起随便拍了一张。

17个人就这几个拍了照...。

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

车上手机拍的远处雪山

1. 格因草原 2. 马帮的马

今天天气不错,依旧没看到领队...。

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

路过一个红石滩

低山区还有很多松树。

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

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

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

一爬一个不吱声

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

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

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

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

一桌子的方便面碗和围了一桌子崩溃的驴友们。

继续出发

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

中间那个是本次帮忙的「领队」

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

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

绝望坡后面的美景

终于到营地了!

营地景色全览

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

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

因为营地在海拔4300米左右,加上棚子里氧气不太流通,所以帐篷里十几号人晚上过夜的时候都有不同程度的高反,症状基本上都是头疼。我后半夜睡了会,基本上是醒半小时睡半小时左右,我旁边的一个大学生几乎整夜没睡觉,两三点的时候还爬起来说想下山...,一整晚的噪音把他旁边的一个能睡着的老驴折腾到一晚上没怎么睡,感觉老驴也很难受哈哈。

S就是说觉得冷,因为棚子四处漏风,漏风最严重的就是我们躺下后头顶的地方,风大的时候我问不得不起来给她过上急救毯才好些。

后半夜风停了,我帮她把睡袋裹紧,把头罩住就留个鼻子嘴巴出来,才算是踏踏实实睡了好几个小时,比我有出息多了。

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

早餐的包子是馊的,我就喝了点稀饭,吃了自己带的面包。

因为出发的时候黑黢黢的,手机也没电了,就没拍什么照片,同行的刘姐借了他的充电宝给我用,让我得以续命。

天终于渐渐亮起来,发现我们被大雾追赶着,手机也有一些电了。

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

体验非常棒。

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

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

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

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

登顶。

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

别的不说,先打个卡把。

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

因为风雪,准备下山了。

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

回到起点。

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

之后便是返程,回去的时候只有泸州的三位和我们一起,另外两个坐其他车了。

也好,我们这几个人更聊的来,我们边开边聊,倒也不觉得累,还拉个群准备下次有什么活动再一起出行。

直到晚上11点30分才安全到达自贡,他们另外拼车叫了个野猪儿回泸州。

这次行程结束我缓了三天才缓过来,每天下班回家几乎粘上枕头就睡,每天的睡眠时长破天荒的突破了8个小时,临近9小时!

下次出行真的不想再开车了。

  •  

259、立夏

2025年5月13日 10:38

勒多曼因湖边

立夏时节,熏风南来,天地始交,万物并秀。当夜卧早起,迎朝阳以养心气。晨起可临水而立,观荷听蝉,导引阳气,使志无怒。饮食宜增酸减苦,多食樱桃、青梅、新麦以养心脾,佐以莲子、百合清心宁神。

此时心火渐旺,肾水初衰,当静心寡欲,戒骄戒躁,常持虚静。衣宜选用苎麻丝帛,透气生凉,尤需护住后颈命门。常饮绿豆薄荷饮,解暑生津,兼防疰夏。运动当选五禽戏、太极等舒徐功法,如树展枝,似水潺湲,使气血流通而不沸涌。午后小憩一刻,胜服灵丹,此谓「养长之道」。

立夏这天刚好在山上没网,不过在山上的时候还想着要发节气文章,下来后光顾着P照片去了,补发一章。

  •  

用户外活动填满五一:瓦屋山篇

2025年5月11日 10:18

瓦屋山

今年的五一感觉是有生以来活动安排的最满的一次。

先是五一假日前老婆把小舅子和大姨妈摇来了自贡,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元。

下山
自拍
分两篇写把,下一篇 勒多曼因篇。
  •  

天然气热水器国补下单

2025年4月26日 18:08

Photo by Risa / Unsplash

前些日子家电国补线上线下宣传的如火如荼,但是一直觉得国补这个东西好像我占不到啥便宜,因为我暂时没有任何更换家电、手机的想法。

但是老天爷似乎都要推波助澜让我去凑凑热闹——家里的电热水器忽然坏了。

是的,但是其实也并不意外,这台和这个我们家房子同样年纪的万和热水器服役已经十多年了,其实也就这两年开始慢慢有些小毛病,这个时候即便坏了我也不觉得意外。

其实也叫不上坏,热水器的错误码为E1,是点火器故障,去年还是前年开始就出现过几次,我拆开打磨了一下点火器的头子后其实就好了。不过我妈说干脆让这个老家伙退役算了,修来修去的也麻烦。

线上的热水器品牌五花八门,如海尔、美的、万和、樱花等等。不过价格在一片绿色国补到手价的标签下显的尤其划算。16L带增压、水伺服的一级能耗的机器线上基本上只要1100-1300左右,二级能耗就更低了,基本都在1000以下。

我也去线下的实体店看了一下,因为保护线下市场的缘故,线上线下基本上不会售卖同型号的机器,不过同配置参数线下始终要贵个几百,毕竟像是京东、淘宝这种平台还有平台优惠不是。

而且线下不卖一级能耗的产品,不知道为啥。

刚开始的时候我选的美的、海尔的牌子,后来我妈提醒让我看看万和,这才了解到万和才是国内专业做热水器的,而且我们之前那个台服役十多年的热水器也是万和,后来安装的师傅也认同了这个看法。

我最后选的是万和的F9DMAX ,各种优叠加下来价格如下,性价比相当高,国补真的没毛病。👍

  • 商品总价:¥2199.00
  • 运费:+ ¥0.00
  • 商品优惠:- ¥110.00
  • PLUS专享立减:- ¥8.80
  • 以旧换新:- ¥130.00
  • 国家补贴:- ¥390.04
  • 实付款:¥1560.16

产品主要参数如下。

  • 16L水量
  • 国家一级能效
  • 水伺服
  • 下置风机
  • TSI 210% 增压
  • 8年质保

其中我体验下来,各项参数参考的优先级为,排前的我认为重要性更高:

  1. 质保:热水器强制报废是8年,现在几乎都是8年质保了,不过也有5年的。
  2. 能效:国家一级能效每年能比二级的少个1000块左右,我感觉还是相当重要,就是会产生冷凝水,需要有排水的地方,但是这个水量很小,我没观察过,但是估计和空调差不多把。
  3. 水量:我们家之前那台是13L的,有两个地方同时用水时,水量会变的非常小,十分影响体现。
  4. 水伺服:这个其实就是控制水温的,保证多地同时用水时的水温恒定,之前那台没有这个功能,经常厨房用水后洗澡水温度会忽然变凉,很不爽。
  5. 下置风机:相比于上置,下置风机因为做了密封,噪音真的小了非常多,以前那台上置的一开,我在卧室都能听到动静,现在站在旁边都不容易发觉,还得用眼睛看热水器面板。
  6. 增压:之前想着带这个增压会不会让多个地方用水的时候水量变大,其实不会,这个因为热水管、烧水量只有那么大,同时经过的热水是恒定的,不会有非常明显的变化,复式楼层可能感知会明显很多。

最后,还要注意上门安装的费用,一般情况下安装人员上门安装是不收费用的,但是他们只会免去箱子内所有材料的费用(毕竟那是你已经花钱买了的),如果需要使用额外的材料是需要另外付费的,但是一般品牌放会明码标价。

我这次因为是替换旧机,原有管路什么都是现成的,没有用他们的任何材料,所以师傅上门安装好后就能直接使用,也没做任何推销和歪心思,没出任何费用,体验还是相当不错的。

我们家的情况师傅说如果冷热水管安排到位,其余材料用他们的费用也只会在100多一点,也不算太贵。

另附我这次整理的热水器型号清单。

  •  

长毛象新通知推送TGBot

2025年4月21日 12:35

其实蜗牛哥之前开发过一个Chrome扩展,可以在浏览器里显示一个图标和通知数量。但是我电脑上现在Chrome一打开十几个进程,我实在不想再新增扩展了。

所以这两天用Deepseek糊了一个搭配Cloudflare推送到TGBot的Worker脚本,效果如截图。设置好长毛象和TGBot的设置后,程序会每5分钟检测一次有没有新通知,有的话才进行推送操作。

准备KV

先添加一个KV,名称 KV_STORE ,备用。

准备长毛象TOken

获取长毛象Access Token,不放心的话在权限部分可以单独只设置通知获取权限

  1. 登录你的 Mastodon 实例(如 https://mastodon.social)。
  2. 进入 "Preferences(偏好设置) > Development(开发)(或直接访问 https:///settings/applications)。
  3. 点击 "New Application(新建应用):
    1. Application Name(应用名称):填写你的应用名称(如 MyBot)。
    2. Website(网站)(可选):填写你的应用网站(如果没有可留空)。
    3. Scopes(权限):选择你需要的 API 权限(如 read、write、follow 等)。
  4. 点击 "Submit(提交),系统会生成:
    1. Client Key(客户端 ID)
    2. Client Secret(客户端密钥)
    3. Access Token(访问令牌)(可直接使用)

准备Cloudflare Worker

再添加一个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, '');
}

配置KV和定时执行

去Cloudflare Worker设置页面绑定KV和设置定时执行。

除了定时执行外,你还可以用 https://wokrerurl.dev/check 手动触发
  •  

258、谷雨

2025年4月20日 09:47

null

谷雨时节,春雨润物,万物生长,宜早睡早起,顺应阳气升发。晨起可漫步庭院,吸纳清新之气,活络筋骨,畅通气血。饮食宜甘淡平和,多食芽菜、香椿、荠菜等时令春鲜,少食生冷厚味,以健脾祛湿。
此时肝气渐弱,心气将旺,当调畅情志,戒怒戒躁,保持恬淡安然。衣着需随温增减,尤护腰腹,防湿邪入侵。常饮谷雨新茶,清火明目,助排浊气。运动宜选八段锦、慢步等和缓方式,滋养阳气而不耗散。
  •  

宜宾李庄、僰王山一日游

2025年4月12日 23:46

飞雾洞

这些年的清明节几乎都是在小雨中渡过,今年依旧不例外。

好在假日后的第一个工作日天气转晴,川内大部分地区的温度几乎是直线上升,自贡气温也临近了30°,似乎春夏的界限在这几天又开始模糊起来。

起因是平时不怎么会主动想出去玩的母上大人在清明节最后一天提出想出去转转,不过清明节三天,天气都不太好,而且假期中的后两天还漂着毛毛雨。所以和她商量了一下,我们换个班,换到了节后的第一个工作日出去,既能错峰出行,也能有个好天气。

因为只有一天,所以不能走太远,还要有充足的游玩时间,所以车程得压缩到2个小时之内。

之前 内江甜城一日游 去过一次内江,体验还是非常棒的。不过内江我们已经去过了,得换个对我们来说有新鲜感一些的。

目的地

在做攻略的时候想起之前徒步群内有群友策划过去 宜宾僰王山 徒步,宜宾离自贡也就100来公里左右,不到一个小时即可抵达,是十分不错的目的地。

其实宜宾我在很多很多年前来过一次,第一印象是——酒香!

我们当时走的老路去的宜宾,开始进入宜宾地界没多久,忽地就闻到一股淡淡酒香,开窗四处眺望无果,只发现我们正在经过一条长江支流,当时心理想着:真不愧是是五粮液产地、酒都宜宾,这河里都她妈是一股子淡淡酒香味。而后复行一里地后才发现经过一家酒厂时才恍然大悟,所以之后只要一闻到就为就能知道旁边必定有酒厂无疑了。

我们当时是自驾去的蜀南竹海,盛夏的十万亩竹海在微风的吹拂下用竹叶给我奏响了大自然的舒缓乐章我至今难以忘记。但是竹海除了竹子其他能有深刻体验的项目太少了,所以这次被我放弃了,准备还是以群友们之前去过的僰王山为主来做路线规划。

  1. 这次准备先去,因为做攻略的时候发现市区有好几个景点,担心李庄古镇玩起来太单薄所以先去,其次李庄白肉享誉全国,中午饭可以在镇子上解决,而且古镇临江而建,自有一股江南水乡的韵味。
  2. 然后去这次重点目的地 僰王山 ,山里的核心景点 飞雾洞 幽暗诡秘,十分有盗墓笔记的感觉,山中连绵不断的竹林和数个瀑布相信也会有不一样的体验,而且恰逢开春说不定还能挖到竹笋。
  3. 最后晚上再赶去合江门,逛一逛冠英古街,感受一下宜宾人的夜生活。

最后行程规划如下:

  • 8点30出发
  • 10点到李庄古镇,游玩加吃饭下午1点左右出发去僰王山
  • 2点左右到僰王山,开始爬山,来回两个小时,5点左右往回走去合江门
  • 7点左右到合江门,吃晚饭看夜景。
  • 接下来看时间回家。

总结

当时想着李庄离市中心比较远,又只是一个古镇,万一踩坑了就没地儿玩了,所以安排的上午去李庄,晚上去市中心。其实可以白天去晚上也去,听说晚上还有节目表演和白天是不一样的风格。

僰王山只有核心景点飞雾洞最值得一看,其他景点都有点可有可无了。

这种一天来回的旅程真的很不错,强度不会很高,也有非常不错的体验,以后可以常安排。

图记

下了高速不久就能看见长江大桥。

长江大桥

到了李庄停在了月亮田的停车场,在车库里进入了一个古建筑,似乎是一个酒店的大唐,雕梁画柱,气派的很。

李庄建筑

江南水乡味十足的李庄古镇。

水乡

水乡

古镇内

中午吃的李庄白肉,片肉的师傅说每片肉在2mm左右,肥而不腻。

李庄白肉和小煎鸭

吃过饭休息了一会便赶往了僰王山,竹林之内的僰王山特别凉快。

1. 僰王山入口 2. 山内石径

飞雾洞入口

探洞

天坑一景

下山时还在路边偷了春笋一根,哈哈。

第二天炒了腊肉,味道好极了。

春笋

合江门很热闹,三江交汇之处,也是老百姓们晚间活动的地方。

合江门两景

好像国外哪里也有个这个玩意儿,是拉斯维加斯吗?

3D小巨蛋

一大群叔叔阿姨、大爷大妈群魔乱舞,算是感受到「酒都人民」的松弛感了。

酒都人民的夜生活

入夜后的夹镜楼更漂亮了。

夹镜楼

冠英古街内的合江园
  •  

Memos同步至Mastodon(长毛象)

2025年4月12日 18:26

Photo by Chethan / Unsplash

我一直把Memos当作微博来用,偶尔也会手动同步到长毛象,但也只是偶尔。原因是即便在用梯子的情况下长毛象打开也太慢了,毕竟大多数实例都在墙外,且长毛象挺吃服务器资源的。

目前又不太想自建实例,虽然现在弄了NAS,理论上可以搭在上面,但是Ghost似乎在6月份要推出联邦宇宙服务了,到时候可以直接迁移到那个上面去,也就一直没下手。

之前看到过蜗牛哥出过一期长毛象同步到Memos的方案,和我的需求是相反的,因为今天周末恰好有空,所以就捣鼓了一下,弄了一版。

因为Memos可以设置WebHook调用,所以我的思路是:

Memos发布 -> 触发WebHook调用 -> 数据转发给Cloudflare Worker -> Worker里用Mastodon API发布嘟文

实现

先去长毛象上申请Access token ,路径为 :

偏好设置 -> 开发 -> 创建新应用 -> 起个名字,勾选 write:statuses、write:media 权限

然后就是Cloudflare Worker的实现了,我用DeepseekR1跑了一版,稍加改动就能初步使用了。

💡
如果你的Memos服务器在国内,那可能需要给Cloudflare worker绑定一个域名,不然会无法访问。
// 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的地址

一些不足

这种方式同步速度应该会稍快,但是还是有一些限制,比如

  1. 图片太大超过Worker可运行时间会上传失败。
  2. Mastodon API好像最大只能传4张图片。
  3. 向Memos的TG机器人发的消息不会触发Webhook。
  4. 长毛象好像不支持 Markdown。
  5. 我使用的Memos后端版本为 v0.18.1
  6. 等等,目前只发现上面2个,应该不止。
  •  

257、清明

2025年4月4日 22:51

晚上出门散步,路边画坛的小蘑菇

清明时节,阳气渐长,宜早起散步,呼吸新鲜空气,舒展筋骨,调和气血。饮食宜清淡,多食新鲜蔬菜,少食油腻辛辣,以养肝护脾。
心境宜平和,避免情绪波动,保持乐观心态,以顺应春生之气。适时添减衣物,防寒保暖,以防春寒侵袭。多饮温水,促进新陈代谢,排毒养颜。适度运动,如太极、瑜伽,以增强体质,提升免疫力。清明养身,顺应自然,方能健康长寿,福寿安康。

今天放假,和S终于能安安心心休息一天了。

一直睡到十一点起床,发现爸还在家,便叫上S出门中午的菜,S做了一个川味的腰花,我做了一个孜然鸡腿肉,都挺成功了。

上午出门的时候下了一部短剧 《家里家外》,下午两口子便我在沙发上看完了,全四川话台词的小短剧,还挺过瘾的,演员演技也还算在线,因为是短剧,所以笑点、爽点都很足。

  •  

256、春分

2025年3月20日 11:21

null

春分时节,昼夜均分,阴阳平衡,养生之道亦需调和。
此时,万物复苏,阳气渐升,宜早睡早起,顺应自然。
饮食上,宜清淡为主,多食新鲜蔬菜,如菠菜、韭菜等,以养肝明目。
  •  

254、雨水

2025年2月18日 11:53

null

脾土润泽运水谷,慎避地湿浸腠理。
此时天地阳气初萌,地气升腾化雨,养生当以护脾胃为要。饮食宜增甘减酸,多用山药、茯苓、莲子等甘淡之品健脾渗湿,晨起可饮陈皮姜米茶温运中焦。春寒挟湿尤伤下焦,宜着护腰腹,睡前以掌心熨关元穴九转。情志贵在疏达,可临窗观雨听檐滴,使肝气如草木逢润,舒展而不亢逆。
  •  

无题

2025年2月15日 09:49

生活苟且,为碌碌无为而羞愧。

当然,并不指要挣到多少钱,而是自己问心有愧,活的不够自我和尽力,对不起自己。

  •  

253、立春

2025年2月3日 22:33
阳气上升,万物更生,新岁开启

新的一年来了,祝各位博友,巳巳如意,福启新岁。

  •  

My App Defaults 2024

2025年1月21日 10:48

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

  •  

252、大寒

2025年1月20日 11:05

null

神志深藏于内,避免急躁发怒

节气的照片终于论完一次了,这一个轮次的引用信息为百度百科节气中关于「养身」的谶语。

  •  

用峨眉山的第一缕阳光给25年开个好头【完】

2025年1月6日 12:54

null

夜爬峨眉山强度挺大的,不是那么好拿捏,不要被抖音、小红书给你洗脑了!
去之前一定要能理解爬20多公里的楼梯是个什么概念!
我应该不会再爬第二次了....!

感冒

上次写完行程规划之后,不知道是不是早上晨跑衣服穿少的缘故,我忽然得了重感冒。

那几天开始全身酸痛,同时伴有咽痛、咳嗽,而且连续两个晚上发烧 + 白天退烧,为了不影响 31 号的出发,所以请了两天假在家中休息,调养。

好在出发前的早上,感冒的大部分症状都痊愈了,但是还是能明显感觉到体力依旧还是没有恢复。但是行程、人员都已经确定好,可不能放大家的鸽子。

所以不管如何都要先把大家送过去,如果身体实在跟不上就放弃徒步上山,坐观光车上金顶去等大家。

人员

在前面的行程规划一文中提到了当时确定要去的只有我、霜、小罗三人,我到时候打算开我台上不了台面的破 7 坐面包车过去,因此最好还是再找至少 4 人同行,以最大化平摊大家的费用,同时因为人多了后,玩起来也更有意思。

所以,出发前的几天我们就陆续在自己熟悉的圈子内寻找合适同行的队友,但是我这边进展不太顺利,频频碰壁,其中一个户外微信群居然还直接把我踢出群,不过我也庆幸被踢出去了,玩户外的这么小心眼即便在玩在一起也不会有多大意思。

好在小罗那边进展顺利,一直都有拉人进来,虽然其中有些朋友因为行程问题、装备问题赶不上,但是都非常好沟通,部分表示虽然这次不能参与,但是依旧期待下次同行。

最后,在出行前一天把终于把人员都确定好了,分别为:我、霜、小罗、太阳(兵哥哥)、vivi 姐、高兴哥、成歌。

1.太阳 2. 小罗 3. 霜 4.我 5. 成歌
1. 高兴哥 2. vivi姐

集合

31 号集合日当天,晴空万里艳阳高照,因为有成员担心赶不上日出,所以们把集合的时间提早了一个小时,也就是中午十二点。

我们是第二个到集合地点的,最先到集合地点的是小罗,她依旧穿着上次的淡绿色冲锋衣,装备齐全,精神头看起来不错。她男朋友这次有事,没有和她一起同行,小伙子倒还挺胆大的,也不怕女朋友被其他单身汉给挖走了,哈哈哈。

之后是成歌,是一位 50 多岁的大哥,湖北人,性格和蔼沉稳,非常好相处,脸上时刻带着和煦、云淡风轻的微信。他因为工作缘故经常在各地出差,又喜欢户外运动,所以经常在各地出差的时候就会参与当地的户外活动。别看大哥年纪上去了,可是个十足的老鸟,爬过的山都数不清了,还去冈仁波齐转过山。

然后是 vivi 姐和高兴就好哥,他们是两口子,年纪应该 40 左右把,装备齐全,透着一股子专业劲。高兴哥是退伍军人,平时喜欢摩旅,微信头像就是他摩旅的照片,非常帅。他们其实也去过非常多的地方旅行,但是这是他们第一次进行户外徒步。

最后就是太阳了,也是一个兵哥哥,性格腼腆,后续登山的时候也不爱参与拍照,而且他过来的时候把我们给惊呆了,原因是他居然没有登山包,拿的就是一个白色的大单肩挎包,也没有登山杖,雪爪等等,补给也就带了一盒饼干和一些能量饮料,他说没什么问题,他们当兵时再难的都体验过,我们想着实在不行山上也有的买,就到时候再说
了。

登山

自贡出发到峨眉山只有 150 多公里,全程都是高速,一个多小时就能到,一路上阳光万里,倒也不觉得累,不多时就到了报国寺,还没进停车场就一大堆大爷大妈上来给我引导停车,一个劲的给我往另外一个山坡上引,估摸是当地的村民拉收入呢,我最后还是停在了报国寺的官方停车位上,贵了 5 元一天,停车场管理员还给我们送了一个红色的祈福带。

然后就是下车收整行李,因为没有住宿,其实大家带的东西都不多,唯一多的是这次在山上吃火锅需要用到的东西,一套一次性铝锅盒燃料,然后两大包食材,霜怕山上海拔高煮不熟,把牛羊肉、丸子都提前煮好了,上山后烫一烫便能开吃,我包里放了面饼,丸子、肉给经验、体力更好的成歌大哥,一次性铝锅给了高兴哥,我老婆则背上了香菜、蒜沫等配料。

然后我们便迎着 3 点的斜阳出发了。

传过停车场便来到一处广场,右侧是报国寺,我们在入口处拍了一个出发视频。

之后要步行 30 多分钟后到达雷音寺才算是正式开始爬山之行。

不过不要高兴太早,目前我们连检票处都还没到呢,接下来的十几个小时将会是无尽的楼梯与我们相伴,期间还会经过猴区、高山区。

现在有多兴奋,之后就会有多狼狈。

遇到的第一个红牛墙。

不知道是不是感冒刚好,还是因为冲锋衣没到,我穿的羽绒服散热不好的原因,体力消耗的非常快,才走了一个多小时就感觉自己被掏空了,只感觉浑身都是汗水,脚也重的抬不起来。

接近 5 点时到达圣水阁

山民搭建的原始蜂箱

到达清音阁,这边是一个分叉路口,分上行和右行两条路,上行是去往九十九道拐方向,另一侧则是去往报国寺方向。

经过猴区,峨眉山的猴子和地痞流氓差不多,会强抢你身上任何有颜色的饮料,塑料袋,零食,经过这里时最好拿衣服罩住你的包。

在这里把直接放在高兴哥背后的一次性铝锅接了过来,用的外套罩住,不然肯定要遭殃,不过因此我也没有余力带着我老婆了,中途被猴子隔开,等了她好久,着实是无奈之举,如果不护着锅,晚上可就没得吃了。

穿的老婆的羽绒背心,狼狈不堪

到达洪春坪,天色已经完全暗下来了,开始需要头灯照明,我也彻底红温了。

开始攀爬让人闻风丧胆的九十九道拐,垂直落差 300 米,迂回 2500 米,约有 1840 余石阶。

路上遇到了一只网红猫,入夜降温,估计它冷的不行,看我坐在椅子上,直接就跳到我身上来取暖。

晚上九点半,开始进入雪线。

到达财神庙门口,我的羽绒服内里已经完全打湿,我索性将衣服反穿,终于没那么闷热了。

霜的表现则完全不像是第一次爬山,一路上健步如飞,如履平地。

路上的其他登山者看到都不由纷纷侧目,不由发出大佬牛逼的惊叹,基本上都是她走到前面后等我爬上去,休息一会后再继续出发,期间为了帮我减重还和我互换了背包,我可是彻底成为了拖后腿的人了。

财神庙门口的阶梯

到财神庙这里我才发现我们的队伍已经分成了三个梯队,小罗、成歌一个梯队,已经远远跑在了前面,我、霜、太阳,我们三个则是第二梯队,后面则是 vivi 姐、高兴哥。

小罗太牛了,上次笔架山之行他们也是第一梯队,紧紧跟着向导,这次又没落下 ,和老驴成歌同步,这时我就不由感叹,年轻真好。

本来我们是打算在财神庙吃火锅的,但是因为我们第二梯队、第三梯队落后第一梯队太远,他们等了我们半个小时我们都还没到,所以他们去了下一个地方等我们。

我们在财神庙休息了半个小时,在出发后终于碰到了 vivi 姐他们,他们为了赶我们,都没在财神庙休息。

我们本来盘算着的是聚在一起后大家吃着火锅跨年,小罗、成歌他们在上面的遇仙寺等我们,我们估摸着还要个半个小时才能到。

但是此时已是夜晚 11 点 58,已经临近跨年,我们和 vivi 姐、高兴哥、太阳和路上爬山的小伙伴们都相继在拐角处停下,大家开始倒计时,等待着阳历新年的第一秒到来。

终于到达遇险寺,小罗、成歌已经等了我们半个多小时,表示这个地方太冷了,可算把我们盼来了。没有废话,直接去寺庙拿了热水,架锅,准备吃火锅。

当火锅底料放入锅内,滚烫的热水浇灌在底料上时,火锅的香味开始慢慢弥漫,寺庙门口的小广场上开始随着山风飘荡起了火锅的香味,接下来是放入牛肉、羊肉、牛肉丸、鱼豆腐、金针菇,把矿物油小炉子放在锅下,点燃后稍热便能吃了。

其他路过的小伙伴都不可思议的看着我们的锅,不少人还跑过来拍照,这一刻我们都感觉背着这么多东西爬山的辛苦都值了,哈哈哈。

最后吃完用火锅汤煮好的泡面后我们便接着出发了,目前已经爬了十多个小时了,还有七八个小时的路程在等着我们。

雪已经挺厚的了。

山上的光污染很弱,能看见不少星星

又一个难关:钻天坡

夜眺峨眉市

山上积雪覆盖的台阶,走多了都自然而然的变成了这种规律的小三角坑。

到达洗象池!这里开始精神、肉体能量已经双双见地,霜也有点顶不住了,说走路都是飘的。不少爬山客选择在洗象池的大厅里眯一会。

接着爬!碰到一个穿短裤的大佬,前面看他从山下往山上跑着登山,这会儿居然已经从金顶下来了了....从金顶....下来了,你敢信??

路过一个休息点,买了一个 10 元的苹果,12 元的八宝粥,18 元的冷量饮料。

这个休息站有火盆,本来想着顺便烘烤一下衣服,哪知道把羽绒服屁股后面的下摆烧坏了...。

眼神已经迷离、恍惚,坐下就想坐化...。

还有多久是每一个休息点老板回答的最多的问题,但是不用问都知道还有很久很久!

到!雷!洞!坪!拉!!!!

我们实在走不动了,选择坐缆车上金顶,雷洞坪到缆车那里工作人员说很近,一会儿就到,但是我们怎么就感觉始终走不到呢?

等索道的人们

在索道上能看到即将日出

大家互相祝贺新年快乐。

烧香祈福

金顶遥望雪山

看日出

专门买了个小旗子拍照

才发现我衣服还是反穿着呢。

勇闯天涯一下

最后再来点情绪照片

  •  

251、小寒

2025年1月5日 18:07

null

跨年时峨眉金顶日出和第一缕阳光
### columns1 Lorem markdownum insigne. Olympo signis Delphis! Retexi Nereius nova develat stringit, frustra Saturnius uteroque inter! Oculis non ritibus Telethusa protulit, sed sed aere valvis inhaesuro Pallas animam: qui quid, ignes. Miseratus fonte Ditis conubia. --shortcode--
### 副标题 Markdown内容。
  •  

用峨眉山的第一缕阳光给25年开个好头【一】

2024年12月27日 12:15

峨眉山官方图片

自上次笔架山之旅后,对山的渴望就像是心底深处的地下泉水被打通了一般狂涌而出。

前几天林老师他们又在群里谋划着去峨眉山夜爬 ,不过不巧的是他们的时间和赶不上,但是又被他们把瘾给钓了起来。

所以想着:「实在不行就我们自己去吧?」

而且又恰逢新年的这个节点,干脆去感受一下新年的第一缕阳光,并且虔诚的去拜拜菩萨,希望能赶走去年的坏运气,新的一年顺顺利利。

所以,有了以下的规划。

目前人员为我,老婆,小罗,目前还在招募队员中。

夜爬峨眉行程规划

两步路助手路线图:2024-02-07 爬峨眉山(报国寺~峨眉山金顶)-GPS导航轨迹下载|行程线路图-步行轨迹-两步路

24 年 12 月 31 日 Day1

  • 下午 1 点左右出发,3 点左右到报国寺
  • 4 点左右开始上山,预计 15 个小时左右,总计 27 公里,3068 米爬升
    • 日出时间为早上 7 点 59,尽量争取在 8 点前到达。

25 年 1 月 1 日 Day2

  • 早上 7-8 点到金顶,烧香拜佛拍照 1 小时。
  • 9 点后坐索道去雷洞坪,缆车大概十来分钟到,然后再走一个小时左右的楼梯到雷洞坪坐车下山,大概 2 小时。
  • 预计 12 点左右到报国寺,大家吃中午饭。
  • 下午 3 小时自由时间,滑雪、温泉
    • 要滑雪的在雷洞坪滑,滑完在时间内到报国寺集合
    • 温泉我选的红珠山森林温泉,价格在下面有提到
  • 结束后 4 点左右出发去乐山找吃的
  • 回家

注意事项

  • 注意高反,要在两三千海拔高强度徒步,死可能死不了,但会无力继续攀爬。
  • 心脏病高血压等疾病别爬,坐车,要听劝!
  • !当天拉肚子、心悸、胸闷、低血糖、头疼...等身体不适的,请直接坐车,一点小问题在山上都会被放大!
  • 要有一定的体力基础,力量、爆发力等身体素质在这没多大用,全靠心肺和肌耐力。马拉松、越野跑、铁三等项目的选手大多没问题,请随意
  • 全程 27 公里左右,爬升约 3390m,下降约 830m,强度大概相当于平地快走 60 公里,请自行斟酌。

准备清单

装备、实物等

  • 速干 T 恤 (千万别穿纯棉,出汗后会很冷)
  • 冲锋衣 (防雨,厚点,最好是可拆卸内胆)
  • 冲锋裤 (防雨)(瑜伽裤鲨鱼裤会冷死)
  • 便携雨衣,建议买好点材料的,不容易坏。
  • 鞋 (轻便、防滑、防水)厚长袜 (不磨脚,两双换)
  • 登山杖:看个人,省力,防膝盖不好的带护膝,如果下雪带冰爪
  • 背包 (中等大小,双肩,专业的最好)
  • 塑料鞋套
  • 雪爪,必须带哈,不要那种建议的,买链式的
  • 能量胶、盐丸、士力架、香蕉、橘子等高热量食物
  • 保温杯(不结冰)、软水袋 (轻,很多地方可补水)
  • 身份证、手机
  • 电筒 (或头灯),这个最好都备个头灯,夜晚山上黑。
  • 充电宝 (路上拍摄多的话)
  • 如果要泡温泉的话要带泳衣。

门票

  • 峨眉山门票 108¥
  • 金顶索道单程票,20¥
  • 交通票,山脚至雷洞坪的往返观光车票 45¥
  • 温泉票,我买的峨眉山红珠山森林温泉,在报国寺附近,单人 136.3,双人 267,三人票 398.8,想去温泉的可以互相拼一下票,更划算。
  • 滑雪场在雷洞坪,上午场 116.5 一小时,232 两小时,含雪具。

户外保险

  • 自行上淘宝、jd 购买户外保险,保额 20w,大概 5 元一天。
  •  

24、冬至

2024年12月22日 09:55

null

一候蚯蚓结;二候麋角解;三候水泉动

四川自贡冬至的习俗为食服滋补药食。

冬季自古以来就是滋补季节,更有俗语「冬季进补,来年打虎」之说法,寒冷冬季食用大补药膳却不必担心过补上火的问题。

通过搭配不同滋补功效的药材,辅以猪脚、鸡鸭、猪肚等食材小火慢慢炖煮,晚餐十分,全家人齐聚餐桌前,一人一个小碗乘上热气腾腾的汤汁,真是好不惬意。

  •  

DIY明信片互换计划

2024年12月19日 12:38

null

前些天收到了 品味苏州 小伙伴发来的明信片,非常欣喜。

在现在网络发达、信息快餐化的时代,能有一封经过漫长里程、时间送到你手上的信件,会更能体会到时间的味道。

因为我刚好有一台彩色打印机,每次出去玩了以后会习惯性把出行的照片精选一些打印出来放到相册里。这次在打印时我就在想:「既然我有打印机,那我能不能每次出去玩了以后自己做一些明信片寄给这些好友呢?」

打印的相片

所以昨天试着找了九张此次出行的照片,并调色打印,设计了一版,附上了临时想到的标语「现在网络太快,所以跨越千山而来的信件更值得我们等待和珍惜...」。

感觉效果好像还不错?

明信片背面

从左至右,从上到下,分别为1至9

所以,我也准备开启一个明信片互换计划。

各位小伙伴可以可以直接留言你的收件信息,并说明你要的图片序号,我会在看到你的留言后给你寄出。

我的博客已经开启审核模式,你们发出的信息不会直接公开展示,不用担心自己的信息泄露,我会在删掉你们的收件信息后通过留言审核,我会认真根据我对你的了解和想法填写后面给你的留言,祝好。

我需要第6张照片。
收件信息:
- 姓名:1900
- 地址:四川自贡xxxxxxxx
- 邮编:643000

另外;

家里没有打印机,也想自己做这种明信片的朋友,可以试着在淘宝、PDD找找代打服务,价格非常便宜,有众多模板可以选择,只需要简单把照片发给商家即可。

不知道能否号召大家一起参与这个活动,把自己的快乐,所看到的风景,想说的话传达给远在千里之外的另一个人。

谢谢。

  •  

川西笔架山,冬季雪山登山实操

2024年12月19日 12:17

null

前言

因为经常有看到阿均哥在周末时间出去爬山,很是羡慕。

我其实也是非常喜欢户外运动的人,2014 年和朋友去过一次牛背山,2015 年去过一次阿合哈洛,其实这种集体户外出行有不少好处:

  • 一是每次出行都是十来号人,一车形形色色的人在一起,在旅途中互相帮助、认识、了解、解放自我,总是能擦出不一样的火花,也能将平时积累的压力在旅途过程中完全释放出去。
  • 二是因为人多,旅途中产生的各种费用都大大降低了。

所以也想着自己能不能也经常这样出去玩一玩。

2014年牛背山徒步

2015年啊合哈洛徒步

驴友群

所以向他询问了都是通过什么渠道找的出行队伍,后被告知是加入了当地的一些户外微信群,跟着群里的其他人一起出行的。

在那之后偶然在骑行群里看到其他骑友说周末要跟着户外群里的人去爬山,所以顺嘴说了一下,让对方拉我进群,然后一下就像是打开了潘多拉墨盒,东拉西拉的进了三四个户外群里,这才知道原来我们这个小地方也有这么多活跃分子,几乎每周都有组团出去玩的驴友。

这些驴友群的组员出行规则几乎都是统一的

  • 出车的司机不承担邮费、过路费
  • 提前买好户外保险,一般在 20w 保额的在 5 元一天左右
  • 其他公共费用大家 AA。
  • 各自承担自己的风险。

因为行程有长有短,蹲了一两天后才加入了标题中提到的「笔架山冬季登山」活动。

笔架山冬季登山

景点介绍

笔架山位于四川理县,木卡羌寨前行 10 来公里左右,总徒步距离来回 14.47 公里,预计花费时间 5-6 小时左右,总爬升 1343 米,最高海拔 3766 米。上山后积雪覆盖,几乎没有路,可以说是一条完全的野生线路,有一名当地向导带路。

笔架山徒步路线图

人员

本次出行原本是 10 人,后有两人临时有事放弃,最终 8 人出行,两对情侣,另外 2 男、2 女。平均年龄没超过 35 岁。

行程安排

  • 第一天:星期六中午一点左右出发,司机来接的我们,开车 4 个小时左右到达理县,下高速后走 8 公里盘山公路,到达第一晚露营地「坞瓦布露营地」,晚上就着日落吃烤鸡烤兔 + 铁板烧烤,然后围着篝火唱歌喝酒。
  • 第二天:早上 8 点起床,客栈安排了当地的手工面 + 煎鸡蛋,吃完后 9 点左右出发爬山,整个行程走完下午 6 点左右回到露营地,吃完牦牛火锅后返程回家,最后 11 点 30 到家。

费用

  • 油费 + 过路费 380
  • 住宿 + 餐饮 492 两人
  • 合计 380+492=872

装备

冬季登山危险系数不比平日 ,所以装备一定要带齐全。我这次爬山除了没带登山杖,其他装备基本上都准备没有问题。

  • 贴身穿速干衣物:上衣可以是跑步的速干衣,下面穿速干骑行裤或者瑜伽裤,因为在登山过程中会大量出汗,普通棉质保暖衣可能无法快速排汗,会导致失温。
  • 保暖内衣两套:一套穿在速干衣物上面,另外一套备用。
  • 冲锋衣三件套:没有的话穿耐磨的羽绒服之类的也行。但是一定要是防水面料,避免粘上积雪,溶化后把里衣打湿。
  • 毛线帽:主要是要护住耳朵,在穿林时最好把冲锋衣帽子带上,避免落下的积雪掉进衣领。
  • 手套:这个一定要准备一款好一点的防水手套,进雪水后的冰凉感你一定不会想体验的。
  • 袜子:厚一点的长筒羊毛袜,多备几双,方便意外替换。
  • 雪套:这个一定要备,山上积雪厚的话没有雪套你的鞋几分钟就湿透了,冰冷的脚会加速失温。
  • 冰爪:雪地必备,增加摩擦力,避免打滑,这次我是在半山出现落叶堆积腐烂打滑后开始装备上,瞬间就不打滑了,下山时也能避免脚滑跌倒,非常好用。
  • 登山鞋:高帮登山鞋最好,可以保护脚踝,更保暖,也不容易进雪水。
  • 墨镜:雪地里反光容易雪盲,必备,其实骑行那种防风镜要更好一些,不容易掉,而且保护的更周全。
  • 登山杖:最好两根,质量一定要好,折叠优先,实在没有也可以在山上砍截树枝替代,我这次没带,用的树枝,也没啥问题,下山的时候别用,容易打滑戳伤自己。
  • 防晒:山上紫外线强,做好皮肤保护。
  • 登山包:最好是有背负、透气系统的背包,耐磨系数要高。
  • 热水壶、水袋:在雪地里喝一口热水是真的舒服。
  • 零食:在登山途中补充热量,体力。
  • 保鲜袋、塑料袋:可以多带几个保鲜袋,一是装垃圾,二是万一鞋子湿了也能套脚,作用很多,我的每次出门旅行都会带上七八个这玩意儿。

旅行后记

这次的行程其实终点的风景、餐食、住宿都算不上很好。

但是雪林穿越的体验是非常棒的,总共 1300 多米的爬升,而且后半段全是雪路,因为积雪覆盖,基本上已经看不到原来的路线了,我们一路在雪林里穿梭,都是现场开辟的路线,很多地方都要手脚共用才能爬上去,非常有挑战和刺激感。

而且这次出行认识了不少谈的来的本地朋友,如我们车的司机林老师、本地大学里的一对情侣小罗和小刘,出发和返程在车上的时间大家唠嗑渡过,一点也不觉得无聊和犯困。

不过这次行程难度对于我老婆来说挺大的。

因为之前她是不准备爬山的,而且她也没有户外经验,算是个小白,不过出行前我还是把她的雪套、雪爪一起带上了,怕万一需要上山。哪知道还真用上了,出发后当时另外一个也说在营地休息的人放鸽子没来了,现在只有她一个人在营地,挺没意思,索性就跟着我们一起上山了。

不过毕竟是小白,而且以前也没搞过户外,所以装备准备的不是很充分,没有冲锋衣裤,裤子这次就穿的普通牛仔裤,爬山途中遇到那些容易滑倒的地方都害怕的要命,都是屁股划着雪地走的,后半段的时候裤子有些地方就已经湿透了。

所以最后登顶的那一刻忽然就绷不住了,哭的稀里哗啦,她说就我们两个人在后面吊车尾,前面的人都走的很快,看不到了人,害怕的很,而且身上又冷,经常滑倒会觉得万一我们一不小心就滑到山下去,没准就死在山上。

在我看来其实整条线路都是在树林里,基本上没有悬崖峭壁的情况,即便是滑倒了也能很快抓住旁边的树枝,而且坡度都不是很大,风险是有,但是在我看来并不危险。

不过她在下山后回味起来又觉得特别有成就感,感觉好像瘾一下就起来了,还问我下次准备去哪里,哈哈。

图记

途中和小伙伴们

营地和住宿

日出

营地中

烧烤小啤酒+篝火晚会

上山中

集体照

「工人们」

山腰+自拍

雪路

望雪
屁股蹲
登顶,绷不住了,hhh

缓缓后美美自拍

集体照
下山
山脚
已经筋疲力尽,头顶的雪和树枝暗暗体现了狼狈
  •  

我VPS上的Selfhost服务

2024年12月7日 11:20

Photo by Rubaitul Azad / Unsplash

以前刚玩博客的时候用的 Wordpress 作为博客系统,基本上都搭建在一些互联网的公益服务上,如今还记得就是 wpoak 这个平台,不过这些服务难抵时间漫长,大多因为成本问题关门大吉了。

所以之后开始自己买 VPS 进行博客程序部署,也开始慢慢重视起数据的重要性和自我保有。

刚开始 VPS 还是玩的非常简单,实例化完成后便用 lnmp 等程序一键装好 PHP 环境,然后下载上传 WordPress 安装程序便算完事了,后来接触的多了才知道 VPS 能做的事情元远不止于此。

后来我开始接触到 Docker,然后研究各种 Selfhost 的应用、服务。

昨天在夜未央的「浪费」一文中评论到:「对于很多普通用户来说基本上没有什么选择了,我们是喜欢折腾和了解,知道有什么渠道去找平替」。而后又在 Dayu 的「目前使用的自托管服务」一文中看到了他分享的 Selfhost 清单,所以这里索性也做一次分享,希望也能让更多的人用到这些开源、可控、好用的服务,利用起自己 VPS 上多余的算力资源。

我目前的 VPS 只有一个国内的腾讯轻量云。

配置为 2C2G4M,一年费用大概在 100 元左右,目前购买了 3 年,自托管的服务如下:

Ghost

这是我目前使用的博客后端,Ghost 在国内算是非常小众的博客程序了。

我大概在 16 年开始使用 Ghost 作为博客系统,当时服务部署在百度的 BAE 平台上,「在百度开放云BAE上部署GHOST博客并配置七牛云」,后因服务不能在继续免费白嫖几经搬家,后落到现在的 VPS 上。

可以使用 Docker 或者 Ghost 官方的 CLI 程序安装。在以前的老版本时,数据库支持 SQLite,后来几经更新,现在在正式环境中只能使用 MySQL。

Artalk-Go

在早期时 Ghost 并没有提供评论功能,虽然在后续的迭代中增加了评论功能,但是在我看来不太友好,而且因为评论需要用户登录,其他使用 Ghost 评论功能的小伙伴反应,在迁移过程中需要额外进行会员数据、评论数据处理,所以我一直没有使用。

所以我最开始使用的自部署评论程序是 Twikoo ,但是因为这个项目更新在很长一段时间内停滞,且管理面板、功能过于简陋,几经尝试后换到了 Artalk。

Artalk 是国内大学生大佬开发的一款 Disqus 的第三方评论平替程序,开源,自部署,且功能十分丰富,更新也非常勤快,个人认为是一款非常完善的评论程序。

可以用 Docker 部署。

MySQL

这个不用多说,声名远播的开源数据库,因为 Ghost 和后面其他的一些程序需要用到。

可 Docker 部署。

  • 推荐程度:🌟🌟🌟🌟
  • 部署方式:Docker
  • 是否开源:是
  • 项目地址:MySQL

Vaultwarden

密码管理器我以前使用的是 LastPass 这个免费服务,但是在使用过程中频繁出现网络问题无法使用,而且管理面板没有中文,且某一次还出现了安全漏洞的问题,自那后我就切换到了 Bitwarden,在 PC 上通过浏览器拓展可以快速进行当前网站的密码填充。

但是因为想用密码泄露检测等服务,不过这些功能在官方的 Bitwarden 上都是需要付费使用,所以我开始使用了国外大佬基于 Bitwarden API 重新实现的开源密码管理程序 Vaultwarden,Bitwarden 中一些需要付费使用的服务在 Vaultwarden 上都能免费使用,搭配第三方的安卓端 Keyguard ,可以说颜值与实力并存。

密码管理器我是非常推荐每一个没用过的人使用的。

因为一些第三方网站管理员自身水平良莠不齐,可能会因为服务漏洞导致数据库泄露,此时如果你将常用密码用在注册这些网站上,届时你的其他重要服务被撞库暴力破解的风险将大大提升。

但是如果你使用密码管理器的随机高强度密码,只要在主密码没有泄露的情况下密码的情况下,即便数据库泄露了也不用担心被破解的风险,且因为在注册时使用的随机密码,即便第三方服务的数据库被泄露也不用担心被撞库。

Alist

Alist 是一个非常好用的网盘管理程序,因为太好用、用的人太多了,导致国内一些网盘实在承受不住,甚至不顾脸面将以前承诺的一些服务重新二次收费——没错,说的就是你「阿里网盘」。

Alist 可以在一个程序内管理你的大部分网盘服务,将他们集成在一起统一管理,并且通过 Alist 的一些拓展实现诸如公开分享、WebDav 等等,但是因为用的人实在太多了,而且很多影视程序也跟着上来薅羊毛,把网盘做成资源服务开放给其他人使用,导致这些情况的发生。

但是,即便这样,Alist 也依旧是一款非常好用的网盘管理程序。

Memos

Memos 是个非常好的 Flomo 平替工具,可以方便的进行卡片笔记记录,甚至你可以拿他当作微博、微博客来用也没什么问题,而且作者更新也非常勤快。

但是开发者时常进行 Break Change,我碰到的就有不下三次,导致我实在不敢继续再升级了,在某一次回退后彻底停留在目前使用的 v0.18.1 版本,好在那时的功能已经非常完善,即便不升级也不影响软件的后续使用。

Umami

google 统计的平替服务,之前部署在 Raliway 上,但是因为平台收费政策调整,只给 5 刀的免费额度,导致有一次超出额度,多交了 30 多元的费用后转移到 VPS 上部署。

GoToSocial

一款用 Go 写的联邦宇宙实例工具,长毛象的超小型替代,但是我没有玩的太明白,使用过程中出现很多莫名奇妙的问题,暂时放弃。

miniFlux

一款开源的 RSS 阅读器,简单好用,没有多余的花哨功能。

lx-music-sync

洛雪音乐的同步服务,可以在手机、PC 端之间同步历史记录、收藏等等。

wewe-rss

国内大佬开发的一款微信公众号转 RSS 订阅工具。

Express

我用 Docker 部署了一个 Express 服务,用于博客上一些需要后端的小功能,如点赞、PC 状态同步等。

WatchTower

Docker 镜像更新服务,通过维护一个需要自动更新的 Docker 容器名称列表,实现对对应容器镜像的自动更新。

  •  

22、小雪

2024年11月22日 13:42

null

一候虹藏不见;二候天气上升地气下降;三候闭塞而成冬
  •  
❌