普通视图

发现新文章,点击刷新页面。
昨天以前空白Koobai

罢免小区业委会

2025年1月8日 14:05
罢免小区业委会

自己小区业委会成立时间是 2020 年,到今年 2025 年 9 月份这届到期。过往几年大家似乎也不关注这些,整体把小区品质搞上去就行。但从周六开始,业主就开始集结起来,要求罢免业委会,警察来了一次又一次,以防发生不愉快事件。

事件的导火索,从小区几个大门口装了两道车辆道闸说起。也就是进入小区需要通过两道道闸,业主质疑为什么要装两道道闸,本身平常就堵了,你这么一搞不是更堵了,而且只是一个小区而已,为什么搞得跟什么机关重地一样,放眼全国应该也没什么小区这么搞。物业开始的答复是:

“按照道闸改造设计的方案明细:增加一道前置道闸是为了服务于车满禁入的功能。当地面车位有空位的时候,前后两道道闸是同时开启的,不需要车子两次停车等待道闸开启;当地面车位已满,则想要停地面的车子在前置道闸就会被识别提醒,然后在门岗前面掉头出去,无法通过第二道道闸进入小区。如果只有一道道闸,车辆无法掉头,还会影响有地下车位的业主车无法进入。”

这答复,似乎解决了什么,但稍微动点脑子,就是扯淡。里面车位满了,一个道闸不放行就行,你做得好点再放个提示版。车子该怎么调头就怎么调头。跟你设置几道道闸有啥关系。如果真想搞事情的车辆,你设置十道道闸也没用呀,人家车子往那一停,人走掉,其他车子无法进入还是无法进入呀。

到这里,业主也只是有意见,但也没怎么样,只是私下大家吐吐槽。事情的转变,是业委会开会的时候,有几个业主去旁听,然后提出意见,被其中一个业委会的人,拍桌子把这个女业主说哭了,这个视频传到各个业主群。这下大家不干了,周六开始业主们开始集结起来,把业委会的问题一条一条罗列出来:

  1. 2024年1月-11月,开支650万,其中冲账资金431.9万。
  2. 小区道闸系统升级,花费88万,出现了大门口双道闸的笑话。
  3. 2022年外墙维修88.7万,2023年外墙维修28.7万,为什么不从维修基金里出?招投标了吗?明细在哪?
  4. 几十万的泊位费提成支出,原因什么?
  5. 各种酒水开支原因是什么?
  6. 监控改造,花费75万。
  7. 原计划2024年给业主分红90.14万,莫名其妙被挪用。
  8. 2024年10月份,进行消防主机整改项目维修工程招标,涉及资金400 万元。因为这届业委会9月份到期,是要在这届到任之前用干净的意思。

我们业主要求,立马启动罢免程序,冻结账户,之后该重新审计的再重新审计。周六周日就跟街道社区谈,一直持续到周日晚凌晨 2 点多,目前已经达成:停止付款,所有银行付款都需要经过街道审核;所有之前的账目资料已由业主封存,统一放到街道,方便以后审计。社区周一开始针对大家的签字电话核实,超 20% 业主同意,就启动临时召开业主大会。之后重新计票,超 50% 的业务同意,就可罢免业委会。似乎要达成这一要求,前面的路困难重重。

不作死就不死呀,其实你这搞点钱那搞点钱,正常,大家也不会去查,你把服务做好就行。但吃相太难看,就过了。账这个东西是经不起查,特别又是一群业余的人在搞。最后说不定还得送进去几个。大家在维权的时候,业委会的人也不出面,第一天来了一个主任,第二天来了一个副主任,这个人还带来了十几个保安(不是本小区的)来,还想把事先业主封存的账目抢走。其中还混入说是供应商的人来要账的。估计也是假供应商,故意来搞事情。这时候业主集结起来的人更多了。

作为这次事件参与其中吃瓜的一份子,最大的感受就是各个 BuMen 的不作为。辛苦奋战在最前头的业主们。

至于说这届业委会成员是怎么选出来的,我记得当时要成立的时候,物业就拿几个人的名字让你选,但这人是谁,都不认识,所以自己是谁也没选,弃票。据有的业主说,也没选,但后面查结果的时候,有她的票,至于为什么,各自想象。

从 iOS 更换到 Android 会有不适吗?

2024年9月19日 21:15
从 iOS 更换到 Android 会有不适吗?

还有几个小时就是 iPhone 16 系列正式发售的日子,看评测说提升最大的是拍摄视频又拉开 Android 机一个台阶。既然自己不买,那就来聊聊自己从 iOS 更换到 Android 的体验。以自己日常使用场景,先说结论:98% 没什么不适的,剩余的 1% 在于通知的延迟、1% 裸机下容易边缘误触。

从 iPhone 6 开始加入 iOS 阵营,随着每年的迭代跟随更新,一直到 iPhone 11 系列。为什么 11 之后没跟随脚步,一是硬件所带来的惊喜感在降低,二是 iOS 早已过了新鲜劲,每年都感觉没变化。最重要的一点就是——没钱了。于是在 11 Pro Max 使用到今年第五个年头,7 月底更换了小米 14 Ultra,到此刻为止,体验 Android 一个多月时间了。

早听说国内 Android 魔改版本,系统广告及内置第三方软件非常多,还好旗舰机都可以关掉或卸载,只是需要你花点时间搜索下都存在哪些角落,然后关闭。不像 iOS 干净清爽。

交互层面,两个系统现在越来越趋同。常用的软件,不管是界面还是交互,更是没区别,所以上手没难度,无缝衔接。由于之前 11 是 60 赫兹刷新率,换到 120 赫兹的 14,这顺滑度,用了就回不去了,尽管 iOS 的动效再怎么丝滑,但硬件上的瓶颈,没办法。 中秋 小米魔改的 Android 用的爽的几个地方:

  1. 骚扰电话小爱自动接听,这功能实在太爽了。就在今天下午,小爱跟一个推销的有来有回聊了 5 分多钟,看记录实在是好玩。再也不用操心每天那么多的骚扰电话了,iOS 就是一傻逼。
  2. 开屏广告无障碍跳过,通过安装第三方软件( GKD)实现。再也不用忍受不小心扭动了一下手机就自动打开广告了,哪个傻逼产品经理想出来的,垃圾。
  3. 应用双开,没办法,工作上的需要。
  4. 其他爽的点,如通话录音、快递推送、行程推送等等,这些都是本地化的特点,爽。

用的不爽的点,主要就是一开头写的两点:

  1. 由于自己现在做电商业务,所以对于电商平台的管理软件,实时推送是刚需,不然可能会错过一些重要推送而损失订单或回复不及时而扣分罚款之类的。不知道是自己设置问题还是本身 Android 的问题,老是出现推送延迟。搞得我现在必须带着手环才行(手环推送相对实时很多)。
    既然说到做电商业务,看到这的朋友,可以去逛逛,有需求就支持一波: 骑时这样
  2. 我是一个坚定的裸机党,这次买的摄影套装的壳用了几天也不用了。更别说手机买回来第一件事就是把屏幕膜撕掉。但没有壳之后,很容易误触边缘,譬如你看视频看得好好的,手稍微动一下,页面就给我跳转掉了。。。头疼。

至于其他的,个人使用场景,iOS / Android 使用起来没啥区别,两个系统交互也越来越融合。不过如果从生态的角度上看,那就看自己绑定有多深了,之前会认为自己绑定得非常深,更换很麻烦。因为电脑、平板、手表、耳机、手表都是苹果的。但发现换了 Android 之后,也没觉得怎么样。如文字手机中复制,电脑黏贴。微信输入法也可以做到。图片视频隔空投送,装第三方软件 LocalSend也能实现,虽然稍微麻烦点,毕竟需要打开它,但速度快。云服务,自己有家庭 NAS。手表/耳机,这就没办法了,想更好的体验,只能替换。总的来说,对自己影响不大。

使用了万年不变的 iOS 内置拍照滤镜,小米 14 Ultra 有了徕卡加持,拍照效果很满意~~

五一假期之登高望远

2024年5月2日 19:21
五一假期之登高望远

上次爬山还是 2021 年初,即使家门口就有个临平山公园,开发得也非常好,但一直也没想着要去再爬一次。也许跟小时候就是在山沟沟里长大有关,砍柴要上山、放牛要上山、干一些农活也要上山,所以对山已经免疫了,提不起什么兴趣。如果是说去看海,那分分钟钟立马得去。

为什么今天想着要去爬一次?五一外面人太多,不适合外出太远;找个地方骑行,闺女不想骑;最近脑子里不知道为什么,老是冒着说要去爬次山,于是就决定今天。虽然老婆还是不大愿意,因为她每天上班期间都要走不少路,不想再走了,但还是买上了在山顶我们要野炊的 KFC 。一家人出发~~

到了山顶,发现比记忆中路途更短,手表显示高度 170 米。也许前几次爬的时候,闺女还很小,走得慢,时不时还得背背,现在走得比我俩都快。想想时间是真快,一晃都十周岁了。

20240502_5 20240502_6

户外吃东西就是爽,比在家吃感觉更香。不过过程发生一个插曲,有个小孩过来一直盯着我们看,家长过来拉都拉不走,说我也要吃,拉走了又过来。怎么说呢,如果是弱势群体,没什么说的,我们也会分享,但感觉更多的是没礼貌,影响心情。

吃饱准备下山,闺女说,上洗手间的时候,听到人家说坐一次游览车十块钱,这明显的暗示。算了,反正她妈膝盖也不是很好,就让娘两去坐车吧,自己一个人继续悠哉的步行下山~

这次爬山有什么不同?只有感叹孩子成长太快了,另外满足了爬山的想法,至于其他的,嗯。。。只要一家人在一起,干什么事情都可以。

20240502_2 20240502_4

以后如果小米做汽车了,也可以买小米汽车

2024年3月30日 17:15
以后如果小米做汽车了,也可以买小米汽车

28 号晚,本来计划在屏幕前看看小米汽车发布会,但忘记了,想起来的时候已经是 20:30 分左右,算了,不如继续骑车来得爽。几小时后,刷微博见铺天盖地的小米汽车新闻跟售价,想起来 2019 年说的一句话:“以后如果小米做汽车了,也可以买小米汽车”。

当时说这句话的情景是,老婆带我看完车位,走在路上,聊起:
我说:本来我想先换车的,理想 NEO 不错。
老婆说:先买车位,车子是消耗品,什么时候换都可以,以后有更新更好的。有了车位,装充电桩也方便。
我沉默片刻说:行,我们家的智能设备都是小米系的,以后如果小米做汽车了,也可以买小米汽车。

几年过去,小米汽车真的上市了,我买吗或者说现在有能力买吗?先从 2022 年又摇中一个汽车指标开始,指标 1 年有效期,到了临近期限放弃了指标。车位当时买来 16 万,本打算今年初卖掉缓解下经济压力,但目前也只能卖 10 万左右,有可能更低,而且还没人要。所以,答案显而易见,目前没能力买。看不看发布会似乎也显得无所谓。

现在开的是 2015 年 1 月份买的起亚 k3,虽然连中控屏幕都没有(当时想去汽车城换一个,但 ui 界面实在是太难看),但这些年兢兢业业一直陪伴左右,没给掉链子,希望今后的日子继续兢兢业业的。当时买车的原因是,一直想拥有一辆车。但手上没啥钱,还是老婆决定说,想要就去买。她跟同事借了信用卡,再加上一点自己的钱,我们付了首付开回家。

自从国内新能源开始逐步崛起,自己又是喜欢捣鼓智能,所以想着换辆智能汽,但 2019 年之后,自己的工作问题,事与愿违。从自己使用角度看,按照现在汽车迭代的速度,只能安慰说等等党永远是胜利的。但从行业出发,对于自己来说,错过了这波汽车智能的发展。

题外话:发现自己买任何东西都是在最高点的时候,只要当下有能力,在自己的承受范围内,想要就立马必须得到手,宁愿多花钱,也不想多等一刻,所以从不去比较或者看其他渠道是不是可以更便宜。买完之后,再来研究。

自行车给自己带来了什么情绪价值爽点

2024年3月17日 17:18
自行车给自己带来了什么情绪价值爽点

自行车的记忆还是停留在大学里的那辆折叠自行车,没记错的话,应该还是深蓝色的。毕业之后还把它从学校一起带到了杭州,每天上下班骑着。某天锁在出租房楼下,被人剪开锁偷走了。从那之后一直到去年 10 月份就再也没拥有过自行车。

这次的契机借口是平常陪闺女一起骑行,但没想到的是,时间已过去 5 个多月,居然还热忠于折腾与骑行,今天想改装个啥,明天想骑什么路线。似乎自行车给自己带来了不一样的情绪。

改装升级

骑行的公路数不多,但逐渐发现,换个把带颜色、升级对轮组、改个车把、换个坐垫、改个线管线芯、调个前拨后拨等等非常有意思。不是因为换完的结果,而是自己跟着视频先学习,然后电商平台下单回家,再自己动手。随着自己会更换内外胎、会以八字法缠把带、会拆中轴、会更换轮组等等,这过程太有乐趣及满足感了。当然过程会不小心把手搞破皮、也会因为搞不好而苦恼,但最终看到自己动手后的成品,这精神的满足感,恨不得立马去户外骑上一圈。

而这一切自己动手的开端是因为刚买车那会去店里调试,发现当时的技师并不专业,调个前拨都不会。居然还碰到一次因为不熟练,而把我车调坏的(之后给我换了一辆)。想着碰到专业的技师这么难,还不如自己跟着视频学自己来,硬生生的让自己往技师方向一步一步的迈进。得感谢这不靠谱的技师,让自己享受了折腾的乐趣,填补了空虚。

