null
应顺肝之性,助益脾气
Photo by Iyus sugiharto / Unsplash
看到仓颉、小胡都在发,也做个整理。
记录一下过去一年的常用应用,明年此时再更新,观察是否有所改变。
📨 Mail Client: 用的企业微信自带的邮件功能。。
📮 Mail Server: 如上。
📝 Notes: 基本上抛弃其他笔记软件了,主要使用Obsidian,同时还能自动发布数字花园 「好奇心花园」。
✅ To-Do: 企业微信代办功能、Obsidian的TODO List。
📷 iPhone Android Photo Shooting: 使用 小米12s Ultra 系统自带相机。
🟦 Photo Management: OneDrive 和 Google Photos。
📆 Calendar: 企业微信日历,同时同步到手机端。
📁 Cloud File Storage: 使用Alist,搭配OneDrive、百度网盘、123盘等,Windows上的文件同步等还是主力使用OneDrive,同时使用Syncthing对手机和电脑的部分文件进行同步。
📖 RSS: Miniflux 和 follow。
🙍🏻♂️ Contacts: 使用系统自带联系人应用。
🌐 Browser: PC 端 Chrome,手机端 Via。
💬 Chat: 微信、QQ、Telegram 。
🔖 Bookmarks: 感兴趣的网站会存在 Memos 上,并打上对应的标签。
📑 Read It Later: 感觉这个需求对我来说是垃圾篓,所以没用。
📜 Word Processing: Obsidian为主,同时搭配 Notepad4。
📈 Spreadsheets: WPS的一个精简版本。
📊 Presentations: 没有这方面的需求。
🛒 Shopping Lists: 一般直接加到购物车里。
🍴 Meal Planning: 刷抖音、B站、小红书等跟着做,或者有想吃的菜去微信小程序「下厨房」找菜谱。
💰 Budgeting and Personal Finance: 一木记账,应为有自动记录功能,目前几乎所有出账都做了登记。
📰 News: follow,TG频道。
🎵 Music: lxmusic。
🎤 Podcasts: 我的听书。
🔐 Password Management: vaultwarden。
以下是小胡文章中提到的 extra categories 部分:
✈️ VPN: 路由器上MihomoProxy,移动端使用 FlClash。
😘 Blog Platform: Ghost+Astro+GithubAction的构建流。
⌨️ Text input: PC 端使用小狼毫搭配雾凇方案,手机端为小企鹅搭配雾凇方案,输入法方案为小鹤双拼。
📖 Translation app: Pot以及一些AI工具。
📚 Reading app: 微信读书。
🔧 Screenshot app: Pinx。
🌁 Image Hosting: 感谢又拍云联盟。
☁️ VPS Hosting: 腾讯轻量云。
Ending
null
夜爬峨眉山强度挺大的,不是那么好拿捏,不要被抖音、小红书给你洗脑了!
去之前一定要能理解爬20多公里的楼梯是个什么概念!
我应该不会再爬第二次了....!
上次写完行程规划之后,不知道是不是早上晨跑衣服穿少的缘故,我忽然得了重感冒。
那几天开始全身酸痛,同时伴有咽痛、咳嗽,而且连续两个晚上发烧 + 白天退烧,为了不影响 31 号的出发,所以请了两天假在家中休息,调养。
好在出发前的早上,感冒的大部分症状都痊愈了,但是还是能明显感觉到体力依旧还是没有恢复。但是行程、人员都已经确定好,可不能放大家的鸽子。
所以不管如何都要先把大家送过去,如果身体实在跟不上就放弃徒步上山,坐观光车上金顶去等大家。
在前面的行程规划一文中提到了当时确定要去的只有我、霜、小罗三人,我到时候打算开我台上不了台面的破 7 坐面包车过去,因此最好还是再找至少 4 人同行,以最大化平摊大家的费用,同时因为人多了后,玩起来也更有意思。
所以,出发前的几天我们就陆续在自己熟悉的圈子内寻找合适同行的队友,但是我这边进展不太顺利,频频碰壁,其中一个户外微信群居然还直接把我踢出群,不过我也庆幸被踢出去了,玩户外的这么小心眼即便在玩在一起也不会有多大意思。
好在小罗那边进展顺利,一直都有拉人进来,虽然其中有些朋友因为行程问题、装备问题赶不上,但是都非常好沟通,部分表示虽然这次不能参与,但是依旧期待下次同行。
最后,在出行前一天把终于把人员都确定好了,分别为:我、霜、小罗、太阳(兵哥哥)、vivi 姐、高兴哥、成歌。
31 号集合日当天,晴空万里艳阳高照,因为有成员担心赶不上日出,所以们把集合的时间提早了一个小时,也就是中午十二点。
我们是第二个到集合地点的,最先到集合地点的是小罗,她依旧穿着上次的淡绿色冲锋衣,装备齐全,精神头看起来不错。她男朋友这次有事,没有和她一起同行,小伙子倒还挺胆大的,也不怕女朋友被其他单身汉给挖走了,哈哈哈。
之后是成歌,是一位 50 多岁的大哥,湖北人,性格和蔼沉稳,非常好相处,脸上时刻带着和煦、云淡风轻的微信。他因为工作缘故经常在各地出差,又喜欢户外运动,所以经常在各地出差的时候就会参与当地的户外活动。别看大哥年纪上去了,可是个十足的老鸟,爬过的山都数不清了,还去冈仁波齐转过山。
然后是 vivi 姐和高兴就好哥,他们是两口子,年纪应该 40 左右把,装备齐全,透着一股子专业劲。高兴哥是退伍军人,平时喜欢摩旅,微信头像就是他摩旅的照片,非常帅。他们其实也去过非常多的地方旅行,但是这是他们第一次进行户外徒步。
最后就是太阳了,也是一个兵哥哥,性格腼腆,后续登山的时候也不爱参与拍照,而且他过来的时候把我们给惊呆了,原因是他居然没有登山包,拿的就是一个白色的大单肩挎包,也没有登山杖,雪爪等等,补给也就带了一盒饼干和一些能量饮料,他说没什么问题,他们当兵时再难的都体验过,我们想着实在不行山上也有的买,就到时候再说
了。
自贡出发到峨眉山只有 150 多公里,全程都是高速,一个多小时就能到,一路上阳光万里,倒也不觉得累,不多时就到了报国寺,还没进停车场就一大堆大爷大妈上来给我引导停车,一个劲的给我往另外一个山坡上引,估摸是当地的村民拉收入呢,我最后还是停在了报国寺的官方停车位上,贵了 5 元一天,停车场管理员还给我们送了一个红色的祈福带。
然后就是下车收整行李,因为没有住宿,其实大家带的东西都不多,唯一多的是这次在山上吃火锅需要用到的东西,一套一次性铝锅盒燃料,然后两大包食材,霜怕山上海拔高煮不熟,把牛羊肉、丸子都提前煮好了,上山后烫一烫便能开吃,我包里放了面饼,丸子、肉给经验、体力更好的成歌大哥,一次性铝锅给了高兴哥,我老婆则背上了香菜、蒜沫等配料。
然后我们便迎着 3 点的斜阳出发了。
传过停车场便来到一处广场,右侧是报国寺,我们在入口处拍了一个出发视频。
之后要步行 30 多分钟后到达雷音寺才算是正式开始爬山之行。
不过不要高兴太早,目前我们连检票处都还没到呢,接下来的十几个小时将会是无尽的楼梯与我们相伴,期间还会经过猴区、高山区。
现在有多兴奋,之后就会有多狼狈。
遇到的第一个红牛墙。
不知道是不是感冒刚好,还是因为冲锋衣没到,我穿的羽绒服散热不好的原因,体力消耗的非常快,才走了一个多小时就感觉自己被掏空了,只感觉浑身都是汗水,脚也重的抬不起来。
接近 5 点时到达圣水阁
山民搭建的原始蜂箱
到达清音阁,这边是一个分叉路口,分上行和右行两条路,上行是去往九十九道拐方向,另一侧则是去往报国寺方向。
经过猴区,峨眉山的猴子和地痞流氓差不多,会强抢你身上任何有颜色的饮料,塑料袋,零食,经过这里时最好拿衣服罩住你的包。
在这里把直接放在高兴哥背后的一次性铝锅接了过来,用的外套罩住,不然肯定要遭殃,不过因此我也没有余力带着我老婆了,中途被猴子隔开,等了她好久,着实是无奈之举,如果不护着锅,晚上可就没得吃了。
穿的老婆的羽绒背心,狼狈不堪
到达洪春坪,天色已经完全暗下来了,开始需要头灯照明,我也彻底红温了。
开始攀爬让人闻风丧胆的九十九道拐,垂直落差 300 米,迂回 2500 米,约有 1840 余石阶。
路上遇到了一只网红猫,入夜降温,估计它冷的不行,看我坐在椅子上,直接就跳到我身上来取暖。
晚上九点半,开始进入雪线。
到达财神庙门口,我的羽绒服内里已经完全打湿,我索性将衣服反穿,终于没那么闷热了。
霜的表现则完全不像是第一次爬山,一路上健步如飞,如履平地。
路上的其他登山者看到都不由纷纷侧目,不由发出大佬牛逼的惊叹,基本上都是她走到前面后等我爬上去,休息一会后再继续出发,期间为了帮我减重还和我互换了背包,我可是彻底成为了拖后腿的人了。
财神庙门口的阶梯
到财神庙这里我才发现我们的队伍已经分成了三个梯队,小罗、成歌一个梯队,已经远远跑在了前面,我、霜、太阳,我们三个则是第二梯队,后面则是 vivi 姐、高兴哥。
小罗太牛了,上次笔架山之行他们也是第一梯队,紧紧跟着向导,这次又没落下 ,和老驴成歌同步,这时我就不由感叹,年轻真好。
本来我们是打算在财神庙吃火锅的,但是因为我们第二梯队、第三梯队落后第一梯队太远,他们等了我们半个小时我们都还没到,所以他们去了下一个地方等我们。
我们在财神庙休息了半个小时,在出发后终于碰到了 vivi 姐他们,他们为了赶我们,都没在财神庙休息。
我们本来盘算着的是聚在一起后大家吃着火锅跨年,小罗、成歌他们在上面的遇仙寺等我们,我们估摸着还要个半个小时才能到。
但是此时已是夜晚 11 点 58,已经临近跨年,我们和 vivi 姐、高兴哥、太阳和路上爬山的小伙伴们都相继在拐角处停下,大家开始倒计时,等待着阳历新年的第一秒到来。
终于到达遇险寺,小罗、成歌已经等了我们半个多小时,表示这个地方太冷了,可算把我们盼来了。没有废话,直接去寺庙拿了热水,架锅,准备吃火锅。
当火锅底料放入锅内,滚烫的热水浇灌在底料上时,火锅的香味开始慢慢弥漫,寺庙门口的小广场上开始随着山风飘荡起了火锅的香味,接下来是放入牛肉、羊肉、牛肉丸、鱼豆腐、金针菇,把矿物油小炉子放在锅下,点燃后稍热便能吃了。
其他路过的小伙伴都不可思议的看着我们的锅,不少人还跑过来拍照,这一刻我们都感觉背着这么多东西爬山的辛苦都值了,哈哈哈。
最后吃完用火锅汤煮好的泡面后我们便接着出发了,目前已经爬了十多个小时了,还有七八个小时的路程在等着我们。
雪已经挺厚的了。
山上的光污染很弱,能看见不少星星
又一个难关:钻天坡
夜眺峨眉市
山上积雪覆盖的台阶,走多了都自然而然的变成了这种规律的小三角坑。
到达洗象池!这里开始精神、肉体能量已经双双见地,霜也有点顶不住了,说走路都是飘的。不少爬山客选择在洗象池的大厅里眯一会。
接着爬!碰到一个穿短裤的大佬,前面看他从山下往山上跑着登山,这会儿居然已经从金顶下来了了....从金顶....下来了,你敢信??
路过一个休息点,买了一个 10 元的苹果,12 元的八宝粥,18 元的冷量饮料。
这个休息站有火盆,本来想着顺便烘烤一下衣服,哪知道把羽绒服屁股后面的下摆烧坏了...。
眼神已经迷离、恍惚,坐下就想坐化...。
还有多久是每一个休息点老板回答的最多的问题,但是不用问都知道还有很久很久!
到!雷!洞!坪!拉!!!!
我们实在走不动了,选择坐缆车上金顶,雷洞坪到缆车那里工作人员说很近,一会儿就到,但是我们怎么就感觉始终走不到呢?
等索道的人们
在索道上能看到即将日出
大家互相祝贺新年快乐。
烧香祈福
金顶遥望雪山
看日出
专门买了个小旗子拍照
才发现我衣服还是反穿着呢。
勇闯天涯一下
最后再来点情绪照片
null
跨年时峨眉金顶日出和第一缕阳光
峨眉山官方图片
自上次笔架山之旅后,对山的渴望就像是心底深处的地下泉水被打通了一般狂涌而出。
前几天林老师他们又在群里谋划着去峨眉山夜爬 ,不过不巧的是他们的时间和赶不上,但是又被他们把瘾给钓了起来。
所以想着:「实在不行就我们自己去吧?」
而且又恰逢新年的这个节点,干脆去感受一下新年的第一缕阳光,并且虔诚的去拜拜菩萨,希望能赶走去年的坏运气,新的一年顺顺利利。
所以,有了以下的规划。
目前人员为我,老婆,小罗,目前还在招募队员中。
两步路助手路线图:2024-02-07 爬峨眉山(报国寺~峨眉山金顶)-GPS导航轨迹下载|行程线路图-步行轨迹-两步路
24 年 12 月 31 日 Day1
25 年 1 月 1 日 Day2
null
前些天收到了 品味苏州 小伙伴发来的明信片,非常欣喜。
在现在网络发达、信息快餐化的时代,能有一封经过漫长里程、时间送到你手上的信件,会更能体会到时间的味道。
因为我刚好有一台彩色打印机,每次出去玩了以后会习惯性把出行的照片精选一些打印出来放到相册里。这次在打印时我就在想:「既然我有打印机,那我能不能每次出去玩了以后自己做一些明信片寄给这些好友呢?」
所以昨天试着找了九张此次出行的照片,并调色打印,设计了一版,附上了临时想到的标语「现在网络太快,所以跨越千山而来的信件更值得我们等待和珍惜...」。
感觉效果好像还不错?
从左至右,从上到下,分别为1至9
所以,我也准备开启一个明信片互换计划。
各位小伙伴可以可以直接留言你的收件信息,并说明你要的图片序号,我会在看到你的留言后给你寄出。
我的博客已经开启审核模式,你们发出的信息不会直接公开展示,不用担心自己的信息泄露,我会在删掉你们的收件信息后通过留言审核,我会认真根据我对你的了解和想法填写后面给你的留言,祝好。
我需要第6张照片。
收件信息:
- 姓名:1900
- 地址:四川自贡xxxxxxxx
- 邮编:643000
另外;
家里没有打印机,也想自己做这种明信片的朋友,可以试着在淘宝、PDD找找代打服务,价格非常便宜,有众多模板可以选择,只需要简单把照片发给商家即可。
不知道能否号召大家一起参与这个活动,把自己的快乐,所看到的风景,想说的话传达给远在千里之外的另一个人。
谢谢。
null
因为经常有看到阿均哥在周末时间出去爬山,很是羡慕。
我其实也是非常喜欢户外运动的人,2014 年和朋友去过一次牛背山,2015 年去过一次阿合哈洛,其实这种集体户外出行有不少好处:
所以也想着自己能不能也经常这样出去玩一玩。
2014年牛背山徒步
2015年啊合哈洛徒步
所以向他询问了都是通过什么渠道找的出行队伍,后被告知是加入了当地的一些户外微信群,跟着群里的其他人一起出行的。
在那之后偶然在骑行群里看到其他骑友说周末要跟着户外群里的人去爬山,所以顺嘴说了一下,让对方拉我进群,然后一下就像是打开了潘多拉墨盒,东拉西拉的进了三四个户外群里,这才知道原来我们这个小地方也有这么多活跃分子,几乎每周都有组团出去玩的驴友。
这些驴友群的组员出行规则几乎都是统一的
因为行程有长有短,蹲了一两天后才加入了标题中提到的「笔架山冬季登山」活动。
景点介绍
笔架山位于四川理县,木卡羌寨前行 10 来公里左右,总徒步距离来回 14.47 公里,预计花费时间 5-6 小时左右,总爬升 1343 米,最高海拔 3766 米。上山后积雪覆盖,几乎没有路,可以说是一条完全的野生线路,有一名当地向导带路。
人员
本次出行原本是 10 人,后有两人临时有事放弃,最终 8 人出行,两对情侣,另外 2 男、2 女。平均年龄没超过 35 岁。
行程安排
费用
装备
冬季登山危险系数不比平日 ,所以装备一定要带齐全。我这次爬山除了没带登山杖,其他装备基本上都准备没有问题。
这次的行程其实终点的风景、餐食、住宿都算不上很好。
但是雪林穿越的体验是非常棒的,总共 1300 多米的爬升,而且后半段全是雪路,因为积雪覆盖,基本上已经看不到原来的路线了,我们一路在雪林里穿梭,都是现场开辟的路线,很多地方都要手脚共用才能爬上去,非常有挑战和刺激感。
而且这次出行认识了不少谈的来的本地朋友,如我们车的司机林老师、本地大学里的一对情侣小罗和小刘,出发和返程在车上的时间大家唠嗑渡过,一点也不觉得无聊和犯困。
不过这次行程难度对于我老婆来说挺大的。
因为之前她是不准备爬山的,而且她也没有户外经验,算是个小白,不过出行前我还是把她的雪套、雪爪一起带上了,怕万一需要上山。哪知道还真用上了,出发后当时另外一个也说在营地休息的人放鸽子没来了,现在只有她一个人在营地,挺没意思,索性就跟着我们一起上山了。
不过毕竟是小白,而且以前也没搞过户外,所以装备准备的不是很充分,没有冲锋衣裤,裤子这次就穿的普通牛仔裤,爬山途中遇到那些容易滑倒的地方都害怕的要命,都是屁股划着雪地走的,后半段的时候裤子有些地方就已经湿透了。
所以最后登顶的那一刻忽然就绷不住了,哭的稀里哗啦,她说就我们两个人在后面吊车尾,前面的人都走的很快,看不到了人,害怕的很,而且身上又冷,经常滑倒会觉得万一我们一不小心就滑到山下去,没准就死在山上。
在我看来其实整条线路都是在树林里,基本上没有悬崖峭壁的情况,即便是滑倒了也能很快抓住旁边的树枝,而且坡度都不是很大,风险是有,但是在我看来并不危险。
不过她在下山后回味起来又觉得特别有成就感,感觉好像瘾一下就起来了,还问我下次准备去哪里,哈哈。
途中和小伙伴们
营地和住宿
日出
烧烤小啤酒+篝火晚会
上山中
集体照
山腰+自拍
雪路
缓缓后美美自拍
Photo by Rubaitul Azad / Unsplash
以前刚玩博客的时候用的 Wordpress 作为博客系统,基本上都搭建在一些互联网的公益服务上,如今还记得就是 wpoak 这个平台,不过这些服务难抵时间漫长,大多因为成本问题关门大吉了。
所以之后开始自己买 VPS 进行博客程序部署,也开始慢慢重视起数据的重要性和自我保有。
刚开始 VPS 还是玩的非常简单,实例化完成后便用 lnmp 等程序一键装好 PHP 环境,然后下载上传 WordPress 安装程序便算完事了,后来接触的多了才知道 VPS 能做的事情元远不止于此。
后来我开始接触到 Docker,然后研究各种 Selfhost 的应用、服务。
昨天在夜未央的「浪费」一文中评论到:「对于很多普通用户来说基本上没有什么选择了,我们是喜欢折腾和了解,知道有什么渠道去找平替」。而后又在 Dayu 的「目前使用的自托管服务」一文中看到了他分享的 Selfhost 清单,所以这里索性也做一次分享,希望也能让更多的人用到这些开源、可控、好用的服务,利用起自己 VPS 上多余的算力资源。
我目前的 VPS 只有一个国内的腾讯轻量云。
配置为 2C2G4M,一年费用大概在 100 元左右,目前购买了 3 年,自托管的服务如下:
这是我目前使用的博客后端,Ghost 在国内算是非常小众的博客程序了。
我大概在 16 年开始使用 Ghost 作为博客系统,当时服务部署在百度的 BAE 平台上,「在百度开放云BAE上部署GHOST博客并配置七牛云」,后因服务不能在继续免费白嫖几经搬家,后落到现在的 VPS 上。
可以使用 Docker 或者 Ghost 官方的 CLI 程序安装。在以前的老版本时,数据库支持 SQLite,后来几经更新,现在在正式环境中只能使用 MySQL。
在早期时 Ghost 并没有提供评论功能,虽然在后续的迭代中增加了评论功能,但是在我看来不太友好,而且因为评论需要用户登录,其他使用 Ghost 评论功能的小伙伴反应,在迁移过程中需要额外进行会员数据、评论数据处理,所以我一直没有使用。
所以我最开始使用的自部署评论程序是 Twikoo ,但是因为这个项目更新在很长一段时间内停滞,且管理面板、功能过于简陋,几经尝试后换到了 Artalk。
Artalk 是国内大学生大佬开发的一款 Disqus 的第三方评论平替程序,开源,自部署,且功能十分丰富,更新也非常勤快,个人认为是一款非常完善的评论程序。
可以用 Docker 部署。
这个不用多说,声名远播的开源数据库,因为 Ghost 和后面其他的一些程序需要用到。
可 Docker 部署。
密码管理器我以前使用的是 LastPass 这个免费服务,但是在使用过程中频繁出现网络问题无法使用,而且管理面板没有中文,且某一次还出现了安全漏洞的问题,自那后我就切换到了 Bitwarden,在 PC 上通过浏览器拓展可以快速进行当前网站的密码填充。
但是因为想用密码泄露检测等服务,不过这些功能在官方的 Bitwarden 上都是需要付费使用,所以我开始使用了国外大佬基于 Bitwarden API 重新实现的开源密码管理程序 Vaultwarden,Bitwarden 中一些需要付费使用的服务在 Vaultwarden 上都能免费使用,搭配第三方的安卓端 Keyguard ,可以说颜值与实力并存。
密码管理器我是非常推荐每一个没用过的人使用的。
因为一些第三方网站管理员自身水平良莠不齐,可能会因为服务漏洞导致数据库泄露,此时如果你将常用密码用在注册这些网站上,届时你的其他重要服务被撞库暴力破解的风险将大大提升。
但是如果你使用密码管理器的随机高强度密码,只要在主密码没有泄露的情况下密码的情况下,即便数据库泄露了也不用担心被破解的风险,且因为在注册时使用的随机密码,即便第三方服务的数据库被泄露也不用担心被撞库。
Alist 是一个非常好用的网盘管理程序,因为太好用、用的人太多了,导致国内一些网盘实在承受不住,甚至不顾脸面将以前承诺的一些服务重新二次收费——没错,说的就是你「阿里网盘」。
Alist 可以在一个程序内管理你的大部分网盘服务,将他们集成在一起统一管理,并且通过 Alist 的一些拓展实现诸如公开分享、WebDav 等等,但是因为用的人实在太多了,而且很多影视程序也跟着上来薅羊毛,把网盘做成资源服务开放给其他人使用,导致这些情况的发生。
但是,即便这样,Alist 也依旧是一款非常好用的网盘管理程序。
Memos 是个非常好的 Flomo 平替工具,可以方便的进行卡片笔记记录,甚至你可以拿他当作微博、微博客来用也没什么问题,而且作者更新也非常勤快。
但是开发者时常进行 Break Change,我碰到的就有不下三次,导致我实在不敢继续再升级了,在某一次回退后彻底停留在目前使用的 v0.18.1 版本,好在那时的功能已经非常完善,即便不升级也不影响软件的后续使用。
google 统计的平替服务,之前部署在 Raliway 上,但是因为平台收费政策调整,只给 5 刀的免费额度,导致有一次超出额度,多交了 30 多元的费用后转移到 VPS 上部署。
一款用 Go 写的联邦宇宙实例工具,长毛象的超小型替代,但是我没有玩的太明白,使用过程中出现很多莫名奇妙的问题,暂时放弃。
一款开源的 RSS 阅读器,简单好用,没有多余的花哨功能。
洛雪音乐的同步服务,可以在手机、PC 端之间同步历史记录、收藏等等。
国内大佬开发的一款微信公众号转 RSS 订阅工具。
我用 Docker 部署了一个 Express 服务,用于博客上一些需要后端的小功能,如点赞、PC 状态同步等。
Docker 镜像更新服务,通过维护一个需要自动更新的 Docker 容器名称列表,实现对对应容器镜像的自动更新。
Photo by Emily Morter / Unsplash
雅余哥发起的调查,回答一波
1、你的博客更新频率是多少?
A.每周更新
B.一周数篇:基本上每周都有把。
C.一月1-2篇
D.几个月一篇
2、你的博客上次更新是什么时候?
A.本周:有节气这个系列在,基本上很稳定。
B.上周
C.上个月
D.上季度
3、你的博客文章是原创的吗?
A.坚持原创:都是自己写的,可能有部分引用的块。
B.部分借鉴
C.AI 帮我写的
D.搬运别人的,而且不署名
4、你觉得自己的文章对他人有帮助吗?
A.旨在对他人有启示
B.多少有点意义:技术文章偏多一点,多少应该会有点帮助把。
C.每日每周流水账
D.自我陶醉就好,管他呢
5、你上次换博客主题/程序是什么时候?
A.上周
B.上个月:最近才从11ty换到Astro
C.去年
D.凭良心说,我多年都是一个主题
6、你上一次捣腾博客主题代码是什么时候?
A.昨天,撸代码到凌晨
B.每周必捣腾:经常会折腾,就像狂热的钓鱼佬一样。
C.每月有那么一次
D.一年有那么一次
7、你会对博客主题进行二次开发?
A.直接配置使用,省心不折腾
B.时不时自己改改,搞点新花样,换图片,换字体,爽:自然是这个选项。
C.删除主题作者版权信息,改改样式,然后自我感觉良好
D.改得面目全非,但保留原作者版权信息或注明
8、你多久打开自己博客自我陶醉一次?
A.每天数次:基本上每天都会打开,看看评论之类
B.每周一次
C.看心情
D.一般都是照镜子,不看博客
9、你近期对自己博客域名什么感受?
A.想搞到一个 .COM 的域名
B.如果域名能再短几个字符就更好了
C.今年才换双拼域名了,明年再看看
D.目前挺好,没想法:没啥想法。
10、你每天都会看网站的流量统计吗?
A.每天看几次,今天又多了100PV
B.每周回顾,看看流量趋势
C.记得就看看:偶尔看看。
D.没有搞流量统计,都是浮云
11、你通过博客的广告赚到钱了吗?
A.有,能覆盖建站费用
B.有,但付出大于收入
C.没考虑通过博客流量赚钱:暂时没考虑
D.拒绝广告,保证阅读体验
12、你去浏览别人的博客/网站主要为什么?
A.学习别人分享的知识:友链多是生活型博客,看看别人活的咋样。
B.搬运别人的内容
C.看看别人怎么装修博客,自己也抄一下,感觉都比自己的好
D.不爱看别人博客,自己爱写啥写啥
13、看到别人分享了一篇文章,你打开第一反应是什么?
A.哇,这域名真不错,怎么我没想到
B.哇,这网站速度真快,图片延迟加载丝滑
C.哇,这程序/主题不错,我也要抄一抄/留言问问哪里搞的
D.看看文章内容:因为打开就会看到设计,所以一般都是先看到设计再看到内容。但是我认为内容更重要。
14、你觉得博客哪方面更重要?
A.域名
B.服务器
C.主题
D.内容:上一条回答了。
15、近期通过写博客有哪些新收获?
A.知识面有拓展
B.认识了新朋友
C.写作水平提升
D.通过知识变现
基本上都有。
Photo by AbsolutVision / Unsplash
最近Follow大火,虽然也在使用,不过我还是更喜欢miniFlux这种简单的阅读器。
之前从 yarr 切换到 miniflux 是因为 木木 大佬推荐的 miniflux 主题 Miniflux-Theme-Reeder,不过当时用了一段时间后发现各种不适,最后还是切换会默认主题,用了一段时间发现其实默认的miniflux已经非常好用了,不过需要做一点美化,所以简单做了一下调整,这里分享一下我的miniflux主题。
项目地址:https://github.com/rebron1900/mini-miniflux
主题就叫 mini-miniflux ,复制项目中 theme.css
文件中的样式或直接复制下面的css到miniflux中的 custom css
中即可。
:root {
--font-family: "Noto Serif SC", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--body-color: #efefef;
--body-background: #222;
--hr-border-color: #555;
--title-color: #aaa;
--link-color: #aaa;
--link-focus-color: #ddd;
--link-hover-color: #ddd;
--link-visited-color: #f083e4;
--header-list-border-color: #333;
--header-link-color: #ddd;
--header-link-focus-color: rgba(82, 168, 236, 0.85);
--header-link-hover-color: rgba(82, 168, 236, 0.85);
--header-active-link-color: #9b9494;
--page-header-title-color: #aaa;
--page-header-title-border-color: #333;
--logo-color: #bbb;
--logo-hover-color-span: #bbb;
--table-border-color: #555;
--table-th-background: #333;
--table-th-color: #aaa;
--table-tr-hover-background-color: #333;
--table-tr-hover-color: #aaa;
--button-primary-border-color: #444;
--button-primary-background: #333;
--button-primary-color: #efefef;
--button-primary-focus-border-color: #888;
--button-primary-focus-background: #555;
--input-border: 1px solid #555;
--input-background: #333;
--input-color: #ccc;
--input-placeholder-color: #666;
--input-focus-color: #efefef;
--input-focus-border-color: rgba(82, 168, 236, 0.8);
--input-focus-box-shadow: 0 0 8px rgba(82, 168, 236, 0.6);
--alert-color: #efefef;
--alert-background-color: #333;
--alert-border-color: #444;
--alert-success-color: #efefef;
--alert-success-background-color: #333;
--alert-success-border-color: #444;
--alert-error-color: #efefef;
--alert-error-background-color: #333;
--alert-error-border-color: #444;
--alert-info-color: #efefef;
--alert-info-background-color: #333;
--alert-info-border-color: #444;
--panel-background: #333;
--panel-border-color: #555;
--panel-color: #9b9b9b;
--modal-background: #333;
--modal-color: #efefef;
--modal-box-shadow: 0 0 10px rgba(82, 168, 236, 0.6);
--pagination-link-color: #aaa;
--pagination-border-color: #333;
--category-color: #efefef;
--category-background-color: #333;
--category-border-color: #444;
--category-link-color: #999;
--category-link-hover-color: #aaa;
--item-border-color: #666;
--item-padding: 15px;
--item-title-link-font-weight: 900;
--item-status-read-title-link-color: #666;
--item-status-read-title-focus-color: rgba(82, 168, 236, 0.6);
--item-meta-focus-color: #aaa;
--item-meta-li-color: #ddd;
--current-item-border-width: 2px;
--current-item-border-color: rgba(82, 168, 236, 0.8);
--current-item-box-shadow: 0 0 8px rgba(82, 168, 236, 0.6);
--entry-header-border-color: #333;
--entry-header-title-link-color: #bbb;
--entry-content-color: #999;
--entry-content-code-color: #fff;
--entry-content-code-background: #555;
--entry-content-code-border-color: #888;
--entry-content-quote-color: #777;
--entry-content-abbr-border-color: #777;
--entry-enclosure-border-color: #333;
--parsing-error-color: #eee;
--feed-parsing-error-background-color: #3a1515;
--feed-parsing-error-border-style: solid;
--feed-parsing-error-border-color: #562222;
--feed-has-unread-background-color: #1b1a1a;
--feed-has-unread-border-style: solid;
--feed-has-unread-border-color: rgb(33 57 76);
--category-has-unread-background-color: #1b1a1a;
--category-has-unread-border-style: solid;
--category-has-unread-border-color: rgb(33 57 76);
--keyboard-shortcuts-li-color: #9b9b9b;
--counter-color: #bbb --entry-content-font-weight: 300;
--entry-content-font-family: "Noto Serif SC", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
--entry-content-quote-font-family: var(--entry-content-font-family) --gray-100: rgba(196, 196, 196, 0.1);
--gray-200: rgba(196, 196, 196, 0.2);
--gray-500: rgba(196, 196, 196, 0.5);
--gray-700: rgba(196, 196, 196, 0.7);
--color-link: #84b2ff;
--color-visited-link: #84b2ff;
--body-font-color: #e9ecef;
--color-hover-link: #589ff2;
--btn-color: red;
--btn-bg: blue;
--icon-filter: brightness(0) invert(1);
--box-radius: 0.25rem;
--hint-color-info: #6bf;
--hint-color-warning: #fd6;
--hint-color-danger: #f66;
}
* {
font-family: var(--entry-content-font-family);
text-shadow: 0 0 .75px var(--gray-500);
}
main {
.item {
border-radius: var(--box-radius);
}
}
@media (max-width: 630px) {
body {
padding: 0 1.25rem;
}
.page-header{
margin-top: 1rem;
}
.header {
position: fixed;
bottom: 10px;
right: 10px;
#header-menu {
background-color: var(--alert-border-color);
padding: 10px;
border-radius: var(--box-radius);
list-style: none;
}
}
}
.entry-content {
line-height: 1.8;
> :first-child {
margin-top: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: bolder;
line-height: 1;
margin-top: 1.5em;
margin-bottom: 1rem;
a.anchor {
opacity: 0;
font-size: 0.75em;
vertical-align: middle;
text-decoration: none;
}
&:hover a.anchor,
a.anchor:focus {
opacity: initial;
}
}
h4,
h5,
h6 {
font-weight: bolder;
}
h5 {
font-size: 0.875em;
}
h6 {
font-size: 0.75em;
}
b,
optgroup,
strong {
font-weight: bolder;
}
a {
color: var(--color-link);
text-underline-offset: 0.3em;
&:hover {
color: var(--color-hover-link);
text-shadow: 0 0 0.75px var(--color-hover-link);
}
&:visited {
color: var(--color-link);
}
}
img {
max-width: 100%;
height: auto;
border-radius: 0.25rem;
}
code {
padding: 0 0.25rem;
background: var(--gray-200);
border-radius: 0.25rem;
font-size: 0.875em;
}
pre {
padding: 1rem;
background: var(--gray-200);
border-radius: 0.25rem;
overflow-x: auto;
position: relative;
code {
padding: 0;
background: none;
color: white;
}
}
p {
word-wrap: break-word;
margin-bottom: 1.3rem;
}
/** adapter ghost callout cards **/
blockquote,
.kg-callout-card {
margin: 1rem 0;
padding: 0.5rem 1rem 0.5rem (1rem - 0.25rem);
border-inline-start: 0.25rem solid var(--gray-200);
border-radius: 0.25rem;
color: var(--gray-700);
font-style: italic;
word-break: break-all;
:first-child {
margin-top: 0;
}
:last-child {
margin-bottom: 0;
}
}
table {
overflow: auto;
display: block;
border-spacing: 0;
border-collapse: collapse;
margin-top: 1rem;
margin-bottom: 1rem;
tr th,
tr td {
padding: 0.5rem 1rem;
border: $padding-1 solid var(--gray-200);
}
tr:nth-child(2n) {
background: var(--gray-100);
}
}
hr {
height: 1px;
border: none;
background: var(--gray-200);
}
ul,
ol {
padding-inline-start: 2rem;
word-wrap: break-word;
}
dl {
dt {
font-weight: bolder;
margin-top: 1rem;
}
dd {
margin-inline-start: 0;
margin-bottom: 1rem;
}
}
.highlight table tr {
td:nth-child(1) pre {
margin: 0;
padding-inline-end: 0;
}
td:nth-child(2) pre {
margin: 0;
padding-inline-start: 0;
}
}
details {
padding: 1rem;
border: $padding-1 solid var(--gray-200);
border-radius: 0.25rem;
summary {
line-height: 1;
padding: 1rem;
margin: -1rem;
cursor: pointer;
}
&[open] summary {
margin-bottom: 0;
}
}
figure {
margin: 1rem 0;
figcaption p {
margin-top: 0;
}
}
}
Photo by Bruno Martins / Unsplash
因为Windows系统字体渲染太垃圾,而我又没需求换4k,所以需要用到其他工具对字体进行渲染。而MacType自然是Windows平台的不二选择,我使用的时间估计已经有10年了把?
以前在XP、Win7上都能很完美的渲染,但是Windows10开始陆续出现了一些程序渲染不上的问题,
期间在MacType的仓库里发了一个求助issue 为何微信中FontSubstitutes替换雅黑后字体会直接失去所有渲染呢,有回答的人说通过注册表模式可以正常渲染,但是我进行了尝试后死活没有效果,Maple-font的作者也遇到了和我同样的问题 Segoe UI Variable
似乎无法替换。
不过昨天因为 Windows11 LTSC发布了,我重新安装系统后对MacType进行了尝试,发现似乎是因为火绒的问题导致无法进行渲染 火绒 6.0 导致 MacType Version 2024.8.15 无法渲染 ,在进行了很多次尝试后发现不单纯是因为火绒的问题,即便在开了注册表模式下有些配置文件依旧无法正常渲染、替换,尝试了很久终于总结了一套对于我来说可行的全局渲染、热替换方案。
根据Snow大佬的解释,因为Windows11系统安全的原因在其他目录可能无法加载dll,但是C盘的 Windows
目录和 Program Files
目录除外,所以我们要将程序装在 Program Files
中。
火绒系统加固里在「自动处理」中给下面几个程序开启「关键进程规则」下所有选项,「文件规则」下的「系统任务目录」
因为Windows11安全引导的问题,新版本的MacType取消了在设置向导中开启注册表模式的选项,但是可以通过手动导入、设置注册表的形式启用。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"AppInit_DLLs"="MacType64.dll"
"LoadAppInit_DLLs"=dword:00000001
"RequireSignedAppInit_DLLs"=dword:00000000
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Windows]
"AppInit_DLLs"="MacType.dll"
"LoadAppInit_DLLs"=dword:00000001
"RequireSignedAppInit_DLLs"=dword:00000000
我之前一直用的自己改的一个配置文件,但是这个配置文件之前我用MacType服务模式时也有一些莫名奇妙的BUG,比如微信中输入框里的字体无法渲染。
因为喜欢比较厚重的字体,这次测试我首先使用MacType服务模式对所有的配置文件进行测试,找出一个渲染风格是我喜欢的配置文件,最后选中了 XMac.LCD.Default.ini
这个配置,然后开启MacType注册表模式不断的修改配置、重启进行测试,最终找到了一个能正常渲染的配置。
在这个配置文件中我只将 Segoe UI Variable
字体热替换成了 Maple UI
,这部分可以根据使用需求进行任意热替换。
; Only for MacType (NOT SUPPORT THE OLD VERSION OF GDI++/HE)
; maxchow@qq.com
[Preview]
Font=Tahoma
Color=$990088
Text=卍 XMac.LCD 默认设置
Size=12
Align=Center
[General]
Name=XMac.LCD.Default
Icon=XMac\XMac.ico,0
;【自动挂钩子进程】
;[0:Disable] 1:Enable
HookChildProcesses=1
;【字体微调】
;0:Normal 1:NoHinting 2:AutoHinting 3:Light+AutoHinting
HintingMode=1
;【抗锯齿方式】
;-1:Disable 0:Normal 1:Light 2:LCD(RGB) 3:LCD(GBR) 4:Light-LCD(RGB) 5:Light-LCD(GBR)
AntiAliasMode=2
;【常规体调整】
;-32:+32
NormalWeight=14
;【粗体字的调整】
;-16:+16
BoldWeight=2
;【斜体字的倾斜角度微调】
;-16:+16
ItalicSlant=0
;【只有在FontLoader=0(在下面)时此项设置才有效。建议选0,选1会占用大量内存,也没看出有什么好处。】
;0:Disable 1:Enable
UseMapping=0
;【Gamma模式开关】
;-1:关闭;0:使用设置的Gamma值(GammaValue);1:使用sRGB的Gamma值;2:不明
GammaMode=0
;【Gamma值】
;GammaMode=0的时候此项设置才有效
;sRGB ≒ 2.2 CT-Default = 1.4
;windows的cleartype的Gamma值是1.4
GammaValue=1.4
;【对比度】
;数字越大越锐利,数字越小越发虚
Contrast=1.0
;【字体轮廓】
;数字越大字体就越粗越黑
RenderWeight=1.0
;【文字边界设置】
;数字越大越强调背景(类似文字边界被侵蚀的感觉),强调背景会有中字体锐利的感觉。适当降低对比度,提高TextTuning,可以使文字周围的颜色看起来“淡一点”
;再加上RenderWeight,把这三个设置的微妙平衡调节好的话,能得到不输给Mac的效果
;0:12
;AntiAliasMode=1时,通过TextTuning分量来调节
TextTuning=0
;AntiAliasMode=2时,通过TextTuning的RGB分量来调节
TextTuningR=0
TextTuningG=0
TextTuningB=0
;【字体加粗模式】
;对NormalWeight和BoldWeight有效
;0:Weight值大时横向加粗,值小时双向加粗,主要是避免Weight值过大时,模式3中在小字号时加粗过度出现斩头的现象;
;1:总是横向加粗;
;2:总是双向加粗,也就是freetype本身的粗体渲染。
;注意:通过加大GammaValue、TextTuning的值,可以减少Weight值过大的造成的效果问题,即可以在BolderMode=2时也可以避免转接头
BolderMode=0
;【字体的载入方法】
;(注意是载入方法,不是渲染方法)
;0:用freetype载入字体
;1:用windows的绘图核心载入字体
;很多freetype的设置需要此项选0才能生效
FontLoader=0
;【字体链接】
;当FontLoader=0时
;0:什么都不做;
;1:使用注册表里的字体链接设置,通过FreeType的字符表进行查找
;2:使用注册表里的字体链接设置,使用Windows的转换函数直接查找
;当FontLoader=1时
;会保持启用的状态,但是所有字体链接的处理会交由WIN32API完成。
FontLink=2
;【字体替代】
;当FontLoader=0时
;0:什么都不做;
;1:安全替换方案(兼容性较好),根据以下FontSubstitutes的配置进行替换;
;2:完全替换方案(效果较全面,如替换后出现乱码,请尝试使用1),根据以下FontSubstitutes的配置进行替换;
;当FontLoader=1时
;会保持启用的状态,但是所有字体替代的处理会交由WIN32API完成
FontSubstitutes=2
;【让freetype处理的最大的字体尺寸,单位是像素,0的话就是全尺寸】
;交付 gdi++ 处理的最大尺寸(单位为像素)
;0-2147483647
MaxHeight=0
;【阴影设置】
;格式:水平偏移,垂直偏移,深色文字的阴影透明度(0-100),深色文字的阴影颜色,浅色文字的阴影透明度(0-100),浅色文字的阴影颜色
;颜色值格式:BBGGRR
;Shadow=1,1,30,FFFFFF,20,000000
;【液晶显示器的优化配置】
;[0:None] 1:Default 2:Light 16:Legacy
LcdFilter=2
;【微调LcdFilter】
;LcdFilter>0,且AntiAliasMode>-1时,该微调才生效
;这5个值分别代表文字笔划中从左到右的笔划浓度,最小为0,最大为255
;注释掉这个参数则恢复使用
;LcdFilter=1,默认值为“16,64,112,64,16”
;LcdFilter=2,默认值为“0,85,86,85,0”
;LcdFilterWeight=20,80,120,80,20
;【字体缓存、内存的设置】
LoadOnDemand=1
CacheMaxFaces=256
CacheMaxSizes=33554432
CacheMaxBytes=67108864
EnableKerning=0
;【强制使用某一个字体】
;无视所有其他字体,全系统的字体都会被这里设置的字体代替
;ForceChangeFont=华文中宋
;【优先使用点阵】
;小于指定字号的文字将优先使用内嵌点阵
MaxBitmap=0
; DirectWrite 支持;DirectWrite support
DirectWrite=1
[DirectWrite]
;渲染模式,0=默认,1=锯齿,2=经典,3=经典自然,4=自然,5=自然对称,6=字体原型
RenderingMode=6
;Gamma值,不写则根据上面的GammaValue自动计算
GammaValue=1.5
;对比度,默认为1
Contrast=1.0
;抗锯齿程度,默认1
ClearTypeLevel=1
[Individual]
;【单独设置的字体】
;格式=Hinting, AAMode, NormalWeight, BoldWeight, ItalicSlant, Kerning
XSong=,,28,0,,
XSong SimSun=,,28,0,,
XSong NSimSun=,,28,0,,
XSong Sharp=,,28,0,,
XSong Sharp.SimSun=,,28,0,,
XSong Sharp.NSimSun=,,28,0,,
XSong Harmony=,,28,0,,
XSong Harmony.SimSun=,,28,0,,
XSong Harmony.NSimSun=,,28,0,,
XSong Classical=,,28,0,,
XSong Classical.SimSun=,,28,0,,
XSong Classical.NSimSun=,,28,0,,
XSong Tradition=,,28,0,,
XSong Tradition.SimSun=,,28,0,,
XSong Tradition.NSimSun=,,28,0,,
宋体=,,28,0,,
新宋体=,,28,0,,
SimSun-ExtB=,,28,0,,
仿宋_GB2312=,,28,0,,
仿宋=,,28,0,,
华文仿宋=,,28,0,,
华文宋体=,,28,0,,
华文中宋=,,28,0,,
Batang=,,28,0,,
MingLiU=,,28,0,,
MingLiU-ExtB=,,28,0,,
PMingLiU=,,28,0,,
PMingLiU-ExtB=,,28,0,,
PMingLiU_HKSCS=,,28,0,,
PMingLiU_HKSCS-ExtB=,,28,0,,
MS Mincho=,,28,0,,
MS PMincho=,,28,0,,
[Exclude]
;【除外的字体】
[ExcludeModule]
;【不渲染的程序,但仍会加载DLL】
[ExcludeSub]
;【排除不替换字体的程序】
;以下程序不会被进行字体热替换
;===== Office =====
;EXCEL.EXE
;POWERPNT.EXE
;WINWORD.EXE
[UnloadDll]
;【不渲染的程序,同时完全不加载DLL】
fontview.exe
MainType.exe
AxureRP.exe
FontCreator.exe
FontCreator.cn.exe
notecaselauncher.exe
notecase.exe
gnucash-bin.exe
bleachbit.exe
Fontforge_TC.exe
Fontforge_SC.exe
Fontforge_EN.exe
NexusFont.exe
dwm.exe
[FontSubstitutes@firefox.exe]
;【字体替代】
;系统在调用“=”前面的字体时会忽视“=”前面的字体,而去直接调用“=”后面的字体
;Fixedsys=XHei NSimSun
SimSun=XHei SimSun
@SimSun=@XHei SimSun
NSimSun=XHei NSimSun
@NSimSun=@XHei NSimSun
[FontSubstitutes]
;【字体替代】
;系统在调用“=”前面的字体时会忽视“=”前面的字体,而去直接调用“=”后面的字体
Segoe UI Variable=Maple UI
Segoe UI Variable Small Light=Maple UI
Segoe UI Variable Small Semilight=Maple UI
Segoe UI Variable Small=Maple UI
Segoe UI Variable Small Semibold=Maple UI
Segoe UI Variable Small Bold=Maple UI
Segoe UI Variable Text Light=Maple UI
Segoe UI Variable Text Semilight=Maple UI
Segoe UI Variable Text=Maple UI
Segoe UI Variable Text Semibold=Maple UI
Segoe UI Variable Text Bold=Maple UI
Segoe UI Variable Display Light=Maple UI
Segoe UI Variable Display Semilight=Maple UI
Segoe UI Variable Display=Maple UI
Segoe UI Variable Display Semibold=Maple UI
Segoe UI Variable Display Bold=Maple UI
Segoe UI=Maple UI
Segoe UI Semilight=Maple UI
Segoe UI Semibold=Maple UI
Segoe UI Black=Maple UI
Segoe UI Light=Maple UI
null
等了这么久,默杀终于上流媒体平台了。
恰逢假期,家里也来了客人,中午吃了饭便和家人们一起认认真真看看完了这部电影。
不似一些其他电影对内在观点输出的含蓄,默杀这部电影则是非常直给。而标题「沉默的霸凌施暴者们」是我总结的默杀这部片子导演想传达的观点。是呀,「默杀」这个名字和电影封面上每个人的状态不正是最好的阐述吗,同时电影中非常多的直给镜头都在赤裸裸展现。
在影片的前半部分间断呈现的「霸凌」画面中,我们能看到所有相关人员的冷漠旁观,而他们都是这场悲剧的酿造者。
首先那几个施暴的女同学自是不必说,罄竹难书,说她们是未进化的动物动也不足为过,其次从校长,普通的同学,校园保安,方老师,房东,这些人在事件发生之后的选择及冷漠更是成了帮凶。
在看这部影片的时候我的姨妈恰好讲了一个这样的故事,
她在商场经营了几家服装店,这几家服装店都处于商场内,而门店旁边都是另外的老板开的娃娃机店,因为现在的娃娃机店都是自助式,没有营业员,所以平时需要有人打扫卫生,整理娃娃。我姨妈便和对方商量了,说承包下他们的这些工作,每天负责打扫的人给于50元补贴,其实我小姨的想法是看工作简单,想给员工捞些外快,她一分钱也没有赚。
因为工作其实非常简单,每天去一次,简单扫一下地,重新补充一下空掉的娃娃机就好了,其中一个门店有一个姐姐认为的确很简单,所以每天都积极的干这个工作,这也影响了同门店的其她同事,最终大家都抢着做这项工作。而另外一个门店有人则觉得工钱太少,工作很麻烦,导致没有一个人愿意去做,然后那个店的承包工作只能无奈放弃了。
这个小故事中两个门店所表现的选择不恰好贴合了默杀这部电影的故事内核吗?
如果故事中的这些人,能和第一个门店中的姐姐们那样,这些人中哪怕只有一个人能放下冷漠、事不关己的心态做出正确的选择,这个故事的结尾至少都不会这么悲剧。
其次是中国儒释道三家观点中时常提到的「因果」。
在这个短短的故事中,所有人都在种下自己的因,也都纷纷吃下了由这个因得出的不同程度的「果」。
另外小涵最后在监狱的画面我认为是「中国电影审核哲学」的影响下造成的,不纳入这个清单里,我更相信的是小涵已经逃离。
电影中多次出现了白鸽,我个人认为这是影片对正义、正确的具象化。
最后在天台上,林在福完成了自己最后的使命,看着这起事件的所有相关人员围在一起,他们好似忽然将自己曾经的冷漠抛的无影无踪,背靠着无可匹敌的正义对着他口诛笔伐。
在福露出了嘲讽的微笑,转身没有丝毫犹豫的跳下了高楼,坠落的半空中,数十只白鸽飞起,好似托着林在福一般,而这在传统港片中只有在正义的英雄出场才会有白鸽飞舞的场景。
而这里,是为 英雄 来福送别。
司法体系的缺失让这一切发生,所以在福已经不相信法律,也认为自己的作为没有必要受到法律制裁,他所做一切都是发自内心,对于夺取那几个女孩子的性命心中自是也有愧疚,所有源自存从自己内心的价值观以死偿命,但是他不愿接受这已经畸形的司法体系的审判,和这些施暴者们的口诛笔伐,所以遵从自己真正的正确,自我了结。
校园霸凌是全球所有学校都存在的普遍现象。
我可以肯定在所有学校,至少我的小、初、高、大的学业生涯中全都有。所有班级中都有那么一两个弱势者会或多或少的被班里的坏孩子、强势者欺凌,虽然大多数情况下并没有影片中表达的这么极端,但是对那些孩子所造成的伤害依旧是不可磨灭的。
我们作为这些旁观之人,如果都能伸出援手,这些悲剧可能就不会发生了,至少不会让一切都变得没有余地...。
想起电影「第二十条」中的一句台词:「所有正确的事情都是有代价的,但不能因为有代价就不去做。」
愿世上处处都有白鸽飞舞...。
Photo by xiaoyu xie / Unsplash
在写完 馄饨、饺子和抄手 一文后发现回忆是真的很美好。
人们总说要向前看,向前看,未来会更加美好!所以总是回忆过去是不是说明当下过的并不好呢?
虽然这个论点并不充分,但是至少我这段时间想把自己归在这类情况中去。
人们在越是在困苦、迷茫、无助的时刻越是想下意识通过这些美好滋润干涸的心河,引导我们行进的方向,人在不断的进化过程中演化出了这种能力,虽然这种做法在有些人看来确实有些「鸵鸟效应」、「掩耳盗铃」,不过对我来说却也不全是望梅止渴的行为。
中国有句俗语「人生不如意十之八九」这个说法,好在还是有这「一、二」可以追求,因为任何事情都没有绝对的说法,他就像没开盒的「猫」,我们得给自己留一条退路,很多极端的人正是因为把这最后一条路也断了,而做出后悔一辈子的决定。
当然,我们也不能一直沉静在这些记忆里不出来。
毕竟和强心针一样,回忆所带来的美好是有时效的,在那个激励后的短暂余韵里,也是我们该重新迈步向前的时候。
然后,努力生活。
为了下一个「可能」的止步不前,生产另一支强心针。
Photo by Antonio Vivace / Unsplash
因为Ghost只提供文章的 HTML 代码,不提供 Markdown 的问题导致我曾经一度想更换CMS系统。但是将近800篇文章的转移工作十分麻烦,而且之前也尝试过用一些工具处理,无一都失败了,问题多是因为古早之前的很多文章存在格式问题,无法通过一些 HTML to Markdown 工具的转换规则,所以这个事也就一直没下定决定弄。
不过不影响我寻找下一位有动力让我这么做的CMS继任者。
最近发现了两款CMS工具,分别是:
基于Github的CMS系统有很多,我所知道的就不下四五款,比如有: statamic/cms 、keystonejs/keystone 等。
在周报里我也提到过,我是在Astro的CMS推荐列表中看到了KeyStatic,并在昨天花了一点时间体验了一下,整体体验还是不错的,总结如下。
现在的CMS系统都设计都好强悍呀!昨天刷到蜗牛大佬Star了一个叫 pocketbase 的开源内容管理系统,程序是用Go写的,基于SQLite数据。
管理全在网页上进行,虽然结构简单,但是API、权限、功能拓展什么的都一应俱全,相当哇撒了。
因为官方没有自带slug生成的功能,所以我跟着官方文档写了个转换脚本,很有意思。
onRecordBeforeUpdateRequest((e) => {
const pinyin = require(`pinyin`);
const title = e.record.get("title");
const titleToSlug = (title) => {
const pinyinTitle = pinyin(title, {
style: pinyin.STYLE_NORMAL, // 普通风格
heteronym: false, // 不使用多音字
})
.flat()
.join("-"); // 将拼音数组转换为字符串并用短横线连接
return pinyinTitle
.trim() // 去除首尾空格
.replace(/[\s]+/g, "-") // 将空格替换为短横线
.replace(/[^\w\-]+/g, "") // 删除非字母数字和非短横线字符
.replace(/--+/g, "-") // 替换多个短横线为一个短横线
.replace(/^-+|-+$/g, ""); // 去除首尾的短横线
};
// 示例用法
const slug = titleToSlug(title);
e.record.set("slug", slug);
}, "posts");
官方提供的event hook也相当多,能玩出非常多的花样。
目前唯一的疑惑是为啥不提供markdown格式的fields呀?
至于换不换CMS,还是准备再蹲蹲。
前几天在 你好Astro! 中提到想把Obsidian的文章集成在博客中来,并实现CMS和Obsidian之间通过Wikilink的互相引用。
不过因为Ghost的API只提供了文章的HTML字符串,Remark衍生的WikiLink插件肯定都是无法使用的,而且目前Github上能找到的WikiLink相关的案例基本上都是整对于Markdown语法去解析的,对于我来说基本上没什么参考价值。
所以我只能走另外的路子了,不过方法无非就是以下几种
昨天晚上我倒是找到了 loveminimal 大佬写的一个姑且能用方案,但是这段代码有个不大不小的缺陷,就是正则会将所有标签内的 [[]]
内容都进行解析转换,所以 pre
代码块内的内容也会被解析成Wikilink,这意味着会无法控制的出现在任何你可能不想他出现的地方,所以目前这种方案暂时待选。
const wikilinks = (innerHtml) => {
let _innerHtml = innerHtml;
if (_innerHtml.indexOf('[[') > -1) {
let _re = /!\[\[(([\/\-\.\*\$\&]|\w|\s|[^\x00-\xff])*\.\w+)\s*\|?\s*(\d*)\]\]/g;
let _str = _innerHtml.replace(_re, '<img src="/$1" alt="$1" width="$3" />');
// 2. 后匹配替换链接
let _reLink = /\[\[(([\/\-\.\*\$\:\#]|\w|\s|[^\x00-\xff])*)\|?(([\/\-\.\*\$]|\w|\s|[^\x00-\xff])*)\]\]/g;
// let _strLink = _str.match(_reLink);
// let _strLink = _str.replace(_reLink, '<a href="$1">$3</a>');
let _strLink = _str.replace(_reLink, (val) => {
val = val.replace(/[\[\]]/g, '');
let _arr = val.split(/\s*\|\s*/);
let _relLink = _arr[0];
let _desc = _arr[1] ? _arr[1] : _arr[0];
// 检查链接描述是否包含 #锚点,形式有(我们假设当前文章名称为 test ,它有一个章节 ttt):
// - 2.1. 孙子兵法#军争篇 - 此类可以正常识别
// - 2.2. cpu-是如何制造出来的#18.-等级测试 - https://example.com/cpu-是如何制造出来的#18.-等级测试 ,
// 此类锚点中包含特殊符号 `.` ,在新标签中打开,且无法正确定位到锚点
// - 2.3 test#ttt - https://example.com/test#ttt 默认会在新标签页中打开,需要优化为在当前页面滚动
// - 2.4 #ttt - 不能正常,会翻译为 https://example.com/#ttt ,丢失了当前页面路径
let _idx = _desc.indexOf('#');
if (_idx > -1) {
// 2.4
if (_idx == 0) {
_relLink = location.pathname.slice(1) + _desc;
} else {
// 2.3
_relLink = _desc.replace('#', '/#');
// 2.2
_relLink = _relLink.replace(/[\.\、]/g, '');
}
}
// console.log(_arr);
// console.log(_desc);
// return `<a href="${_arr[0]}">${_desc}</a>`
return `<a href="/${_relLink.replace(/\s/g, '-').toLowerCase()}">${_desc}</a>`;
// });
});
return _strLink;
}
};
这个方式就是在Nodejs里将HTML字符串虚拟化成DOM,再去对DOM进行操作,虽然理论上可行的,但是效率应该是极低的,这个我是不愿意使用的,所以直接排除掉了。
真的没有其他方案了吗?
我今天这样想着,抱着试一试的心态换着各种关键字在Github上搜索,运气不错的让我找到了这个个库:html-parse-stringify ,他可以将html字符串快速抽象成一个AST语法树,我的想法是通过遍历这个语法树来找出文本内容,再反序列化成html字符串不就好了?
所以我试着按着我的思路写了个Demo,好像的确可行,而且还可以配置那些情况下包含的 [[]]
不进行渲染。
import HTML from 'html-parse-stringify';
var ast = HTML.parse(page?.html); // [!code highlight]
let fatherList = '';
function findTextNodes(node, text) {
let result = [];
fatherList += text; // 记录节点路径
// 检查当前节点,并做wikilink的识别和路径排除,这里做排除名单应该很方便
if (node.type === 'text' && node.content.startsWith('[[') && !fatherList.endsWith('precode')) // [!code highlight]{
node.content = node.content.replace('[[', '<a>test').replace(']]', '</a>');
result.push(node);
}
// 如果有子节点,递归遍历
if (node.children) {
node.children.forEach((child) => {
result = result.concat(findTextNodes(child, node.name));
});
}
return result;
}
const result = [];
ast.forEach((node) => {
const temp = findTextNodes(node, node.name);
let fatherList = '';
});
const html = HTML.stringify(ast);
这是我目前能找到的最优方案了,不过这个方案应该也是偏向于解析成dom,不过这个库没有进行更多消耗资源的操作,应该是比传统的解析库性能更优秀的。
[[note2]]
[[note4]]
[[note6]]
[[note7]]
[[note8]]
https://cms.1900.live/ni-hao-astro/
测试一下文字包裹[[note9]]后的解析情况
已经初步完成联动,目前的考虑的策略顺序如下,
博客中
Title
一致的文章Obsidian中
如Obsidian中的 About
这篇文章,在博客中以 [[About]]
写入,最终文章内就会解析成 [[About]] 。
因为Astro的本地路由都是基于网站根目录,所以我们只要将博客和Obsidian的文件分别进行静态生成,并在生成过程干涉 [[]]
的转换成 <a href=''><a/>
标签,然后给出正确的slug,便可以很方便的实现SPA形式的页面跳转。
完。
Photo by Andrew Neel / Unsplash
骑行路上
1. 种的辣椒 2. 骑行路上
Dura
?是柔软、纯洁的意思,好像是乌克兰语?#知识
来自 x
在推上看到一个改善脖子前倾动作的视频,试了一下挺有效果,不过要长期坚持才行。
地址:x.com
#设计
来自 ?
偶然发现的一个博客平台,他们默认提供的主题风格多是纯文字极简风格,简洁大气,找不到设计灵感的时候可以参考一下。
#网站
来自 ?
偶然发现的一个全球范围热门景点的在线视频监控网站,不过国内的公开摄像头比较少。
网址:实况摄像头 马尔代夫-库雷杜 | SkylineWebcams
#工具
来自 Github
优化TV操作的SurfBoard,懂的都懂。
项目地址:GitHub - getsurfboard/surfboard
GitHub - getsurfboard/surfboard
#工具
来自 Github
一款基于bilibili的在线音乐播放器。
Eno Music 是一个基于 bilibili 的音乐播放器,完全改变了你在该平台上的体验。它重新构想了 bilibili 作为一个音乐平台的样子,并提供了独特而沉浸式的体验。
项目地址:GitHub - cloudflypeng/eno-music
#工具
来自 Youtube
一个可以通过3D打印制作的多功能桌面手机支架,emmm,应该说桌面时钟更贴切?
#网站
来自 ?
无意间找到的一个拥有各种五花把门加载效果的CSS网站,在线预览,及拿及用。
网站地址:The Classic CSS Loaders Collection
null
在2024年3月份,我正式将Ghost博客作为无头CMS使用,并搭配SSG工具生成静态页面 。
其实在当时的技术选型时其实已经考虑过Astro,当时的Astro的版本号还是3.x,不过因为自己的技术不够成熟,编码思路还一直是Ghost时期的handlers这种模板结构,尝试多次无果后最终还是选择了11ty作为网站的生成工具,并撰文 新主题11ty-book 分享了当时的成果。
不过这段时间我都有在不间断的重新查阅Astro的文档,思考该如何用Ghost搭配它,希望能用上这个热门的网站生成器。
事情的转折点是前几天发现 Astro-remote
这个插件,它提供的组件能加载HTML字符串或远程Markdown文件,渲染成网页内容,并在这个过程中还可以对HTML元素使用Astro的组件进行替换,这意味着可以不再用之前在11ty中那样,用 JSDOM
这个库通过通过虚拟DOM进行操作 eleventy/transforms/parseContent.js 。
之后我便根据自己的思路写了几个Demo,以前困扰的几个点似乎都能解决
所以没有犹豫,在9月2号就开始了移植工作。
这段时间,我边看文档边学习、实现、思考,得益于我在11ty-book上花费的时间和对Node.js逐渐了解,以前看不懂的Astro代码忽然像是顿悟般的或霍然开朗,明白了组件形式和之前11ty时传统模板形式的区别,和意义。
Astro的开发体验的确很棒,这也是我之前在选型11ty之后依旧还对Astro念念不忘的原因。
高速的迭代频率,优秀的设计语言和活跃的开发群体让这款工具一直充满着活力,得益于官方全站的中文文档,而且手册十分详尽,让我在实际开发过程中能少走了不少弯路。
终于在昨天,一共历时七天,我终于将11ty-book的功能移植了个80%作用,并提交了第一个正式版本到了Github。并在昨天晚上正式切换到了Astro版本的huog-book。
开源地址:https://github.com/rebron1900/astro-book/
不过目前以前还有一些问题还未来得及处理,现在还有一些构思等待实现:
发现自己这些年在折腾博客这条路上越走越远。
从以前的博客大巴只会转发文章,到后开始学习编程,开始SelfHost Wordpress,开始满世界找主题、找插件优化博客,到现在我已经能流畅使用JavaScript,Node.js、Python等工具进行代码开发,之前还自己实现了一个在博客显示博主状态服务 将博主PC上使用的应用信息实时显示到博客,体验了一把Socket和服务端的开发,那时候还狂妄的想着「自己是不是已经可以前后端一把梭了?」,哈哈。
虽然13年前毕业后我没有从事IT工作。
但是我热爱编程,我喜欢编程,我喜欢互联网蓬勃的生命力。并且不同于需要拿找饭吃,我更多是处于喜欢、兴趣使然,基于这个初心去学自己感兴趣的技术,并在折腾的路上学以致用。
我很满足,也很开心,希望我20年后依旧初心不改。
Thks。
Photo by Avonlea Jewelry / Unsplash
刚刚看到雅余哥发布了一篇 Obsidian 和 WordPress 我都用什么插件 的文章,遂也想分享一下我的Obsidian所用的插件,而我没用WordPress,所以就分享一下Windows上的一些工具把。
先聊聊Obsidian,其实笔记软件我用过很多了,从Trilium到Logseq再到Obsidian,我换软件并不因为那款软件不优秀,相反,他们都非常有自己的特点,只单纯是因为我的笔记习惯发生了改变,Trilium和Logseq的优缺点我之前的文章中也有细碎的提起过,不过和本篇文章主题不搭就放待下次再说把。
先说说主题把。
最开始使用的Obsidian主题是Minimal,一款非常简洁的主题,热度一直也都是名列前茅,不过在 JUSTFUN 周刊:第四期 时我分享了我在B站发现的新主题 Border ,Border同样也是一款简约风格的主题。
但是不同于Minimal的极简,Border的配色要略微活泼一点,且同样拥有丰富的自定义选项,并对一些插件做作了适配,而且我非常喜欢卡片样式的布局,在调整好后会让我有一种协调的舒适感,记笔记也更有动力了。
主题地址: GitHub - Akifyss/obsidian-border: A theme for obsidian.md
归功于Obsidian的用户数量,这让它的第三方插件生态非常强大,可玩的花样非常多,我以前启用的插件多的时候二三十个,近些年来回归本心,渐渐弃用了很多插件,明白要合理利用工具,别捡了芝麻丢了西瓜。
这里以插件在Obsidian列表中出现的先后顺序列出把。
#统计
ActivityWatch 是一款跨平台的统计软件,他可以帮你统计花费在电脑、手机、编辑器上的时间,并提供了正则分类,目前我已经使用几个月了,改天单独分享一下它的使用体验。
而是aw-watcher-obsidian 则是能帮你统计你在Obsidian的各个笔记上所花费的时间的插件,同样它还有VSCode的版本。
#增强
这个很多应该都用过,粘贴链接可以自动获取链接的Meta信息,生成Markdown格式的链接。
#插件
Obsidian上的TestFlight,有些插件没有上架Obsidian的官方商店就需要靠它安装和更新跟进。
#管理
日历插件,在侧边栏中显示日历,最近好像有一些支持农历的日历插件。
#增强
可以在Obsidian里嵌入任意网址,比如可以在Obsidian嵌入你的Memos服务。
#增强
Obsidian里的SQL,强大的自定义查询可以实现非常多功能,不过我玩不太会,现在只用了一些最简单的特性。
#增强
可以很方便的在Obsidian插入书籍信息,搭配Templater还可以实现自定义格式的书籍信息。
#增强
给笔记加上TOC,有些主题会单独为它适配样式。
#增强
给文件夹创建笔记,我这里主要是搭配Waypoint生成MOC。
#同步
将Obsidian库同步到Github上。
#管理
让Obsidian拥有看板功能,对于任务管理,项目推进等非常有用。还能联动其他插件,功能强大。
#格式
Obsidian的笔记格式化插件,功能非常非常强大,可以细微到各个Markdown元素的处理,而且有了它Pangu插件也可以不用了。
#美化
让无序列表拥有Callouts的样式,支持自定义
#美化
在右下角增加一个图标,点击即可快速切换Snippets的启用状态
#管理
搭配 Calendar 可以生成周记、月记、年记等。
#增强
显示你最近打开的笔记记录
#美化
主题增强,大部分主题的个性化设置都要同过这个插件实现。
#增强
可以在Obsidian中打开网页,就像浏览器那样。
#增强
我用它在FolderNote中生成MOC导航,非常好用。
#增强
可以将笔记库导出成可以部署的HTML,支持Canvas,关系图谱,主题等,非常强大,之前我用它分享过我重庆行的旅行规划。
平时用的工具比较多,这边挑几款我必备的分享
#统计
可以统计你在Windows上各个软件中所花费的时间,同时有Obsidian、VSCode等插件,可以辅助统计这些平台的使用数据,并通过图标进行展示。
#图片处理
截图工具,替代了以前的Snippets,Snippets有的它都有,没有的他也有,就是首次启动会比较慢一些,也只是相对比较慢而已。
#工具
可以像Mac一样,通过空格快速预览各种文件
#工具
通过快捷键唤起搜索框,可以快速实现计算器、文件搜索、图片转换等,之前弃用过一段时间,后来又用了回来,u1s1,还是非常好用的。
#工具
多平台快速互发文件,简单好用。
#工具
桌面整理工具,刚发布就开始用,后来收费了,买了付费版,不想花钱也行,最后那个版本也能用,我付费是纯属支持工作了。
#工具
Windows任务栏自定义工具,可以恢复传统的多功能开始菜单,建议入个正,淘宝上不贵,盗版的有时候在Windows更新后会出BUG。
#浏览器
这个没啥可说的,必备工具,用的Hibbiki 编译的版本。
#工具
IDM的平替免费下载工具
#工具
文件搜索神器,几乎都是必备了把?
#工具
Notepad++替代工具,Windows记事本替代工具
#工具
Windows应用卸载程序,卸载完后还能帮你清楚注册表和一些文件夹。
#工具
速度非常块的看图工具,由于替代Windows默认看图器。
#影音
一位大佬做的PotPlayer带解码的小白包,非常好用。
#输入法
输入法,不用多说。
Photo by Jandira Sonnendeck / Unsplash
之前在 服务器重装设置指南 一文中分享了关于初装VPS后的一些列的优化操作,其中分享了一个数据的备份脚本,通过丰富的配置项即可实现文件、mysql数据的多版本备份策略,备份策略参见下放列表:
用尽量少的空间备份足够容错的数据备份,并通过rclone等工具同步到其他网盘或储存空间之上。
但是最近忽然发现这个脚本似乎没有正常工作,当时是通过ChatGPT生成的备份脚本,可能存在某些问题,在排查日志时发现是因为路径问题导致脚本中断。
所以今天又用AI重新对脚本做了修复和优化,目前能正常工作了,如果有需要的朋友可以拿去体验。
#!/bin/bash
set -e # 遇到错误停止执行
set -x # 打开调试模式
# 自定义变量
CUSTOM_HOME="/home/username" # 可以根据需要修改为其他路径 // [!code highlight]
# 设置参数
BACKUP_DIR="$CUSTOM_HOME/backup" # 备份数据的存放文件夹 // [!code ++]
TARGET_DIR="$CUSTOM_HOME/data" # 需要备份的数据文件夹 // [!code --]
DATABASES=( "database_prod" ) # 需要备份的mysql数据库列表
ZIP_PASSWORD="password" # 压缩包密码
DATE=$(date +"%Y%m%d%H%M%S") # 日期格式
MYSQL_CONTAINER_NAME="mysql" # mysql容器的名称
TEMP_HOME_DIR="$CUSTOM_HOME/backup_tmp" # 临时目录
TEMP_BACKUP_DIR="$TEMP_HOME_DIR/backup_temp_$DATE" # 临时目录名称
LOG_DIR="$CUSTOM_HOME/backup_logs" # 日志文件存放目录
LOG_FILE="$LOG_DIR/backup_script.log" # 输出日志
# 创建日志目录
mkdir -p "$LOG_DIR"
# 创建日志文件
touch "$LOG_FILE"
# 日志记录函数
log() {
echo "[$(date +"%Y-%m-%d %H:%M:%S")] $1" | tee -a "$LOG_FILE"
}
# 创建目录
create_dir() {
mkdir -p "$1"
log "Created directory: $1"
}
# 复制 .my.cnf 文件到 Docker 容器
copy_my_cnf() {
if ! docker cp "$CUSTOM_HOME/.my.cnf" "$MYSQL_CONTAINER_NAME":/root/.my.cnf; then
log "Failed to copy .my.cnf to Docker container $MYSQL_CONTAINER_NAME"
exit 1
fi
}
# 复制数据到临时备份目录
copy_data() {
if [ -d "$TARGET_DIR" ]; then
cp -r "$TARGET_DIR"/* "$TEMP_BACKUP_DIR"
log "Copied data from $TARGET_DIR to $TEMP_BACKUP_DIR"
else
log "Target directory $TARGET_DIR does not exist"
exit 1
fi
}
# 导出数据库
export_databases() {
for MYSQL_DATABASE in "${DATABASES[@]}"; do
SQL_FILE="$TEMP_BACKUP_DIR/${MYSQL_DATABASE}_backup_${DATE}.sql"
if ! docker exec "$MYSQL_CONTAINER_NAME" sh -c "mysqldump --defaults-extra-file=/root/.my.cnf $MYSQL_DATABASE" > "$SQL_FILE"; then
log "Failed to export database $MYSQL_DATABASE"
exit 1
fi
log "Exported database $MYSQL_DATABASE to $SQL_FILE"
done
}
# 创建加密压缩包
create_archive() {
ARCHIVE_NAME="backup_${DATE}.zip"
if ! zip -r -P "$ZIP_PASSWORD" "$BACKUP_DIR/$ARCHIVE_NAME" "$TEMP_BACKUP_DIR"; then
log "Failed to create backup archive"
exit 1
fi
log "Created encrypted archive $BACKUP_DIR/$ARCHIVE_NAME"
}
# 清理过期备份
cleanup_old_backups() {
log "Cleaning up old backups"
find "$BACKUP_DIR" -type f -name "*.zip" | while read -r backup_file; do
backup_date=$(basename "$backup_file" | grep -o -E '[0-9]{14}')
if [ -n "$backup_date" ]; then
backup_epoch=$(date -d "${backup_date:0:8} ${backup_date:8:2}:${backup_date:10:2}:${backup_date:12:2}" +%s)
current_epoch=$(date +%s)
diff_days=$(( (current_epoch - backup_epoch) / 86400 ))
if [ $diff_days -ge 365 ]; then
log "Deleting backup $backup_file older than 365 days"
rm "$backup_file"
elif [ $diff_days -ge 150 ] && [ $(( diff_days % 150 )) -ne 0 ]; then
log "Deleting backup $backup_file older than 150 days but less than 365 days"
rm "$backup_file"
elif [ $diff_days -ge 90 ] && [ $(( diff_days % 90 )) -ne 0 ]; then
log "Deleting backup $backup_file older than 90 days but less than 150 days"
rm "$backup_file"
elif [ $diff_days -ge 30 ] && [ $(( diff_days % 30 )) -ne 0 ]; then
log "Deleting backup $backup_file older than 30 days but less than 90 days"
rm "$backup_file"
elif [ $diff_days -ge 3 ] && [ $(( diff_days % 3 )) -ne 0 ]; then
log "Deleting backup $backup_file older than 3 days but less than 30 days"
rm "$backup_file"
fi
else
log "Could not extract date from $backup_file"
fi
done
}
# 主执行流程
log "Backup script started"
create_dir "$BACKUP_DIR"
create_dir "$TEMP_HOME_DIR"
create_dir "$TEMP_BACKUP_DIR"
copy_my_cnf
copy_data
export_databases
create_archive
log "Removing temporary backup directory $TEMP_BACKUP_DIR"
rm -rf "$TEMP_HOME_DIR"
cleanup_old_backups
log "Backup completed and expired backups cleaned"
Photo by Austin Distel / Unsplash
1. 被晒死的小树 2. 蚂蚱
1.近和远
#工具
来自 @vikingmute
在 X 上看到推友分享的一款基于 Google 地图的日本动画、游戏景点的标记地图,在地图上面看到了不少之前看过的动画作品的取景地,部分还有现实和作品中的对比图。
而且不仅仅是日本,其他国家的地点也都有,而且还开放 PR,可以自行提交数据。
刚刚去搜了一下黑神话,标点已经都有了。
官方网站:动画巡礼 - anitabi - 圣地巡礼 - 聖地巡礼 - せいちじゅんれい - 神奇海螺试验场
项目地址:动画巡礼 · GitHub
#ChatGPT
来自 博客群
忘记是谁提的了,有人在问 ChatGPT 那里充值便宜,有人便说 DuckDuckGo 提供了免费的 4omini 服务。我便去看了一下,的确有,就是只能在线使用,没有 API 服务,可能需要自备梯子使用。
之后可以再关注关注,应该会有大佬搞 API 代理之类的。
目前支持的模型有:GPT-4o mini
、Calude3 haiku
、LLaMA 3.1 70B
、Mixtral 8x7B
。
官方网站:AI Chat
#开发
来自 hyoban
前些天在群里和大家讨论博客系统,聊着聊着就提到了 xLog,当时想着不知道可不可以用 xLog 作为无头 CMS,前端用 Astro?
当时看了一下 Astro 的官方手册,CMS 集成部分没有提到 Astro,便自己去搜了一下,在 hyoban 大佬的博客里看到了 Sakuin 这个库,提供了很直观的 xLog 的调用 API,还能借助 API 实现评论功能。
项目地址:GitHub - hyoban/sakuin: SDK for XLog
#学习
来自 Itsuki Lin
在推上刷到一个大佬说想用 100LS
学习法学习外语,便好奇搜了一下,发现这是一种语言学习方式。
100LS 簡介
100LS 是韓國作者 Richard Jang 的著作「我在 100 天內自學英文翻轉人生:跟讀電影成為英文口說高手」裡面介紹的學習英文方法。 這個方法簡單來說,就是透過 100 次大量的 L(Listening)和 S(Speaking)去聽讀英文電影或影集,紮實練好英文的方式。
#工具
来自 Astro
在 Astro 的 CMS 集成页面发现了这个工具,这是一个基于 Github 的 CMS 系统,你可以免费将他部署在 Netlify、Vercel 上,实现 CMS 的效果。
看了一下开发者相关的视频,使用体验还是很棒的,目前基础功能已经很完善了,不过不知道附件以后会不会提供上传到 R2或者其他储存服务上的适配呢?
官网地址:Keystatic
项目地址:GitHub - Thinkmill/keystatic: First class CMS experience, TypeScript API, Markdown & YAML/JSON based, no DB
#工具
来自 小众软件
一个很有意思的小工具,可以实现边打字便将你的文字翻译成英文的工具。使用 AHK 开发。
功能
网站地址:【自荐】实时打字翻译软件 - 发现频道 🔎 - 小众软件官方论坛
#工具
来自 蜗牛大佬
可以在线生成 2.5D Logo SVG 的工具,能对视角、线条、填充色等进行丰富的自定义。
网站地址:Isocons
#工具
来自 蜗牛大佬
羊毛党狂喜。
Cloudflare 推出了 Cloud Connector,是一个对象存储聚合类的服务,统一接入然后分流到各家 s3,现在支持 4 家。这不是白嫖党狂喜啊,这里薅 10G 那里薅 10G,然后变成 20G 了。 (有也不少多云 CDN 聚合。)
文档地址:Cloud Connector | Cloudflare Rules docs
#工具
来自 小胡
小胡分享的一款 Windows 的桌面美化工具,可以实现类似 MacOS 的 Docker 栏和 Linux 上的顶部状态栏。
安装体验了一下,觉得 BUG 还是有点多,而且功能还不完善。
但是未来可期。
#工具
来自 @jrenc2002
大佬写的一个非常酷炫的小服务,通过带参数的网址访问即可实现酷炫的动态签名效果,不过目前只支持纯英文字母,数字和中文都无法调用。
更改链接中的 name=
后面的内容即可。
Photo by Domingo Alvarez E / Unsplash
❤️❤️❤️
在前文 使用动态 Emoji 一文中提到了我是如何添加动态Emoji表情到Artalk中的。
但是,最近发现有一些朋友可能会直接通过输入法输入Emoji,而我的文章中也经常会使用Emoji,这导致了很多可以动的Emoji没有动起来。
所以又在这个上面拓展了一下,这次把文章内、Artalk评论用户自己输入的Emoji也全都做了替换。
构想的实现步骤如下
根据以上构思结合Kimi,得到了以下代码,代码功能和使用方式直接通过注释写在下方代码块中。
//定义一个替换函数,接受一个需要替换的Node数组
function replceEmoji(list){
// 定义获取Emoji的正则
const emojiRegex = /([\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2694-\u2697]|\uD83E[\uDD10-\uDD5D])/g;
// 使用fetch请求emoji.json
fetch('/assets/emoji.json')
.then(response => {
// 首先检查响应状态
if (!response.ok) {
throw new Error('Network response was not ok');
}
// 解析JSON数据
return response.json();
})
.then(data => {
// 将数据存到变量中
let emojis = data;
// 遍历传入的Node元素
list.forEach(function(el){
// 通过正则获取所有emoji
let finds = el.innerHTML.match(emojiRegex);
// 没找到数据则跳过本次循环
if(!finds){return}
// 遍历所有找到的emoji
finds.forEach(function(i){
// 看这个emoji是否有动态版本
let temp = emojis.items.find(item => item.icon === i)
if(temp){
// 如果有就替换成img标签
el.innerHTML = el.innerHTML.replaceAll(i,"<img class='book-emoji' src='"+ temp.val +"'/>")
}
})
})
})
.catch(error => {
// 处理任何在请求过程中发生的错误
console.error('There was a problem with the fetch operation:', error);
});
}
// 将所有文章进行替换
replceEmoji(document.querySelectorAll('.post'));
// artalk评论加载完毕的回调
artalk.on("list-loaded", function () {
// 为所有评论替换emoji
replceEmoji(document.querySelectorAll('.atk-body'));
})
Photo by Brett Jordan / Unsplash
1. 小路 2. 缸里的黑美人睡莲的花
#工具
来自 x
在刷 x 时发现的一款基于 Ai 的桌面分类整理工具,效果看起来还挺不错的,Windows 实现起来应该并不困难。
官方网站:Sparkle
#工具
来自 Github
一款基于 Ruby 开发的脚本工具,可以用来管理 Rime,实现自动部署,无痛升级配置等等,全平台支持。
项目地址:GitHub - Mark24Code/rime-auto-deploy: Rime输入法安装脚本,让一切更轻松。Make using Rime easy.
#工具
来自 Memos广场
刷广场时看到immm大佬在体验这个笔记工具,试着用小程序端体验了一下,也是基于卡片笔记,倡导使用语音输入,并通过AI进行整理,目前还是免费测试阶段。
不过国内的笔记软件可以先体验看看,仔细考量好后再考虑用不用。
官方网站:Get笔记 - 记录每一个闪光的想法
#工具
来自 Github
用你的CF来进行网站Favicon的代理访问,解决很多公开API经常失效的问题,还算比较简单实用的。
项目地址:GitHub - seadfeng/favicons-proxy
Demo地址:Favicons Proxy - Easy Favicon Integration for Any Website
#工具
来自 TG-小企鹅输入法群组
偶然看到小企鹅群组内有人又在问Rime的九宫格输入,群里的开发大佬指路说可以看看雨燕输入法,好奇去搜了一下,发现是另外一个基于Rime定制,支持九键、全拼、双拼、手写、火星文等方案、支持悬浮、单手、数字行等键盘模式的中文输入法。
我安装测试了一下,似乎不能支持Rime的配置和词库?而且界面设计不太喜欢,先再观摩观摩把。
项目地址:GitHub - gurecn/YuyanIme: 雨燕拼音输入法-一款基于Rime定制开发的九键、全拼、双拼、手写、火星文等方案、支持悬浮、单手、数字行等键盘模式的中文输入法
#工具
来自 Github
我经常需要给相关部门交资料,对于盖章这块确实是觉得挺烦的,恰好看到这个工具,先收藏一下,以后应该用的上。
选择需要盖章的PDF文件或文件夹。 选择保存文件夹。 导入完整的印章图片,工具会根据PDF页数做随机分割。 设定印章大小,骑缝章位置,印章位置等 点盖章,骚等后在保存文件夹中即可看到盖好骑缝章的PDF文件。
项目地址:GitHub - flytkgl/PDFQFZ: PDF加盖骑缝章的小工具
#知识
来自 王子云的博客
在刷订阅时看到王子云更新了一篇关于百香果的趣味知识,因为我也比较喜欢吃百香果,所以点进去看了一下,颇有收益,遂分享到周刊内。
博客地址:百香果你知吗?
#工具
来自 V2ex
以前经常要转换Word、音频之类的,Google上搜到的网站要不都是广告,要不就是转换完后下载需要收费,很是困扰。这次偶然间发现了这个十分干净,没有什么额外收费的转换工具。
官方网站:Free File Converter Online - AnyConv
#工具
来自 Google
贴入你需要正则的文本,然后点选你想要的数据,会自动根据AI生成匹配的正则语法,虽然实测下来准确率稍低,但是还是十分有参考价值的。
网站地址:Regex.ai - Artificial Intelligence Regular Expression Generator
Photo by Henry & Co. / Unsplash
最近被好友推荐了一本肖复兴老师的散文集「正是橙黄橘绿时」,肖老师在自序中介绍到标题引自苏轼的「一年好景君须记,正是橙黄橘绿时」,所以书内皆是关于肖老师近些年来的美好回忆,整本书充满着温馨、温暖的味道。
我虽与他有些年龄差距,他所书中所提之事皆是他壮年时期所发生的,与我而言却是幼年时期,但是也能产生共鸣,唤起我那些温暖的记忆。其中开篇的「绉纱馄饨」更是让我联想起了很多儿时至今的一些关于面食的记忆。
所以借此机会,也说说我关于「馄饨、饺子和抄手」的「橙黄橘绿时」吧。
我虽是南方人,但是我父亲确尤为喜欢面食,这可能和他以前的职业:长途司机有关,为了准确送达货物,节省时间,车上经常会备些馒头、包子,且因跑过一段时间兰州,所以尤其喜爱兰州拉面。我耳濡目染之下也开始喜欢面食,其中手工面条和薄面皮包的饺子、馄饨和抄手更是最爱。
所以我也以个人理解,不考究这三种食物专业背景,仅以自己体验、回忆为基础的前提下分享一下它们和我的故事把。
关于馄饨,我的第一印象其实是「奇怪的三轮车」、「铝皮架」以及「叫卖声」这几个毫无关联的词汇,至于为什么呢?
我刚出生那几年是住在农村的,那时候结婚就要自立门户,所以我妈怀上我后我爸也开始跑车拉活,因为回家的时候大货车不便开去农村小路,索性就搬到了附近的镇子上,不过虽说是附近的镇子,其实也就徒步十来分钟的路程。
新家前门临靠镇上最大的一条马路,后门因为和其他房子接连,形成了一个类似四合院的天井,严谨点来说是形成了一圈五六层的小楼,中间有一大块大概一个篮球场大小的空地,上面野草遍布,是我们这些院子里小孩的游玩宝地。
那时我们住在三楼,我的房间在后门靠窗的这边,一到下午,我最期待的便是听到窗「买上海馄饨、银丝粉咯!」的叫卖声,这时候便会合上本来就没怎么认真写的作业,去找父母拿上几块钱零钱跑下楼凑到摊贩的车边。
这是一辆三轮车,整个镇上就这一辆奇特的三轮车,你可能会说「三轮车有什么奇特的?」
因为他的结构是反过来的,坐在座椅上,面对的其实是三轮车的后方,三轮车上用铝皮做了一个小型的台子,上面的铝板开了两个孔洞放着两口烧开水的锅,下方应该放着天然气罐或着是煤炉作为热源,铝板上面的里侧则是用铁棍隔了一个长条形的调料架和食料架,那会的调料很简单,就是葱花、辣椒油、味精、酱油等。旁边的食料架上盖着一块白纱布,白布下面自然是一整盘白花一般的上海馄饨,馄饨的旁边一个大盆里则泡着银丝粉。
我最喜欢吃的是上海馄饨,一碗多少钱我有些记不得了,只记得小贩会先提溜出七八个上海馄饨放在竹篾的漏斗里,漏斗柄的顶端有一段弯曲的铁丝,放入开水中后可以挂在锅边。然后从边上拿出一次性的透明塑料碗,用小勺从调料架上如韩信点兵搬的挨个挑出配料放在碗里,往往到这时馄饨也煮的差不多了,小贩便会右手提起漏斗,轻颤几下反扣的碗上,七八个馄饨便如滚珠般落进碗内。此时会再用旁边的长勺盛出两勺汤水冲入碗内,乳白的汤汁刚冲入碗内,便激起碗底的辣子红油翻滚起来,葱花也随着汤汁飘上汤面,白花花的上海馄饨随着涡流在汤里轻轻转着,好似吹起了一股香风,我隔着老远就能闻到香味,最后把一次性的汤勺放入碗里就完成制作了。
馄饨其实很小,我那会也能一口一个,馄饨皮经过水煮已经变的略微透明,但你要是着急忙慌的放入嘴里肯定会被烫的龇牙咧嘴直吸冷气,辣子油的香味和着咸淡合适的肉馅在嘴里破开时,清香的汁水便四溢在口腔,你会迫不及待的再想吞入下一个。现在看来这位小贩制作的上海馄饨可能并不那么正宗,但是小时候吃到喜欢食物的那份开心、喜悦确分外难得。
我已经记不得第一次吃饺子是什么时候的,只能说说我印象中最惊艳的一次把。
约莫十二年前把,那次和我爸妈自驾带着外婆去西安游玩,经过一天的驾驶,到了西安时已是深夜,饥肠辘辘的我们就想找个吃东西的地儿,依稀记得我们是住宿在鼓楼附近,停了车、放了行李便匆匆出门找吃的。
本来想着去吃个西安特色泡馍什么的,不过走了好一会也没看见,倒是在一条街的拐角后的小巷中看到了一家东北饺子馆,此处以临近夜晚,行人稀少,店外红色的灯牌格外醒目。10月的西安已经有些微凉,加之去的时候又恰逢降温,店面口吊着几块布帘挡风,透过玻璃窗能看到里面腾腾的热气,我爸本就喜欢吃饺子,一看到便径欣喜的直领着我们往这家店铺而去。
撩开帘子,煮面水的水汽暖暖的扑面而来,身上的寒意被这么一冲霎时间已消了大半,更觉饥肠辘辘。一家人便就近找坐位坐下,老板娘也迎上前来招呼我们。店家也没独立的菜单,在老板娘的示意下发现都贴在墙上,我们抬头一看大概有四五种饺子,什么猪肉芹菜、猪肉白菜等等。北方吃饺子不讲个数,都是按斤来卖,但斤的价格我已经记不得了,约莫三四十把,只记得我们因为人多,便每样点了半斤,等菜期间老板娘问我们要什么沾碟,我们家都喜欢吃辣的,所以都点的油辣子。
西安的油泼辣子不似四川,更重香味,颜色红澄澄的,散发着一股子香气,辣味也仅是微微辣,对于我来说是属于不辣的范畴。
不消片刻老板娘就端着四大碟热气腾腾的饺子过来,碟子里的饺子一个个晶莹剔透的饺子正反不一的躺着,散发着白腾腾的热气,一股面皮的香味铺面而来,令人食指大动,饥肠辘辘的我们自是没有客气立刻开吃。
饺子不同于馄饨,中间肉馅的比例更高,且没有汤汁,好不好吃自是看肉馅调的如何。我随便夹了一个放在辣子油碟中,反转了几下,换辣油裹满饺子全身,轻轻夹住放入嘴里。
嗯,是猪肉白菜,比馄饨更多的肉汁在嘴里四溢开来,比例适中白菜让汁水不至于太腻,也让肉汁更加鲜美,加上本地香辣香辣的辣子油让整个味觉系统感受到了极致的协调。
那一晚上我大概吃了一斤半的饺子。
自那后我再没吃过那么好吃的饺子,上次和我爱人的结婚周年庆去西安时我还去找过这家饺子馆,但模糊的记忆和时过境迁的环境已经再也找不到这家店了,颇为遗憾。
抄手和馄饨类似,但是皮要更厚,体积也更大,所以裹挟的肉馅也稍多,而且搭配的汤料也是辣味居多,不似正宗上海馄饨都是以鲜味为主。是四川、重庆这边的美食之一。
四川、重庆因地理位置原因喜食辣和花椒用来去除湿气,几乎所有的食物都是围绕这两样香料展开,所以抄手汤水也几乎都是浓重的红油的打底,味道偏重,配上香菜别有一番风味。
而且,重庆还有一种以麻为特色的「老麻抄手」。
在辣味的基础上会加上一定比例的花椒粉,食用时将挂着含有花椒粉汤水的抄手放入口中,会让你的味觉彻底感受什么叫复杂。整个味觉系统会在一瞬间感受到一股如轻微电击的麻,一碗优秀的老麻抄手会把这种麻的力度掌握的刚刚好,让你在麻的间隙,同时又能感受到一股不同于西安辣子油的香,而是辣度更重的辣味,在麻和辣之间再次感受到肉汁的鲜甜,这就是四川抄手的特色。
吃是人类最本能的需求,带来的是快乐、满足、心安。我通篇回忆下来,发现美食不光在吃的时候能给人带去快乐,连现在回忆时,当初的那份快乐都丝毫不曾减少。
但如今横流的无语让人迷失、沉沦,迷失本心,不由的让人扼腕叹息。
null
前文 用workflow转换Google地图kmz数据为geojson数据 中提到了我是如何获取Google Map里MyMap的数据,并自动转换为GeoJSON数据应用在博客上的。
但是最近在查看我更新的地点时,发现有部分数据实际应用在Mapbox中会存在偏差,导致很多定位在陆地上的地点漂移到了江河之上。比如这个 重庆来福士广场
就漂移到了长江上。
其实这个问题我发现已经满久的了,之前也咨询了一下 昱行 和 大发哥,不过他们的给的方案我没太弄明白,当时碍于技术问题一直处于搁置状态,最近因为重新更新了地点,又把这个问题给勾了起来。
不过这次这个问题让我联想起之前在将华为的数据导入到Strava时好像也遇到过,同样也是坐标偏移的问题,当时同步软件里有个「使用XX坐标系」的选项,启用之后重新同步的数据就可以在Strava正常显示了。
所以我尝试找了个坐标系在线转换工具 EasyMap ,这个工具可以很方便的进行多种坐标系的互相转换,我试着将转换好的GeoJSON数据复制进去,并转换成WGS84坐标系后在贴到 Mapbox 的在线 GeoJSON 工具 https://geojson.io/ 中预览,发现定位已经正确显示,应该可以确定就是这个问题。
奇怪的是我之前查过GoogleMap的坐标系标准就是WGS84呀?为什么实际上是GCJ02呢?
接下来就是修改上次的转换代码,在获取定位坐标的时候想办法将坐标进一步转换成WGS84坐标系即可。
幸运的是Github有大佬分享了一个基于python的互转脚本 coordTransform_py
,该脚本提供了以下特性,同时还提供了一个js版本:
此模块用于百度坐标系(bd-09)、火星坐标系(国测局坐标系、gcj02)、WGS84坐标系的相互转换,并提供中文地址到坐标的转换功能,仅使用Python标准模块,无其他依赖。
中文地址到坐标转换使用高德地图API,需要申请API KEY。
需要js版本可以移步coordtransform
所以我们在之前 convert_kmz_to_geojson.py
文件中引入该库,并对坐标进行处理:
import os
import sys
import json
import zipfile
import xml.etree.ElementTree as ET
from shapely.geometry import shape, Point, LineString, Polygon, mapping
from coordTransform_utils import gcj02_to_wgs84 # 引入gcj02 to wgs84的转入函数
def convert_kmz_to_geojson(kmz_file_path, geojson_file_path):
with zipfile.ZipFile(kmz_file_path, 'r') as kmz:
kml_content = kmz.read('doc.kml')
root = ET.fromstring(kml_content)
geojson_content = kml_to_geojson(root)
with open(geojson_file_path, 'w') as geojson_file:
json.dump(geojson_content, geojson_file, indent=4)
def kml_to_geojson(element):
geojson = {
"type": "FeatureCollection",
"features": []
}
for placemark in element.iterfind('.//{http://www.opengis.net/kml/2.2}Placemark'):
feature = {
"type": "Feature",
"properties": {},
"geometry": None
}
for name in placemark.iterfind('.//{http://www.opengis.net/kml/2.2}name'):
feature["properties"]["name"] = name.text
for description in placemark.iterfind('.//{http://www.opengis.net/kml/2.2}description'):
feature["properties"]["description"] = description.text
for point in placemark.iterfind('.//{http://www.opengis.net/kml/2.2}Point'):
coords = point.find('{http://www.opengis.net/kml/2.2}coordinates').text.strip()
lon, lat, _ = map(float, coords.split(','))
# 在获取坐标时进行转换
feature["geometry"] = mapping(Point(gcj02_to_wgs84(lon, lat)[0], gcj02_to_wgs84(lon, lat)[1]))
for linestring in placemark.iterfind('.//{http://www.opengis.net/kml/2.2}LineString'):
coords = linestring.find('{http://www.opengis.net/kml/2.2}coordinates').text.strip()
points = [tuple(map(float, coord.split(',')))[:2] for coord in coords.split()]
feature["geometry"] = mapping(LineString(points))
for polygon in placemark.iterfind('.//{http://www.opengis.net/kml/2.2}Polygon'):
outer_boundary = polygon.find('.//{http://www.opengis.net/kml/2.2}outerBoundaryIs')
if outer_boundary is not None:
coords = outer_boundary.find('.//{http://www.opengis.net/kml/2.2}coordinates').text.strip()
points = [tuple(map(float, coord.split(',')))[:2] for coord in coords.split()]
feature["geometry"] = mapping(Polygon([points]))
if feature["geometry"] is not None:
geojson["features"].append(feature)
return geojson
if __name__ == "__main__":
# kmz_file_path = "sys.argv[1]"
# geojson_file_path = sys.argv[2]
kmz_file_path = "downloaded_file.kmz"
geojson_file_path = "downloaded_file.json"
convert_kmz_to_geojson(kmz_file_path, geojson_file_path)
目前足迹功能还会出现比较卡的情况,但是目前还没处理头绪,幸运的卡顿只是略微影响使用,就留待下次处理把。