骑行

去哪骑

之前在 二零二三有什么不一样的博文中就提到:“只要天气及时间适合,一家人就骑出家门。感受着外面不一样风景或路边不一样的美食”。确实,现在随着自己把自行车改装成自己更满意的样子,骑行的乐趣越来越浓。要么一个人推出去感受两只菜腿的力量,要么一家三口,骑哪是哪,走走停停,非常惬意舒服的休闲。

会为今天出门骑行发现新路线新风景而高兴,想着下次一定要带娘俩来。也会因为今天菜腿的力量似乎又强一点而满足。每次出门,想着今天应该走什么路线?

当然杭州的骑行路线有很多,最热门的叫什么龙井坡。自己暂时还没什么兴趣,先在家附近晃悠下再说。附近有个骑行佬也比较多的路线,时不时就会碰到一群,有天骑着正爬坡的时候,忽然有个人说:“耶,你跟我一样的把带”,我应该回应:你也是个有品味的人。

结尾

都说中年油腻男人要么成为钓鱼佬,要么折腾键盘、路由器、充电头、NAS、自行车。似乎折腾什么不重要,重要的是折腾这个东西,给自己带来了什么满足。当下有个寄托,喜欢才是最重要。

就跟自己玩博客一样,重要的不是发了几篇博文,而是折腾成自己满意样子的过程所带来的满足感。

正敲这篇博文的时候,中间出门把闲置的轮组卖掉,没想到碰到的买家是自己 B 站频道的一粉丝,正要给女朋友组一辆自行车,世界如此大又如此小。这也是自行车所带来的一种情绪满足。

HUGO 折腾随记之热力图 / 段落导航

2024年2月24日 16:49
HUGO 折腾随记之热力图 / 段落导航

在闲逛各博客的时候,发现有些功能蛮有意思的,于是趁现在还没忙碌起来,跟着抄了下作业,同时通过 AI 的帮忙,优化了下以适应自己页面的风格。

博文热力图

热力图

最开始看到好像是因为 木木老师发了个memos,当时想着自己平常也不怎么更新博文,所以意义不大。这两天又在 椒盐豆豉中看到完整的教程,心想这次页面布局改成很窄的单栏之后,似乎很契合小而美的特性。一顿操作,跟原版的区别在于:

  1. 增加了支持暗黑模式。
  2. 删除了字数统计,及根据字数多少显示色块的深浅。
  3. 简化星期及月份的显示。
  4. 一周的开始,从周日改成周一。
  5. 在 Echarts 官网重新定制了 JS 功能,不然原版的有 1M 多。
<div id="heatmap" style="max-width: 700px;height: 110px;margin-bottom: 40px;"></div>
<script src="https://img.koobai.com/echarts.min.js"></script>
<script type="text/javascript">
  var chartDom = document.getElementById('heatmap');
  var myChart = echarts.init(chartDom);
  window.onresize = function() {
      myChart.resize();
  };
  var option;
  var dataMap = new Map();
  {{ range ((where .Site.RegularPages "Type" "posts")) }}
    var key = {{ .Date.Format "2006-01-02" }};
    var value = dataMap.get(key);
    var link = {{ .RelPermalink}};
    var title = {{ .Title }};
    
    // multiple posts in same day
    if (value == null) {
      dataMap.set(key, [{link, title}]);
    } else {
      value.push({link, title});
    }
  {{- end -}}

  var data = [];
  for (const [key, value] of dataMap.entries()) {
    data.push([key, value.length]);
  }

  var startDate = new Date();
  var year_Mill = startDate.setFullYear((startDate.getFullYear() - 1));
  var startDate = +new Date(year_Mill);
  var endDate = +new Date();

  startDate = echarts.format.formatTime('yyyy-MM-dd', startDate);
  endDate = echarts.format.formatTime('yyyy-MM-dd', endDate);
  
  // 检测浏览器主题模式并选择颜色方案
  var prefersDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;

  // 定义明亮模式下的颜色方案
  var lightTheme = {
      backgroundColor: '#FFFFFF',
      fangkuaicolor:'#F4F4F4',
      gaoliangcolor: ['#ffd0b6'],
      riqiColor: '#999',
      textbrcolor: '#FFF',
      xiankuangcolor:'rgba(0, 0, 0, 0.0)',
  };

  // 定义暗黑模式下的颜色方案
  var darkTheme = {
      backgroundColor: '#1A1718',
      fangkuaicolor:'#282325',
      gaoliangcolor: ['#b25f2f'],
      riqiColor: '#666',
      textbrcolor: '#332D2F',
      xiankuangcolor:'rgba(0, 0, 0, 0.0)',
  };

  // 根据浏览器主题模式选择当前主题
  var currentTheme = prefersDarkMode ? darkTheme : lightTheme;

  option = {
    tooltip: {
    hideDelay: 1000,
    enterable: true,
    backgroundColor: currentTheme.textbrcolor,
    borderWidth: 0, // 边框宽度为0
    formatter: function (p) {
        const date = p.data[0];
        const posts = dataMap.get(date);
        var content = `<span style="font-size: 0.75rem;font-family: var(--font-family-code);">${date}</span>`;
        for (const [i, post] of posts.entries()) {
            content += "<br>";          
            var link = post.link;
            var title = post.title;
            content += `<a href="${link}" target="_blank">${title}</a>` + '<br>';
        }
        return content;
        }
    },
    visualMap: {
        show: false,
        inRange: {   
          color: currentTheme.gaoliangcolor
        },
    },
    calendar: {
        left: 20,
        top:20,
        bottom:0,
        right: 0,
        cellSize: ['auto', 13],
        range: [startDate, endDate],
        itemStyle: {
            color: currentTheme.fangkuaicolor,
            borderWidth: 3.5,
            borderColor: currentTheme.backgroundColor, 
        },
        yearLabel: { show: false },
        monthLabel: { 
        nameMap: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],
        textStyle: {
            color: currentTheme.riqiColor,
        }
    },
        dayLabel: {
            firstDay: 1,
            nameMap: ['日', '一', '', '三', '', '五', ''],
            textStyle: {
                color: currentTheme.riqiColor
            }
        },
        splitLine: {
            lineStyle: {
                color: currentTheme.xiankuangcolor,
            }
        }
    },
    series: {
        type: 'heatmap',
        coordinateSystem: 'calendar',
        data: data,
    }
  };
  
  myChart.setOption(option);
  myChart.on('click', function(params) {
    if (params.componentType === 'series') {
      // open the first post on the day
      const post = dataMap.get(params.data[0])[0];
      const link = window.location.origin + post.link;
      window.open(link, '_blank').focus();
    }
});
</script>

详情页段落目录导航

段落导航

这个功能早在去年重新折腾博客的时候就想增加,但当时因为不大会,搞得都不完美,所以也就不了了之。这几天在 atpX中,看到文章目录滚动高亮教程,于是又试着折腾了下。经过跟 AI 的配合,完美显示,不过过程还是碰到问题:

1. 显示位置

如果直接使用 position: fixed; 特性,目录位置只会根据浏览器窗口的大小来改变。这就会导致,浏览器窗口很大,主内容跟目录就会分得很开;浏览器窗口小,主内容跟目录有可能就会重叠。尝试了各种解决方法之后,决定在最上层的父元素中使用display: flex;。然后在目录的上一级再加入一个父元素div,完美解决。

<div class="single-nrong">
<div class="single-zw">主内容</div>
<div>
    <div class="paragraph-dh">文章段落目录导航</div>
</div>
</div>
<style>
.single-nrong {display: flex;}
.single-zw {width: 100%;}
.paragraph-dh {position: fixed;}
</style>

2. 无目录导航

 文章页如果没有目录导航,也会显示内容标题,这就看着很奇怪了。解决方法:  

  {{ $toc := .TableOfContents }}
  <!--判断<li>标签中有没有内容,如果有内容就显示,无内容就隐藏-->
  {{ if findRE "<li>" $toc 1 }} 
    <div class="paragraph-dh">
      <div class="sidebar-biaot">文章段落导航</div>
      {{ $toc }}
    </div>
  {{ end }}

3. 完整方案

特性:1. 默认隐藏,滑动到一定距离显示。2. 滑动到页面上方 1/4 处高亮显示当前目录。3. 点击目录导航平滑滚动到对应的标题。4. 无目录导航的文章页不显示。

  1. 新建 js 文件,如 single.js。
document.addEventListener("DOMContentLoaded", () => {
    const postTOC = document.querySelector('.paragraph-dh');

    const headingObserver = new IntersectionObserver(headings => {
        headings.forEach(({ target, isIntersecting }) => {
            const link = postTOC.querySelector(`a[href="#${target.id}"]`);
            if (isIntersecting && link) {
                postTOC.querySelectorAll('a').forEach(a => a.classList.remove('active'));
                link.classList.add('active');
            }
        });
    }, { rootMargin: '0px 0px -75%' });

    document.querySelectorAll('.content h2[id], .content h3[id]').forEach(heading => headingObserver.observe(heading));

    window.addEventListener('scroll', () => postTOC.style.opacity = (window.pageYOffset > 400) ? 1 : 0);

    postTOC.addEventListener('click', (e) => {
        e.preventDefault();
        const targetElement = document.getElementById(e.target.getAttribute('href').substring(1));
        if (targetElement) targetElement.scrollIntoView({ behavior: 'smooth' });
    });
});
  1. 在 single.html 文件合适的位置中添加:
<div class="single-nrong">
<div class="single-zw">
   文章内容
</div>
<div>
  {{ $toc := .TableOfContents }}
  {{ if findRE "<li>" $toc 1 }}
    <div class="paragraph-dh">
      <div class="sidebar-biaot">文章段落导航</div>
      {{ $toc }}
    </div>
  {{ end }}
</div>
</div>
<script src="/js/single.js"></script>
  1. 在 css 文件中添加:
.single-nrong{
  display: flex;
}
.single-zw{
  width: 100%;
}
.paragraph-dh {
   display: none;
  @include breakpoint('large') {
    display: block;
    position: fixed;
    opacity: 0;
    top: 70px;
    margin-left: 40px;
    transition: opacity 0.5s ease; 
    border-left: 4px solid #f0f0f0;
    padding: 0 15px;
    max-width: 300px;
  }
}
.paragraph-dh a{
  line-height: 1.4;
  color: #666;
}
.paragraph-dh ul{
  gap: 15px;
  display: grid;
}
.paragraph-dh ul ul {
  padding-inline-start: 1rem;
  margin-top: 10px;
}
.paragraph-dh a.active {
  color: var(--text-highlight-color);
  transition: all .25s ease-in-out;
}

结语

现在折腾博客是完全离不开各类 AI 协助了,让一个不懂技术的人也能瞎折腾。这几次折腾的时候发现 coze 非常好用,基本上一次就能给出正确答案。看来 ChatGPT 4.0 就是牛逼。

这个春节有什么不一样

2024年2月17日 16:22
这个春节有什么不一样

提早回家

大年二十六回家,这应该是十几年来第一次这么早回去过春节。往年如果回去,一般都到年二十八二十九了。一是因为姐姐今年也回家过年,自从 2018 年因为奶奶过世见过一面,之后都没见着面,一晃 6 年多时间没见了,甚是想念。二是因为天气,如果晚两天要么天气不好,怕下雪开车不安全,要么就只能等到大年二十九了。三是因为哥哥这两年都说,早点回家,在家多呆呆。由于家族特殊原因,其实每年都不大愿意回去,这可能就是因为妈妈不在的原因,少了一股绳,把大家拴在一起。虽然老爸可以作为这股绳,但情感的细腻肯定比妈妈会弱很多。

拍照片

翻相册,我们三兄姐弟上次在一起合影还是 2015 年的 2 月份,一晃 10 年过去。现在各自的娃都已很大,姐姐的大孩子都已经高三马上参加高考,哥哥的大孩子也都高一了。这次三个家庭再次同框,虽然大人脸上各自又多了些岁月的痕迹,我都光头了,但能聚一块就是幸福。

印象中,从小到大都没跟父亲一起合影过,更别说我们三兄姐弟一起跟父亲合影了,这次算弥补了这个缺失。看父亲脸上的笑容,蛮好。平常我们不在身边,希望他身体健健康康,少喝酒。说今年开始戒烟,希望如他所愿。不过最大的遗憾就是,身边居然没一张妈妈的照片,连当年走的时候的遗像,都已开始模糊不清,这么多年过去了,我都忘记妈妈的样子。刚走那几年,心说妈妈知道我胆小,所以不来我梦里,现在好像也梦不到她了。

汽车发动机故障灯亮起

大年二十九去姑姑家吃饭,回来路上发动机故障灯亮起。之后表现的症状就是:转速表有时候无反应;容易熄火,再启动就困难,需要停几分钟才行;车子有时会抖动。初二找了个店看了下,电脑显示故障为曲轴传感器损坏。想着如果这样子到时候回杭州在高速上忽然间熄火实在太危险了。于是初三又去县城检查了下,同样显示为这个故障,但没配件没办法。说是只要不熄火就没事。期间,刹车又坏了,开起来非常大的刺耳声,没办法花了 350 块钱换了副前刹车片,真是祸不单行。

不过也正因为去了趟县城,我们一家三口跟哥哥一家人在县城好好逛了逛,难得这样,蛮好。县城本身也没去过几次,这么多年来也没去过,现在就是各种旅游景点。

婺源县城

姐姐来我家

杭州的家,除了叔叔跟表弟来吃过一次饭,其他人都没来过。这次跟姐姐商量好,回工作地的时候,一起先到我家呆呆。初四出发,一路上车子算争气,除了出发时,路上抖动,主动熄火停了几分钟之后,高速一路上没给我撂桃子,连堵车的时候都没撂桃子,平安到家,感谢。

姐姐在杭州呆了一天,跟我们一家三口一起看了场电影,吃了顿火锅,姐弟两搀着手逛了下商场。想想都很魔幻,太难得了。虽然我们两个城市隔得不远,但要见面,各自有各自的生活,其实很难。我离老家的距离也就 300 公里左右,也近,但除了清明节回去看我妈,跟过年的时候有时回去一趟,平常也很难回去。大概这就是成年的各自奔波吧。

拇指割破

初六早上送姐姐到汽车站回工作地,回家中午做饭时,胡萝卜没拿稳,掉落过程中,下意识用手去接,忘记右手拿着菜刀(切菜前,刚把刀磨了下),导致左手拇指遭殃,眼瞅着鲜血直流,看伤口也很深。慌乱中打电话问工作中的老婆,家里的纱布在哪,简单的缠了下,骑着车就往社区医院跑。社区医院说你这伤口必须得缝合,让去大医院。感谢下社区医院当时的急诊医生,也没让挂号,帮忙伤口重新处理了下,也没让去付钱,说赶紧去大医院。在大医院,医生说看看有没有伤到神经,有可能要住院,我脑子都蒙了,没想到有可能那么严重,检查完,医生说神经还好,但有可能有后遗症,以后会时不时的麻一下。先缝了四针,看看后面恢复的情况。感谢娘俩一直陪着,缝的时候我非常怕,从小到大都没经历过,看着是一个大胖子,但紧张得浑身都是汗,还好老婆一直抱紧我。

麻药过后,会一阵一阵的酥麻或疼,等初十(周一)复查换药的时候,看看怎么样了,希望有好转。就当是新年的开门红了,今年一定是个好兆年,红红火火的。

结尾

每年春节,在老家最多也就呆三四天,一般初二或初三就回杭了。今年如果算上回来的两天,一共呆了九天时间,好快,一晃就过去了。在家里,孩子们玩得很欢快,晚上越晚睡越兴奋,作业也不写。感觉蛮好,辛苦哥嫂的照顾,以后如果有可能,也希望能多呆呆多聚聚。

收收心,开始新一年的奋斗,霉运都已用完,剩下的都是好运了,努力加油~~

HUGO 外链跳转到中间页

2024年2月1日 22:28
HUGO 外链跳转到中间页

前天在老麦博客中看到" 给Twikoo添加链接跳转中间页“博文,因为外部链接你无法确定未来某一天可能就会变成不安全链接,从而影响到自己博客。同时又见到 大大的小蜗牛也是因为安全的原因,把博客评论换成了GitHub Discussions。网上也有不少的案例,因为某个链接的原因,而被请喝茶或电话让自己排查。今天在 不亦乐乎那见链接也是跳转到中间页,于是请教了下怎么实现的,感谢。之后经过与 AI 的博弈,搞定。这次使用 ChatGPT 跟 Claude 都不行,说了一堆,完全不懂,最后使用 coze 搞定基本框架,然后再来回沟通逐步完善功能。估计跟它使用的 ChatGPT 4.0 接口有关。想充值 ChatGPT,奈何月费太贵了。

新建 js 文件,如:tiaozhuan.js。里面的网址为排除跳转中间页。

function checkParent(element, classNames) {
while (element) {
if (element.classList && classNames.some(cn => element.classList.contains(cn))) {
return true;
}
element = element.parentElement;
}
return false;
}
var excludedClasses = ['talks_comments','tiaozhuan-button']; // 添加需要排除的a标签类名class
window.addEventListener('load', (event) => {
document.body.addEventListener('click', function(e) {
let target = e.target;
while (target && target.nodeName !== 'A') {
target = target.parentNode;
}
if (target && target.nodeName === 'A' &&
!checkParent(target, excludedClasses) &&
!target.href.includes('koobai.com') &&
!target.href.includes('douban.com') &&
!target.href.includes('bilibili.com') &&
!target.href.includes('github.com') &&
target.hostname !== window.location.hostname) {
e.preventDefault();
let encodedUrl = btoa(target.href); // Base64 encode the URL
let url = '/tiaozhuan?target=' + encodedUrl;
window.open(url, '_blank');
}
});
});

在模板_default目录下,新建一个 html,如tiaozhuan.html。

{{ define "body_classes" }}page-tiaozhuan{{ end }}
{{ define "main" }}
<div class="tiaozhuan-all">
  <div class="tiaozhuan-nrong">
    <div class="tiaozhuan-title">即将离开 {{ .Site.Title }},跳转到以下外部链接</div>
    <div id="tiaozhuan-link"></div> 
    <div class="tiaozhuan-info">请自行识别该链接是否安全,并保管好个人信息。</div>
      <div class="tiaozhuan-button"><a href='' id='direct-link'>继续访问</a></div>
  </div>
</div>
<script>
  const params = new URLSearchParams(window.location.search);
  const encodedTarget = params.get('target');
  const target = atob(encodedTarget); // 使用 atob 进行 Base64 解码
  
  if (target) {
    document.getElementById('direct-link').href = target;
    document.getElementById('tiaozhuan-link').textContent = '' + target; // 直接显示目标地址    
  } else {
    console.error('未指定重定向目标。');
  }
</script>
{{ end }}

相关 css,根据主题风格调整。其中 background 为明暗模式下不同的背景图。

.tiaozhuan-all{
  position: relative;
  box-shadow: rgba(0, 0, 0, 0.25) 0px 25px 50px -12px;
  border-radius: 10px;
  background: #fff url(/tiaozhuanico.webp) no-repeat center center / cover;
  color: #666;
  word-break: break-all;
  max-width: 700px;
  height: 350px;
  text-align: center;
  font-size: 0.85rem;
  overflow: hidden;
  margin: 100px auto 0; 
  @include breakpoint('small') {
    aspect-ratio: 2 / 1;
    height: auto;
  }
}
.tiaozhuan-nrong{
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 20px 20px 30px 20px;
}
.tiaozhuan-title{
  font-size: 1.3rem;
  font-family: var(--font-family-title);
  color: #222;
  line-height: 1.4;
  margin-bottom: 4px;
}
.tiaozhuan-info{
  margin-top: 6px;
}
.tiaozhuan-button{
  margin-top: 20px;
}

.tiaozhuan-button a{
  color: var(--text-highlight-color);
  border-radius: 4px;
  padding: 10px 30px;
  font-family: var(--font-family-title);
  font-size: 0.85rem;
  border: 0.5px solid var(--text-highlight-color);
  display: inline-block;
}

@media (prefers-color-scheme: dark) {
  .tiaozhuan-all{
    background: var(--background-dark-color) url(/tiaozhuandark.webp) no-repeat center center / cover;
    color: #acacac;
  }
  .tiaozhuan-title{
    color: #ddd;
  }
}

最后在页尾引用js文件即可,如

<script src="/js/tiaozhuan.js"></script>

搞定,整体思路是:js文件识别链接的a标签,并把链接用 base64 编码,同时排除一些不需要跳转中间页的class或网站。然后跳转到tiaozhuan.html文件中(链接格式为/tiaozhuan?target=base64编码),html文件承担了中间页具体信息,及跳转动作。如使用base64解码跳转的链接。

以上为全局引用JS方法,判断 a 标签。下面利用 Hugo 内置的 render-link.html 实现。在模板_default/_makup目录下新建 render-link.html文件。思路是直接给链接添加 “/tiaozhuan?target=base64编码”。下面代码中的 “/” 为排除内链;网址为排除特定地址。感谢 大大的小蜗牛提示的 render-link 方法。

{{ $url := .Destination }}
<a 
    {{ if or (in $url "koobai.com") (strings.HasPrefix $url "/") }}
        href="{{ $url }}"
    {{ else }}
        href="/tiaozhuan?target={{ $url | base64Encode }}"
    {{ end }}
    {{ if strings.HasPrefix .Destination "http" }} target="_blank"{{ end }}
>
{{ .Text | safeHTML }}</a>

针对无法给链接添加 “/tiaozhuan?target=base64编码” 的,譬如 Artalk 评论,可以特定使用 js 判断。里面的.atk-comment-wrap a 就是 Artalk 评论的 a 标签;网址为排除特定地址。

document.body.addEventListener('click', function(e) {
  let target = e.target.closest('.atk-comment-wrap a, .datacont a');
  if (target && !target.href.includes('koobai.com')) {
      e.preventDefault();
      let encodedUrl = btoa(target.href);
      let url = '/tiaozhuan?target=' + encodedUrl;
      window.open(url, '_blank');
  }
});

对于浏览体验来说,多了一步跳转,总归是不好,但为了愉快的玩耍博客,稳妥一点更佳。现在把各个页面的评论都去掉了,只留下了唠叨跟博文评论,并且把博文的评论默认设为隐藏。倒也不是因为所谓的安全,主要是觉得评论的样式有待提高。

如果觉得跳转中间页很烦人,浏览器可以装个 Skip Redirect插件,告别所有网站的中间页跳转,直接抵达目标地址。

折腾博客更像是自己的精神鸦片

2024年1月30日 15:40
折腾博客更像是自己的精神鸦片

前两天看到说折腾博客实质上是新型电子游戏,博客服务器从 1 月初转入阿里云以后,自己就一直陆陆续续的在折腾页面布局。状态来说,自己折腾博客更像是精神鸦片,过程很嗨,一旦停下来就空虚无所事事。需找寻另外的事情来填补这逃避而空虚的心灵。

追寻最开始玩博客的目的,到现在折腾博客,似乎都是在打发时间中,或者说逃避更重要的事情中,找到了一个让你兴奋而沉浸其中的投入。当你懂得怎么调整布局,一个按钮的大小一个图标的变化一个文本颜色的选择都是折腾过程的乐趣。特别是当你折腾过程中解决了一个难题,那种兴奋感无以言表。反观对于输出内容,兴趣不大,因为无法给你带来兴奋而满足,也有可能读书太少,从小作文分数都很低。有内容输出,更多的是记录,方便未来找寻现在的记忆。

一件事情只要在自己的能力范围内,一旦愿意沉浸进去,就想好好折腾,享受其中的过程乐趣所带来的兴奋感。前两年无意中接触到机械键盘,就动手改轴下垫、换各种轴体、卫星轴加垫片等等,你说是为了有更合适的手感?可能这只是一个说服自己的理由,主要还是享受这折腾过程的兴奋感。就跟现在喜欢骑行,换链条、内外胎、脚踏、坐垫、车把等等一样,换了能带来怎么样的变化?对于只是休闲骑来说,并没有什么改变,但就是享受这过程的乐趣,居然自己会换胎了、会缠把带了。

填补当下的心灵空荡,需要有鸦片,折腾博客是属于金钱成本相对最低的鸦片。不像玩自行车、键盘你需要持续的金钱投入。不过这个劲一旦过了,空虚之后,可能又会回到另外的寄托,如玩自行车、玩键盘,或者重新拾起来博客,继续折腾,看看这个药效是不是还在。

现实工作一旦忙碌起来,就无需精神鸦片,工作会把你的空虚所填满。这时,博客只是一个存在互联网的一个脚印,静悄悄的躺在那里,哪天你空间、域名不续费了,足迹就开始消失。但或许哪天又需要这个鸦片来刺激你的快感,周而复始。

叨叨这么多到底要表达什么呢?嗯。。。对,我遇到了所谓的中年危机。所有事物都不关心,不关心朋友不关心外界任何事情不关心自己的负责越累越多,只想沉浸在自己的精神内耗中。知道这肯定是不行,但就想来点所谓的精神鸦片,所带来的当下一时快感。

所以如果博客哪一天不折腾或不更新了,说明要么有了其他精神鸦片替代,要么开始忙碌起来了~~

二零二三有什么不一样

2024年1月3日 12:41
二零二三有什么不一样

闺女,正式踏入人生的第一个十年,身高已经到我鼻子以上。有时候仰面走过来,感叹姑娘真长大了。感觉昨天还在医院里学习怎么抱刚刚出生的她,一晃十年过去了。希望下一个十年来得慢点。。。

已经在读四年级,但这个不爱学习的态度,像谁呢?写作业过程中,偷偷的玩 iPad,说了也没用,只能物理隔绝才行。除了看电视两眼发光,平常也不知道干嘛,让看会书或多写一个作业,回答说不可能的。学不学的利害关系道理,也不止一次跟她讲,但目前没见任何效果。又不想采取强制手段,教育孩子学问太大了。她妈妈小时候学习成绩非常好一直都是班长,我学习成绩虽然渣,但印象中还是想学的。

老婆,十年之后,重新踏入职场。因为承担起了照顾小孩责任,把自己身体累垮之外,还耽误了自身事业十年。现在重新回到职场,太多的不容易。承担着工作的同时,还得照顾家庭及孩子的教育。

在Jeffer.Z博客中看到,他们两夫妻是初中同学,算是青梅竹马。想到自己跟老婆是大学同学,一路走过来也不容易,跟着我受了太多的委屈。本以为日子在一天天的变得更好,但哪知道这两年一年比一年更差。导致我的脾气及耐心也变得极其不稳定,时不时的抱怨。按说男人照顾女人才对,反而她一直充当着照顾家庭照顾我的角色,事事以我为主,实在是太惭愧。

自己,年初的十年弹指一挥间博文中写到:“十年后,事业好像回到原点,又到了以前的状态。希望 2023 年借由新的博客开始,也是新事业的起点。。。。加油”。一年下来,情况更差了,外债不停的滚雪球,已经大到自己从没预料的阶段,还没有解决的方法,似乎进入到了一个死胡同。或者说怀疑自己之后,开始摆烂。变得越来越孤僻,从不主动联系朋友,从不参加聚会,连微信朋友圈也从不打开。朋友说,你这不行,要主动出击主动走出去,才有可能带来不一样的变化,道理当然知道,这样肯定不行,但有时候就是不想面对现实,就是想逃脱。马上奔四十岁,从没想过自己的中年危机是这么难,从小就幻想着,这会早出人头地。

父女

一家人,跟闺女独处的时间变得更多,特别是暑期时。虽然状态是:“一个成语概括各不相扰。最多的交流,爸爸我饿了、好热、休息下。有时候我也不知道应该怎么交流,教写作业?一没耐心二也不会;陪一起玩?好像也不知道玩什么,或者说我还是没耐心。父女俩做得最多的就是一起看电视”。但不管怎么说也是属于父女俩的单独时刻。

十月份入坑自行车之后,只要天气及时间适合,一家人就骑出家门。妈妈制定路线,准备后勤工作,父女俩只管蹬就行,感受着外面不一样风景或路边不一样的美食。过程太舒爽太惬意了,还能顺便锻炼锻炼身体。一改以往一家人要么在商场里逛要么在家里蹲的不健康生活。有了自行车之后,一句话总结:“明天我们去哪骑”。

线上,博客在十年之后,重新搭建上线,折腾的乐趣好像又回到了最初。不一样的是,随着科技的进步,通过ChatGPT 帮忙,能折腾出不一样的布局及功能。唯有感叹,科技太快。多年以前赶上了互联网浪潮,分享了互联网所带来的红利,不知道这次的变革,自己还能不能跟得上。

2020 年就想着说开始学发视频分享,但认为太难迟迟没做,直到 2023 开始在哔哩哔哩发出第一条视频,虽然质量一般,但发了也就发了,其实也就那么回事,想那么多不如先做第一步。

2024,核心两个字:搞钱。

每年一游之上海 (迪士尼/天文馆/朵云书院)

2023年8月25日 22:22
每年一游之上海 (迪士尼/天文馆/朵云书院)

忘记从哪年开始,两个人决定说趁闺女还小,每年尽量带她去个地方游玩下。这些年到现在不完全统计应该游了厦门、三亚、扬州、台湾、千岛湖、广州、珠海、北京等地。上海其实去了很多次,每次差不多都要到迪士尼,不过疫情之后这三年就没再去迪士尼了。有天对着自己的狗狗玩具说:“狗狗,都没带你去迪士尼玩”。这。。。明摆着的暗示,一合计,走吧。。。

22 号晚上开车出发,途径嘉兴服务区,发现现在服务区是真豪华,整得跟商场一样,上下好几层。差不多 21 点多到酒店,计划第二天几点醒就几点吃完早餐出发。小姑娘 6 点半就醒着睡不着了,太兴奋。那就起床刷牙洗脸吃饭出发。。。 上海迪士尼 玩到迪士尼乐园关门,回到车里已经是夜里 11 点,一天下来走了近 26000 步,脚都不是自己的了。小姑娘还是很厉害,比我走得更多,只是临近结束及回到车子这段路程说脚疼。但值得,开心最重要。这一天的天气也不错,没太阳,极大缓解了穿梭在路途中的暴晒。

之前每次来迪士尼都穿着艾莎的衣服,看着艾莎的剧场表演,有时还连续看两场。但这次不喜欢了,连艾莎的剧场不要看,看来长大了,喜好发生了变化。上午问要不要买盖章的护照,说不要,但当在商店里看到护照本子了,又想要了。买了之后,就热衷于各个地方找机器盖章,这个精神劲是真饱满。至于游乐项目,想玩的基本上都玩了一遍,除了一个想玩漂流、一个想玩过山车没玩到,主要排队时间太长,2 小时起步。只买了一个飞跃地平线的尊享卡,因为排队 3 个小时起步,连尊享卡从进去到出来也都花了 40 分钟。

如果说这次与前几次来迪士尼有什么不同的话,最大的感受就是小姑娘长大了。玩累了我说背下,但背不大动了,只背了一点点点路,就没力气,背不住。 上海天文馆 晚上小姑娘睡觉已是凌晨 1 点多,也太累,第二天早上 8 点多才醒,洗漱吃完早餐出发天文馆。到地方刚好赶上环幕影院买的《时间旅行》。看完都要睡着了,视觉效果很一般。还是好好的逛逛展区,效果做得是真好,可能会对小孩产生长远的爱好影响,立志于今后从事相关行业。至于我们,老婆说接受闺女是一个普娃吧,一点好奇心都没有,走马观花。哎,我不接受我不接受,但。。长大之后能养活自己就行。

到了 13 点多,本打算在场馆某餐厅点东西吃,服务员的态度,一言难尽。而且套餐都是预制的,微波炉里加热几分钟,评价也说非常一般。这样反而促成老婆趁这个机会搜了下其他地方,发现附近几公里有个评价不错的饭店。而且吃完还能带我们爷俩去另外一个地方晃晃。虽然展馆还没看完,但看闺女也没有太大兴趣的样子,一合计走起。。。 上海天文馆 一家广东餐馆,老婆推荐了黯然销魂饭,真心好吃。比场馆里便宜还好吃,爽。吃完之后,就来到了计划外的朵云书店(滴水湖店)。一进门,那三层楼高的整面墙书柜,看着太震撼了,而且窗外就是滴水湖,这风景,着实不错。

17 点左右,两天两晚的旅程愉快的结束,开始回杭。由于是在上海,也没计划多呆,想来,可以很方便的走起。

在上海郊区很难发现有沪 A 的油车,两天下来在路上就见过一辆,新能源的到发现不少,很有意思。沪 C 是全国唯一全时段不能进上海市区的车牌,冷知识。有可能这次驾照要被扣分,因为快到路口要转弯的时候开到了公交专用道等红绿灯,没想到转弯道在旁边。另外这次驾车,感觉心有点急,有几次差点出事情,心平气和心平气和心平气和~~

图片通过 uPic 上传到 Github,然后自动同步到腾讯 COS / 又拍云 / B2

2023年7月28日 16:18
图片通过 uPic 上传到 Github,然后自动同步到腾讯 COS / 又拍云 / B2

起因,自从把博客图片转移到又拍云之后,就通过 PicGo 直接上传,顺手也会再传一份到原先的多吉云,当是备份。本身这个流程没什么问题,但当看到斌仔说,他的方案是上传到 Github,再自动同步到各大存储桶。瞬间眼前一亮,我干嘛不这样呢,一次上传就行。目前博客样式或内容更新也是直接推送到Github,然后通过 Actions 自动构建及同步到各服务商,真是换了个场景就不知道了。折腾之路开始,记录留作备忘~

找了一圈多吉云的 Actions 工作流,发现没有。 大大的小蜗牛推荐了一个,试用了下,可能由于太久没更新或者自己不会使用,无效,找到原作者,沟通相对困难。决定放弃多吉云,转向腾讯云的 COS ,之前博文记录过 Github自动构建Hugo, 并同步到腾讯COS, 同时刷新CDN缓存,只需简单的修改下yml就行,其他具体设置参照之前的博文。

name: Sync Tencent

on:
  workflow_dispatch:
  push:
    branches:
      - master
    paths:
      - 'koobaiblog/**'  # 目录内容有变化执行工作流

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
          fetch-depth: 0

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.9

      - name: Setup coscmd and sdk
        run: sudo pip install coscmd

      - name: Configure coscmd
        env:
          SECRET_ID: ${{ secrets.SecretId }}
          SECRET_KEY: ${{ secrets.SecretKey }}
          BUCKET: ${{ secrets.Bucket }}
          REGION: ${{ secrets.Region }}
        run: coscmd config -a $SECRET_ID -s $SECRET_KEY -b $BUCKET -r $REGION

      - name: Upload to COS
        run: coscmd upload -rfs --delete koobaiblog/ /    # 需同步的本地目录及COS目录

搞定腾讯云之后,开始寻找又拍云的 Actions 工作流, 斌仔博文里有详细的教程,但试用之后觉得不够完美,一是文件无法增量更新,另外一个是无法保持文件一致性,譬如删除了 Gtihub 下的文件,远端无法同步删除。经过一番搜索,发现 她和她的猫博文中有说到增量更新及一致性问题,但没给出具体的脚本,抱着试试看的态度跟作者联系了下,把我的强迫症给完美解决,非常感谢作者。以下是yml,其中 UPYUN_BUCKETOPERATOROPERATOR_PASSWORD 分别是又拍云的服务名称、操作员、操作员密码。详细使用可参考作者的 Github

name: Sync Upyun

on:
  workflow_dispatch:
  push:
    branches:
      - master
    paths:
      - 'koobaiblog/**'  # 目录内容有变化执行工作流

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository master branch
        uses: actions/checkout@master

      - name: Deploy
        uses: her-cat/upyun-deployer@v1
        with:
          bucket: ${{ secrets.UPYUN_BUCKET }}
          operator: ${{ secrets.OPERATOR }}
          password: ${{ secrets.OPERATOR_PASSWORD }}
          dir: koobaiblog  # 需同步的本地目录

Backblaze B2 同步,B2_APPKEY_ID B2_APPKEY Application Keys菜单下生成就行。要特别注意的是B2_BUCKET写法,完整的写法是b2://xxx,其中xxx为存储桶名称。

name: Sync B2

on:
  workflow_dispatch:
  push:
    branches:
      - master
    paths:
      - 'koobaiblog/**'  # 目录内容有变化执行工作流

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - uses: jakejarvis/backblaze-b2-action@master
      env:
        SOURCE_DIR: './koobaiblog'  # 需同步的本地目录
        B2_BUCKET: ${{ secrets.B2_BUCKET }}
        B2_APPKEY_ID: ${{ secrets.B2_APPKEY_ID }}
        B2_APPKEY: ${{ secrets.B2_APPKEY }}

找寻各个解决方案的过程中,试用了下 归臧的方案Lsky图床,发现只能同步到一个存储策略,更适合作为图片管理使用。还搜索到ZFile存储程序,支持多吉云,试用了下,每次也只能同步到一个存储策略,在 Github 中向作者提了Issues建议,能不能增加一次上传,同步到多平台存储选项,明确答复未来不支持。还发现Picsee,图片管理工具,支持同步到各大平台存储桶,但自己已经有Eagle了。

为什么选择uPic收费软件而不用开源免费的PicGo?主要就是界面跟图标好看😂,另外一个是基于 Mac 原生开发。试用下来也非常好用,喜欢它通过设置快捷键快速上传。具体使用可参考各自的文档 uPic PicGO

为什么要同步到多平台?数据多重备份总归是好的,另外就是一旦有这个想法之后,你不搞定这个 Actions,心里很难受。腾讯 COS会不会很贵?本来一共也就十几兆,一个 G 的量也就几块钱,可忽略不计。又拍云可申请联盟,每月免费 10G 存储及 15G 的 CDN。Backblaze B2每月免费 10G 存储及每天 1G 的流量,如果套壳 Cloudflare,流量个人使用等于不要钱。折腾的乐趣,就在于不停的折腾~

信息获取推荐及价值

2023年6月25日 20:33
信息获取推荐及价值

进入移动互联网时代之后,每天被动或主动获取的各类信息非常多而杂。并且各大平台为了流量,绝大部分都是标题党,而且毫无价值可言,垃圾信息。为了让你沉浸其中,在平台多逗留一分钟,每家都是大数据算法,最终把你圈住。自己是一个自制力非常差的人,所以会把设备从系统层面完全隔绝各类推送,屏蔽非必要 APP 通知、不装短视频、新闻相关的 APP。

自己主要还是以主动的方式去获取信息,当然虽说是主动,但其实当你去关注某个 UP 主或者说大 V 的时候,其实有一部分也是平台根据你的喜好来推荐。不过目前获取信息渠道主要控制在微博、Youtube、Reeder。微博用的第三方 VVebo,Youtube 使用印度区会员,Reeder 阅读器买断。主要的目的是尽可能的减少广告、不必要的算法推荐,来更纯粹及集中的获取信息。

日常关注的一些 UP 主或专题:

  1. 大聪看电影,影视解说,声音跟解说风格都非常喜欢。 刘老师说电影,解说风格偏幽默。 发条张的野馄饨摊儿,偏长视频解说。现在看完影视,不看下解说,很多彩蛋及幕后故事是真发现不了。 硬核说,影视播客,有趣的两个主持人。
  2. 先看评测,硬件产品评测,严谨专业。 钟文泽,数码产品评测,说话风格偏有趣。 韩路,汽车相关,喜欢他的韩路游记节目。 电丸科技AK,科技话题,专业。 影视飓风,画质很专业,及喜欢他的一些行业幕后。
  3. 睡前消息,社会新闻评论。 小岛大浪吹,历史或新闻评论。 王骁Albert,海外国家讲解。
  4. 虎嗅早报 派早报 iFanr 早报,每早rss推送,快速了解下时下互联网、科技、社会新闻。

自己经历过找工作还是通过报纸打电话的时代,到如今每个人都可以成为信息发布、传播者。如果不加以筛选、过滤,就会浸泡在各个算法推荐中,等你回过神来,时间已到半夜。说好的陪陪孩子、推进下工作进度、看看书、看部影视,又得说,明天再说。一复一日的这样消耗着。

当你忙完一天回到家里,打开微博,看着时间线还停留在早上起床时间,赶紧刷新下一天中你都错过了什么。发现哪个明星塌房了、哪里出现安全隐患、地铁出现偷拍……。好像你错过了很多,但对你的影响是?少了聊天话题还是……?

我爱世界,希望世界和平,努力想办法有“砖搬”,让亲人不会因为你的能力问题导致生活水平下降,加油~

博客折腾随记及 CSS Grid 属性

2023年6月12日 15:43
博客折腾随记及 CSS Grid 属性

最近一直在不断的折腾博客,就跟唠叨里说的一样:对博客的折腾真是越折腾越来劲,一旦停下来,瞬间心里觉得空落落的。几乎把各个页面都重新梳理优化了下,特别是首页,各模块的信息流都给聚合起来了。因为更新博文的频率实在是不高,也许降低博文信息展示权重,让其首页更丰富起来,可读性更高点。

折腾过程中,ChatGPT 给出了 CSS display: grid; 属性,想起之前 风记星辰 也分享过,真是不了解不知道,一试用,发现用于并列容器的布局实在是太好用了,一直困扰我的自适应、等高等宽问题迎刃而解。索性把现有的页面全部基于 Grid 属性更改掉。其中 grid-gap 也很牛逼,不像以前用 margin-right 导致最右边的容器也会空出一定的距离。

display: grid;
grid-gap: 10px; /* 中间空10px间距 */
/* grid-template-columns 各个使用方法 */
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));/* 根据浏览器窗口自适应布局,最小容器宽度340 */
grid-template-columns: auto 1fr; /* 第一列宽度根据元素宽度自适应,第二列使用剩余容器空间 */
grid-template-columns: 1fr 1fr; /* 两列等宽 */
grid-template-columns: repeat(4, 1fr); /* 多列等宽,4为平均分为四列 */

现在折腾博客是完全离不开 ChatGPT 了,数据分离、交互动画、随机调用、布局样式,都通过它来实现,只要你多问几次或者完善对话语句,基本上都能给到你想要的答案。真是做到每个页面的最终呈现,都有它的贡献。自己一个完全看不懂 JS 的人,页面居然也用了不少 JS 效果。

当然有时候问着问着也烦,不想再问,始终给不到自己想要的效果。这个时候要么作罢,要么隔段时间新建窗口重新问,也许想要的答案就来了。目前使用的是免费 3.5 版本,如果 4.0 版本,估计更简单易用,特别是能访问互联网之后,期待未来~

有时候在想,这样折腾博客的意义是什么,日志没写多少,每天净搞些有的没的,内容才是重要的才对,再说折腾来折腾去,也没几个人看,图啥?嗯。。。。,开心最重要。意义就在于不停的折腾,就跟开头说的一样:一旦停下来,瞬间心里觉得空落落的。

感谢折腾过程中, 林木木 风记星辰 老师帮忙。同时折腾过程中,又认识了一些新朋友 小饿 linlinxing 小熊 wananaiko 老麦 大大的小蜗牛 忆往事 归臧 叶子笔记 少岱山 等等,博客真好。

信息流整合到 RSS 阅读软件 REEDER

2023年5月12日 23:42
信息流整合到 RSS 阅读软件 REEDER

重新搭建博客以来,就喜欢没事的时候去博友的站点逛逛,看看各自的生活百态。成为习惯之后,发现访问路径比较麻烦,要么从互访的评论中进入,要么就从博客集合平台进入,每次访问的时候点来点去的,其实常逛的也就那么些站点。于是想着搭建个友链页面,集中在一个地方,样式也写好了,但总觉得还是不够方便。包括日常获取当下信息的方式也是通过浏览器书签或各类 App 点来点去的。有天忽然间就想起了 RSS 服务,一劳永逸的都集中起来,方便又快捷。

搜索一圈,决定使用开源的 FreshRSS 搭建服务用于数据同步、曾经的最爱 Reeder 作为电脑端阅读器、开源的 NetNewsWire 作为 iOS 端阅读器。

搭建过程中还发现 RSSHub,开始没明白到底是干啥的,官网的介绍是:“RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。RSSHub 借助于开源社区的力量快速发展中,目前已适配数百家网站的上千项内容。” 在目前大多站点不提供 RSS 输出或者无法做到精细化输出(譬如只需要某个信息流站点的某标签/板块内容),RSSHub 确实起到了非常大的作用,根据文档直接配置 RSS 链接就行。不过如果它也没提供,那就需要自己通过它编写订阅源,看了下文档,嗨,这就不是我要考虑的问题了。

一切准备就绪,试用了几天,发现几个问题:1. 无法通过阅读器直接刷新订阅源。2. NAS 没设置科学上网,Youtube 等订阅源无法添加到 FreshRSS。3. 通过 FreshRSS 订阅的 Youtube 频道在阅读器中无法直接播放。前面两点都解决了,第三点在 Reeder 牛逼的交互中,虽然影响不大,但这个强迫症呀。。。不爽。

看着 Reeder 目前提供了 iCloud 数据同步服务,同时它对 Youtube 也有优化,心想要么直接购买 Mac、iOS 两端好了,去掉中间商 FreshRSS,省得麻烦,一顿纠结,收入囊中。虽然开源的 NetNewsWire 也提供 iCloud,但交互、及界面设计 Reeder 太爱了。譬如在文章页中,左滑就是源站打开,右滑关闭。一款愉悦的 App,会让生活增添一份色彩,博客重建之初,特意搭建了个 Apps 分享页面。

也趁着这次折腾,把自己站点 RSS 通过网上的主题模版重新梳理了下,全文可按格式段落输出了。现在不管是访问博友的站点,还是日常的信息流获取,都可以优雅且方便的随时随地享用,舒坦~

体验了一次群晖 NAS 的重要性

2023年5月5日 20:53
体验了一次群晖 NAS 的重要性

早上正准备打开昨天的项目文件继续完善,目录里找了一圈发现没有,完了,难不成自己误删了?睁大眼睛又找了几圈,呃。。。猝。转念一想,这个工作目录是实时单向同步到群晖 NAS 的,而且套件也设置了控制版本数量,心情平复很多。打开 Synology Drive,心态崩了,没发现历史版本,因为没启用回收站功能,版本控制需基于文件来,但没文件呀。。。

虽然项目大部分已交付给甲方,但防不住有修改意见,那会没源文件,想想就抓狂。Google 了下,群晖官方文档中提示 :Synology Drive 管理控制台中的“版本资源管理器”可以勾选“显示删除的文件”找回。文件是有了,但这里面的删除文件是最初新建的文件,也就是说文件是空白的。。。

没办法,开始默默计算重新做一遍需要花多长时间,同时再研究下 Synology Drive 管理控制套件,在日志中发现昨晚18点多的时候删除的文件,本打算双击查看下详情,但这一双击,卧槽!此文件的历史版本都在,下载最近的版本,啊!!!叫了一声,文件完好无缺,意外惊喜,当时就连说群晖买得值了值了。。。

这心情起起落落的,省下至少一天的重做时间。过后还是得总结下,为了让重要的文件更安全或者说实时的重要文件更安全:

  1. Synology Drive 的版本数量设置得多点。
  2. 重要目录启用回收站、回收站。可以到任务计划中设置一定周期自动删除回收站里的文件。
  3. 重要文件多块硬盘备份,如组 Raid 或 计划备份。当然有条件的还可以多地备份。

再说一句,群晖牛逼、NAS 牛逼~。更多群晖的介绍可参考之前的日志 Synology 群晖 DS920+ 使用之旅

旧 Macbook 装双系统 Windows 11

2023年4月27日 22:21
旧 Macbook 装双系统 Windows 11

这些年来一直使用 Mac 电脑,从 iMac 到 2014 款 15 寸 Macbook Pro 再到 2019 款 16 寸 Macbook Pro。不记得从什么时候开始不再使用 Windows 电脑,只记得那会使用 xp、win 7 系统。不过现实中总有那么些事情需要用到 Windows,如:企业网银、某些硬件更新。之前装个 Win 7 虚拟机临时使用下,但从微软发布 Win 11 以后,看到更现代的界面,一直想尝试看看。

本打算继续采用虚拟机方式装 Win 11,但没成功。于是想着 14 款的 Mac 放着也是放着,直接装个双系统。实践的时候发现把事情想简单的了,由于硬件比较老旧,安装过程中遇到不少麻烦,想着再搜不到方法就放弃了,好在最终都解决。以问答形式记录下关键问题,留作备忘。

1. 使用什么工具安装?

Mac 自带的“启动转换助理”软件。M系列处理器暂不支持;16 款之前还是哪年之前的 Mac 需要另外准备外置硬盘作为 Win 安装的启动盘,我的 14 款需要。

2. 安装时提示“该电脑无法运行 Win 11”怎么办?

在这个界面下,按 Shift+F10 键 ,弹出命令窗口输入“regedit”打开注册表,依次定位到:

HKEY_LOCAL_MACHINE\SYSTEM\Setup
创建一个名为 "LabConfig" 的项,在此项下创建两个 DWORD 值:
键名“BypassTPMCheck”,赋值“00000001”
键名“BypassSecureBootCheck”,赋值“00000001”
保存退出

3. 安装 22H2 之后版本,遇到需要连接到网络才能点击下一步怎么办?

当时因为这个差点就放弃了。在这个界面下,按 Shift+F10 键 ,弹出命令窗口输入“oobe\bypassnro”回车,系统自动重启。再到这个界面的时候,点击“下一步”左边的文字按钮“我没有网络”。

4. 安装完,发现没有驱动怎么办?

找到安装盘的 bootcamp 文件夹,整个拷贝到安装好的 Win 系统下,点击文件夹中的 setup.exe 安装 bootcamp 软件,安装完在线更新下 bootcamp 软件。

5. 怎么激活系统?原生纯净的系统从哪获取?

自动激活: Official Site。系统包iso: ITELLYOU TechBench

装之前准备一个有线鼠标,不然过程中很不方便。装完体验下来,界面跟之前的对比漂亮非常多,至于其他的,由于是老硬件,还要啥自行车。自己平常不玩游戏,所以这些年用 Mac 习惯了,而且其他对应的设备也都是 Apple,生态的互通互动方便很多。

搭建个人锻炼轨迹页面

2023年4月10日 16:47
搭建个人锻炼轨迹页面

聊聊肥胖说说状态”的日志已过去十几天,基本上做到了动起来:1.每天早起跑步。2.学习游泳。3.晚上空腹。

慢跑,以半个小时为基准,跑了几天之后发现除了腿酸疼之外,脚腕也不舒服。通过 conge 经验分享:初跑者的目的,一是养成习惯,二是控制野心不受伤。现在每天以15-20分钟为基准,跑不是目的,先培养习惯,让身体逐步适应锻炼。不过这几天脚腕疼得好像更厉害点,写这篇日志时脚腕在胀疼,可能跟最近走的路太多有关系,再适应适应。

游泳,之前没想着游泳,Eileen 说游泳是全身运动,更容易减肥,于是在家附近找了个游泳馆,尝试看看。说起游泳还是停留在小时候放牛时学的狗刨式游法,现在真正要游,其实完全不会。于是从看教学视频开始学,目前基本上每周去2-3次,现在要说有没有学会,嗯……还没有,继续坚持努力。

空腹,减肥最快的方式其实是不吃或者少吃,但咱也做不到也不健康。但零食、饮料、夜宵已完全戒掉,当然之前也不怎么吃。目前基本上保持晚上不吃晚餐,一天吃早中两餐,也算是遵循了816减肥方法。上周有几天没坚持住,继续坚持努力。

当然更快更科学的减肥方式是,力量训练,一天摄入的热量少于消耗的热量自然而然就瘦了。还没打算这样做,一个是如果每次吃个东西还得查这个热量多少或者运动消耗了多少热量,生活太累了。另外力量训练,如果不请教练,自己瞎折腾器材,行不行?会不会容易受伤?教练太贵。还是先让身体动起来再说,看看能不能坚持,如果不能坚持一切都是白搭。 地图轨迹

在看 conge 日志过程中,发现有个跑步记录的页面很不错,通过他的分享知道了 running_page开源项目,之后又发现 ben-29基于 running_page项目,增加了更多的运动类型。于是搭建了个“ 锻炼轨迹”页面,算是从另外一个维度来督促自己坚持。

搭建过程中折腾了很久,把一些注意点记录下,留作备忘。

1. 绑定独立域名,修改gatsby-config文件:
pathPrefix: process.env.PATH_PREFIX || '/',  
改为:pathPrefix: '',否则会导致地图显示不出来。

2. 隐藏地图街道名称,修改src/utils/const.js文件:
const ROAD_LABEL_DISPLAY = true;
改为:const ROAD_LABEL_DISPLAY = false;
修改地图高度:const MAP_HEIGHT = 600;
修改轨迹透明度:const LINE_OPACITY = 1;

3. 静态文件同步到宝塔目录,修改.github/workflows/gh-pages.yml文件
- name: GitHub Pages
uses: crazy-max/ghaction-github-pages@v2.2.0
with:
target_branch: gh-pages
keep_history: true
build_dir: public
jekyll: false
改为:
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PERSONAL_TOKEN }}
external_repository: koobai/workouts_page
publish_dir: ./public
之后参考:[Github 自动构建 Hugo, 并通过 Webhook 同步到宝塔指定目录.](/hugo_action_webhooks)日志

4. 自定义的样式代码,合并到了 src/styles/index.scss。
5. src/components/header/index.jsx 布局修改。
6. src/components/pages/index.jsx 布局修改。
7. src/components/RunTable/index.jsx 英文翻译
8. src/utils/const.js 自定义了地图 (Mapbox) token,同时修改了页面展示说明。

由于有时候过敏,几年前买回来的 Watch 已基本上不带了,如今为了锻炼的时候记录,重新佩戴起来,看着每天锻炼圆环合并,挺满足。现在又多了一个佩戴理由:个人页面展示。如果问这十几天动起来之后,身体有没有什么变化,嗯……好像还没有,继续坚持加油,总会带来自己想要的结果。

上面说的最多的词是坚持,为什么?因为自己做什么事情都是三分钟热度。坚持,不代表痛苦,而是对自己的一种肯定。过程中有没有痛苦,当然有,晚上不吃,看着娘俩吃香的,那个馋呀….。但每天坚持早起动起来,发现还蛮喜欢,因为一天的时间早上是最能自己把握的。当然起床前的那一刻赖床是无法避免,但生活不就是这样~~坚持加油~~

聊聊肥胖说说状态

2023年3月28日 08:00
聊聊肥胖说说状态

自己的体重导致双脚变得沉重越来越扛不住它,曾经的那个追风少年早已不在,紧随而来的是中年肥胖油腻大叔。这几年的身体体检数据也一年比一年难看,脂肪肝、甘油三酯都不用说,连血糖数据都在高位徘徊。再加上自己本身有原发性高血压,身体早已把早年间所打下的基础透支完。

都说一胖毁所有,看见中意的衣服,一试这啥玩意;跑两步就气踹得不行;稍微蹲下双腿就发软;就连上完厕所擦屁股都变得不利索。知道胖不好,也不是没想着去减重。跑步、饿肚子,一段时间内坚持,减下去一点,但扛不住坚持,周而复始反而变得越来越胖。就跟搞博客一样,人换了一批又一批,都在于是否坚持得住。一个人能把坚持两个字做好,99% 的事情都能有成果。而自己属于什么事情都是三分钟热度,这个劲一过,抛在脑后失去动力。 菜 之前日志 十年弹指一挥间里写到事业回到原点,随之而来的压力,导致最近自己的状态非常差,什么事情都提不起兴趣也没耐心、胡思乱想、坐在电脑前发呆、无所适从。可能近段时间捣鼓博客是唯一一件让自己抽离现实或者说逃离现实的途径。 但这样肯定不是办法,是该做出改变,突出目前的困境。先从身体状态开始,让精神保持饱满,这样才有可能换来变化。

03 月 16 号唠叨的时候说:“身体是越来越胖,迈不开腿,嘴又管不太住,只能从调整饮食结构开始”。从当天到现在,每天晚上的坚持,发现身体还没什么变化。看来只想通过这种捷径方式不大行,身体还得动起来:计划每天早上 7 点之前起床跑步,先动起来。看看这次能不能坚持、能不能看到身体的变化、事情能不能突出困境。 菜 不到一米七的身高,双腿总共扛了一百七十多斤的重量。之前看到一篇博文说:让自己体重超过一百五的人是怎么想的,怎么受得了。是的,我也不知道自己是怎么就不知不觉悄无声息的就超过了。而且最近身体坐一会,左腿就发麻,不知道怎么回事。控制自己体重,是为数不多能掌握在自己手中的事情,所有的变量都在于自己。

图片为调整饮食结构之后,每晚所吃:鸡排、牛肉、吓、花菜、黄瓜、生菜、玉米、鸡蛋等,把碳水先控制住,辛苦Elieen每晚花心思做。这两晚停了下,空腹试试~

使用 ChatGPT 优雅的折腾博客

2023年3月22日 08:00
使用 ChatGPT 优雅的折腾博客

ChatGPT 现在铺天盖地的报道及使用,好像你不参与讨论或使用就跟不上时代一样,科技发展是真快。自己第一次使用 ChatGPT 还是去年刚推出,花了几块钱买了个虚拟手机号注册体验的,当时最大的感受就是它能结合上下文的意思来回答你,感觉很牛逼,之后就没怎么体验。今年在国内大面积出圈,也一直只是看看报道,自身并没有真正去体验使用。

由于自己并不懂技术,所以在折腾博客的时候,都是一边 Google 一边瞎搞。最近有个想实现的样式怎么组合关键词 Google 就是搜不出来,想起来 ChatGPT,用大白话一问,搞定解决。之前只是看看报道,但这一下子让我身临其境的重新认知,哇,原来是真的这么好用。 ChatGPT

之后只要遇到问题就先尝试下 ChatGPT,基本上都能得到满意的回答,最主要的是它给出回答之后,会解释其中的原理及作用,大大提高效率的同时还能知道今后运用的方法。 ChatGPT

当然 ChatGPT 的牛逼能力,网上说了一大堆,随着 GPT-4 发布,更是不得了。但当下能不能用到自己的工作生活中,这才是最主要的。随着 AI 的工具越来越多(如昨天晚上 Google 开始开放申请 Bard 试用),及进化程度越来越成熟,各种场景逐步的被替代,自己能做的就是拥抱变化,让自己变得更有竞争力的同时也需要懂得怎么借助越来越牛逼的 AI 为自己服务。今后可能有个职业叫“AI 训练师”。

Adobe 刚发布了 Firefly 宣传视频,除了帮你生成所需图片之外,还能在图片上以聊天的方式编辑图片,相当于 AI 帮你 P 图,这今后设计师 P 图工作完全可以交给它了~只能说牛逼。

工作台之桌面搭配

2023年3月9日 08:00
工作台之桌面搭配

2020 疫情开始从公司辞职后,一部分时间变成了在家做些项目。一开始在餐桌上对付下,时间久了,腰不行,之后就在休闲区给自己整了个工作台。到现在也 3 年时间了,感觉已形成自己一个空间,非常满意,中间还把桌子换成了升降桌,桌面整体保持着简洁干净,只是适当加点小装饰~

白色严选升降桌 (1400x700cm),网络流传说,升降桌买回来一般就用三次升降功能:第一次刚买回来、第二次朋友来了演示、第三次卖的时候。实际结合自身的使用频率,因人而异,自己觉得这钱花得非常值,现在大部分时间是站着干活,而且也会自然习惯的坐一会,就会抬升,交替进行,极大缓解腰疼症状。 严选升降桌

MacBook Pro 16 2019,2020 年购入,之前还是用 2014 款的。最后一代英特尔处理器,对付自己的日常工作无问题,除了不知道为什么偶尔会触发风扇狂转,而且触控栏 Touch Bar 是真没用,买回来都三年了没使用过。整体使用非常满意,工业设计也一如既往的喜欢,不大喜欢新款的方方正正,视觉上变得更厚。 MacBoob Pro 16

显示器飞利浦 279C9 4K27 寸,自带反向 65w 充电。由于自己的工作性质,对色准有适当的要求,显示效果还是蛮靠谱,够用,而且边框四周等宽,视觉冲击力不错。

上方夹了明基 ScreenBar Plus 挂灯,除了能提升夜间的照明度之外,既不占桌面,也不反光,非常喜欢。唯一的缺点就是控制器是有线的,买回来一个多月品牌就出了无线版本,嗨~。

在买升降桌之前,想着支架能更方便的调整显示器,以缓解颈椎,于是购入了爱格升支架。东西是好东西,只是现在有了升降桌,作用的意义不大,用得最多的就是鼠标要充电,需接线到显示器后面的 usb 接口,旋转起来非常方便。 显示器

罗技 MX Master 3 鼠标,2019 年买的,除了表面脱皮及起泡外,使用起来确实很顺手。中间尝试过 MX Vertical ,想着更符合人体工程学,以改善手部疲劳,但没有 MagSpeed 电磁滚动技术,使用起来不习惯,还是 MX Master 靠谱。 MX Master 3

ZOOM 65 机械键盘,之前日志中提过,除了无线容易没电之外,还不错,现在搭配 PC 定位版、TTC 金粉轴 V2、Domikey 宇航员、Pbtfans wob 黑使用。Pbtfans 这款键帽感觉不大行,PBT 材质现在都开始磨损出油了,早买的宇航员 ABS 材质,现在还是完好无损,越看越喜欢。 ZOOM 65 zoom 65

桌上摆上几个小东西还是蛮好的一种点缀,乐高、小黄人、小米 Sound。买这个小米 Sound,只是单纯为了晚上工作时,听“钱塘夜色”广播,使工作起来带感,有想法。戴头盔的小黄人是闺女送的盲盒生日礼物,当时买的时候,就想要这款,没想到真给抽中。 小黄人

桌子上还有个键盘手腕垫,凝胶填充,软软的蛮舒服,买短了点,长点更好。桌垫是小米的,800x400cm,干干净净而且锁边了,不起翘。桌子旁边放了个宜家的办公柜,金属结构,上面放了台小米激光黑白打印机,主要作用还是给闺女打印作业。旁边的椅子也是宜家的,1000 多块钱,性价比一般,买它主要是觉得外观简简单单很好看。 全景

之前还想过整个背景墙铺满黑色洞洞板,跟前景形成黑白反差,然后挂些好玩的物品。由于桌子改成升降的了,就觉得这样不大方便,只好放弃。每次看到桌面搭配的视频或图片都会不由自主的停留欣赏下,喜欢各自的小心思。一个满意的工作台,舒适的桌面搭配,每次走到跟前看着就是一种享受,大大增加工作心情。

利用 unicode-range 属性, 提高自定义字体加载速度

2023年3月1日 08:00
利用 unicode-range 属性, 提高自定义字体加载速度

每天折腾一点,新鲜满足感就增强点。为了各个终端显示效果能保持一致性及自己的审美爱好,网站自定义了三种字体:标题(得意黑)、正文(鸿蒙)、代码(JetBrainsMono)。效果很满意,但带来的问题就是加载速度怎么保证,特别是中文字体。虽然使用.woff2 格式可以一定程度的降低容量,但动不动就 1M 以上的大小,对加载速度还是有一定的影响,包括 CDN 的流量损耗。

想到的方法是引用大厂的 CDN,既能白嫖保证加载速度又觉得说大厂一般对字体有优化,经过一番 Google,解决了正文(鸿蒙)字体问题。但标题、代码区域的字体,国内还没找到适合白嫖的既有速度又稳定 CDN。

正苦恼之际,发现 Google 或者国内大厂字体引用方式:CSS 中都有一个 unicode-range 属性。于是,搜索一番,名称叫字符集,通俗点就是把一个字体拆分成 N 个包,显示的字体刚好在其中一个包,浏览器就只加载这一个包,而不用加载整个字体,这就能大大提高加载速度及节省 CDN 流量了。

使用方法:先搞清楚,基本中文的引用:字符集都包含哪些区间(包)。可参考: 中文汉字和常见英文数字等的 unicode 编码范围,得到 Unicode 编码范围值之后,在对应字体 CSS 引用:

@font-face {
  unicode-range: U+4E00-9FA5,U+0025-00F0;
/* 格式为U+编码范围,多个范围以","分开 */
}

搞定,这下就可以愉快的随意引用自定义字体了。当然使用场景很多样,详细说明、使用、CDN 引用,参考:
CSS unicode-range 特定字符使用 font-face 自定义字体
引入商用黑体字体系列整理及 CSS 字体引入

题外:

  1. 推荐下 Obsidian,知识管理笔记类软件。之前写日志要在几个不同的文本软件中切换,要么界面感觉不适合码字,适合码字了但插入一些东西总是出现各种问题。Obsidian,插件丰富,配合 WebDav 各端同步。自己就当日常记录、写博客日志使用。动手能力强的话可以直接在里面 “写–上传–提交” 一条龙博客发布流程。
  2. 最近不知道怎么回事,娃发烧生病好了之后复发,现在还有点咳,Eileen 也是反反复复,只能躺床上休息。自己这两天也开始咳嗽,喉咙不舒服,今天腿发酸~~。希望一家人的身体尽快健康好起来,活蹦乱跳的~~

智能家居使用主观感受

2023年2月24日 08:00
智能家居使用主观感受

2018 年装修房子选灯具的时候,了解到智能家居。想着要不尝试看看,经过性价比、产品丰富度、入门简易度几个维度筛选下来,小米生态链的品牌最适合。到现在差不多四年多时间,米家里显示的设备 88 个,基本覆盖了日常使用设备,如:门锁、灯具、猫眼、摄像机、窗帘、扫地机、净水器、各类传感器等。

场景

智能设备最优的使用方式,是各个设备之间相互联动,而不是单一独立存在。自己分别设置了不同场景:如

  1. 门锁开门,指定对应的灯具自动开灯。关门,指定全屋关灯,并开启摄像机、安全网关、禁用小爱同学。
  2. 走入卫生间、厨房,自动开灯,5 分钟之后,感知无人自动关灯。半夜走入卫生间、厨房,开启夜灯模式。
  3. 早上窗帘自动打开,晚上自动关上。
  4. 各种小爱同学口令,如:看电视,对应灯具自动关上,并打开氛围灯、电视。睡觉,关闭灯光,并打开夜灯。

感受

解放双手双脚,怎么懒怎么来。一句小爱同学、一句嘿 Siri 随时听你的指令工作。再也不用因为忘记关灯或扫地问题,用石头剪子布来决定谁去关或扫,影响感情。也不用担心开门屋里一片漆黑、起床上厕所摸黑,需要找开关。

设备稳定性整体不错,偶尔几个掉线之后只需手动关开一下,就会自动连接上。当然日常使用也存在一些问题:

  1. 小爱同学答非所问,你喊它开客厅灯,它回答好的,马上播放 xxx 歌曲。
  2. 门锁开门不自动执行场景设置,时有时无,到目前没搞明白什么原因。
  3. 设备基本上都必须连小米服务器才可使用,无网络或小米服务器出现问题,就全屋瘫痪。
  4. 上厕所或洗澡容易自动关灯,人体传感器精度不够,需要换人在传感器。

总结

Smart Home 使用的产品当中也会有为了智能而智能,并不实用,如晾衣架,还是实体开关升降符合使用预期。

设备几年使用下来,给生活带来了便利之外也确实提升了小幸福感。特别是一些有意思的产品,如智能马桶盖,除了改变日常清洁屁屁问题之外,冬天坐上去那个暖和的感受,再也不用一哆嗦。智能垃圾桶,自动打包自动套空袋,非常方便。但是不是必须,譬如有人说自己拖地更干净,那就仁者见仁智者见智。

2023 年,可选的品牌、品类越来越丰富,技术也越来越成熟,如离线使用、Apple 的 Matter 标准等等,值得尝试。

Github 自动构建 Hugo, 并通过 Webhook 同步到宝塔指定目录

2023年2月20日 08:00
Github 自动构建 Hugo, 并通过 Webhook 同步到宝塔指定目录

(2024.01.19晚更新) 折腾博客的乐趣就是不停的折腾,一个评论插件就搞来搞去的,为此还特意买了轻量服务器,索性也把 Hugo 搬过去。只是原先自动同步到腾讯 COS 就不可用,而且域名还指定了境外访问路径,导致更新博客的流程变得非常复杂。最终通过 Google,总算解决:本地提交 hugo 源码到 Github,自动触发构建并同步到宝塔指定的网站目录。

部署步骤流程记录下:

1. 在 Github 的 Hugo 源码仓库根目录,新建".github/workflows/xxx.yml 文件,复制以下代码。作用:借助 Github Action 实现自动构建,并同步到另外一个仓库。其中 “PERSONAL_TOKEN” 为另外仓库的访问密钥;“external_repository” 为另外仓库地址。

name: Githubblog

on:
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
          fetch-depth: 0

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest'
          extended: true

      - name: Build
        run: hugo --minify

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          personal_token: ${{ secrets.PERSONAL_TOKEN }}
          external_repository: koobai/koobai.github.io
          publish_dir: ./public

2. 打开宝塔面板,终端生成 git 公钥

# 安装 Git
yum -y install git

# Git全局配置和单个仓库的用户名邮箱配置
git config --global user.name  "username"
git config --global user.email  "your@email.com"

# 生成git公钥用于自动拉取(一路回车)
ssh-keygen -t rsa -C "你的@email.com"

# 查看git公钥
cat ~/.ssh/id_rsa.pub

3. 添加公钥到到 Github:头像–Settings–SSH and GPG keys–New SSH key

4. 打开宝塔面板商店,安装 WebHook 插件–添加执行脚本 (复制以下代码)。其中"gitHttp 为需同步的 github 仓库地址",“gh-pages"为仓库分支名称。

cd 网站目录
git config pull.rebase true
git pull
echo Onion Site Updated! $(TZ=UTC-8 date +"%Y-%m-%d"" ""%T")
echo ======================================================

以下代码已过时,暂不使用。

#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#git分支名称
branch="gh-pages"
#git项目路径
gitPath="/www/wwwroot/$1"
#git 仓库地址
gitHttp="git@github.com:koobai/koobai.github.io.git"
echo "Web站点路径:$gitPath"
#判断项目路径是否存在
if [ -d "$gitPath" ]; then
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        #sudo git reset --hard origin/$branch
        git remote add origin $gitHttp
        git branch --set-upstream-to=origin/$branch $branch
        sudo git reset --hard origin/$branch
        sudo git pull $gitHttp  2>&1
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
        echo "End"
        exit
else
        echo "该项目路径不存在"
                echo "新建项目目录"
        mkdir $gitPath
        cd $gitPath
        #判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                sudo git clone $gitHttp gittemp
                sudo mv gittemp/.git .
                sudo rm -rf gittemp
        fi
        echo "拉取最新的项目文件"
        #sudo git reset --hard origin/$branch
        sudo git pull gitHttp 2>&1
        echo "设置目录权限"
        sudo chown -R www:www $gitPath
        echo "End"
        exit
fi

5. 查看 WebHook 插件密钥,复制密钥地址。添加到 Github 需同步的仓库–Settings–Webhooks–Add webhook。其中 Content type 选择 application/json。

格式如:https://面板地址:面板端口/hook?access_key=密钥&param=需同步到的目录名称

6. 初始化宝塔网站目录

在宝塔终端执行:

cd 网站目录
git clone --depth 1 https://ghgo.top/https://github.com/koobai/koobai.github.io --single-branch .
git clone --depth 1 --branch main https://ghgo.top/https://github.com/koobai/koobai.github.io .

解释上面意思:--depth 1 只克隆最新的一次提交。mirror.ghproxy.com为github加速地址,koobai为github用户名,koobai.github.io为仓库名。最后 . 为当前目录。
--single-branch 克隆一个分支。或 --branch main 克隆 main 分支。

以下代码已过时,暂不使用。

cd 网站目录

# 初始化git 执行
git init

# 连接远程仓库
git remote add origin git@github.com:yourName/repositoryname.git

# 拉取想要的分支代码(gh-pages分支名称)
git pull origin gh-pages

# 等待完成

至此,步骤全部完成。当本地提交新文件到 Github hugo 源码 main 分支,就会自动触发(hugo 生成静态文件——同步到另一个仓库——同步到宝塔网站指定目录)。如果域名指定境外访问路径是 vercel 或 cloudflare 服务,当 hugo 源码更新的时候也会自动触发构建更新。

题外: 由于使用了轻量服务器,原先备案过的域名也需要重新接入备案。整个流程下来发现,现在备案审核速度是相当的快,必须点个赞。周一提交服务商,周二服务商提交管理局,周三审核通过。周三上午提交公安网安,下午审核通过。

Apple TV 4K (第二代) 使用体验

2023年2月10日 08:00
Apple TV 4K (第二代) 使用体验

自己喜欢观影,为了方便直接使用奈飞 (Netflix),在 2020 年时购入了 Google TV,一直使用得不错。直到买了群晖,在折腾影视串流的过程中,发现大家都推荐 Infuse 这款软件。一番了解,确实很不错,支持市面上所有的视频、音频格式,年订阅 9.9 美元,最主要的是串流的海报墙太美了~~。唯一的缺陷就是只支持 Apple 生态,其他都好说,本身电脑手机 Pad 都是 Apple,但最主要的电视观影工具 Google TV 使不上呀。纠结很久,实在受不了 Infuse 的诱惑,于是淘宝了一台 Apple TV 4k (第 2 代)。

连接方式

Apple TV 连 Soundba 音响 ARC 接口 > Soundba 连电视 eARC 接口,这样就可以,画面由电视显示、声音由 Soundba 输出。

使用感受

2022 年 1 月 3 号买的,目前也使用了一年多时间,整体感受就是一分钱一分货,比之前的 Google TV 不管是流畅度、系统美观度,完全都不是一个量级。特别喜欢铝制一体成型的遥控器,非常有质感,就是冬天使用冰手。

由于家里的智能设备也通过 HomeKit 控制,Apple TV 插着直流电,也就充当作为智能中枢使用。另外有台电视不支持杜比视界,可以使用机器配合 iPhone 给电视屏幕校色。

目前 TV 中,常用的 App: netflix

1. Netflix

买这些盒子最初的需求就是为了能使用 Netflix,喜欢它的一点:剧集基本上都是一次性放出,看起来非常爽。每年都有那么几部好看的,如:暗黑、怪奇物语、风骚律师、纸房子,最近很火的黑暗荣耀。但每个月的订阅费确实不便宜,咬牙坚持几个月后,上了合租车。

2. Youtube

关注了自己喜欢的几个频道,在电视上看还是很爽的,特别是订阅了会员之后,无广告。之前印度区一个月也就 6 块钱,最近开始涨价,再下去可能又得找合租车了。

3. Infuse

买 Apple TV 就是因为它。通过 WebDAV 的方式,串联起 Docker 应用 Alist,观影起来确实方便。到期之后,又订阅了一年,只能说 Apple 生态必备。

4. Synology Photos

群晖此应用最近才上架 Apple TV,现在各个终端设备齐全了,一家人坐在电视前浏览照片还是很爽的。不过浏览视频的时候,需要在软件设置中开启 HTTP 播放,否则无法浏览。

5. Cheers

Bilibili 第三方客户端,目前可加入作者的 TestFlight。自己很少看 Bilibili,一般是找什么教程的时候,上去搜索下。

另外还有 HBOMAX、Disnep+、Apple TV 应用,但都必须得订阅,全部加一起还是不少费用,所以直接通过 Alist 串流阿里云盘观看自己想看的。

总结

由于自己喜欢观影,使用下来,这笔投资还是很划算。而且此类设备可多年不更新,所以性价比一下子就上来了。目前唯一的痛点就是,观看国内的爱奇艺、腾讯、优酷得退回电视系统,使用体验的割裂感就很强了,当然这个跟 Apple TV 没关系。

当时买的是 64G 版本,也不知道怎么想的,按照现在的使用情景,完全没必要,32 足已。

Synology 群晖 DS920+ 使用之旅

2023年2月9日 08:00
Synology 群晖 DS920+ 使用之旅

记不清是从什么时候开始了解 NAS 的,2021 年 4 月买过一台群晖 DS220+,使用几天发现折腾起来非常麻烦,直接给退了。时间来到 2021 年末,了解到极空间 Z4,于是买回来试试,发现系统极其易用,非常喜欢。但没用几天,品牌宣布发布新款。。。,于是退了老款,等新款发售。上架之后,第一时间下单,不知为何拷贝外接硬盘内容会断连,联系品牌工程师,一番测试也无法解决,只能选择退货。京东填写退货理由是质量问题,品牌售后联系说只能选七天无理由退货,如果选择质量问题,必须退回厂里先检测,无问题就原路返回有问题就给退换。。。。京东使用了这么多年,第一次遇到品牌这种操作,一下子对极空间的好感度降至零点,退了之后就不考虑了。

回到重新选择 NAS 上,了解了下威联通,性价比不错,但系统界面实在是无法欣赏,只能放弃。最后好像能选的品牌也就群晖了,基于一步到位原则,咬咬牙直接在淘宝授权商购自一台 DS920+~~

周边搭配

机器到位,对应的搭配组合:1.送的一条 4g 内存、一套防尘罩。2.三块希捷酷狼 4T 硬盘。3.两条三星 250g SSD。4.山特 850 UPS 不间断电源。

折腾之旅

准备就绪,经过一年多的折腾及稳定运行使用,满足了自己需求:数据备份、影视存储。目前主要使用的套件: Synology Photos

1. 存储管理器

三块硬盘使用逻辑:两块组 Raid 1,一块 Basic。重要数据存储在 Raid 上;极为重要数据,再通过 Hyper Backup 套件定期自动备份到 Basic 硬盘上,再定期备份到外置硬盘。影视、mac 系统备份,存储到 Basic 硬盘上。

两条 ssd,作为 Raid 1 的读写缓存。

2. Synology Drive

群晖的核心套件。电脑中日常工作存储文件夹通过 Synology Drive 连接,保存修改的同时自动同步备份到群晖。目前使用的笔记类应用也是选择直接存储本地的,这样就能实时备份到群晖,如:Typora、妙言。再通过 WebDAV 方式连接访问,以供其他终端设备显示。

3. Synology Photos

相册套件,跟 Eileen 两个人的手机,实时自动备份。套件的共享空间功能,能实时相互分享喜欢的照片。整体使用起来跟系统相册应用没什么差别。

4. File Station

这好像没什么说的,类似于 mac 下的访达、win 下的我的电脑,必用套件。

5. 迅雷

只要你是会员,下载速度还是杠杠的,有些资源电脑版本无法下载,但套件能下~~。很多人会用 PD、PT,然后通过 Docker 应用自动触发下载,发现自己平常也用不上。

6. Docker

使用 NAS 前不知道什么是 Docker,使用之后,只能说没了它,乐趣要少一大半~~目前使用的应用为 4 个: infuse影视墙

1. Alist

官方介绍:一个支持多种存储的文件列表程序。自己使用主要的作用是影视中转站:先把资源存储到阿里云盘 > Alist 连接阿里云盘 > Infuse 通过 WebDAV 方式连接 Alist,之后就愉快的观影。

2. Ddns-go

由于运营商的公网 IP 会实时变化,通过它可自动获取自己的公网 IP,并解析到对应的域名上。外网访问 NAS 必备。

3. Homeassistant

家里接入了不少小米系的智能设备,日常除了使用米家控制之外,可通过 Homeassistant 接入 HomeKit。如果是苹果的全家桶用户,使用起来非常方便,特别是打开 app 的速度比米家快了不知道有多少。

4. Vaultwarden

密码管理工具,Bitwarden 的轻量应用。数据存储本地,全平台使用,再也不用记该死的密码了。

总结

1.机器是真吸灰尘,放置环境为电视柜,在有防尘网的前提下,也必须是几个月停机清理一次。
2.硬盘运行的炒豆子声音,可能因为硬盘容量小、转速不高、机器下面也垫了缓存垫,且在有门隔绝的前提下,基本上可以忽略不计。
3.是不是应该使用四盘位,自己使用的情况看,发现是性能过剩了,220 其实已满足需求。

一年多使用下来,机器很满意。但目前市场上 NAS 品牌越来越多,如华为、绿联等,以群晖的高售价低配置,曾经“买系统送机器”的流传打趣,性价比越来越低,升级款 923,还是万年不变的千兆网口~~~

Hugo主题实现自适应布局, 及自定义字体

2023年1月28日 08:00
Hugo主题实现自适应布局, 及自定义字体

做事情的三分钟热度继续中,完善了博客的 归档 标签云 平常观看的影视页面及文章页评论、标签等功能。由于当下移动设备为我们主要的浏览窗口,所以页面需考虑在对应的终端设备中实际的浏览体验。

简单直接的方法,在页面样式表中添加@media,并在对应的尺寸范围中完善所需的样式:

@media (max-width:700px){
/* 浏览器宽度尺寸小于700所呈现的样式 */
}

@media screen and (min-width:700px) and (max-width:900px){
/* 浏览器宽度尺寸大于700小于900所呈现的样式 */
}

@media (min-width:900px){
/* 浏览器宽度尺寸大于700所呈现的样式 */
}

/* 根据每个页面实际的呈现需要,调整尺寸或自适应的分段需求 */

详细参数及解释参考: 利用@media screen 实现网页布局的自适应

扩展

之前文章中提到标题采用了"得意黑"开源字体,记录下如何自定义字体,在样式文件中添加:

@font-face {
  font-family: SmileySans; /* 名称自定义 */
  src: url('../fonts/SmileySans-Oblique.ttf.woff2') format('woff2');
  /* 建议采用woff2格式,以降低容量大小,提高加载速度 */
}

之后在需要调用此字体的样式文件中直接使用:

body {
  font-family: SmileySans;
}

结尾

博客所需的,整体折腾得差不多了,过程很有趣及兴奋,就连大年三十都在乐此不疲的折腾着~~。随着这个年也已过完,接下来的重点也是 2023 年重点,努力挣钱~挣钱~~挣钱~~~加油。

Hugo主题添加暗黑(夜间)模式, 并自动切换

2023年1月19日 08:00
Hugo主题添加暗黑(夜间)模式, 并自动切换

继续完善博客主题风格,折腾过程,备份记录留档。由于自己已习惯把终端设备外观设置成自动切换浅色或深色模式,为了夜间浏览体验,博客应该支持暗黑(夜间)模式。

以 hugo 关键词搜索主题应该怎么适配,相关资料很少,尝试到绝望之际,换成了英文关键词,最终 Atanas Yonkov 的" Adding Dark Mode to Hugo“拯救了自己,根据其教程,添加成功。虽不完美,但已实现,纠结两个问题:

  1. 暗黑模式下,点击链接加载都会白一下再变暗。
  2. 不会根据终端设备模式自动切换,需要手动点击。

尝试搜索解决,无果。之后发现 WorkPlusFE’s Blog 的” Dark Mode“教程,又是一番折腾,最终完美解决。最简单直接方式:在 hugo 样式文件中(如:style.scss)添加

@media (prefers-color-scheme: dark) {
/* 暗黑模式下css样式, 如: */
  body {
    background: #1A1718;
}
}

完善暗黑模式下的样式属性之后,终端设备在深色模式下会自动调用渲染主题暗黑模式下的样式表,反之浅色模式下就调用默认样式。

扩展

当然如果要做好暗黑模式,并不是简单的反黑白,需要不断尝试样式的各个配色方案,以寻求夜间浏览的实际体验。不过图片可以采用降低透明度的方式来缓解夜间过亮刺眼的问题:

@media (prefers-color-scheme: dark) {
  img {
    filter: brightness(0.8) contrast(1.2);
  }
}

感悟

由于自己并不懂技术,折腾博客过程中,想实现或者解决某一想法或问题时,都需要通过搜索引擎查阅大量的资料,花大把时间,最终才能勉强得以解决或者继续无解。这就是折腾过程中的乐趣,特别是实现或解决成功的那个兴奋欣慰感~~

Github自动构建Hugo, 并同步到腾讯COS, 同时刷新CDN缓存

2023年1月15日 08:00
Github自动构建Hugo, 并同步到腾讯COS, 同时刷新CDN缓存

博客逐步搭建完善,更新了日常使用的 App 硬件页面。博客样式标题采用了" 得意黑“开源字体。把二级域名改成一级,过程中发现 Cloudflare Pages 如果要绑定一级,须把域名的 DNS 服务器解析过去。解析之后,自己的 nas 访问变得不稳定,时不时的打不开,来来回回折腾了好几次,无解,只好改回去。 vercel 可以绑定一级,尝试之后,访问速度太慢,放弃。开始了解国内的云服务,学习到了对象储存、CDN,经过一番对比尝试,最终选择腾讯云的 COS 对象存储配合内容分发网络 CDN 搭建(主要它的 cosbrowser 界面是经过设计的 ᵔ◡ᵔ;客服也很负责,咨询问题会电话打过来详细教你如何操作)。

在了解部署过程中发现 Cyrus’s Blog 写的” 自动构建 Hugo 博客部署至腾讯云对象存储 COS 并刷新 CDN“教程,一番折腾,完美。感谢作者。
备份记录下过程: (详细的注释可查看 Cyrus’s Blog)

准备工作:

  1. 到腾讯云访问管理——访问密钥——API 密钥管理中,新建一个账户:访问方式改为"编程访问”,用户权限添加"QcloudCOSDataFullControl、 QcloudCDNFullAccess"。完成之后将生成的 SecretId、SecretKey 复制保存。
  2. 到 Github 新建一个仓库(私有公共都行),把自己 hugo 生成的站点源文件(不是 public 下文件)同步过去。
  3. 在刚创建的仓库——Settings——Secrets and variables——Actions,新建 SecretId、SecretKey、Bucket、 Region 四个密钥。其中 SecretId、SecretKey 为上面复制保存的,Bucket(存储桶名称)、 Region(所属地域 )在 COS 中存储桶列表中获取。

部署:

  1. 在 Github 仓库根目录,新建".github/workflows"文件夹,并新建 xxx.yml 文件,复制以下代码到文件里。作用:借助 Github Action 实现自动部署。
name: Build and deploy

# 自动触发构建

on:
  push:
    branches:
      - main

# 构建hugo及生产静态页面

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
          fetch-depth: 0

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: 'latest'
          extended: true

      - name: Build
        run: hugo --minify

# 上传到腾讯COS存储桶

      - name: Setup Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.9

      - name: Setup coscmd and sdk
        run: sudo pip install coscmd

      - name: Configure coscmd
        env:
          SECRET_ID: ${{ secrets.SecretId }}
          SECRET_KEY: ${{ secrets.SecretKey }}
          BUCKET: ${{ secrets.Bucket }}
          REGION: ${{ secrets.Region }}
        run: coscmd config -a $SECRET_ID -s $SECRET_KEY -b $BUCKET -r $REGION

      - name: Upload to COS
        run: coscmd upload -rfs --delete public/ /

# 刷新腾讯CDN缓存目录

      - name: Flush CDN
        env:
          SECRET_ID: ${{ secrets.SecretId }}
          SECRET_KEY: ${{ secrets.SecretKey }}
        run: |
          pip install --upgrade tencentcloud-sdk-python
          python flush-dns.py -i $SECRET_ID -k $SECRET_KEY          
  1. 在 Github 仓库根目录,新建 flush-dns.py 文件,复制以下代码到文件里,并将里面的"koobai.com"域名修改成自己的 CDN 加速域名。作用:通过 Python 脚本实现刷新 CDN 缓存,详细参数可参考 腾讯的调用 aip 文档
import json
import argparse
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import (
    TencentCloudSDKException,
)
from tencentcloud.cdn.v20180606 import cdn_client, models

# 传入参数
parser = argparse.ArgumentParser(description='-i <secretId> -k <secretKey>')
parser.add_argument('-i', '--secretid', type=str, required=True, help='secretId')
parser.add_argument('-k', '--secretkey', type=str, required=True, help='secretKey')
args = parser.parse_args()

try:
    cred = credential.Credential(args.secretid,args.secretkey)
    httpProfile = HttpProfile()
    httpProfile.endpoint = "cdn.tencentcloudapi.com"

    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile
    client = cdn_client.CdnClient(cred, "", clientProfile)

    req = models.PurgePathCacheRequest()
    params = {"Paths": ["https://koobai.com/", "https://www.koobai.com/"], "FlushType": "flush"}
    req.from_json_string(json.dumps(params))

    resp = client.PurgePathCache(req)
    print(resp.to_json_string())

except TencentCloudSDKException as err:
    print(err)

自此部署完毕,当有新文件上传到 main 分支,就会自动触发(hugo 生成静态文件——上传到 COS——刷新 CDN 缓存)。

查看是否部署成功:

  1. Github 仓库 Actions 下,查看构建记录
  2. COS 存储桶下的文件变动
  3. CDN 刷新预热下,操作记录——目录刷新

费用:

COS、CDN 费用(包含存储+CDN 回源流量+CDN 流量+HTTPS 请求等),个人站没什么流量,应该很低,跑一段时间看看。另外腾讯云也提供了六个月一部分免费试用~~

扩展:

因为博客源文件在 Github 里,可以利用 vercel 平台读取仓库也自动构建一个。如果使用的是阿里云域名 DNS 服务器,可以在解析请求来源选择"境外",“记录值"填写 vercel 平台绑定域名时所提供的。

这样国内网络访问的时候走腾讯 CDN,国外访问的时候走 vercel 平台所提供的节点。

十年弹指一挥间

2023年1月7日 08:00
十年弹指一挥间

最近脑子一直在想,是不是该搭个个人站,以展示日常工作项目,方便让潜在的公司了解,从而快速建立沟通。想着想着就往博客路线走了,离上次 2012 年搭建博客,时间过去了 10 年。细想这 10 年少了博客的日常记录,是少了点什么。虽然当下,能记录的平台、工具多不胜数,但博客始终是记录的动力。

于是,了解了一圈搭建工具,最终使用 Hugo,搭配 GitHub & Cloudflare来实现。搭建过程中,似乎找回了,十年前折腾博客的乐趣:选主题然后修改成自己中意的样子,很满足。

既然,博客已搭建,定位还是日常的生活记录(搭建过程中,翻出以前的博客备份记录,看着每篇文字,了解彼时写的感受,嗯,这应该就是记录的意义)。同时打算分享下: 日常使用的软件 平常观看的影视 喜欢折腾的物品等。

十年间个人的变化,体重从一个量级跃升到另外好几个量级,头发从中间快速的退去,到干脆剃光。之前 2013 年有篇博客记录 Eileen 刚怀孕几个月,初为父母的心理活动,到今天,女儿已 9 周岁多,三年级了都,时间确实是弹指一挥间。十年前,写着刚考完路试拿驾照,买车需要等到买房了才能想。十年后,不管好不好,目标至少都实现了。

十年后,事业好像回到原点,又到了以前的状态。希望 2023 年借由新的博客开始,也是新事业的起点。。。。加油。。。

入手机械键盘路程 & VIA改键注释备忘

2023年1月6日 08:00
入手机械键盘路程 & VIA改键注释备忘

2021 年 03 月在京东购买了京造 K2(Keychron K2),这是第一把机械键盘。同年 12 月购买了 sspai × Keychron 联名的 K3,买它就单纯觉得白色好看。到此,客制化三个字也没听过,时间到了 22 年 06 月,sspai × Keychron 联名出了 Q1,觉得配色也蛮好看,看介绍,才知道客制化概念,蛮有意思,于是买了这把 Q1 回来。

入手之后,从完全不懂,到开始改轴下垫、贴美纹纸、换卫星轴、数据线定制、VIA 自定义,还蛮有乐趣~

7 月份,见微博上有人说某个品牌一个小时卖了 6000 把键盘,这时才知道 Link 65。之后看到 ZOOM 65 R2 开团,几个特性促成了上车: 蓝牙、65 键 、带旋钮(用惯了 Q1 旋钮,非常方便)。

谈不上入坑,对雨滴、麻将、HiFi 等,也没感觉。更多是因为颜值~~ ZOOM 65

VIA 软件中的宏、any 使用注释备忘:

完整的按键对照表参考文档: https://docs.qmk.fm/#/keycodes
LGUI = 左 cmd 键,LALT = 左 option 键,LCTL = 左 control 键,LSFT = 左 shift 键
(缩写写法对应按键:G = CMD,A = Option,C = Control,S = Shift)

Mac 系统下 VIA 软件中的 Win = Command,Alt = Option

1. 宏使用(自定义按键)

左侧 MACROS 选项菜单为宏,宏对应 0-15 个按键
写法如:{KC_LGUI,KC_C},意思为 CMD+C
写法如 2:{KC_LGUI,KC_LSFT,KC_4},意思为 cmd+shift+4

2. any 键使用(更自主的自定义按键)

文档: https://docs.qmk.fm/#/feature_advanced_keycodes
写法如:G(KC_C) 意思为 CMD+C
写法如 2:SGUI(kc_4) 意思为 cmd+shift+4

3. any 特殊用法:键盘切换层 ( LAYER 0 1 2 3 )

使用方法文档: https://docs.qmk.fm/#/feature_layers?id=switching-and-toggling-layers

a. 单击切换层

写法如:TO(0) 或 直接在软件中选择 TO(0)按键。意思为单击进入键盘第零层

b. 按住(长按)切换层

写法如:MO(1) 或 直接在软件中选择 MO(1)按键。意思为按住(长按)进入键盘第一层,松开回到原始层

c. 按住(长按)为切换层,单击正常按键

写法如:LT(1,KC_C) 意思为按住(长按)进入键盘第一层,单击为字母 C

d. 按住(长按)为修饰键(可多个组合),单击正常按键

修饰键为:command、optio 等等
使用方法文档: https://docs.qmk.fm/#/mod_tap
写法如:MT(MOD_LGUI,KC_C) 意思为按住为 CMD 键,单击为字母 C
写法如 2:MT(MOD_LGUI|MOD_LSFT,KC_C) 意思为按住为 cmd+shift 键,单击为字母 C

4. RGB 灯效

文档参考: https://docs.qmk.fm/#/feature_rgblight

❌
❌